From 00bedb060dc09328860c0033368147a47eec8ab4 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Mon, 14 Aug 2023 10:15:43 -0700 Subject: [PATCH] feat(test): moving unit tests over to vitest (#691) * feat: moving unit tests over to vitest * fix: cleaning up eslint configs * Update packages/httpsnippet-client-api/package.json Co-authored-by: Kanad Gupta <8854718+kanadgupta@users.noreply.github.com> * Update packages/api/test/helpers/vitest.matchers.ts Co-authored-by: Kanad Gupta <8854718+kanadgupta@users.noreply.github.com> * Update packages/api/package.json Co-authored-by: Kanad Gupta <8854718+kanadgupta@users.noreply.github.com> * Update packages/api/.npmignore Co-authored-by: Kanad Gupta <8854718+kanadgupta@users.noreply.github.com> * fix: pr feedback --------- Co-authored-by: Kanad Gupta <8854718+kanadgupta@users.noreply.github.com> --- package-lock.json | 1774 ++++++++++++++--- package.json | 5 +- packages/api/.eslintrc | 18 +- packages/api/.npmignore | 2 +- packages/api/jest.config.js | 21 - packages/api/package.json | 12 +- packages/api/test/.eslintrc | 4 +- packages/api/test/auth.test.ts | 19 +- packages/api/test/cache-custom.test.ts | 1 + packages/api/test/cache-tmp.test.ts | 8 +- packages/api/test/cache.test.ts | 1 + .../cli/codegen/languages/typescript.test.ts | 4 +- .../languages/typescript/smoketest.test.ts | 2 + .../languages/typescript/utils.test.ts | 2 + packages/api/test/cli/storage.test.ts | 1 + packages/api/test/config.test.ts | 1 + .../test/core/getJSONSchemaDefaults.test.ts | 1 + packages/api/test/core/index.test.ts | 1 + packages/api/test/core/parseResponse.test.ts | 1 + packages/api/test/core/prepareAuth.test.ts | 1 + packages/api/test/core/prepareParams.test.ts | 1 + packages/api/test/dist.test.ts | 1 + packages/api/test/fetcher.test.ts | 1 + packages/api/test/global.d.ts | 4 +- .../{jest.matchers.ts => vitest.matchers.ts} | 33 +- packages/api/test/index.test.ts | 5 +- packages/api/test/integration.test.ts | 1 + packages/api/test/server.test.ts | 1 + packages/api/vitest-smoketest.config.ts | 10 + packages/api/vitest.config.ts | 17 + packages/httpsnippet-client-api/.npmignore | 2 +- .../httpsnippet-client-api/jest.config.js | 22 - packages/httpsnippet-client-api/package.json | 9 +- .../httpsnippet-client-api/test/.eslintrc | 5 +- .../httpsnippet-client-api/test/index.test.ts | 190 +- .../httpsnippet-client-api/vitest.config.ts | 8 + 36 files changed, 1658 insertions(+), 531 deletions(-) delete mode 100644 packages/api/jest.config.js rename packages/api/test/helpers/{jest.matchers.ts => vitest.matchers.ts} (74%) create mode 100644 packages/api/vitest-smoketest.config.ts create mode 100644 packages/api/vitest.config.ts delete mode 100644 packages/httpsnippet-client-api/jest.config.js create mode 100644 packages/httpsnippet-client-api/vitest.config.ts diff --git a/package-lock.json b/package-lock.json index 3789574f..fb5907ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "devDependencies": { "@commitlint/cli": "^17.6.6", "@commitlint/config-conventional": "^17.6.6", - "@readme/eslint-config": "^11.0.1", + "@readme/eslint-config": "^12.0.0", "alex": "^11.0.0", "eslint": "^8.44.0", "husky": "^8.0.3", @@ -31,12 +31,13 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -250,6 +251,8 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -412,6 +415,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -424,6 +429,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -436,6 +443,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -448,6 +457,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -460,6 +471,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -472,6 +485,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -487,6 +502,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -499,6 +516,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -511,6 +530,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -523,6 +544,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -535,6 +558,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -547,6 +572,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -559,6 +586,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -574,6 +603,8 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -954,18 +985,378 @@ "node": ">=12" } }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.39.4", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", - "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "comment-parser": "1.3.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" - }, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">=16" + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1075,6 +1466,8 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -1091,6 +1484,8 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -1100,6 +1495,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1113,6 +1510,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1126,6 +1525,8 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -1138,6 +1539,8 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -1153,6 +1556,8 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -1174,6 +1579,8 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "@types/node": "*", @@ -1191,6 +1598,8 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/console": "^29.6.1", "@jest/reporters": "^29.6.1", @@ -1238,6 +1647,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -1250,6 +1661,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", @@ -1263,13 +1676,17 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@jest/environment": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/fake-timers": "^29.6.1", "@jest/types": "^29.6.1", @@ -1285,6 +1702,8 @@ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "expect": "^29.6.1", "jest-snapshot": "^29.6.1" @@ -1298,6 +1717,8 @@ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "jest-get-type": "^29.4.3" }, @@ -1310,6 +1731,8 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", @@ -1327,6 +1750,8 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/environment": "^29.6.1", "@jest/expect": "^29.6.1", @@ -1342,6 +1767,8 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.6.1", @@ -1385,6 +1812,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -1407,6 +1836,8 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -1421,6 +1852,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -1431,6 +1864,8 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/console": "^29.6.1", "@jest/types": "^29.6.1", @@ -1446,6 +1881,8 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", @@ -1461,6 +1898,8 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.1", @@ -1487,6 +1926,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -1496,13 +1937,17 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@jest/transform/node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -1516,6 +1961,8 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1528,6 +1975,20 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "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/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", @@ -1537,6 +1998,15 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", @@ -1752,9 +2222,9 @@ } }, "node_modules/@readme/eslint-config": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@readme/eslint-config/-/eslint-config-11.0.1.tgz", - "integrity": "sha512-YSzyYZgfSJqR9SpFmtvpYhI919S0p8Svwh1wf7vNWQ24Z8CI5sGhcYVjJ9iCJzsRLAM8Q/ziWfT9KUsxBNyTFQ==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@readme/eslint-config/-/eslint-config-12.0.0.tgz", + "integrity": "sha512-3YjmU3I6mR/qHwDYJIGiT06WZpVV67J3oMLUPv2mJ9zv09Lhbe0FHvLHZljcRu2EqsVTiWMpF1DfWntleXB9bQ==", "dev": true, "dependencies": { "@typescript-eslint/eslint-plugin": "^6.2.1", @@ -1762,16 +2232,12 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.9.0", "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-chai-expect": "^3.0.0", - "eslint-plugin-chai-friendly": "^0.7.2", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-import": "^2.28.0", "eslint-plugin-jest": "^27.2.3", "eslint-plugin-jest-dom": "^5.0.1", "eslint-plugin-jest-formatting": "^3.0.0", - "eslint-plugin-jsdoc": "^46.4.5", "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-mocha": "10.1.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-react": "^7.33.1", @@ -1779,7 +2245,9 @@ "eslint-plugin-testing-library": "^5.11.0", "eslint-plugin-typescript-sort-keys": "^2.3.0", "eslint-plugin-unicorn": "^48.0.1", - "eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0" + "eslint-plugin-vitest": "^0.2.8", + "eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0", + "lodash.merge": "^4.6.2" }, "engines": { "node": ">=14.18" @@ -1940,6 +2408,8 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -1949,6 +2419,8 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@sinonjs/commons": "^2.0.0" } @@ -2071,6 +2543,8 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -2084,6 +2558,8 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -2093,6 +2569,8 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -2103,6 +2581,8 @@ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -2113,6 +2593,21 @@ "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", "dev": true }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/concat-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-2.0.0.tgz", @@ -2163,6 +2658,8 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -2204,6 +2701,8 @@ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -2213,52 +2712,12 @@ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/jest": { - "version": "29.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", - "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", - "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, "node_modules/@types/js-yaml": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", @@ -2410,7 +2869,9 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@types/stringify-object": { "version": "4.0.2", @@ -2441,6 +2902,8 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/yargs-parser": "*" } @@ -2449,7 +2912,9 @@ "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.2.1", @@ -2760,6 +3225,190 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vitest/coverage-v8": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.1.tgz", + "integrity": "sha512-lRgUwjTMr8idXEbUPSNH4jjRZJXJCVY3BqUa+LDXyJVe3pldxYMn/r0HMqatKUGTp0Kyf1j5LfFoY6kRqRp7jw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.5", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.32.0 <1" + } + }, + "node_modules/@vitest/expect": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.1.tgz", + "integrity": "sha512-q2CD8+XIsQ+tHwypnoCk8Mnv5e6afLFvinVGCq3/BOT4kQdVQmY6rRfyKkwcg635lbliLPqbunXZr+L1ssUWiQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.34.1", + "@vitest/utils": "0.34.1", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.1.tgz", + "integrity": "sha512-YfQMpYzDsYB7yqgmlxZ06NI4LurHWfrH7Wy3Pvf/z/vwUSgq1zLAb1lWcItCzQG+NVox+VvzlKQrYEXb47645g==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.34.1", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.1.tgz", + "integrity": "sha512-0O9LfLU0114OqdF8lENlrLsnn024Tb1CsS9UwG0YMWY2oGTQfPtkW+B/7ieyv0X9R2Oijhi3caB1xgGgEgclSQ==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/snapshot/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/snapshot/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@vitest/spy": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.1.tgz", + "integrity": "sha512-UT4WcI3EAPUNO8n6y9QoEqynGGEPmmRxC+cLzneFFXpmacivjHZsNbiKD88KUScv5DCHVDgdBsLD7O7s1enFcQ==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.1.tgz", + "integrity": "sha512-/ql9dsFi4iuEbiNcjNHQWXBum7aL8pyhxvfnD9gNtbjR9fUKAjxhj4AA3yfLXg6gJpMGGecvtF8Au2G9y3q47Q==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -3247,6 +3896,8 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -3262,6 +3913,8 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -3296,6 +3949,8 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3308,15 +3963,6 @@ "resolved": "packages/api", "link": true }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -3491,6 +4137,15 @@ "node": ">=0.10.0" } }, + "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/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -3538,6 +4193,8 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", @@ -3559,6 +4216,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -3575,6 +4234,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -3590,6 +4251,8 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -3613,6 +4276,8 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.5.0", "babel-preset-current-node-syntax": "^1.0.0" @@ -3864,23 +4529,13 @@ "url": "https://opencollective.com/browserslist" } }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -3962,6 +4617,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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/cacheable-request": { "version": "10.2.3", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.3.tgz", @@ -4079,6 +4743,24 @@ "url": "https://github.com/sponsors/wooorm" } }, + "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": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4099,6 +4781,8 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -4143,6 +4827,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "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/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -4162,7 +4855,9 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/clean-regexp": { "version": "1.0.0", @@ -4242,6 +4937,8 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -4264,7 +4961,9 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/color-convert": { "version": "2.0.1", @@ -4312,15 +5011,6 @@ "node": ">= 12" } }, - "node_modules/comment-parser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", - "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", - "dev": true, - "engines": { - "node": ">= 12.0.0" - } - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -4727,7 +5417,21 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "dev": true, + "optional": true, + "peer": true + }, + "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-equal": { "version": "2.2.2", @@ -4778,6 +5482,8 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -4994,6 +5700,8 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -5081,6 +5789,8 @@ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -5287,6 +5997,43 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -5533,30 +6280,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-chai-expect": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-3.0.0.tgz", - "integrity": "sha512-NS0YBcToJl+BRKBSMCwRs/oHJIX67fG5Gvb4tGked+9Wnd1/PzKijd82B2QVKcSSOwRe+pp4RAJ2AULeck4eQw==", - "dev": true, - "engines": { - "node": "10.* || 12.* || >= 14.*" - }, - "peerDependencies": { - "eslint": ">=2.0.0 <= 8.x" - } - }, - "node_modules/eslint-plugin-chai-friendly": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.7.2.tgz", - "integrity": "sha512-LOIfGx5sZZ5FwM1shr2GlYAWV9Omdi+1/3byuVagvQNoGUuU0iHhp7AfjA1uR+4dJ4Isfb4+FwBJgQajIw9iAg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "eslint": ">=3.0.0" - } - }, "node_modules/eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", @@ -5863,29 +6586,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-jsdoc": { - "version": "46.4.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.5.tgz", - "integrity": "sha512-HjTuxqDYplAQFu29F3MHFCDDBgeqOxPXI6TyBhL0u2rr4XntJ0z3C9PmJvpjFscKdHwkZDN/0l1QCG0QwyRi4g==", - "dev": true, - "dependencies": { - "@es-joy/jsdoccomment": "~0.39.4", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.3.1", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.4", - "spdx-expression-parse": "^3.0.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", @@ -5925,22 +6625,6 @@ "semver": "bin/semver.js" } }, - "node_modules/eslint-plugin-mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz", - "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==", - "dev": true, - "dependencies": { - "eslint-utils": "^3.0.0", - "rambda": "^7.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, "node_modules/eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", @@ -6281,6 +6965,27 @@ "node": ">=6" } }, + "node_modules/eslint-plugin-vitest": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.2.8.tgz", + "integrity": "sha512-q8s4tStyKtn3gXf+8nf1ZYTHhoCXKdnozZzp6u8b4ni5v68Y4vxhNh4Z8njUfNjEY8HoPBB77MazHMR23IPb+g==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^6.2.0" + }, + "engines": { + "node": "14.x || >= 16" + }, + "peerDependencies": { + "eslint": ">=8.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, "node_modules/eslint-plugin-you-dont-need-lodash-underscore": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/eslint-plugin-you-dont-need-lodash-underscore/-/eslint-plugin-you-dont-need-lodash-underscore-6.12.0.tgz", @@ -6315,33 +7020,6 @@ "node": ">=4.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", @@ -6392,6 +7070,8 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "optional": true, + "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6526,6 +7206,8 @@ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -6535,6 +7217,8 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/expect-utils": "^29.6.1", "@types/node": "*", @@ -6645,6 +7329,8 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "bser": "2.1.1" } @@ -6924,6 +7610,15 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", @@ -6948,6 +7643,8 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8.0.0" } @@ -7674,6 +8371,8 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -7980,6 +8679,8 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -8399,6 +9100,8 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -8415,22 +9118,39 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "optional": true, + "peer": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-lib-source-maps": { @@ -8448,9 +9168,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -8465,6 +9185,8 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/core": "^29.6.1", "@jest/types": "^29.6.1", @@ -8491,6 +9213,8 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "execa": "^5.0.0", "p-limit": "^3.1.0" @@ -8504,6 +9228,8 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/environment": "^29.6.1", "@jest/expect": "^29.6.1", @@ -8535,6 +9261,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -8547,6 +9275,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", @@ -8560,13 +9290,17 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/jest-cli": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/core": "^29.6.1", "@jest/test-result": "^29.6.1", @@ -8601,6 +9335,8 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.6.1", @@ -8646,6 +9382,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -8658,6 +9396,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", @@ -8671,13 +9411,17 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/jest-diff": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", @@ -8693,6 +9437,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -8705,6 +9451,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", @@ -8718,13 +9466,17 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/jest-docblock": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "detect-newline": "^3.0.0" }, @@ -8737,6 +9489,8 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "chalk": "^4.0.0", @@ -8753,6 +9507,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -8765,6 +9521,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", @@ -8778,13 +9536,17 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/jest-environment-node": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/environment": "^29.6.1", "@jest/fake-timers": "^29.6.1", @@ -8797,32 +9559,13 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-extended": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jest-extended/-/jest-extended-4.0.0.tgz", - "integrity": "sha512-GMhMFdrwhYPB0y+cmI/5esz+F/Xc0OIzKbnr8SaiZ74YcWamxf7sVT78YlA15+JIQMTlpHBEgcxheyRBdHFqPA==", - "dev": true, - "dependencies": { - "jest-diff": "^29.0.0", - "jest-get-type": "^29.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "jest": ">=27.2.5" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - } - } - }, "node_modules/jest-get-type": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -8832,6 +9575,8 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "@types/graceful-fs": "^4.1.3", @@ -8857,6 +9602,8 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "jest-get-type": "^29.4.3", "pretty-format": "^29.6.1" @@ -8870,6 +9617,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -8882,6 +9631,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", @@ -8895,13 +9646,17 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/jest-matcher-utils": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.6.1", @@ -8917,6 +9672,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -8929,6 +9686,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", @@ -8942,13 +9701,17 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/jest-message-util": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.1", @@ -8969,6 +9732,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -8981,6 +9746,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", @@ -8994,13 +9761,17 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/jest-mock": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "@types/node": "*", @@ -9015,6 +9786,8 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6" }, @@ -9032,6 +9805,8 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -9041,6 +9816,8 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -9061,6 +9838,8 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "jest-regex-util": "^29.4.3", "jest-snapshot": "^29.6.1" @@ -9074,6 +9853,8 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/console": "^29.6.1", "@jest/environment": "^29.6.1", @@ -9106,6 +9887,8 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/environment": "^29.6.1", "@jest/fake-timers": "^29.6.1", @@ -9139,6 +9922,8 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -9171,6 +9956,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -9183,6 +9970,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", @@ -9196,13 +9985,17 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/jest-util": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "@types/node": "*", @@ -9220,6 +10013,8 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.1", "camelcase": "^6.2.0", @@ -9237,6 +10032,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -9249,6 +10046,8 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -9261,6 +10060,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", @@ -9274,13 +10075,17 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/jest-watcher": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jest/test-result": "^29.6.1", "@jest/types": "^29.6.1", @@ -9300,6 +10105,8 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.6.1", @@ -9315,6 +10122,8 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -9341,15 +10150,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9635,6 +10435,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -9689,12 +10501,6 @@ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", "dev": true }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -9777,6 +10583,15 @@ "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/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -9818,6 +10633,24 @@ "lz-string": "bin/bin.js" } }, + "node_modules/magic-string": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.2.tgz", + "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -9851,6 +10684,8 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -11112,6 +11947,18 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -11135,6 +11982,24 @@ "mustache": "bin/mustache" } }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -11287,7 +12152,9 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/node-readfiles": { "version": "0.2.0", @@ -11338,6 +12205,8 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -11923,6 +12792,21 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", @@ -11953,6 +12837,8 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 6" } @@ -12016,6 +12902,17 @@ "node": ">=8" } }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -12025,6 +12922,34 @@ "node": ">=4" } }, + "node_modules/postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/postman-to-openapi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/postman-to-openapi/-/postman-to-openapi-3.0.1.tgz", @@ -12226,7 +13151,9 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "optional": true, + "peer": true }, "node_modules/q": { "version": "1.5.1", @@ -12308,12 +13235,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/rambda": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", - "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==", - "dev": true - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -12808,6 +13729,8 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "resolve-from": "^5.0.0" }, @@ -12850,6 +13773,8 @@ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -12963,6 +13888,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/run-applescript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", @@ -13159,6 +14100,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -13193,11 +14140,22 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -13449,7 +14407,9 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/ssri": { "version": "10.0.1", @@ -13467,6 +14427,8 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -13479,10 +14441,24 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -13537,6 +14513,8 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -13678,6 +14656,8 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -13714,6 +14694,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13840,6 +14832,30 @@ "next-tick": "1" } }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -13856,7 +14872,9 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/to-fast-properties": { "version": "2.0.0", @@ -13940,58 +14958,6 @@ "typescript": ">=4.2.0" } }, - "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/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/ts-morph": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-17.0.1.tgz", @@ -14240,6 +15206,12 @@ "node": ">=4.2.0" } }, + "node_modules/ufo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==", + "dev": true + }, "node_modules/uid2": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", @@ -14990,6 +15962,161 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.1.tgz", + "integrity": "sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.1.tgz", + "integrity": "sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.1", + "@vitest/runner": "0.34.1", + "@vitest/snapshot": "0.34.1", + "@vitest/spy": "0.34.1", + "@vitest/utils": "0.34.1", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.34.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, "node_modules/walk-up-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", @@ -15001,6 +16128,8 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -15117,6 +16246,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -15361,7 +16506,6 @@ "@readme/oas-examples": "^5.9.0", "@types/caseless": "^0.12.2", "@types/find-cache-dir": "^3.2.1", - "@types/jest": "^29.5.2", "@types/js-yaml": "^4.0.5", "@types/lodash.camelcase": "^4.3.7", "@types/lodash.deburr": "^4.1.7", @@ -15373,14 +16517,13 @@ "@types/semver": "^7.3.13", "@types/ssri": "^7.1.1", "@types/validate-npm-package-name": "^4.0.0", + "@vitest/coverage-v8": "^0.34.1", "fetch-mock": "^9.11.0", - "jest": "^29.6.1", - "jest-extended": "^4.0.0", "oas-normalize": "^8.3.2", - "ts-jest": "^29.1.1", "type-fest": "^3.5.4", "typescript": "^4.9.5", - "unique-temp-dir": "^1.0.0" + "unique-temp-dir": "^1.0.0", + "vitest": "^0.34.1" }, "engines": { "node": ">=16" @@ -15422,14 +16565,13 @@ "@readme/oas-examples": "^5.9.0", "@readme/openapi-parser": "^2.4.0", "@types/content-type": "^1.1.5", - "@types/jest": "^29.5.2", "@types/stringify-object": "^4.0.2", + "@vitest/coverage-v8": "^0.34.1", "api": "file:../api", "fetch-mock": "^9.11.0", "isomorphic-fetch": "^3.0.0", - "jest": "^29.6.1", - "ts-jest": "^29.1.1", - "typescript": "^4.9.5" + "typescript": "^4.9.5", + "vitest": "^0.34.1" }, "engines": { "node": ">=16" diff --git a/package.json b/package.json index a65afdfe..b01f7a80 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "build": "npx lerna run build --stream", "build-docs": "node bin/build-markdown.js", "clean": "npx lerna clean", - "lint": "eslint . --ext .js,.ts; npm run lint:types; npm run prettier", + "lint": "npm run lint:types; npm run lint:js; npm run prettier", + "lint:js": "eslint . --ext .js,.ts", "lint:types": "npm run lint:types --if-present --workspaces", "prepare": "husky install", "prettier": "prettier --check .", @@ -31,7 +32,7 @@ "devDependencies": { "@commitlint/cli": "^17.6.6", "@commitlint/config-conventional": "^17.6.6", - "@readme/eslint-config": "^11.0.1", + "@readme/eslint-config": "^12.0.0", "alex": "^11.0.0", "eslint": "^8.44.0", "husky": "^8.0.3", diff --git a/packages/api/.eslintrc b/packages/api/.eslintrc index 2c85b305..d92803ea 100644 --- a/packages/api/.eslintrc +++ b/packages/api/.eslintrc @@ -1,5 +1,4 @@ { - "extends": ["@readme/eslint-config/docs"], "globals": { "fetch": true, "Response": true @@ -8,22 +7,7 @@ "ecmaVersion": 2020 }, "rules": { - // @todo fix these eventually - "@typescript-eslint/no-explicit-any": "off", - - // We use `@fixme` in some spots and it's fine. - "jsdoc/check-tag-names": "off", - - // Though we aren't requiring JSDoc blocks to be present, if they are they should be properly - // formatted. - "jsdoc/require-jsdoc": "off", - "jsdoc/tag-lines": "off", - - // TypeScript types are better suited for these cases instead. - "jsdoc/require-param": "off", - "jsdoc/require-param-type": "off", - "jsdoc/require-returns": "off", - "jsdoc/require-returns-type": "off" + "@typescript-eslint/no-explicit-any": "off" // @todo fix these eventually }, "overrides": [ { diff --git a/packages/api/.npmignore b/packages/api/.npmignore index e90c62bb..1fee7bb4 100644 --- a/packages/api/.npmignore +++ b/packages/api/.npmignore @@ -4,5 +4,5 @@ test/ .eslint* .gitignore .prettier* -jest.config.js +vitest* example.js diff --git a/packages/api/jest.config.js b/packages/api/jest.config.js deleted file mode 100644 index 017f5a86..00000000 --- a/packages/api/jest.config.js +++ /dev/null @@ -1,21 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const path = require('path'); - -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - coveragePathIgnorePatterns: ['/dist', '/node_modules', '/test/__fixtures__/', '/test/datasets/', '/test/helpers/'], - modulePaths: [''], - roots: [''], - setupFilesAfterEnv: ['jest-extended/all', path.join(__dirname, 'test', 'helpers', 'jest.matchers.ts')], - testPathIgnorePatterns: ['/test/__fixtures__/', '/test/datasets/', '/test/helpers/'], - testRegex: '(/test/.*|(\\.|/)(test|spec))\\.(js?|ts?)$', - testTimeout: 20000, - transform: { - '^.+\\.[tj]s$': [ - 'ts-jest', - { - tsconfig: 'test/tsconfig.json', - }, - ], - }, -}; diff --git a/packages/api/package.json b/packages/api/package.json index 25e337ed..823b64c0 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -13,8 +13,8 @@ "lint:types": "tsc --noEmit", "prebuild": "rm -rf dist/; npm run version", "prepack": "npm run build", - "test": "jest --coverage $(find test -name '*.test.ts' -not -path '*/smoketest.test.ts')", - "test:smoke": "npx jest test/cli/codegen/languages/typescript/smoketest.test.ts", + "test": "vitest --coverage", + "test:smoke": "vitest --config=vitest-smoketest.config.ts ", "version": "node -p \"'// This file is automatically updated by the build script.\\nexport const PACKAGE_NAME = \\'' + require('./package.json').name + '\\';\\nexport const PACKAGE_VERSION = \\'' + require('./package.json').version + '\\';'\" > src/packageInfo.ts; git add src/packageInfo.ts" }, "repository": { @@ -75,7 +75,6 @@ "@readme/oas-examples": "^5.9.0", "@types/caseless": "^0.12.2", "@types/find-cache-dir": "^3.2.1", - "@types/jest": "^29.5.2", "@types/js-yaml": "^4.0.5", "@types/lodash.camelcase": "^4.3.7", "@types/lodash.deburr": "^4.1.7", @@ -87,14 +86,13 @@ "@types/semver": "^7.3.13", "@types/ssri": "^7.1.1", "@types/validate-npm-package-name": "^4.0.0", + "@vitest/coverage-v8": "^0.34.1", "fetch-mock": "^9.11.0", - "jest": "^29.6.1", - "jest-extended": "^4.0.0", "oas-normalize": "^8.3.2", - "ts-jest": "^29.1.1", "type-fest": "^3.5.4", "typescript": "^4.9.5", - "unique-temp-dir": "^1.0.0" + "unique-temp-dir": "^1.0.0", + "vitest": "^0.34.1" }, "prettier": "@readme/eslint-config/prettier" } diff --git a/packages/api/test/.eslintrc b/packages/api/test/.eslintrc index 01cf1347..6090569f 100644 --- a/packages/api/test/.eslintrc +++ b/packages/api/test/.eslintrc @@ -1,6 +1,6 @@ { - "extends": "@readme/eslint-config/testing", + "extends": "@readme/eslint-config/testing/vitest", "rules": { - "jest/no-conditional-expect": "off" + "vitest/no-conditional-expect": "off" } } diff --git a/packages/api/test/auth.test.ts b/packages/api/test/auth.test.ts index d48e3cfc..50b68ffd 100644 --- a/packages/api/test/auth.test.ts +++ b/packages/api/test/auth.test.ts @@ -2,6 +2,7 @@ import type { OASDocument } from 'oas/dist/rmoas.types'; import fetchMock from 'fetch-mock'; import uniqueTempDir from 'unique-temp-dir'; +import { describe, beforeAll, beforeEach, afterEach, it, expect, vi } from 'vitest'; import api from '../src'; import Cache from '../src/cache'; @@ -31,7 +32,7 @@ describe('#auth()', () => { fetchMock.restore(); }); - describe('API Keys', () => { + describe('API keys', () => { describe('in: query', () => { it('should allow you to supply auth', async () => { fetchMock.get( @@ -135,7 +136,7 @@ describe('#auth()', () => { }); it('should allow multiple calls to share an API key', async () => { - const endpointCall = jest.fn(); + const endpointCall = vi.fn(); fetchMock.get( { url: 'https://httpbin.org/anything/apiKey', @@ -149,7 +150,7 @@ describe('#auth()', () => { sdk.auth(apiKey); - await sdk.getAnythingApikey().then(() => expect(endpointCall).toHaveBeenCalledOnce()); + await sdk.getAnythingApikey().then(() => expect(endpointCall).toHaveBeenCalledTimes(1)); await sdk.getAnythingApikey().then(() => expect(endpointCall).toHaveBeenCalledTimes(2)); }); @@ -183,16 +184,18 @@ describe('#auth()', () => { }); describe('quirks', () => { + let authQuirksOas; let quirks; beforeAll(async () => { - const authQuirksOas = await loadSpec(require.resolve('./__fixtures__/definitions/auth-quirks.json')); + authQuirksOas = await loadSpec(require.resolve('./__fixtures__/definitions/auth-quirks.json')); quirks = api(authQuirksOas as unknown as OASDocument); + }); - // Because the `POST /anything` operation allows either an OAuth2 token or Basic Auth the - // quirks case we're testing is that you should be able to supply either a single OAuth2 token - // or a username+password and it should be able to intelligently handle both. - // eslint-disable-next-line jest/no-standalone-expect + // Because the `POST /anything` operation allows either an OAuth2 token or Basic Auth the + // quirks case we're testing is that you should be able to supply either a single OAuth2 token + // or a username+password and it should be able to intelligently handle both. + it('should have an expected security setting definition for this quirks case', () => { expect(authQuirksOas.paths['/anything'].post.security).toStrictEqual([ { oauth2: ['write:things'] }, { basicAuth: [] }, diff --git a/packages/api/test/cache-custom.test.ts b/packages/api/test/cache-custom.test.ts index 1b2cf795..f4d8baa0 100644 --- a/packages/api/test/cache-custom.test.ts +++ b/packages/api/test/cache-custom.test.ts @@ -2,6 +2,7 @@ import fs from 'fs/promises'; import path from 'path'; import fetchMock from 'fetch-mock'; +import { describe, beforeEach, afterEach, it, expect } from 'vitest'; import api from '../src'; import Cache from '../src/cache'; diff --git a/packages/api/test/cache-tmp.test.ts b/packages/api/test/cache-tmp.test.ts index a0cdedb1..523b0c34 100644 --- a/packages/api/test/cache-tmp.test.ts +++ b/packages/api/test/cache-tmp.test.ts @@ -1,10 +1,12 @@ import os from 'os'; +import { describe, it, expect, vi } from 'vitest'; + import Cache from '../src/cache'; -jest.mock('find-cache-dir', () => { - return () => undefined; -}); +vi.mock('find-cache-dir', () => ({ + default: () => undefined, +})); describe('cache (temp dir handling)', () => { // Since this test is mocking out the `find-cache-dir` module for a single test, it needs to be diff --git a/packages/api/test/cache.test.ts b/packages/api/test/cache.test.ts index 621b4d1b..0ddc88ec 100644 --- a/packages/api/test/cache.test.ts +++ b/packages/api/test/cache.test.ts @@ -5,6 +5,7 @@ import path from 'path'; import fetchMock from 'fetch-mock'; import uniqueTempDir from 'unique-temp-dir'; +import { describe, beforeAll, it, expect } from 'vitest'; import Cache from '../src/cache'; diff --git a/packages/api/test/cli/codegen/languages/typescript.test.ts b/packages/api/test/cli/codegen/languages/typescript.test.ts index d5a34e1b..369a74e6 100644 --- a/packages/api/test/cli/codegen/languages/typescript.test.ts +++ b/packages/api/test/cli/codegen/languages/typescript.test.ts @@ -1,4 +1,3 @@ -/* eslint jest/expect-expect: ["error", { "assertFunctionNames": ["expect", "assertSDKFixture"] }] */ import type { TSGeneratorOptions } from '../../../../src/cli/codegen/languages/typescript'; import { promises as fs } from 'fs'; @@ -7,6 +6,7 @@ import path from 'path'; import fetchMock from 'fetch-mock'; import Oas from 'oas'; import uniqueTempDir from 'unique-temp-dir'; +import { describe, beforeEach, afterEach, it, expect, vi } from 'vitest'; import TSGenerator from '../../../../src/cli/codegen/languages/typescript'; import Storage from '../../../../src/cli/storage'; @@ -79,7 +79,7 @@ describe('typescript', () => { }); it('should install a `package.json` and the required packages', async () => { - const logger = jest.fn(); + const logger = vi.fn(); const file = require.resolve('@readme/oas-examples/3.0/json/petstore.json'); const oas = await loadSpec(file).then(Oas.init); diff --git a/packages/api/test/cli/codegen/languages/typescript/smoketest.test.ts b/packages/api/test/cli/codegen/languages/typescript/smoketest.test.ts index 45fd8930..97840bbd 100644 --- a/packages/api/test/cli/codegen/languages/typescript/smoketest.test.ts +++ b/packages/api/test/cli/codegen/languages/typescript/smoketest.test.ts @@ -17,6 +17,7 @@ */ import Oas from 'oas'; import OASNormalize from 'oas-normalize'; +import { describe, it, expect } from 'vitest'; import TSGenerator from '../../../../../src/cli/codegen/languages/typescript'; import realWorldAPIs from '../../../../datasets/real-world-apis.json'; @@ -54,6 +55,7 @@ if (args.chunks && args.chunk) { } describe('typescript smoketest', () => { + // eslint-disable-next-line vitest/require-hook dataset.forEach(({ name, url }) => { // The test timeout is huge on this because CI can be slow as some API definitions are huge and // can take a while to download + codegen. diff --git a/packages/api/test/cli/codegen/languages/typescript/utils.test.ts b/packages/api/test/cli/codegen/languages/typescript/utils.test.ts index 1fa5b099..7fe16498 100644 --- a/packages/api/test/cli/codegen/languages/typescript/utils.test.ts +++ b/packages/api/test/cli/codegen/languages/typescript/utils.test.ts @@ -1,3 +1,5 @@ +import { describe, it, expect } from 'vitest'; + import { docblockEscape, generateTypeName, wordWrap } from '../../../../../src/cli/codegen/languages/typescript/util'; describe('ts codegen utils', () => { diff --git a/packages/api/test/cli/storage.test.ts b/packages/api/test/cli/storage.test.ts index 4db08e3a..438982fe 100644 --- a/packages/api/test/cli/storage.test.ts +++ b/packages/api/test/cli/storage.test.ts @@ -7,6 +7,7 @@ import path from 'path'; import fetchMock from 'fetch-mock'; import 'isomorphic-fetch'; import uniqueTempDir from 'unique-temp-dir'; +import { describe, beforeAll, beforeEach, afterEach, it, expect } from 'vitest'; import Storage from '../../src/cli/storage'; import { PACKAGE_VERSION } from '../../src/packageInfo'; diff --git a/packages/api/test/config.test.ts b/packages/api/test/config.test.ts index 9f3340ee..b333859a 100644 --- a/packages/api/test/config.test.ts +++ b/packages/api/test/config.test.ts @@ -2,6 +2,7 @@ import type { OASDocument } from 'oas/dist/rmoas.types'; import fetchMock from 'fetch-mock'; import uniqueTempDir from 'unique-temp-dir'; +import { describe, beforeAll, beforeEach, afterEach, it, expect } from 'vitest'; import api from '../src'; import Cache from '../src/cache'; diff --git a/packages/api/test/core/getJSONSchemaDefaults.test.ts b/packages/api/test/core/getJSONSchemaDefaults.test.ts index 800ee510..f931df20 100644 --- a/packages/api/test/core/getJSONSchemaDefaults.test.ts +++ b/packages/api/test/core/getJSONSchemaDefaults.test.ts @@ -1,4 +1,5 @@ import Oas from 'oas'; +import { describe, it, expect } from 'vitest'; import getJSONSchemaDefaults from '../../src/core/getJSONSchemaDefaults'; import loadSpec from '../helpers/load-spec'; diff --git a/packages/api/test/core/index.test.ts b/packages/api/test/core/index.test.ts index a9b49daa..dc0de896 100644 --- a/packages/api/test/core/index.test.ts +++ b/packages/api/test/core/index.test.ts @@ -2,6 +2,7 @@ import assert from 'assert'; import fetchMock from 'fetch-mock'; import Oas from 'oas'; +import { describe, beforeEach, afterEach, it, expect } from 'vitest'; import APICore from '../../src/core'; import FetchError from '../../src/core/errors/fetchError'; diff --git a/packages/api/test/core/parseResponse.test.ts b/packages/api/test/core/parseResponse.test.ts index b4b610af..bdbfa71b 100644 --- a/packages/api/test/core/parseResponse.test.ts +++ b/packages/api/test/core/parseResponse.test.ts @@ -1,4 +1,5 @@ import 'isomorphic-fetch'; +import { describe, beforeEach, it, expect } from 'vitest'; import parseResponse from '../../src/core/parseResponse'; diff --git a/packages/api/test/core/prepareAuth.test.ts b/packages/api/test/core/prepareAuth.test.ts index 3f8ddca5..389c1a9f 100644 --- a/packages/api/test/core/prepareAuth.test.ts +++ b/packages/api/test/core/prepareAuth.test.ts @@ -1,6 +1,7 @@ import type { OASDocument } from 'oas/dist/rmoas.types'; import Oas from 'oas'; +import { describe, beforeAll, it, expect } from 'vitest'; import prepareAuth from '../../src/core/prepareAuth'; import loadSpec from '../helpers/load-spec'; diff --git a/packages/api/test/core/prepareParams.test.ts b/packages/api/test/core/prepareParams.test.ts index 77b2a602..ddbf2f6a 100644 --- a/packages/api/test/core/prepareParams.test.ts +++ b/packages/api/test/core/prepareParams.test.ts @@ -1,6 +1,7 @@ import fs from 'fs'; import Oas from 'oas'; +import { describe, beforeEach, it, expect } from 'vitest'; import prepareParams from '../../src/core/prepareParams'; import payloadExamples from '../__fixtures__/definitions/payloads.json'; diff --git a/packages/api/test/dist.test.ts b/packages/api/test/dist.test.ts index 8d457038..b06bbc08 100644 --- a/packages/api/test/dist.test.ts +++ b/packages/api/test/dist.test.ts @@ -2,6 +2,7 @@ import type { OASDocument } from 'oas/dist/rmoas.types'; import fetchMock from 'fetch-mock'; import uniqueTempDir from 'unique-temp-dir'; +import { describe, beforeAll, afterEach, it, expect } from 'vitest'; import api from '../dist'; import Cache from '../src/cache'; diff --git a/packages/api/test/fetcher.test.ts b/packages/api/test/fetcher.test.ts index d2d430ab..d0e23001 100644 --- a/packages/api/test/fetcher.test.ts +++ b/packages/api/test/fetcher.test.ts @@ -2,6 +2,7 @@ import assert from 'assert'; import fs from 'fs/promises'; import fetchMock from 'fetch-mock'; +import { describe, beforeAll, it, expect } from 'vitest'; import Fetcher from '../src/fetcher'; diff --git a/packages/api/test/global.d.ts b/packages/api/test/global.d.ts index fd0a4cd6..89196dab 100644 --- a/packages/api/test/global.d.ts +++ b/packages/api/test/global.d.ts @@ -1,3 +1 @@ -import 'jest-extended'; - -import './helpers/jest.matchers'; +import './helpers/vitest.matchers'; diff --git a/packages/api/test/helpers/jest.matchers.ts b/packages/api/test/helpers/vitest.matchers.ts similarity index 74% rename from packages/api/test/helpers/jest.matchers.ts rename to packages/api/test/helpers/vitest.matchers.ts index 2dbc154c..66c74b4b 100644 --- a/packages/api/test/helpers/jest.matchers.ts +++ b/packages/api/test/helpers/vitest.matchers.ts @@ -1,6 +1,7 @@ import type { ParameterObject } from 'oas/dist/rmoas.types'; import caseless from 'caseless'; +import { expect } from 'vitest'; interface CustomMatchers { /** @@ -29,15 +30,13 @@ interface CustomMatchers { toHaveHeader(header: string, expected: RegExp | (string | number)[] | string): R; } -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace jest { - interface Matchers extends CustomMatchers {} - } +declare module 'vitest' { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} } expect.extend({ - toBeDereferenced(this: jest.MatcherUtils, spec: ParameterObject[]) { + toBeDereferenced(spec: ParameterObject[]) { const pass = !spec.filter(obj => '$ref' in obj).length; if (!pass) { return { @@ -52,39 +51,37 @@ expect.extend({ }; }, - toHaveCustomUserAgent(this: jest.MatcherUtils, headers: string[]) { - const { printReceived } = this.utils; + toHaveCustomUserAgent(headers: string[]) { const userAgent = headers['user-agent']; const pass = userAgent.match(/^api \(node\)\/(\d+.\d+(.\d+|unit-testing))$/); if (!pass) { return { - message: () => `expected a custom \`user-agent\` header to be present.\n\n${printReceived(userAgent)}`, + message: () => `expected a custom \`user-agent\` header to be present.\n\nreceived: ${userAgent}`, pass: false, }; } return { - message: () => `expected a custom \`user-agent\` header to not be present\n\n${printReceived(userAgent)}`, + message: () => `expected a custom \`user-agent\` header to not be present\n\nreceived: ${userAgent}`, pass: true, }; }, - toHaveHeader(this: jest.MatcherUtils, obj: Headers, header: string, expected: RegExp | (string | number)[] | string) { - const { printReceived } = this.utils; + toHaveHeader(obj: Headers, header: string, expected: RegExp | (string | number)[] | string) { const headers = caseless(Object.fromEntries(Array.from(obj.entries()))); // Header value should match a given regex. if (expected instanceof RegExp) { if (!expected.test(headers.get(header))) { return { - message: () => `expected header to match ${expected.source}\n\n${printReceived(header)}`, + message: () => `expected header to match ${expected.source}\n\nreceived: ${header}`, pass: false, }; } return { - message: () => `expected header to not match ${expected.source}\n\n${printReceived(header)}`, + message: () => `expected header to not match ${expected.source}\n\nreceived: ${header}`, pass: true, }; } @@ -93,13 +90,13 @@ expect.extend({ if (Array.isArray(expected)) { if (!expected.some(h => h === headers.get(header))) { return { - message: () => `expected header to be one of the following: ${expected}\n\n${printReceived(header)}`, + message: () => `expected header to be one of the following: ${expected}\n\nreceived: ${header}`, pass: false, }; } return { - message: () => `expected header to not be one of the following: ${expected}\n\n${printReceived(header)}`, + message: () => `expected header to not be one of the following: ${expected}\n\nreceived: ${header}`, pass: true, }; } @@ -107,13 +104,13 @@ expect.extend({ // Header value should match a given value. if (headers.get(header) !== expected) { return { - message: () => `expected header to be ${expected}\n\n${printReceived(header)}`, + message: () => `expected header to be ${expected}\n\nreceived: ${header}`, pass: false, }; } return { - message: () => `expected header not to be ${expected}\n\n${printReceived(header)}`, + message: () => `expected header not to be ${expected}\n\nreceived: ${header}`, pass: true, }; }, diff --git a/packages/api/test/index.test.ts b/packages/api/test/index.test.ts index 0e602dec..24856ca9 100644 --- a/packages/api/test/index.test.ts +++ b/packages/api/test/index.test.ts @@ -4,6 +4,7 @@ import assert from 'assert'; import fetchMock from 'fetch-mock'; import uniqueTempDir from 'unique-temp-dir'; +import { describe, beforeAll, beforeEach, afterEach, it, expect, expectTypeOf } from 'vitest'; import pkg from '../package.json'; import api from '../src'; @@ -86,7 +87,7 @@ describe('api', () => { describe('#accessors', () => { it('should have a function for each http method', () => { ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'].forEach(method => { - expect(petstoreSDK[method]).toBeFunction(); + expectTypeOf(petstoreSDK[method]).toBeFunction(); }); }); @@ -121,7 +122,7 @@ describe('api', () => { // `camelCase` option on `Operation.getOperationId()` should transform it into // `findPetById`. expect(petstore.paths['/pets/{id}'].get.operationId).toBe('find pet by id'); - expect(petstoreSDK.findPetById).toBeFunction(); + expectTypeOf(petstoreSDK.findPetById).toBeFunction(); }); it('should work for other methods', async () => { diff --git a/packages/api/test/integration.test.ts b/packages/api/test/integration.test.ts index 5f9175dc..af88a1e9 100644 --- a/packages/api/test/integration.test.ts +++ b/packages/api/test/integration.test.ts @@ -3,6 +3,7 @@ import type { OASDocument } from 'oas/dist/rmoas.types'; import datauri from 'datauri'; import fetchMock from 'fetch-mock'; import uniqueTempDir from 'unique-temp-dir'; +import { describe, beforeAll, beforeEach, afterEach, it, expect } from 'vitest'; import api from '../src'; import Cache from '../src/cache'; diff --git a/packages/api/test/server.test.ts b/packages/api/test/server.test.ts index e57af6bf..5d4e62fe 100644 --- a/packages/api/test/server.test.ts +++ b/packages/api/test/server.test.ts @@ -1,5 +1,6 @@ import fetchMock from 'fetch-mock'; import uniqueTempDir from 'unique-temp-dir'; +import { describe, beforeAll, beforeEach, afterEach, it, expect } from 'vitest'; import api from '../src'; import Cache from '../src/cache'; diff --git a/packages/api/vitest-smoketest.config.ts b/packages/api/vitest-smoketest.config.ts new file mode 100644 index 00000000..5060a0bc --- /dev/null +++ b/packages/api/vitest-smoketest.config.ts @@ -0,0 +1,10 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['**/smoketest.test.ts'], + setupFiles: ['./test/helpers/vitest.matchers.ts'], + testTimeout: 20000, + }, +}); diff --git a/packages/api/vitest.config.ts b/packages/api/vitest.config.ts new file mode 100644 index 00000000..8363a45e --- /dev/null +++ b/packages/api/vitest.config.ts @@ -0,0 +1,17 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + exclude: [ + '**/dist/**', + '**/node_modules/**', + '**/__fixtures__/**', + '**/datasets/**', + '**/helpers/**', + '**/smoketest.test.ts', + ], + setupFiles: ['./test/helpers/vitest.matchers.ts'], + testTimeout: 20000, + }, +}); diff --git a/packages/httpsnippet-client-api/.npmignore b/packages/httpsnippet-client-api/.npmignore index ca9b2142..15fe1038 100644 --- a/packages/httpsnippet-client-api/.npmignore +++ b/packages/httpsnippet-client-api/.npmignore @@ -3,4 +3,4 @@ test/ .eslint* .gitignore .prettier* -jest.config.js +vitest.* diff --git a/packages/httpsnippet-client-api/jest.config.js b/packages/httpsnippet-client-api/jest.config.js deleted file mode 100644 index e858821e..00000000 --- a/packages/httpsnippet-client-api/jest.config.js +++ /dev/null @@ -1,22 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - coveragePathIgnorePatterns: [ - '/dist', - '/node_modules', - '/test/__datasets__/', - '/test/__fixtures__/', - '/test/helpers/', - ], - modulePaths: [''], - roots: [''], - testPathIgnorePatterns: ['/test/__datasets__/', '/test/__fixtures__/', '/test/helpers/'], - testRegex: '(/test/.*|(\\.|/)(test|spec))\\.(js?|ts?)$', - transform: { - '^.+\\.[tj]s$': [ - 'ts-jest', - { - tsconfig: 'test/tsconfig.json', - }, - ], - }, -}; diff --git a/packages/httpsnippet-client-api/package.json b/packages/httpsnippet-client-api/package.json index f7cb7842..035e7c4a 100644 --- a/packages/httpsnippet-client-api/package.json +++ b/packages/httpsnippet-client-api/package.json @@ -9,7 +9,7 @@ "lint:types": "tsc --noEmit", "prebuild": "rm -rf dist/", "prepack": "npm run build", - "test": "jest --coverage" + "test": "vitest --coverage" }, "repository": { "type": "git", @@ -36,14 +36,13 @@ "@readme/oas-examples": "^5.9.0", "@readme/openapi-parser": "^2.4.0", "@types/content-type": "^1.1.5", - "@types/jest": "^29.5.2", "@types/stringify-object": "^4.0.2", + "@vitest/coverage-v8": "^0.34.1", "api": "file:../api", "fetch-mock": "^9.11.0", "isomorphic-fetch": "^3.0.0", - "jest": "^29.6.1", - "ts-jest": "^29.1.1", - "typescript": "^4.9.5" + "typescript": "^4.9.5", + "vitest": "^0.34.1" }, "prettier": "@readme/eslint-config/prettier" } diff --git a/packages/httpsnippet-client-api/test/.eslintrc b/packages/httpsnippet-client-api/test/.eslintrc index f5de24fc..716c33cc 100644 --- a/packages/httpsnippet-client-api/test/.eslintrc +++ b/packages/httpsnippet-client-api/test/.eslintrc @@ -1,6 +1,3 @@ { - "extends": "@readme/eslint-config/testing", - "rules": { - "jest/no-export": "off" - } + "extends": "@readme/eslint-config/testing/vitest" } diff --git a/packages/httpsnippet-client-api/test/index.test.ts b/packages/httpsnippet-client-api/test/index.test.ts index fc06560c..30e741fe 100644 --- a/packages/httpsnippet-client-api/test/index.test.ts +++ b/packages/httpsnippet-client-api/test/index.test.ts @@ -15,6 +15,7 @@ import openapiParser from '@readme/openapi-parser'; import fetchMock from 'fetch-mock'; import 'isomorphic-fetch'; import rimraf from 'rimraf'; +import { describe, afterEach, beforeEach, expect, it, vi } from 'vitest'; import client from '../src'; @@ -98,115 +99,110 @@ describe('httpsnippet-client-api', () => { }); describe('snippets', () => { - SNIPPETS.forEach(snippet => { - describe(`${snippet}`, () => { - let mock: SnippetMock; - let consoleStub; - - beforeEach(async () => { - try { - // Since we're doing integration testing with these snippets against the real `api` - // library we should clear out the cache that it creates so our tests will run in a - // cleanroom environment. - rimraf.sync(path.join(__dirname, '../node_modules/.cache/api')); - } catch (err) { - // If we couldn't delete the `api` specs cache then it probably doesn't exist yet. - } - - consoleStub = jest.spyOn(console, 'log').mockImplementation(); + describe.each(SNIPPETS)('%s', snippet => { + let mock: SnippetMock; + let consoleStub; + + beforeEach(async () => { + try { + // Since we're doing integration testing with these snippets against the real `api` + // library we should clear out the cache that it creates so our tests will run in a + // cleanroom environment. + rimraf.sync(path.join(__dirname, '../node_modules/.cache/api')); + } catch (err) { + // If we couldn't delete the `api` specs cache then it probably doesn't exist yet. + } + + consoleStub = vi.spyOn(console, 'log').mockImplementation(() => {}); + + mock = await getSnippetDataset(snippet); + + // `OpenAPIParser.validate()` updates the spec that's passed and we just want to validate + // it here so we need to clone the object. + const spec = JSON.parse(JSON.stringify(mock.definition)); + await openapiParser.validate(spec); + }); - mock = await getSnippetDataset(snippet); + afterEach(() => { + consoleStub.mockRestore(); + fetchMock.restore(); + }); - // `OpenAPIParser.validate()` updates the spec that's passed and we just want to validate - // it here so we need to clone the object. - const spec = JSON.parse(JSON.stringify(mock.definition)); - await openapiParser.validate(spec); - }); + it('should generate the expected snippet', async () => { + const expected = await fs.readFile(path.join(DATASETS_DIR, snippet, 'output.js'), 'utf-8'); - afterEach(() => { - consoleStub.mockRestore(); - fetchMock.restore(); + const code = new HTTPSnippet(mock.har).convert('node', 'api', { + apiDefinitionUri: `https://api.example.com/${snippet}.json`, + apiDefinition: mock.definition, }); - it('should generate the expected snippet', async () => { - const expected = await fs.readFile(path.join(DATASETS_DIR, snippet, 'output.js'), 'utf-8'); + expect(`${code}\n`).toStrictEqual(expected); + }); - const code = new HTTPSnippet(mock.har).convert('node', 'api', { - apiDefinitionUri: `https://api.example.com/${snippet}.json`, - apiDefinition: mock.definition, - }); + it('should generate a functional snippet', async () => { + if (!mock.fetch.req || !mock.fetch.res) { + throw new Error(`The mock definition for ${snippet} must include required \`req\` and \`res\` expectations.`); + } - expect(`${code}\n`).toStrictEqual(expected); + fetchMock.get(`https://api.example.com/${snippet}.json`, { status: 200, body: mock.definition }); + fetchMock.mock(mock.fetch.req, { + ...mock.fetch.res, + body: `The ${snippet} request works properly!`, }); - it('should generate a functional snippet', async () => { - // eslint-disable-next-line jest/no-if - if (!mock.fetch.req || !mock.fetch.res) { - throw new Error( - `The mock definition for ${snippet} must include required \`req\` and \`res\` expectations.`, - ); + const code = await fs.readFile(path.join(DATASETS_DIR, snippet, 'output.js'), 'utf-8').then(str => { + // So we can test these snippets within a Node VM environment we need to remove the api + // require statement off (as we'll be handling that ourselves), and also set up the + // promise within the snippet to be returned so that we can containerize it within + // another promise. + const lines = str.split('\n').slice(2); + + // If the first non-require statement in our snippet is an `sdk.auth()` or + // `sdk.server()` call then we should add our `return` statement to the following. We + // currently don't have any tests that test both auth and alternate servers so we don't + // need to worry about that. + if (lines[0].startsWith('sdk.auth(') || lines[0].startsWith('sdk.server')) { + lines[1] = `return ${lines[1]}`; + } else { + lines[0] = `return ${lines[0]}`; } - fetchMock.get(`https://api.example.com/${snippet}.json`, { status: 200, body: mock.definition }); - fetchMock.mock(mock.fetch.req, { - ...mock.fetch.res, - body: `The ${snippet} request works properly!`, - }); - - const code = await fs.readFile(path.join(DATASETS_DIR, snippet, 'output.js'), 'utf-8').then(str => { - // So we can test these snippets within a Node VM environment we need to remove the api - // require statement off (as we'll be handling that ourselves), and also set up the - // promise within the snippet to be returned so that we can containerize it within - // another promise. - const lines = str.split('\n').slice(2); - - // If the first non-require statement in our snippet is an `sdk.auth()` or - // `sdk.server()` call then we should add our `return` statement to the following. We - // currently don't have any tests that test both auth and alternate servers so we don't - // need to worry about that. - if (lines[0].startsWith('sdk.auth(') || lines[0].startsWith('sdk.server')) { - lines[1] = `return ${lines[1]}`; - } else { - lines[0] = `return ${lines[0]}`; - } - - return lines.join('\n'); - }); - - await new Promise((resolve, reject) => { - const sandbox = { - // eslint-disable-next-line @typescript-eslint/no-var-requires - sdk: require('api')(`https://api.example.com/${snippet}.json`), - - // So we can access logged data from our snippets within the VM we need to set the - // global `console` object within it to our current one so that the stub we're - // creating above will have visibility into what the VM is doing. - console, - - // So we can await for responses from the async snippets we've got in the VM we need - // to set some global `resolve` and `reject` methods inside the VM to the current - // of the same in this Promise so that when they're called from within the context of - // the VM environment the this Promise will also be resolved/rejected. - // https://stackoverflow.com/a/60216761 - resolve, - reject, - }; - - const vmCode = `Promise.resolve().then(() => { - ${code} - }).then(res => { - resolve(); - }).catch(err => { - reject(err.message); - })`; - - const script = new vm.Script(vmCode); - const context = vm.createContext(sandbox); - script.runInContext(context); - }); - - expect(consoleStub).toHaveBeenCalledWith(`The ${snippet} request works properly!`); + return lines.join('\n'); + }); + + await new Promise((resolve, reject) => { + const sandbox = { + // eslint-disable-next-line @typescript-eslint/no-var-requires + sdk: require('api')(`https://api.example.com/${snippet}.json`), + + // So we can access logged data from our snippets within the VM we need to set the + // global `console` object within it to our current one so that the stub we're + // creating above will have visibility into what the VM is doing. + console, + + // So we can await for responses from the async snippets we've got in the VM we need + // to set some global `resolve` and `reject` methods inside the VM to the current + // of the same in this Promise so that when they're called from within the context of + // the VM environment the this Promise will also be resolved/rejected. + // https://stackoverflow.com/a/60216761 + resolve, + reject, + }; + + const vmCode = `Promise.resolve().then(() => { + ${code} + }).then(res => { + resolve(); + }).catch(err => { + reject(err.message); + })`; + + const script = new vm.Script(vmCode); + const context = vm.createContext(sandbox); + script.runInContext(context); }); + + expect(consoleStub).toHaveBeenCalledWith(`The ${snippet} request works properly!`); }); }); }); diff --git a/packages/httpsnippet-client-api/vitest.config.ts b/packages/httpsnippet-client-api/vitest.config.ts new file mode 100644 index 00000000..a1fa7ad0 --- /dev/null +++ b/packages/httpsnippet-client-api/vitest.config.ts @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + exclude: ['dist', 'node_modules', '**/__datasets__/**', '**/__fixtures__/**', '**/helpers/**'], + }, +});