From 79ca9b50ea1217d93cfa637952bfa5accae26e00 Mon Sep 17 00:00:00 2001 From: Alex Cottner Date: Fri, 26 Jul 2024 12:36:44 -0600 Subject: [PATCH 1/6] Rewriting tests to work with vitest. First pass at rewriting collection tests. Still need to do other tests. --- blob.ts | 5 - package-lock.json | 3032 ++++++++++++++++++++-------------- package.json | 14 +- rollup.config.mjs | 2 +- test/collection_test.ts | 936 ++++++----- test/http/collection_test.ts | 1 - test/server.ts | 64 +- test/setup-globals.ts | 10 +- test/test_utils.ts | 22 +- test/tsconfig.json | 2 +- vite.config.ts | 37 + 11 files changed, 2339 insertions(+), 1786 deletions(-) delete mode 100644 blob.ts create mode 100644 vite.config.ts diff --git a/blob.ts b/blob.ts deleted file mode 100644 index a169e4a6f..000000000 --- a/blob.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default function Blob( - dataArray: WithImplicitCoercion[] -) { - return Buffer.from(dataArray[0]); -} diff --git a/package-lock.json b/package-lock.json index 3caa763df..75e545ffd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,9 +46,9 @@ "form-data": "^4.0.0", "gh-pages": "^6.0.0", "http-server": "^14.0.0", - "intern": "^4.10.0", "kinto-node-test-server": "^2.0.0", "mitt": "^3.0.0", + "msw": "^2.3.4", "node-fetch": "^2.6.6", "nyc": "^17.0.0", "open-cli": "^8.0.0", @@ -56,12 +56,12 @@ "rollup": "^4.14.1", "rollup-plugin-polyfill-node": "^0.13.0", "shx": "^0.3.3", - "sinon": "^18.0.0", "source-map-support": "^0.5.21", "ts-node": "^10.4.0", "tslib": "^2.3.1", "typescript": "^5.0.3", - "uglifyify": "^5.0.2" + "uglifyify": "^5.0.2", + "vitest": "^2.0.4" }, "engines": { "node": ">=16" @@ -77,13 +77,13 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -171,20 +171,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/generator/node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -491,29 +477,467 @@ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", + "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "dev": true, + "dependencies": { + "cookie": "^0.5.0" + } + }, + "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@bundled-es-modules/statuses/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dev": true, + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, + "node_modules/@bundled-es-modules/tough-cookie/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@bundled-es-modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, "node_modules/@eslint-community/eslint-utils": { @@ -650,6 +1074,97 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, + "node_modules/@inquirer/confirm": { + "version": "3.1.17", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.17.tgz", + "integrity": "sha512-qCpt/AABzPynz8tr69VDvhcjwmzAryipWXtW8Vi6m651da4H/d0Bdn55LkxXD7Rp2gfgxvxzTdb66AhIA8gzBA==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.5.tgz", + "integrity": "sha512-QWG41I7vn62O9stYKg/juKXt1PEbr/4ZZCPb4KgXDQGwgA9M5NBTQ7FnOvT1ridbxkm/wTxLCNraUs7y47pIRQ==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.1", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/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/@inquirer/core/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/@inquirer/core/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/@inquirer/figures": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.1.tgz", + "integrity": "sha512-m3YgGQlKNS0BM+8AFiJkCsTqHEFCWn6s/Rqye3mYwvqY6LdfUv12eSwbsgNzrYyrLXiy7IrrjDLPysaSBwEfhw==", + "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -833,13 +1348,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -873,20 +1389,6 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", @@ -903,6 +1405,23 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mswjs/interceptors": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", + "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "dev": true, + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -938,6 +1457,28 @@ "node": ">= 8" } }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1357,104 +1898,6 @@ "win32" ] }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@theintern/common": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@theintern/common/-/common-0.3.0.tgz", - "integrity": "sha512-VKSyZGEyzmicJPvV5Gxeavm8Xbcr0cETAAqMapWZzA9Q85YHMG8VSrmPFlMrDQ524qE0IqQsTi0IlH8NIaN+eQ==", - "dev": true, - "dependencies": { - "axios": "~0.21.1", - "tslib": "~2.3.0" - } - }, - "node_modules/@theintern/common/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "node_modules/@theintern/digdug": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@theintern/digdug/-/digdug-2.6.2.tgz", - "integrity": "sha512-r9P7zkIp8L2LYKOUfcKl+KOHUTWrIZ9X6Efsb7Tn+OtiIv4oRlXorcoj/5vmrRLO5JF8jFj26HyeSWBNQA2uwg==", - "dev": true, - "dependencies": { - "@theintern/common": "~0.3.0", - "command-exists": "~1.2.9", - "decompress": "~4.2.1", - "tslib": "~2.3.0" - }, - "bin": { - "digdugEnvironments": "bin/digdugEnvironments.js" - } - }, - "node_modules/@theintern/digdug/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "node_modules/@theintern/leadfoot": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@theintern/leadfoot/-/leadfoot-2.4.1.tgz", - "integrity": "sha512-WnmmMlSROXQc6sGJdQCcSXYbrRAni2HMmjjr2qtvXtLNCi7ZG6O/H7rJ+1fNdJckjE3kwF+Ag3Bh1WR7GkfG0Q==", - "dev": true, - "dependencies": { - "@theintern/common": "~0.3.0", - "jszip": "~3.7.1", - "tslib": "~2.3.0" - } - }, - "node_modules/@theintern/leadfoot/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -1485,28 +1928,6 @@ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, - "node_modules/@types/babel-types": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.11.tgz", - "integrity": "sha512-pkPtJUUY+Vwv6B1inAz55rQvivClHJxc9aVEPPmaq2cbyeMLCiDpbKpcKyX4LAwpNGi+SHBv0tHv6+0gXv0P2A==", - "dev": true - }, - "node_modules/@types/benchmark": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.2.tgz", - "integrity": "sha512-EDKtLYNMKrig22jEvhXq8TBFyFgVNSPmDF2b9UzJ7+eylPqdZVo17PCUMkn1jP6/1A/0u78VqYC6VrX6b8pDWA==", - "dev": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, "node_modules/@types/btoa": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/btoa/-/btoa-1.2.5.tgz", @@ -1516,149 +1937,51 @@ "@types/node": "*" } }, - "node_modules/@types/chai": { - "version": "4.2.22", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.22.tgz", - "integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==", + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "dev": true }, - "node_modules/@types/charm": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/charm/-/charm-1.0.3.tgz", - "integrity": "sha512-FpNoSOkloETr+ZJ0RsZpB+a/tqJkniIN+9Enn6uPIbhiNptOWtZzV7FkaqxTRjvvlHeUKMR331Wj9tOmqG10TA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-instrument": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", - "integrity": "sha512-1i1VVkU2KrpZCmti+t5J/zBb2KLKxHgU1EYL+0QtnDnVyZ59aSKcpnG6J0I6BZGDON566YzPNIlNfk7m+9l1JA==", - "dev": true, - "dependencies": { - "@types/babel-types": "*", - "@types/istanbul-lib-coverage": "*", - "source-map": "^0.6.1" - } - }, - "node_modules/@types/istanbul-lib-instrument/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-WH6e5naLXI3vB2Px3whNeYxzDgm6S6sk3Ht8e3/BiWwEnzZi72wja3bWzWwcgbFTFp8hBLB7NT2p3lNJgxCxvA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "source-map": "^0.6.1" - } - }, - "node_modules/@types/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "dependencies": { - "@types/istanbul-lib-report": "*" + "@types/minimatch": "*", + "@types/node": "*" } }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { - "version": "18.15.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz", - "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==", - "dev": true + "version": "20.14.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", + "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-fetch": { "version": "2.6.4", @@ -1684,34 +2007,12 @@ "node": ">= 6" } }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dev": true, - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, "node_modules/@types/shelljs": { "version": "0.8.15", "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.15.tgz", @@ -1737,20 +2038,29 @@ "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", "dev": true }, + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, "node_modules/@types/uuid": { "version": "9.0.8", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true }, - "node_modules/@types/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-ijZ1vzRawI7QoWnTNL8KpHixd2b2XVb9I9HAqI3triPsh1EC0xH0Eg6w2O3TKbDCgiNNlJqfrof6j4T2I+l9vw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.15.0", @@ -1967,6 +2277,166 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@vitest/expect": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz", + "integrity": "sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.0.4", + "@vitest/utils": "2.0.4", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vitest/expect/node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vitest/expect/node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@vitest/expect/node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vitest/expect/node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/@vitest/expect/node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz", + "integrity": "sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==", + "dev": true, + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz", + "integrity": "sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "2.0.4", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz", + "integrity": "sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.0.4", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz", + "integrity": "sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==", + "dev": true, + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz", + "integrity": "sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.0.4", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, "node_modules/abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", @@ -2069,6 +2539,33 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -2162,15 +2659,6 @@ "node": ">=0.8" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -2213,15 +2701,6 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -2327,26 +2806,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -2368,16 +2827,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", - "dev": true, - "dependencies": { - "lodash": "^4.17.4", - "platform": "^1.3.3" - } - }, "node_modules/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", @@ -2485,61 +2934,6 @@ "node": ">= 0.4.0" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2582,6 +2976,15 @@ "node": ">= 0.8" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -2641,24 +3044,6 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -2675,24 +3060,6 @@ "node": ">=0.10.0" } }, - "node_modules/charm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", - "integrity": "sha512-wqW3VdPnlSWT4eRiYX+hcs+C6ViBPUWk1qTCd+37qw9kEm/a5n2qcyQDMBWvSYKN/ctqZzeXNQaeBjOetJJUkw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/cheerio": { "version": "1.0.0-rc.2", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", @@ -2707,16 +3074,37 @@ "parse5": "^3.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.6" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">= 12" } }, "node_modules/cliui": { @@ -2799,12 +3187,6 @@ "node": ">= 0.8" } }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -2823,12 +3205,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/concurrent": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/concurrent/-/concurrent-0.3.2.tgz", - "integrity": "sha512-KoUIH3pHceLMOeviiAnOzdQ8630lNclszDv8IGXx2Gn+5xXZroLqSWWzisweX//X7LyYOCKy10398bb0ksjvsA==", - "dev": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -3062,9 +3438,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -3087,135 +3463,6 @@ "node": ">=0.10.0" } }, - "node_modules/decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "dev": true, - "dependencies": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, - "dependencies": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, - "dependencies": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tarbz2/node_modules/file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, - "dependencies": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", - "dev": true, - "dependencies": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-unzip/node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress/node_modules/make-dir/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3322,15 +3569,6 @@ "node": ">=0.10.0" } }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3439,15 +3677,6 @@ "node": ">= 0.8" } }, - "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": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", @@ -3460,6 +3689,44 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -3565,6 +3832,7 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -4147,6 +4415,65 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/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/express": { "version": "4.17.3", "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", @@ -4302,15 +4629,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -4323,15 +4641,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -4549,12 +4858,6 @@ } ] }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "node_modules/fs-extra": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", @@ -4573,9 +4876,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, @@ -4611,9 +4914,9 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" @@ -4640,19 +4943,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", - "dev": true, - "dependencies": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -4910,6 +5200,15 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -5003,6 +5302,12 @@ "he": "bin/he" } }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -5177,6 +5482,15 @@ "npm": ">=1.3.7" } }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, "node_modules/ice-cap": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/ice-cap/-/ice-cap-0.0.4.tgz", @@ -5299,12 +5613,6 @@ "node": ">= 4" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -5355,115 +5663,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/intern": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/intern/-/intern-4.10.1.tgz", - "integrity": "sha512-GyUmdpdKGoEu1hRMNYeldPF11lFZlC1Pbq28ImzEY+7OHRDinMU9c8jwGxY7eAaUe15oy0Y7cocdjC/mzUuOng==", - "dev": true, - "dependencies": { - "@theintern/common": "~0.3.0", - "@theintern/digdug": "~2.6.2", - "@theintern/leadfoot": "~2.4.1", - "@types/benchmark": "~2.1.1", - "@types/chai": "~4.2.20", - "@types/charm": "~1.0.2", - "@types/express": "~4.17.13", - "@types/istanbul-lib-coverage": "~2.0.3", - "@types/istanbul-lib-instrument": "~1.7.4", - "@types/istanbul-lib-report": "~3.0.0", - "@types/istanbul-lib-source-maps": "~4.0.1", - "@types/istanbul-reports": "~3.0.1", - "@types/ws": "7.4.6", - "benchmark": "~2.1.4", - "body-parser": "~1.19.0", - "chai": "~4.3.4", - "charm": "~1.0.2", - "concurrent": "~0.3.2", - "diff": "~5.0.0", - "express": "~4.17.1", - "glob": "~7.1.7", - "http-errors": "~1.8.0", - "istanbul-lib-coverage": "~3.0.0", - "istanbul-lib-hook": "~3.0.0", - "istanbul-lib-instrument": "~4.0.3", - "istanbul-lib-report": "~3.0.0", - "istanbul-lib-source-maps": "~4.0.0", - "istanbul-reports": "~3.0.2", - "lodash": "~4.17.15", - "mime-types": "~2.1.31", - "minimatch": "~3.0.4", - "platform": "~1.3.6", - "resolve": "~1.20.0", - "shell-quote": "~1.7.2", - "source-map": "~0.6.1", - "ts-node": "~10.0.0", - "tslib": "~2.3.0", - "ws": "~7.5.2" - }, - "bin": { - "intern": "bin/intern.js" - } - }, - "node_modules/intern/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/intern/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/intern/node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/intern/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/intern/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -5599,10 +5798,10 @@ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, - "node_modules/is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true }, "node_modules/is-number": { @@ -5632,15 +5831,6 @@ "@types/estree": "*" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -5698,42 +5888,18 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "append-transform": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/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/istanbul-lib-processinfo": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", @@ -6003,54 +6169,6 @@ "node": ">=0.6.0" } }, - "node_modules/jszip": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", - "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", - "dev": true, - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/just-extend": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", - "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", - "dev": true - }, "node_modules/kinto-node-test-server": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kinto-node-test-server/-/kinto-node-test-server-2.0.0.tgz", @@ -6097,15 +6215,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "dependencies": { - "immediate": "~3.0.5" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -6169,12 +6278,6 @@ "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", "dev": true }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", @@ -6232,15 +6335,6 @@ "loose-envify": "cli.js" } }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6251,15 +6345,12 @@ } }, "node_modules/magic-string": { - "version": "0.30.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", - "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" } }, "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { @@ -6373,6 +6464,12 @@ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -6397,100 +6494,349 @@ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "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": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/msw": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.4.tgz", + "integrity": "sha512-sHMlwrajgmZSA2l1o7qRSe+azm/I+x9lvVVcOxAzi4vCtH8uVPJk1K5BQYDkzGl+tt0RvM9huEXXdeGrgcc79g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.29.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.2.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.7.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/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/msw/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/msw/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/msw/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/msw/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/msw/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/msw/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/msw/node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true + }, + "node_modules/msw/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.6" + "node": ">=8" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/msw/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "bin": { - "mime": "cli.js" + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/msw/node_modules/type-fest": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", + "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/msw/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "mime-db": "1.52.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/msw/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/msw/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, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "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/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { - "mkdirp": "bin/cmd.js" + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6506,34 +6852,6 @@ "node": ">= 0.6" } }, - "node_modules/nise": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", - "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/text-encoding": "^0.7.2", - "just-extend": "^6.2.0", - "path-to-regexp": "^6.2.1" - } - }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -6572,6 +6890,33 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -6774,6 +7119,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/open": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/open/-/open-10.0.2.tgz", @@ -6857,6 +7217,12 @@ "node": ">= 0.8.0" } }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6929,12 +7295,6 @@ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", "dev": true }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7038,14 +7398,11 @@ "node": ">=8" } }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true }, "node_modules/peek-readable": { "version": "5.0.0", @@ -7060,12 +7417,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -7184,12 +7535,6 @@ "node": ">=8" } }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "dev": true - }, "node_modules/portfinder": { "version": "1.0.32", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", @@ -7213,6 +7558,34 @@ "ms": "^2.1.1" } }, + "node_modules/postcss": { + "version": "8.4.40", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", + "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7237,12 +7610,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -7295,6 +7662,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -7684,19 +8057,6 @@ "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "dev": true }, - "node_modules/seek-bzip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", - "dev": true, - "dependencies": { - "commander": "^2.8.1" - }, - "bin": { - "seek-bunzip": "bin/seek-bunzip", - "seek-table": "bin/seek-bzip-table" - } - }, "node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", @@ -7805,15 +8165,6 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7841,15 +8192,6 @@ "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", - "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shelljs": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", @@ -7881,91 +8223,40 @@ "path-is-absolute": "^1.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/shx": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", - "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", - "dev": true, - "dependencies": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - }, - "bin": { - "shx": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signal-exit": { - "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/sinon": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", - "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.1", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/samsam": "^8.0.0", - "diff": "^5.2.0", - "nise": "^6.0.0", - "supports-color": "^7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon/node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/sinon/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/shx": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", + "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "minimist": "^1.2.3", + "shelljs": "^0.8.5" + }, + "bin": { + "shx": "lib/cli.js" }, "engines": { - "node": ">=8" + "node": ">=6" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "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", @@ -7990,6 +8281,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -8057,6 +8357,12 @@ "node": ">=0.10.0" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -8066,6 +8372,18 @@ "node": ">= 0.6" } }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -8209,13 +8527,16 @@ "node": ">=8" } }, - "node_modules/strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "dependencies": { - "is-natural-number": "^4.0.1" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -8293,73 +8614,6 @@ "integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==", "dev": true }, - "node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/tar-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/tar-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/tar-stream/node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/temp-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", @@ -8475,12 +8729,39 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "node_modules/tinybench": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", + "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", "dev": true }, + "node_modules/tinypool": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", + "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", + "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -8668,15 +8949,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -8766,15 +9038,11 @@ "node": ">=0.4" } }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true }, "node_modules/union": { "version": "0.5.0", @@ -8866,6 +9134,16 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -8922,6 +9200,208 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vite": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz", + "integrity": "sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz", + "integrity": "sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.4", + "@vitest/pretty-format": "^2.0.4", + "@vitest/runner": "2.0.4", + "@vitest/snapshot": "2.0.4", + "@vitest/spy": "2.0.4", + "@vitest/utils": "2.0.4", + "chai": "^5.1.1", + "debug": "^4.3.5", + "execa": "^8.0.1", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.0.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.0.4", + "@vitest/ui": "2.0.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/vitest/node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/vitest/node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/vitest/node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -8993,6 +9473,22 @@ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -9170,27 +9666,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/xml-name-validator": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", @@ -9232,6 +9707,15 @@ "node": ">=8" } }, + "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/yargs/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -9297,16 +9781,6 @@ "node": ">=6" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -9327,6 +9801,18 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index ddf3ae1b4..96792a0d6 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,9 @@ "publish-to-npm": "npm run dist && npm run build && npm publish", "report-coverage": "npm run test-cover && ./node_modules/coveralls/bin/coveralls.js < ./coverage/lcov.info", "test": "npm run test-nocover", - "test-cover": "intern", - "test-cover-html": "intern reporters=htmlcoverage && open-cli coverage/index.html", - "test-nocover": "intern coverage=false", - "test:chrome": "npm run build:test-browser && intern config=@chrome coverage=false", - "test:firefox": "npm run build:test-browser && intern config=@firefox coverage=false" + "test-cover": "vitest --coverage", + "test-cover-html": "vitest --watch=false --coverage --reporter=html --outputFile=coverage/index.html", + "test-nocover": "vitest --watch=false" }, "repository": { "type": "git", @@ -184,9 +182,9 @@ "form-data": "^4.0.0", "gh-pages": "^6.0.0", "http-server": "^14.0.0", - "intern": "^4.10.0", "kinto-node-test-server": "^2.0.0", "mitt": "^3.0.0", + "msw": "^2.3.4", "node-fetch": "^2.6.6", "nyc": "^17.0.0", "open-cli": "^8.0.0", @@ -194,12 +192,12 @@ "rollup": "^4.14.1", "rollup-plugin-polyfill-node": "^0.13.0", "shx": "^0.3.3", - "sinon": "^18.0.0", "source-map-support": "^0.5.21", "ts-node": "^10.4.0", "tslib": "^2.3.1", "typescript": "^5.0.3", - "uglifyify": "^5.0.2" + "uglifyify": "^5.0.2", + "vitest": "^2.0.4" }, "overrides": { "ts-node": "$ts-node" diff --git a/rollup.config.mjs b/rollup.config.mjs index 9a325bd90..c4e165a3e 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -69,7 +69,7 @@ const browserTestBuild = { format: "iife", sourcemap: true, globals: { - intern: "intern", + // intern: "intern", }, }, ], diff --git a/test/collection_test.ts b/test/collection_test.ts index 5a2570ba9..fdcb87202 100644 --- a/test/collection_test.ts +++ b/test/collection_test.ts @@ -1,5 +1,4 @@ /* eslint dot-notation: off */ -import sinon from "sinon"; import { EventEmitter } from "events"; import { v4 as uuid4 } from "uuid"; @@ -21,11 +20,7 @@ import { } from "./test_utils"; import { createKeyValueStoreIdSchema } from "../src/collection"; import KintoBase from "../src/KintoBase"; - -const { expect } = intern.getPlugin("chai"); -intern.getPlugin("chai").should(); -const { describe, it, beforeEach, afterEach } = - intern.getPlugin("interface.bdd"); +import { Mock } from "vitest"; const TEST_BUCKET_NAME = "kinto-test"; const TEST_COLLECTION_NAME = "kinto-test"; @@ -51,7 +46,7 @@ describe("Collection", () => { ) { describe(label, () => { /*eslint-disable */ - let sandbox: sinon.SinonSandbox, events: EventEmitter, api: Api; + let events: EventEmitter, api: Api; /*eslint-enable */ const article = { title: "foo", url: "http://foo" }; @@ -99,13 +94,12 @@ describe("Collection", () => { }; } - beforeEach(() => { - sandbox = sinon.createSandbox(); - return testCollection().clear(); + beforeEach(async () => { + await testCollection().clear(); }); afterEach(() => { - sandbox.restore(); + vitest.restoreAllMocks(); }); describe("Helpers", () => { @@ -510,9 +504,9 @@ describe("Collection", () => { describe("#clear", () => { let articles: Collection; - beforeEach(() => { + beforeEach(async () => { articles = testCollection(); - return Promise.all([ + await Promise.all([ articles.create({ title: "foo" }), articles.create({ title: "bar" }), articles.db.saveMetadata({ id: "articles", last_modified: 42 }), @@ -522,7 +516,7 @@ describe("Collection", () => { it("should clear collection records", async () => { await articles.clear(); const { data } = await articles.list(); - data.should.have.lengthOf(0); + expect(data).toHaveLength(0); }); it("should clear collection timestamp", async () => { @@ -549,19 +543,19 @@ describe("Collection", () => { it("should create a record and return created record data", async () => { const res = await articles.create(article); - res.should.have.property("data"); + expect(res).toHaveProperty("data"); }); it("should create a record and return created record perms", async () => { const res = await articles.create(article); - res.should.have.property("permissions"); + expect(res).toHaveProperty("permissions"); }); it("should assign an id to the created record", async () => { const { data: { id }, } = await articles.create(article); - id.should.be.a("string"); + expect(id).toBeTypeOf("string"); }); it("should assign an id to the created record (custom IdSchema)", async () => { @@ -570,7 +564,7 @@ describe("Collection", () => { const { data: { id }, } = await articles.create(article); - id.should.be.a("number"); + expect(id).toBeTypeOf("number"); }); it("should accept a record for the 'generate' function", async () => { @@ -579,7 +573,7 @@ describe("Collection", () => { const { data: { id }, } = await articles.create(article); - id.should.equal("title,url"); + expect(id).equal("title,url"); }); it("should reject when useRecordId is true and record is missing an id", async () => { @@ -609,12 +603,12 @@ describe("Collection", () => { it("should not alter original record", async () => { const res = await articles.create(article); - res.should.not.deep.equal(article); + expect(res).not.toStrictEqual(article); }); it("should add record status on creation", async () => { const res = await articles.create(article); - res.data._status.should.equal("created"); + expect(res.data).toHaveProperty("_status", "created"); }); it("should reject if passed argument is not an object", async () => { @@ -627,7 +621,7 @@ describe("Collection", () => { it("should actually persist the record into the collection", async () => { const result = await articles.create(article); const res = await articles.get(result.data.id); - res.data.title.should.equal(article.title); + expect(res.data).toHaveProperty("title", article.title); }); it("should support the useRecordId option", async () => { @@ -637,7 +631,7 @@ describe("Collection", () => { { useRecordId: true } ); const res = await articles.get(result.data.id); - res.data.id.should.equal(testId); + expect(res.data).toHaveProperty("id", testId); }); it("should validate record's Id when provided", async () => { @@ -665,9 +659,9 @@ describe("Collection", () => { }); it("should reject with any encountered transaction error", async () => { - sandbox - .stub(articles.db, "execute") - .returns(Promise.reject(new Error("transaction error"))); + vitest + .spyOn(articles.db, "execute") + .mockReturnValue(Promise.reject(new Error("transaction error"))); await expectAsyncError( () => articles.create({ title: "foo" }), @@ -707,7 +701,7 @@ describe("Collection", () => { ); const res = await articles.getAny(result.data.id); - res.data.id.should.equal(article.title); + expect(res.data).toHaveProperty("id", article.title); }); }); @@ -727,7 +721,7 @@ describe("Collection", () => { title: "new title", }); const res_2 = await articles.get(res_1.data.id); - res_2.data.title.should.equal("new title"); + expect(res_2.data).toHaveProperty("title", "new title"); }); it("should return the old data for the record", async () => { @@ -737,7 +731,7 @@ describe("Collection", () => { ...existing, title: "new title", }); - updateRes.oldRecord.title.should.equal("foo"); + expect(updateRes.oldRecord).toHaveProperty("title", "foo"); }); it("should update record status on update", async () => { @@ -748,7 +742,7 @@ describe("Collection", () => { const { data: { _status }, } = await articles.update({ ...data, title: "blah" }); - _status.should.equal("updated"); + expect(_status).equal("updated"); }); it("should not update record status if only local fields are changed", async () => { @@ -759,7 +753,7 @@ describe("Collection", () => { const { data: { _status }, } = await articles.update({ ...data, read: true }); - _status.should.equal("synced"); + expect(_status).equal("synced"); }); it("should reject updates on a non-existent record", async () => { @@ -807,7 +801,7 @@ describe("Collection", () => { id: result.data.id, title: "foo", }); - res.data.title.should.equal("foo"); + expect(res.data).toHaveProperty("title", "foo"); }); it("should patch existing record when patch option is used", async () => { @@ -817,7 +811,7 @@ describe("Collection", () => { { useRecordId: true, synced: true } ); const res = await articles.update({ id, rank: 99 }, { patch: true }); - res.data.should.deep.equal({ + expect(res.data).toStrictEqual({ id, title: "foo", rank: 99, @@ -831,7 +825,7 @@ describe("Collection", () => { data: { id }, } = await articles.create(article); const { data } = await articles.update({ id, title: "new title" }); - expect(data).not.to.have.property("url"); + expect(data).not.toHaveProperty("url"); }); it("should preserve record.last_modified", async () => { @@ -843,7 +837,7 @@ describe("Collection", () => { last_modified: 123456789012, }); const { data } = await articles.update({ id, title: "new title" }); - data.should.have.property("last_modified").equal(123456789012); + expect(data).toHaveProperty("last_modified", 123456789012); }); it("should optionally mark a record as synced", async () => { @@ -852,7 +846,7 @@ describe("Collection", () => { { ...data, title: "bar" }, { synced: true } ); - updateData.should.have.property("_status").equal("synced"); + expect(updateData).toHaveProperty("_status", "synced"); }); it("should preserve created status if record was never synced", async () => { @@ -861,7 +855,7 @@ describe("Collection", () => { ...data, title: "bar", }); - updateData.should.have.property("_status").equal("created"); + expect(updateData).toHaveProperty("_status", "created"); }); }); @@ -882,20 +876,20 @@ describe("Collection", () => { const { data: { title }, } = await articles.get(id); - title.should.equal("new title"); + expect(title).equal("new title"); }); it("should change record status to updated", async () => { const res = await articles.create({ id: uuid4() }, { synced: true }); const data = res.data; const res_1 = await articles.upsert({ ...data, title: "blah" }); - res_1.data._status.should.equal("updated"); + expect(res_1.data).toHaveProperty("_status", "updated"); }); it("should preserve created status if record was never synced", async () => { const res = await articles.create({ title: "foo" }); const res_1 = await articles.upsert({ ...res.data, title: "bar" }); - res_1.data.should.have.property("_status").equal("created"); + expect(res_1.data).toHaveProperty("_status", "created"); }); it("should create a new record if non-existent", async () => { @@ -903,12 +897,12 @@ describe("Collection", () => { id: uuid4(), title: "new title", }); - res.data.title.should.equal("new title"); + expect(res.data).toHaveProperty("title", "new title"); }); it("should set status to created if it created a record", async () => { const res = await articles.upsert({ id: uuid4() }); - res.data._status.should.equal("created"); + expect(res.data).toHaveProperty("_status", "created"); }); it("should reject updates on a non-object record", async () => { @@ -940,7 +934,7 @@ describe("Collection", () => { ...res_2.data, title: "new title", }); - res_3.data.title.should.equal("new title"); + expect(res_3.data).toHaveProperty("title", "new title"); }); it("should set status of deleted records to updated", async () => { @@ -951,7 +945,7 @@ describe("Collection", () => { ...res_2.data, title: "new title", }); - res_3.data._status.should.equal("updated"); + expect(res_3.data).toHaveProperty("_status", "updated"); }); it("should validate record's id when provided (custom IdSchema)", async () => { @@ -970,7 +964,7 @@ describe("Collection", () => { id: res_1.data.id, title: "new title", }); - res_2.data.should.not.have.property("url"); + expect(res_2.data).not.toHaveProperty("url"); }); it("should preserve record.last_modified", async () => { @@ -984,7 +978,7 @@ describe("Collection", () => { id: res_1.data.id, title: "new title", }); - res_2.data.should.have.property("last_modified").equal(123456789012); + expect(res_2.data).toHaveProperty("last_modified", 123456789012); }); it("should return the old data for the record", async () => { @@ -995,7 +989,7 @@ describe("Collection", () => { ...existing, title: "new title", }); - res_2.oldRecord.title.should.equal("foo"); + expect(res_2.oldRecord).toHaveProperty("title", "foo"); }); it("should not return the old data for a deleted record", async () => { @@ -1065,7 +1059,7 @@ describe("Collection", () => { it("should mark a record as updated", async () => { const resolution = { ...local, title: "resolved" }; const res = await articles.resolve(conflict, resolution); - res.data.should.deep.equal({ + expect(res.data).toStrictEqual({ _status: "updated", id: local.id, title: resolution.title, @@ -1076,7 +1070,7 @@ describe("Collection", () => { it("should mark a record as synced if resolved with remote", async () => { const resolution = { ...local, title: remote.title }; const res = await articles.resolve(conflict, resolution); - res.data.should.deep.equal({ + expect(res.data).toStrictEqual({ _status: "synced", id: local.id, title: resolution.title, @@ -1105,7 +1099,7 @@ describe("Collection", () => { it("should retrieve a record from its id", async () => { const res = await articles.get(id); - res.data.title.should.equal(article.title); + expect(res.data).toHaveProperty("title", article.title); }); it("should retrieve a record from its id (custom IdSchema)", async () => { @@ -1115,7 +1109,7 @@ describe("Collection", () => { await articles.clear(); const result_1 = await articles.create(article); const res = await articles.get(result_1.data.id); - res.data.title.should.equal(article.title); + expect(res.data).toHaveProperty("title", article.title); }); it("should validate passed id", async () => { @@ -1128,7 +1122,7 @@ describe("Collection", () => { it("should have record status info attached", async () => { const res = await articles.get(id); - res.data._status.should.equal("created"); + expect(res.data).toHaveProperty("_status", "created"); }); it("should reject in case of record not found", async () => { @@ -1143,7 +1137,7 @@ describe("Collection", () => { it("should retrieve deleted record with includeDeleted", async () => { await articles.delete(id); const res_1 = await articles.get(id, { includeDeleted: true }); - res_1.data.should.deep.equal({ + expect(res_1.data).toStrictEqual({ _status: "deleted", id, title: "foo", @@ -1164,7 +1158,7 @@ describe("Collection", () => { it("should retrieve a record from its id", async () => { const res = await articles.getAny(id); - res.data!.title.should.equal(article.title); + expect(res.data).toHaveProperty("title", article.title); }); it("should resolve to undefined if not present", async () => { @@ -1175,7 +1169,7 @@ describe("Collection", () => { it("should resolve to virtually deleted record", async () => { await articles.delete(id); const res_1 = await articles.getAny(id); - res_1.data.should.deep.equal({ + expect(res_1.data).toStrictEqual({ _status: "deleted", id, title: "foo", @@ -1214,7 +1208,7 @@ describe("Collection", () => { const res_1 = await articles.get(res.data.id, { includeDeleted: true, }); - res_1.data._status.should.equal("deleted"); + expect(res_1.data).toHaveProperty("_status", "deleted"); }); it("should reject on non-existent record", async () => { @@ -1234,7 +1228,7 @@ describe("Collection", () => { it("should return deleted record", async () => { const res = await articles.delete(id, { virtual: true }); - res.data.should.have.property("title").equal("foo"); + expect(res.data).toHaveProperty("title", "foo"); }); }); @@ -1249,7 +1243,7 @@ describe("Collection", () => { it("should resolve with deletion information", async () => { const res = await articles.delete(id, { virtual: false }); - res.data.should.have.property("id").equal(id); + expect(res.data).toHaveProperty("id", id); }); it("should reject on non-existent record", async () => { @@ -1262,12 +1256,12 @@ describe("Collection", () => { it("should delete if already virtually deleted", async () => { await articles.delete(id); const res = await articles.delete(id, { virtual: false }); - res.data.should.have.property("id").equal(id); + expect(res.data).toHaveProperty("id", id); }); it("should return deleted record", async () => { const res = await articles.delete(id, { virtual: false }); - res.data.should.have.property("title").equal("foo"); + expect(res.data).toHaveProperty("title", "foo"); }); }); }); @@ -1289,16 +1283,16 @@ describe("Collection", () => { it("should be able to soft delete all articles", async () => { await articles.deleteAll(); const res = await articles.list(); - res.data.should.have.lengthOf(0); + expect(res.data).toHaveLength(0); const res_1 = await articles.list({}, { includeDeleted: true }); - res_1.data.should.have.lengthOf(5); + expect(res_1.data).toHaveLength(5); }); it("should not delete anything when there are no records", async () => { await articles.clear(); const res_1 = await articles.deleteAll(); - res_1.data.should.have.lengthOf(0); + expect(res_1.data).toHaveLength(0); }); }); @@ -1315,29 +1309,29 @@ describe("Collection", () => { it("should delete an existing record", async () => { const res = await articles.deleteAny(id); const res_1 = await articles.getAny(res.data.id); - res_1.data!._status.should.equal("deleted"); + expect(res_1.data).toHaveProperty("_status", "deleted"); }); it("should resolve on non-existant record", async () => { const id = uuid4(); const res = await articles.deleteAny(id); - res.data.id.should.equal(id); + expect(res.data).toHaveProperty("id", id); }); it("should indicate that it deleted", async () => { const res = await articles.deleteAny(id); - res.deleted.should.equal(true); + expect(res.deleted).toBeTruthy(); }); it("should indicate that it didn't delete when record is gone", async () => { const id = uuid4(); const res = await articles.deleteAny(id); - res.deleted.should.equal(false); + expect(res.deleted).toBeFalsy(); }); it("should return deleted record", async () => { const res = await articles.deleteAny(id); - res.data.should.have.property("title").equal("foo"); + expect(res.data).toHaveProperty("title", "foo"); }); }); @@ -1346,9 +1340,9 @@ describe("Collection", () => { let articles: Collection; describe("Basic", () => { - beforeEach(() => { + beforeEach(async () => { articles = testCollection(); - return Promise.all([ + await Promise.all([ articles.create(article), articles.create({ title: "bar", url: "http://bar" }), ]); @@ -1356,21 +1350,21 @@ describe("Collection", () => { it("should retrieve the list of records", async () => { const res = await articles.list(); - res.data.should.have.lengthOf(2); + expect(res.data).toHaveLength(2); }); it("shouldn't list virtually deleted records", async () => { const res = await articles.create({ title: "yay" }); await articles.delete(res.data.id); const res_1 = await articles.list(); - res_1.data.should.have.lengthOf(2); + expect(res_1.data).toHaveLength(2); }); it("should support the includeDeleted option", async () => { const res = await articles.create({ title: "yay" }); await articles.delete(res.data.id); const res_1 = await articles.list({}, { includeDeleted: true }); - res_1.data.should.have.lengthOf(3); + expect(res_1.data).toHaveLength(3); }); }); @@ -1381,44 +1375,54 @@ describe("Collection", () => { { title: "art3", last_modified: 1, unread: false }, ]; - beforeEach(() => { + beforeEach(async () => { articles = testCollection(); - return Promise.all(fixtures.map((r) => articles.create(r))); + await Promise.all(fixtures.map((r) => articles.create(r))); }); it("should order records on last_modified DESC by default", async () => { const res = await articles.list(); - res.data - .map((r) => r.title) - .should.deep.equal(["art2", "art1", "art3"]); + expect(res.data.map((r) => r.title)).toStrictEqual([ + "art2", + "art1", + "art3", + ]); }); it("should order records on custom field ASC", async () => { const res = await articles.list({ order: "title" }); - res.data - .map((r) => r.title) - .should.deep.equal(["art1", "art2", "art3"]); + expect(res.data.map((r) => r.title)).toStrictEqual([ + "art1", + "art2", + "art3", + ]); }); it("should order records on custom field DESC", async () => { const res = await articles.list({ order: "-title" }); - res.data - .map((r) => r.title) - .should.deep.equal(["art3", "art2", "art1"]); + expect(res.data.map((r) => r.title)).toStrictEqual([ + "art3", + "art2", + "art1", + ]); }); it("should order records on boolean values ASC", async () => { const res = await articles.list({ order: "unread" }); - res.data - .map((r) => r.unread) - .should.deep.equal([false, false, true]); + expect(res.data.map((r) => r.unread)).toStrictEqual([ + false, + false, + true, + ]); }); it("should order records on boolean values DESC", async () => { const res = await articles.list({ order: "-unread" }); - res.data - .map((r) => r.unread) - .should.deep.equal([true, false, false]); + expect(res.data.map((r) => r.unread)).toStrictEqual([ + true, + false, + false, + ]); }); }); @@ -1435,9 +1439,9 @@ describe("Collection", () => { }, ]; - beforeEach(() => { + beforeEach(async () => { articles = testCollection(); - return Promise.all([ + await Promise.all([ articles.create(fixtures[0]), articles.create(fixtures[1]), articles.create(fixtures[2], { synced: true }), @@ -1448,24 +1452,30 @@ describe("Collection", () => { const res = await articles.list({ filters: { _status: "created" }, }); - res.data.map((r) => r.title).should.deep.equal(["art1", "art2"]); + expect(res.data.map((r) => r.title)).toStrictEqual([ + "art1", + "art2", + ]); }); it("should filter records on existing field", async () => { const res = await articles.list({ filters: { unread: true } }); - res.data.map((r) => r.title).should.deep.equal(["art1", "art3"]); + expect(res.data.map((r) => r.title)).toStrictEqual([ + "art1", + "art3", + ]); }); it("should filter records on missing field", async () => { const res = await articles.list({ filters: { missing: true } }); - res.data.map((r) => r.title).should.deep.equal([]); + expect(res.data.map((r) => r.title)).toStrictEqual([]); }); it("should filter records on multiple fields using 'and'", async () => { const res = await articles.list({ filters: { unread: true, complete: true }, }); - res.data.map((r) => r.title).should.deep.equal(["art1"]); + expect(res.data.map((r) => r.title)).toStrictEqual(["art1"]); }); }); @@ -1512,9 +1522,9 @@ describe("Collection", () => { }, ]; - beforeEach(() => { + beforeEach(async () => { articles = testCollection(); - return Promise.all(fixtures.map((r) => articles.create(r))); + await Promise.all(fixtures.map((r) => articles.create(r))); }); it("Filters nested objects", async () => { @@ -1524,11 +1534,11 @@ describe("Collection", () => { "author.otherBook.title": "book3", }, }); - res.data - .map((r) => { + expect( + res.data.map((r) => { return r.title; }) - .should.deep.equal(["art3"]); + ).toStrictEqual(["art3"]); }); it("should return empty array if missing subObject field", async () => { @@ -1538,7 +1548,7 @@ describe("Collection", () => { "author.unknownField": "blahblahblah", }, }); - res.data.should.deep.equal([]); + expect(res.data).toStrictEqual([]); }); }); @@ -1549,9 +1559,9 @@ describe("Collection", () => { { title: "art3", last_modified: 1, unread: true, complete: true }, ]; - beforeEach(() => { + beforeEach(async () => { articles = testCollection(); - return Promise.all(fixtures.map((r) => articles.create(r))); + await Promise.all(fixtures.map((r) => articles.create(r))); }); it("should order and filter records", async () => { @@ -1559,18 +1569,18 @@ describe("Collection", () => { order: "-title", filters: { unread: true, complete: true }, }); - res.data - .map((r: any) => { + expect( + res.data.map((r: any) => { return { title: r.title, unread: r.unread, complete: r.complete, }; }) - .should.deep.equal([ - { title: "art3", unread: true, complete: true }, - { title: "art1", unread: true, complete: true }, - ]); + ).toStrictEqual([ + { title: "art3", unread: true, complete: true }, + { title: "art1", unread: true, complete: true }, + ]); }); }); }); @@ -1582,17 +1592,16 @@ describe("Collection", () => { describe("Deprecated #loadDump", () => { let articles: Collection; - it("should call importBulk", () => { + it("should call importBulk", async () => { articles = testCollection(); - const importBulkStub = sandbox - .stub(articles, "importBulk") - .returns(Promise.resolve([])); - articles - .loadDump([ - { id: uuid4(), title: "foo", last_modified: 1452347896 }, - { id: uuid4(), title: "bar", last_modified: 1452347985 }, - ]) - .then(() => sinon.assert.calledOnce(importBulkStub)); + const importBulkStub = vitest + .spyOn(articles, "importBulk") + .mockReturnValue(Promise.resolve([])); + await articles.loadDump([ + { id: uuid4(), title: "foo", last_modified: 1452347896 }, + { id: uuid4(), title: "bar", last_modified: 1452347985 }, + ]); + expect(importBulkStub).toHaveBeenCalledOnce(); }); }); @@ -1609,7 +1618,7 @@ describe("Collection", () => { { id: uuid4(), title: "foo", last_modified: 1452347896 }, { id: uuid4(), title: "bar", last_modified: 1452347985 }, ]); - res.should.have.lengthOf(2); + expect(res).toHaveLength(2); }); it("should fail if records is not an array", async () => { @@ -1649,7 +1658,7 @@ describe("Collection", () => { { id: testId, title: "foo", last_modified: 1457896541 }, ]); const res = await articles.get(testId); - res.data._status.should.equal("synced"); + expect(res.data).toHaveProperty("_status", "synced"); }); it("should ignore already imported records.", async () => { @@ -1660,7 +1669,7 @@ describe("Collection", () => { }; await articles.importBulk([record]); const res = await articles.importBulk([record]); - res.should.have.lengthOf(0); + expect(res).toHaveLength(0); }); it("should overwrite old records.", async () => { @@ -1672,7 +1681,7 @@ describe("Collection", () => { await articles.importBulk([record]); const updated = { ...record, last_modified: 1457896543 }; const res = await articles.importBulk([updated]); - res.should.have.lengthOf(1); + expect(res).toHaveLength(1); }); it("should not overwrite unsynced records.", async () => { @@ -1683,7 +1692,7 @@ describe("Collection", () => { last_modified: 1457896541, }; const res = await articles.importBulk([record]); - res.should.have.lengthOf(0); + expect(res).toHaveLength(0); }); it("should not overwrite records without last modified.", async () => { @@ -1697,7 +1706,7 @@ describe("Collection", () => { last_modified: 1457896541, }; const res = await articles.importBulk([record]); - res.should.have.lengthOf(0); + expect(res).toHaveLength(0); }); }); @@ -1720,10 +1729,10 @@ describe("Collection", () => { ]); const res = await articles.gatherLocalChanges(); - res - .map((r) => (r as any).title) - .sort() - .should.deep.equal(["abcdef?!", "ghijkl?!"]); + expect(res.map((r) => (r as any).title).sort()).toStrictEqual([ + "abcdef?!", + "ghijkl?!", + ]); }); it("should encode even deleted records", async () => { @@ -1758,7 +1767,7 @@ describe("Collection", () => { describe("#pullChanges", () => { let client: KintoClientCollection, articles: Collection, - listRecords: sinon.SinonStub, + listRecords: Mock, result: SyncResultObject; beforeEach(() => { @@ -1796,9 +1805,9 @@ describe("Collection", () => { ]; beforeEach(async () => { - listRecords = sandbox - .stub(KintoClientCollection.prototype, "listRecords") - .returns( + listRecords = vitest + .spyOn(KintoClientCollection.prototype, "listRecords") + .mockReturnValue( Promise.resolve({ data: serverChanges, next: (() => {}) as any, @@ -1822,13 +1831,13 @@ describe("Collection", () => { const withConflicts = new SyncResultObject(); withConflicts.add("conflicts", [1 as any]); await articles.pullChanges(client, withConflicts); - return sinon.assert.notCalled(listRecords); + expect(listRecords).not.toHaveBeenCalled(); }); it("should fetch remote changes from the server", async () => { await articles.pullChanges(client, result); - sinon.assert.calledOnce(listRecords); - sinon.assert.calledWithExactly(listRecords, { + expect(listRecords).toHaveBeenCalledOnce(); + expect(listRecords).toHaveBeenCalledWith({ since: undefined, filters: undefined, retry: undefined, @@ -1839,8 +1848,8 @@ describe("Collection", () => { it("should use timestamp to fetch remote changes from the server", async () => { await articles.pullChanges(client, result, { lastModified: 42 }); - sinon.assert.calledOnce(listRecords); - sinon.assert.calledWithExactly(listRecords, { + expect(listRecords).toHaveBeenCalledOnce(); + expect(listRecords).toHaveBeenCalledWith({ since: "42", filters: undefined, retry: undefined, @@ -1855,8 +1864,8 @@ describe("Collection", () => { lastModified: 42, exclude, }); - sinon.assert.calledOnce(listRecords); - sinon.assert.calledWithExactly(listRecords, { + expect(listRecords).toHaveBeenCalledOnce(); + expect(listRecords).toHaveBeenCalledWith({ since: "42", filters: { exclude_id: "1,2,3" }, retry: undefined, @@ -1869,8 +1878,8 @@ describe("Collection", () => { await articles.pullChanges(client, result, { expectedTimestamp: '"123"', }); - sinon.assert.calledOnce(listRecords); - sinon.assert.calledWithExactly(listRecords, { + expect(listRecords).toHaveBeenCalledOnce(); + expect(listRecords).toHaveBeenCalledWith({ since: undefined, filters: { _expected: '"123"' }, retry: undefined, @@ -1881,7 +1890,7 @@ describe("Collection", () => { it("should resolve with imported creations", async () => { const res = await articles.pullChanges(client, result); - res.created.should.deep.equal([ + expect(res.created).toStrictEqual([ { id: id_3, title: "art3", @@ -1899,7 +1908,7 @@ describe("Collection", () => { it("should resolve with imported updates", async () => { const res = await articles.pullChanges(client, result); - res.updated.should.deep.equal([ + expect(res.updated).toStrictEqual([ { new: { id: id_7, @@ -1918,20 +1927,20 @@ describe("Collection", () => { it("should resolve with imported deletions", async () => { const res = await articles.pullChanges(client, result); - res.deleted.should.deep.equal([ + expect(res.deleted).toStrictEqual([ { id: id_4, title: "art4", _status: "synced" }, ]); }); it("should resolve with no conflicts detected", async () => { const res = await articles.pullChanges(client, result); - res.conflicts.should.deep.equal([]); + expect(res.conflicts).toStrictEqual([]); }); it("should actually import changes into the collection", async () => { await articles.pullChanges(client, result); const res = await articles.list({ order: "title" }); - res.data.should.deep.equal([ + expect(res.data).toStrictEqual([ { id: id_1, title: "art1", _status: "synced" }, { id: id_2, title: "art2", last_modified: 0, _status: "synced" }, { id: id_3, title: "art3", last_modified: 0, _status: "synced" }, @@ -1956,7 +1965,7 @@ describe("Collection", () => { it("should not list identical records as skipped", async () => { const res = await articles.pullChanges(client, result); - res.skipped.should.not.contain({ + expect(res.skipped).not.contain({ id: id_2, title: "art2", _status: "synced", @@ -1978,7 +1987,7 @@ describe("Collection", () => { }); await articles.pullChanges(client, result); - expect(hookCalled).to.equal(true); + expect(hookCalled).toBeTruthy(); }); it("should reject the promise if the hook throws", async () => { @@ -2128,7 +2137,7 @@ describe("Collection", () => { } beforeEach(() => { - listRecords.returns( + listRecords.mockReturnValue( Promise.resolve({ data: [{ id: uuid4(), title: "bar" }], next: () => {}, @@ -2143,7 +2152,7 @@ describe("Collection", () => { }); const res = await articles.pullChanges(client, result); - res.created[0].title.should.equal("bar#"); + expect(res.created[0]).toHaveProperty("title", "bar#"); }); it("should decode incoming encoded records using multiple transformers", async () => { @@ -2155,7 +2164,7 @@ describe("Collection", () => { }); const res = await articles.pullChanges(client, result); - res.created[0].title.should.equal("bar?!"); // reversed because we decode in the opposite order + expect(res.created[0]).toHaveProperty("title", "bar?!"); // reversed because we decode in the opposite order }); it("should decode incoming records even when deleted", async () => { @@ -2172,7 +2181,7 @@ describe("Collection", () => { remoteTransformers: [transformer], }); const id = uuid4(); - listRecords.returns( + listRecords.mockReturnValue( Promise.resolve({ data: [{ id, deleted: true }], next: () => {}, @@ -2185,7 +2194,7 @@ describe("Collection", () => { ); const res = await articles.pullChanges(client, result); expect(transformer.called).equal(true); - res.deleted[0].should.have.property("id").equal("local-" + id); + expect(res.deleted[0]).toHaveProperty("id", "local-" + id); }); }); @@ -2194,10 +2203,10 @@ describe("Collection", () => { const error = new Error("bad"); const rejection = Promise.reject(error); rejection.catch(() => {}); - sandbox.stub(articles.db, "execute").returns(rejection); + vitest.spyOn(articles.db, "execute").mockReturnValue(rejection); const res = await articles.pullChanges(client, result); - res.errors.should.deep.equal([ + expect(res.errors).toStrictEqual([ { type: "incoming", message: error.message, @@ -2218,9 +2227,9 @@ describe("Collection", () => { }); it("should resolve listing conflicting changes with MANUAL strategy", async () => { - sandbox - .stub(KintoClientCollection.prototype, "listRecords") - .returns( + vitest + .spyOn(KintoClientCollection.prototype, "listRecords") + .mockReturnValue( Promise.resolve({ data: [ { id: createdId, title: "art2mod", last_modified: 42 }, // will conflict with unsynced local record @@ -2233,7 +2242,7 @@ describe("Collection", () => { ); const res = await articles.pullChanges(client, result); - res["toObject"]().should.deep.equal({ + expect(res["toObject"]()).toStrictEqual({ ok: false, lastModified: 42, errors: [], @@ -2269,9 +2278,9 @@ describe("Collection", () => { remote, }; const resolution = { ...local, title: "resolved" }; - sandbox - .stub(KintoClientCollection.prototype, "listRecords") - .returns( + vitest + .spyOn(KintoClientCollection.prototype, "listRecords") + .mockReturnValue( Promise.resolve({ data: [remote], next: (() => {}) as any, @@ -2283,7 +2292,7 @@ describe("Collection", () => { const syncResult = new SyncResultObject(); await articles.resolve(conflict, resolution); const result = await articles.pullChanges(client, syncResult); - result["toObject"]().should.deep.equal({ + expect(result["toObject"]()).toStrictEqual({ ok: true, lastModified: 42, errors: [], @@ -2304,9 +2313,9 @@ describe("Collection", () => { beforeEach(async () => { const res = await articles.create({ title: "art2" }); createdId = res.data.id; - sandbox - .stub(KintoClientCollection.prototype, "listRecords") - .returns( + vitest + .spyOn(KintoClientCollection.prototype, "listRecords") + .mockReturnValue( Promise.resolve({ data: [{ id: createdId, title: "art2", last_modified: 0 }], next: (() => {}) as any, @@ -2319,7 +2328,7 @@ describe("Collection", () => { it("should resolve with solved changes", async () => { const res = await articles.pullChanges(client, result); - res["toObject"]().should.deep.equal({ + expect(res["toObject"]()).toStrictEqual({ ok: true, lastModified: 42, errors: [], @@ -2356,10 +2365,12 @@ describe("Collection", () => { it("should return errors when encountered", async () => { const error = new Error("unknown error"); - sandbox.stub(articles.db, "execute").returns(Promise.reject(error)); + vitest + .spyOn(articles.db, "execute") + .mockReturnValue(Promise.reject(error)); const res = await articles.importChanges(result, [{ title: "bar" }]); - res.errors.should.deep.equal([ + expect(res.errors).toStrictEqual([ { type: "incoming", message: error.message, @@ -2371,16 +2382,18 @@ describe("Collection", () => { it("should only retrieve the changed record", async () => { const id1 = uuid4(); const id2 = uuid4(); - const execute = sandbox - .stub(articles.db, "execute") - .returns(Promise.resolve([])); + const execute = vitest + .spyOn(articles.db, "execute") + .mockReturnValue(Promise.resolve([])); await articles.importChanges(result, [ { id: id1, title: "foo" }, { id: id2, title: "bar" }, ]); - const preload = execute.lastCall.args[1]!.preload; - expect(preload).eql([id1, id2]); + expect(execute.mock.lastCall[1]).toHaveProperty("preload", [ + id1, + id2, + ]); }); it("should merge remote with local fields", async () => { @@ -2461,42 +2474,44 @@ describe("Collection", () => { }); it("should publish local changes to the server", async () => { - const batchRequests = sandbox - .stub(Api.prototype, "_batchRequests" as any) - .returns(Promise.resolve([{}])); + const batchRequests = vitest + .spyOn(Api.prototype, "_batchRequests" as any) + .mockReturnValue(Promise.resolve([{}])); await articles.pushChanges(client, records, result); - const requests = batchRequests.firstCall.args[0]; - const options = batchRequests.firstCall.args[1]; + const requests = batchRequests.mock.lastCall[0]; + const options = batchRequests.mock.lastCall[1]; expect(requests).to.have.lengthOf(1); - expect(requests[0].body.data.title).equal("foo"); + expect(requests[0].body.data).toHaveProperty("title", "foo"); expect(options.safe).equal(true); }); it("should not publish local fields to the server", async () => { - const batchRequests = sandbox - .stub(Api.prototype, "_batchRequests" as any) - .returns(Promise.resolve([{}])); + const batchRequests = vitest + .spyOn(Api.prototype, "_batchRequests" as any) + .mockReturnValue(Promise.resolve([{}])); articles = testCollection({ localFields: ["size"] }); const toSync = [{ ...records[0], title: "ah", size: 3.14 }]; await articles.pushChanges(client, toSync, result); - const requests = batchRequests.firstCall.args[0]; - expect(requests[0].body.data.title).equal("ah"); - expect(requests[0].body.data.size).to.not.exist; + const requests = batchRequests.mock.lastCall[0]; + expect(requests[0].body.data).toHaveProperty("title", "ah"); + expect(requests[0].body.data.size).toBeUndefined(); }); it("should update published records local status", async () => { - sandbox.stub(KintoClientCollection.prototype, "batch").returns( - Promise.resolve({ - published: [{ data: records[0] }], - errors: [], - conflicts: [], - skipped: [], - }) - ); + vitest + .spyOn(KintoClientCollection.prototype, "batch") + .mockReturnValue( + Promise.resolve({ + published: [{ data: records[0] }], + errors: [], + conflicts: [], + skipped: [], + }) + ); const res = await articles.pushChanges(client, records, result); - res.published.should.deep.equal([ + expect(res.published).toStrictEqual([ { _status: "synced", id: records[0].id, @@ -2506,13 +2521,13 @@ describe("Collection", () => { }); it("should not publish records created and deleted locally and never synced", async () => { - const batchRequests = sandbox - .stub(Api.prototype, "_batchRequests" as any) - .returns(Promise.resolve([])); + const batchRequests = vitest + .spyOn(Api.prototype, "_batchRequests" as any) + .mockReturnValue(Promise.resolve([])); const toDelete = [{ id: records[0].id, _status: "deleted" }]; // no timestamp. await articles.pushChanges(client, toDelete, result); - const requests = batchRequests.firstCall.args[0]; + const requests = batchRequests.mock.lastCall[0]; expect(requests).eql([]); }); @@ -2520,14 +2535,16 @@ describe("Collection", () => { const record = await articles.create({ title: "record to be deleted", }); - sandbox.stub(KintoClientCollection.prototype, "batch").returns( - Promise.resolve({ - published: [{ data: { id: record.data.id, deleted: true } }], - errors: [], - conflicts: [], - skipped: [], - }) - ); + vitest + .spyOn(KintoClientCollection.prototype, "batch") + .mockReturnValue( + Promise.resolve({ + published: [{ data: { id: record.data.id, deleted: true } }], + errors: [], + conflicts: [], + skipped: [], + }) + ); await articles.delete(record.data.id); await articles.pushChanges(client, records, result); await expectAsyncError( @@ -2537,35 +2554,39 @@ describe("Collection", () => { }); it("should delete locally the records deleted remotely", async () => { - sandbox.stub(KintoClientCollection.prototype, "batch").returns( - Promise.resolve({ - published: [{ data: { id: records[0].id, deleted: true } }], - errors: [], - conflicts: [], - skipped: [], - }) - ); + vitest + .spyOn(KintoClientCollection.prototype, "batch") + .mockReturnValue( + Promise.resolve({ + published: [{ data: { id: records[0].id, deleted: true } }], + errors: [], + conflicts: [], + skipped: [], + }) + ); const res = await articles.pushChanges(client, [], result); - res.published.should.deep.equal([ + expect(res.published).toStrictEqual([ { id: records[0].id, deleted: true }, ]); }); it("should delete locally the records already deleted remotely", async () => { const id = records[0].id; - sandbox.stub(KintoClientCollection.prototype, "batch").returns( - Promise.resolve({ - published: [], - errors: [], - conflicts: [], - skipped: [ - { - id, - error: { errno: 110, code: 404, error: "Not found" }, - }, - ], - }) - ); + vitest + .spyOn(KintoClientCollection.prototype, "batch") + .mockReturnValue( + Promise.resolve({ + published: [], + errors: [], + conflicts: [], + skipped: [ + { + id, + error: { errno: 110, code: 404, error: "Not found" }, + }, + ], + }) + ); await articles.create( { id, title: "bar" }, { useRecordId: true, synced: true } @@ -2579,27 +2600,19 @@ describe("Collection", () => { describe("Batch requests made", () => { let batch: { - deleteRecord: () => void; - createRecord: () => void; - updateRecord: () => void; - }, - batchSpy: sinon.SinonMock, - deleteRecord: sinon.SinonExpectation, - createRecord: sinon.SinonExpectation, - updateRecord: sinon.SinonExpectation; + deleteRecord: Mock; + createRecord: Mock; + updateRecord: Mock; + }; beforeEach(() => { batch = { - deleteRecord() {}, - createRecord() {}, - updateRecord() {}, + deleteRecord: vitest.fn(), + createRecord: vitest.fn(), + updateRecord: vitest.fn(), }; - batchSpy = sandbox.mock(batch); - deleteRecord = batchSpy.expects("deleteRecord"); - createRecord = batchSpy.expects("createRecord"); - updateRecord = batchSpy.expects("updateRecord"); - sandbox - .stub(KintoClientCollection.prototype, "batch") - .callsFake((f) => { + vitest + .spyOn(KintoClientCollection.prototype, "batch") + .mockImplementation((f) => { f(batch as unknown as KintoClientCollection); return Promise.resolve({ published: [], @@ -2616,12 +2629,11 @@ describe("Collection", () => { _status: "deleted", last_modified: 1234, }; - deleteRecord.once(); - createRecord.never(); - updateRecord.never(); await articles.pushChanges(client, [myDeletedRecord], result); - batchSpy.verify(); - deleteRecord.firstCall.args.should.deep.equal([myDeletedRecord]); + expect(batch.deleteRecord).toHaveBeenCalledOnce(); + expect(batch.createRecord).not.toHaveBeenCalled(); + expect(batch.updateRecord).not.toHaveBeenCalled(); + expect(batch.deleteRecord).toHaveBeenCalledWith(myDeletedRecord); }); it("should call create() for created records", async () => { @@ -2629,14 +2641,13 @@ describe("Collection", () => { id: "created-record-id", _status: "created", }; - deleteRecord.never(); - createRecord.once(); - updateRecord.never(); await articles.pushChanges(client, [myCreatedRecord], result); - batchSpy.verify(); - createRecord.firstCall.args.should.deep.equal([ - { id: "created-record-id" }, - ]); + expect(batch.deleteRecord).not.toHaveBeenCalled(); + expect(batch.createRecord).toHaveBeenCalledOnce(); + expect(batch.updateRecord).not.toHaveBeenCalled(); + expect(batch.createRecord).toHaveBeenCalledWith({ + id: "created-record-id", + }); }); it("should call update() for updated records", async () => { @@ -2645,14 +2656,14 @@ describe("Collection", () => { _status: "updated", last_modified: 1234, }; - deleteRecord.never(); - createRecord.never(); - updateRecord.once(); await articles.pushChanges(client, [myUpdatedRecord], result); - batchSpy.verify(); - updateRecord.firstCall.args.should.deep.equal([ - { id: "updated-record-id", last_modified: 1234 }, - ]); + expect(batch.deleteRecord).not.toHaveBeenCalled(); + expect(batch.createRecord).not.toHaveBeenCalled(); + expect(batch.updateRecord).toHaveBeenCalledOnce(); + expect(batch.updateRecord).toHaveBeenCalledWith({ + id: "updated-record-id", + last_modified: 1234, + }); }); }); @@ -2667,24 +2678,26 @@ describe("Collection", () => { }; beforeEach(() => { - sandbox.stub(KintoClientCollection.prototype, "batch").returns( - Promise.resolve({ - errors: [error], - published: [], - conflicts: [], - skipped: [], - }) - ); + vitest + .spyOn(KintoClientCollection.prototype, "batch") + .mockReturnValue( + Promise.resolve({ + errors: [error], + published: [], + conflicts: [], + skipped: [], + }) + ); }); it("should report encountered publication errors", async () => { const res = await articles.pushChanges(client, records, result); - res.errors.should.deep.equal([{ ...error, type: "outgoing" }]); + expect(res.errors).toStrictEqual([{ ...error, type: "outgoing" }]); }); it("should report typed publication errors", async () => { const res = await articles.pushChanges(client, records, result); - res.errors[0].should.have.property("type").equal("outgoing"); + expect(res.errors[0]).toHaveProperty("type", "outgoing"); }); }); }); @@ -2705,13 +2718,13 @@ describe("Collection", () => { return articles.create(fixture, { synced: true }); }) ); - return articles.delete(fixtures[1].id); + await articles.delete(fixtures[1].id); }); it("should reset the synced status of all local records", async () => { await articles.resetSyncStatus(); const list = await articles.list({ filters: { _status: "synced" } }); - list.should.have.property("data").to.have.length(0); + expect(list.data).toHaveLength(0); }); it("should garbage collect the locally deleted records", async () => { @@ -2720,7 +2733,7 @@ describe("Collection", () => { { filters: { _status: "deleted" } }, { includeDeleted: true } ); - list.should.have.property("data").to.have.length(0); + expect(list.data).toHaveLength(0); }); it("should clear last modified value of all records", async () => { @@ -2737,7 +2750,7 @@ describe("Collection", () => { it("should resolve with the number of local records processed ", async () => { const num = await articles.resetSyncStatus(); - num.should.equal(3); + expect(num).equal(3); }); }); @@ -2752,12 +2765,12 @@ describe("Collection", () => { beforeEach(async () => { articles = testCollection(); - sandbox.stub(api, "batch").get(() => () => ({ + vitest.spyOn(api, "batch").mockResolvedValue({ errors: [] as any[], published: [] as any[], conflicts: [] as any[], skipped: [] as any[], - })); + }); const res = await Promise.all( fixtures.map((fixture) => articles.create(fixture)) ); @@ -2772,43 +2785,48 @@ describe("Collection", () => { }); it("should use a custom remote option", async () => { - sandbox.stub(articles, "importChanges"); - sandbox - .stub(articles, "pushChanges") - .returns(Promise.resolve(new SyncResultObject())); - const fetch = sandbox - .stub(articles.api.http, "timedFetch") - .returns(fakeServerResponse(200, { data: [] }, {}) as any); + vitest.spyOn(articles, "importChanges"); + vitest + .spyOn(articles, "pushChanges") + .mockReturnValue(Promise.resolve(new SyncResultObject())); + const fetch = vitest + .spyOn(articles.api.http, "timedFetch") + .mockReturnValue(fakeServerResponse(200, { data: [] }, {}) as any); await articles.sync({ remote: "http://test/v1" }); - sinon.assert.calledWith( - fetch, - sinon.match(/http:\/\/test\/v1/), - sinon.match.any + expect(fetch).toHaveBeenCalledWith( + expect.stringMatching(/http:\/\/test\/v1/), + { + mode: "cors", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + } ); }); it("should revert the custom remote option on success", async () => { - sandbox.stub(articles, "importChanges"); - sandbox - .stub(articles, "pushChanges") - .returns(Promise.resolve(new SyncResultObject())); - sandbox - .stub(articles.api.http, "timedFetch") - .returns(fakeServerResponse(200, { data: [] }, {}) as any); + vitest.spyOn(articles, "importChanges"); + vitest + .spyOn(articles, "pushChanges") + .mockReturnValue(Promise.resolve(new SyncResultObject())); + vitest + .spyOn(articles.api.http, "timedFetch") + .mockReturnValue(fakeServerResponse(200, { data: [] }, {}) as any); await articles.sync({ remote: "http://test/v1" }); expect(api.remote).equal(FAKE_SERVER_URL); }); it("should revert the custom remote option on failure", async () => { - sandbox.stub(articles, "importChanges"); + vitest.spyOn(articles, "importChanges"); const rejection = Promise.reject("boom"); rejection.catch(() => {}); - sandbox.stub(articles, "pushChanges").returns(rejection); - sandbox - .stub(articles.api.http, "timedFetch") - .returns(fakeServerResponse(200, { data: [] }, {}) as any); + vitest.spyOn(articles, "pushChanges").mockReturnValue(rejection); + vitest + .spyOn(articles.api.http, "timedFetch") + .mockReturnValue(fakeServerResponse(200, { data: [] }, {}) as any); try { await articles.sync({ remote: "http://test/v1" }); @@ -2818,200 +2836,208 @@ describe("Collection", () => { it("should load fixtures", async () => { const res = await articles.list(); - res.data.should.have.lengthOf(3); + expect(res.data).toHaveLength(3); }); it("should pullMetadata with options", async () => { - const pullMetadata = sandbox.stub(articles, "pullMetadata"); - sandbox.stub(KintoClientCollection.prototype, "listRecords").returns( - Promise.resolve({ + const pullMetadata = vitest + .spyOn(articles, "pullMetadata") + .mockResolvedValue({}); + vitest + .spyOn(KintoClientCollection.prototype, "listRecords") + .mockResolvedValue({ last_modified: "42", next: (() => {}) as any, data: [], hasNextPage: false, totalRecords: 0, - }) - ); + }); const options = { headers: { Authorization: "Basic 123", }, }; await articles.sync(options); - expect(pullMetadata.callCount).equal(1); + expect(pullMetadata).toHaveBeenCalledOnce(); // First argument is the client, which we don't care too much about // Second argument is the options - expect(pullMetadata.getCall(0).args[1]).include(options); + expect(pullMetadata.mock.lastCall[1]).include(options); }); it("should fetch latest changes from the server", async () => { - sandbox.stub(articles, "pullMetadata"); - const listRecords = sandbox - .stub(KintoClientCollection.prototype, "listRecords") - .returns( - Promise.resolve({ - last_modified: "42", - next: (() => {}) as any, - data: [], - hasNextPage: false, - totalRecords: 0, - }) - ); + vitest.spyOn(articles, "pullMetadata"); + const listRecords = vitest + .spyOn(KintoClientCollection.prototype, "listRecords") + .mockResolvedValue({ + last_modified: "42", + next: (() => {}) as any, + data: [], + hasNextPage: false, + totalRecords: 0, + }); await articles.sync(); // Never synced so we fetch all the records from the server - sinon.assert.calledWithMatch(listRecords, { since: undefined }); + expect(listRecords).toHaveBeenLastCalledWith( + expect.objectContaining({ + since: undefined, + }) + ); }); it("should store latest lastModified value when no conflicts", async () => { - sandbox.stub(articles, "pullMetadata"); - sandbox.stub(KintoClientCollection.prototype, "listRecords").returns( - Promise.resolve({ + vitest.spyOn(articles, "pullMetadata"); + vitest + .spyOn(KintoClientCollection.prototype, "listRecords") + .mockResolvedValue({ last_modified: "42", next: (() => {}) as any, data: [], hasNextPage: false, totalRecords: 0, - }) - ); + }); await articles.sync(); expect(articles.lastModified).equal(42); }); it("shouldn't store latest lastModified on conflicts", async () => { - sandbox.stub(articles, "pullMetadata"); - sandbox.stub(KintoClientCollection.prototype, "listRecords").returns( - Promise.resolve({ - last_modified: "43", - next: (() => {}) as any, - data: [ - { - id: ids[0], - title: "art1mod", - last_modified: 43, - }, - ], - hasNextPage: false, - totalRecords: 1, - }) - ); + vitest.spyOn(articles, "pullMetadata"); + vitest + .spyOn(KintoClientCollection.prototype, "listRecords") + .mockReturnValue( + Promise.resolve({ + last_modified: "43", + next: (() => {}) as any, + data: [ + { + id: ids[0], + title: "art1mod", + last_modified: 43, + }, + ], + hasNextPage: false, + totalRecords: 1, + }) + ); await articles.sync(); expect(articles.lastModified).equal(null); }); it("shouldn't store latest lastModified on errors", async () => { - sandbox.stub(articles, "pullMetadata"); - sandbox.stub(KintoClientCollection.prototype, "listRecords").returns( - Promise.resolve({ - last_modified: "43", - next: (() => {}) as any, - data: [ - { - id: ids[0], - title: "art1mod", - last_modified: 0, - }, - ], - hasNextPage: false, - totalRecords: 0, - }) - ); + vitest.spyOn(articles, "pullMetadata"); + vitest + .spyOn(KintoClientCollection.prototype, "listRecords") + .mockReturnValue( + Promise.resolve({ + last_modified: "43", + next: (() => {}) as any, + data: [ + { + id: ids[0], + title: "art1mod", + last_modified: 0, + }, + ], + hasNextPage: false, + totalRecords: 0, + }) + ); const rejection = Promise.reject(new Error("error")); rejection.catch(() => {}); - sandbox.stub(articles.db, "execute").returns(rejection); + vitest.spyOn(articles.db, "execute").mockReturnValue(rejection); await articles.sync(); expect(articles.lastModified).equal(null); }); it("should not execute a last pull on push failure", async () => { - sandbox.stub(articles, "pullMetadata"); - const pullChanges = sandbox.stub(articles, "pullChanges"); - sandbox - .stub(articles, "pushChanges") - .callsFake((client, changes, result) => { + vitest.spyOn(articles, "pullMetadata"); + const pullChanges = vitest.spyOn(articles, "pullChanges"); + vitest + .spyOn(articles, "pushChanges") + .mockImplementation((client, changes, result) => { result.add("conflicts", [1 as any]); return Promise.resolve(result); }); await articles.sync(); - return sinon.assert.calledOnce(pullChanges); + expect(pullChanges).toHaveBeenCalledOnce(); }); it("should not execute a last pull if nothing to push", async () => { - sandbox.stub(articles, "pullMetadata"); - sandbox - .stub(articles, "gatherLocalChanges") - .returns(Promise.resolve([])); - const pullChanges = sandbox - .stub(articles, "pullChanges") - .returns(Promise.resolve(new SyncResultObject())); + vitest.spyOn(articles, "pullMetadata"); + vitest + .spyOn(articles, "gatherLocalChanges") + .mockReturnValue(Promise.resolve([])); + const pullChanges = vitest + .spyOn(articles, "pullChanges") + .mockReturnValue(Promise.resolve(new SyncResultObject())); await articles.sync(); - sinon.assert.calledOnce(pullChanges); + expect(pullChanges).toHaveBeenCalledOnce(); }); it("should not redownload pushed changes", async () => { const record1 = { id: uuid4(), title: "blog" }; const record2 = { id: uuid4(), title: "post" }; - sandbox.stub(articles, "pullMetadata"); - const pullChangesStub = sandbox.stub(articles, "pullChanges"); - sandbox - .stub(articles, "pushChanges") - .callsFake((client, changes, result) => { + vitest.spyOn(articles, "pullMetadata"); + const pullChangesStub = vitest.spyOn(articles, "pullChanges"); + vitest + .spyOn(articles, "pushChanges") + .mockImplementation((client, changes, result) => { result.add("published", record1); result.add("published", record2); return Promise.resolve(result); }); const res = await articles.sync(); expect(res.published).to.have.length(2); - expect(pullChangesStub.lastCall.args[2]!.exclude).eql([ + expect(pullChangesStub.mock.lastCall[2]!.exclude).eql([ record1, record2, ]); }); it("should store collection metadata", async () => { - sandbox.stub(articles, "pullChanges"); + vitest.spyOn(articles, "pullChanges"); const metadata = { id: "articles", last_modified: 42 }; - sandbox - .stub(KintoClientCollection.prototype, "getData") - .returns(Promise.resolve(metadata)); + vitest + .spyOn(KintoClientCollection.prototype, "getData") + .mockReturnValue(Promise.resolve(metadata)); await articles.sync(); const stored = await articles.metadata(); expect(stored).to.deep.equal(metadata); }); describe("Options", () => { - let pullChanges: sinon.SinonStub; + let pullChanges: Mock; beforeEach(() => { - sandbox.stub(articles, "pullMetadata"); - pullChanges = sandbox - .stub(articles, "pullChanges") - .returns(Promise.resolve(new SyncResultObject())) as any; + vitest.spyOn(articles, "pullMetadata"); + pullChanges = vitest + .spyOn(articles, "pullChanges") + .mockReturnValue(Promise.resolve(new SyncResultObject())) as any; }); it("should transfer the headers option", async () => { await articles.sync({ headers: { Foo: "Bar" } }); - expect(pullChanges.firstCall.args[2]) + expect(pullChanges.mock.lastCall[2]) .to.have.property("headers") .eql({ Foo: "Bar" }); }); it("should transfer the strategy option", async () => { await articles.sync({ strategy: Collection.strategy.SERVER_WINS }); - expect(pullChanges.firstCall.args[2]) + expect(pullChanges.mock.lastCall[2]) .to.have.property("strategy") .equal(Collection.strategy.SERVER_WINS); }); it("should transfer the retry option", async () => { await articles.sync({ retry: 3 }); - expect(pullChanges.firstCall.args[2]) + expect(pullChanges.mock.lastCall[2]) .to.have.property("retry") .equal(3); }); it("should transfer the expectedTimestamp option", async () => { await articles.sync({ expectedTimestamp: '"123"' }); - expect(pullChanges.firstCall.args[2]) + expect(pullChanges.mock.lastCall[2]) .to.have.property("expectedTimestamp") .equal('"123"'); }); @@ -3029,16 +3055,16 @@ describe("Collection", () => { }); it("should perform sync on server backoff when ignoreBackoff is true", async () => { - sandbox - .stub(articles.db, "getLastModified") - .returns(Promise.resolve(0)); - sandbox.stub(articles, "pullMetadata"); - const pullChanges = sandbox.stub(articles, "pullChanges"); - sandbox.stub(articles, "pushChanges"); + vitest + .spyOn(articles.db, "getLastModified") + .mockReturnValue(Promise.resolve(0)); + vitest.spyOn(articles, "pullMetadata"); + const pullChanges = vitest.spyOn(articles, "pullChanges"); + vitest.spyOn(articles, "pushChanges"); articles.api.events!.emit("backoff", new Date().getTime() + 30000); await articles.sync({ ignoreBackoff: true }); - return sinon.assert.calledOnce(pullChanges); + expect(pullChanges).toHaveBeenCalledOnce(); }); }); @@ -3047,27 +3073,25 @@ describe("Collection", () => { beforeEach(() => { // Disable stubbing of HTTP client of upper tests. - sandbox.restore(); + vitest.restoreAllMocks(); // Stub low-level fetch instead. - fetch = sandbox.stub(articles.api.http, "timedFetch"); + fetch = vitest.spyOn(articles.api.http, "timedFetch"); // Pull metadata - fetch - .onCall(0) - .returns(fakeServerResponse(200, { data: {} }, {}) as any); + fetch.mockReturnValueOnce( + fakeServerResponse(200, { data: {} }, {}) as any + ); // Pull records - fetch - .onCall(1) - .returns(fakeServerResponse(200, { data: [] }, {}) as any); + fetch.mockReturnValueOnce( + fakeServerResponse(200, { data: [] }, {}) as any + ); // Push - fetch - .onCall(2) - .returns(fakeServerResponse(200, { settings: {} }, {}) as any); - fetch - .onCall(3) - .returns( - fakeServerResponse(503, {}, { "Retry-After": "1" }) as any - ); - fetch.onCall(4).returns( + fetch.mockReturnValueOnce( + fakeServerResponse(200, { settings: {} }, {}) as any + ); + fetch.mockReturnValueOnce( + fakeServerResponse(503, {}, { "Retry-After": "1" }) as any + ); + fetch.mockReturnValueOnce( fakeServerResponse( 200, { @@ -3090,9 +3114,9 @@ describe("Collection", () => { ) as any ); // Last pull - fetch - .onCall(5) - .returns(fakeServerResponse(200, { data: [] }, {}) as any); + fetch.mockReturnValueOnce( + fakeServerResponse(200, { data: [] }, {}) as any + ); }); it("should retry if specified", async () => { @@ -3102,43 +3126,43 @@ describe("Collection", () => { }); describe("Events", () => { - let onsuccess: sinon.SinonSpy; - let onerror: sinon.SinonSpy; - let pushChangesStub: sinon.SinonStub; + let onsuccess: Mock; + let onerror: Mock; + let pushChangesStub: Mock; beforeEach(() => { - onsuccess = sinon.spy(); - onerror = sinon.spy(); + onsuccess = vitest.fn(); + onerror = vitest.fn(); articles.events.on("sync:success", onsuccess); articles.events.on("sync:error", onerror); - sandbox - .stub(articles.db, "getLastModified") - .returns(Promise.resolve(0)); - sandbox.stub(articles, "pullMetadata"); - sandbox.stub(articles, "pullChanges"); - pushChangesStub = sandbox.stub(articles, "pushChanges") as any; + vitest + .spyOn(articles.db, "getLastModified") + .mockReturnValue(Promise.resolve(0)); + vitest.spyOn(articles, "pullMetadata"); + vitest.spyOn(articles, "pullChanges"); + pushChangesStub = vitest.spyOn(articles, "pushChanges") as any; }); it("should send a success event", async () => { await articles.sync(); - expect(onsuccess.called).equal(true); - expect(onerror.called).equal(false); + expect(onsuccess).toHaveBeenCalled(); + expect(onerror).not.toHaveBeenCalled(); }); it("should send an error event", async () => { - pushChangesStub.throws(new Error("boom")); + pushChangesStub.mockRejectedValue(new Error("boom")); try { await articles.sync(); } catch (e) { - expect(onsuccess.called).equal(false); - expect(onerror.called).equal(true); + expect(onsuccess).not.toHaveBeenCalled(); + expect(onerror).toHaveBeenCalled(); } }); it("should provide success details about sync", async () => { await articles.sync(); - const data = onsuccess.firstCall.args[0]; + const data = onsuccess.mock.lastCall[0]; expect(data).to.have.property("result"); expect(data).to.have.property("remote"); expect(data).to.have.property("bucket"); @@ -3147,11 +3171,11 @@ describe("Collection", () => { }); it("should provide error details about sync", async () => { - pushChangesStub.throws(new Error("boom")); + pushChangesStub.mockRejectedValue(new Error("boom")); try { await articles.sync(); } catch (e) { - const data = onerror.firstCall.args[0]; + const data = onerror.mock.lastCall[0]; expect(data).to.have.property("error"); expect(data).to.have.property("remote"); expect(data).to.have.property("bucket"); @@ -3320,10 +3344,10 @@ describe("Collection", () => { }; const client = { - getData: sandbox.stub(), + getData: vitest.fn(), } as unknown as KintoClientCollection; await articles.pullMetadata(client, { headers }); - sinon.assert.calledWithExactly(client.getData as any, { + expect(client.getData).toHaveBeenCalledWith({ headers, }); }); @@ -3451,18 +3475,18 @@ describe("Collection", () => { describe("Transactions", () => { it("should send every events of a transaction", async () => { - const callback = sinon.spy(); + const callback = vitest.fn(); articles.events.on("create", callback); await articles.execute((txn) => { txn.create({ id: uuid4(), title: "foo" }); txn.create({ id: uuid4(), title: "bar" }); }); - return expect(callback.callCount).to.equal(2); + expect(callback).toHaveBeenCalledTimes(2); }); it("should not send any event if the transaction fails", async () => { - const callback = sinon.spy(); + const callback = vitest.fn(); articles.events.on("create", callback); try { @@ -3471,21 +3495,21 @@ describe("Collection", () => { throw new Error("Fail!"); }); } catch (e) {} - return expect(callback.callCount).equal(0); + expect(callback).toHaveBeenCalledTimes(0); }); it("should not send any change event if nothing happens in transaction", async () => { - const callback = sinon.spy(); + const callback = vitest.fn(); articles.events.on("change", callback); await articles.execute((txn) => { txn.deleteAny(uuid4()); }); - return expect(callback.callCount).equal(0); + expect(callback).toHaveBeenCalledTimes(0); }); it("should send a single changed event for the whole transaction", async () => { - const callback = sinon.spy(); + const callback = vitest.fn(); const id = uuid4(); const id2 = uuid4(); @@ -3499,8 +3523,8 @@ describe("Collection", () => { }, { preloadIds: [id] } ); - expect(callback.callCount).equal(1); - const payload = callback.lastCall.args[0]; + expect(callback).toHaveBeenCalledOnce(); + const payload = callback.mock.lastCall[0]; const { targets } = payload; expect(targets.length).equal(3); expect(targets[0]).eql({ diff --git a/test/http/collection_test.ts b/test/http/collection_test.ts index c82718a11..9cc28abe4 100644 --- a/test/http/collection_test.ts +++ b/test/http/collection_test.ts @@ -5,7 +5,6 @@ import Bucket from "../../src/http/bucket"; import Collection, { CollectionOptions } from "../../src/http/collection"; import { fakeServerResponse, - Stub, expectAsyncError, fakeHeaders, } from "../test_utils"; diff --git a/test/server.ts b/test/server.ts index 41a980b93..150b4dd79 100644 --- a/test/server.ts +++ b/test/server.ts @@ -1,27 +1,59 @@ +import { afterAll, beforeAll } from "vitest"; import { KintoProxyServer } from "kinto-node-test-server"; +import { http, HttpResponse } from "msw"; +import { setupServer } from "msw/node"; -function willRunBrowserTests() { - const { environments } = intern.config; - for (const env of environments) { - if (env.browserName !== "node") { - return true; - } - } +let kintoServer: KintoProxyServer = null; +let fakeServer = null; - return false; -} +const handlers = [ + http.get("http://fake-server/v1/", () => { + return HttpResponse.json({ + project_name: "Kinto Fakeserver", + project_version: "fake", + http_api_version: "fake", + url: "http://fake-server/v1/", + settings: { + explicit_permissions: false, + readonly: false, + batch_max_requests: 25, + }, + capabilities: {}, + }); + }), + http.all("http://fake-server/v1/batch", async (props) => { + const req = await props.request.json(); + const resp = req.requests.map({ + foo: "bar" + }); + return HttpResponse.json({ + responses: resp, + }); + }), + http.all(/http\:\/\/fake-server\/v1\/.*/, () => { + return HttpResponse.json({}); + }), +]; -let server: KintoProxyServer = null; +if (global.__vitest_environment__ == "node") { + fakeServer = setupServer(...handlers); + fakeServer.listen(); +} -intern.on("runStart", async () => { - if (willRunBrowserTests()) { - server = new KintoProxyServer(); +beforeAll(async () => { + if (global.__vitest_environment__ != "node") { + kintoServer = new KintoProxyServer(); await server.startServer(); } }); -intern.on("runEnd", async () => { - if (server) { - await server.stopServer(); +afterAll(async () => { + if (kintoServer) { + await kintoServer.stopServer(); + kintoServer = null; + } + if (fakeServer) { + fakeServer.close(); + fakeServer = null; } }); diff --git a/test/setup-globals.ts b/test/setup-globals.ts index 92f4166a3..1aa0379b9 100644 --- a/test/setup-globals.ts +++ b/test/setup-globals.ts @@ -1,17 +1,13 @@ -import fetch, { Headers } from "node-fetch"; -import Blob from "../blob"; - +// import fetch, { Headers } from "node-fetch"; // Expose a global fetch polyfill -(global as any).fetch = fetch; -(global as any).Headers = Headers; +// (global as any).fetch = fetch; +// (global as any).Headers = Headers; (global as any).FormData = require("form-data"); (global as any).atob = require("atob"); (global as any).btoa = require("btoa"); -(global as any).Blob = Blob; - /** * In FakeIndexedDB, symbols are exposed using ``FDB`` prefixes in names. * This piece of code will register them with the same names as native API, diff --git a/test/test_utils.ts b/test/test_utils.ts index a79a42418..a25c71f56 100644 --- a/test/test_utils.ts +++ b/test/test_utils.ts @@ -1,7 +1,3 @@ -import sinon from "sinon"; - -const { expect } = intern.getPlugin("chai"); - export function updateTitleWithDelay(record: any, str: string, delay: number) { return new Promise((resolve) => { setTimeout(() => { @@ -23,13 +19,13 @@ export async function expectAsyncError( error = err; } - expect(error!).not.to.be.undefined; - expect(error!).to.be.instanceOf(baseClass); + expect(error!).toBeDefined(); + expect(error!).toBeInstanceOf(baseClass); if (message) { if (typeof message === "string") { - expect(error!).to.have.property("message").equal(message); + expect(error!).toHaveProperty("message", message); } else { - expect(error!).to.have.property("message").match(message); + expect(error!).toHaveProperty("message", expect.stringMatching(message)); } } @@ -67,16 +63,6 @@ export function delayedPromise(ms: number) { }); } -export type Stub any> = sinon.SinonStub< - Parameters, - ReturnType ->; - -export type Spy any> = sinon.SinonSpy< - Parameters, - ReturnType ->; - export function btoa(str: string): string { if (globalThis.btoa) { return globalThis.btoa(str); diff --git a/test/tsconfig.json b/test/tsconfig.json index 5bd9b4554..4413c56f0 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -2,7 +2,7 @@ "extends": "../tsconfig.json", "compilerOptions": { "module": "commonjs", - "types": ["intern"], + "types": ["vitest/globals"], "inlineSourceMap": true, "strictNullChecks": false }, diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 000000000..fa707cad1 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,37 @@ +/// + +import { defineConfig } from 'vite' +import path from 'path' + +/** + * used to set the relative path from which we expect to serve the admin's + * static bundle on the server: + * GH Pages: /kinto-admin/ + * Kinto plugin: /v1/admin/ + */ +const ASSET_PATH = process.env.ASSET_PATH || "/"; + +// https://vitejs.dev/config/ +export default defineConfig({ + server: { + port: 3000, + }, + envPrefix: 'KINTO_JS', + // plugins: [react()], + base: ASSET_PATH, + define: {}, + resolve: { + alias: { + '@src': path.resolve(__dirname, './src'), + '@test': path.resolve(__dirname, './test') + } + }, + build: { + outDir: "build" + }, + test: { + globals: true, + include: ["**/*_{test,spec}.?(c|m)[jt]s?(x)"], + setupFiles: ["test/setup-globals.ts", "test/server.ts"] + } +}) From 9ffcc68a157c6ca62680d25723de0db327a60f55 Mon Sep 17 00:00:00 2001 From: Alex Cottner Date: Thu, 15 Aug 2024 09:16:13 +0100 Subject: [PATCH 2/6] Converting index_test to vitest --- test/index_test.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/test/index_test.ts b/test/index_test.ts index a50722043..f35cf5103 100644 --- a/test/index_test.ts +++ b/test/index_test.ts @@ -8,11 +8,6 @@ import BaseAdapter from "../src/adapters/base"; import IDB from "../src/adapters/IDB"; import Kinto from "../src"; -const { expect } = intern.getPlugin("chai"); -intern.getPlugin("chai").should(); -const { describe, it, beforeEach, afterEach } = - intern.getPlugin("interface.bdd"); - const TEST_BUCKET_NAME = "kinto-test"; const TEST_COLLECTION_NAME = "kinto-test"; @@ -26,14 +21,9 @@ describe("Kinto", () => { } beforeEach(() => { - sandbox = sinon.createSandbox(); return testCollection().clear(); }); - afterEach(() => { - sandbox.restore(); - }); - describe("static properties", () => { describe("get adapters()", () => { it("should provide an adapters static getter", () => { From 47c4a67364c57f168021f8819ae06cfa9e79f161 Mon Sep 17 00:00:00 2001 From: Alex Cottner Date: Thu, 15 Aug 2024 13:12:20 +0100 Subject: [PATCH 3/6] Migrating kintobase_test to vitest --- test/kintobase_test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/kintobase_test.ts b/test/kintobase_test.ts index dd3aa5ab0..21672be11 100644 --- a/test/kintobase_test.ts +++ b/test/kintobase_test.ts @@ -3,8 +3,6 @@ import { EventEmitter } from "events"; import KintoBase from "../src/KintoBase"; import BaseAdapter from "../src/adapters/base"; -const { expect } = intern.getPlugin("chai"); -const { describe, it, beforeEach } = intern.getPlugin("interface.bdd"); /** @test {KintoBase} */ describe("KintoBase", () => { From c7b7d7057f8840765d091f08f5e1da88aba38d53 Mon Sep 17 00:00:00 2001 From: Alex Cottner Date: Fri, 16 Aug 2024 08:13:52 +0100 Subject: [PATCH 4/6] Moving utils_test to vitest --- test/utils_test.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/test/utils_test.ts b/test/utils_test.ts index 28629cbbe..cfaf52d6a 100644 --- a/test/utils_test.ts +++ b/test/utils_test.ts @@ -20,10 +20,6 @@ import { } from "../src/utils"; import { expectAsyncError } from "./test_utils"; -const { expect } = intern.getPlugin("chai"); -intern.getPlugin("chai").should(); -const { describe, it } = intern.getPlugin("interface.bdd"); - describe("Utils", () => { /** @test {sortObjects} */ describe("#sortObjects", () => { @@ -119,22 +115,22 @@ describe("Utils", () => { describe("#waterfall", () => { it("should resolve with init value when list is empty", async () => { const result = await waterfall([], 42); - result.should.equal(42); + expect(result).toBe(42); }); it("should resolve executing a single sync function", async () => { const result = await waterfall([(x) => x + 1], 42); - result.should.equal(43); + expect(result).toBe(43); }); it("should resolve executing multiple sync functions", async () => { const result = await waterfall([(x) => x + 1, (x) => x * 2], 42); - result.should.equal(86); + expect(result).toBe(86); }); it("should resolve using a single promise returning function", async () => { const result = await waterfall([() => Promise.resolve(42)]); - result.should.equal(42); + expect(result).toBe(42); }); it("should resolve using multiple promise returning functions", async () => { @@ -142,7 +138,7 @@ describe("Utils", () => { [(x) => Promise.resolve(x + 1), (x) => Promise.resolve(x * 2)], 42 ); - result.should.equal(86); + expect(result).toBe(86); }); }); @@ -397,7 +393,7 @@ describe("HTTP Utils", () => { throw new Error("Should be rejected"); }, (err) => { - err.should.not.be.undefined; + expect(err).toBeDefined(); } ); }); From 5c31a0f2f565c219cf97095420395cc36c8707c6 Mon Sep 17 00:00:00 2001 From: Alex Cottner Date: Fri, 16 Aug 2024 08:15:23 +0100 Subject: [PATCH 5/6] Moving adapters/base_test to vitest --- .gitignore | 1 + test/adapters/base_test.ts | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 90d24f6e3..639654e76 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ /demo/kinto* .DS_Store .nyc_output +.vscode/ diff --git a/test/adapters/base_test.ts b/test/adapters/base_test.ts index bba507445..fbe4730f3 100644 --- a/test/adapters/base_test.ts +++ b/test/adapters/base_test.ts @@ -1,9 +1,5 @@ import BaseAdapter from "../../src/adapters/base"; -const { expect } = intern.getPlugin("chai"); -intern.getPlugin("chai").should(); -const { describe, it, beforeEach } = intern.getPlugin("interface.bdd"); - describe("adapters.BaseAdapter", () => { let adapter: BaseAdapter; beforeEach(() => { From 14546c897e2e5ef5420fe6a0a330653076079ff3 Mon Sep 17 00:00:00 2001 From: Alex Cottner Date: Fri, 16 Aug 2024 08:52:56 +0100 Subject: [PATCH 6/6] Mograting adapters/IDB_test to vitest --- test/adapters/IDB_test.ts | 142 ++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 73 deletions(-) diff --git a/test/adapters/IDB_test.ts b/test/adapters/IDB_test.ts index 775b7e3de..d1c7aaf2c 100644 --- a/test/adapters/IDB_test.ts +++ b/test/adapters/IDB_test.ts @@ -1,28 +1,23 @@ /* eslint dot-notation: off */ -import sinon from "sinon"; - import IDB, { open, execute } from "../../src/adapters/IDB"; import { v4 as uuid4 } from "uuid"; import { StorageProxy } from "../../src/adapters/base"; import { KintoIdObject } from "../../src/http"; import { expectAsyncError } from "../test_utils"; - -const { expect } = intern.getPlugin("chai"); -intern.getPlugin("chai").should(); -const { describe, it, before, beforeEach, after, afterEach } = - intern.getPlugin("interface.bdd"); +import { Mock } from "vitest"; /** @test {IDB} */ describe("adapter.IDB", () => { - let sandbox: sinon.SinonSandbox, db: IDB; + let db = null; beforeEach(() => { - sandbox = sinon.createSandbox(); db = new IDB("test/foo"); return db.clear(); }); - afterEach(() => sandbox.restore()); + afterEach(() => { + vitest.restoreAllMocks(); + }) /** @test {IDB#open} */ describe("#open", () => { @@ -32,7 +27,7 @@ describe("adapter.IDB", () => { it("should reject on open request error", async () => { const fakeOpenRequest = {} as IDBOpenDBRequest; - sandbox.stub(indexedDB, "open").returns(fakeOpenRequest); + vitest.spyOn(indexedDB, "open").mockReturnValue(fakeOpenRequest); const db = new IDB("another/db"); const prom = db.open(); @@ -68,7 +63,7 @@ describe("adapter.IDB", () => { }); await db.clear(); const list = await db.list(); - list.should.have.lengthOf(0); + expect(list).toHaveLength(0); }); it("should isolate records by collection", async () => { @@ -95,7 +90,7 @@ describe("adapter.IDB", () => { }); it("should reject on transaction error", async () => { - sandbox.stub(db, "prepare").callsFake(async (name, callback, options) => { + vitest.spyOn(db, "prepare").mockImplementation(async (name, callback, options) => { callback({ index() { return { @@ -119,18 +114,18 @@ describe("adapter.IDB", () => { describe("No preloading", () => { it("should open a connection to the db", async () => { - const open = sandbox - .stub(db, "open") - .returns(Promise.resolve({} as IDB)); + const open = vitest + .spyOn(db, "open") + .mockReturnValue(Promise.resolve({} as IDB)); await db.execute(() => {}); - return sinon.assert.calledOnce(open); + expect(open).toHaveBeenCalledOnce(); }); it("should execute the specified callback", async () => { - const callback = sandbox.spy(); + const callback = vitest.fn(); await db.execute(callback); - return sinon.assert.called(callback); + expect(callback).toHaveBeenCalled(); }); it("should fail if the callback returns a promise", async () => { @@ -154,20 +149,20 @@ describe("adapter.IDB", () => { }); it("should provide a transaction parameter", async () => { - const callback = sandbox.spy(); + const callback = vitest.fn(); await db.execute(callback); - const handler = callback.getCall(0).args[0]; - expect(handler).to.have.property("get").to.be.a("function"); - expect(handler).to.have.property("create").to.be.a("function"); - expect(handler).to.have.property("update").to.be.a("function"); - expect(handler).to.have.property("delete").to.be.a("function"); + const handler = callback.mock.lastCall[0]; + expectTypeOf(handler.get).toBeFunction(); + expectTypeOf(handler.create).toBeFunction(); + expectTypeOf(handler.update).toBeFunction(); + expectTypeOf(handler.delete).toBeFunction(); }); it("should create a record", async () => { const data = { id: "1", foo: "bar" }; await db.execute((t) => t.create(data)); const list = await db.list(); - list.should.deep.equal([data]); + expect(list).toStrictEqual([data]); }); it("should update a record", async () => { @@ -177,7 +172,7 @@ describe("adapter.IDB", () => { t.update({ ...data, foo: "baz" }); }); const res = await db.get(data.id); - res!.foo.should.equal("baz"); + expect(res).toHaveProperty("foo", "baz"); }); it("should delete a record", async () => { @@ -187,13 +182,13 @@ describe("adapter.IDB", () => { transaction.delete(data.id); }); const id = await db.get(data.id); - expect(id).to.equal(undefined); + expect(id).toBeUndefined(); }); it("should reject on store method error", async () => { - sandbox - .stub(db, "prepare") - .callsFake(async (name, callback, options) => { + vitest + .spyOn(db, "prepare") + .mockImplementation(async (name, callback, options) => { const abort = (e: Error) => { throw e; }; @@ -219,9 +214,9 @@ describe("adapter.IDB", () => { }); it("should reject on transaction error", async () => { - sandbox - .stub(db, "prepare") - .callsFake(async (name, callback, options) => { + vitest + .spyOn(db, "prepare") + .mockImplementation(async (name, callback, options) => { return callback({ openCursor() { throw new Error("transaction error"); @@ -272,16 +267,16 @@ describe("adapter.IDB", () => { it("should retrieve a record from its id", async () => { const res = await db.get("1"); - res!.foo.should.equal("bar"); + expect(res).toHaveProperty("foo", "bar"); }); it("should return undefined when record is not found", async () => { const res = await db.get("999"); - expect(res).to.equal(undefined); + expect(res).toBeUndefined(); }); it("should reject on transaction error", async () => { - sandbox.stub(db, "prepare").callsFake(async (name, callback, options) => { + vitest.spyOn(db, "prepare").mockImplementation(async (name, callback, options) => { return callback({ get() { throw new Error("transaction error"); @@ -309,11 +304,11 @@ describe("adapter.IDB", () => { it("should retrieve the list of records", async () => { const list = await db.list(); - list.should.have.lengthOf(10); + expect(list).toHaveLength(10); }); it("should prefix error encountered", async () => { - sandbox.stub(db, "open").returns(Promise.reject("error")); + vitest.spyOn(db, "open").mockReturnValue(Promise.reject("error")); await expectAsyncError( () => db.list(), /^IndexedDB list()/, @@ -322,7 +317,7 @@ describe("adapter.IDB", () => { }); it("should reject on transaction error", async () => { - sandbox.stub(db, "prepare").callsFake(async (name, callback, options) => { + vitest.spyOn(db, "prepare").mockImplementation(async (name, callback, options) => { return callback({ index() { return { @@ -355,8 +350,8 @@ describe("adapter.IDB", () => { await db1.close(); await db2.close(); - expect(await db1.list()).to.have.length(1); - expect(await db2.list()).to.have.length(2); + expect(await db1.list()).toHaveLength(1); + expect(await db2.list()).toHaveLength(2); }); describe("Filters", () => { @@ -364,14 +359,14 @@ describe("adapter.IDB", () => { describe("single value", () => { it("should filter the list on a single pre-indexed column", async () => { const list = await db.list({ filters: { name: "#4" } }); - list.should.deep.equal([{ id: "4", name: "#4" }]); + expect(list).toStrictEqual([{ id: "4", name: "#4" }]); }); }); describe("multiple values", () => { it("should filter the list on a single pre-indexed column", async () => { const list = await db.list({ filters: { name: ["#4", "#5"] } }); - list.should.deep.equal([ + expect(list).toStrictEqual([ { id: "4", name: "#4" }, { id: "5", name: "#5" }, ]); @@ -379,19 +374,19 @@ describe("adapter.IDB", () => { it("should handle non-existent keys", async () => { const list = await db.list({ filters: { name: ["#4", "qux"] } }); - list.should.deep.equal([{ id: "4", name: "#4" }]); + expect(list).toStrictEqual([{ id: "4", name: "#4" }]); }); it("should handle empty lists", async () => { const list = await db.list({ filters: { name: [] } }); - list.should.deep.equal([]); + expect(list).toStrictEqual([]); }); }); describe("combined with indexed fields", () => { it("should filter list on both indexed and non-indexed columns", async () => { const list = await db.list({ filters: { name: "#4", id: "4" } }); - list.should.deep.equal([{ id: "4", name: "#4" }]); + expect(list).toStrictEqual([{ id: "4", name: "#4" }]); }); }); }); @@ -400,14 +395,14 @@ describe("adapter.IDB", () => { describe("single value", () => { it("should filter the list on a single pre-indexed column", async () => { const list = await db.list({ filters: { id: "4" } }); - list.should.deep.equal([{ id: "4", name: "#4" }]); + expect(list).toStrictEqual([{ id: "4", name: "#4" }]); }); }); describe("multiple values", () => { it("should filter the list on a single pre-indexed column", async () => { const list = await db.list({ filters: { id: ["5", "4"] } }); - list.should.deep.equal([ + expect(list).toStrictEqual([ { id: "4", name: "#4" }, { id: "5", name: "#5" }, ]); @@ -417,17 +412,17 @@ describe("adapter.IDB", () => { const list = await db.list({ filters: { id: ["5", "4"], name: "#4" }, }); - list.should.deep.equal([{ id: "4", name: "#4" }]); + expect(list).toStrictEqual([{ id: "4", name: "#4" }]); }); it("should handle non-existent keys", async () => { const list = await db.list({ filters: { id: ["4", "9999"] } }); - list.should.deep.equal([{ id: "4", name: "#4" }]); + expect(list).toStrictEqual([{ id: "4", name: "#4" }]); }); it("should handle empty lists", async () => { const list = await db.list({ filters: { id: [] } }); - list.should.deep.equal([]); + expect(list).toStrictEqual([]); }); }); }); @@ -440,18 +435,19 @@ describe("adapter.IDB", () => { */ describe("Deprecated #loadDump", () => { it("should call importBulk", async () => { - const importBulkStub = sandbox - .stub(db, "importBulk") - .returns(Promise.resolve([])); + + const importBulkStub = vitest + .spyOn(db, "importBulk") + .mockReturnValue(Promise.resolve([])); await db.loadDump([{ id: "1", last_modified: 0, foo: "bar" }]); - return sinon.assert.calledOnce(importBulkStub); + expect(importBulkStub).toHaveBeenCalledOnce(); }); }); /** @test {IDB#getLastModified} */ describe("#getLastModified", () => { it("should reject with any encountered transaction error", async () => { - sandbox.stub(db, "prepare").callsFake(async (name, callback, options) => { + vitest.spyOn(db, "prepare").mockImplementation(async (name, callback, options) => { return callback({ get() { throw new Error("transaction error"); @@ -467,24 +463,24 @@ describe("adapter.IDB", () => { describe("#saveLastModified", () => { it("should resolve with lastModified value", async () => { const res = await db.saveLastModified(42); - res.should.equal(42); + expect(res).toBe(42); }); it("should save a lastModified value", async () => { await db.saveLastModified(42); const res = await db.getLastModified(); - res.should.equal(42); + expect(res).toBe(42); }); it("should allow updating previous value", async () => { await db.saveLastModified(42); await db.saveLastModified(43); const res = await db.getLastModified(); - res.should.equal(43); + expect(res).toBe(43); }); it("should reject on transaction error", async () => { - sandbox.stub(db, "prepare").callsFake(async (name, callback, options) => { + vitest.spyOn(db, "prepare").mockImplementation(async (name, callback, options) => { return callback({ delete() { throw new Error("transaction error"); @@ -506,7 +502,7 @@ describe("adapter.IDB", () => { { id: "1", foo: "bar", last_modified: 0 }, { id: "2", foo: "baz", last_modified: 1 }, ]); - res.should.have.lengthOf(2); + expect(res).toHaveLength(2); }); it("should override existing records.", async () => { @@ -519,7 +515,7 @@ describe("adapter.IDB", () => { { id: "3", foo: "bab", last_modified: 2 }, ]); const list = await db.list(); - list.should.deep.equal([ + expect(list).toStrictEqual([ { id: "1", foo: "baz", last_modified: 2 }, { id: "2", foo: "baz", last_modified: 1 }, { id: "3", foo: "bab", last_modified: 2 }, @@ -532,7 +528,7 @@ describe("adapter.IDB", () => { { id: uuid4(), title: "bar", last_modified: 1458796542 }, ]); const lastModified = await db.getLastModified(); - lastModified.should.equal(1458796542); + expect(lastModified).toBe(1458796542); }); it("should preserve older collection lastModified value.", async () => { @@ -542,11 +538,11 @@ describe("adapter.IDB", () => { { id: uuid4(), title: "bar", last_modified: 1458796542 }, ]); const lastModified = await db.getLastModified(); - lastModified.should.equal(1458796543); + expect(lastModified).toBe(1458796543); }); it("should reject on transaction error", async () => { - sandbox.stub(db, "prepare").callsFake(async (name, callback, options) => { + vitest.spyOn(db, "prepare").mockImplementation(async (name, callback, options) => { return callback({ put() { throw new Error("transaction error"); @@ -649,7 +645,7 @@ describe("adapter.IDB", () => { const cid = "main/tippytop"; - before(async () => { + beforeAll(async () => { await createOldDB(cid); await createOldDB("another/not-migrated"); @@ -658,24 +654,24 @@ describe("adapter.IDB", () => { }); }); - after(() => { - return idb.close(); + afterAll(() => { + idb.close(); }); it("should migrate records", async () => { const list = await idb.list(); - list.should.deep.equal([{ id: "1" }, { id: "2" }]); + expect(list).toStrictEqual([{ id: "1" }, { id: "2" }]); }); it("should migrate timestamps", async () => { const lastModified = await idb.getLastModified(); - lastModified.should.equal(43); + expect(lastModified).toBe(43); }); it("should create the collections store", async () => { const metadata = { id: "abc" }; await idb.saveMetadata(metadata); - (await idb.getMetadata()).should.deep.equal(metadata); + expect(await idb.getMetadata()).toStrictEqual(metadata); }); it("should not fail if already migrated", async () => { @@ -706,7 +702,7 @@ describe("adapter.IDB", () => { it("should not migrate if option is set to false", async () => { const idb = new IDB("another/not-migrated", { migrateOldData: false }); const list = await idb.list(); - list.should.deep.equal([]); + expect(list).toStrictEqual([]); }); it("should not fail if old database is broken or incomplete", async () => {