From 50bb83f569e39655f4609b3409ce96beee62c7fc Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 09:10:25 -0700 Subject: [PATCH 01/18] Run `npm audit fix` --- package-lock.json | 188 +++++++++++++--------------------------------- 1 file changed, 51 insertions(+), 137 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ee523f965b..23a21b7958e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,6 @@ "lefthook": "^1.11.5", "msw": "^2.7.3", "phaser3spectorjs": "^0.0.8", - "rollup": "^4.40.1", "typedoc": "^0.28.1", "typescript": "^5.8.2", "typescript-eslint": "^8.28.0", @@ -88,19 +87,27 @@ "license": "ISC" }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/compat-data": { "version": "7.24.9", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", @@ -293,9 +300,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -303,9 +310,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -323,120 +330,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", - "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.8" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -458,15 +372,15 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -504,14 +418,14 @@ } }, "node_modules/@babel/types": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", - "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1328,9 +1242,9 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -1416,9 +1330,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -3309,9 +3223,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4179,9 +4093,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { From d7524f3c54d2ceacf04030e3686cb31723981da5 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 09:12:59 -0700 Subject: [PATCH 02/18] Update Biome to 2.0.0 --- package-lock.json | 73 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23a21b7958e..3f1592cba39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "phaser3-rex-plugins": "^1.80.15" }, "devDependencies": { - "@biomejs/biome": "1.9.4", + "@biomejs/biome": "2.0.0", "@eslint/js": "^9.23.0", "@hpcc-js/wasm": "^2.22.4", "@stylistic/eslint-plugin-ts": "^4.1.0", @@ -432,11 +432,10 @@ } }, "node_modules/@biomejs/biome": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", - "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.0.0.tgz", + "integrity": "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ==", "dev": true, - "hasInstallScript": true, "license": "MIT OR Apache-2.0", "bin": { "biome": "bin/biome" @@ -449,20 +448,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "1.9.4", - "@biomejs/cli-darwin-x64": "1.9.4", - "@biomejs/cli-linux-arm64": "1.9.4", - "@biomejs/cli-linux-arm64-musl": "1.9.4", - "@biomejs/cli-linux-x64": "1.9.4", - "@biomejs/cli-linux-x64-musl": "1.9.4", - "@biomejs/cli-win32-arm64": "1.9.4", - "@biomejs/cli-win32-x64": "1.9.4" + "@biomejs/cli-darwin-arm64": "2.0.0", + "@biomejs/cli-darwin-x64": "2.0.0", + "@biomejs/cli-linux-arm64": "2.0.0", + "@biomejs/cli-linux-arm64-musl": "2.0.0", + "@biomejs/cli-linux-x64": "2.0.0", + "@biomejs/cli-linux-x64-musl": "2.0.0", + "@biomejs/cli-win32-arm64": "2.0.0", + "@biomejs/cli-win32-x64": "2.0.0" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", - "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0.tgz", + "integrity": "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw==", "cpu": [ "arm64" ], @@ -477,9 +476,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", - "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.0.0.tgz", + "integrity": "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw==", "cpu": [ "x64" ], @@ -494,9 +493,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", - "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.0.0.tgz", + "integrity": "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw==", "cpu": [ "arm64" ], @@ -511,9 +510,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", - "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0.tgz", + "integrity": "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA==", "cpu": [ "arm64" ], @@ -528,9 +527,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", - "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.0.0.tgz", + "integrity": "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg==", "cpu": [ "x64" ], @@ -545,9 +544,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", - "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0.tgz", + "integrity": "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA==", "cpu": [ "x64" ], @@ -562,9 +561,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", - "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.0.0.tgz", + "integrity": "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw==", "cpu": [ "arm64" ], @@ -579,9 +578,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", - "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.0.0.tgz", + "integrity": "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg==", "cpu": [ "x64" ], diff --git a/package.json b/package.json index e2b35026d0c..e65d5b28a32 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "update-locales:remote": "git submodule update --progress --init --recursive --force --remote" }, "devDependencies": { - "@biomejs/biome": "1.9.4", + "@biomejs/biome": "2.0.0", "@eslint/js": "^9.23.0", "@hpcc-js/wasm": "^2.22.4", "@stylistic/eslint-plugin-ts": "^4.1.0", From 6ebb31132faf0ba9b49edfd7edf5f37ec96f888f Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 13:00:52 -0700 Subject: [PATCH 03/18] Migrate `biome.jsonc` to 2.0 --- biome.jsonc | 90 ++++++++++++++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 42 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index d183334ad58..360091f1908 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "$schema": "https://biomejs.dev/schemas/2.0.0/schema.json", "vcs": { "enabled": false, "clientKind": "git", @@ -10,35 +10,35 @@ "enabled": true, "useEditorconfig": true, "indentStyle": "space", - "ignore": ["src/enums/*", "src/data/balance/*"], + "includes": ["**", "!**/src/enums/**/*", "!**/src/data/balance/**/*"], "lineWidth": 120 }, "files": { "ignoreUnknown": true, // Adding folders to the ignore list is GREAT for performance because it prevents biome from descending into them // and having to verify whether each individual file is ignored - "ignore": [ - "**/*.d.ts", - "dist/*", - "build/*", - "coverage/*", - "public/*", - ".github/*", - "node_modules/*", - ".vscode/*", - "*.css", // TODO? - "*.html", // TODO? - // TODO: these files are too big and complex, ignore them until their respective refactors - "src/data/moves/move.ts", - - // this file is just too big: - "src/data/balance/tms.ts" + "includes": [ + "**", + "!**/*.d.ts", + "!**/dist/**/*", + "!**/build/**/*", + "!**/coverage/**/*", + "!**/public/**/*", + "!**/.github/**/*", + "!**/node_modules/**/*", + "!**/.vscode/**/*", + // TODO: lint css and html? + "!**/*.css", + "!**/*.html", + // TODO: enable linting this file + "!**/src/data/moves/move.ts", + // this file is too big + "!**/src/data/balance/tms.ts" ] }, - // While it'd be nice to enable consistent sorting, enabling this causes issues due to circular import resolution order - // TODO: Remove if we ever get down to 0 circular imports - "organizeImports": { "enabled": false }, + // TODO: Configure and enable import sorting + "assist": { "actions": { "source": { "organizeImports": "off" } } }, "linter": { "enabled": true, "rules": { @@ -51,7 +51,6 @@ "noUnusedImports": "error" }, "style": { - "noVar": "error", "useEnumInitializers": "off", // large enums like Moves/Species would make this cumbersome "useBlockStatements": "error", "useConst": "error", @@ -63,7 +62,23 @@ "useSingleVarDeclarator": "off", "useNodejsImportProtocol": "off", "useTemplate": "off", // string concatenation is faster: https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation - "noNamespaceImport": "error" + "useAsConstAssertion": "error", + "useSelfClosingElements": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error", + "noUselessElse": "error", + "noRestrictedTypes": { + "level": "error", + "options": { + "types": { + "integer": { + "message": "This is an alias for 'number' that can provide false impressions of what values can actually be contained in this variable. Use 'number' instead.", + "use": "number" + } + } + } + } }, "suspicious": { "noDoubleEquals": "error", @@ -77,7 +92,8 @@ "noImplicitAnyLet": "warn", // TODO: Refactor and make this an error "noRedeclare": "info", // TODO: Refactor and make this an error "noGlobalIsNan": "off", - "noAsyncPromiseExecutor": "warn" // TODO: Refactor and make this an error + "noAsyncPromiseExecutor": "warn", // TODO: Refactor and make this an error + "noVar": "error" }, "complexity": { "noExcessiveCognitiveComplexity": "warn", // TODO: Refactor and make this an error @@ -87,18 +103,8 @@ "noUselessConstructor": "error", "noBannedTypes": "warn" // TODO: Refactor and make this an error }, - "nursery": { - "noRestrictedTypes": { - "level": "error", - "options": { - "types": { - "integer": { - "message": "This is an alias for 'number' that can provide false impressions of what values can actually be contained in this variable. Use 'number' instead.", - "use": "number" - } - } - } - } + "performance": { + "noNamespaceImport": "error" } } }, @@ -107,15 +113,15 @@ }, "overrides": [ { - "include": ["test/**/*.test.ts"], - "javascript": { "globals": [] }, + "includes": ["**/test/**/*.test.ts"], "linter": { "rules": { "performance": { - "noDelete": "off" // TODO: evaluate if this is necessary for the test(s) to function + "noDelete": "off", // TODO: evaluate if this is necessary for the test(s) to function + "noNamespaceImport": "off" // this is required for `vi.spyOn` to work in some tests }, "style": { - "noNamespaceImport": "off" // this is required for `vi.spyOn` to work in some tests + "noNonNullAssertion": "off" } } } @@ -123,7 +129,7 @@ // Overrides to prevent unused import removal inside `overrides.ts` and enums files (for TSDoc linkcodes) { - "include": ["src/overrides.ts", "src/enums/*"], + "includes": ["**/src/overrides.ts", "**/src/enums/**/*"], "linter": { "rules": { "correctness": { @@ -133,7 +139,7 @@ } }, { - "include": ["src/overrides.ts"], + "includes": ["**/src/overrides.ts"], "linter": { "rules": { "style": { From e017f135e111b7751f8333777fed2131d3a26da0 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 13:06:50 -0700 Subject: [PATCH 04/18] Apply Biome and fix some suppression comments --- src/battle-scene.ts | 4 ++-- src/data/battle-anims.ts | 18 +++++++++--------- src/data/egg.ts | 4 ++-- src/data/pokemon-species.ts | 10 +++++----- src/data/trainers/trainer-config.ts | 2 +- src/field/pokemon.ts | 8 ++++---- src/inputs-controller.ts | 8 ++++---- src/phases/game-over-phase.ts | 2 +- src/plugins/api/api-base.ts | 2 +- src/sprites/pokemon-sprite.ts | 2 +- src/sprites/sprite-utils.ts | 2 +- src/system/game-data.ts | 6 +++--- .../version_migration/version_converter.ts | 10 +++++----- src/touch-controls.ts | 6 +++--- src/ui-inputs.ts | 2 +- src/ui/battle-flyout.ts | 2 +- src/ui/egg-gacha-ui-handler.ts | 2 +- src/ui/mystery-encounter-ui-handler.ts | 6 +++--- src/ui/run-info-ui-handler.ts | 2 +- src/ui/save-slot-select-ui-handler.ts | 2 +- .../abstract-control-settings-ui-handler.ts | 2 +- src/ui/settings/navigationMenu.ts | 4 ++-- src/ui/text.ts | 4 ++-- src/utils/common.ts | 4 ++-- src/utils/cookies.ts | 2 +- test/mystery-encounter/encounter-test-utils.ts | 2 +- test/testUtils/gameWrapper.ts | 8 +------- .../mocks/mocksContainer/mockImage.ts | 2 -- 28 files changed, 60 insertions(+), 68 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index b802466ee19..13d6ddbb687 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -3237,7 +3237,7 @@ export default class BattleScene extends SceneBase { (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE) && achv.validate(args) ) { - this.gameData.achvUnlocks[achv.id] = new Date().getTime(); + this.gameData.achvUnlocks[achv.id] = Date.now(); this.ui.achvBar.showAchv(achv); if (vouchers.hasOwnProperty(achv.id)) { this.validateVoucher(vouchers[achv.id]); @@ -3250,7 +3250,7 @@ export default class BattleScene extends SceneBase { validateVoucher(voucher: Voucher, args?: unknown[]): boolean { if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(args)) { - this.gameData.voucherUnlocks[voucher.id] = new Date().getTime(); + this.gameData.voucherUnlocks[voucher.id] = Date.now(); this.ui.achvBar.showAchv(voucher); this.gameData.voucherCounts[voucher.voucherType]++; return true; diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index be060b57e9c..4af16f1ef54 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -346,7 +346,7 @@ abstract class AnimTimedBgEvent extends AnimTimedEvent { } class AnimTimedUpdateBgEvent extends AnimTimedBgEvent { - // biome-ignore lint/correctness/noUnusedVariables: seems intentional + // biome-ignore lint/correctness/noUnusedFunctionParameters: seems intentional execute(moveAnim: MoveAnim, priority?: number): number { const tweenProps = {}; if (this.bgX !== undefined) { @@ -423,7 +423,7 @@ export function initCommonAnims(): Promise { const commonAnimId = commonAnimIds[ca]; commonAnimFetches.push( globalScene - .cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/\_/g, "-")}.json`) + .cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/_/g, "-")}.json`) .then(response => response.json()) .then(cas => commonAnims.set(commonAnimId, new AnimConfig(cas))), ); @@ -535,7 +535,7 @@ export async function initEncounterAnims(encounterAnim: EncounterAnim | Encounte } encounterAnimFetches.push( globalScene - .cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/\_/g, "-")}.json`) + .cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/_/g, "-")}.json`) .then(response => response.json()) .then(cas => encounterAnims.set(anim, new AnimConfig(cas))), ); @@ -559,7 +559,7 @@ export function initMoveChargeAnim(chargeAnim: ChargeAnim): Promise { } else { chargeAnims.set(chargeAnim, null); globalScene - .cachedFetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/\_/g, "-")}.json`) + .cachedFetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/_/g, "-")}.json`) .then(response => response.json()) .then(ca => { if (Array.isArray(ca)) { @@ -1405,15 +1405,15 @@ export class EncounterBattleAnim extends BattleAnim { export async function populateAnims() { const commonAnimNames = getEnumKeys(CommonAnim).map(k => k.toLowerCase()); - const commonAnimMatchNames = commonAnimNames.map(k => k.replace(/\_/g, "")); + const commonAnimMatchNames = commonAnimNames.map(k => k.replace(/_/g, "")); const commonAnimIds = getEnumValues(CommonAnim) as CommonAnim[]; const chargeAnimNames = getEnumKeys(ChargeAnim).map(k => k.toLowerCase()); - const chargeAnimMatchNames = chargeAnimNames.map(k => k.replace(/\_/g, " ")); + const chargeAnimMatchNames = chargeAnimNames.map(k => k.replace(/_/g, " ")); const chargeAnimIds = getEnumValues(ChargeAnim) as ChargeAnim[]; const commonNamePattern = /name: (?:Common:)?(Opp )?(.*)/; const moveNameToId = {}; for (const move of getEnumValues(MoveId).slice(1)) { - const moveName = MoveId[move].toUpperCase().replace(/\_/g, ""); + const moveName = MoveId[move].toUpperCase().replace(/_/g, ""); moveNameToId[moveName] = move; } @@ -1469,7 +1469,7 @@ export async function populateAnims() { const frameData = framesData[fd]; const focusFramesData = frameData.split(" - - "); for (let tf = 0; tf < focusFramesData.length; tf++) { - const values = focusFramesData[tf].replace(/ {6}\- /g, "").split("\n"); + const values = focusFramesData[tf].replace(/ {6}- /g, "").split("\n"); const targetFrame = new AnimFrame( Number.parseFloat(values[0]), Number.parseFloat(values[1]), @@ -1516,7 +1516,7 @@ export async function populateAnims() { .replace(/[a-z]+: ! '', /gi, "") .replace(/name: (.*?),/, 'name: "$1",') .replace( - /flashColor: !ruby\/object:Color { alpha: ([\d\.]+), blue: ([\d\.]+), green: ([\d\.]+), red: ([\d\.]+)}/, + /flashColor: !ruby\/object:Color { alpha: ([\d.]+), blue: ([\d.]+), green: ([\d.]+), red: ([\d.]+)}/, "flashRed: $4, flashGreen: $3, flashBlue: $2, flashAlpha: $1", ); const frameIndex = Number.parseInt(/frame: (\d+)/.exec(timingData)![1]); // TODO: is the bang correct? diff --git a/src/data/egg.ts b/src/data/egg.ts index a6e2e04a5fe..0cb8a5f1745 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -175,7 +175,7 @@ export class Egg { this._sourceType = eggOptions?.sourceType ?? undefined; this._hatchWaves = eggOptions?.hatchWaves ?? this.getEggTierDefaultHatchWaves(); - this._timestamp = eggOptions?.timestamp ?? new Date().getTime(); + this._timestamp = eggOptions?.timestamp ?? Date.now(); // First roll shiny and variant so we can filter if species with an variant exist this._isShiny = eggOptions?.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny()); @@ -255,7 +255,7 @@ export class Egg { // Sets the hidden ability if a hidden ability exists and // the override is set or the egg hits the chance - let abilityIndex: number | undefined = undefined; + let abilityIndex: number | undefined; const sameSpeciesEggHACheck = this._sourceType === EggSourceType.SAME_SPECIES_EGG && !randSeedInt(SAME_SPECIES_EGG_HA_RATE); const gachaEggHACheck = !(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !randSeedInt(GACHA_EGG_HA_RATE); diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 39e8fbd18e6..82d6c5f3a82 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -96,8 +96,8 @@ export function getPokemonSpeciesForm(species: SpeciesId, formIndex: number): Po } export function getFusedSpeciesName(speciesAName: string, speciesBName: string): string { - const fragAPattern = /([a-z]{2}.*?[aeiou(?:y$)\-\']+)(.*?)$/i; - const fragBPattern = /([a-z]{2}.*?[aeiou(?:y$)\-\'])(.*?)$/i; + const fragAPattern = /([a-z]{2}.*?[aeiou(?:y$)\-']+)(.*?)$/i; + const fragBPattern = /([a-z]{2}.*?[aeiou(?:y$)\-'])(.*?)$/i; const [speciesAPrefixMatch, speciesBPrefixMatch] = [speciesAName, speciesBName].map(n => /^(?:[^ ]+) /.exec(n)); const [speciesAPrefix, speciesBPrefix] = [speciesAPrefixMatch, speciesBPrefixMatch].map(m => (m ? m[0] : "")); @@ -134,7 +134,7 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: string): if (fragBMatch) { const lastCharA = fragA.slice(fragA.length - 1); const prevCharB = fragBMatch[1].slice(fragBMatch.length - 1); - fragB = (/[\-']/.test(prevCharB) ? prevCharB : "") + fragBMatch[2] || prevCharB; + fragB = (/[-']/.test(prevCharB) ? prevCharB : "") + fragBMatch[2] || prevCharB; if (lastCharA === fragB[0]) { if (/[aiu]/.test(lastCharA)) { fragB = fragB.slice(1); @@ -379,7 +379,7 @@ export abstract class PokemonSpeciesForm { } getSpriteAtlasPath(female: boolean, formIndex?: number, shiny?: boolean, variant?: number, back?: boolean): string { - const spriteId = this.getSpriteId(female, formIndex, shiny, variant, back).replace(/\_{2}/g, "/"); + const spriteId = this.getSpriteId(female, formIndex, shiny, variant, back).replace(/_{2}/g, "/"); return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } @@ -478,8 +478,8 @@ export abstract class PokemonSpeciesForm { case SpeciesId.DUDUNSPARCE: break; case SpeciesId.ZACIAN: + // biome-ignore lint/suspicious/noFallthroughSwitchClause: Intentionally falls through case SpeciesId.ZAMAZENTA: - // biome-ignore lint/suspicious/noFallthroughSwitchClause: Falls through if (formSpriteKey.startsWith("behemoth")) { formSpriteKey = "crowned"; } diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index 6786aa00ef7..a767b083538 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -335,7 +335,7 @@ export class TrainerConfig { if (doubleEncounterBgm) { this.doubleEncounterBgm = typeof doubleEncounterBgm === "number" - ? TrainerType[doubleEncounterBgm].toString().replace(/\_/g, " ").toLowerCase() + ? TrainerType[doubleEncounterBgm].toString().replace(/_/g, " ").toLowerCase() : doubleEncounterBgm; } return this; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index e9cc4f70d70..d918ca2b2f1 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -898,12 +898,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getSpriteAtlasPath(ignoreOverride?: boolean): string { - const spriteId = this.getSpriteId(ignoreOverride).replace(/\_{2}/g, "/"); + const spriteId = this.getSpriteId(ignoreOverride).replace(/_{2}/g, "/"); return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } getBattleSpriteAtlasPath(back?: boolean, ignoreOverride?: boolean): string { - const spriteId = this.getBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, "/"); + const spriteId = this.getBattleSpriteId(back, ignoreOverride).replace(/_{2}/g, "/"); return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } @@ -977,7 +977,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getFusionBattleSpriteAtlasPath(back?: boolean, ignoreOverride?: boolean): string { - return this.getFusionBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, "/"); + return this.getFusionBattleSpriteId(back, ignoreOverride).replace(/_{2}/g, "/"); } getIconAtlasKey(ignoreOverride = false, useIllusion = true): string { @@ -2880,7 +2880,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { ); }; - let fusionOverride: PokemonSpecies | undefined = undefined; + let fusionOverride: PokemonSpecies | undefined; if (forStarter && this.isPlayer() && Overrides.STARTER_FUSION_SPECIES_OVERRIDE) { fusionOverride = getPokemonSpecies(Overrides.STARTER_FUSION_SPECIES_OVERRIDE); diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index 02a95f71ac4..388802f467e 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -70,20 +70,20 @@ const repeatInputDelayMillis = 250; * providing a unified interface for all input-related interactions. */ export class InputsController { - private gamepads: Array = new Array(); + private gamepads: Array = []; public events: Phaser.Events.EventEmitter; - private buttonLock: Button[] = new Array(); + private buttonLock: Button[] = []; private interactions: Map> = new Map(); private configs: Map = new Map(); public gamepadSupport = true; public selectedDevice; - private disconnectedGamepads: Array = new Array(); + private disconnectedGamepads: Array = []; public lastSource = "keyboard"; - private inputInterval: NodeJS.Timeout[] = new Array(); + private inputInterval: NodeJS.Timeout[] = []; private touchControls: TouchControl; public moveTouchControlsHandler: MoveTouchControlsHandler; diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts index eaf1e4f58d7..3f92f26b9b9 100644 --- a/src/phases/game-over-phase.ts +++ b/src/phases/game-over-phase.ts @@ -299,7 +299,7 @@ export class GameOverPhase extends BattlePhase { battleType: globalScene.currentBattle.battleType, trainer: globalScene.currentBattle.trainer ? new TrainerData(globalScene.currentBattle.trainer) : null, gameVersion: globalScene.game.config.gameVersion, - timestamp: new Date().getTime(), + timestamp: Date.now(), challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)), mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1, mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData, diff --git a/src/plugins/api/api-base.ts b/src/plugins/api/api-base.ts index f55ffe2d3fd..c7ff4619187 100644 --- a/src/plugins/api/api-base.ts +++ b/src/plugins/api/api-base.ts @@ -33,7 +33,7 @@ export abstract class ApiBase { * @param dataType The data-type of the {@linkcode bodyData}. */ protected async doPost(path: string, bodyData?: D, dataType: DataType = "json") { - let body: string | undefined = undefined; + let body: string | undefined; const headers: HeadersInit = {}; if (bodyData) { diff --git a/src/sprites/pokemon-sprite.ts b/src/sprites/pokemon-sprite.ts index 66432f5a4ea..cdf9e3acfa6 100644 --- a/src/sprites/pokemon-sprite.ts +++ b/src/sprites/pokemon-sprite.ts @@ -9,7 +9,7 @@ import type BattleScene from "#app/battle-scene"; // Regex patterns /** Regex matching double underscores */ -const DUNDER_REGEX = /\_{2}/g; +const DUNDER_REGEX = /_{2}/g; /** * Calculate the sprite ID from a pokemon form. diff --git a/src/sprites/sprite-utils.ts b/src/sprites/sprite-utils.ts index 0f4adf7882f..563bb1235b5 100644 --- a/src/sprites/sprite-utils.ts +++ b/src/sprites/sprite-utils.ts @@ -1,6 +1,6 @@ import { expSpriteKeys } from "#app/sprites/sprite-keys"; -const expKeyRegex = /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(\-.*?)?(?:_[1-3])?$/; +const expKeyRegex = /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(-.*?)?(?:_[1-3])?$/; export function hasExpSprite(key: string): boolean { const keyMatch = expKeyRegex.exec(key); diff --git a/src/system/game-data.ts b/src/system/game-data.ts index e933c5704f9..e857e2e06a1 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -39,7 +39,7 @@ import { setSettingGamepad, SettingGamepad, settingGamepadDefaults } from "#app/ import type { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { setSettingKeyboard } from "#app/system/settings/settings-keyboard"; import { TagAddedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; -// biome-ignore lint/style/noNamespaceImport: Something weird is going on here and I don't want to touch it +// biome-ignore lint/performance/noNamespaceImport: Something weird is going on here and I don't want to touch it import * as Modifier from "#app/modifier/modifier"; import { StatusEffect } from "#enums/status-effect"; import ChallengeData from "#app/system/challenge-data"; @@ -300,7 +300,7 @@ export class GameData { voucherCounts: this.voucherCounts, eggs: this.eggs.map(e => new EggData(e)), gameVersion: globalScene.game.config.gameVersion, - timestamp: new Date().getTime(), + timestamp: Date.now(), eggPity: this.eggPity.slice(0), unlockPity: this.unlockPity.slice(0), }; @@ -930,7 +930,7 @@ export class GameData { ? new TrainerData(globalScene.currentBattle.trainer) : null, gameVersion: globalScene.game.config.gameVersion, - timestamp: new Date().getTime(), + timestamp: Date.now(), challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)), mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1, mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData, diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index 32e105aec66..47f33ce689f 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -48,23 +48,23 @@ export const settingsMigrators: Readonly = [settingsMigr // import * as vA_B_C from "./versions/vA_B_C"; // --- v1.0.4 (and below) PATCHES --- // -// biome-ignore lint/style/noNamespaceImport: Convenience (TODO: make this a file-wide ignore when Biome supports those) +// biome-ignore lint/performance/noNamespaceImport: Convenience (TODO: make this a file-wide ignore when Biome supports those) import * as v1_0_4 from "./versions/v1_0_4"; // --- v1.7.0 PATCHES --- // -// biome-ignore lint/style/noNamespaceImport: Convenience +// biome-ignore lint/performance/noNamespaceImport: Convenience import * as v1_7_0 from "./versions/v1_7_0"; // --- v1.8.3 PATCHES --- // -// biome-ignore lint/style/noNamespaceImport: Convenience +// biome-ignore lint/performance/noNamespaceImport: Convenience import * as v1_8_3 from "./versions/v1_8_3"; // --- v1.9.0 PATCHES --- // -// biome-ignore lint/style/noNamespaceImport: Convenience +// biome-ignore lint/performance/noNamespaceImport: Convenience import * as v1_9_0 from "./versions/v1_9_0"; // --- v1.10.0 PATCHES --- // -// biome-ignore lint/style/noNamespaceImport: Convenience +// biome-ignore lint/performance/noNamespaceImport: Convenience import * as v1_10_0 from "./versions/v1_10_0"; /** Current game version */ diff --git a/src/touch-controls.ts b/src/touch-controls.ts index e2b5ad05baa..85854bc6a77 100644 --- a/src/touch-controls.ts +++ b/src/touch-controls.ts @@ -6,8 +6,8 @@ const repeatInputDelayMillis = 250; export default class TouchControl { events: EventEmitter; - private buttonLock: string[] = new Array(); - private inputInterval: NodeJS.Timeout[] = new Array(); + private buttonLock: string[] = []; + private inputInterval: NodeJS.Timeout[] = []; /** Whether touch controls are disabled */ private disabled = false; /** Whether the last touch event has finished before disabling */ @@ -208,7 +208,7 @@ export function isMobile(): boolean { /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test( a, ) || - /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test( + /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test( a.substr(0, 4), ) ) { diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index e4f11e1c93c..f7a97ec673c 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -176,12 +176,12 @@ export class UiInputs { return; } switch (globalScene.ui?.getMode()) { + // biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through to show menu overlay case UiMode.MESSAGE: { const messageHandler = globalScene.ui.getHandler(); if (!messageHandler.pendingPrompt || messageHandler.isTextAnimationInProgress()) { return; } - // biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through to show menu overlay } case UiMode.TITLE: case UiMode.COMMAND: diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts index 9a2180eccee..6f8f6a76b34 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -52,7 +52,7 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { /** The array of {@linkcode Phaser.GameObjects.Text} objects which are drawn on the flyout */ private flyoutText: Phaser.GameObjects.Text[] = new Array(4); /** The array of {@linkcode MoveInfo} used to track moves for the {@linkcode Pokemon} linked to the flyout */ - private moveInfo: MoveInfo[] = new Array(); + private moveInfo: MoveInfo[] = []; /** Current state of the flyout's visibility */ public flyoutVisible = false; diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 0c8d90fa138..7ff3a1b65ee 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -625,7 +625,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { const infoContainer = this.gachaInfoContainers[gachaType]; switch (gachaType as GachaType) { case GachaType.LEGENDARY: { - const species = getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(new Date().getTime())); + const species = getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(Date.now())); const pokemonIcon = infoContainer.getAt(1) as Phaser.GameObjects.Sprite; pokemonIcon.setTexture(species.getIconAtlasKey(), species.getIconId(false)); break; diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 83ce88714f5..7d4ec845209 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -591,9 +591,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { // Auto-color options green/blue for good/bad by looking for (+)/(-) if (text) { - const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))!][0]; + const primaryStyleString = [...text.match(new RegExp(/\[color=[^[]*\]\[shadow=[^[]*\]/i))!][0]; text = text.replace( - /(\(\+\)[^\(\[]*)/gi, + /(\(\+\)[^([]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_GREEN) + @@ -601,7 +601,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { primaryStyleString, ); text = text.replace( - /(\(\-\)[^\(\[]*)/gi, + /(\(-\)[^([]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_BLUE) + diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 78ab4a40407..76e343d018a 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -19,7 +19,7 @@ import { PokemonType } from "#enums/pokemon-type"; import { TypeColor, TypeShadow } from "#app/enums/color"; import { getNatureStatMultiplier, getNatureName } from "../data/nature"; import { getVariantTint } from "#app/sprites/variant"; -// biome-ignore lint/style/noNamespaceImport: See `src/system/game-data.ts` +// biome-ignore lint/performance/noNamespaceImport: See `src/system/game-data.ts` import * as Modifier from "#app/modifier/modifier"; import type { SpeciesId } from "#enums/species-id"; import { PlayerGender } from "#enums/player-gender"; diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 7b4d46203c9..7dee041fa63 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -2,7 +2,7 @@ import i18next from "i18next"; import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; import { GameMode } from "../game-mode"; -// biome-ignore lint/style/noNamespaceImport: See `src/system/game-data.ts` +// biome-ignore lint/performance/noNamespaceImport: See `src/system/game-data.ts` import * as Modifier from "#app/modifier/modifier"; import type { SessionSaveData } from "../system/game-data"; import type PokemonData from "../system/pokemon-data"; diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index e3631c062df..769de7993ce 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -209,7 +209,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler settingFiltered.forEach((setting, s) => { // Convert the setting key from format 'Key_Name' to 'Key name' for display. - const settingName = setting.replace(/\_/g, " "); + const settingName = setting.replace(/_/g, " "); // Create and add a text object for the setting name to the scene. const isLock = this.settingBlacklisted.includes(this.setting[setting]); diff --git a/src/ui/settings/navigationMenu.ts b/src/ui/settings/navigationMenu.ts index ad3d4ccf0b5..9074a255d73 100644 --- a/src/ui/settings/navigationMenu.ts +++ b/src/ui/settings/navigationMenu.ts @@ -16,7 +16,7 @@ export class NavigationManager { private static instance: NavigationManager; public modes: UiMode[]; public selectedMode: UiMode = UiMode.SETTINGS; - public navigationMenus: NavigationMenu[] = new Array(); + public navigationMenus: NavigationMenu[] = []; public labels: string[]; /** @@ -105,7 +105,7 @@ export class NavigationManager { export default class NavigationMenu extends Phaser.GameObjects.Container { private navigationIcons: InputsIcons; - protected headerTitles: Phaser.GameObjects.Text[] = new Array(); + protected headerTitles: Phaser.GameObjects.Text[] = [] as Phaser.GameObjects.Text[]; /** * Creates an instance of NavigationMenu. diff --git a/src/ui/text.ts b/src/ui/text.ts index 8812d8ee4a8..76c85bac5cf 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -300,7 +300,7 @@ export function getTextWithColors( ): string { // Apply primary styling before anything else let text = getBBCodeFrag(content, primaryStyle, uiTheme) + "[/color][/shadow]"; - const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))!][0]; + const primaryStyleString = [...text.match(new RegExp(/\[color=[^[]*\]\[shadow=[^[]*\]/i))!][0]; /* For money text displayed in game windows, we can't use the default {@linkcode TextStyle.MONEY} * or it will look wrong in legacy mode because of the different window background color @@ -320,7 +320,7 @@ export function getTextWithColors( }); // Remove extra style block at the end - return text.replace(/\[color=[^\[]*\]\[shadow=[^\[]*\]\[\/color\]\[\/shadow\]/gi, ""); + return text.replace(/\[color=[^[]*\]\[shadow=[^[]*\]\[\/color\]\[\/shadow\]/gi, ""); } // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: This is a giant switch which is the best option. diff --git a/src/utils/common.ts b/src/utils/common.ts index e19e5976507..4bf51730148 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -10,7 +10,7 @@ export const MissingTextureKey = "__MISSING"; export function toReadableString(str: string): string { return str - .replace(/\_/g, " ") + .replace(/_/g, " ") .split(" ") .map(s => `${s.slice(0, 1)}${s.slice(1).toLowerCase()}`) .join(" "); @@ -583,7 +583,7 @@ export function isBetween(num: number, min: number, max: number): boolean { * @param move the move for which the animation filename is needed */ export function animationFileName(move: MoveId): string { - return MoveId[move].toLowerCase().replace(/\_/g, "-"); + return MoveId[move].toLowerCase().replace(/_/g, "-"); } /** diff --git a/src/utils/cookies.ts b/src/utils/cookies.ts index 5ed793c0451..b38e941b59a 100644 --- a/src/utils/cookies.ts +++ b/src/utils/cookies.ts @@ -2,7 +2,7 @@ import { isBeta } from "./utility-vars"; export function setCookie(cName: string, cValue: string): void { const expiration = new Date(); - expiration.setTime(new Date().getTime() + 3600000 * 24 * 30 * 3 /*7*/); + expiration.setTime(Date.now() + 3600000 * 24 * 30 * 3 /*7*/); document.cookie = `${cName}=${cValue};Secure;SameSite=Strict;Domain=${window.location.hostname};Path=/;Expires=${expiration.toUTCString()}`; } diff --git a/test/mystery-encounter/encounter-test-utils.ts b/test/mystery-encounter/encounter-test-utils.ts index 6954d6212cc..6293a49cf63 100644 --- a/test/mystery-encounter/encounter-test-utils.ts +++ b/test/mystery-encounter/encounter-test-utils.ts @@ -1,4 +1,4 @@ -// biome-ignore lint/style/noNamespaceImport: Necessary for mocks +// biome-ignore lint/performance/noNamespaceImport: Necessary for mocks import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { Status } from "#app/data/status-effect"; import { CommandPhase } from "#app/phases/command-phase"; diff --git a/test/testUtils/gameWrapper.ts b/test/testUtils/gameWrapper.ts index 9264b68d421..aa9b9b90c98 100644 --- a/test/testUtils/gameWrapper.ts +++ b/test/testUtils/gameWrapper.ts @@ -15,15 +15,9 @@ import { vi } from "vitest"; import { version } from "../../package.json"; import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; import { MockTimedEventManager } from "./mocks/mockTimedEventManager"; -import InputManager = Phaser.Input.InputManager; -import KeyboardManager = Phaser.Input.Keyboard.KeyboardManager; -import KeyboardPlugin = Phaser.Input.Keyboard.KeyboardPlugin; -import GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; -import EventEmitter = Phaser.Events.EventEmitter; -import UpdateList = Phaser.GameObjects.UpdateList; import { PokedexMonContainer } from "#app/ui/pokedex-mon-container"; import MockContainer from "./mocks/mocksContainer/mockContainer"; -// biome-ignore lint/style/noNamespaceImport: Necessary in order to mock the var +// biome-ignore lint/performance/noNamespaceImport: Necessary in order to mock the var import * as bypassLoginModule from "#app/global-vars/bypass-login"; window.URL.createObjectURL = (blob: Blob) => { diff --git a/test/testUtils/mocks/mocksContainer/mockImage.ts b/test/testUtils/mocks/mocksContainer/mockImage.ts index d20b4663771..b128346ea7b 100644 --- a/test/testUtils/mocks/mocksContainer/mockImage.ts +++ b/test/testUtils/mocks/mocksContainer/mockImage.ts @@ -1,8 +1,6 @@ import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export class MockImage extends MockContainer { - private texture; - constructor(textureManager, x, y, texture) { super(textureManager, x, y); this.texture = texture; From 93ef225208d95b3c5d9b12b07498d80249898dff Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 14:13:10 -0700 Subject: [PATCH 05/18] Fix some suppression comments and update config --- biome.jsonc | 9 +++++++-- src/phases/attempt-run-phase.ts | 5 +---- src/system/game-data.ts | 4 ++-- src/ui/starter-select-ui-handler.ts | 1 - 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index 360091f1908..377ccaf53fb 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -48,7 +48,11 @@ "noUnusedVariables": "error", "noSwitchDeclarations": "error", "noVoidTypeReturn": "error", - "noUnusedImports": "error" + "noUnusedImports": { + "level": "error", + "fix": "safe" + }, + "noUnusedFunctionParameters": "error" }, "style": { "useEnumInitializers": "off", // large enums like Moves/Species would make this cumbersome @@ -104,7 +108,8 @@ "noBannedTypes": "warn" // TODO: Refactor and make this an error }, "performance": { - "noNamespaceImport": "error" + "noNamespaceImport": "error", + "noDelete": "error" } } }, diff --git a/src/phases/attempt-run-phase.ts b/src/phases/attempt-run-phase.ts index 5e24f3474a6..9a444bc68fe 100644 --- a/src/phases/attempt-run-phase.ts +++ b/src/phases/attempt-run-phase.ts @@ -38,14 +38,11 @@ export class AttemptRunPhase extends PokemonPhase { alpha: 0, duration: 250, ease: "Sine.easeIn", - onComplete: () => - // biome-ignore lint/complexity/noForEach: TODO - enemyField.forEach(enemyPokemon => enemyPokemon.destroy()), + onComplete: () => enemyField.forEach(enemyPokemon => enemyPokemon.destroy()), }); globalScene.clearEnemyHeldItemModifiers(); - // biome-ignore lint/complexity/noForEach: TODO enemyField.forEach(enemyPokemon => { enemyPokemon.hideInfo().then(() => enemyPokemon.destroy()); enemyPokemon.hp = 0; diff --git a/src/system/game-data.ts b/src/system/game-data.ts index e857e2e06a1..0269b2f8f86 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -939,7 +939,7 @@ export class GameData { } getSession(slotId: number): Promise { - // biome-ignore lint/suspicious/noAsyncPromiseExecutor: + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: fix this return new Promise(async (resolve, reject) => { if (slotId < 0) { return resolve(null); @@ -980,7 +980,7 @@ export class GameData { } loadSession(slotId: number, sessionData?: SessionSaveData): Promise { - // biome-ignore lint/suspicious/noAsyncPromiseExecutor: + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: fix this return new Promise(async (resolve, reject) => { try { const initSessionFromData = async (sessionData: SessionSaveData) => { diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 20f613fb694..0396ac07cc6 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -2822,7 +2822,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { iconElement: GameObjects.Sprite, controlLabel: GameObjects.Text, ): void { - // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let iconPath: string; // touch controls cannot be rebound as is, and are just emulating a keyboard event. // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls From 62864071e713753040c0d32d9b931cf54e04df72 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 14:39:20 -0700 Subject: [PATCH 06/18] More config updates Added at "error": `noUnusedLabels`, `noThisInStatic` Changed `useDefaultParameterLast` from "off" to "warn" Changed `noDocumentCookie` (from recommended) from "warn" to "off" Changed `noExcessiveCognitiveComplexity` from "warn" to "info" --- biome.jsonc | 13 ++++++++----- .../utils/encounter-phase-utils.ts | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index 377ccaf53fb..98e77eb6eb5 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -52,7 +52,8 @@ "level": "error", "fix": "safe" }, - "noUnusedFunctionParameters": "error" + "noUnusedFunctionParameters": "error", + "noUnusedLabels": "error" }, "style": { "useEnumInitializers": "off", // large enums like Moves/Species would make this cumbersome @@ -62,7 +63,7 @@ "noNonNullAssertion": "off", // TODO: Turn this on ASAP and fix all non-null assertions in non-test files "noParameterAssign": "off", "useExponentiationOperator": "off", // Too typo-prone and easy to mixup with standard multiplication (* vs **) - "useDefaultParameterLast": "off", // TODO: Fix spots in the codebase where this flag would be triggered, and then enable + "useDefaultParameterLast": "warn", // TODO: Fix spots in the codebase where this flag would be triggered, and then enable "useSingleVarDeclarator": "off", "useNodejsImportProtocol": "off", "useTemplate": "off", // string concatenation is faster: https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation @@ -97,15 +98,17 @@ "noRedeclare": "info", // TODO: Refactor and make this an error "noGlobalIsNan": "off", "noAsyncPromiseExecutor": "warn", // TODO: Refactor and make this an error - "noVar": "error" + "noVar": "error", + "noDocumentCookie": "off" // Firefox has minimal support for the "Cookie Store API" }, "complexity": { - "noExcessiveCognitiveComplexity": "warn", // TODO: Refactor and make this an error + "noExcessiveCognitiveComplexity": "info", // TODO: Refactor and make this an error "useLiteralKeys": "off", "noForEach": "off", // Foreach vs for of is not that simple. "noUselessSwitchCase": "off", // Explicit > Implicit "noUselessConstructor": "error", - "noBannedTypes": "warn" // TODO: Refactor and make this an error + "noBannedTypes": "warn", // TODO: Refactor and make this an error + "noThisInStatic": "error" }, "performance": { "noNamespaceImport": "error", diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index bb74f11ce60..f698f636cac 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -1226,7 +1226,7 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) { ); for (const value of meanEncountersPerRunPerBiomeSorted) { - stats += value[0] + "avg valid floors " + meanMEFloorsPerRunPerBiome.get(value[0]) + ", avg MEs ${value[1]},\n"; + stats += value[0] + "avg valid floors " + meanMEFloorsPerRunPerBiome.get(value[0]) + `, avg MEs ${value[1]},\n`; } console.log(stats); From 6a8867abe18a9630747e12841530cf146b88b289 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 18:12:32 -0700 Subject: [PATCH 07/18] Add a bunch of rules --- biome.jsonc | 44 +++++++++++++++++++++++++++--- src/plugins/i18n.ts | 2 +- src/ui/daily-run-scoreboard.ts | 19 ++++--------- test/sprites/pokemonSprite.test.ts | 8 +++--- 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index 98e77eb6eb5..637eb2daafd 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -38,7 +38,18 @@ }, // TODO: Configure and enable import sorting - "assist": { "actions": { "source": { "organizeImports": "off" } } }, + "assist": { + "actions": { + "source": { + "organizeImports": { + "level": "off", + "options": { + "groups": [] + } + } + } + } + }, "linter": { "enabled": true, "rules": { @@ -53,7 +64,8 @@ "fix": "safe" }, "noUnusedFunctionParameters": "error", - "noUnusedLabels": "error" + "noUnusedLabels": "error", + "noPrivateImports": "error" }, "style": { "useEnumInitializers": "off", // large enums like Moves/Species would make this cumbersome @@ -108,16 +120,37 @@ "noUselessSwitchCase": "off", // Explicit > Implicit "noUselessConstructor": "error", "noBannedTypes": "warn", // TODO: Refactor and make this an error - "noThisInStatic": "error" + "noThisInStatic": "error", + "noUselessThisAlias": "error", + "noUselessTernary": "error" }, "performance": { "noNamespaceImport": "error", "noDelete": "error" + }, + "nursery": { + "useAdjacentGetterSetter": "warn", + "noConstantBinaryExpression": "warn", + "noTsIgnore": "warn", + "noAwaitInLoop": "warn", + "useJsonImportAttribute": "error", + "useIndexOf": "warn", + "useObjectSpread": "info", + "useNumericSeparators": "info", + "useIterableCallbackReturn": "warn", + "useSingleJsDocAsterisk": "warn", + "noShadow": "warn" } } }, "javascript": { - "formatter": { "quoteStyle": "double", "arrowParentheses": "asNeeded" } + "formatter": { + "quoteStyle": "double", + "arrowParentheses": "asNeeded" + }, + "parser": { + "jsxEverywhere": false + } }, "overrides": [ { @@ -130,6 +163,9 @@ }, "style": { "noNonNullAssertion": "off" + }, + "nursery": { + "noFloatingPromises": "error" } } } diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 7d3b30ed5b0..470aeaf69b7 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -3,7 +3,7 @@ import i18next from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import HttpBackend from "i18next-http-backend"; import processor, { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor"; -import pkg from "../../package.json"; +import pkg from "../../package.json" with { type: "json" }; //#region Interfaces/Types diff --git a/src/ui/daily-run-scoreboard.ts b/src/ui/daily-run-scoreboard.ts index e19882b09cc..c069c6fffd7 100644 --- a/src/ui/daily-run-scoreboard.ts +++ b/src/ui/daily-run-scoreboard.ts @@ -41,24 +41,15 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { this.setup(); } - /** - * Sets the updating state and updates button states accordingly. - * If value is true (updating), disables the buttons; if false, enables the buttons. - * @param {boolean} value - The new updating state. - */ - set isUpdating(value) { + /** When set to `true`, disables the buttons; when set to `false`, enables the buttons. */ + get isUpdating(): boolean { + return this._isUpdating; + } + set isUpdating(value: boolean) { this._isUpdating = value; this.setButtonsState(!value); } - /** - * Gets the current updating state. - * @returns {boolean} - The current updating state. - */ - get isUpdating() { - return this._isUpdating; - } - setup() { const titleWindow = addWindow(0, 0, 114, 18, false, false, undefined, undefined, WindowVariant.THIN); this.add(titleWindow); diff --git a/test/sprites/pokemonSprite.test.ts b/test/sprites/pokemonSprite.test.ts index a008b75b42e..bd65d86d22a 100644 --- a/test/sprites/pokemonSprite.test.ts +++ b/test/sprites/pokemonSprite.test.ts @@ -2,8 +2,8 @@ import { getAppRootDir } from "#test/sprites/spritesUtils"; import fs from "fs"; import path from "path"; import { beforeAll, describe, expect, it } from "vitest"; -import _masterlist from "../../public/images/pokemon/variant/_masterlist.json"; -import _exp_masterlist from "../../public/images/pokemon/variant/_exp_masterlist.json"; +import _masterlist from "../../public/images/pokemon/variant/_masterlist.json" with { type: "json" }; +import _exp_masterlist from "../../public/images/pokemon/variant/_exp_masterlist.json" with { type: "json" }; type PokemonVariantMasterlist = typeof _masterlist; type PokemonExpVariantMasterlist = typeof _exp_masterlist; @@ -26,9 +26,9 @@ describe("check if every variant's sprite are correctly set", () => { femaleVariant = masterlist.female; backVariant = masterlist.back; - // @ts-ignore + // @ts-expect-error delete masterlist.female; // TODO: resolve ts-ignore - //@ts-ignore + //@ts-expect-error delete masterlist.back; //TODO: resolve ts-ignore }); From 69ed6258b269e70f16a7fd30a60fff77bd6013a1 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 18:17:34 -0700 Subject: [PATCH 08/18] Apply Biome safe fixes --- biome.jsonc | 2 +- src/battle-scene.ts | 4 ++-- src/battle.ts | 2 +- src/data/battle-anims.ts | 18 +++++++----------- .../encounters/clowning-around-encounter.ts | 2 +- .../mysterious-challengers-encounter.ts | 2 +- src/field/pokemon.ts | 18 ++++++++---------- src/phases/switch-summon-phase.ts | 2 +- src/system/game-data.ts | 2 +- src/touch-controls.ts | 2 +- src/ui/pokedex-page-ui-handler.ts | 4 ++-- src/ui/starter-select-ui-handler.ts | 6 +++--- test/abilities/wonder_skin.test.ts | 2 +- test/testUtils/inputsHandler.ts | 2 +- .../mocks/mocksContainer/mockSprite.ts | 8 ++++---- test/testUtils/testFileInitialization.ts | 2 +- 16 files changed, 36 insertions(+), 42 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index 637eb2daafd..6d3ad9240b4 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -136,7 +136,7 @@ "useJsonImportAttribute": "error", "useIndexOf": "warn", "useObjectSpread": "info", - "useNumericSeparators": "info", + "useNumericSeparators": "off", // TODO: enable? "useIterableCallbackReturn": "warn", "useSingleJsDocAsterisk": "warn", "noShadow": "warn" diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 13d6ddbb687..784c3ce8334 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -468,7 +468,7 @@ export default class BattleScene extends SceneBase { true, ); - //@ts-ignore (the defined types in the package are incromplete...) + //@ts-expect-error (the defined types in the package are incromplete...) transition.transit({ mode: "blinds", ease: "Cubic.easeInOut", @@ -1167,7 +1167,7 @@ export default class BattleScene extends SceneBase { this.field.remove(this.currentBattle.mysteryEncounter?.introVisuals, true); } - //@ts-ignore - allowing `null` for currentBattle causes a lot of trouble + //@ts-expect-error - allowing `null` for currentBattle causes a lot of trouble this.currentBattle = null; // TODO: resolve ts-ignore // Reset RNG after end of game or save & quit. diff --git a/src/battle.ts b/src/battle.ts index 245705f4801..45373402e12 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -178,7 +178,7 @@ export default class Battle { ) .map(i => { const ret = i as PokemonHeldItemModifier; - //@ts-ignore - this is awful to fix/change + //@ts-expect-error - this is awful to fix/change ret.pokemonId = null; return ret; }), diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 4af16f1ef54..bed17fb0ebc 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -359,15 +359,11 @@ class AnimTimedUpdateBgEvent extends AnimTimedBgEvent { tweenProps["alpha"] = (this.opacity || 0) / 255; } if (Object.keys(tweenProps).length) { - globalScene.tweens.add( - Object.assign( - { - targets: moveAnim.bgSprite, - duration: getFrameMs(this.duration * 3), - }, - tweenProps, - ), - ); + globalScene.tweens.add({ + targets: moveAnim.bgSprite, + duration: getFrameMs(this.duration * 3), + ...tweenProps, + }); } return this.duration * 2; } @@ -1641,12 +1637,12 @@ export async function populateAnims() { let props: string[]; for (let p = 0; p < propSets.length; p++) { props = propSets[p]; - // @ts-ignore TODO + // @ts-expect-error TODO const ai = props.indexOf(a.key); if (ai === -1) { continue; } - // @ts-ignore TODO + // @ts-expect-error TODO const bi = props.indexOf(b.key); return ai < bi ? -1 : ai > bi ? 1 : 0; diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index 9bdaa603540..818318bb499 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -135,7 +135,7 @@ export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder ); clownConfig.setPartyTemplates(clownPartyTemplate); clownConfig.setDoubleOnly(); - // @ts-ignore + // @ts-expect-error clownConfig.partyTemplateFunc = null; // Overrides party template func if it exists // Generate random ability for Blacephalon from pool diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index 010358ea3b2..ae3d905cf91 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -92,7 +92,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounter const brutalConfig = trainerConfigs[brutalTrainerType].clone(); brutalConfig.title = trainerConfigs[brutalTrainerType].title; brutalConfig.setPartyTemplates(e4Template); - // @ts-ignore + // @ts-expect-error brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func female = false; if (brutalConfig.hasGenders) { diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index d918ca2b2f1..2e47c9e8de4 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4373,9 +4373,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { scene.time.delayedCall(fixedInt(Math.ceil(duration * 0.4)), () => { try { SoundFade.fadeOut(scene, cry, fixedInt(Math.ceil(duration * 0.2))); - fusionCry = this.getFusionSpeciesForm(undefined, true).cry( - Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0) }, soundConfig), - ); + fusionCry = this.getFusionSpeciesForm(undefined, true).cry({ + seek: Math.max(fusionCry.totalDuration * 0.4, 0), + ...soundConfig, + }); SoundFade.fadeIn( scene, fusionCry, @@ -4517,13 +4518,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (i === transitionIndex && fusionCryKey) { SoundFade.fadeOut(globalScene, cry, fixedInt(Math.ceil((duration / rate) * 0.2))); - fusionCry = globalScene.playSound( - fusionCryKey, - Object.assign({ - seek: Math.max(fusionCry.totalDuration * 0.4, 0), - rate: rate, - }), - ); + fusionCry = globalScene.playSound(fusionCryKey, { + seek: Math.max(fusionCry.totalDuration * 0.4, 0), + rate: rate, + }); SoundFade.fadeIn( globalScene, fusionCry, diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts index af03cc42b54..12d3b9dc6ce 100644 --- a/src/phases/switch-summon-phase.ts +++ b/src/phases/switch-summon-phase.ts @@ -44,7 +44,7 @@ export class SwitchSummonPhase extends SummonPhase { preSummon(): void { if (!this.player) { if (this.slotIndex === -1) { - //@ts-ignore + //@ts-expect-error this.slotIndex = globalScene.currentBattle.trainer?.getNextSummonIndex( !this.fieldIndex ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, ); // TODO: what would be the default trainer-slot fallback? diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 0269b2f8f86..d5d4256f7d0 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1610,7 +1610,7 @@ export class GameData { } } - this.defaultDexData = Object.assign({}, data); + this.defaultDexData = { ...data }; this.dexData = data; } diff --git a/src/touch-controls.ts b/src/touch-controls.ts index 85854bc6a77..5319976648f 100644 --- a/src/touch-controls.ts +++ b/src/touch-controls.ts @@ -42,7 +42,7 @@ export default class TouchControl { document.querySelectorAll(".apad-button").forEach(element => this.preventElementZoom(element as HTMLElement)); // Select all elements with the 'data-key' attribute and bind keys to them for (const button of document.querySelectorAll("[data-key]")) { - // @ts-ignore - Bind the key to the button using the dataset key + // @ts-expect-error - Bind the key to the button using the dataset key this.bindKey(button, button.dataset.key); } } diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 32a88ab36b2..82e2f732b23 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -2321,7 +2321,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.showStats(); } else { this.statsContainer.setVisible(false); - //@ts-ignore + //@ts-expect-error this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. what. how? huh? } } @@ -2786,7 +2786,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.statsMode = false; this.statsContainer.setVisible(false); this.pokemonSprite.setVisible(true); - //@ts-ignore + //@ts-expect-error this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. !?!? } } diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 0396ac07cc6..3cb6222cafa 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -2855,7 +2855,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } else { iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); } - // @ts-ignore: TODO can iconPath actually be undefined? + // @ts-expect-error: TODO can iconPath actually be undefined? iconElement.setTexture(gamepadType, iconPath); iconElement.setPosition(this.instructionRowX, this.instructionRowY); controlLabel.setPosition(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY); @@ -3480,7 +3480,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.showStats(); } else { this.statsContainer.setVisible(false); - //@ts-ignore + //@ts-expect-error this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. what. how? huh? } } @@ -4488,7 +4488,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.statsMode = false; this.statsContainer.setVisible(false); this.pokemonSprite.setVisible(!!this.speciesStarterDexEntry?.caughtAttr); - //@ts-ignore + //@ts-expect-error this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. !?!? this.teraIcon.setVisible(globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id)); const props = globalScene.gameData.getSpeciesDexAttrProps( diff --git a/test/abilities/wonder_skin.test.ts b/test/abilities/wonder_skin.test.ts index 886882ab6fd..177b97ae3b7 100644 --- a/test/abilities/wonder_skin.test.ts +++ b/test/abilities/wonder_skin.test.ts @@ -66,7 +66,7 @@ describe("Abilities - Wonder Skin", () => { it(`does not affect pokemon with ${ability[1]}`, async () => { const moveToCheck = allMoves[MoveId.CHARM]; - // @ts-ignore ts doesn't know that ability[0] is an ability and not a string... + // @ts-expect-error ts doesn't know that ability[0] is an ability and not a string... game.override.ability(ability[0]); vi.spyOn(moveToCheck, "calculateBattleAccuracy"); diff --git a/test/testUtils/inputsHandler.ts b/test/testUtils/inputsHandler.ts index 6e9dd453541..0d8c43e7616 100644 --- a/test/testUtils/inputsHandler.ts +++ b/test/testUtils/inputsHandler.ts @@ -89,7 +89,7 @@ class Fakepad extends Phaser.Input.Gamepad.Gamepad { public index: number; constructor(pad) { - //@ts-ignore + //@ts-expect-error super(undefined, { ...pad, buttons: pad.deviceMapping, axes: [] }); //TODO: resolve ts-ignore this.id = "xbox_360_fakepad"; this.index = 0; diff --git a/test/testUtils/mocks/mocksContainer/mockSprite.ts b/test/testUtils/mocks/mocksContainer/mockSprite.ts index ed1f1df6609..bbcd421e1a7 100644 --- a/test/testUtils/mocks/mocksContainer/mockSprite.ts +++ b/test/testUtils/mocks/mocksContainer/mockSprite.ts @@ -19,13 +19,13 @@ export default class MockSprite implements MockGameObject { constructor(textureManager, x, y, texture) { this.textureManager = textureManager; this.scene = textureManager.scene; - // @ts-ignore + // @ts-expect-error Phaser.GameObjects.Sprite.prototype.setInteractive = this.setInteractive; - // @ts-ignore + // @ts-expect-error Phaser.GameObjects.Sprite.prototype.setTexture = this.setTexture; - // @ts-ignore + // @ts-expect-error Phaser.GameObjects.Sprite.prototype.setSizeToFrame = this.setSizeToFrame; - // @ts-ignore + // @ts-expect-error Phaser.GameObjects.Sprite.prototype.setFrame = this.setFrame; // Phaser.GameObjects.Sprite.prototype.disable = this.disable; diff --git a/test/testUtils/testFileInitialization.ts b/test/testUtils/testFileInitialization.ts index da390870300..578747b0529 100644 --- a/test/testUtils/testFileInitialization.ts +++ b/test/testUtils/testFileInitialization.ts @@ -47,7 +47,7 @@ export function initTestFile() { }); BBCodeText.prototype.destroy = () => null; - // @ts-ignore + // @ts-expect-error BBCodeText.prototype.resize = () => null; InputText.prototype.setElement = () => null as any; InputText.prototype.resize = () => null as any; From b62391ee827bed55af17b6435c125883a1e30fb3 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 18:22:00 -0700 Subject: [PATCH 09/18] Apply Biome unsafe fixes --- biome.jsonc | 1 - src/data/balance/egg-moves.ts | 4 ++-- src/data/egg.ts | 2 +- src/data/moves/pokemon-move.ts | 2 +- src/data/pokemon-species.ts | 2 +- src/data/trainers/trainer-config.ts | 16 ++++++++-------- src/field/pokemon.ts | 5 +---- src/field/trainer.ts | 2 +- src/phase-manager.ts | 2 +- src/phases/move-effect-phase.ts | 7 ++----- src/ui/pokedex-page-ui-handler.ts | 4 ++-- src/ui/pokedex-ui-handler.ts | 4 ++-- src/ui/summary-ui-handler.ts | 2 +- test/abilities/mycelium_might.test.ts | 2 +- test/abilities/stall.test.ts | 2 +- 15 files changed, 25 insertions(+), 32 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index 6d3ad9240b4..98c6b847307 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -138,7 +138,6 @@ "useObjectSpread": "info", "useNumericSeparators": "off", // TODO: enable? "useIterableCallbackReturn": "warn", - "useSingleJsDocAsterisk": "warn", "noShadow": "warn" } } diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index 436e6bc6e76..fa89e558ba7 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -595,13 +595,13 @@ function parseEggMoves(content: string): void { const cols = line.split(",").slice(0, 5); const moveNames = allMoves.map(m => m.name.replace(/ \([A-Z]\)$/, "").toLowerCase()); const enumSpeciesName = cols[0].toUpperCase().replace(/[ -]/g, "_"); - const species = speciesValues[speciesNames.findIndex(s => s === enumSpeciesName)]; + const species = speciesValues[speciesNames.indexOf(enumSpeciesName)]; const eggMoves: MoveId[] = []; for (let m = 0; m < 4; m++) { const moveName = cols[m + 1].trim(); - const moveIndex = moveName !== "N/A" ? moveNames.findIndex(mn => mn === moveName.toLowerCase()) : -1; + const moveIndex = moveName !== "N/A" ? moveNames.indexOf(moveName.toLowerCase()) : -1; eggMoves.push(moveIndex > -1 ? moveIndex as MoveId : MoveId.NONE); if (moveIndex === -1) { diff --git a/src/data/egg.ts b/src/data/egg.ts index 0cb8a5f1745..1ef08a4f1da 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -524,7 +524,7 @@ export class Egg { /** * Rolls whether the egg is shiny or not. * @returns `true` if the egg is shiny - **/ + */ private rollShiny(): boolean { let shinyChance = GACHA_DEFAULT_SHINY_RATE; switch (this._sourceType) { diff --git a/src/data/moves/pokemon-move.ts b/src/data/moves/pokemon-move.ts index daad199fbbd..ab774c9fff9 100644 --- a/src/data/moves/pokemon-move.ts +++ b/src/data/moves/pokemon-move.ts @@ -16,7 +16,7 @@ import type Move from "./move"; * @see {@linkcode getMovePp} - returns amount of PP a move currently has. * @see {@linkcode getPpRatio} - returns the current PP amount / max PP amount. * @see {@linkcode getName} - returns name of {@linkcode Move}. - **/ + */ export class PokemonMove { public moveId: MoveId; public ppUsed: number; diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 82d6c5f3a82..d2a48495195 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -569,7 +569,7 @@ export abstract class PokemonSpeciesForm { const rootSpeciesId = this.getRootSpeciesId(); for (const moveId of moveset) { if (speciesEggMoves.hasOwnProperty(rootSpeciesId)) { - const eggMoveIndex = speciesEggMoves[rootSpeciesId].findIndex(m => m === moveId); + const eggMoveIndex = speciesEggMoves[rootSpeciesId].indexOf(moveId); if (eggMoveIndex > -1 && eggMoves & (1 << eggMoveIndex)) { continue; } diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index a767b083538..7c8b5b29fcd 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -290,7 +290,7 @@ export class TrainerConfig { * @param {string} [nameFemale] The name of the female trainer. If 'Ivy', a localized name will be assigned. * @param {TrainerType | string} [femaleEncounterBgm] The encounter BGM for the female trainer, which can be a TrainerType or a string. * @returns {TrainerConfig} The updated TrainerConfig instance. - **/ + */ setHasGenders(nameFemale?: string, femaleEncounterBgm?: TrainerType | string): TrainerConfig { // If the female name is 'Ivy' (the rival), assign a localized name. if (nameFemale === "Ivy") { @@ -540,7 +540,7 @@ export class TrainerConfig { * @param {SpeciesId | SpeciesId[]} signatureSpecies The signature species for the evil team leader. * @param specialtyType The specialty Type of the admin, if they have one * @returns {TrainerConfig} The updated TrainerConfig instance. - * **/ + */ initForEvilTeamAdmin( title: string, poolName: EvilTeam, @@ -581,7 +581,7 @@ export class TrainerConfig { * Initializes the trainer configuration for a Stat Trainer, as part of the Trainer's Test Mystery Encounter. * @param _isMale Whether the stat trainer is Male or Female (for localization of the title). * @returns {TrainerConfig} The updated TrainerConfig instance. - **/ + */ initForStatTrainer(_isMale = false): TrainerConfig { if (!getIsInitialized()) { initI18n(); @@ -608,7 +608,7 @@ export class TrainerConfig { * @param {PokemonType} specialtyType The specialty type for the evil team Leader. * @param boolean Whether or not this is the rematch fight * @returns {TrainerConfig} The updated TrainerConfig instance. - * **/ + */ initForEvilTeamLeader( title: string, signatureSpecies: (SpeciesId | SpeciesId[])[], @@ -651,7 +651,7 @@ export class TrainerConfig { * @param ignoreMinTeraWave Whether the Gym Leader always uses Tera (true), or only Teras after {@linkcode GYM_LEADER_TERA_WAVE} (false). Defaults to false. * @param teraSlot Optional, sets the party member in this slot to Terastallize. Wraps based on party size. * @returns {TrainerConfig} The updated TrainerConfig instance. - * **/ + */ initForGymLeader( signatureSpecies: (SpeciesId | SpeciesId[])[], isMale: boolean, @@ -709,7 +709,7 @@ export class TrainerConfig { * @param specialtyType - The specialty type for the Elite Four member. * @param teraSlot - Optional, sets the party member in this slot to Terastallize. * @returns The updated TrainerConfig instance. - **/ + */ initForEliteFour( signatureSpecies: (SpeciesId | SpeciesId[])[], isMale: boolean, @@ -765,7 +765,7 @@ export class TrainerConfig { * @param {SpeciesId | SpeciesId[]} signatureSpecies The signature species for the Champion. * @param isMale Whether the Champion is Male or Female (for localization of the title). * @returns {TrainerConfig} The updated TrainerConfig instance. - **/ + */ initForChampion(isMale: boolean): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { @@ -815,7 +815,7 @@ export class TrainerConfig { * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE. * @param {TrainerVariant} variant - The variant of the trainer to determine the specific title. * @returns {string} - The title of the trainer. - **/ + */ getTitle(trainerSlot: TrainerSlot = TrainerSlot.NONE, variant: TrainerVariant): string { const ret = this.name; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 2e47c9e8de4..6a21e246223 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -5314,10 +5314,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { for (let sc = 0; sc < spriteColors.length; sc++) { const delta = Math.min(...paletteDeltas[sc]); - const paletteIndex = Math.min( - paletteDeltas[sc].findIndex(pd => pd === delta), - fusionPalette.length - 1, - ); + const paletteIndex = Math.min(paletteDeltas[sc].indexOf(delta), fusionPalette.length - 1); if (delta < 255) { const ratio = easeFunc(delta / 255); const color = [0, 0, 0, fusionSpriteColors[sc][3]]; diff --git a/src/field/trainer.ts b/src/field/trainer.ts index b64821d259a..8ac896e2717 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -158,7 +158,7 @@ export default class Trainer extends Phaser.GameObjects.Container { * @param {TrainerSlot} trainerSlot - The slot to determine which name to use. Defaults to TrainerSlot.NONE. * @param {boolean} includeTitle - Whether to include the title in the returned name. Defaults to false. * @returns {string} - The formatted name of the trainer. - **/ + */ getName(trainerSlot: TrainerSlot = TrainerSlot.NONE, includeTitle = false): string { // Get the base title based on the trainer slot and variant. let name = this.config.getTitle(trainerSlot, this.variant); diff --git a/src/phase-manager.ts b/src/phase-manager.ts index 9390e6dd75d..a4256f110ef 100644 --- a/src/phase-manager.ts +++ b/src/phase-manager.ts @@ -100,7 +100,7 @@ import { UnlockPhase } from "#app/phases/unlock-phase"; import { VictoryPhase } from "#app/phases/victory-phase"; import { WeatherEffectPhase } from "#app/phases/weather-effect-phase"; -/** +/* * Manager for phases used by battle scene. * * *This file must not be imported or used directly. The manager is exclusively used by the battle scene and is not intended for external use.* diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index d7da1ab996c..2a163bd34aa 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -696,12 +696,9 @@ export class MoveEffectPhase extends PokemonPhase { * @param target - The {@linkcode Pokemon} to be removed */ protected removeTarget(target: Pokemon): void { - const targetIndex = this.targets.findIndex(ind => ind === target.getBattlerIndex()); + const targetIndex = this.targets.indexOf(target.getBattlerIndex()); if (targetIndex !== -1) { - this.targets.splice( - this.targets.findIndex(ind => ind === target.getBattlerIndex()), - 1, - ); + this.targets.splice(this.targets.indexOf(target.getBattlerIndex()), 1); } } diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 82e2f732b23..9ec74e70b23 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -2057,7 +2057,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } let newSpecies: PokemonSpecies; if (this.filteredIndices) { - const index = this.filteredIndices.findIndex(id => id === this.species.speciesId); + const index = this.filteredIndices.indexOf(this.species.speciesId); const newIndex = index <= 0 ? this.filteredIndices.length - 1 : index - 1; newSpecies = getPokemonSpecies(this.filteredIndices[newIndex]); } else { @@ -2096,7 +2096,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } let newSpecies: PokemonSpecies; if (this.filteredIndices) { - const index = this.filteredIndices.findIndex(id => id === this.species.speciesId); + const index = this.filteredIndices.indexOf(this.species.speciesId); const newIndex = index >= this.filteredIndices.length - 1 ? 0 : index + 1; newSpecies = getPokemonSpecies(this.filteredIndices[newIndex]); } else { diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 1732bb005d3..9169ca77999 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1389,7 +1389,7 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsMoves = fitsMove1 && fitsMove2; if (fitsEggMove1 && !fitsLevelMove1) { - const em1 = eggMoves.findIndex(name => name === selectedMove1); + const em1 = eggMoves.indexOf(selectedMove1); if ((starterData.eggMoves & (1 << em1)) === 0) { data.eggMove1 = false; } else { @@ -1399,7 +1399,7 @@ export default class PokedexUiHandler extends MessageUiHandler { data.tmMove1 = true; } if (fitsEggMove2 && !fitsLevelMove2) { - const em2 = eggMoves.findIndex(name => name === selectedMove2); + const em2 = eggMoves.indexOf(selectedMove2); if ((starterData.eggMoves & (1 << em2)) === 0) { data.eggMove2 = false; } else { diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index d30322de293..f108faf1646 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -117,7 +117,7 @@ export default class SummaryUiHandler extends UiHandler { private pokemon: PlayerPokemon | null; private playerParty: boolean; - /**This is set to false when checking the summary of a freshly caught Pokemon as it is not part of a player's party yet but still needs to display its items**/ + /**This is set to false when checking the summary of a freshly caught Pokemon as it is not part of a player's party yet but still needs to display its items*/ private newMove: Move | null; private moveSelectFunction: Function | null; private transitioning: boolean; diff --git a/test/abilities/mycelium_might.test.ts b/test/abilities/mycelium_might.test.ts index 2cdda4353b5..56af51c00f7 100644 --- a/test/abilities/mycelium_might.test.ts +++ b/test/abilities/mycelium_might.test.ts @@ -40,7 +40,7 @@ describe("Abilities - Mycelium Might", () => { * https://bulbapedia.bulbagarden.net/wiki/Mycelium_Might_(Ability) * https://bulbapedia.bulbagarden.net/wiki/Priority * https://www.smogon.com/forums/threads/scarlet-violet-battle-mechanics-research.3709545/page-24 - **/ + */ it("will move last in its priority bracket and ignore protective abilities", async () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI]); diff --git a/test/abilities/stall.test.ts b/test/abilities/stall.test.ts index e8ee23fb972..04a29a4f284 100644 --- a/test/abilities/stall.test.ts +++ b/test/abilities/stall.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Stall", () => { * References: * https://bulbapedia.bulbagarden.net/wiki/Stall_(Ability) * https://bulbapedia.bulbagarden.net/wiki/Priority - **/ + */ it("Pokemon with Stall should move last in its priority bracket regardless of speed", async () => { await game.classicMode.startBattle([SpeciesId.SHUCKLE]); From dfc1e9aaac38734e32579b8af0ecf612d1bf25e8 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 18:25:36 -0700 Subject: [PATCH 10/18] Remove irrelevant `useSelfClosingElements` rule --- biome.jsonc | 1 - 1 file changed, 1 deletion(-) diff --git a/biome.jsonc b/biome.jsonc index 98c6b847307..b1bbcc6630a 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -80,7 +80,6 @@ "useNodejsImportProtocol": "off", "useTemplate": "off", // string concatenation is faster: https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation "useAsConstAssertion": "error", - "useSelfClosingElements": "error", "noUnusedTemplateLiteral": "error", "useNumberNamespace": "error", "noInferrableTypes": "error", From 1694195bc44484ce549c7efa2835850962357c02 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 18:27:43 -0700 Subject: [PATCH 11/18] Upgrade already followed rules to "error" --- biome.jsonc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index b1bbcc6630a..a351de71527 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -128,12 +128,12 @@ "noDelete": "error" }, "nursery": { - "useAdjacentGetterSetter": "warn", - "noConstantBinaryExpression": "warn", - "noTsIgnore": "warn", + "useAdjacentGetterSetter": "error", + "noConstantBinaryExpression": "error", + "noTsIgnore": "error", "noAwaitInLoop": "warn", "useJsonImportAttribute": "error", - "useIndexOf": "warn", + "useIndexOf": "error", "useObjectSpread": "info", "useNumericSeparators": "off", // TODO: enable? "useIterableCallbackReturn": "warn", From 4057de0950f31824266e2f424ce8d92688f4e6af Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 18:42:11 -0700 Subject: [PATCH 12/18] Remove unnecessary type cast --- src/ui/settings/navigationMenu.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/settings/navigationMenu.ts b/src/ui/settings/navigationMenu.ts index 9074a255d73..be3726bd47d 100644 --- a/src/ui/settings/navigationMenu.ts +++ b/src/ui/settings/navigationMenu.ts @@ -105,7 +105,7 @@ export class NavigationManager { export default class NavigationMenu extends Phaser.GameObjects.Container { private navigationIcons: InputsIcons; - protected headerTitles: Phaser.GameObjects.Text[] = [] as Phaser.GameObjects.Text[]; + protected headerTitles: Phaser.GameObjects.Text[] = []; /** * Creates an instance of NavigationMenu. From b231613d7ee924653332f5b935553a0692025392 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 18:45:24 -0700 Subject: [PATCH 13/18] Disable fixer for `useDefaultParameterLast` --- biome.jsonc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/biome.jsonc b/biome.jsonc index a351de71527..c1a44e8413f 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -75,7 +75,12 @@ "noNonNullAssertion": "off", // TODO: Turn this on ASAP and fix all non-null assertions in non-test files "noParameterAssign": "off", "useExponentiationOperator": "off", // Too typo-prone and easy to mixup with standard multiplication (* vs **) - "useDefaultParameterLast": "warn", // TODO: Fix spots in the codebase where this flag would be triggered, and then enable + "useDefaultParameterLast": { + // TODO: Fix spots in the codebase where this flag would be triggered + // and then set to "error" and re-enable the fixer + "level": "warn", + "fix": "none" + }, "useSingleVarDeclarator": "off", "useNodejsImportProtocol": "off", "useTemplate": "off", // string concatenation is faster: https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation From d5f52760f1310d16dc6b1ba14436df134d2eb4ed Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 18:49:54 -0700 Subject: [PATCH 14/18] Disable `useJsonImportAttribute` rule and revert changes --- biome.jsonc | 2 +- src/plugins/i18n.ts | 2 +- test/sprites/pokemonSprite.test.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index c1a44e8413f..61ef00a02b1 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -137,7 +137,7 @@ "noConstantBinaryExpression": "error", "noTsIgnore": "error", "noAwaitInLoop": "warn", - "useJsonImportAttribute": "error", + "useJsonImportAttribute": "off", // "Import attributes are only supported when the '--module' option is set to 'esnext', 'node18', 'nodenext', or 'preserve'. ts(2823)" "useIndexOf": "error", "useObjectSpread": "info", "useNumericSeparators": "off", // TODO: enable? diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 470aeaf69b7..7d3b30ed5b0 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -3,7 +3,7 @@ import i18next from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import HttpBackend from "i18next-http-backend"; import processor, { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor"; -import pkg from "../../package.json" with { type: "json" }; +import pkg from "../../package.json"; //#region Interfaces/Types diff --git a/test/sprites/pokemonSprite.test.ts b/test/sprites/pokemonSprite.test.ts index bd65d86d22a..be188503b1e 100644 --- a/test/sprites/pokemonSprite.test.ts +++ b/test/sprites/pokemonSprite.test.ts @@ -2,8 +2,8 @@ import { getAppRootDir } from "#test/sprites/spritesUtils"; import fs from "fs"; import path from "path"; import { beforeAll, describe, expect, it } from "vitest"; -import _masterlist from "../../public/images/pokemon/variant/_masterlist.json" with { type: "json" }; -import _exp_masterlist from "../../public/images/pokemon/variant/_exp_masterlist.json" with { type: "json" }; +import _masterlist from "../../public/images/pokemon/variant/_masterlist.json"; +import _exp_masterlist from "../../public/images/pokemon/variant/_exp_masterlist.json"; type PokemonVariantMasterlist = typeof _masterlist; type PokemonExpVariantMasterlist = typeof _exp_masterlist; From 34b6f71356d60f4805467d2717a082e9ee220f61 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 18:51:45 -0700 Subject: [PATCH 15/18] Fix `mockImage.ts` --- test/testUtils/mocks/mocksContainer/mockImage.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/testUtils/mocks/mocksContainer/mockImage.ts b/test/testUtils/mocks/mocksContainer/mockImage.ts index b128346ea7b..f8990985e54 100644 --- a/test/testUtils/mocks/mocksContainer/mockImage.ts +++ b/test/testUtils/mocks/mocksContainer/mockImage.ts @@ -1,6 +1,9 @@ import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export class MockImage extends MockContainer { + // biome-ignore lint/correctness/noUnusedPrivateClassMembers: this is intentional (?) + private texture; + constructor(textureManager, x, y, texture) { super(textureManager, x, y); this.texture = texture; From 95e350e3ac897e239d214c8056933d85aedd3528 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 19:27:16 -0700 Subject: [PATCH 16/18] ...there's a `@ts-nocheck` in this file --- test/testUtils/gameWrapper.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/testUtils/gameWrapper.ts b/test/testUtils/gameWrapper.ts index aa9b9b90c98..1b5021ee848 100644 --- a/test/testUtils/gameWrapper.ts +++ b/test/testUtils/gameWrapper.ts @@ -17,6 +17,12 @@ import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; import { MockTimedEventManager } from "./mocks/mockTimedEventManager"; import { PokedexMonContainer } from "#app/ui/pokedex-mon-container"; import MockContainer from "./mocks/mocksContainer/mockContainer"; +import InputManager = Phaser.Input.InputManager; +import KeyboardManager = Phaser.Input.Keyboard.KeyboardManager; +import KeyboardPlugin = Phaser.Input.Keyboard.KeyboardPlugin; +import GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; +import EventEmitter = Phaser.Events.EventEmitter; +import UpdateList = Phaser.GameObjects.UpdateList; // biome-ignore lint/performance/noNamespaceImport: Necessary in order to mock the var import * as bypassLoginModule from "#app/global-vars/bypass-login"; From 66edaebfa2fd6b4748cef2addb82fbd4478018ad Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 19:28:28 -0700 Subject: [PATCH 17/18] Use whole-file lint suppression comment in `version_converter.ts` --- src/system/version_migration/version_converter.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index 47f33ce689f..789fa96958c 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -1,3 +1,5 @@ +/** biome-ignore-all lint/performance/noNamespaceImport: Convenience */ + import type { SessionSaveMigrator } from "#app/@types/SessionSaveMigrator"; import type { SettingsSaveMigrator } from "#app/@types/SettingsSaveMigrator"; import type { SystemSaveMigrator } from "#app/@types/SystemSaveMigrator"; @@ -48,23 +50,18 @@ export const settingsMigrators: Readonly = [settingsMigr // import * as vA_B_C from "./versions/vA_B_C"; // --- v1.0.4 (and below) PATCHES --- // -// biome-ignore lint/performance/noNamespaceImport: Convenience (TODO: make this a file-wide ignore when Biome supports those) import * as v1_0_4 from "./versions/v1_0_4"; // --- v1.7.0 PATCHES --- // -// biome-ignore lint/performance/noNamespaceImport: Convenience import * as v1_7_0 from "./versions/v1_7_0"; // --- v1.8.3 PATCHES --- // -// biome-ignore lint/performance/noNamespaceImport: Convenience import * as v1_8_3 from "./versions/v1_8_3"; // --- v1.9.0 PATCHES --- // -// biome-ignore lint/performance/noNamespaceImport: Convenience import * as v1_9_0 from "./versions/v1_9_0"; // --- v1.10.0 PATCHES --- // -// biome-ignore lint/performance/noNamespaceImport: Convenience import * as v1_10_0 from "./versions/v1_10_0"; /** Current game version */ From 1146ae7de854ef14e17b6815f941a5c16c98dfea Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 17 Jun 2025 19:39:58 -0700 Subject: [PATCH 18/18] Add a couple comments to `biome.jsonc` --- biome.jsonc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index 61ef00a02b1..2281120bf1c 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -139,10 +139,10 @@ "noAwaitInLoop": "warn", "useJsonImportAttribute": "off", // "Import attributes are only supported when the '--module' option is set to 'esnext', 'node18', 'nodenext', or 'preserve'. ts(2823)" "useIndexOf": "error", - "useObjectSpread": "info", + "useObjectSpread": "error", "useNumericSeparators": "off", // TODO: enable? - "useIterableCallbackReturn": "warn", - "noShadow": "warn" + "useIterableCallbackReturn": "warn", // TODO: refactor and make "error" + "noShadow": "warn" // TODO: refactor and make "error" } } },