Repository: web-scrobbler/web-scrobbler
Pull request #4874 (2024-08-12 16:10:40)

Prepare for @typescript-eslint/eslint-plugin @ 8.
Unblocks #4884.


Patch:
diff --git a/build.ts b/build.ts
index 9a7ce9bb..89b91f46 100644
--- a/build.ts
+++ b/build.ts
@@ -57,7 +57,7 @@ async function main() {
 					colorLog(err, 'error');
 					colorLog(stdout, 'info');
 					colorLog(stderr, 'error');
-					reject();
+					reject(new Error());
 					return;
 				}
 				colorLog('Successfully compiled safari extension', 'success');
diff --git a/package-lock.json b/package-lock.json
index 2609cd12..caab90c0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,7 +12,7 @@
         "@web-scrobbler/metadata-filter": "3.2.0",
         "blueimp-md5": "2.19.0",
         "stylelint": "15.11.0",
-        "vite": "5.4.0",
+        "vite": "5.4.1",
         "webextension-polyfill": "0.12.0"
       },
       "devDependencies": {
@@ -21,7 +21,7 @@
         "@types/fs-extra": "11.0.3",
         "@types/imagemin": "9.0.0",
         "@types/imagemin-jpegtran": "5.0.4",
-        "@types/node": "22.2.0",
+        "@types/node": "22.4.0",
         "@types/react": "18.3.3",
         "@types/webextension-polyfill": "0.10.7",
         "@typescript-eslint/eslint-plugin": "7.17.0",
@@ -30,7 +30,7 @@
         "archiver": "7.0.1",
         "canvas": "2.11.2",
         "chokidar": "3.6.0",
-        "esbuild": "0.23.0",
+        "esbuild": "0.23.1",
         "eslint": "8.57.0",
         "eslint-plugin-react": "7.35.0",
         "eslint-plugin-solid": "0.14.1",
@@ -46,7 +46,7 @@
         "remark-cli": "12.0.1",
         "remark-preset-lint-recommended": "7.0.0",
         "sass": "1.77.8",
-        "solid-js": "1.8.20",
+        "solid-js": "1.8.21",
         "tsx": "4.17.0",
         "typescript": "5.5.4",
         "vite-plugin-conditional-compiler": "0.3.1",
@@ -657,9 +657,9 @@
       }
     },
     "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz",
-      "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz",
+      "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==",
       "cpu": [
         "ppc64"
       ],
@@ -673,9 +673,9 @@
       }
     },
     "node_modules/@esbuild/android-arm": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz",
-      "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz",
+      "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==",
       "cpu": [
         "arm"
       ],
@@ -689,9 +689,9 @@
       }
     },
     "node_modules/@esbuild/android-arm64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz",
-      "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz",
+      "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==",
       "cpu": [
         "arm64"
       ],
@@ -705,9 +705,9 @@
       }
     },
     "node_modules/@esbuild/android-x64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz",
-      "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz",
+      "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==",
       "cpu": [
         "x64"
       ],
@@ -721,9 +721,9 @@
       }
     },
     "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz",
-      "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz",
+      "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==",
       "cpu": [
         "arm64"
       ],
@@ -737,9 +737,9 @@
       }
     },
     "node_modules/@esbuild/darwin-x64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz",
-      "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz",
+      "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==",
       "cpu": [
         "x64"
       ],
@@ -753,9 +753,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz",
-      "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz",
+      "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==",
       "cpu": [
         "arm64"
       ],
@@ -769,9 +769,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz",
-      "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz",
+      "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==",
       "cpu": [
         "x64"
       ],
@@ -785,9 +785,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz",
-      "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz",
+      "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==",
       "cpu": [
         "arm"
       ],
@@ -801,9 +801,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz",
-      "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz",
+      "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==",
       "cpu": [
         "arm64"
       ],
@@ -817,9 +817,9 @@
       }
     },
     "node_modules/@esbuild/linux-ia32": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz",
-      "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz",
+      "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==",
       "cpu": [
         "ia32"
       ],
@@ -833,9 +833,9 @@
       }
     },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz",
-      "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz",
+      "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==",
       "cpu": [
         "loong64"
       ],
@@ -849,9 +849,9 @@
       }
     },
     "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz",
-      "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz",
+      "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==",
       "cpu": [
         "mips64el"
       ],
@@ -865,9 +865,9 @@
       }
     },
     "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz",
-      "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz",
+      "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==",
       "cpu": [
         "ppc64"
       ],
@@ -881,9 +881,9 @@
       }
     },
     "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz",
-      "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz",
+      "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==",
       "cpu": [
         "riscv64"
       ],
@@ -897,9 +897,9 @@
       }
     },
     "node_modules/@esbuild/linux-s390x": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz",
-      "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz",
+      "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==",
       "cpu": [
         "s390x"
       ],
@@ -913,9 +913,9 @@
       }
     },
     "node_modules/@esbuild/linux-x64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz",
-      "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz",
+      "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==",
       "cpu": [
         "x64"
       ],
@@ -929,9 +929,9 @@
       }
     },
     "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz",
-      "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz",
+      "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==",
       "cpu": [
         "x64"
       ],
@@ -945,9 +945,9 @@
       }
     },
     "node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz",
-      "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz",
+      "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==",
       "cpu": [
         "arm64"
       ],
@@ -961,9 +961,9 @@
       }
     },
     "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz",
-      "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz",
+      "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==",
       "cpu": [
         "x64"
       ],
@@ -977,9 +977,9 @@
       }
     },
     "node_modules/@esbuild/sunos-x64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz",
-      "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz",
+      "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==",
       "cpu": [
         "x64"
       ],
@@ -993,9 +993,9 @@
       }
     },
     "node_modules/@esbuild/win32-arm64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz",
-      "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz",
+      "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==",
       "cpu": [
         "arm64"
       ],
@@ -1009,9 +1009,9 @@
       }
     },
     "node_modules/@esbuild/win32-ia32": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz",
-      "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz",
+      "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==",
       "cpu": [
         "ia32"
       ],
@@ -1025,9 +1025,9 @@
       }
     },
     "node_modules/@esbuild/win32-x64": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz",
-      "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz",
+      "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==",
       "cpu": [
         "x64"
       ],
@@ -1867,12 +1867,12 @@
       "dev": true
     },
     "node_modules/@types/node": {
-      "version": "22.2.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz",
-      "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==",
+      "version": "22.4.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.4.0.tgz",
+      "integrity": "sha512-49AbMDwYUz7EXxKU/r7mXOsxwFr4BYbvB7tWYxVuLdb2ibd30ijjXINSMAHiEEZk5PCRBmW1gUeisn2VMKt3cQ==",
       "devOptional": true,
       "dependencies": {
-        "undici-types": "~6.13.0"
+        "undici-types": "~6.19.2"
       }
     },
     "node_modules/@types/normalize-package-data": {
@@ -5380,9 +5380,9 @@
       }
     },
     "node_modules/esbuild": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz",
-      "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz",
+      "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==",
       "dev": true,
       "hasInstallScript": true,
       "bin": {
@@ -5392,30 +5392,30 @@
         "node": ">=18"
       },
       "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.23.0",
-        "@esbuild/android-arm": "0.23.0",
-        "@esbuild/android-arm64": "0.23.0",
-        "@esbuild/android-x64": "0.23.0",
-        "@esbuild/darwin-arm64": "0.23.0",
-        "@esbuild/darwin-x64": "0.23.0",
-        "@esbuild/freebsd-arm64": "0.23.0",
-        "@esbuild/freebsd-x64": "0.23.0",
-        "@esbuild/linux-arm": "0.23.0",
-        "@esbuild/linux-arm64": "0.23.0",
-        "@esbuild/linux-ia32": "0.23.0",
-        "@esbuild/linux-loong64": "0.23.0",
-        "@esbuild/linux-mips64el": "0.23.0",
-        "@esbuild/linux-ppc64": "0.23.0",
-        "@esbuild/linux-riscv64": "0.23.0",
-        "@esbuild/linux-s390x": "0.23.0",
-        "@esbuild/linux-x64": "0.23.0",
-        "@esbuild/netbsd-x64": "0.23.0",
-        "@esbuild/openbsd-arm64": "0.23.0",
-        "@esbuild/openbsd-x64": "0.23.0",
-        "@esbuild/sunos-x64": "0.23.0",
-        "@esbuild/win32-arm64": "0.23.0",
-        "@esbuild/win32-ia32": "0.23.0",
-        "@esbuild/win32-x64": "0.23.0"
+        "@esbuild/aix-ppc64": "0.23.1",
+        "@esbuild/android-arm": "0.23.1",
+        "@esbuild/android-arm64": "0.23.1",
+        "@esbuild/android-x64": "0.23.1",
+        "@esbuild/darwin-arm64": "0.23.1",
+        "@esbuild/darwin-x64": "0.23.1",
+        "@esbuild/freebsd-arm64": "0.23.1",
+        "@esbuild/freebsd-x64": "0.23.1",
+        "@esbuild/linux-arm": "0.23.1",
+        "@esbuild/linux-arm64": "0.23.1",
+        "@esbuild/linux-ia32": "0.23.1",
+        "@esbuild/linux-loong64": "0.23.1",
+        "@esbuild/linux-mips64el": "0.23.1",
+        "@esbuild/linux-ppc64": "0.23.1",
+        "@esbuild/linux-riscv64": "0.23.1",
+        "@esbuild/linux-s390x": "0.23.1",
+        "@esbuild/linux-x64": "0.23.1",
+        "@esbuild/netbsd-x64": "0.23.1",
+        "@esbuild/openbsd-arm64": "0.23.1",
+        "@esbuild/openbsd-x64": "0.23.1",
+        "@esbuild/sunos-x64": "0.23.1",
+        "@esbuild/win32-arm64": "0.23.1",
+        "@esbuild/win32-ia32": "0.23.1",
+        "@esbuild/win32-x64": "0.23.1"
       }
     },
     "node_modules/escalade": {
@@ -11266,9 +11266,9 @@
       }
     },
     "node_modules/solid-js": {
-      "version": "1.8.20",
-      "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.20.tgz",
-      "integrity": "sha512-SsgaExCJ97mPm9WpAusjZ484Z8zTp8ggiueQOsrm81iAP7UaxaN+wiOgnPcJ9u6B2SQpoQ4FiDPAZBqVWi1V4g==",
+      "version": "1.8.21",
+      "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.21.tgz",
+      "integrity": "sha512-FHUGdoo7GVa1BTpGh/4UtwIISde0vSXoqNB6KFpHiTgkIY959tmCJ7NYQAWDfScBfnpoMGZR8lFz0DiwW/gFlw==",
       "dev": true,
       "dependencies": {
         "csstype": "^3.1.0",
@@ -12844,9 +12844,9 @@
       }
     },
     "node_modules/undici-types": {
-      "version": "6.13.0",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz",
-      "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==",
+      "version": "6.19.6",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.6.tgz",
+      "integrity": "sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==",
       "devOptional": true
     },
     "node_modules/unicorn-magic": {
@@ -13566,12 +13566,12 @@
       }
     },
     "node_modules/vite": {
-      "version": "5.4.0",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz",
-      "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==",
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz",
+      "integrity": "sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==",
       "dependencies": {
         "esbuild": "^0.21.3",
-        "postcss": "^8.4.40",
+        "postcss": "^8.4.41",
         "rollup": "^4.13.0"
       },
       "bin": {
diff --git a/package.json b/package.json
index db085339..48ddae4e 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
     "@web-scrobbler/metadata-filter": "3.2.0",
     "blueimp-md5": "2.19.0",
     "stylelint": "15.11.0",
-    "vite": "5.4.0",
+    "vite": "5.4.1",
     "webextension-polyfill": "0.12.0"
   },
   "devDependencies": {
@@ -44,7 +44,7 @@
     "@types/fs-extra": "11.0.3",
     "@types/imagemin": "9.0.0",
     "@types/imagemin-jpegtran": "5.0.4",
-    "@types/node": "22.2.0",
+    "@types/node": "22.4.0",
     "@types/react": "18.3.3",
     "@types/webextension-polyfill": "0.10.7",
     "@typescript-eslint/eslint-plugin": "7.17.0",
@@ -53,7 +53,7 @@
     "archiver": "7.0.1",
     "canvas": "2.11.2",
     "chokidar": "3.6.0",
-    "esbuild": "0.23.0",
+    "esbuild": "0.23.1",
     "eslint": "8.57.0",
     "eslint-plugin-react": "7.35.0",
     "eslint-plugin-solid": "0.14.1",
@@ -69,7 +69,7 @@
     "remark-cli": "12.0.1",
     "remark-preset-lint-recommended": "7.0.0",
     "sass": "1.77.8",
-    "solid-js": "1.8.20",
+    "solid-js": "1.8.21",
     "tsx": "4.17.0",
     "typescript": "5.5.4",
     "vite-plugin-conditional-compiler": "0.3.1",
diff --git a/scripts/compile-connectors.ts b/scripts/compile-connectors.ts
index 10734d38..07327efd 100644
--- a/scripts/compile-connectors.ts
+++ b/scripts/compile-connectors.ts
@@ -19,7 +19,7 @@ function generateConnectors() {
 					colorLog(err, 'error');
 					colorLog(stdout, 'info');
 					colorLog(stderr, 'error');
-					reject();
+					reject(new Error());
 					return;
 				}
 				colorLog('Connector file compilation complete', 'success');
@@ -35,7 +35,7 @@ function generateConnectors() {
 					resolve();
 				} catch (err) {
 					colorLog(err, 'error');
-					reject();
+					reject(new Error());
 				}
 			},
 		);
diff --git a/scripts/generate-icons.ts b/scripts/generate-icons.ts
index b5c37f61..3edd8e3c 100644
--- a/scripts/generate-icons.ts
+++ b/scripts/generate-icons.ts
@@ -167,7 +167,7 @@ export default function generateIcons(): PluginOption {
 						resolve();
 					});
 				} catch (err) {
-					reject(err);
+					reject(err as Error);
 				}
 			});
 		},
diff --git a/src/connectors/1001tracklists.ts b/src/connectors/1001tracklists.ts
index b0e9e719..ee5208a5 100644
--- a/src/connectors/1001tracklists.ts
+++ b/src/connectors/1001tracklists.ts
@@ -33,7 +33,9 @@ Connector.getCurrentTime = () => {
 Connector.getDuration = () => {
 	switch (true) {
 		case cue && nextCue > 0:
-			0 > currentTime - cue && (nextCue += Math.abs(currentTime - cue));
+			if (0 > currentTime - cue) {
+				nextCue += Math.abs(currentTime - cue);
+			}
 			return nextCue - cue;
 		case nextCue > 0:
 			return nextCue;
diff --git a/src/connectors/eggs-dom-inject.ts b/src/connectors/eggs-dom-inject.ts
index 75a0a149..010f8b8e 100644
--- a/src/connectors/eggs-dom-inject.ts
+++ b/src/connectors/eggs-dom-inject.ts
@@ -111,8 +111,9 @@ if ('cleanup' in window && typeof window.cleanup === 'function') {
 				id: frameID,
 				channel: 'widget',
 			});
-			videoFrame.contentWindow &&
+			if (videoFrame.contentWindow) {
 				videoFrame.contentWindow.postMessage(message, '*');
+			}
 
 			message = JSON.stringify({
 				event: 'command',
@@ -121,8 +122,9 @@ if ('cleanup' in window && typeof window.cleanup === 'function') {
 				id: frameID,
 				channel: 'widget',
 			});
-			videoFrame.contentWindow &&
+			if (videoFrame.contentWindow) {
 				videoFrame.contentWindow.postMessage(message, '*');
+			}
 		}
 
 		videoFrame.addEventListener('load', onLoad);
diff --git a/src/connectors/musickit-dom-inject.ts b/src/connectors/musickit-dom-inject.ts
index 5551f039..92a6a3dc 100644
--- a/src/connectors/musickit-dom-inject.ts
+++ b/src/connectors/musickit-dom-inject.ts
@@ -78,7 +78,7 @@ if ('cleanup' in window && typeof window.cleanup === 'function') {
 				}
 				if (i++ > 100) {
 					clearInterval(interval);
-					reject('MusicKit instance not found');
+					reject(new Error('MusicKit instance not found'));
 				}
 			}, 100);
 		});
diff --git a/src/connectors/simulatorradio.ts b/src/connectors/simulatorradio.ts
new file mode 100644
index 00000000..062b0008
--- /dev/null
+++ b/src/connectors/simulatorradio.ts
@@ -0,0 +1,7 @@
+export {};
+
+Connector.playerSelector = '.container.player-wrap';
+Connector.trackArtSelector = '.record-img';
+Connector.artistSelector = '.song>.Artist';
+Connector.trackSelector = '.song>.Title';
+Connector.playButtonSelector = '.playpause > .fa-play';
diff --git a/src/connectors/tidal.ts b/src/connectors/tidal.ts
index ceef3bfd..68c545c3 100644
--- a/src/connectors/tidal.ts
+++ b/src/connectors/tidal.ts
@@ -10,7 +10,7 @@ Connector.scrobblingDisallowedReason = () =>
 	Util.queryElements(Connector.playButtonSelector) ? null : 'ElementMissing';
 
 Connector.trackSelector = [
-	'#nowPlaying div.react-tabs__tab-panel--selected > div > div:nth-child(1) > div:nth-child(1) > .wave-text-description-medium',
+	'#nowPlaying span[data-test="now-playing-track-title"]',
 	`${Connector.playerSelector} div[data-test="footer-track-title"]`,
 ];
 
@@ -33,7 +33,7 @@ Connector.getArtist = () => {
 };
 
 Connector.albumSelector = [
-	'#nowPlaying div.react-tabs a[href^="/album/"]',
+	'#nowPlaying div.react-tabs div[class^="currentMediaInfoContainer--"] div[class^="creditsCell--"] a[href^="/album/"]',
 	`${Connector.playerSelector} a[href^="/album/"]`,
 ];
 
diff --git a/src/core/background/scrobble.ts b/src/core/background/scrobble.ts
index 42922459..547bc9a7 100644
--- a/src/core/background/scrobble.ts
+++ b/src/core/background/scrobble.ts
@@ -49,7 +49,7 @@ export async function toggleLove(
 	if (
 		res.some((callResult) => callResult === ServiceCallResult.ERROR_OTHER)
 	) {
-		throw 'An error occurred while toggling love for track';
+		throw new Error('An error occurred while toggling love for track');
 	}
 	return res;
 }
diff --git a/src/core/connectors.ts b/src/core/connectors.ts
index 84e3766e..2536327d 100644
--- a/src/core/connectors.ts
+++ b/src/core/connectors.ts
@@ -287,7 +287,7 @@ export default <ConnectorMeta[]>[
 	},
 	{
 		label: 'Online Radio Box',
-		matches: ['*://onlineradiobox.com/*'],
+		matches: ['*://onlineradiobox.com/*', '*://p.onlineradiobox.com/*'],
 		js: 'onlineradiobox.js',
 		id: 'onlineradiobox',
 	},
@@ -2569,4 +2569,10 @@ export default <ConnectorMeta[]>[
 		js: 'mirlo.js',
 		id: 'mirlo',
 	},
+	{
+		label: 'Simulator Radio',
+		matches: ['*://*.simulatorradio.com/*'],
+		js: 'simulatorradio.js',
+		id: 'simulatorradio',
+	},
 ];
diff --git a/src/core/scrobbler/audio-scrobbler/audio-scrobbler.ts b/src/core/scrobbler/audio-scrobbler/audio-scrobbler.ts
index 1a94fd97..71b1c267 100644
--- a/src/core/scrobbler/audio-scrobbler/audio-scrobbler.ts
+++ b/src/core/scrobbler/audio-scrobbler/audio-scrobbler.ts
@@ -101,11 +101,11 @@ export default abstract class AudioScrobbler extends BaseScrobbler<'LastFM'> {
 
 		const data = await this.storage.get();
 		if (!data) {
-			throw ServiceCallResult.ERROR_AUTH;
+			throw new Error(ServiceCallResult.ERROR_AUTH);
 		}
 		if (!('token' in data)) {
 			if (!('sessionID' in data)) {
-				throw ServiceCallResult.ERROR_AUTH;
+				throw new Error(ServiceCallResult.ERROR_AUTH);
 			}
 			return {
 				sessionID: data.sessionID ?? 'undefined',
@@ -137,7 +137,7 @@ export default abstract class AudioScrobbler extends BaseScrobbler<'LastFM'> {
 				this.debugLog('Failed to trade token for session', 'warn');
 
 				await this.signOut();
-				throw ServiceCallResult.ERROR_AUTH;
+				throw new Error(ServiceCallResult.ERROR_AUTH);
 			}
 		}
 
@@ -321,7 +321,7 @@ export default abstract class AudioScrobbler extends BaseScrobbler<'LastFM'> {
 			response = await timeoutPromise(timeout, promise);
 			responseData = (await response.json()) as T;
 		} catch (e) {
-			throw ServiceCallResult.ERROR_OTHER;
+			throw new Error(ServiceCallResult.ERROR_OTHER);
 		}
 
 		const responseStr = JSON.stringify(responseData, null, 2);
@@ -329,7 +329,7 @@ export default abstract class AudioScrobbler extends BaseScrobbler<'LastFM'> {
 
 		if (!response.ok) {
 			this.debugLog(`${params.method} response:\n${debugMsg}`, 'error');
-			throw ServiceCallResult.ERROR_OTHER;
+			throw new Error(ServiceCallResult.ERROR_OTHER);
 		}
 
 		this.debugLog(`${params.method} response:\n${debugMsg}`);
@@ -355,7 +355,7 @@ export default abstract class AudioScrobbler extends BaseScrobbler<'LastFM'> {
 		const result = this.processResponse(response);
 
 		if (result !== ServiceCallResult.RESULT_OK) {
-			throw ServiceCallResult.ERROR_AUTH;
+			throw new Error(ServiceCallResult.ERROR_AUTH);
 		}
 
 		const sessionName = response.session.name;
diff --git a/src/core/scrobbler/listenbrainz/listenbrainz-scrobbler.ts b/src/core/scrobbler/listenbrainz/listenbrainz-scrobbler.ts
index 069f92f6..fcc217c5 100644
--- a/src/core/scrobbler/listenbrainz/listenbrainz-scrobbler.ts
+++ b/src/core/scrobbler/listenbrainz/listenbrainz-scrobbler.ts
@@ -110,7 +110,7 @@ export default class ListenBrainzScrobbler extends BaseScrobbler<'ListenBrainz'>
 		if (!data) {
 			this.debugLog('no data', 'error');
 			await this.signOut();
-			throw ServiceCallResult.ERROR_AUTH;
+			throw new Error(ServiceCallResult.ERROR_AUTH);
 		}
 
 		if ('isAuthStarted' in data && data.isAuthStarted) {
@@ -130,10 +130,10 @@ export default class ListenBrainzScrobbler extends BaseScrobbler<'ListenBrainz'>
 				this.debugLog('Failed to get session', 'warn');
 
 				await this.signOut();
-				throw ServiceCallResult.ERROR_AUTH;
+				throw new Error(ServiceCallResult.ERROR_AUTH);
 			}
 		} else if (!('sessionID' in data) || !data.sessionID) {
-			throw ServiceCallResult.ERROR_AUTH;
+			throw new Error(ServiceCallResult.ERROR_AUTH);
 		}
 
 		return {
@@ -298,16 +298,16 @@ export default class ListenBrainzScrobbler extends BaseScrobbler<'ListenBrainz'>
 			result = (await response.json()) as T;
 		} catch (e) {
 			this.debugLog('Error while sending request', 'error');
-			throw ServiceCallResult.ERROR_OTHER;
+			throw new Error(ServiceCallResult.ERROR_OTHER);
 		}
 
 		switch (response.status) {
 			case 400:
 				this.debugLog('Invalid JSON sent', 'error');
-				throw ServiceCallResult.ERROR_AUTH;
+				throw new Error(ServiceCallResult.ERROR_AUTH);
 			case 401:
 				this.debugLog('Invalid Authorization sent', 'error');
-				throw ServiceCallResult.ERROR_AUTH;
+				throw new Error(ServiceCallResult.ERROR_AUTH);
 		}
 
 		this.debugLog(JSON.stringify(result, null, 2));
@@ -344,7 +344,7 @@ export default class ListenBrainzScrobbler extends BaseScrobbler<'ListenBrainz'>
 			return session;
 		}
 
-		throw ServiceCallResult.ERROR_AUTH;
+		throw new Error(ServiceCallResult.ERROR_AUTH);
 	}
 
 	private async fetchSession(url: string) {
diff --git a/src/core/scrobbler/maloja/maloja-scrobbler.ts b/src/core/scrobbler/maloja/maloja-scrobbler.ts
index 03359464..a6c6f893 100644
--- a/src/core/scrobbler/maloja/maloja-scrobbler.ts
+++ b/src/core/scrobbler/maloja/maloja-scrobbler.ts
@@ -62,7 +62,7 @@ export default class MalojaScrobbler extends BaseScrobbler<'Maloja'> {
 	/** @override */
 	public async getSession(): Promise<SessionData> {
 		if (!this.userToken) {
-			throw ServiceCallResult.ERROR_AUTH;
+			throw new Error(ServiceCallResult.ERROR_AUTH);
 		}
 		return Promise.resolve({ sessionID: this.userToken });
 	}
diff --git a/src/core/scrobbler/pleroma/pleroma-scrobbler.ts b/src/core/scrobbler/pleroma/pleroma-scrobbler.ts
index baa27d98..c8a8b044 100644
--- a/src/core/scrobbler/pleroma/pleroma-scrobbler.ts
+++ b/src/core/scrobbler/pleroma/pleroma-scrobbler.ts
@@ -65,7 +65,7 @@ export default class PleromaScrobbler extends BaseScrobbler<'Pleroma'> {
 	/** @override */
 	public async getSession(): Promise<SessionData> {
 		if (!this.userToken) {
-			throw ServiceCallResult.ERROR_AUTH;
+			throw new Error(ServiceCallResult.ERROR_AUTH);
 		}
 
 		const requestInfo = {
@@ -82,7 +82,7 @@ export default class PleromaScrobbler extends BaseScrobbler<'Pleroma'> {
 		try {
 			response = await timeoutPromise(timeout, promise);
 			if (response.status !== 200) {
-				throw ServiceCallResult.ERROR_AUTH;
+				throw new Error(ServiceCallResult.ERROR_AUTH);
 			}
 
 			const json = (await response.json()) as PleromaUser | null;
@@ -90,7 +90,7 @@ export default class PleromaScrobbler extends BaseScrobbler<'Pleroma'> {
 			return { sessionID: this.userToken, sessionName: fqn };
 		} catch (e) {
 			this.debugLog('Error while sending request', 'error');
-			throw ServiceCallResult.ERROR_AUTH;
+			throw new Error(ServiceCallResult.ERROR_AUTH);
 		}
 	}
 
diff --git a/src/core/scrobbler/webhook-scrobbler.ts b/src/core/scrobbler/webhook-scrobbler.ts
index 72f16f4b..6a6d324b 100644
--- a/src/core/scrobbler/webhook-scrobbler.ts
+++ b/src/core/scrobbler/webhook-scrobbler.ts
@@ -49,7 +49,7 @@ export default class WebhookScrobbler extends BaseScrobbler<'Webhook'> {
 	/** @override */
 	getSession(): Promise<SessionData> {
 		if (!this.arrayProperties || this.arrayProperties.length === 0) {
-			return Promise.reject('');
+			return Promise.reject(new Error(''));
 		}
 		// Webhook connection doesn't have a session.
 		return Promise.resolve({ sessionID: 'webhook' });
diff --git a/src/core/storage/options.ts b/src/core/storage/options.ts
index 1f3dfd48..ec555496 100644
--- a/src/core/storage/options.ts
+++ b/src/core/storage/options.ts
@@ -366,7 +366,7 @@ export async function isConnectorEnabled(
 ): Promise<boolean> {
 	const data = await options.get();
 	if (!data) {
-		throw 'No options data found';
+		throw new Error('No options data found');
 	}
 	return !data[DISABLED_CONNECTORS][connector.id] === true;
 }
@@ -382,7 +382,7 @@ export async function setConnectorEnabled(
 ): Promise<void> {
 	const data = await options.get();
 	if (!data) {
-		throw 'No options data found';
+		throw new Error('No options data found');
 	}
 
 	if (state) {
@@ -401,7 +401,7 @@ export async function setConnectorEnabled(
 export async function setAllConnectorsEnabled(state: boolean): Promise<void> {
 	const data = await options.get();
 	if (!data) {
-		throw 'No options data found';
+		throw new Error('No options data found');
 	}
 
 	data[DISABLED_CONNECTORS] = {};
diff --git a/src/ui/popup/regex.tsx b/src/ui/popup/regex.tsx
index 973ba5cb..07aafea8 100644
--- a/src/ui/popup/regex.tsx
+++ b/src/ui/popup/regex.tsx
@@ -291,29 +291,31 @@ function BlockTagButtonIOS(props: {
 					)}
 					onClick={() => {
 						const tabId = props.tabId;
-						loadedBlockedTypes()[transformedType()]
-							? blockedTags
-									.removeFromBlocklist(
-										transformedType(),
-										props.clonedSong,
-									)
-									.then(() =>
-										sendBackgroundMessage(tabId ?? -1, {
-											type: 'reprocessSong',
-											payload: undefined,
-										}),
-									)
-							: blockedTags
-									.addToBlocklist(
-										transformedType(),
-										props.clonedSong,
-									)
-									.then(() =>
-										sendBackgroundMessage(tabId ?? -1, {
-											type: 'reprocessSong',
-											payload: undefined,
-										}),
-									);
+						if (loadedBlockedTypes()[transformedType()]) {
+							blockedTags
+								.removeFromBlocklist(
+									transformedType(),
+									props.clonedSong,
+								)
+								.then(() =>
+									sendBackgroundMessage(tabId ?? -1, {
+										type: 'reprocessSong',
+										payload: undefined,
+									}),
+								);
+						} else {
+							blockedTags
+								.addToBlocklist(
+									transformedType(),
+									props.clonedSong,
+								)
+								.then(() =>
+									sendBackgroundMessage(tabId ?? -1, {
+										type: 'reprocessSong',
+										payload: undefined,
+									}),
+								);
+						}
 					}}
 				>
 					<Show
@@ -604,23 +606,25 @@ function BlockTagButton(props: {
 			)}
 			onClick={() => {
 				const tabId = props.tabId;
-				props.isBlocked
-					? blockedTags
-							.removeFromBlocklist(props.type, props.clonedSong)
-							.then(() =>
-								sendBackgroundMessage(tabId ?? -1, {
-									type: 'reprocessSong',
-									payload: undefined,
-								}),
-							)
-					: blockedTags
-							.addToBlocklist(props.type, props.clonedSong)
-							.then(() =>
-								sendBackgroundMessage(tabId ?? -1, {
-									type: 'reprocessSong',
-									payload: undefined,
-								}),
-							);
+				if (props.isBlocked) {
+					blockedTags
+						.removeFromBlocklist(props.type, props.clonedSong)
+						.then(() =>
+							sendBackgroundMessage(tabId ?? -1, {
+								type: 'reprocessSong',
+								payload: undefined,
+							}),
+						);
+				} else {
+					blockedTags
+						.addToBlocklist(props.type, props.clonedSong)
+						.then(() =>
+							sendBackgroundMessage(tabId ?? -1, {
+								type: 'reprocessSong',
+								payload: undefined,
+							}),
+						);
+				}
 			}}
 		>
 			<Show when={props.isBlocked} fallback={<props.BlockIcon />}>
diff --git a/src/util/util.ts b/src/util/util.ts
index e97a530f..874e76db 100644
--- a/src/util/util.ts
+++ b/src/util/util.ts
@@ -196,7 +196,7 @@ export function timeoutPromise<T>(
 				clearTimeout(timeoutId);
 				resolve(res);
 			},
-			(err) => {
+			(err: Error) => {
 				clearTimeout(timeoutId);
 				reject(err);
 			},


Test patch:
diff --git a/tests/background/custom-patterns.test.ts b/tests/background/custom-patterns.test.ts
index c92c1fc9..246b6a6b 100644
--- a/tests/background/custom-patterns.test.ts
+++ b/tests/background/custom-patterns.test.ts
@@ -1,3 +1,5 @@
+/* eslint-disable @typescript-eslint/no-unused-expressions */
+
 import { expect, describe, it, beforeAll, afterAll } from 'vitest';
 
 import webextensionPolyfill from '#/mocks/webextension-polyfill';
diff --git a/tests/background/regex-edits.test.ts b/tests/background/regex-edits.test.ts
index cde50000..03b08b83 100644
--- a/tests/background/regex-edits.test.ts
+++ b/tests/background/regex-edits.test.ts
@@ -1,3 +1,5 @@
+/* eslint-disable @typescript-eslint/no-unused-expressions */
+
 import webextensionPolyfill from '#/mocks/webextension-polyfill';
 import fetchPolyfill from '#/mocks/fetch';
 import Pipeline from '@/core/object/pipeline/pipeline';
diff --git a/tests/background/saved-edits.test.ts b/tests/background/saved-edits.test.ts
index ed98bbc7..8c63d683 100644
--- a/tests/background/saved-edits.test.ts
+++ b/tests/background/saved-edits.test.ts
@@ -1,3 +1,5 @@
+/* eslint-disable @typescript-eslint/no-unused-expressions */
+
 import { expect, describe, it, beforeAll } from 'vitest';
 
 import webextensionPolyfill from '#/mocks/webextension-polyfill';
diff --git a/tests/background/song.test.ts b/tests/background/song.test.ts
index 63237852..4ba90edb 100644
--- a/tests/background/song.test.ts
+++ b/tests/background/song.test.ts
@@ -1,3 +1,5 @@
+/* eslint-disable @typescript-eslint/no-unused-expressions */
+
 import { expect, it, describe } from 'vitest';
 import type { ParsedSongData, ProcessedSongData } from '@/core/object/song';
 import Song from '@/core/object/song';
diff --git a/tests/background/storage.test.ts b/tests/background/storage.test.ts
index 453d6e5f..ee0eb088 100644
--- a/tests/background/storage.test.ts
+++ b/tests/background/storage.test.ts
@@ -1,3 +1,5 @@
+/* eslint-disable @typescript-eslint/no-unused-expressions */
+
 /**
  * Tests for 'BrowserStorage' module.
  */
diff --git a/tests/mocks/fetch.ts b/tests/mocks/fetch.ts
index c09dcaa7..be7bc3f0 100644
--- a/tests/mocks/fetch.ts
+++ b/tests/mocks/fetch.ts
@@ -41,7 +41,7 @@ class FetchMocker {
 	constructor() {
 		(global.fetch as unknown) = vi.fn((input: string) => {
 			if (!(input in responses)) {
-				throw `${input} not mocked`;
+				throw new Error(`${input} not mocked`);
 			}
 			return Promise.resolve(
 				createFetchResponse(responses[input as keyof typeof responses]),