diff --git a/.eslintrc.json b/.eslintrc.json index 0ae0d78..1b45f17 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -16,4 +16,4 @@ "@typescript-eslint" ], "rules": {} -} +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 854890b..b05f4b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ # Dependency directories node_modules/ jspm_packages/ -bower_components +bower_components/ # dotenv environment variable files .env @@ -14,6 +14,13 @@ bower_components *.tsbuildinfo # Visual Studio Code -.vscode/ +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets +.history/ +*.vsix build/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5a1dacb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "vitest.commandLine": "npx vitest", + "editor.tabSize": 2, + "javascript.preferences.importModuleSpecifier": "non-relative", +} diff --git a/jest.config.ts b/jest.config.ts deleted file mode 100644 index 4f73ca4..0000000 --- a/jest.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { JestConfigWithTsJest } from "ts-jest"; -import { pathsToModuleNameMapper } from "ts-jest"; -import { compilerOptions } from "./tsconfig.json"; - -const jestConfig: JestConfigWithTsJest = { - preset: "ts-jest", - roots: [""], - modulePaths: [compilerOptions.baseUrl], - moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { useESM: true }) -}; - -export default jestConfig; diff --git a/package-lock.json b/package-lock.json index b6dc3c6..b2a5a61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "typescript-chess-engine", "version": "0.6.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -34,9 +34,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -55,15 +55,6 @@ "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", @@ -432,9 +423,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", - "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -463,64 +454,19 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -551,9 +497,9 @@ "dev": true }, "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -577,9 +523,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "engines": { "node": ">=6.0.0" } @@ -604,18 +550,17 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@jsdoc/salty": { @@ -691,9 +636,9 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", "dev": true }, "node_modules/@types/chai-subset": { @@ -706,9 +651,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", "dev": true, "dependencies": { "@types/estree": "*", @@ -738,9 +683,9 @@ "dev": true }, "node_modules/@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==" }, "node_modules/@types/markdown-it": { "version": "12.2.3", @@ -757,27 +702,27 @@ "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" }, "node_modules/@types/node": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.0.tgz", - "integrity": "sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", - "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz", + "integrity": "sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/type-utils": "6.4.1", - "@typescript-eslint/utils": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/type-utils": "6.7.0", + "@typescript-eslint/utils": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -803,15 +748,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", - "integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.0.tgz", + "integrity": "sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/typescript-estree": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", "debug": "^4.3.4" }, "engines": { @@ -831,13 +776,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", - "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz", + "integrity": "sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1" + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -848,13 +793,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", - "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.0.tgz", + "integrity": "sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/typescript-estree": "6.7.0", + "@typescript-eslint/utils": "6.7.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -875,9 +820,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", - "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", + "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -888,13 +833,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", - "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz", + "integrity": "sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -915,17 +860,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", - "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.0.tgz", + "integrity": "sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/typescript-estree": "6.7.0", "semver": "^7.5.4" }, "engines": { @@ -940,12 +885,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", - "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", + "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/types": "6.7.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -957,13 +902,13 @@ } }, "node_modules/@vitest/expect": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.3.tgz", - "integrity": "sha512-F8MTXZUYRBVsYL1uoIft1HHWhwDbSzwAU9Zgh8S6WFC3YgVb4AnFV2GXO3P5Em8FjEYaZtTnQYoNwwBrlOMXgg==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.4.tgz", + "integrity": "sha512-XlMKX8HyYUqB8dsY8Xxrc64J2Qs9pKMt2Z8vFTL4mBWXJsg4yoALHzJfDWi8h5nkO4Zua4zjqtapQ/IluVkSnA==", "dev": true, "dependencies": { - "@vitest/spy": "0.34.3", - "@vitest/utils": "0.34.3", + "@vitest/spy": "0.34.4", + "@vitest/utils": "0.34.4", "chai": "^4.3.7" }, "funding": { @@ -971,12 +916,12 @@ } }, "node_modules/@vitest/runner": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.3.tgz", - "integrity": "sha512-lYNq7N3vR57VMKMPLVvmJoiN4bqwzZ1euTW+XXYH5kzr3W/+xQG3b41xJn9ChJ3AhYOSoweu974S1V3qDcFESA==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.4.tgz", + "integrity": "sha512-hwwdB1StERqUls8oV8YcpmTIpVeJMe4WgYuDongVzixl5hlYLT2G8afhcdADeDeqCaAmZcSgLTLtqkjPQF7x+w==", "dev": true, "dependencies": { - "@vitest/utils": "0.34.3", + "@vitest/utils": "0.34.4", "p-limit": "^4.0.0", "pathe": "^1.1.1" }, @@ -1012,9 +957,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.3.tgz", - "integrity": "sha512-QyPaE15DQwbnIBp/yNJ8lbvXTZxS00kRly0kfFgAD5EYmCbYcA+1EEyRalc93M0gosL/xHeg3lKAClIXYpmUiQ==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.4.tgz", + "integrity": "sha512-GCsh4coc3YUSL/o+BPUo7lHQbzpdttTxL6f4q0jRx2qVGoYz/cyTRDJHbnwks6TILi6560bVWoBpYC10PuTLHw==", "dev": true, "dependencies": { "magic-string": "^0.30.1", @@ -1026,9 +971,9 @@ } }, "node_modules/@vitest/spy": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.3.tgz", - "integrity": "sha512-N1V0RFQ6AI7CPgzBq9kzjRdPIgThC340DGjdKdPSE8r86aUSmeliTUgkTqLSgtEwWWsGfBQ+UetZWhK0BgJmkQ==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.4.tgz", + "integrity": "sha512-PNU+fd7DUPgA3Ya924b1qKuQkonAW6hL7YUjkON3wmBwSTIlhOSpy04SJ0NrRsEbrXgMMj6Morh04BMf8k+w0g==", "dev": true, "dependencies": { "tinyspy": "^2.1.1" @@ -1038,9 +983,9 @@ } }, "node_modules/@vitest/utils": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.3.tgz", - "integrity": "sha512-kiSnzLG6m/tiT0XEl4U2H8JDBjFtwVlaE8I3QfGiMFR0QvnRDfYfdP3YvTBWM/6iJDAyaPY6yVQiCTUc7ZzTHA==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.4.tgz", + "integrity": "sha512-yR2+5CHhp/K4ySY0Qtd+CAL9f5Yh1aXrKfAT42bq6CtlGPh92jIDDDSg7ydlRow1CP+dys4TrOrbELOyNInHSg==", "dev": true, "dependencies": { "diff-sequences": "^29.4.3", @@ -1281,9 +1226,9 @@ } }, "node_modules/ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", "dev": true }, "node_modules/ansi-styles": { @@ -1306,6 +1251,11 @@ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -1358,9 +1308,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -1377,9 +1327,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.11" }, "bin": { @@ -1414,9 +1364,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001513", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001513.tgz", - "integrity": "sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -1584,9 +1534,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -1617,9 +1567,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.454", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", - "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", + "version": "1.4.520", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.520.tgz", + "integrity": "sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g==", "dev": true }, "node_modules/enhanced-resolve": { @@ -1644,9 +1594,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, "node_modules/esbuild": { @@ -1704,16 +1654,16 @@ } }, "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -1758,16 +1708,19 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { @@ -1782,12 +1735,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1816,126 +1763,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.13.0" } }, "node_modules/espree": { @@ -1967,15 +1804,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -1988,7 +1816,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -1997,15 +1825,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2046,18 +1865,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2103,17 +1910,34 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { @@ -2129,9 +1953,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -2172,15 +1996,15 @@ } }, "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/glob-to-regexp": { @@ -2189,9 +2013,24 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { @@ -2260,15 +2099,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2353,6 +2183,33 @@ "node": ">= 10.13.0" } }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/js2xmlparser": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", @@ -2389,6 +2246,12 @@ "node": ">=12.0.0" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -2413,6 +2276,15 @@ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/klaw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", @@ -2463,6 +2335,21 @@ "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", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2513,12 +2400,6 @@ "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-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -2548,11 +2429,6 @@ "markdown-it": "*" } }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -2642,9 +2518,9 @@ } }, "node_modules/mlly": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.1.tgz", - "integrity": "sha512-SCDs78Q2o09jiZiE2WziwVBEqXQ02XkGdUy45cbJf+BpYRIjArXRJ1Wbowxkb+NaM9DWvS3UC9GiO/6eqvQ/pg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", "dev": true, "dependencies": { "acorn": "^8.10.0", @@ -2736,6 +2612,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2829,9 +2720,9 @@ } }, "node_modules/postcss": { - "version": "8.4.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", - "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", "dev": true, "funding": [ { @@ -2866,12 +2757,12 @@ } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -2943,6 +2834,15 @@ "lodash": "^4.17.21" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -2969,9 +2869,9 @@ } }, "node_modules/rollup": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", - "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.1.tgz", + "integrity": "sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -3091,9 +2991,9 @@ } }, "node_modules/shiki": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", - "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.4.tgz", + "integrity": "sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==", "dev": true, "dependencies": { "ansi-sequence-parser": "^1.1.0", @@ -3193,18 +3093,15 @@ } }, "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=8" } }, "node_modules/tapable": { @@ -3217,9 +3114,9 @@ } }, "node_modules/terser": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz", - "integrity": "sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==", + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -3268,6 +3165,16 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -3275,9 +3182,9 @@ "dev": true }, "node_modules/tinybench": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", - "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", "dev": true }, "node_modules/tinypool": { @@ -3311,9 +3218,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", "dev": true, "engines": { "node": ">=16.13.0" @@ -3405,6 +3312,18 @@ "node": ">=4" } }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typedoc": { "version": "0.24.8", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", @@ -3578,9 +3497,9 @@ } }, "node_modules/vite-node": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.3.tgz", - "integrity": "sha512-+0TzJf1g0tYXj6tR2vEyiA42OPq68QkRZCu/ERSo2PtsDJfBpDyEfuKbRvLmZqi/CgC7SCBtyC+WjTGNMRIaig==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.4.tgz", + "integrity": "sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -3601,9 +3520,9 @@ } }, "node_modules/vite-tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.1.tgz", + "integrity": "sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -3620,19 +3539,19 @@ } }, "node_modules/vitest": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.3.tgz", - "integrity": "sha512-7+VA5Iw4S3USYk+qwPxHl8plCMhA5rtfwMjgoQXMT7rO5ldWcdsdo3U1QD289JgglGK4WeOzgoLTsGFu6VISyQ==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.4.tgz", + "integrity": "sha512-SE/laOsB6995QlbSE6BtkpXDeVNLJc1u2LHRG/OpnN4RsRzM3GQm4nm3PQCK5OBtrsUqnhzLdnT7se3aeNGdlw==", "dev": true, "dependencies": { "@types/chai": "^4.3.5", "@types/chai-subset": "^1.3.3", "@types/node": "*", - "@vitest/expect": "0.34.3", - "@vitest/runner": "0.34.3", - "@vitest/snapshot": "0.34.3", - "@vitest/spy": "0.34.3", - "@vitest/utils": "0.34.3", + "@vitest/expect": "0.34.4", + "@vitest/runner": "0.34.4", + "@vitest/snapshot": "0.34.4", + "@vitest/spy": "0.34.4", + "@vitest/utils": "0.34.4", "acorn": "^8.9.0", "acorn-walk": "^8.2.0", "cac": "^6.7.14", @@ -3646,8 +3565,8 @@ "strip-literal": "^1.0.1", "tinybench": "^2.5.0", "tinypool": "^0.7.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.34.3", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.4", "why-is-node-running": "^2.2.2" }, "bin": { @@ -3722,9 +3641,9 @@ } }, "node_modules/webpack": { - "version": "5.88.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", - "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -3777,6 +3696,28 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3845,5 +3786,2580 @@ "url": "https://github.com/sponsors/sindresorhus" } } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==" + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@eslint/js": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@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, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + }, + "@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 + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@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==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jsdoc/salty": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.5.tgz", + "integrity": "sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==", + "requires": { + "lodash": "^4.17.21" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "@types/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", + "dev": true + }, + "@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, + "requires": { + "@types/chai": "*" + } + }, + "@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==" + }, + "@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "requires": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" + }, + "@types/node": { + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" + }, + "@types/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz", + "integrity": "sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/type-utils": "6.7.0", + "@typescript-eslint/utils": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/parser": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.0.tgz", + "integrity": "sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/typescript-estree": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz", + "integrity": "sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.0.tgz", + "integrity": "sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.7.0", + "@typescript-eslint/utils": "6.7.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", + "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz", + "integrity": "sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.0.tgz", + "integrity": "sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/typescript-estree": "6.7.0", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", + "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.7.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "@vitest/expect": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.4.tgz", + "integrity": "sha512-XlMKX8HyYUqB8dsY8Xxrc64J2Qs9pKMt2Z8vFTL4mBWXJsg4yoALHzJfDWi8h5nkO4Zua4zjqtapQ/IluVkSnA==", + "dev": true, + "requires": { + "@vitest/spy": "0.34.4", + "@vitest/utils": "0.34.4", + "chai": "^4.3.7" + } + }, + "@vitest/runner": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.4.tgz", + "integrity": "sha512-hwwdB1StERqUls8oV8YcpmTIpVeJMe4WgYuDongVzixl5hlYLT2G8afhcdADeDeqCaAmZcSgLTLtqkjPQF7x+w==", + "dev": true, + "requires": { + "@vitest/utils": "0.34.4", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "dependencies": { + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "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 + } + } + }, + "@vitest/snapshot": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.4.tgz", + "integrity": "sha512-GCsh4coc3YUSL/o+BPUo7lHQbzpdttTxL6f4q0jRx2qVGoYz/cyTRDJHbnwks6TILi6560bVWoBpYC10PuTLHw==", + "dev": true, + "requires": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + } + }, + "@vitest/spy": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.4.tgz", + "integrity": "sha512-PNU+fd7DUPgA3Ya924b1qKuQkonAW6hL7YUjkON3wmBwSTIlhOSpy04SJ0NrRsEbrXgMMj6Morh04BMf8k+w0g==", + "dev": true, + "requires": { + "tinyspy": "^2.1.1" + } + }, + "@vitest/utils": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.4.tgz", + "integrity": "sha512-yR2+5CHhp/K4ySY0Qtd+CAL9f5Yh1aXrKfAT42bq6CtlGPh92jIDDDSg7ydlRow1CP+dys4TrOrbELOyNInHSg==", + "dev": true, + "requires": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "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 + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "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 + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "dev": true + }, + "catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "requires": { + "lodash": "^4.17.15" + } + }, + "chai": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "dev": true, + "requires": { + "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" + } + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" + }, + "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 + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "electron-to-chromium": { + "version": "1.4.520", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.520.tgz", + "integrity": "sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + }, + "es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "dev": true + }, + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@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" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "eslint": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "requires": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "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 + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "requires": { + "xmlcreate": "^2.0.4" + } + }, + "jsdoc": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", + "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", + "requires": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^12.2.3", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^12.3.2", + "markdown-it-anchor": "^8.4.1", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "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 + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "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, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "requires": {} + }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "dev": true, + "requires": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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 + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "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 + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "requires": { + "lodash": "^4.17.21" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.1.tgz", + "integrity": "sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shiki": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.4.tgz", + "integrity": "sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==", + "dev": true, + "requires": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "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 + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "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 + }, + "std-env": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", + "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "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, + "requires": { + "acorn": "^8.10.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "tinybench": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", + "dev": true + }, + "tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true + }, + "tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "requires": {} + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "requires": {} + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typedoc": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", + "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", + "dev": true, + "requires": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==" + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "ufo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", + "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + } + }, + "vite-node": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.4.tgz", + "integrity": "sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==", + "dev": true, + "requires": { + "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" + } + }, + "vite-tsconfig-paths": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.1.tgz", + "integrity": "sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + } + }, + "vitest": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.4.tgz", + "integrity": "sha512-SE/laOsB6995QlbSE6BtkpXDeVNLJc1u2LHRG/OpnN4RsRzM3GQm4nm3PQCK5OBtrsUqnhzLdnT7se3aeNGdlw==", + "dev": true, + "requires": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.4", + "@vitest/runner": "0.34.4", + "@vitest/snapshot": "0.34.4", + "@vitest/spy": "0.34.4", + "@vitest/utils": "0.34.4", + "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.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.4", + "why-is-node-running": "^2.2.2" + } + }, + "vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "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, + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index b568207..edcc24c 100644 --- a/package.json +++ b/package.json @@ -29,4 +29,4 @@ "jsdoc": "^4.0.2", "ts-node": "^10.9.1" } -} +} \ No newline at end of file diff --git a/src/core/Board.ts b/src/core/Board.ts index f7b2de3..452489f 100644 --- a/src/core/Board.ts +++ b/src/core/Board.ts @@ -1,13 +1,16 @@ import { CheckManager, PromotionManager, - Tile, Move, - MoveOrder + MoveType, + Player } from "@lc/core"; -import { BoardVector2d } from "@lc/geometry"; -import { Piece, PieceType } from "@lc/pieces"; -import { IllegalMoveError } from "@lc/utils"; +import { BoardVector2d, DirectionUtils, Rotation } from "@lc/geometry"; +import { Pawn, Piece, PieceType } from "@lc/pieces"; +import { IllegalMoveError, Syntax } from "@lc/utils"; +import { Lasgun } from "@lc/core"; +import { MoveCommand } from "@lc/core"; + export const enum CaptureOptions { @@ -19,10 +22,10 @@ export const enum CaptureOptions { export class Board { public readonly width: number; public readonly height: number; - private readonly tiles: Map; - private readonly piecesOfType: Map; - private readonly kingsProtectors: [Piece[], Piece[]]; + private readonly tiles: Map; + private readonly piecesOfType: Map, Set]>; private readonly movesHistory: [Move[], Move[]]; + private readonly lasguns!: [Lasgun, Lasgun]; private _lastMove: Move | null; private promotionManager?: PromotionManager; @@ -31,21 +34,14 @@ export class Board { public constructor(width: number, height: number) { this.width = width; this.height = height; - this.tiles = new Map(); - this.piecesOfType = new Map(); - this.kingsProtectors = [[], []]; + this.tiles = new Map(); + this.piecesOfType = new Map, Set]>(); this.movesHistory = [[], []]; this._lastMove = null; - for (let i = 0; i < width; i++) { - for (let j = 0; j < height; j++) { - const place: BoardVector2d = new BoardVector2d(i, j); - this.tiles.set(place, new Tile(place.copy())); - } - } - for (const item in PieceType){ + for (const item in PieceType) { const pieceType: PieceType = PieceType[item as keyof typeof PieceType]; - this.piecesOfType.set(pieceType, []); + this.piecesOfType.set(pieceType, [new Set, new Set]); } @@ -53,44 +49,45 @@ export class Board { // this.checkManager } - public getPiecesOfPlayer(playerId: number): Piece[] { - let playerPieces: Piece[] = []; + public get lastMove(): Move | null { + return this._lastMove; + } + + public getPiecesOfPlayer(playerId: number): Set { + let playerPieces: Set = new Set; for (const type in PieceType) { const pieceType: PieceType = PieceType[type as keyof typeof PieceType]; - playerPieces = playerPieces.concat(this.piecesOfType.get(pieceType)![playerId]); + playerPieces = new Set([...playerPieces, ...this.piecesOfType.get(pieceType)![playerId]]) } return playerPieces; } - - public getKingProtectors(playerId: number): Piece[] { - return this.kingsProtectors[playerId]; + + public getPiece(position: BoardVector2d): Piece | null { + return this.tiles.get(position.toString()) ?? null; + } + + public getPiecesOfType(playerId: number, pieceType: PieceType): Set { + return this.piecesOfType.get(pieceType)![playerId]; } + public isOutOfBounds(destination: BoardVector2d): boolean { return destination.x < 0 || destination.x >= this.width || destination.y < 0 || destination.y >= this.height; } - public getTile(position: BoardVector2d): Tile { - const tile: Tile | undefined = this.tiles.get(position); - if (tile === undefined) { - throw new Error("There is no tile with coordinates of passed piece."); - } - return tile; + public isPieceAt(positon: BoardVector2d): boolean { + return this.getPiece(positon) !== null; } - public getPiece(position: BoardVector2d): Piece | null { - return this.getTile(position).pieceOnTile; + public isCheckAt(/* position: BoardVector2d, playerId: number */): boolean { + return false; } - public getTileOfPiece(piece: Piece): Tile { - return this.getTile(piece.position); - } - - public isPieceAt(positon: BoardVector2d): boolean { - const tile: Tile | undefined = this.tiles.get(positon); - if (tile === undefined) { - return false; + public addPiece(piece: Piece): void { + if (this.isPieceAt(piece.position)) { + throw new Error("There is already piece at this position."); } - return tile.pieceOnTile !== undefined; + this.tiles.set(piece.position.toString(), piece); + this.piecesOfType.get(piece.type)![piece.playerId].add(piece); } public addPieces(pieces: Piece[]): void { @@ -99,31 +96,35 @@ export class Board { } } - public addPiece(piece: Piece): void { - if (this.isPieceAt(piece.position)) { - throw new Error("There is already piece at this position."); - } - - const tile: Tile = this.getTile(piece.position); - tile.pieceOnTile = piece; - - const pieceTypeArray: Piece[][] = this.piecesOfType.get(piece.type)!; - pieceTypeArray.length = Math.max(pieceTypeArray.length, piece.playerId + 1); - pieceTypeArray[piece.playerId].push(piece); + public removePiece(piece: Piece): void { + this.tiles.delete(piece.position.toString()); + this.piecesOfType.get(piece.type)![piece.playerId].delete(piece); } - public removePiece(piece: Piece): void { - const tile: Tile | undefined = this.tiles.get(piece.position); - if (tile === undefined) { - return; + public shiftPiece(origin: BoardVector2d, destination: BoardVector2d) { + const piece: Piece | null = this.getPiece(origin); + if (piece === null) { + throw new Error("Unable to shift piece. There is no piece on origin."); } - if (tile.pieceOnTile === piece) { - tile.pieceOnTile = null; + if (this.getPiece(destination) !== null) { + throw new Error("Unable to shift piece. There is already piece on destination."); } + piece.position = destination; + this.tiles.delete(origin.toString()); + this.tiles.set(destination.toString(), piece); + } + + public canRotate(rotation: Rotation, piece: Piece): boolean { + rotation; + piece; + return true; + } + + public canRangeCapture(destination: BoardVector2d, piece: Piece): boolean { + return this.canMoveTo(destination, piece, CaptureOptions.RequiredCapture); } public canMoveTo(destination: BoardVector2d, piece: Piece, capture: CaptureOptions): boolean { - // const playerId: number = piece.playerId; // Check, if position after moving is in bounds of board. @@ -135,50 +136,143 @@ export class Board { // TODO Checks - const destinationPiece: Piece | null = this.getTile(destination)!.pieceOnTile; + const destinationPiece: Piece | null = this.getPiece(destination); - if (destinationPiece === null){ - if (capture === CaptureOptions.RequiredCapture) { - return false; - } - return true; + + if (destinationPiece === null) { + return capture !== CaptureOptions.RequiredCapture; } - else if(!piece.isSameColor(destinationPiece)) { - if (capture === CaptureOptions.NoCapture) { - return false; - } - return true; + + else if (!piece.isSameColor(destinationPiece)) { + return capture !== CaptureOptions.NoCapture; } + return false; } - public getPiecesOfType(playerId: number, pieceType: PieceType): Piece[] { - return this.piecesOfType.get(pieceType)![playerId]; + + private isMoveCommandLegal(move: MoveCommand, playerId: Player): boolean { + const pieceToMove: Piece | null = this.getPiece(move.origin); + return !( + pieceToMove === null || + (move.destination !== null && move.rotation !== null) || + (move.rotation === null && move.destination === null) || + (move.destination !== null && move.rotation !== null) || + (move.rangedCapture === true && move.rotation !== null) || + (move.fireLaser === true && !this.lasguns[playerId].isLoaded()) || + !pieceToMove.isSameColor(playerId) || + (pieceToMove.type !== PieceType.KNIGHT && move.rangedCapture === true) || + (pieceToMove.type !== PieceType.MIRROR && move.rotation !== null) + ) } - public move(move: MoveOrder, /* playerId: number */): void { - // const moves: Partial[]; - const pieceToMove: Piece | null = this.getTile(move.origin).pieceOnTile; - if (pieceToMove === null) { - throw new IllegalMoveError("There is no piece") + private getSpecificMove(move: MoveCommand, playerId: number): Partial { + if (!this.isMoveCommandLegal(move, playerId)) { + throw new IllegalMoveError(`This MoveCommand is illegal with playerId equal to ${playerId}`); + } + + const pieceToMove: Piece = this.getPiece(move.origin)!; + + if (move.rangedCapture === true) { + for (const predictedMove of pieceToMove.movement.legalMoves) { + if (Syntax.inAlternative(predictedMove.moveType!, MoveType.RangedCapture) && move.destination === predictedMove.destination) { + return predictedMove; + } + } + } + + if (move.rotation !== null) { + for (const predictedMove of pieceToMove.movement.legalMoves) { + if (move.rotation === predictedMove.rotation) { + return predictedMove; + } + } } - } - public notifyPositionChange(/* origin: BoardVector2d, destination: BoardVector2d */) { + if (move.destination !== null) { + for (const predictedMove of pieceToMove.movement.legalMoves) { + if (move.destination === predictedMove.destination) { + return predictedMove; + } + } + } + throw new IllegalMoveError("Unable to perform such move."); } - public notifyRangedCapture(/* origin: BoardVector2d, destination: BoardVector2d */) { + private buildMove(piece: Piece, pieceMove: Partial, moveOrder: MoveCommand, promotedTo?: PieceType): Move { + const ultimateMove: Move = { + destination: pieceMove.destination ?? null, + moveType: pieceMove.moveType!, + rotation: pieceMove.rotation ?? null, + origin: piece.position, + piece: piece, + promotedTo: promotedTo ?? null, + captured: null, + laserFields: [new Set, new Set], + laserCaptures: new Set + } + + if (Syntax.inAlternative(ultimateMove.moveType, MoveType.EnPassant)) { + const directionVector: BoardVector2d = DirectionUtils.toBoardVector2d((piece as Pawn).direction!).opposite(); + const enemyPositon: BoardVector2d = ultimateMove.destination!.add(directionVector); + const enemyPiece: Piece = this.getPiece(enemyPositon)!; + ultimateMove.captured = enemyPiece; + } + + else if (Syntax.inAlternative(ultimateMove.moveType, MoveType.Capture)) { + const enemyPiece: Piece = this.getPiece(ultimateMove.destination!)!; + ultimateMove.captured = enemyPiece; + } + + else if (Syntax.inAlternative(ultimateMove.moveType, MoveType.RangedCapture)) { + const enemyPiece: Piece = this.getPiece(ultimateMove.destination!)!; + ultimateMove.captured = enemyPiece; + } + if (moveOrder.fireLaser === true) { + ultimateMove.moveType |= MoveType.LaserFired + } + // Laser Fields, Laser Captures, and Check Manager flags should be set here + return ultimateMove; } - public get lastMove(): Move | null { - return this._lastMove; + public fulfillMove(move: Move) { + const typesOfMove: MoveType = move.moveType; + + + move.piece.move(move); + this._lastMove = move; + this.movesHistory[move.piece.playerId].push(move); + + if (Syntax.inAlternative(typesOfMove, MoveType.RangedCapture) || Syntax.inAlternative(typesOfMove, MoveType.Capture)) { + const captured: Piece = move.captured!; + this.getPiecesOfType(captured.playerId, captured.type).delete(captured); + this.removePiece(captured); + } + + if (Syntax.inAlternative(typesOfMove, MoveType.Move)) { + this.shiftPiece(move.origin, move.destination!); + } + //TODO Laser Fields and other Move Types } - public isCheckAt(/* position: BoardVector2d, playerId: number */): boolean { - return false; + public move(move: MoveCommand, playerId: number, promotionTo?: PieceType): void { + const moveFromPiece: Partial = this.getSpecificMove(move, playerId); + + if (Syntax.inAlternative(moveFromPiece.moveType!, MoveType.Promotion) && promotionTo === undefined) { + // Return some data, that would tell gui, that selected move is legal, + // but it needs to send PieceType in promotionTo. + } + + const pieceToMove: Piece = this.getPiece(move.origin)!; + const moveToAnalyze: Move = this.buildMove(pieceToMove, moveFromPiece, move); + + this.fulfillMove(moveToAnalyze); } - + + + + } \ No newline at end of file diff --git a/src/core/CheckManager.ts b/src/core/CheckManager.ts index 8db1a07..c46cb7d 100644 --- a/src/core/CheckManager.ts +++ b/src/core/CheckManager.ts @@ -5,7 +5,7 @@ import { Piece, PieceType, King } from "@lc/pieces"; export class CheckManager { public board: Board; - + public constructor(board: Board) { this.board = board; } diff --git a/src/core/Lasgun.ts b/src/core/Lasgun.ts index 68ac661..d0e8d3e 100644 --- a/src/core/Lasgun.ts +++ b/src/core/Lasgun.ts @@ -1,6 +1,11 @@ import { Board } from "@lc/core"; import { BoardVector2d, Direction } from "@lc/geometry"; +export const enum LaserState { + LaserFired = 1 << 0, + LaserSustained = 1 << 1, + LaserOff = 1 << 2 +} export class Lasgun { private _maxToCharge?: number; @@ -38,7 +43,10 @@ export class Lasgun { public get currentCharge(): number { return this.currentCharge; } - + + public get laserState(): LaserState { + return LaserState.LaserFired; + } public propagateLaser() { // TODO diff --git a/src/core/Player.ts b/src/core/Player.ts new file mode 100644 index 0000000..5b0b2d7 --- /dev/null +++ b/src/core/Player.ts @@ -0,0 +1,4 @@ +export const enum Player { + White = 0, + Black = 1 +} diff --git a/src/core/PromotionManager.ts b/src/core/PromotionManager.ts index 56ed5f9..09073aa 100644 --- a/src/core/PromotionManager.ts +++ b/src/core/PromotionManager.ts @@ -1,3 +1,3 @@ export class PromotionManager { - + } diff --git a/src/core/Tile.ts b/src/core/Tile.ts index da7db38..faa9d1d 100644 --- a/src/core/Tile.ts +++ b/src/core/Tile.ts @@ -1,80 +1,82 @@ import { BoardVector2d } from "@lc/geometry"; import { Piece } from "@lc/pieces"; +import { Syntax } from "@lc/utils"; -export enum MovesPredictionsType { - All = 1 << 0, - Legal = 1 << 1, - Capturable = 1 << 2 +export const enum MovesPredictionsType { + Legal = 1 << 1, + Illegal = 1 << 2 } export class Tile { - + private _coordinates: BoardVector2d; - private inMovesAllOf: Set[]; - private inMovesLegalOf: Set[]; - private inMovesCapturableOf: Set[]; - private setHashMap: Map[]>; + private inMovesLegalOf: [Set, Set]; + private inMovesIllegalOf: [Set, Set]; public pieceOnTile: Piece | null; - + public constructor(coordinates: BoardVector2d) { this._coordinates = coordinates; - this.inMovesAllOf = [new Set(), new Set()]; this.inMovesLegalOf = [new Set(), new Set()]; - this.inMovesCapturableOf = [new Set(), new Set()]; - this.setHashMap = new Map[]>( - [ - [MovesPredictionsType.All, this.inMovesAllOf], - [MovesPredictionsType.Legal, this.inMovesLegalOf], - [MovesPredictionsType.Capturable, this.inMovesCapturableOf], - ] - ) + this.inMovesIllegalOf = [new Set(), new Set()]; this.pieceOnTile = null; } public get coordinates(): BoardVector2d { return this._coordinates; } - + + public clearAllPredictions(): void { + for (let i = 0; i < 1; i++) { + this.inMovesIllegalOf[i].clear(); + this.inMovesLegalOf[i].clear(); + } + } + public addPieceMovesToTile(piece: Piece, movePredictionsType: MovesPredictionsType): void { - for (const item in MovesPredictionsType){ - const movesEnumValue: MovesPredictionsType = MovesPredictionsType[item as keyof typeof MovesPredictionsType] - if ((movePredictionsType & movesEnumValue) === movesEnumValue) { - this.setHashMap.get(movesEnumValue)![piece.playerId].add(piece); - } + if (Syntax.inAlternative(movePredictionsType, MovesPredictionsType.Illegal)) { + this.inMovesIllegalOf[piece.playerId].add(piece); + } + if (Syntax.inAlternative(movePredictionsType, MovesPredictionsType.Legal)) { + this.inMovesLegalOf[piece.playerId].add(piece); } } public removePieceMovesFromTile(piece: Piece, movePredictionsType: MovesPredictionsType): void { - for (const item in MovesPredictionsType){ - const movesEnumValue: MovesPredictionsType = MovesPredictionsType[item as keyof typeof MovesPredictionsType] - if ((movePredictionsType & movesEnumValue) === movesEnumValue) { - this.setHashMap.get(movesEnumValue)![piece.playerId].delete(piece); - } + if (Syntax.inAlternative(movePredictionsType, MovesPredictionsType.Illegal)) { + this.inMovesIllegalOf[piece.playerId].delete(piece); + } + if (Syntax.inAlternative(movePredictionsType, MovesPredictionsType.Legal)) { + this.inMovesLegalOf[piece.playerId].delete(piece); } - this.checkIfPieceMovesInTile(piece, MovesPredictionsType.All | MovesPredictionsType.Capturable) } public checkIfPieceMovesInTile(piece: Piece, movePredictionsType: MovesPredictionsType): boolean { - for (const item in MovesPredictionsType){ - const movesEnumValue: MovesPredictionsType = MovesPredictionsType[item as keyof typeof MovesPredictionsType] - if ((movePredictionsType & movesEnumValue) === movesEnumValue) { - return this.setHashMap.get(movesEnumValue)![piece.playerId].has(piece); - } + if (Syntax.inAlternative(movePredictionsType, MovesPredictionsType.Illegal)) { + return this.inMovesIllegalOf[piece.playerId].has(piece); + } + if (Syntax.inAlternative(movePredictionsType, MovesPredictionsType.Legal)) { + return this.inMovesLegalOf[piece.playerId].has(piece); } return false; } - public isPieceMovesEmpty(playerId: number, movePredictionsType: MovesPredictionsType): boolean{ - return this.setHashMap.get(movePredictionsType)![playerId].size === 0; + public isPieceMovesEmpty(playerId: number, movePredictionsType: MovesPredictionsType): boolean { + if (Syntax.inAlternative(movePredictionsType, MovesPredictionsType.Illegal)) { + return this.inMovesIllegalOf[playerId].size === 0; + } + if (Syntax.inAlternative(movePredictionsType, MovesPredictionsType.Legal)) { + return this.inMovesLegalOf[playerId].size === 0; + } + return true; } public getPieceMovesOfTile(playerId: number, movePredictionsType: MovesPredictionsType) { let piecesSet: Set = new Set; - for (const item in MovesPredictionsType){ - const movesEnumValue: MovesPredictionsType = MovesPredictionsType[item as keyof typeof MovesPredictionsType] - if ((movePredictionsType & movesEnumValue) === movesEnumValue) { - piecesSet = new Set([...piecesSet, ...this.setHashMap.get(movesEnumValue)![playerId]]) - } + if (Syntax.inAlternative(movePredictionsType, MovesPredictionsType.Illegal)) { + piecesSet = new Set(this.inMovesIllegalOf[playerId]); + } + if (Syntax.inAlternative(movePredictionsType, MovesPredictionsType.Legal)) { + piecesSet = new Set([...this.inMovesIllegalOf[playerId], ...this.inMovesLegalOf[playerId]]); } return piecesSet; } diff --git a/src/core/index.ts b/src/core/index.ts index 245e3f8..8d8251d 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -2,5 +2,8 @@ export { Game } from "../game.js"; export { Board, CaptureOptions } from "./Board.js"; export { CheckManager } from "./CheckManager.js"; export { PromotionManager } from "./PromotionManager.js"; -export { MoveType, Move, MoveOrder } from "./move.js"; +export { MoveType, Move, MoveCommand } from "./move.js"; export { Tile, MovesPredictionsType } from "./Tile.js"; +export { Lasgun } from "./Lasgun.js"; +export * as Generator from "./piece_generator.js"; +export { Player } from "./Player.js"; \ No newline at end of file diff --git a/src/core/move.ts b/src/core/move.ts index a4b716a..b812baf 100644 --- a/src/core/move.ts +++ b/src/core/move.ts @@ -2,36 +2,40 @@ import { BoardVector2d, Rotation } from "@lc/geometry"; import { Piece, PieceType } from "@lc/pieces"; export const enum MoveType { - Move = 1 << 0, - Capture = 1 << 1, - RangedCapture = 1 << 2, - EnPassant = 1 << 3, - KingSideCastling = 1 << 4, + Move = 1 << 0, + Capture = 1 << 1, + RangedCapture = 1 << 2, + EnPassant = 1 << 3, + KingSideCastling = 1 << 4, QueenSideCastling = 1 << 5, - Rotation = 1 << 6, - Promotion = 1 << 7, - Check = 1 << 8, - Checkmate = 1 << 9, - Stalemate = 1 << 10, - Draw = 1 << 11, - Lasermate = 1 << 12, - LaserFired = 1 << 13, - LaserCooldown = 1 << 14 + Rotation = 1 << 6, + Promotion = 1 << 7, + + LaserFired = 1 << 8, + Checkmate = 1 << 9, + Stalemate = 1 << 10, + Lasermate = 1 << 11, + Draw = 1 << 12, + Check = 1 << 13, } export interface Move { - origin: BoardVector2d, - destination: BoardVector2d, + destination: BoardVector2d | null, moveType: MoveType, - rotation: Rotation | null + rotation: Rotation | null, + + origin: BoardVector2d, promotedTo: PieceType | null piece: Piece, captured: Piece | null, + laserFields: [Set, Set], + laserCaptures: Set } -export interface MoveOrder { +export interface MoveCommand { origin: BoardVector2d, destination: BoardVector2d | null, fireLaser: boolean, - rotation: Rotation | null + rotation: Rotation | null, + rangedCapture: boolean } diff --git a/src/core/piece_generator.ts b/src/core/piece_generator.ts new file mode 100644 index 0000000..0ca2e07 --- /dev/null +++ b/src/core/piece_generator.ts @@ -0,0 +1,59 @@ +import { + PieceType, + Piece, + King, + Queen, + Knight, + Mirror, + Pawn, + Bishop, + Rook +} from "@lc/pieces"; +import { BoardVector2d, Direction } from "@lc/geometry"; +import { Board } from "@lc/core"; + +export interface StandardPieceData { + position: BoardVector2d, + playerId: number, + board: Board +} + +export interface DirectedPieceData extends StandardPieceData { + direction: Direction, +} + +export interface PawnPieceData extends DirectedPieceData { + enPassantPosition: BoardVector2d, + promotionPosition: BoardVector2d +} + +export function createStandardPiece(pieceData: StandardPieceData, type: PieceType): Piece { + switch (type) { + case PieceType.KING: + return new King(pieceData.position, pieceData.playerId, pieceData.board); + case PieceType.QUEEN: + return new Queen(pieceData.position, pieceData.playerId, pieceData.board); + case PieceType.BISHOP: + return new Bishop(pieceData.position, pieceData.playerId, pieceData.board); + case PieceType.ROOK: + return new Rook(pieceData.position, pieceData.playerId, pieceData.board); + case PieceType.KNIGHT: + return new Knight(pieceData.position, pieceData.playerId, pieceData.board); + } + throw new Error("Unable to create this type of piece using PieceGenerator.createStandardPiece.") +} + +export function createMirror(pieceData: DirectedPieceData): Mirror { + const piece: Mirror = new Mirror(pieceData.position, pieceData.playerId, pieceData.board); + piece.direction = pieceData.direction; + return piece; +} + +export function createPawn(pieceData: PawnPieceData): Pawn { + const piece: Pawn = new Pawn(pieceData.position, pieceData.playerId, pieceData.board); + piece.direction = pieceData.direction; + piece.enPassantPosition = pieceData.enPassantPosition; + piece.promotionPosition = pieceData.promotionPosition; + return piece; +} + diff --git a/src/game.ts b/src/game.ts index baf3db3..09289e4 100644 --- a/src/game.ts +++ b/src/game.ts @@ -1,17 +1,24 @@ -import { Board } from "@lc/core"; +import { Board, MoveCommand } from "@lc/core"; export class Game { private _currentPlayer: number; private _board?: Board; - public constructor(){ + public constructor() { this._currentPlayer = 0; } - public set board(board: Board){ + public set board(board: Board) { this._board = board; } + public get board(): Board { + if (this._board === undefined) { + throw new Error("Board is undefined."); + } + return this._board; + } + public get currentPlayer(): number { return this._currentPlayer; } @@ -20,8 +27,8 @@ export class Game { return (playerId + 1) % 2; } - public move(/* move: MoveOrder */): void { - // this._board!.move(move, this._currentPlayer); + public move(move: MoveCommand): void { + this.board.move(move, this._currentPlayer); this._currentPlayer = Game.getEnemyId(this._currentPlayer); } diff --git a/src/geometry/Direction.ts b/src/geometry/Direction.ts index 43ec30a..c8866f5 100644 --- a/src/geometry/Direction.ts +++ b/src/geometry/Direction.ts @@ -1,118 +1,15 @@ -import { BoardVector2d } from "@lc/geometry"; - export enum Direction { - LeftRank = 0, - UpperLeftDiagonal = 1, - UpperFile = 2, - UpperRightDiagonal = 3, - RightRank = 4, + LeftRank = 0, + UpperLeftDiagonal = 1, + UpperFile = 2, + UpperRightDiagonal = 3, + RightRank = 4, BottomRightDiagonal = 5, - BottomFile = 6, - BottomLeftDiagonal = 7 + BottomFile = 6, + BottomLeftDiagonal = 7, } export const enum Rotation { - Clockwise = 0, - Anticlockwise = 1 + Clockwise = 0, + Anticlockwise = 1 } - -export namespace Direction { - - export function turnLeft(direction: Direction): Direction { - return (direction.valueOf() + 7) % 8 as Direction; - } - - export function turnRight(direction: Direction): Direction { - return (direction.valueOf() + 1) % 8 as Direction; - } - - export function turnDoubleLeft(direction: Direction): Direction { - return turnLeft(turnLeft(direction)) as Direction; - } - - export function turnDoubleRight(direction: Direction): Direction { - return turnRight(turnRight(direction)) as Direction; - } - - export function turnByStep(direction: Direction, turnNumber: number): Direction { - if (turnNumber >= 0) { - return (direction.valueOf() + turnNumber) % 8 as Direction; - } - else { - const turnsLeft = Math.abs(turnNumber) - direction.valueOf(); - if (turnsLeft < 0) { - return Math.abs(turnsLeft) as Direction; - } - return 7 - (turnsLeft % 8) as Direction; - } - } - - export function createFrom(coordinates: BoardVector2d | [number, number]): Direction { - if (coordinates instanceof BoardVector2d) { - coordinates = coordinates.toTuple(); - } - switch (coordinates.join(", ")) { - case "-1, 0": - return Direction.LeftRank; - case "1, 0": - return Direction.RightRank; - case "0, 1": - return Direction.UpperFile; - case "0, -1": - return Direction.BottomFile; - case "-1, 1": - return Direction.UpperLeftDiagonal; - case "1, 1": - return Direction.UpperRightDiagonal; - case "1, -1": - return Direction.BottomRightDiagonal; - case "-1, -1": - return Direction.BottomLeftDiagonal; - default: - throw new Error("Wrong value of vector") - } - } - - - export function toTuple(direction: Direction): [number, number] { - switch (direction) { - case Direction.LeftRank: - return [-1, 0] - case Direction.RightRank: - return [1, 0] - case Direction.UpperFile: - return [0, 1] - case Direction.BottomFile: - return [0, -1] - case Direction.UpperLeftDiagonal: - return [-1, 1] - case Direction.UpperRightDiagonal: - return [1, 1] - case Direction.BottomRightDiagonal: - return [1, -1] - case Direction.BottomLeftDiagonal: - return [-1, -1] - } - } - - export function toBoardVector2d(direction: Direction): BoardVector2d { - switch (direction) { - case Direction.LeftRank: - return new BoardVector2d(-1, 0); - case Direction.RightRank: - return new BoardVector2d(1, 0) - case Direction.UpperFile: - return new BoardVector2d(0, 1) - case Direction.BottomFile: - return new BoardVector2d(0, -1) - case Direction.UpperLeftDiagonal: - return new BoardVector2d(-1, 1) - case Direction.UpperRightDiagonal: - return new BoardVector2d(1, 1) - case Direction.BottomRightDiagonal: - return new BoardVector2d(1, -1) - case Direction.BottomLeftDiagonal: - return new BoardVector2d(-1, -1) - } - } -} \ No newline at end of file diff --git a/src/geometry/DirectionUtils.ts b/src/geometry/DirectionUtils.ts new file mode 100644 index 0000000..d02d3bf --- /dev/null +++ b/src/geometry/DirectionUtils.ts @@ -0,0 +1,106 @@ +import { BoardVector2d, Direction } from "@lc/geometry"; + +export function rotate(direction: Direction, steps: number): Direction { + const enumSize = Object.keys(Direction).length / 2; + if (steps >= 0) { + return (direction + steps) % enumSize as Direction; + } + else { + const notNormalizedDirection = direction + steps; + if (notNormalizedDirection > 0) { + return notNormalizedDirection; + } + const rest = Math.abs(notNormalizedDirection) % enumSize; + const normalizedDirection = enumSize - rest; + return normalizedDirection; + } +} + +export function rotateClockwise(direction: Direction): Direction { + return rotate(direction, 1); +} + +export function rotateAnticlockwise(direction: Direction): Direction { + return rotate(direction, -1); +} + +export function rotateDoubleClockwise(direction: Direction): Direction { + return rotate(direction, 2); +} + +export function rotateDoubleAnticlockwise(direction: Direction): Direction { + return rotate(direction, -2); +} + +export function fromCoordinates(coordinates: BoardVector2d | [number, number]): Direction { + if (coordinates instanceof BoardVector2d) { + coordinates = coordinates.toTuple(); + } + + switch (coordinates.join(", ")) { + case "-1, 0": + return Direction.LeftRank; + case "1, 0": + return Direction.RightRank; + case "0, 1": + return Direction.UpperFile; + case "0, -1": + return Direction.BottomFile; + case "-1, 1": + return Direction.UpperLeftDiagonal; + case "1, 1": + return Direction.UpperRightDiagonal; + case "1, -1": + return Direction.BottomRightDiagonal; + case "-1, -1": + return Direction.BottomLeftDiagonal; + default: + throw new Error(`Invalid coordinates '${coordinates}'`); + } +} + +export function toTuple(direction: Direction): [number, number] { + switch (direction) { + case Direction.LeftRank: + return [-1, 0]; + case Direction.RightRank: + return [1, 0]; + case Direction.UpperFile: + return [0, 1]; + case Direction.BottomFile: + return [0, -1]; + case Direction.UpperLeftDiagonal: + return [-1, 1]; + case Direction.UpperRightDiagonal: + return [1, 1]; + case Direction.BottomRightDiagonal: + return [1, -1]; + case Direction.BottomLeftDiagonal: + return [-1, -1]; + default: + throw new Error("Invalid direction"); + } +} + +export function toBoardVector2d(direction: Direction): BoardVector2d { + switch (direction) { + case Direction.LeftRank: + return new BoardVector2d(-1, 0); + case Direction.RightRank: + return new BoardVector2d(1, 0); + case Direction.UpperFile: + return new BoardVector2d(0, 1); + case Direction.BottomFile: + return new BoardVector2d(0, -1); + case Direction.UpperLeftDiagonal: + return new BoardVector2d(-1, 1); + case Direction.UpperRightDiagonal: + return new BoardVector2d(1, 1); + case Direction.BottomRightDiagonal: + return new BoardVector2d(1, -1); + case Direction.BottomLeftDiagonal: + return new BoardVector2d(-1, -1); + default: + throw new Error("Invalid direction"); + } +} diff --git a/src/geometry/Vector2d.ts b/src/geometry/Vector2d.ts index d82ed2e..de6b5f7 100644 --- a/src/geometry/Vector2d.ts +++ b/src/geometry/Vector2d.ts @@ -1,4 +1,4 @@ -import { Direction } from "@lc/geometry"; +import { Direction, DirectionUtils } from "@lc/geometry"; import { Integer } from "@lc/utils"; import { Board } from "@lc/core"; @@ -10,9 +10,9 @@ import { Board } from "@lc/core"; */ export const enum Symmetry { Origin = 0, - XAxis = 1, - YAxis = 2, - None = 3 + XAxis = 1, + YAxis = 2, + None = 3 } /** @@ -50,7 +50,7 @@ export class Vector2d { * It has to be done in order to ensure that subclass * will return its instance and not superclass instance. * - * @summary Method creates new `Vector2d` object. Shoudl be overriden by + * @summary Method creates new `Vector2d` object. Should be overriden by * subclass to return its instance. * @param {number} x - `number` that is ment to be first coordinate. * @param {number} y - `number` that is ment to be second coordinate. @@ -103,7 +103,7 @@ export class Vector2d { if (!(other instanceof Vector2d)) { return false; } - return this.x == other.x && this.y == other.y; + return this.x === other.x && this.y === other.y; } /** @@ -111,8 +111,8 @@ export class Vector2d { * @param {Vector2d} other - `Vector2d` object to be added to calling object of `Vector2d`. * @returns {Vector2d} New `Vector2d` object created by addition of two `Vector2d` objects. */ - public add(other: Vector2d): T { - return this.createVector(this.x + other.x, this.y + other.y) as T; + public add(other: Vector2d): typeof this { + return this.createVector(this.x + other.x, this.y + other.y) as typeof this; } /** @@ -120,8 +120,8 @@ export class Vector2d { * @param {Vector2d} other - `Vector2d` object to be substracted from calling object of `Vector2d`. * @returns {Vector2d} New `Vector2d` object created by substraction of two `Vector2d` objects. */ - public sub(other: Vector2d): T { - return this.createVector(this.x - other.x, this.y - other.y) as T + public sub(other: Vector2d): typeof this { + return this.createVector(this.x - other.x, this.y - other.y) as typeof this; } /** @@ -139,11 +139,11 @@ export class Vector2d { * @returns {Vector2d} - New `Vector2d` object created by substraction of two `Vector2d` objects, or `Vector2d` * object and `number`. */ - public mul(other: Vector2d | number): T { + public mul(other: Vector2d | number): typeof this { if (other instanceof Vector2d) { - return this.createVector(this.x * other.x, this.y * other.y) as T; + return this.createVector(this.x * other.x, this.y * other.y) as typeof this; } - return this.createVector(this.x * other, this.y * other) as T; + return this.createVector(this.x * other, this.y * other) as typeof this; } /** * Method performs dividing operation of two `Vector2d` objects, @@ -162,7 +162,7 @@ export class Vector2d { * @returns {Vector2d} - New `Vector2d` object created by division of two `Vector2d` objects, or `Vector2d` * object and `number`. */ - public div(other: Vector2d | number): T { + public div(other: Vector2d | number): typeof this { if (other instanceof Vector2d) { if (other.x == 0) { throw new Error("First (x) coordinate of divider vector is equal to 0."); @@ -170,12 +170,12 @@ export class Vector2d { if (other.y == 0) { throw new Error("Second (y) coordinate of divider vector is equal to 0."); } - return this.createVector(this.x / other.x, this.y / other.y) as T; + return this.createVector(this.x / other.x, this.y / other.y) as typeof this; } if (other === 0) { throw new Error("Divider is equal to 0"); } - return this.createVector(this.x / other, this.y / other) as T; + return this.createVector(this.x / other, this.y / other) as typeof this; } /** * Method returns `Vector2d` object opposite to calling object. @@ -183,8 +183,8 @@ export class Vector2d { * * @returns New `Vector2d` object created by negating calling object coordinates. */ - public opposite(): T { - return this.createVector(-this.x, -this.y) as T; + public opposite(): typeof this { + return this.createVector(-this.x, -this.y) as typeof this; } /** @@ -192,8 +192,8 @@ export class Vector2d { * * @returns New `Vector2d` object that is copy of calling object. */ - public copy(): T { - return this.createVector(this.x, this.y) as T; + public copy(): typeof this { + return this.createVector(this.x, this.y) as typeof this; } /** @@ -208,14 +208,14 @@ export class Vector2d { * @param {Symmetry} symmetry - {@linkcode Symmetry} enum to be used to create new object. * @returns */ - public applySymmetry(symmetry: Symmetry): T { + public applySymmetry(symmetry: Symmetry): typeof this { switch (symmetry) { case Symmetry.Origin: return this.opposite(); case Symmetry.XAxis: - return this.createVector(this.x, -this.y) as T; + return this.createVector(this.x, -this.y) as typeof this; case Symmetry.YAxis: - return this.createVector(-this.x, this.y) as T; + return this.createVector(-this.x, this.y) as typeof this; case Symmetry.None: return this.copy(); } @@ -226,8 +226,8 @@ export class Vector2d { * * @returns New `Vector2d` object with swapped coordinates. */ - public reverseAxis(): T { - return this.createVector(this.y, this.x) as T; + public reverseAxis(): typeof this { + return this.createVector(this.y, this.x) as typeof this; } /** @@ -236,7 +236,7 @@ export class Vector2d { * @returns `Number` that represents length of vector. */ public getLength(): number { - return Math.sqrt(this.x*this.x+this.y*this.y); + return Math.sqrt(this.x * this.x + this.y * this.y); } /** @@ -246,12 +246,12 @@ export class Vector2d { * * @returns `Vector2d` object that is {@link https://en.wikipedia.org/wiki/Unit_vector unit vector}. */ - public createUnitVector(): T { + public createUnitVector(): typeof this { return this.div(this.getLength()); } - + } @@ -286,8 +286,8 @@ export class IntVector2d extends Vector2d { * @param {number} y - `number` that is ment to be second coordinate. * @returns {IntVector2d} New `IntVector2d` object created with given coordinates. */ - protected createVector(x: number, y: number): T { - return new IntVector2d(x, y) as unknown as T; + protected createVector(x: number, y: number): IntVector2d { + return new IntVector2d(x, y); } /** @@ -295,8 +295,19 @@ export class IntVector2d extends Vector2d { * * @returns New `IntVector2d` object that is copy of calling object. */ - public copy(): T { - return this.createVector(this.x, this.y) + public copy(): typeof this { + return this.createVector(this.x, this.y) as typeof this + } + + /** + * Method creates new `IntVector2d` object from tuple. + * first element of tuple if first coordinate, second element + * is second coordinate. + * @param {[number, number]} coordinates Tuple of numbers to be used for coordinates. + * @returns New `IntVector2d` object created from `coordinates`. + */ + public static fromTuple(coordinates: [number, number]): IntVector2d { + return new IntVector2d(coordinates[0], coordinates[1]); } /** @@ -313,35 +324,35 @@ export class IntVector2d extends Vector2d { return this.x == other.x && this.y == other.y; } - /** - * Method creates new `IntVector2d` object that is - * {@link https://en.wikipedia.org/wiki/Unit_vector unit vector} - * of calling object. This method differs from {@link Vector2d.createUnitVector}, - * as it creates new `IntVector2d` with one coordinate equal to 0, and one equal - * to -1 or 1. In most cases, new object have certain coordinate equal to 1 or -1, if this - * coordinate had greater absolute value than other coordinate of calling object. - * If absolute values of both coordinates of calling object are equal, then - * `prioritizeAxisY` decides which coordinate is more important(, by default - * more important is x axis). - * - * @summary Method creates new `IntVector2d` object that is - * {@link https://en.wikipedia.org/wiki/Unit_vector unit vector} - * of calling object. - * @param {boolean} prioritizeAxisY - bool value that decides which axis should be considered - * as more important, when absolute value of coordinates is equal. - * @returns `IntVector2d` object that is {@link https://en.wikipedia.org/wiki/Unit_vector unit vector}. - */ - public createUnitVector(prioritizeAxisY?: boolean): T { + /** + * Method creates new `IntVector2d` object that is + * {@link https://en.wikipedia.org/wiki/Unit_vector unit vector} + * of calling object. This method differs from {@link Vector2d.createUnitVector}, + * as it creates new `IntVector2d` with one coordinate equal to 0, and one equal + * to -1 or 1. In most cases, new object have certain coordinate equal to 1 or -1, if this + * coordinate had greater absolute value than other coordinate of calling object. + * If absolute values of both coordinates of calling object are equal, then + * `prioritizeAxisY` decides which coordinate is more important(, by default + * more important is x axis). + * + * @summary Method creates new `IntVector2d` object that is + * {@link https://en.wikipedia.org/wiki/Unit_vector unit vector} + * of calling object. + * @param {boolean} prioritizeAxisY - bool value that decides which axis should be considered + * as more important, when absolute value of coordinates is equal. + * @returns `IntVector2d` object that is {@link https://en.wikipedia.org/wiki/Unit_vector unit vector}. + */ + public createUnitVector(prioritizeAxisY?: boolean): typeof this { if (Math.abs(this.x) === Math.abs(this.y)) { - if (typeof prioritizeAxisY === "undefined" || prioritizeAxisY === true) { - return this.createVector(0, Math.sign(this.y)); + if (prioritizeAxisY !== undefined || prioritizeAxisY === true) { + return this.createVector(0, Math.sign(this.y)) as typeof this; } - return this.createVector(Math.sign(this.x), 0); + return this.createVector(Math.sign(this.x), 0) as typeof this; } if (Math.abs(this.x) > Math.abs(this.y)) { - return this.createVector(Math.sign(this.x), 0); + return this.createVector(Math.sign(this.x), 0) as typeof this; } - return this.createVector(0, Math.sign(this.y)); + return this.createVector(0, Math.sign(this.y)) as typeof this; } } @@ -363,8 +374,8 @@ export class BoardVector2d extends IntVector2d { * @param {number} y - `number` that is ment to be second coordinate. * @returns {IntVector2d} New `BoardVector2d` object created with given coordinates. */ - protected createVector(x: number, y: number): T { - return new BoardVector2d(x, y) as unknown as T; + protected createVector(x: number, y: number): BoardVector2d { + return new BoardVector2d(x, y); } /** @@ -451,10 +462,30 @@ export class BoardVector2d extends IntVector2d { * * @returns New `BoardVector2d` object that is copy of calling object. */ - public copy(): T { - return this.createVector(this.x, this.y) as T; + public copy(): typeof this { + return this.createVector(this.x, this.y) as typeof this; } + /** + * Method creates new `BoardVector2d` object from tuple. + * first element of tuple if first coordinate, second element + * is second coordinate. + * @param {[number, number]} coordinates Tuple of numbers to be used for coordinates. + * @returns New `BoardVector2d` object created from `coordinates`. + */ + public static fromTuple(coordinates: [number, number]): BoardVector2d { + return new BoardVector2d(coordinates[0], coordinates[1]); + } + + /** + * Method creates array of `BoardVector2d` objects. First element of this array is copy of calling + * object. Following objects are created by adding multiples of `increment` values to calling object. + * + * @param {[number, number]} increment Tuple consisting of two integers that inform about direction + * in which new `BoardVector2d` should be propagated. + * @param board Instance of `Board` which sets up boundaries for moving. + * @returns Array of `BoardVector2d` created from calling object with direction given by `increment`. + */ public getDirectedMoveFromTuple(increment: [number, number], board: Board): BoardVector2d[] { const x: number = increment[0]; const y: number = increment[1]; @@ -465,12 +496,12 @@ export class BoardVector2d extends IntVector2d { const xCoordinates: number[] = []; const yCoordinates: number[] = []; if (x !== 0) { - for (let i = this.x; i < (x > 0 ? board.width : -1); i += x) { + for (let i = this.x; x > 0 ? i < board.width : i > -1; i += x) { xCoordinates.push(i); } } if (y !== 0) { - for (let i = this.y; i < (y > 0 ? board.width : -1); i += y) { + for (let i = this.y; y > 0 ? i < board.width : i > -1; i += y) { yCoordinates.push(i); } } @@ -486,16 +517,22 @@ export class BoardVector2d extends IntVector2d { } const moves: BoardVector2d[] = []; - for (const x of xCoordinates) { - for (const y of yCoordinates) { - moves.push(new BoardVector2d(x, y)); - } + const length: number = Math.min(xCoordinates.length, yCoordinates.length); + for (let i = 0; i < length; i++) { + moves.push(new BoardVector2d(xCoordinates[i], yCoordinates[i])); } return moves; } - + /** + * Method works the same as {@link BoardVector2d.getDirectedMoveFromTuple}, but accepts `Direction` + * enum instead of tuple of `numbers`. + * @param {Direction} direction `Direction` enum that indicates direction in which new `BoardVector2d` + * should be propagated. + * @param {Board} board Instance of `Board` which sets up boundaries for moving. + * @returns + */ public getSqares(direction: Direction, board: Board): BoardVector2d[] { - return this.getDirectedMoveFromTuple(Direction.toTuple(direction), board); + return this.getDirectedMoveFromTuple(DirectionUtils.toTuple(direction), board); } } diff --git a/src/geometry/index.ts b/src/geometry/index.ts index df2a8f8..31db3f8 100644 --- a/src/geometry/index.ts +++ b/src/geometry/index.ts @@ -5,3 +5,4 @@ export { BoardVector2d } from "./Vector2d.js"; export { Direction, Rotation } from "./Direction.js"; +export * as DirectionUtils from "./DirectionUtils.js"; diff --git a/src/pieces/Bishop.ts b/src/pieces/Bishop.ts index e69de29..97f07be 100644 --- a/src/pieces/Bishop.ts +++ b/src/pieces/Bishop.ts @@ -0,0 +1,17 @@ +import { Direction } from "@lc/geometry"; +import { Piece, PieceType } from "@lc/pieces"; +import { LongRangeMovement } from "@lc/piece-movements"; + +export class Bishop extends Piece { + public static DIRECTIONS = [ + Direction.UpperRightDiagonal, + Direction.BottomRightDiagonal, + Direction.BottomLeftDiagonal, + Direction.UpperLeftDiagonal + ]; + + protected override initType(): void { + this._type = PieceType.BISHOP; + this._movement = new LongRangeMovement(this, this.board, Bishop.DIRECTIONS); + } +} diff --git a/src/pieces/DirectedPiece.ts b/src/pieces/DirectedPiece.ts index 9c0e0a5..0699c96 100644 --- a/src/pieces/DirectedPiece.ts +++ b/src/pieces/DirectedPiece.ts @@ -4,7 +4,10 @@ import { Piece } from "@lc/pieces"; export abstract class DirectedPiece extends Piece { protected _direction?: Direction; - public get direction(): Direction | undefined { + public get direction(): Direction { + if (this._direction === undefined) { + throw new Error("Direction is undeifned."); + } return this._direction; } } diff --git a/src/pieces/King.ts b/src/pieces/King.ts index c67f334..4fe16e2 100644 --- a/src/pieces/King.ts +++ b/src/pieces/King.ts @@ -2,41 +2,24 @@ import { MoveType, CaptureOptions, Move } from "@lc/core"; import { BoardVector2d } from "@lc/geometry"; import { Piece, PieceType } from "@lc/pieces"; import { CloseRangeMovement } from "@lc/piece-movements"; -import { ObjectUtilities } from "@lc/utils"; export class King extends Piece { - private _kingRook?: Piece; - private _queenRook?: Piece; + public kingRook?: Piece; + public queenRook?: Piece; protected override initType(): void { this._type = PieceType.KING; - this._movement = new KingMovement(this, this.board); + this._movement = new KingMovement(this, this.board); } - public set kingRook(rook: Piece) { - this._kingRook = this.kingRook; - } - - public set queenRook(rook: Piece) { - this._queenRook = this.kingRook; - } - - public get kingRook(): Piece { - return this._kingRook!; - } - - public get queenRook(): Piece { - return this._queenRook!; - } - } export class KingMovement extends CloseRangeMovement { public isCastlingLegal(castling: MoveType): boolean { - let potentialRook: Piece; + let potentialRook: Piece | undefined; const piece: King = this.piece as King; if (castling === MoveType.KingSideCastling) { potentialRook = piece.kingRook; @@ -47,7 +30,11 @@ export class KingMovement extends CloseRangeMovement { else { return false; } - + + if (potentialRook === undefined) { + return false; + } + if ( potentialRook.type === PieceType.ROOK && !potentialRook.wasMoved() @@ -57,9 +44,6 @@ export class KingMovement extends CloseRangeMovement { let currentPosition: BoardVector2d = this.piece.position; for (let i = 0; i < 2; i++) { - // if (this.board.isCheckAt(currentPosition, this.piece.playerId)) { - // return false; - // } currentPosition = currentPosition.add(fromKingUnitVector); } @@ -75,24 +59,31 @@ export class KingMovement extends CloseRangeMovement { return false; } - protected updateMovesWrapped(): void { + public updateMoves(): void { super.updateMoves(); - if (this.isCastlingLegal(MoveType.KingSideCastling)) { - const move: Partial = { - destination: this.piece.position.add(new BoardVector2d(2, 0)) as BoardVector2d, - moveType: MoveType.Move & MoveType.KingSideCastling - } - this.legalMoves.push(move) - this.allMoves.push(ObjectUtilities.deepCopy(move)); - } - else if (this.isCastlingLegal(MoveType.QueenSideCastling)) { - const move: Partial = { - destination: this.piece.position.add(new BoardVector2d(-2, 0)) as BoardVector2d, - moveType: MoveType.Move & MoveType.KingSideCastling - } - this.legalMoves.push(move) - this.allMoves.push(ObjectUtilities.deepCopy(move)); - } + // let move: Partial = { + // destination: this.piece.position.add(new BoardVector2d(2, 0)) as BoardVector2d, + // moveType: MoveType.Move | MoveType.KingSideCastling + // } + + // if (this.isCastlingLegal(MoveType.KingSideCastling)) { + // this.legalMoves.push(move); + // } + // else { + // this.illegalMoves.push(move); + // } + + // move = { + // destination: this.piece.position.add(new BoardVector2d(-2, 0)) as BoardVector2d, + // moveType: MoveType.Move & MoveType.QueenSideCastling + // } + + // if (this.isCastlingLegal(MoveType.QueenSideCastling)) { + // this.legalMoves.push(move); + // } + // else { + // this.illegalMoves.push(move); + // } } } diff --git a/src/pieces/Knight.ts b/src/pieces/Knight.ts index 6545691..d97e52b 100644 --- a/src/pieces/Knight.ts +++ b/src/pieces/Knight.ts @@ -1,26 +1,30 @@ import { Board, CaptureOptions, Move, MoveType } from "@lc/core"; import { BoardVector2d, Symmetry } from "@lc/geometry"; import { Piece, PieceType } from "@lc/pieces"; -import { PieceMovement } from "@lc/piece-movements"; -import { ObjectUtilities } from "@lc/utils"; +import { PieceMovement } from "@lc/pieces"; export class Knight extends Piece { protected override initType(): void { this._type = PieceType.KNIGHT; - this._movement = new KnightMovement(this, this.board); + this._movement = new KnightMovement(this, this.board); } - public rangedCapture(destination: BoardVector2d) { - this.position = destination; - this.moveCounter += 1; - // this.board.notifyRangedCapture(this.position, destination); + + public override move(move: Move): void { + if ((move.moveType & MoveType.RangedCapture) === MoveType.RangedCapture) { + this.moveCounter++; + } + else { + super.move(move); + } } } export class KnightMovement extends PieceMovement { + public override updateMoves(): void { + this.preUpdateMoves(); - protected updateMovesWrapped(): void { const piece: Knight = this.piece as Knight; const board: Board = this.board; const baseVectors: BoardVector2d[] = [new BoardVector2d(1, 2), new BoardVector2d(2, 1)]; @@ -34,28 +38,36 @@ export class KnightMovement extends PieceMovement { } for (const position of positions) { - let move: Partial = { - destination: position, - moveType: MoveType.Move - } + let move: Partial; if (!board.isOutOfBounds(position)) { - this.allMoves.push(move); - if (board.canMoveTo(position, piece, CaptureOptions.OptionalCapture)) { - move = ObjectUtilities.deepCopy(move); + move = { + destination: position, + moveType: MoveType.Move + } + if (board.canMoveTo(position, piece, CaptureOptions.NoCapture)) { + this.legalMoves.push(move); + } + else if (board.canMoveTo(position, piece, CaptureOptions.RequiredCapture)) { + move.moveType! |= MoveType.Capture; + this.legalMoves.push(move) + } + else { + this.illegalMoves.push(move); + } + + move = { + destination: position, + moveType: MoveType.RangedCapture + } + if (board.canRangeCapture(position, piece)) { + this.legalMoves.push(move); - if (board.canMoveTo(position, piece, CaptureOptions.RequiredCapture)) { - move = ObjectUtilities.deepCopy(move); - move.moveType! &= MoveType.Capture - this.capturableMoves.push(move); - - move = { - destination: position, - moveType: MoveType.RangedCapture - } - this.capturableMoves.push(move); - } + } + else { + this.illegalMoves.push(move); } } } } + } \ No newline at end of file diff --git a/src/pieces/LongRangePiece.ts b/src/pieces/LongRangePiece.ts deleted file mode 100644 index f4bbf1b..0000000 --- a/src/pieces/LongRangePiece.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Piece } from "@lc/pieces"; - -abstract class LongRangePiece extends Piece { } diff --git a/src/pieces/Mirror.ts b/src/pieces/Mirror.ts index 254fe70..1862afd 100644 --- a/src/pieces/Mirror.ts +++ b/src/pieces/Mirror.ts @@ -1,14 +1,13 @@ -import { Move } from "@lc/core"; -import { Direction, Rotation } from "@lc/geometry"; +import { Move, MoveType } from "@lc/core"; +import { Direction, DirectionUtils, Rotation } from "@lc/geometry"; import { DirectedPiece, PieceType } from "@lc/pieces"; import { CloseRangeMovement } from "@lc/piece-movements"; -import { ObjectUtilities } from "@lc/utils"; - +import { Syntax } from "@lc/utils"; export class Mirror extends DirectedPiece { protected override initType(): void { this._type = PieceType.MIRROR; - this._movement = new MirrorMovement(this, this.board); + this._movement = new MirrorMovement(this, this.board); } public set direction(direction: Direction) { @@ -18,34 +17,68 @@ export class Mirror extends DirectedPiece { this._direction = direction; } - public get direction(): Direction | undefined { - return this._direction; + public get direction(): Direction { + return super.direction; } -} -export class MirrorMovement extends CloseRangeMovement { + private turnClockwise(): void { + this.direction = DirectionUtils.rotateDoubleClockwise(this.direction!); + } - public turnClockwise(): void { - const piece: Mirror = this.piece as Mirror; - piece.direction = Direction.turnDoubleRight(piece.direction!); + private turnAnticlockwise(): void { + this.direction = DirectionUtils.rotateDoubleAnticlockwise(this.direction!); } - public turnAnticlockwise(): void { - const piece: Mirror = this.piece as Mirror; - piece.direction = Direction.turnDoubleLeft(piece.direction!); + private turn(rotation: Rotation): void { + switch (rotation) { + case Rotation.Anticlockwise: + this.turnAnticlockwise(); + break; + case Rotation.Clockwise: + this.turnClockwise(); + break; + } } - protected updateMovesWrapped(): void { + public override move(move: Move): void { + if ((move.moveType & MoveType.Rotation) === MoveType.Rotation) { + this.moveCounter++; + this.turn(move.rotation!); + } + else { + super.move(move); + } + } + +} + +export class MirrorMovement extends CloseRangeMovement { + + public override updateMoves(): void { super.updateMoves(); - this.capturableMoves.length = 0; - const move: Partial = { + const capturable: Partial[] = this.legalMoves.filter((move) => Syntax.inAlternative(move.moveType!, MoveType.Capture)); + this.illegalMoves = this.illegalMoves.concat(capturable); + this.legalMoves = this.legalMoves.filter((move) => !capturable.includes(move)); + + let move: Partial = { rotation: Rotation.Anticlockwise - } - this.legalMoves.push(ObjectUtilities.deepCopy(move)); - this.allMoves.push(ObjectUtilities.deepCopy(move)); - - move.rotation = Rotation.Clockwise; - this.legalMoves.push(ObjectUtilities.deepCopy(move)); - this.allMoves.push(move); + } + if (this.board.canRotate(Rotation.Anticlockwise, this.piece)) { + this.legalMoves.push(move); + } + else { + this.illegalMoves.push(move); + } + + move = { + rotation: Rotation.Clockwise + } + if (this.board.canRotate(Rotation.Anticlockwise, this.piece)) { + this.legalMoves.push(move); + } + else { + this.illegalMoves.push(move); + } } + } \ No newline at end of file diff --git a/src/pieces/Pawn.ts b/src/pieces/Pawn.ts index fa00803..c31c693 100644 --- a/src/pieces/Pawn.ts +++ b/src/pieces/Pawn.ts @@ -1,8 +1,7 @@ import { Board, CaptureOptions, Move, MoveType } from "@lc/core"; -import { BoardVector2d, Direction } from "@lc/geometry"; +import { BoardVector2d, Direction, DirectionUtils } from "@lc/geometry"; import { DirectedPiece, PieceType, Piece } from "@lc/pieces"; -import { PieceMovement } from "@lc/piece-movements"; -import { ObjectUtilities } from "@lc/utils"; +import { PieceMovement } from "@lc/pieces"; export class Pawn extends DirectedPiece { private _enPassantPosition?: BoardVector2d; @@ -10,18 +9,18 @@ export class Pawn extends DirectedPiece { protected override initType(): void { this._type = PieceType.PAWN; - this._movement = new PawnMovement(this, this.board); + this._movement = new PawnMovement(this, this.board); + } + + public get direction(): Direction { + return super.direction; } public set direction(direction: Direction) { if (direction % 2 === 1) { throw new Error("Direction for PawnPiece mustn't be diagonal."); } - super._direction = direction; - } - - public get direction(): Direction | undefined { - return this._direction; + this._direction = direction; } public set enPassantPosition(position: BoardVector2d) { @@ -32,13 +31,31 @@ export class Pawn extends DirectedPiece { this._promotionPosition = position; } - + public get enPassantPosition(): BoardVector2d { + if (this._enPassantPosition === undefined) { + throw new Error("enPassantPosition is not initialised."); + } + return this._enPassantPosition!; + } + + public get promotionPosition(): BoardVector2d { + if (this._promotionPosition === undefined) { + throw new Error("promotionPosition is not initialised."); + } + return this._promotionPosition!; + } public isOnEnPassantPosition(): boolean { - return this._enPassantPosition === this.position; + if (this._enPassantPosition === undefined) { + throw new Error("enPassantPosition is not initialised."); + } + return this._enPassantPosition!.y === this.position.y; } public isOnPromotionPosition(): boolean { + if (this._promotionPosition === undefined) { + throw new Error("promotionPosition is not initialised."); + } return this._promotionPosition!.y === this.position.y; } } @@ -48,98 +65,83 @@ export class PawnMovement extends PieceMovement { public isEnPassantLegal(destination: BoardVector2d): boolean { const piece: Pawn = this.piece as Pawn; const board: Board = this.board; - const otherPiece: Piece | null = board.getPiece(destination.sub(Direction.toBoardVector2d(piece.direction!))); + const otherPiece: Piece | null = board.getPiece(destination.sub(DirectionUtils.toBoardVector2d(piece.direction!))); return otherPiece !== null && !otherPiece.isSameColor(piece) && otherPiece.type === PieceType.PAWN - && board.canMoveTo(destination, piece, CaptureOptions.RequiredCapture) + && board.canMoveTo(destination, piece, CaptureOptions.NoCapture) && board.lastMove?.piece !== null + && board.lastMove?.piece !== otherPiece && piece.isOnEnPassantPosition(); } - protected updateMovesWrapped(): void { + public override updateMoves(): void { + this.preUpdateMoves(); + const piece: Pawn = this.piece as Pawn; const board: Board = this.board; - const direction: BoardVector2d = Direction.toBoardVector2d(piece.direction as Direction); + const direction: BoardVector2d = DirectionUtils.toBoardVector2d(piece.direction as Direction); const captureDeltas: BoardVector2d[] = [ - Direction.toBoardVector2d(piece.direction!).reverseAxis().add(Direction.toBoardVector2d(piece.direction!)), - Direction.toBoardVector2d(piece.direction!).reverseAxis().opposite().add(Direction.toBoardVector2d(piece.direction!)) - ] - - this.clearMoves(); + DirectionUtils.toBoardVector2d(piece.direction!).reverseAxis().add(DirectionUtils.toBoardVector2d(piece.direction!)), + DirectionUtils.toBoardVector2d(piece.direction!).reverseAxis().opposite().add(DirectionUtils.toBoardVector2d(piece.direction!)) + ]; // Advance 1 square - if (!board.isOutOfBounds(piece.position.add(direction))) { const move: Partial = { destination: piece.position.add(direction) as BoardVector2d, moveType: MoveType.Move - } - this.allMoves.push(move); - if (board.canMoveTo(piece.position.add(direction), piece, CaptureOptions.NoCapture)) { - this.legalMoves.push(ObjectUtilities.deepCopy(move)); } + this.appendToMovePredictionType(board.canMoveTo(piece.position.add(direction), piece, CaptureOptions.NoCapture), move) } // Advance 2 squares - if (!board.isOutOfBounds(piece.position.add(direction.mul(2)))) { const move: Partial = { destination: piece.position.add(direction.mul(2)) as BoardVector2d, moveType: MoveType.Move } - this.allMoves.push(move); - if ( + this.appendToMovePredictionType( !piece.wasMoved() && board.canMoveTo(piece.position.add(direction.mul(2)), piece, CaptureOptions.NoCapture) && this.legalMoves.length > 0 - ) { - this.legalMoves.push(ObjectUtilities.deepCopy(move)); - } + ,move) } // Capture - for (const increment of captureDeltas) { const position: BoardVector2d = piece.position.add(increment); const move: Partial = { destination: position, - moveType: MoveType.Move & MoveType.Capture + moveType: MoveType.Move | MoveType.Capture } if (!board.isOutOfBounds(position)) { - this.allMoves.push(move); - if (!board.canMoveTo(position, piece, CaptureOptions.RequiredCapture)) { // Additional data - this.legalMoves.push(ObjectUtilities.deepCopy(move)); - this.capturableMoves.push(ObjectUtilities.deepCopy(move)); - } + this.appendToMovePredictionType(board.canMoveTo(position, piece, CaptureOptions.RequiredCapture), move); } - + } // En Passant - - if (piece.isOnEnPassantPosition()) { - for (const position of captureDeltas) { - const tmpPosition: BoardVector2d = piece.position.add(position); - const move: Partial = { - destination: position, - moveType: MoveType.Move & MoveType.Capture - } - if (this.isEnPassantLegal(tmpPosition)) { - this.allMoves.push(move); - this.legalMoves.push(ObjectUtilities.deepCopy(move)); - this.capturableMoves.push(ObjectUtilities.deepCopy(move)); - } + + for (const increment of captureDeltas) { + const position: BoardVector2d = piece.position.add(increment); + const move: Partial = { + destination: position, + moveType: MoveType.Move | MoveType.Capture | MoveType.EnPassant + } + if (!board.isOutOfBounds(position)) { + this.appendToMovePredictionType(this.isEnPassantLegal(position), move); } } + // Promotion flag - - const commonMoves: Partial[] = [...this.allMoves,...this.legalMoves,...this.capturableMoves]; + const commonMoves: Partial[] = [...this.legalMoves, ...this.illegalMoves]; for (const move of commonMoves) { if ((this.piece as Pawn).promotionPosition.y === move.destination!.y) { - move.moveType! &= MoveType.Promotion; + move.moveType! |= MoveType.Promotion; } } } + } \ No newline at end of file diff --git a/src/pieces/Piece.ts b/src/pieces/Piece.ts index 744bb54..5b56542 100644 --- a/src/pieces/Piece.ts +++ b/src/pieces/Piece.ts @@ -1,17 +1,15 @@ -import { Board } from "@lc/core"; +import { Board, Move } from "@lc/core"; import { BoardVector2d } from "@lc/geometry"; -import { PieceMovement } from "@lc/piece-movements"; export enum PieceType { - KING = "K", - QUEEN = "Q", - PAWN = "", + KING = "K", + QUEEN = "Q", + PAWN = "", BISHOP = "B", - ROOK = "R", + ROOK = "R", KNIGHT = "N", MIRROR = "M", - LASGUN = "L" } export interface PieceOptions { @@ -30,46 +28,48 @@ export abstract class Piece { public position: BoardVector2d; protected moveCounter: number; - public constructor(position: BoardVector2d, playerId: number, board: Board) { - this.initialPosition = position; - this.position = position; - this.playerId = playerId; - this.moveCounter = 0; - this.board = board; + this.initialPosition = position; + this.position = position; + this.playerId = playerId; + this.moveCounter = 0; + this.board = board; this.defendsKingsFrom = [null, null]; - this.initType(); } protected abstract initType(): void; public get type(): PieceType { - if (!this._type) { - throw new Error("Piece type is not initialised"); + if (this._type === undefined) { + throw new Error("Piece type is not initialised."); } return this._type; } public get movement(): PieceMovement { - if (!this._movement) { - throw new Error("Piece movement is not initialised"); + if (this._movement === undefined) { + throw new Error("Piece movement is not initialised."); } return this._movement; } - public equals(other: unknown): boolean { - if (!(other instanceof Piece)) { - return false; - } - return this.initialPosition === other.initialPosition - && this.position === other.position - && this.playerId === other.playerId - && this.moveCounter === other.playerId - && this._movement === other.movement - && this.type === other.type + public get moveCount(): number { + return this.moveCounter; } + // public equals(other: unknown): boolean { + // if (!(other instanceof Piece)) { + // return false; + // } + // return this.initialPosition === other.initialPosition + // && this.position === other.position + // && this.playerId === other.playerId + // && this.moveCounter === other.playerId + // && this._movement === other.movement + // && this.type === other.type + // } + public toString(): string { return this.type.valueOf(); } @@ -85,10 +85,38 @@ export abstract class Piece { return this.playerId === other; } - public move(destination: BoardVector2d) { - // const origin: BoardVector2d = this.position.copy(); - this.position = destination; - this.moveCounter += 1; - // this.board.notifyPositionChange(origin, destination); + public move(move: Move): void { + this.position = move.destination!.copy(); + this.moveCounter++; + } + +} + +export abstract class PieceMovement { + protected board: Board; + protected piece: Piece; + public illegalMoves: Partial[]; + public legalMoves: Partial[]; + + public constructor(piece: Piece, board: Board) { + this.piece = piece; + this.board = board; + this.legalMoves = []; + this.illegalMoves = []; + } + + protected preUpdateMoves(): void { + this.legalMoves.length = 0; + this.illegalMoves.length = 0; } + protected appendToMovePredictionType(isLegal: boolean, move: Partial): void { + if (isLegal) { + this.legalMoves.push(move); + } + else { + this.illegalMoves.push(move); + } + } + + public abstract updateMoves(): void; } diff --git a/src/pieces/Queen.ts b/src/pieces/Queen.ts index e69de29..ac55aa8 100644 --- a/src/pieces/Queen.ts +++ b/src/pieces/Queen.ts @@ -0,0 +1,21 @@ +import { Direction } from "@lc/geometry"; +import { Piece, PieceType } from "@lc/pieces"; +import { LongRangeMovement } from "@lc/piece-movements"; + +export class Queen extends Piece { + public static DIRECTIONS = [ + Direction.UpperFile, + Direction.UpperRightDiagonal, + Direction.RightRank, + Direction.BottomRightDiagonal, + Direction.BottomFile, + Direction.BottomLeftDiagonal, + Direction.LeftRank, + Direction.UpperLeftDiagonal + ]; + + protected override initType(): void { + this._type = PieceType.QUEEN; + this._movement = new LongRangeMovement(this, this.board, Queen.DIRECTIONS); + } +} diff --git a/src/pieces/Rook.ts b/src/pieces/Rook.ts index e69de29..1f6a806 100644 --- a/src/pieces/Rook.ts +++ b/src/pieces/Rook.ts @@ -0,0 +1,17 @@ +import { Direction } from "@lc/geometry"; +import { Piece, PieceType } from "@lc/pieces"; +import { LongRangeMovement } from "@lc/piece-movements"; + +export class Rook extends Piece { + public static DIRECTIONS = [ + Direction.UpperFile, + Direction.RightRank, + Direction.BottomFile, + Direction.LeftRank, + ]; + + protected override initType(): void { + this._type = PieceType.ROOK; + this._movement = new LongRangeMovement(this, this.board, Rook.DIRECTIONS); + } +} diff --git a/src/pieces/index.ts b/src/pieces/index.ts index ad032e0..8581510 100644 --- a/src/pieces/index.ts +++ b/src/pieces/index.ts @@ -1,8 +1,9 @@ -export { Piece, PieceType, PieceOptions } from "./Piece.js"; +export { Piece, PieceType, PieceOptions, PieceMovement } from "./Piece.js"; export { DirectedPiece } from "./DirectedPiece.js"; -export { King } from "./King.js"; -// export { Queen } from "./Queen.js"; -// export { Rook } from "./Rook.js"; -// export { Bishop } from "./Bishop.js"; -export { Knight } from "./Knight.js"; -export { Pawn } from "./Pawn.js"; +export { King, KingMovement } from "./King.js"; +export { Queen } from "./Queen.js"; +export { Rook } from "./Rook.js"; +export { Bishop } from "./Bishop.js"; +export { Knight, KnightMovement } from "./Knight.js"; +export { Pawn, PawnMovement } from "./Pawn.js"; +export { Mirror, MirrorMovement } from "./Mirror.js" diff --git a/src/pieces/movements/CloseRangeMovement.ts b/src/pieces/movements/CloseRangeMovement.ts index 5e490ba..550487f 100644 --- a/src/pieces/movements/CloseRangeMovement.ts +++ b/src/pieces/movements/CloseRangeMovement.ts @@ -1,15 +1,16 @@ import { Board, CaptureOptions, Move, MoveType } from "@lc/core"; import { BoardVector2d } from "@lc/geometry"; import { Piece } from "@lc/pieces"; -import { PieceMovement } from "@lc/piece-movements"; -import { ObjectUtilities } from "@lc/utils"; - -export class CloseRangeMovement extends PieceMovement { +import { PieceMovement } from "@lc/pieces"; +export abstract class CloseRangeMovement extends PieceMovement { // This method sets all around moves as capturableMoves. - protected updateMovesWrapped(): void { + public override updateMoves(): void { + this.preUpdateMoves(); + const piece: Piece = this.piece as Piece; const board: Board = this.board; + this.preUpdateMoves() for (const scalar1 of [-1, 1, 0]) { for (const scalar2 of [-1, 1, 0]) { @@ -17,23 +18,23 @@ export class CloseRangeMovement extends PieceMovement { continue; } const newVector: BoardVector2d = new BoardVector2d(scalar1, scalar2).add(piece.position); - let move: Partial = { + const move: Partial = { destination: newVector, + moveType: MoveType.Move } - if (!board.isOutOfBounds(newVector)) { - move = ObjectUtilities.deepCopy(move); - move.moveType = MoveType.Move - this.allMoves.push(move); - if (board.canMoveTo(newVector, piece, CaptureOptions.OptionalCapture)) { - move = ObjectUtilities.deepCopy(move); - this.legalMoves.push(move); - if (board.canMoveTo(newVector, piece, CaptureOptions.RequiredCapture)) { - move.moveType! &= MoveType.Capture; - move = ObjectUtilities.deepCopy(move); - this.capturableMoves.push(move); - } - } + if (board.isOutOfBounds(newVector)) { + continue; + } + if (board.canMoveTo(newVector, piece, CaptureOptions.NoCapture)) { + this.legalMoves.push(move); + } + else if (board.canMoveTo(newVector, piece, CaptureOptions.RequiredCapture)) { + move.moveType! |= MoveType.Capture; + this.legalMoves.push(move) + } + else { + this.illegalMoves.push(move); } } } diff --git a/src/pieces/movements/LongRangeMovement.ts b/src/pieces/movements/LongRangeMovement.ts index 764dfa8..f41939d 100644 --- a/src/pieces/movements/LongRangeMovement.ts +++ b/src/pieces/movements/LongRangeMovement.ts @@ -1,21 +1,98 @@ -import { NotImplementedError } from "@lc/utils"; -import { BoardVector2d } from "@lc/geometry"; +import { Board, CaptureOptions, Move, MoveType } from "@lc/core"; +import { BoardVector2d, Direction, DirectionUtils } from "@lc/geometry"; import { Piece } from "@lc/pieces"; +import { PieceMovement } from "@lc/pieces"; +import { Syntax } from "@lc/utils"; -export class LongRangeMovement /** extends PieceMovement */ { - constructor(ranged: Piece) { +export class LongRangeMovement extends PieceMovement { + public allLongRangeMoves: Partial[]>> = {}; + public readonly directions: Direction[]; + constructor(piece: Piece, board: Board, directions: Direction[]) { + super(piece, board); + this.directions = directions; } - public iterateSquares(origin: BoardVector2d) { - throw new NotImplementedError("iterateSquares() method is not implemented yet"); + public override updateMoves(): void { + this.preUpdateMoves(); + this.allLongRangeMoves = this.getAllLongRangeMoves(); + + for (const direction of this.directions) { + let legal: boolean = true; + for (const move of this.allLongRangeMoves[direction]!) { + if (this.board.isPieceAt(move.destination!) && !this.board.canMoveTo(move.destination!, this.piece, CaptureOptions.RequiredCapture)) { + legal = false; + } + if (legal) { + this.legalMoves.push(move); + } + else { + this.illegalMoves.push(move); + } + + if (Syntax.inAlternative(move.moveType!, MoveType.Capture)) { + legal = false; + } + } + } } - public getAllMoves(): BoardVector2d[][] { - throw new NotImplementedError("getAllMoves() method is not implemented yet"); + private getAllLongRangeMoves(): Partial[]>> { + const moves: Partial[]>> = {}; + for (const direction of this.directions) { + moves[direction] = this.getAllCoordinatesByDirection(direction); + } + return moves; } - public getLegalMoves(): BoardVector2d[][] { - throw new NotImplementedError("getLegalMoves() method is not implemented yet"); + private getAllCoordinatesByDirection(direction: Direction): Partial[] { + const x = this.piece.position.x, + y = this.piece.position.y, + tuple = DirectionUtils.toTuple(direction), + step = { x: tuple[0], y: tuple[1] }; + const maxMoveLength = {} as {x: number, y: number}; + if (step.x > 0) { + maxMoveLength.x = this.board.width - x; + } + else if (step.x < 0){ + maxMoveLength.x = x; + } + else { + maxMoveLength.x = Infinity; + } + + if (step.y > 0) { + maxMoveLength.y = this.board.height - y; + } + else if (step.y < 0){ + maxMoveLength.y = y; + } + else { + maxMoveLength.y = Infinity; + } + + const moveLength = Math.min(maxMoveLength.x, maxMoveLength.y); + + const moveArray: Partial[] = []; + let i = 1; + for (; i < moveLength + 1; i++) { + const vector: BoardVector2d = new BoardVector2d(x + i * step.x, y + i * step.y); + if (!this.board.isOutOfBounds(vector)) { + if (this.board.canMoveTo(vector, this.piece, CaptureOptions.RequiredCapture)) { + moveArray.push({ + destination: vector, + moveType: MoveType.Move | MoveType.Capture + }) + } + else { + moveArray.push({ + destination: vector, + moveType: MoveType.Move + }) + } + } + + } + return moveArray } } \ No newline at end of file diff --git a/src/pieces/movements/PieceMovement.ts b/src/pieces/movements/PieceMovement.ts deleted file mode 100644 index 25dd81c..0000000 --- a/src/pieces/movements/PieceMovement.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Board, Move } from "@lc/core"; -import { Piece } from "@lc/pieces"; - - -export abstract class PieceMovement { - protected board: Board; - protected piece: Piece; - public readonly allMoves: Partial[]; - public readonly legalMoves: Partial[]; - public readonly capturableMoves: Partial[]; - - public constructor(piece: Piece, board: Board) { - this.piece = piece; - this.board = board; - this.allMoves = []; - this.legalMoves = []; - this.capturableMoves = []; - } - - protected clearMoves(): void { - this.allMoves.length = 0; - this.legalMoves.length = 0; - this.capturableMoves.length = 0; - } - - protected abstract updateMovesWrapped(): void; - - public updateMoves(): void { - this.clearMoves(); - this.updateMovesWrapped(); - } -} diff --git a/src/pieces/movements/index.ts b/src/pieces/movements/index.ts index 5900a97..246f484 100644 --- a/src/pieces/movements/index.ts +++ b/src/pieces/movements/index.ts @@ -1,3 +1,2 @@ -export { PieceMovement } from "./PieceMovement.js"; export { CloseRangeMovement } from "./CloseRangeMovement.js"; export { LongRangeMovement } from "./LongRangeMovement.js"; diff --git a/src/utils/ObjectUtilities.ts b/src/utils/ObjectUtilities.ts deleted file mode 100644 index 3ea4b84..0000000 --- a/src/utils/ObjectUtilities.ts +++ /dev/null @@ -1,32 +0,0 @@ -// export function extractSubtype(properties: Record) { -// return function (value: TActual) { -// let result = {} as T; -// for (const property of Object.keys(properties) as Array) { -// result[property] = value[property]; -// } - -// return result; -// } -// } -export function deepCopy(obj: object): object { - if (obj instanceof Date) { - return new Date(obj); - } - - if (obj instanceof Array) { - const arrayCopy: unknown[] = []; - for (let i = 0; i < obj.length; i++) { - arrayCopy[i] = typeof obj[i] === "object" ? deepCopy(obj[i]) : obj[i]; - } - return arrayCopy; - } - - const objectCopy: Record = {}; - for (const property in obj) { - const objectProperty = property as keyof typeof obj; - objectCopy[property] = typeof obj[objectProperty] === "object" - ? deepCopy(obj[objectProperty]) - : obj[objectProperty]; - } - return objectCopy; -} diff --git a/src/utils/index.ts b/src/utils/index.ts index 0debbc5..136b25c 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,3 +1,3 @@ export { NotImplementedError, IllegalMoveError } from "./error.js"; export * as Integer from "./int.js"; -export * as ObjectUtilities from "./ObjectUtilities.js" +export * as Syntax from "./syntax.js"; diff --git a/src/utils/int.ts b/src/utils/int.ts index 9229a2a..75a03ee 100644 --- a/src/utils/int.ts +++ b/src/utils/int.ts @@ -1,7 +1,7 @@ /** * Module containing functions connected that facilates - * simulation numbers of integer type. + * simulation of numbers of integer type. */ /** diff --git a/src/utils/syntax.ts b/src/utils/syntax.ts new file mode 100644 index 0000000..e649169 --- /dev/null +++ b/src/utils/syntax.ts @@ -0,0 +1,3 @@ +export function inAlternative(alternative: number, wanted: number): boolean { + return (alternative & wanted) === wanted; +} diff --git a/tests/core/Board.test.ts b/tests/core/Board.test.ts new file mode 100644 index 0000000..1fc55bb --- /dev/null +++ b/tests/core/Board.test.ts @@ -0,0 +1,122 @@ +import { Generator, Player } from "@lc/core"; +import { Board } from "@lc/core" +import { BoardVector2d } from "@lc/geometry"; +import { Piece, PieceType } from "@lc/pieces"; + + +describe("Board", () => { + const size = 8; + const board = new Board(size, size); + const types = [ + PieceType.BISHOP, + PieceType.KING, + PieceType.KNIGHT, + PieceType.QUEEN, + PieceType.ROOK + ] + const both = [new Set, new Set]; + const ofType = new Map>(); + const all: Piece[] = []; + for (const type of types) { + ofType.set(type, new Set); + } + for (let i = 0; i < size; i++) { + const piece = Generator.createStandardPiece( + { + playerId: i % 2, + board: board, + position: new BoardVector2d(i, i) + }, + types[i % 5] + ) + both[piece.playerId].add(piece); + ofType.get(piece.type)!.add(piece); + board.addPiece(piece); + all.push(piece); + } + test("getPiecesOfPlayer", () => { + expect(board.getPiecesOfPlayer(Player.Black).size).toBe(4); + expect(board.getPiecesOfPlayer(Player.White).size).toBe(4); + }) + test("getPiece", () => { + expect(board.getPiece(new BoardVector2d(0, 0))).toStrictEqual(all[0]); + expect(board.getPiece(new BoardVector2d(1, 2))).toBe(null); + }) + test("getPiecesOfType", () => { + expect(board.getPiecesOfType(Player.White,PieceType.BISHOP).size).toBe(1); + expect(board.getPiecesOfType(Player.White,PieceType.PAWN).size).toBe(0); + }) + test("isOutOfBounds", () => { + expect(board.isOutOfBounds(new BoardVector2d(7, 10))).toBeTruthy(); + expect(board.isOutOfBounds(new BoardVector2d(0, 0))).toBeFalsy(); + expect(board.isOutOfBounds(new BoardVector2d(5, 5))).toBeFalsy(); + }) + test("isPieceAt", () => { + expect(board.isPieceAt(new BoardVector2d(1, 1))).toBeTruthy(); + expect(board.isPieceAt(new BoardVector2d(1, 0))).toBeFalsy(); + }) + test("addPiece",() => { + const queen = Generator.createStandardPiece( + { + playerId: Player.White, + position: new BoardVector2d(1, 1), + board: board + }, + PieceType.QUEEN + ) + expect(() => (board.addPiece(queen))).toThrow(); + queen.position = new BoardVector2d(5, 2); + board.addPiece(queen); + expect(board.isPieceAt(queen.position)).toBeTruthy() + }) + test("addPieces",() => { + const queen = Generator.createStandardPiece( + { + playerId: Player.White, + position: new BoardVector2d(6, 3), + board: board + }, + PieceType.QUEEN + ) + const knight = Generator.createStandardPiece( + { + playerId: Player.Black, + position: new BoardVector2d(2, 3), + board: board + }, + PieceType.KNIGHT + ) + board.addPieces([queen, knight]); + expect(board.isPieceAt(queen.position)).toBeTruthy(); + expect(board.isPieceAt(knight.position)).toBeTruthy() + }) + test("removePiece",() => { + const knight = Generator.createStandardPiece( + { + playerId: Player.Black, + position: new BoardVector2d(5, 7), + board: board + }, + PieceType.KNIGHT + ) + board.addPiece(knight); + board.removePiece(knight); + expect(board.isPieceAt(knight.position)).toBeFalsy(); + }) + test("shiftPiece",() => { + const knight = Generator.createStandardPiece( + { + playerId: Player.Black, + position: new BoardVector2d(1, 7), + board: board + }, + PieceType.KNIGHT + ) + board.addPiece(knight) + expect(() => (board.shiftPiece(new BoardVector2d(1, 7), new BoardVector2d(6, 6)))).toThrow(); + expect(() => (board.shiftPiece(new BoardVector2d(5, 0), new BoardVector2d(4, 5)))).toThrow(); + board.shiftPiece(new BoardVector2d(1, 7), new BoardVector2d(2, 6)); + expect(board.isPieceAt(new BoardVector2d(1, 7))).toBeFalsy(); + expect(board.isPieceAt(new BoardVector2d(2, 6))).toBeTruthy(); + }) +}) \ No newline at end of file diff --git a/tests/core/PieceGenerator.test.ts b/tests/core/PieceGenerator.test.ts new file mode 100644 index 0000000..fc7d265 --- /dev/null +++ b/tests/core/PieceGenerator.test.ts @@ -0,0 +1,57 @@ +import { Board, Generator } from "@lc/core" +import { BoardVector2d, Direction } from "@lc/geometry"; +import { Bishop, King, Knight, Mirror, Pawn, Queen, Rook } from "@lc/pieces"; +import { PieceType } from "@lc/pieces"; + + + + +describe("PieceGenerator", () => { + const board: Board = new Board(8, 8); + + test("createStandardPiece", () => { + const data: Generator.StandardPieceData = { + position: new BoardVector2d(1, 1), + playerId: 0, + board: board, + } + const constructors = [King, Queen, Bishop, Rook, Knight]; + let enumValues: PieceType[] = [PieceType.KING, PieceType.QUEEN, PieceType.BISHOP, PieceType.ROOK, PieceType.KNIGHT]; + for (const zip of constructors.map((e, i) => { return [e, enumValues[i]] as [typeof King, PieceType] })) { + expect(Generator.createStandardPiece(data, zip[1])).toStrictEqual(new zip[0](data.position, data.playerId, data.board)); + } + enumValues = [PieceType.MIRROR, PieceType.PAWN]; + for (const single of enumValues) { + expect(() => Generator.createStandardPiece(data, single)).toThrowError(Error); + } + }) + + test("createMirror", () => { + const data: Generator.DirectedPieceData = { + position: new BoardVector2d(1, 1), + playerId: 0, + board: board, + direction: Direction.BottomLeftDiagonal + } + const mirror: Mirror = new Mirror(data.position, data.playerId, data.board); + mirror.direction = data.direction; + expect(Generator.createMirror(data)).toStrictEqual(mirror); + }) + + test("createPawn", () => { + const data: Generator.PawnPieceData = { + position: new BoardVector2d(1, 1), + playerId: 0, + board: board, + direction: Direction.UpperFile, + enPassantPosition: new BoardVector2d(2, 3), + promotionPosition: new BoardVector2d(5, 5) + } + const pawn: Pawn = new Pawn(data.position, data.playerId, data.board); + pawn.direction = data.direction; + pawn.enPassantPosition = data.enPassantPosition; + pawn.promotionPosition = data.promotionPosition + expect(Generator.createPawn(data)).toStrictEqual(pawn); + }) +} +) \ No newline at end of file diff --git a/tests/core/Tile.test.ts b/tests/core/Tile.test.ts new file mode 100644 index 0000000..4edd29b --- /dev/null +++ b/tests/core/Tile.test.ts @@ -0,0 +1,48 @@ +import { Board, Generator, MovesPredictionsType, Tile } from "@lc/core" +import { Player } from "@lc/core" +import { BoardVector2d } from "geometry/Vector2d.js" +import { King, PieceType, Queen } from "@lc/pieces" + +describe("Tile", () => { + const board: Board = new Board(8, 8); + + const data: Generator.StandardPieceData = { + position: new BoardVector2d(2, 2), + playerId: Player.White, + board: board + } + const piece1: King = Generator.createStandardPiece(data, PieceType.KING) as King; + + data.playerId = Player.Black + const piece2: Queen = Generator.createStandardPiece(data, PieceType.QUEEN) as Queen; + + const tile = new Tile(new BoardVector2d(2, 2)); + + test("addPieceMovesToTile", () => { + tile.addPieceMovesToTile(piece1, MovesPredictionsType.Illegal); + expect(tile.checkIfPieceMovesInTile(piece1, MovesPredictionsType.Illegal)).toBe(true); + expect(tile.checkIfPieceMovesInTile(piece1, MovesPredictionsType.Legal)).toBe(false); + }) + + test("removePieceMovesFromTile", () => { + tile.addPieceMovesToTile(piece2, MovesPredictionsType.Legal); + tile.removePieceMovesFromTile(piece1, MovesPredictionsType.Illegal); + expect(tile.checkIfPieceMovesInTile(piece1, MovesPredictionsType.Illegal)).toBe(false); + expect(tile.checkIfPieceMovesInTile(piece2, MovesPredictionsType.Legal)).toBe(true); + }) + + test("isPieceMovesEmpty", () => { + expect(tile.isPieceMovesEmpty(piece2.playerId, MovesPredictionsType.Legal)).toBe(false); + expect(tile.isPieceMovesEmpty(piece2.playerId, MovesPredictionsType.Illegal)).toBe(true); + }) + + test("getPieceMovesOfTile", () => { + expect(tile.getPieceMovesOfTile(piece2.playerId, MovesPredictionsType.Illegal | MovesPredictionsType.Legal).size).toBe(1) + }) + + test("clearAllPredictions", () => { + tile.addPieceMovesToTile(piece1, MovesPredictionsType.Illegal); + tile.clearAllPredictions(); + expect(tile.getPieceMovesOfTile(piece1.playerId, MovesPredictionsType.Illegal | MovesPredictionsType.Legal).size).toBe(0); + }) +}) \ No newline at end of file diff --git a/tests/geometry/DirectionUtils.test.ts b/tests/geometry/DirectionUtils.test.ts new file mode 100644 index 0000000..8bec727 --- /dev/null +++ b/tests/geometry/DirectionUtils.test.ts @@ -0,0 +1,67 @@ +import { BoardVector2d, Direction, DirectionUtils } from "@lc/geometry"; + +describe("DirectionUtils", () => { + test("rotate", () => { + expect(DirectionUtils.rotate(Direction.LeftRank, 3)).toBe(Direction.UpperRightDiagonal); + expect(DirectionUtils.rotate(Direction.UpperFile, -3)).toBe(Direction.BottomLeftDiagonal); + expect(DirectionUtils.rotate(Direction.UpperFile, 20)).toBe(Direction.BottomFile); + }) + test("rotateClockwise", () => { + expect(DirectionUtils.rotateClockwise(Direction.LeftRank)).toBe(Direction.UpperLeftDiagonal); + }) + test("rotateAnticlockwise", () => { + expect(DirectionUtils.rotateAnticlockwise(Direction.LeftRank)).toBe(Direction.BottomLeftDiagonal); + }) + test("rotateDoubleClockwise", () => { + expect(DirectionUtils.rotateDoubleClockwise(Direction.LeftRank)).toBe(Direction.UpperFile); + }) + test("rotateDoubleAnticlockwise", () => { + expect(DirectionUtils.rotateDoubleAnticlockwise(Direction.LeftRank)).toBe(Direction.BottomFile); + }) + test("formCoordinates", () => { + const coordinates: [[number, number], Direction][] = [ + [[-1, 0], Direction.LeftRank], + [[1, 0], Direction.RightRank], + [[0, 1], Direction.UpperFile], + [[0, -1], Direction.BottomFile], + [[-1, 1], Direction.UpperLeftDiagonal], + [[1, 1], Direction.UpperRightDiagonal], + [[1, -1], Direction.BottomRightDiagonal], + [[-1, -1], Direction.BottomLeftDiagonal] + ] + for (const corresponding of coordinates) { + expect(DirectionUtils.fromCoordinates(corresponding[0])).toBe(corresponding[1]); + } + }) + test("toTuple", () => { + const coordinates: [[number, number], Direction][] = [ + [[-1, 0], Direction.LeftRank], + [[1, 0], Direction.RightRank], + [[0, 1], Direction.UpperFile], + [[0, -1], Direction.BottomFile], + [[-1, 1], Direction.UpperLeftDiagonal], + [[1, 1], Direction.UpperRightDiagonal], + [[1, -1], Direction.BottomRightDiagonal], + [[-1, -1], Direction.BottomLeftDiagonal] + ] + for (const corresponding of coordinates) { + expect(DirectionUtils.toTuple(corresponding[1])).toStrictEqual(corresponding[0]); + } + }) + test("toBoardVector2d", () => { + const coordinates: Direction[] = [ + Direction.LeftRank, + Direction.RightRank, + Direction.UpperFile, + Direction.BottomFile, + Direction.UpperLeftDiagonal, + Direction.UpperRightDiagonal, + Direction.BottomRightDiagonal, + Direction.BottomLeftDiagonal + ] + + for (const corresponding of coordinates) { + expect(DirectionUtils.toBoardVector2d(corresponding)).toStrictEqual(BoardVector2d.fromTuple(DirectionUtils.toTuple(corresponding))); + } + }) +}); \ No newline at end of file diff --git a/tests/geometry/vector.test.ts b/tests/geometry/vector.test.ts index ca576d4..35ebc3f 100644 --- a/tests/geometry/vector.test.ts +++ b/tests/geometry/vector.test.ts @@ -1,4 +1,5 @@ import { IntVector2d, Vector2d, BoardVector2d, Symmetry } from "@lc/geometry"; +import { Board } from "@lc/core"; describe("Vector2d", () => { @@ -46,6 +47,16 @@ describe("Vector2d", () => { expect(new Vector2d(1.5, 2).copy()).not.toStrictEqual(new Vector2d(1, 2)); }); + test("Length", () => { + expect(new Vector2d(3, 4).getLength()).toStrictEqual(5); + }); + + test("Unit Vector", () => { + expect(new Vector2d(3, 4).createUnitVector()).toStrictEqual(new Vector2d(0.6, 0.8)); + }); + + + }); describe("IntVector2d", () => { @@ -75,6 +86,13 @@ describe("IntVector2d", () => { expect(new IntVector2d(1, 1).copy()).toStrictEqual(new IntVector2d(1, 1)); expect(new IntVector2d(1.5, 2).copy()).toStrictEqual(new IntVector2d(1, 2)); }); + + test("Unit Vector", () => { + expect(new IntVector2d(3, 4).createUnitVector()).toStrictEqual(new IntVector2d(0, 1)); + expect(new IntVector2d(-6, 4).createUnitVector()).toStrictEqual(new IntVector2d(-1, 0)); + expect(new IntVector2d(3, 3).createUnitVector()).toStrictEqual(new IntVector2d(1, 0)); + expect(new IntVector2d(3, 3).createUnitVector(true)).toStrictEqual(new IntVector2d(0, 1)); + }); }); describe("BoardVector2d", () => { @@ -102,14 +120,21 @@ describe("BoardVector2d", () => { expect(new BoardVector2d(1, 2).copy()).toStrictEqual(new BoardVector2d(1, 2)); }); + test("Getting moves", () => { + const board: Board = new Board(8, 8) + let vector: BoardVector2d = new BoardVector2d(7, 7); + expect(vector.getDirectedMoveFromTuple([1, 1], board)).toStrictEqual([new BoardVector2d(7, 7)]); + vector = new BoardVector2d(2, 4); + expect(vector.getDirectedMoveFromTuple([-1, 1], board)).toStrictEqual([new BoardVector2d(2, 4), new BoardVector2d(1, 5), new BoardVector2d(0, 6)]); + }) }); describe("Different types vectors", () => { test("Creating BoardVector2d from other type vectors", () => { - expect(new BoardVector2d(2,2).add(new Vector2d(2,2)).toString()).toStrictEqual(new BoardVector2d(4, 4).toString()); - expect(new Vector2d(2,2).add(new BoardVector2d(2,2)).toString()).toStrictEqual(new Vector2d(4, 4).toString()); + expect(new BoardVector2d(2, 2).add(new Vector2d(2, 2)).toString()).toStrictEqual(new BoardVector2d(4, 4).toString()); + expect(new Vector2d(2, 2).add(new BoardVector2d(2, 2)).toString()).toStrictEqual(new Vector2d(4, 4).toString()); }); - + }); \ No newline at end of file diff --git a/tests/pieces/Bishop.test.ts b/tests/pieces/Bishop.test.ts new file mode 100644 index 0000000..04d6c99 --- /dev/null +++ b/tests/pieces/Bishop.test.ts @@ -0,0 +1,94 @@ +import { Board, Generator, Move, MoveType, Player } from "@lc/core" +import { BoardVector2d } from "geometry/Vector2d.js" +import { PieceType } from "pieces/Piece.js"; + +describe("Bishop", () => { + const board = new Board(8, 8); + + describe("movement", () => { + describe("updateMoves", () => { + test("No other pieces", () => { + const bishop = Generator.createStandardPiece( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board + }, + PieceType.BISHOP + ) + const movesLegal: Set> = new Set([ + { destination: new BoardVector2d(0, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 4), moveType: MoveType.Move }, + { destination: new BoardVector2d(5, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(6, 6), moveType: MoveType.Move }, + { destination: new BoardVector2d(7, 7), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 0), moveType: MoveType.Move }, + ]) + + bishop.movement.updateMoves(); + for (const singleMove of movesLegal) { + expect(bishop.movement.legalMoves).toContainEqual(singleMove); + } + expect(bishop.movement.illegalMoves.length).toBe(0); + }) + test("Enemy/friendly piece", () => { + const bishop = Generator.createStandardPiece( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board + }, + PieceType.BISHOP + ) + const enemyBishop = Generator.createStandardPiece( + { + position: new BoardVector2d(6, 6), + playerId: Player.Black, + board: board + }, + PieceType.BISHOP + ) + // You're my friend now + const friendlyBishop = Generator.createStandardPiece( + { + position: new BoardVector2d(2, 0), + playerId: Player.White, + board: board + }, + PieceType.BISHOP + ) + const movesLegal: Set> = new Set([ + { destination: new BoardVector2d(0, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 4), moveType: MoveType.Move }, + { destination: new BoardVector2d(5, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(6, 6), moveType: MoveType.Move | MoveType.Capture }, + // { destination: new BoardVector2d(7, 7), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 2), moveType: MoveType.Move }, + // { destination: new BoardVector2d(2, 0), moveType: MoveType.Move }, + ]) + + const movesIllegal = new Set([ + { destination: new BoardVector2d(7, 7), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 0), moveType: MoveType.Move }, + ]); + + board.addPiece(enemyBishop); + board.addPiece(friendlyBishop); + bishop.movement.updateMoves(); + + for (const singleMove of movesLegal) { + expect(bishop.movement.legalMoves).toContainEqual(singleMove); + } + for (const singleMove of movesIllegal) { + expect(bishop.movement.illegalMoves).toContainEqual(singleMove); + } + + }) + }) + }) +}) \ No newline at end of file diff --git a/tests/pieces/King.test.ts b/tests/pieces/King.test.ts new file mode 100644 index 0000000..47250ad --- /dev/null +++ b/tests/pieces/King.test.ts @@ -0,0 +1,97 @@ +import { Board, Generator, Move, MoveType, Player } from "@lc/core" +import { BoardVector2d } from "geometry/Vector2d.js" +import { PieceType } from "pieces/Piece.js"; + +describe("King", () => { + const board = new Board(8, 8); + + describe("movement", () => { + describe("updateMoves", () => { + test("No other pieces", () => { + const king = Generator.createStandardPiece( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board + }, + PieceType.KING + ) + + const movesLegal: Set> = new Set([ + { destination: new BoardVector2d(1, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 2), moveType: MoveType.Move }, + ]) + + king.movement.updateMoves(); + for (const singleMove of movesLegal) { + expect(king.movement.legalMoves).toContainEqual(singleMove); + } + expect(king.movement.illegalMoves.length).toBe(0); + }) + test("Enemy piece",() => { + const king = Generator.createStandardPiece( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board + }, + PieceType.KING + ) + const enemyKnight = Generator.createStandardPiece( + { + position: new BoardVector2d(2, 2), + playerId: Player.Black, + board: board + }, + PieceType.KNIGHT + ); + + + const move = { destination: new BoardVector2d(2, 2), moveType: MoveType.Move | MoveType.Capture }; + + board.addPiece(enemyKnight); + + king.movement.updateMoves(); + + expect(king.movement.legalMoves).toContainEqual(move); + + }) + + test("Friendly piece",() => { + const king = Generator.createStandardPiece( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board + }, + PieceType.KING + ) + const friendlyKnight = Generator.createStandardPiece( + { + position: new BoardVector2d(2, 2), + playerId: Player.White, + board: board + }, + PieceType.KNIGHT + ); + + + const move = { destination: new BoardVector2d(2, 2), moveType: MoveType.Move }; + + board.addPiece(friendlyKnight); + + king.movement.updateMoves(); + + expect(king.movement.illegalMoves).toContainEqual(move); + + + }) + }) + }) +}) \ No newline at end of file diff --git a/tests/pieces/Knight.test.ts b/tests/pieces/Knight.test.ts new file mode 100644 index 0000000..a78cc0c --- /dev/null +++ b/tests/pieces/Knight.test.ts @@ -0,0 +1,132 @@ +import { Board, Generator, Move, MoveType, Player } from "@lc/core" +import { BoardVector2d } from "@lc/geometry" +import { KnightMovement } from "@lc/pieces"; +import { PieceType } from "@lc/pieces"; + +describe("Knight", () => { + const board: Board = new Board(8, 8); + const data: Generator.StandardPieceData = { + position: new BoardVector2d(4, 0), + playerId: Player.White, + board: board + } + + const knigth1 = Generator.createStandardPiece(data, PieceType.KNIGHT); + + test("type", () => { + expect(knigth1.type).toBe(PieceType.KNIGHT); + }) + + test("movement", () => { + expect(knigth1.movement).toBeInstanceOf(KnightMovement); + }) + + test("toString", () => { + expect(knigth1.toString()).toBe("N"); + }) + + test("wasMoved", () => { + expect(knigth1.wasMoved()).toBeFalsy(); + + const move: Move = { + destination: new BoardVector2d(2, 2) + } as Move; + knigth1.move(move); + + expect(knigth1.wasMoved()).toBeTruthy(); + }) + + test("isSameColor", () => { + expect(knigth1.isSameColor(Player.Black)).toBeFalsy(); + expect(knigth1.isSameColor(Player.White)).toBeTruthy(); + + const knigth2 = Generator.createStandardPiece(data, PieceType.KNIGHT); + data.playerId = Player.Black; + const knigth3 = Generator.createStandardPiece(data, PieceType.KNIGHT); + + expect(knigth1.isSameColor(knigth2)).toBeTruthy(); + expect(knigth1.isSameColor(knigth3)).toBeFalsy(); + }) + + test("move", () => { + let move: Move = { + destination: new BoardVector2d(5, 5), + moveType: MoveType.Move | MoveType.Capture + } as Move; + knigth1.move(move); + + expect(knigth1.position).toStrictEqual(new BoardVector2d(5, 5)); + expect(knigth1.moveCount).toStrictEqual(2); + + move = { + destination: new BoardVector2d(5, 5), + moveType: MoveType.RangedCapture + } as Move; + knigth1.move(move); + expect(knigth1.position).toStrictEqual(new BoardVector2d(5, 5)); + expect(knigth1.moveCount).toStrictEqual(3); + }) + + describe("Knight movement", () => { + describe("updateMoves", () => { + const data: Generator.StandardPieceData = { + position: new BoardVector2d(4, 4), + playerId: Player.White, + board: board + } + + const knigthMovementTest = Generator.createStandardPiece(data, PieceType.KNIGHT); + + test("No other pieces", () => { + const moves: Set> = new Set( + [ + { destination: new BoardVector2d(3, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 6), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(5, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(6, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(5, 6), moveType: MoveType.Move }, + { destination: new BoardVector2d(6, 5), moveType: MoveType.Move }, + ] + ) + knigthMovementTest.movement.updateMoves(); + for (const move of moves) { + expect(knigthMovementTest.movement.legalMoves).toContainEqual(move); + } + for (const move of moves) { + move.moveType = MoveType.RangedCapture + expect(knigthMovementTest.movement.illegalMoves).toContainEqual(move); + } + }) + + test("Enemy and friendly piece", () => { + const friendly = Generator.createStandardPiece({ + position: new BoardVector2d(3, 2), + playerId: Player.White, + board: board + }, PieceType.KNIGHT); + const enemy = Generator.createStandardPiece({ + position: new BoardVector2d(2, 3), + playerId: Player.Black, + board: board + }, PieceType.KNIGHT); + + board.addPieces([friendly, enemy]); + knigthMovementTest.movement.updateMoves(); + + + expect(knigthMovementTest.movement.illegalMoves).toContainEqual({ destination: new BoardVector2d(3, 2), moveType: MoveType.Move },); + expect(knigthMovementTest.movement.legalMoves).toContainEqual({ destination: new BoardVector2d(2, 3), moveType: MoveType.Move | MoveType.Capture },); + expect(knigthMovementTest.movement.legalMoves).toContainEqual({ destination: new BoardVector2d(2, 3), moveType: MoveType.RangedCapture },); + + }) + + } + + ) + }) + +}) + + diff --git a/tests/pieces/Mirror.test.ts b/tests/pieces/Mirror.test.ts new file mode 100644 index 0000000..d41e098 --- /dev/null +++ b/tests/pieces/Mirror.test.ts @@ -0,0 +1,115 @@ +import { Board, Generator, Move, MoveType, Player } from "@lc/core" +import { Direction, Rotation } from "geometry/Direction.js"; +import { BoardVector2d } from "geometry/Vector2d.js" +import { Mirror } from "pieces/Mirror.js"; +import { PieceType } from "pieces/Piece.js"; + +describe("Mirror", () => { + const board: Board = new Board(8, 8); + + test("direction", () => { + const mirror: Mirror = Generator.createMirror( + { + position: new BoardVector2d(2, 3), + playerId: Player.White, + board: board, + direction: Direction.BottomLeftDiagonal + } + ) + expect(mirror.direction).toBe(Direction.BottomLeftDiagonal); + expect(() => { mirror.direction = Direction.BottomFile }).toThrow(); + }) + + test("move", () => { + const mirror: Mirror = Generator.createMirror( + { + position: new BoardVector2d(2, 3), + playerId: Player.White, + board: board, + direction: Direction.BottomLeftDiagonal + } + ) + let move: Move = { + moveType: MoveType.Rotation, + rotation: Rotation.Anticlockwise + } as Move + + mirror.move(move); + expect(mirror.direction).toBe(Direction.BottomRightDiagonal); + move.rotation = Rotation.Clockwise; + mirror.move(move); + expect(mirror.direction).toBe(Direction.BottomLeftDiagonal); + + move = { + moveType: MoveType.Move, + destination: new BoardVector2d(3, 4) + } as Move; + mirror.move(move); + expect(mirror.position).toStrictEqual(new BoardVector2d(3, 4)); + }) + + describe("movement", () => { + describe("updateMoves", () => { + test("No other pieces", () => { + const mirror: Mirror = Generator.createMirror( + { + position: new BoardVector2d(3, 4), + playerId: Player.White, + board: board, + direction: Direction.BottomLeftDiagonal + } + ) + mirror.movement.updateMoves(); + const moves: Set> = new Set( + [ + { destination: new BoardVector2d(2, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 4), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 4), moveType: MoveType.Move }, + { rotation: Rotation.Clockwise }, + { rotation: Rotation.Anticlockwise } + ] + ) + for (const move of moves) { + expect(mirror.movement.legalMoves).toContainEqual(move) + } + }) + test("Enemy/Friendly", () => { + const mirror: Mirror = Generator.createMirror( + { + position: new BoardVector2d(3, 4), + playerId: Player.White, + board: board, + direction: Direction.BottomLeftDiagonal + } + ) + const friend = Generator.createStandardPiece( + { + position: new BoardVector2d(2, 3), + playerId: Player.White, + board: board, + }, + PieceType.KNIGHT + ) + const enemy = Generator.createStandardPiece( + { + position: new BoardVector2d(3, 3), + playerId: Player.Black, + board: board, + }, + PieceType.KNIGHT + ) + board.addPieces([friend, enemy]); + mirror.movement.updateMoves(); + const m1 = { destination: new BoardVector2d(2, 3), moveType: MoveType.Move } + const m2 = { destination: new BoardVector2d(3, 3), moveType: MoveType.Move | MoveType.Capture } + expect(mirror.movement.illegalMoves).toContainEqual(m1); + expect(mirror.movement.illegalMoves).toContainEqual(m2); + }) + }) + }) +}) \ No newline at end of file diff --git a/tests/pieces/Pawn.test.ts b/tests/pieces/Pawn.test.ts new file mode 100644 index 0000000..508e0e4 --- /dev/null +++ b/tests/pieces/Pawn.test.ts @@ -0,0 +1,183 @@ +import { Board, Generator, Move, MoveType, Player } from "@lc/core" +import { Direction } from "geometry/Direction.js"; +import { BoardVector2d } from "geometry/Vector2d.js" +import { PieceType } from "pieces/Piece.js"; + +describe("Pawn", () => { + const board = new Board(8, 8); + test("direction", () => { + const pawn = Generator.createPawn( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board, + enPassantPosition: new BoardVector2d(1, 4), + promotionPosition: new BoardVector2d(1, 7), + direction: Direction.UpperFile + } + ) + pawn.direction = Direction.BottomFile; + expect(pawn.direction).toBe(Direction.BottomFile); + expect(() => pawn.direction = Direction.UpperLeftDiagonal).toThrow(); + }) + + test("isOnEnPassantPosition", () => { + const pawn = Generator.createPawn( + { + position: new BoardVector2d(1, 4), + playerId: Player.White, + board: board, + enPassantPosition: new BoardVector2d(1, 4), + promotionPosition: new BoardVector2d(1, 7), + direction: Direction.UpperFile + } + ) + expect(pawn.isOnEnPassantPosition()).toBeTruthy(); + + pawn.enPassantPosition = new BoardVector2d(1, 5); + expect(pawn.isOnEnPassantPosition()).toBeFalsy(); + + pawn.enPassantPosition = undefined as unknown as BoardVector2d; + expect(() => pawn.enPassantPosition).toThrow() + }) + + test("isOnPromotionPosition", () => { + const pawn = Generator.createPawn( + { + position: new BoardVector2d(1, 7), + playerId: Player.White, + board: board, + enPassantPosition: new BoardVector2d(1, 4), + promotionPosition: new BoardVector2d(1, 7), + direction: Direction.UpperFile + } + ) + expect(pawn.isOnPromotionPosition()).toBeTruthy(); + + pawn.position = new BoardVector2d(2, 7); + expect(pawn.isOnPromotionPosition()).toBeTruthy(); + + pawn.position = new BoardVector2d(2, 6); + expect(pawn.isOnPromotionPosition()).toBeFalsy(); + + pawn.promotionPosition = undefined as unknown as BoardVector2d; + expect(() => pawn.promotionPosition).toThrow(); + }) + describe("movement", () => { + describe("updateMoves", () => { + test("No other pieces", () => { + const pawn = Generator.createPawn( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board, + enPassantPosition: new BoardVector2d(1, 4), + promotionPosition: new BoardVector2d(1, 7), + direction: Direction.UpperFile + } + ) + + const movesLegal: Set> = new Set([ + { destination: new BoardVector2d(1, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 3), moveType: MoveType.Move }, + ]) + const movesIllegal: Set> = new Set( + [ + { destination: new BoardVector2d(2, 2), moveType: MoveType.Move | MoveType.Capture }, + { destination: new BoardVector2d(0, 2), moveType: MoveType.Move | MoveType.Capture }, + // { destination: new BoardVector2d(2, 2), moveType: MoveType.Move | MoveType.Capture | MoveType.EnPassant }, + // { destination: new BoardVector2d(0, 2), moveType: MoveType.Move | MoveType.Capture | MoveType.EnPassant }, + ] + ) + pawn.movement.updateMoves(); + for (const singleMove of movesLegal) { + expect(pawn.movement.legalMoves).toContainEqual(singleMove); + } + for (const singleMove of movesIllegal) { + expect(pawn.movement.illegalMoves).toContainEqual(singleMove); + } + }) + test("Enemy pawn",() => { + const enemyPawn = Generator.createPawn( + { + position: new BoardVector2d(2, 6), + playerId: Player.Black, + board: board, + enPassantPosition: new BoardVector2d(2, 3), + promotionPosition: new BoardVector2d(2, 0), + direction: Direction.BottomFile + } + ); + const enemyPawnOpposite = Generator.createPawn( + { + position: new BoardVector2d(1, 6), + playerId: Player.Black, + board: board, + enPassantPosition: new BoardVector2d(1, 3), + promotionPosition: new BoardVector2d(1, 0), + direction: Direction.BottomFile + } + ); + const pawn = Generator.createPawn( + { + position: new BoardVector2d(1, 2), + playerId: Player.White, + board: board, + enPassantPosition: new BoardVector2d(1, 4), + promotionPosition: new BoardVector2d(1, 7), + direction: Direction.UpperFile + } + ); + + let move = { destination: new BoardVector2d(2, 6), moveType: MoveType.Move | MoveType.Capture }; + + board.addPiece(enemyPawn); + pawn.position = new BoardVector2d(1, 5); + pawn.movement.updateMoves(); + + expect(pawn.movement.legalMoves).toContainEqual(move) + + move = { destination: new BoardVector2d(1, 6), moveType: MoveType.Move }; + + board.addPiece(enemyPawnOpposite); + pawn.position = new BoardVector2d(1, 5); + pawn.movement.updateMoves(); + + expect(pawn.movement.illegalMoves).toContainEqual(move) + + }) + test("Friendly piece",() => { + const knight = Generator.createStandardPiece( + { + position: new BoardVector2d(2, 3), + playerId: Player.White, + board: board, + }, + PieceType.KNIGHT + ); + const pawn = Generator.createPawn( + { + position: new BoardVector2d(1, 2), + playerId: Player.White, + board: board, + enPassantPosition: new BoardVector2d(1, 4), + promotionPosition: new BoardVector2d(1, 7), + direction: Direction.UpperFile + } + ); + + const move = { destination: new BoardVector2d(2, 3), moveType: MoveType.Move | MoveType.Capture }; + + board.addPiece(knight); + pawn.movement.updateMoves(); + + expect(pawn.movement.illegalMoves).toContainEqual(move) + + + }) + + + + }) + }) +}) \ No newline at end of file diff --git a/tests/pieces/Queen.test.ts b/tests/pieces/Queen.test.ts new file mode 100644 index 0000000..7392371 --- /dev/null +++ b/tests/pieces/Queen.test.ts @@ -0,0 +1,122 @@ +import { Board, Generator, Move, MoveType, Player } from "@lc/core" +import { BoardVector2d } from "geometry/Vector2d.js" +import { PieceType } from "pieces/Piece.js"; + +describe("Queen", () => { + const board = new Board(8, 8); + + describe("movement", () => { + describe("updateMoves", () => { + test("No other pieces", () => { + const queen = Generator.createStandardPiece( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board + }, + PieceType.QUEEN + ) + const movesLegal: Set> = new Set([ + { destination: new BoardVector2d(0, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 4), moveType: MoveType.Move }, + { destination: new BoardVector2d(5, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(6, 6), moveType: MoveType.Move }, + { destination: new BoardVector2d(7, 7), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 4), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 6), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 7), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(5, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(6, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(7, 1), moveType: MoveType.Move }, + ]) + + queen.movement.updateMoves(); + for (const singleMove of movesLegal) { + expect(queen.movement.legalMoves).toContainEqual(singleMove); + } + expect(queen.movement.illegalMoves.length).toBe(0); + }) + test("Enemy/friendly piece", () => { + const queen = Generator.createStandardPiece( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board + }, + PieceType.QUEEN + ) + const enemyBishop = Generator.createStandardPiece( + { + position: new BoardVector2d(6, 6), + playerId: Player.Black, + board: board + }, + PieceType.QUEEN + ) + // You're my friend now + const friendlyBishop = Generator.createStandardPiece( + { + position: new BoardVector2d(2, 0), + playerId: Player.White, + board: board + }, + PieceType.QUEEN + ) + const movesLegal: Set> = new Set([ + { destination: new BoardVector2d(0, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 4), moveType: MoveType.Move }, + { destination: new BoardVector2d(5, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 4), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 6), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 7), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(5, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(6, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(7, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(6, 6), moveType: MoveType.Move | MoveType.Capture }, + // { destination: new BoardVector2d(7, 7), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 2), moveType: MoveType.Move }, + // { destination: new BoardVector2d(2, 0), moveType: MoveType.Move }, + ]) + + const movesIllegal = new Set([ + { destination: new BoardVector2d(7, 7), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 0), moveType: MoveType.Move }, + ]); + + board.addPiece(enemyBishop); + board.addPiece(friendlyBishop); + queen.movement.updateMoves(); + + for (const singleMove of movesLegal) { + expect(queen.movement.legalMoves).toContainEqual(singleMove); + } + for (const singleMove of movesIllegal) { + expect(queen.movement.illegalMoves).toContainEqual(singleMove); + } + + }) + }) + }) +}) \ No newline at end of file diff --git a/tests/pieces/Rook.test.ts b/tests/pieces/Rook.test.ts new file mode 100644 index 0000000..f3e1400 --- /dev/null +++ b/tests/pieces/Rook.test.ts @@ -0,0 +1,104 @@ +import { Board, Generator, Move, MoveType, Player } from "@lc/core" +import { BoardVector2d } from "geometry/Vector2d.js" +import { PieceType } from "pieces/Piece.js"; + +describe("Rook", () => { + const board = new Board(8, 8); + + describe("movement", () => { + describe("updateMoves", () => { + test("No other pieces", () => { + const rook = Generator.createStandardPiece( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board + }, + PieceType.ROOK + ) + const movesLegal: Set> = new Set([ + { destination: new BoardVector2d(1, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 4), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 5), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 6), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 7), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(5, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(6, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(7, 1), moveType: MoveType.Move }, + ]) + + rook.movement.updateMoves(); + for (const singleMove of movesLegal) { + expect(rook.movement.legalMoves).toContainEqual(singleMove); + } + expect(rook.movement.illegalMoves.length).toBe(0); + }) + test("Enemy/friendly piece", () => { + const rook = Generator.createStandardPiece( + { + position: new BoardVector2d(1, 1), + playerId: Player.White, + board: board + }, + PieceType.ROOK + ) + const enemyRook = Generator.createStandardPiece( + { + position: new BoardVector2d(6, 1), + playerId: Player.Black, + board: board + }, + PieceType.ROOK + ) + // You're my friend now + const friendlyRook = Generator.createStandardPiece( + { + position: new BoardVector2d(1, 6), + playerId: Player.White, + board: board + }, + PieceType.ROOK + ) + const movesLegal: Set> = new Set([ + { destination: new BoardVector2d(1, 0), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 2), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 3), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 4), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 5), moveType: MoveType.Move }, + // { destination: new BoardVector2d(1, 6), moveType: MoveType.Move }, + // { destination: new BoardVector2d(1, 7), moveType: MoveType.Move }, + { destination: new BoardVector2d(0, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(2, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(3, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(4, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(5, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(6, 1), moveType: MoveType.Move | MoveType.Capture }, + ]) + + const movesIllegal = new Set([ + { destination: new BoardVector2d(7, 1), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 6), moveType: MoveType.Move }, + { destination: new BoardVector2d(1, 7), moveType: MoveType.Move }, + ]); + + board.addPiece(enemyRook); + board.addPiece(friendlyRook); + rook.movement.updateMoves(); + + for (const singleMove of movesLegal) { + expect(rook.movement.legalMoves).toContainEqual(singleMove); + } + for (const singleMove of movesIllegal) { + expect(rook.movement.illegalMoves).toContainEqual(singleMove); + } + + }) + }) + }) +}) \ No newline at end of file diff --git a/tests/utils/int.test.ts b/tests/utils/int.test.ts new file mode 100644 index 0000000..4bbd397 --- /dev/null +++ b/tests/utils/int.test.ts @@ -0,0 +1,21 @@ +import { Integer } from "@lc/utils" + +describe("Integer", () => { + test("create", () => { + expect(Integer.create(2)).toBe(2); + expect(Integer.create(2.2)).toBe(2); + expect(Integer.create(2.9)).toBe(2); + expect(Integer.create(-2.3)).toBe(-2); + }) + + test("toInt", () => { + expect(Integer.toInt("23")).toBe(23); + expect(Integer.toInt("23.534")).toBe(23); + }) + + test("checkIsInt", () => { + expect(Integer.checkIsInt(1.2)).toBe(false); + expect(Integer.checkIsInt(2)).toBe(true); + }) + +}) \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 2047076..bb8e928 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,13 +9,25 @@ "removeComments": false, "resolveJsonModule": true, "esModuleInterop": true, - "types": [ "vitest/globals" ], + "types": [ + "vitest/globals" + ], "paths": { - "@lc/core": [ "core/index.ts" ], - "@lc/utils": [ "utils/index.ts" ], - "@lc/geometry": [ "geometry/index.ts" ], - "@lc/pieces": [ "pieces/index.ts" ], - "@lc/piece-movements": [ "pieces/movements/index.ts" ] + "@lc/core": [ + "core/index.ts" + ], + "@lc/utils": [ + "utils/index.ts" + ], + "@lc/geometry": [ + "geometry/index.ts" + ], + "@lc/pieces": [ + "pieces/index.ts" + ], + "@lc/piece-movements": [ + "pieces/movements/index.ts" + ] } }, "include": [ diff --git a/tsconfig.prod.json b/tsconfig.prod.json index e1bfc3e..985d032 100644 --- a/tsconfig.prod.json +++ b/tsconfig.prod.json @@ -1,4 +1,6 @@ { "extends": "./tsconfig.json", - "include": [ "src/**/*" ] + "include": [ + "src/**/*" + ] } \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts index 429488f..0808063 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from "vitest/config"; import tsconfigPaths from 'vite-tsconfig-paths'; export default defineConfig({ - plugins: [ tsconfigPaths() ], + plugins: [tsconfigPaths()], test: { root: './tests', globals: true