diff --git a/eslint.config.ts b/eslint.config.ts index 454d621..e3fb0d8 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -7,7 +7,7 @@ import eslintPluginTsdoc from 'eslint-plugin-tsdoc' import tseslint from 'typescript-eslint' export default defineConfig( - globalIgnores(['.output/**', '.wxt/**', 'coverage/**', 'node_modules/**', 'public/**']), + globalIgnores(['.wxt/**', 'coverage/**', 'dist/**', 'node_modules/**', 'public/**']), eslint.configs.recommended, tseslint.configs.strictTypeChecked, tseslint.configs.stylisticTypeChecked, diff --git a/package.json b/package.json index 8ed6e09..a133d7f 100644 --- a/package.json +++ b/package.json @@ -28,27 +28,27 @@ "devDependencies": { "@eslint/js": "^9.39.3", "@vitest/eslint-plugin": "^1.6.9", - "@wxt-dev/i18n": "^0.2.4", - "autoprefixer": "^10.4.24", + "@wxt-dev/i18n": "^0.2.5", + "autoprefixer": "^10.4.27", "esbuild": "^0.27.3", "eslint": "^9.39.3", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-simple-import-sort": "^12.1.1", - "eslint-plugin-tsdoc": "^0.5.0", + "eslint-plugin-tsdoc": "^0.5.2", "husky": "^9.1.7", - "lint-staged": "^16.2.7", + "lint-staged": "^16.3.0", "postcss": "^8.5.6", "postcss-for": "^2.1.1", "postcss-load-config": "^6.0.1", "prettier": "^3.8.1", - "stylelint": "^17.3.0", + "stylelint": "^17.4.0", "stylelint-config-standard": "^40.0.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.56.0", + "typescript-eslint": "^8.56.1", "vite": "^7.3.1", "vitest": "^4.0.18", - "wxt": "^0.20.17" + "wxt": "^0.20.18" }, "engines": { "node": ">=24.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2952e38..7bef26a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,13 +13,13 @@ importers: version: 9.39.3 '@vitest/eslint-plugin': specifier: ^1.6.9 - version: 1.6.9(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@25.3.0)(jiti@2.6.1)(jsdom@26.1.0)(yaml@2.8.2)) + version: 1.6.9(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@25.3.3)(jiti@2.6.1)(jsdom@26.1.0)(yaml@2.8.2)) '@wxt-dev/i18n': - specifier: ^0.2.4 - version: 0.2.4(wxt@0.20.17(@types/node@25.3.0)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(rollup@4.58.0)(yaml@2.8.2)) + specifier: ^0.2.5 + version: 0.2.5(wxt@0.20.18(@types/node@25.3.3)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(rollup@4.59.0)(yaml@2.8.2)) autoprefixer: - specifier: ^10.4.24 - version: 10.4.24(postcss@8.5.6) + specifier: ^10.4.27 + version: 10.4.27(postcss@8.5.6) esbuild: specifier: ^0.27.3 version: 0.27.3 @@ -36,14 +36,14 @@ importers: specifier: ^12.1.1 version: 12.1.1(eslint@9.39.3(jiti@2.6.1)) eslint-plugin-tsdoc: - specifier: ^0.5.0 - version: 0.5.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + specifier: ^0.5.2 + version: 0.5.2(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) husky: specifier: ^9.1.7 version: 9.1.7 lint-staged: - specifier: ^16.2.7 - version: 16.2.7 + specifier: ^16.3.0 + version: 16.3.0 postcss: specifier: ^8.5.6 version: 8.5.6 @@ -57,26 +57,26 @@ importers: specifier: ^3.8.1 version: 3.8.1 stylelint: - specifier: ^17.3.0 - version: 17.3.0(typescript@5.9.3) + specifier: ^17.4.0 + version: 17.4.0(typescript@5.9.3) stylelint-config-standard: specifier: ^40.0.0 - version: 40.0.0(stylelint@17.3.0(typescript@5.9.3)) + version: 40.0.0(stylelint@17.4.0(typescript@5.9.3)) typescript: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.56.0 - version: 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.56.1 + version: 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2) + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2) vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(jsdom@26.1.0)(yaml@2.8.2) + version: 4.0.18(@types/node@25.3.3)(jiti@2.6.1)(jsdom@26.1.0)(yaml@2.8.2) wxt: - specifier: ^0.20.17 - version: 0.20.17(@types/node@25.3.0)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(rollup@4.58.0)(yaml@2.8.2) + specifier: ^0.20.18 + version: 0.20.18(@types/node@25.3.3)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(rollup@4.59.0)(yaml@2.8.2) packages: @@ -121,11 +121,11 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@cacheable/memory@2.0.7': - resolution: {integrity: sha512-RbxnxAMf89Tp1dLhXMS7ceft/PGsDl1Ip7T20z5nZ+pwIAsQ1p2izPjVG69oCLv/jfQ7HDPHTWK0c9rcAWXN3A==} + '@cacheable/memory@2.0.8': + resolution: {integrity: sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==} - '@cacheable/utils@2.3.4': - resolution: {integrity: sha512-knwKUJEYgIfwShABS1BX6JyJJTglAFcEU7EXqzTdiGCXur4voqkiJkdgZIQtWNFhynzDWERcTYv/sETMu3uJWA==} + '@cacheable/utils@2.4.0': + resolution: {integrity: sha512-PeMMsqjVq+bF0WBsxFBxr/WozBJiZKY0rUojuaCoIaKnEl3Ju1wfEwS+SV1DU/cSe8fqHIPiYJFif8T3MVt4cQ==} '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} @@ -164,8 +164,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.27': - resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==} + '@csstools/css-syntax-patches-for-csstree@1.0.28': + resolution: {integrity: sha512-1NRf1CUBjnr3K7hu8BLxjQrKCxEe8FP/xmPTenAxCRZWVLbmGotkFvG9mfNpjA6k7Bw1bw4BilZq9cu19RA5pg==} '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} @@ -385,8 +385,8 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + '@eslint/eslintrc@3.3.4': + resolution: {integrity: sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.39.3': @@ -442,8 +442,8 @@ packages: '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - '@microsoft/tsdoc-config@0.18.0': - resolution: {integrity: sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw==} + '@microsoft/tsdoc-config@0.18.1': + resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==} '@microsoft/tsdoc@0.16.0': resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} @@ -476,128 +476,128 @@ packages: resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} engines: {node: '>=12'} - '@rollup/rollup-android-arm-eabi@4.58.0': - resolution: {integrity: sha512-mr0tmS/4FoVk1cnaeN244A/wjvGDNItZKR8hRhnmCzygyRXYtKF5jVDSIILR1U97CTzAYmbgIj/Dukg62ggG5w==} + '@rollup/rollup-android-arm-eabi@4.59.0': + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.58.0': - resolution: {integrity: sha512-+s++dbp+/RTte62mQD9wLSbiMTV+xr/PeRJEc/sFZFSBRlHPNPVaf5FXlzAL77Mr8FtSfQqCN+I598M8U41ccQ==} + '@rollup/rollup-android-arm64@4.59.0': + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.58.0': - resolution: {integrity: sha512-MFWBwTcYs0jZbINQBXHfSrpSQJq3IUOakcKPzfeSznONop14Pxuqa0Kg19GD0rNBMPQI2tFtu3UzapZpH0Uc1Q==} + '@rollup/rollup-darwin-arm64@4.59.0': + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.58.0': - resolution: {integrity: sha512-yiKJY7pj9c9JwzuKYLFaDZw5gma3fI9bkPEIyofvVfsPqjCWPglSHdpdwXpKGvDeYDms3Qal8qGMEHZ1M/4Udg==} + '@rollup/rollup-darwin-x64@4.59.0': + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.58.0': - resolution: {integrity: sha512-x97kCoBh5MOevpn/CNK9W1x8BEzO238541BGWBc315uOlN0AD/ifZ1msg+ZQB05Ux+VF6EcYqpiagfLJ8U3LvQ==} + '@rollup/rollup-freebsd-arm64@4.59.0': + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.58.0': - resolution: {integrity: sha512-Aa8jPoZ6IQAG2eIrcXPpjRcMjROMFxCt1UYPZZtCxRV68WkuSigYtQ/7Zwrcr2IvtNJo7T2JfDXyMLxq5L4Jlg==} + '@rollup/rollup-freebsd-x64@4.59.0': + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.58.0': - resolution: {integrity: sha512-Ob8YgT5kD/lSIYW2Rcngs5kNB/44Q2RzBSPz9brf2WEtcGR7/f/E9HeHn1wYaAwKBni+bdXEwgHvUd0x12lQSA==} + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.58.0': - resolution: {integrity: sha512-K+RI5oP1ceqoadvNt1FecL17Qtw/n9BgRSzxif3rTL2QlIu88ccvY+Y9nnHe/cmT5zbH9+bpiJuG1mGHRVwF4Q==} + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.58.0': - resolution: {integrity: sha512-T+17JAsCKUjmbopcKepJjHWHXSjeW7O5PL7lEFaeQmiVyw4kkc5/lyYKzrv6ElWRX/MrEWfPiJWqbTvfIvjM1Q==} + '@rollup/rollup-linux-arm64-gnu@4.59.0': + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.58.0': - resolution: {integrity: sha512-cCePktb9+6R9itIJdeCFF9txPU7pQeEHB5AbHu/MKsfH/k70ZtOeq1k4YAtBv9Z7mmKI5/wOLYjQ+B9QdxR6LA==} + '@rollup/rollup-linux-arm64-musl@4.59.0': + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.58.0': - resolution: {integrity: sha512-iekUaLkfliAsDl4/xSdoCJ1gnnIXvoNz85C8U8+ZxknM5pBStfZjeXgB8lXobDQvvPRCN8FPmmuTtH+z95HTmg==} + '@rollup/rollup-linux-loong64-gnu@4.59.0': + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.58.0': - resolution: {integrity: sha512-68ofRgJNl/jYJbxFjCKE7IwhbfxOl1muPN4KbIqAIe32lm22KmU7E8OPvyy68HTNkI2iV/c8y2kSPSm2mW/Q9Q==} + '@rollup/rollup-linux-loong64-musl@4.59.0': + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.58.0': - resolution: {integrity: sha512-dpz8vT0i+JqUKuSNPCP5SYyIV2Lh0sNL1+FhM7eLC457d5B9/BC3kDPp5BBftMmTNsBarcPcoz5UGSsnCiw4XQ==} + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.58.0': - resolution: {integrity: sha512-4gdkkf9UJ7tafnweBCR/mk4jf3Jfl0cKX9Np80t5i78kjIH0ZdezUv/JDI2VtruE5lunfACqftJ8dIMGN4oHew==} + '@rollup/rollup-linux-ppc64-musl@4.59.0': + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.58.0': - resolution: {integrity: sha512-YFS4vPnOkDTD/JriUeeZurFYoJhPf9GQQEF/v4lltp3mVcBmnsAdjEWhr2cjUCZzZNzxCG0HZOvJU44UGHSdzw==} + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.58.0': - resolution: {integrity: sha512-x2xgZlFne+QVNKV8b4wwaCS8pwq3y14zedZ5DqLzjdRITvreBk//4Knbcvm7+lWmms9V9qFp60MtUd0/t/PXPw==} + '@rollup/rollup-linux-riscv64-musl@4.59.0': + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.58.0': - resolution: {integrity: sha512-jIhrujyn4UnWF8S+DHSkAkDEO3hLX0cjzxJZPLF80xFyzyUIYgSMRcYQ3+uqEoyDD2beGq7Dj7edi8OnJcS/hg==} + '@rollup/rollup-linux-s390x-gnu@4.59.0': + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.58.0': - resolution: {integrity: sha512-+410Srdoh78MKSJxTQ+hZ/Mx+ajd6RjjPwBPNd0R3J9FtL6ZA0GqiiyNjCO9In0IzZkCNrpGymSfn+kgyPQocg==} + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.58.0': - resolution: {integrity: sha512-ZjMyby5SICi227y1MTR3VYBpFTdZs823Rs/hpakufleBoufoOIB6jtm9FEoxn/cgO7l6PM2rCEl5Kre5vX0QrQ==} + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.58.0': - resolution: {integrity: sha512-ds4iwfYkSQ0k1nb8LTcyXw//ToHOnNTJtceySpL3fa7tc/AsE+UpUFphW126A6fKBGJD5dhRvg8zw1rvoGFxmw==} + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.58.0': - resolution: {integrity: sha512-fd/zpJniln4ICdPkjWFhZYeY/bpnaN9pGa6ko+5WD38I0tTqk9lXMgXZg09MNdhpARngmxiCg0B0XUamNw/5BQ==} + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.58.0': - resolution: {integrity: sha512-YpG8dUOip7DCz3nr/JUfPbIUo+2d/dy++5bFzgi4ugOGBIox+qMbbqt/JoORwvI/C9Kn2tz6+Bieoqd5+B1CjA==} + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.58.0': - resolution: {integrity: sha512-b9DI8jpFQVh4hIXFr0/+N/TzLdpBIoPzjt0Rt4xJbW3mzguV3mduR9cNgiuFcuL/TeORejJhCWiAXe3E/6PxWA==} + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.58.0': - resolution: {integrity: sha512-CSrVpmoRJFN06LL9xhkitkwUcTZtIotYAF5p6XOR2zW0Zz5mzb3IPpcoPhB02frzMHFNo1reQ9xSF5fFm3hUsQ==} + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.58.0': - resolution: {integrity: sha512-QFsBgQNTnh5K0t/sBsjJLq24YVqEIVkGpfN2VHsnN90soZyhaiA9UUHufcctVNL4ypJY0wrwad0wslx2KJQ1/w==} + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} cpu: [x64] os: [win32] @@ -632,103 +632,66 @@ packages: '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - '@types/node@25.3.0': - resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==} + '@types/node@25.3.3': + resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} - '@typescript-eslint/eslint-plugin@8.56.0': - resolution: {integrity: sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==} + '@typescript-eslint/eslint-plugin@8.56.1': + resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.56.0 + '@typescript-eslint/parser': ^8.56.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.56.0': - resolution: {integrity: sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==} + '@typescript-eslint/parser@8.56.1': + resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.4': - resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==} + '@typescript-eslint/project-service@8.56.1': + resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.56.0': - resolution: {integrity: sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==} + '@typescript-eslint/scope-manager@8.56.1': + resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/scope-manager@8.46.4': - resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.56.0': - resolution: {integrity: sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.46.4': - resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.56.0': - resolution: {integrity: sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==} + '@typescript-eslint/tsconfig-utils@8.56.1': + resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.56.0': - resolution: {integrity: sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==} + '@typescript-eslint/type-utils@8.56.1': + resolution: {integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.46.4': - resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.56.0': - resolution: {integrity: sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.46.4': - resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/typescript-estree@8.56.0': - resolution: {integrity: sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==} + '@typescript-eslint/types@8.56.1': + resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.4': - resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==} + '@typescript-eslint/typescript-estree@8.56.1': + resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.56.0': - resolution: {integrity: sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==} + '@typescript-eslint/utils@8.56.1': + resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.46.4': - resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.56.0': - resolution: {integrity: sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==} + '@typescript-eslint/visitor-keys@8.56.1': + resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/eslint-plugin@1.6.9': @@ -782,22 +745,19 @@ packages: '@webext-core/match-patterns@1.0.3': resolution: {integrity: sha512-NY39ACqCxdKBmHgw361M9pfJma8e4AZo20w9AY+5ZjIj1W2dvXC8J31G5fjfOGbulW9w4WKpT8fPooi0mLkn9A==} - '@wxt-dev/browser@0.0.318': - resolution: {integrity: sha512-rVZBWikRK8tkVOmvR1gCSMvN5omsIAt4L1Je32I/wl4yJgAcu3xb3ZjJceRWiXUNPvjH1vWfQbEUQD7+nJ2cCg==} - '@wxt-dev/browser@0.1.37': resolution: {integrity: sha512-I32XWCNRy2W6UgbaVXz8BHGBGtm8urGRRBrcNLagUBXTrBi7wCE6zWePUvvK+nUl7qUCZ7iQ1ufdP0c1DEWisw==} - '@wxt-dev/i18n@0.2.4': - resolution: {integrity: sha512-qYWCRlMcRY/fCcwYpPcZV55NHFlri8K+eJqS/0bhHnDClWkiYHyYnIzI0tMeNdXCCo8oyKQr+qhrVM/LKNRymw==} + '@wxt-dev/i18n@0.2.5': + resolution: {integrity: sha512-B9EwzR7eTIZv5HQSsQL9/NaBHXH7G/esEtxMCoBMQyHx6QWWJNMJLX2C4z8slQUbblvlt4bPa+/zIC1IrWc1LA==} peerDependencies: wxt: '>=0.19.7' peerDependenciesMeta: wxt: optional: true - '@wxt-dev/storage@1.2.7': - resolution: {integrity: sha512-+rfRmfF2Wd6knXSFfgjLHelKEVnlryI/UG2/gNbO9U/KZJtSvo8QkGSJ1iJQ7jLYCYD+oYCzMZdL7D4BJLCUkw==} + '@wxt-dev/storage@1.2.8': + resolution: {integrity: sha512-GWCFKgF5+d7eslOxUDFC70ypA9njupmJb1nQM8uZoX0J3sWT2BO5xJLzb1sYahWAfID9p2BMtnUBN1lkWxPsbQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -820,9 +780,6 @@ packages: ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} @@ -889,8 +846,8 @@ packages: atomically@2.1.1: resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} - autoprefixer@10.4.24: - resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==} + autoprefixer@10.4.27: + resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -899,13 +856,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@3.0.1: - resolution: {integrity: sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==} - engines: {node: '>= 16'} - - balanced-match@4.0.3: - resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==} - engines: {node: 20 || >=22} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} baseline-browser-mapping@2.10.0: resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} @@ -925,12 +878,9 @@ packages: brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - brace-expansion@5.0.2: - resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} - engines: {node: 20 || >=22} + brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -963,8 +913,8 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cacheable@2.3.2: - resolution: {integrity: sha512-w+ZuRNmex9c1TR9RcsxbfTKCjSL0rh1WA5SABbrWprIHeNBdmyQLSYonlDy9gpD+63XT8DgZ/wNh1Smvc9WnJA==} + cacheable@2.3.3: + resolution: {integrity: sha512-iffYMX4zxKp54evOH27fm92hs+DeC1DhXmNVN8Tr94M/iZIV42dqTHSR2Ik4TOSPyOAwKr7Yu3rN9ALoLkbWyQ==} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -974,8 +924,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001770: - resolution: {integrity: sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==} + caniuse-lite@1.0.30001775: + resolution: {integrity: sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==} chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} @@ -993,10 +943,6 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} @@ -1312,8 +1258,8 @@ packages: peerDependencies: eslint: '>=5.0.0' - eslint-plugin-tsdoc@0.5.0: - resolution: {integrity: sha512-ush8ehCwub2rgE16OIgQPFyj/o0k3T8kL++9IrAI4knsmupNo8gvfO2ERgDHWWgTC5MglbwLVRswU93HyXqNpw==} + eslint-plugin-tsdoc@0.5.2: + resolution: {integrity: sha512-BlvqjWZdBJDIPO/YU3zcPCF23CvjYT3gyu63yo6b609NNV3D1b6zceAREy2xnweuBoDpZcLNuPyAUq9cvx6bbQ==} eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} @@ -1834,9 +1780,6 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - known-css-properties@0.37.0: - resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} - ky@1.14.3: resolution: {integrity: sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==} engines: {node: '>=18'} @@ -1875,13 +1818,13 @@ packages: canvas: optional: true - lint-staged@16.2.7: - resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} + lint-staged@16.3.0: + resolution: {integrity: sha512-YVHHy/p6U4/No9Af+35JLh3umJ9dPQnGTvNCbfO/T5fC60us0jFnc+vw33cqveI+kqxIFJQakcMVTO2KM+653A==} engines: {node: '>=20.17'} hasBin: true - listr2@10.1.0: - resolution: {integrity: sha512-/6t2KgDYIcCjhELwvrRxi1gaJ4xCGLTjNvh6mSjYenBkrZxggek8EwCbwBU33GMUCpyyrOzz2TzylrO5mTiI1w==} + listr2@10.1.1: + resolution: {integrity: sha512-4oogpJzRRGtq41B0GKZIldzYCnQTgX2DPM/XvcfNu7g2E7sxaast009150RKFZBnrHAnfMOUaedIqdIOLCCRxQ==} engines: {node: '>=22.0.0'} listr2@9.0.5: @@ -1931,8 +1874,8 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - log-update@7.1.0: - resolution: {integrity: sha512-y9pi/ZOQQVvTgfRDEHV1Cj4zQUkJZPipEUNOxhn1R6KgmdMs7LKvXWCd9eMVPGJgvYzFLCenecWr0Ps8ChVv2A==} + log-update@7.2.0: + resolution: {integrity: sha512-iLs7dGSyjZiUgvrUvuD3FndAxVJk+TywBkkkwUSm9HdYoskJalWg5qVsEiXeufPvRVPbCUmNQewg798rx+sPXg==} engines: {node: '>=20'} lru-cache@10.4.3: @@ -1975,16 +1918,12 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimatch@10.2.2: - resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==} + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -2134,11 +2073,6 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} @@ -2234,8 +2168,8 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - publish-browser-extension@4.0.3: - resolution: {integrity: sha512-yhzn+0z0tOYSsouEVCn6BHd3PPEc6KKplEVDEmxCOAMXC0C7NROEiJcmWm5LGGgqw3TqBvPxiink1juPrEbMqA==} + publish-browser-extension@4.0.4: + resolution: {integrity: sha512-QMQbWL0FWgBfnkJ6w8HOJoIPaWLE7vTpewM4ae2vLs7SrD4eKdAk+SxOzqAICwbhEPuaLAOA+XkT9sZS5R0PmA==} engines: {node: '>=18.0.0'} hasBin: true @@ -2270,10 +2204,6 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -2318,8 +2248,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.58.0: - resolution: {integrity: sha512-wbT0mBmWbIvvq8NeEYWWvevvxnOyhKChir47S66WCxw1SXqhw7ssIYejnQEVt7XYQpsj2y8F9PM+Cr3SNEa0gw==} + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2405,6 +2335,10 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} @@ -2474,8 +2408,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} strip-bom@5.0.0: @@ -2515,8 +2449,8 @@ packages: peerDependencies: stylelint: ^17.0.0 - stylelint@17.3.0: - resolution: {integrity: sha512-1POV91lcEMhj6SLVaOeA0KlS9yattS+qq+cyWqP/nYzWco7K5jznpGH1ExngvPlTM9QF1Kjd2bmuzJu9TH2OcA==} + stylelint@17.4.0: + resolution: {integrity: sha512-3kQ2/cHv3Zt8OBg+h2B8XCx9evEABQIrv4hh3uXahGz/ZEHrTR80zxBiK2NfXNaSoyBzxO1pjsz1Vhdzwn5XSw==} engines: {node: '>=20.19.0'} hasBin: true @@ -2626,8 +2560,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.56.0: - resolution: {integrity: sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==} + typescript-eslint@8.56.1: + resolution: {integrity: sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2651,8 +2585,8 @@ packages: resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} engines: {node: '>=20'} - unimport@5.6.0: - resolution: {integrity: sha512-8rqAmtJV8o60x46kBAJKtHpJDJWkA2xcBqWKPI14MgUb05o1pnpnCnXSxedUXyeq7p8fR5g3pTo2BaswZ9lD9A==} + unimport@5.7.0: + resolution: {integrity: sha512-njnL6sp8lEA8QQbZrt+52p/g4X0rw3bnGGmUcJnt1jeG8+iiqO779aGz0PirCtydAIVcuTBRlJ52F0u46z309Q==} engines: {node: '>=18.12.0'} universalify@2.0.1: @@ -2833,6 +2767,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@10.0.0: + resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==} + engines: {node: '>=20'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2841,8 +2779,8 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} - write-file-atomic@7.0.0: - resolution: {integrity: sha512-YnlPC6JqnZl6aO4uRc+dx5PHguiR9S6WeoLtpxNT9wIG+BDya7ZNE1q7KOjVgaA73hKhKLpVPgJ5QA9THQ5BRg==} + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} engines: {node: ^20.17.0 || >=22.9.0} ws@8.19.0: @@ -2861,8 +2799,8 @@ packages: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} - wxt@0.20.17: - resolution: {integrity: sha512-3M3og5cKYTGBoBkVbHO+Qjq+SpGQxNkcFe2YZFZjWw8QcIgmCpyxrAsvOGvzXtn7KerxHDf5VvEvf/OvlGzhFg==} + wxt@0.20.18: + resolution: {integrity: sha512-BYnIAFkdJcC8BXzbh4PzmRhOQ5xKELEk45qntzqojW5X1+VGm0GsjaEKSCQnTP72/3jZMDH1pmlEdkY/fPXehg==} hasBin: true peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2927,14 +2865,14 @@ snapshots: defu: 6.1.4 many-keys-map: 2.0.1 - '@aklinker1/rollup-plugin-visualizer@5.12.0(rollup@4.58.0)': + '@aklinker1/rollup-plugin-visualizer@5.12.0(rollup@4.59.0)': dependencies: open: 8.4.2 picomatch: 2.3.1 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rollup: 4.58.0 + rollup: 4.59.0 '@asamuzakjp/css-color@3.2.0': dependencies: @@ -2966,14 +2904,14 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@cacheable/memory@2.0.7': + '@cacheable/memory@2.0.8': dependencies: - '@cacheable/utils': 2.3.4 + '@cacheable/utils': 2.4.0 '@keyv/bigmap': 1.3.1(keyv@5.6.0) hookified: 1.15.1 keyv: 5.6.0 - '@cacheable/utils@2.3.4': + '@cacheable/utils@2.4.0': dependencies: hashery: 1.5.0 keyv: 5.6.0 @@ -3009,7 +2947,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.27': {} + '@csstools/css-syntax-patches-for-csstree@1.0.28': {} '@csstools/css-tokenizer@3.0.4': optional: true @@ -3134,7 +3072,7 @@ snapshots: dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3 - minimatch: 3.1.2 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -3146,7 +3084,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.3': + '@eslint/eslintrc@3.3.4': dependencies: ajv: 6.14.0 debug: 4.4.3 @@ -3155,7 +3093,7 @@ snapshots: ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.1 - minimatch: 3.1.2 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color @@ -3207,10 +3145,10 @@ snapshots: '@keyv/serialize@1.1.1': {} - '@microsoft/tsdoc-config@0.18.0': + '@microsoft/tsdoc-config@0.18.1': dependencies: '@microsoft/tsdoc': 0.16.0 - ajv: 8.12.0 + ajv: 8.18.0 jju: 1.4.0 resolve: 1.22.11 @@ -3242,79 +3180,79 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@rollup/rollup-android-arm-eabi@4.58.0': + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true - '@rollup/rollup-android-arm64@4.58.0': + '@rollup/rollup-android-arm64@4.59.0': optional: true - '@rollup/rollup-darwin-arm64@4.58.0': + '@rollup/rollup-darwin-arm64@4.59.0': optional: true - '@rollup/rollup-darwin-x64@4.58.0': + '@rollup/rollup-darwin-x64@4.59.0': optional: true - '@rollup/rollup-freebsd-arm64@4.58.0': + '@rollup/rollup-freebsd-arm64@4.59.0': optional: true - '@rollup/rollup-freebsd-x64@4.58.0': + '@rollup/rollup-freebsd-x64@4.59.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.58.0': + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.58.0': + '@rollup/rollup-linux-arm-musleabihf@4.59.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.58.0': + '@rollup/rollup-linux-arm64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.58.0': + '@rollup/rollup-linux-arm64-musl@4.59.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.58.0': + '@rollup/rollup-linux-loong64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.58.0': + '@rollup/rollup-linux-loong64-musl@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.58.0': + '@rollup/rollup-linux-ppc64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.58.0': + '@rollup/rollup-linux-ppc64-musl@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.58.0': + '@rollup/rollup-linux-riscv64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.58.0': + '@rollup/rollup-linux-riscv64-musl@4.59.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.58.0': + '@rollup/rollup-linux-s390x-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.58.0': + '@rollup/rollup-linux-x64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-musl@4.58.0': + '@rollup/rollup-linux-x64-musl@4.59.0': optional: true - '@rollup/rollup-openbsd-x64@4.58.0': + '@rollup/rollup-openbsd-x64@4.59.0': optional: true - '@rollup/rollup-openharmony-arm64@4.58.0': + '@rollup/rollup-openharmony-arm64@4.59.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.58.0': + '@rollup/rollup-win32-arm64-msvc@4.59.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.58.0': + '@rollup/rollup-win32-ia32-msvc@4.59.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.58.0': + '@rollup/rollup-win32-x64-gnu@4.59.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.58.0': + '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true '@sindresorhus/merge-streams@4.0.0': {} @@ -3342,18 +3280,18 @@ snapshots: '@types/minimatch@3.0.5': {} - '@types/node@25.3.0': + '@types/node@25.3.3': dependencies: undici-types: 7.18.2 - '@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.56.0 - '@typescript-eslint/type-utils': 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.56.0 + '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/type-utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.56.1 eslint: 9.39.3(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 @@ -3362,59 +3300,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.56.0 - '@typescript-eslint/types': 8.56.0 - '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.56.0 + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.56.1 debug: 4.4.3 eslint: 9.39.3(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.4(typescript@5.9.3)': + '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) - '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) + '@typescript-eslint/types': 8.56.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.56.0(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.56.1': dependencies: - '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) - '@typescript-eslint/types': 8.56.0 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.46.4': - dependencies: - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/visitor-keys': 8.46.4 - - '@typescript-eslint/scope-manager@8.56.0': - dependencies: - '@typescript-eslint/types': 8.56.0 - '@typescript-eslint/visitor-keys': 8.56.0 + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/visitor-keys': 8.56.1 - '@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.56.0(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - typescript: 5.9.3 - - '@typescript-eslint/type-utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.56.0 - '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.3(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) @@ -3422,34 +3342,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.4': {} + '@typescript-eslint/types@8.56.1': {} - '@typescript-eslint/types@8.56.0': {} - - '@typescript-eslint/typescript-estree@8.46.4(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.4(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/visitor-keys': 8.46.4 + '@typescript-eslint/project-service': 8.56.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/visitor-keys': 8.56.1 debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.4 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.56.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.56.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) - '@typescript-eslint/types': 8.56.0 - '@typescript-eslint/visitor-keys': 8.56.0 - debug: 4.4.3 - minimatch: 9.0.5 + minimatch: 10.2.4 semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -3457,46 +3359,30 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.4(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.46.4 - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) eslint: 9.39.3(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/visitor-keys@8.56.1': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.56.0 - '@typescript-eslint/types': 8.56.0 - '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) - eslint: 9.39.3(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.46.4': - dependencies: - '@typescript-eslint/types': 8.46.4 - eslint-visitor-keys: 4.2.1 - - '@typescript-eslint/visitor-keys@8.56.0': - dependencies: - '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/types': 8.56.1 eslint-visitor-keys: 5.0.1 - '@vitest/eslint-plugin@1.6.9(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@25.3.0)(jiti@2.6.1)(jsdom@26.1.0)(yaml@2.8.2))': + '@vitest/eslint-plugin@1.6.9(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@25.3.3)(jiti@2.6.1)(jsdom@26.1.0)(yaml@2.8.2))': dependencies: - '@typescript-eslint/scope-manager': 8.56.0 - '@typescript-eslint/utils': 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.3(jiti@2.6.1) optionalDependencies: typescript: 5.9.3 - vitest: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(jsdom@26.1.0)(yaml@2.8.2) + vitest: 4.0.18(@types/node@25.3.3)(jiti@2.6.1)(jsdom@26.1.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -3509,13 +3395,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2) '@vitest/pretty-format@4.0.18': dependencies: @@ -3549,26 +3435,21 @@ snapshots: '@webext-core/match-patterns@1.0.3': {} - '@wxt-dev/browser@0.0.318': - dependencies: - '@types/filesystem': 0.0.36 - '@types/har-format': 1.2.16 - '@wxt-dev/browser@0.1.37': dependencies: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.16 - '@wxt-dev/i18n@0.2.4(wxt@0.20.17(@types/node@25.3.0)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(rollup@4.58.0)(yaml@2.8.2))': + '@wxt-dev/i18n@0.2.5(wxt@0.20.18(@types/node@25.3.3)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(rollup@4.59.0)(yaml@2.8.2))': dependencies: - '@wxt-dev/browser': 0.0.318 - chokidar: 4.0.3 + '@wxt-dev/browser': 0.1.37 + chokidar: 5.0.0 confbox: 0.2.4 fast-glob: 3.3.3 optionalDependencies: - wxt: 0.20.17(@types/node@25.3.0)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(rollup@4.58.0)(yaml@2.8.2) + wxt: 0.20.18(@types/node@25.3.3)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(rollup@4.59.0)(yaml@2.8.2) - '@wxt-dev/storage@1.2.7': + '@wxt-dev/storage@1.2.8': dependencies: '@wxt-dev/browser': 0.1.37 async-mutex: 0.5.0 @@ -3592,13 +3473,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -3651,10 +3525,10 @@ snapshots: stubborn-fs: 2.0.0 when-exit: 2.1.5 - autoprefixer@10.4.24(postcss@8.5.6): + autoprefixer@10.4.27(postcss@8.5.6): dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001770 + caniuse-lite: 1.0.30001775 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.6 @@ -3662,9 +3536,7 @@ snapshots: balanced-match@1.0.2: {} - balanced-match@3.0.1: {} - - balanced-match@4.0.3: {} + balanced-match@4.0.4: {} baseline-browser-mapping@2.10.0: {} @@ -3688,13 +3560,9 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - brace-expansion@5.0.2: + brace-expansion@5.0.4: dependencies: - balanced-match: 4.0.3 + balanced-match: 4.0.4 braces@3.0.3: dependencies: @@ -3703,7 +3571,7 @@ snapshots: browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.10.0 - caniuse-lite: 1.0.30001770 + caniuse-lite: 1.0.30001775 electron-to-chromium: 1.5.302 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -3735,10 +3603,10 @@ snapshots: cac@6.7.14: {} - cacheable@2.3.2: + cacheable@2.3.3: dependencies: - '@cacheable/memory': 2.0.7 - '@cacheable/utils': 2.3.4 + '@cacheable/memory': 2.0.8 + '@cacheable/utils': 2.4.0 hookified: 1.15.1 keyv: 5.6.0 qified: 0.6.0 @@ -3747,7 +3615,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001770: {} + caniuse-lite@1.0.30001775: {} chai@6.2.2: {} @@ -3766,17 +3634,13 @@ snapshots: chalk@5.6.2: {} - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - chokidar@5.0.0: dependencies: readdirp: 5.0.0 chrome-launcher@1.2.0: dependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.2 @@ -4056,11 +3920,11 @@ snapshots: dependencies: eslint: 9.39.3(jiti@2.6.1) - eslint-plugin-tsdoc@0.5.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-tsdoc@0.5.2(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3): dependencies: '@microsoft/tsdoc': 0.16.0 - '@microsoft/tsdoc-config': 0.18.0 - '@typescript-eslint/utils': 8.46.4(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@microsoft/tsdoc-config': 0.18.1 + '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint - supports-color @@ -4084,7 +3948,7 @@ snapshots: '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 + '@eslint/eslintrc': 3.3.4 '@eslint/js': 9.39.3 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 @@ -4110,7 +3974,7 @@ snapshots: is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -4210,7 +4074,7 @@ snapshots: flat-cache@6.1.20: dependencies: - cacheable: 2.3.2 + cacheable: 2.3.3 flatted: 3.3.3 hookified: 1.15.1 @@ -4570,8 +4434,6 @@ snapshots: kleur@3.0.3: {} - known-css-properties@0.37.0: {} - ky@1.14.3: {} latest-version@9.0.0: @@ -4608,24 +4470,24 @@ snapshots: htmlparser2: 10.1.0 uhyphen: 0.2.0 - lint-staged@16.2.7: + lint-staged@16.3.0: dependencies: commander: 14.0.3 listr2: 9.0.5 micromatch: 4.0.8 nano-spawn: 2.0.0 - pidtree: 0.6.0 string-argv: 0.3.2 + tinyexec: 1.0.2 yaml: 2.8.2 - listr2@10.1.0: + listr2@10.1.1: dependencies: cli-truncate: 5.1.1 colorette: 2.0.20 eventemitter3: 5.0.4 - log-update: 7.1.0 + log-update: 7.2.0 rfdc: 1.4.1 - wrap-ansi: 9.0.2 + wrap-ansi: 10.0.0 listr2@9.0.5: dependencies: @@ -4674,16 +4536,16 @@ snapshots: ansi-escapes: 7.3.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrap-ansi: 9.0.2 - log-update@7.1.0: + log-update@7.2.0: dependencies: ansi-escapes: 7.3.0 cli-cursor: 5.0.0 - slice-ansi: 7.1.2 - strip-ansi: 7.1.2 - wrap-ansi: 9.0.2 + slice-ansi: 8.0.0 + strip-ansi: 7.2.0 + wrap-ansi: 10.0.0 lru-cache@10.4.3: optional: true @@ -4719,18 +4581,14 @@ snapshots: mimic-function@5.0.1: {} - minimatch@10.2.2: + minimatch@10.2.4: dependencies: - brace-expansion: 5.0.2 + brace-expansion: 5.0.4 - minimatch@3.1.2: + minimatch@3.1.5: dependencies: brace-expansion: 1.1.12 - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - minimist@1.2.8: {} mlly@1.8.0: @@ -4747,7 +4605,7 @@ snapshots: '@types/minimatch': 3.0.5 array-differ: 4.0.0 array-union: 3.0.1 - minimatch: 3.1.2 + minimatch: 3.1.5 nano-spawn@2.0.0: {} @@ -4895,8 +4753,6 @@ snapshots: picomatch@4.0.3: {} - pidtree@0.6.0: {} - pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 @@ -4995,7 +4851,7 @@ snapshots: proto-list@1.2.4: {} - publish-browser-extension@4.0.3: + publish-browser-extension@4.0.4: dependencies: cac: 6.7.14 consola: 3.4.2 @@ -5003,7 +4859,7 @@ snapshots: form-data-encoder: 4.1.0 formdata-node: 6.0.3 jsonwebtoken: 9.0.3 - listr2: 10.1.0 + listr2: 10.1.1 ofetch: 1.5.1 zod: 4.3.6 @@ -5045,8 +4901,6 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - readdirp@4.1.2: {} - readdirp@5.0.0: {} real-require@0.2.0: {} @@ -5080,35 +4934,35 @@ snapshots: rfdc@1.4.1: {} - rollup@4.58.0: + rollup@4.59.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.58.0 - '@rollup/rollup-android-arm64': 4.58.0 - '@rollup/rollup-darwin-arm64': 4.58.0 - '@rollup/rollup-darwin-x64': 4.58.0 - '@rollup/rollup-freebsd-arm64': 4.58.0 - '@rollup/rollup-freebsd-x64': 4.58.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.58.0 - '@rollup/rollup-linux-arm-musleabihf': 4.58.0 - '@rollup/rollup-linux-arm64-gnu': 4.58.0 - '@rollup/rollup-linux-arm64-musl': 4.58.0 - '@rollup/rollup-linux-loong64-gnu': 4.58.0 - '@rollup/rollup-linux-loong64-musl': 4.58.0 - '@rollup/rollup-linux-ppc64-gnu': 4.58.0 - '@rollup/rollup-linux-ppc64-musl': 4.58.0 - '@rollup/rollup-linux-riscv64-gnu': 4.58.0 - '@rollup/rollup-linux-riscv64-musl': 4.58.0 - '@rollup/rollup-linux-s390x-gnu': 4.58.0 - '@rollup/rollup-linux-x64-gnu': 4.58.0 - '@rollup/rollup-linux-x64-musl': 4.58.0 - '@rollup/rollup-openbsd-x64': 4.58.0 - '@rollup/rollup-openharmony-arm64': 4.58.0 - '@rollup/rollup-win32-arm64-msvc': 4.58.0 - '@rollup/rollup-win32-ia32-msvc': 4.58.0 - '@rollup/rollup-win32-x64-gnu': 4.58.0 - '@rollup/rollup-win32-x64-msvc': 4.58.0 + '@rollup/rollup-android-arm-eabi': 4.59.0 + '@rollup/rollup-android-arm64': 4.59.0 + '@rollup/rollup-darwin-arm64': 4.59.0 + '@rollup/rollup-darwin-x64': 4.59.0 + '@rollup/rollup-freebsd-arm64': 4.59.0 + '@rollup/rollup-freebsd-x64': 4.59.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 + '@rollup/rollup-linux-arm64-musl': 4.59.0 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 + '@rollup/rollup-linux-loong64-musl': 4.59.0 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 + '@rollup/rollup-linux-x64-gnu': 4.59.0 + '@rollup/rollup-linux-x64-musl': 4.59.0 + '@rollup/rollup-openbsd-x64': 4.59.0 + '@rollup/rollup-openharmony-arm64': 4.59.0 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 + '@rollup/rollup-win32-x64-gnu': 4.59.0 + '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 rrweb-cssom@0.8.0: @@ -5176,6 +5030,11 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + slice-ansi@8.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 @@ -5222,12 +5081,12 @@ snapshots: dependencies: emoji-regex: 10.6.0 get-east-asian-width: 1.5.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 string-width@8.2.0: dependencies: get-east-asian-width: 1.5.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 string_decoder@1.1.1: dependencies: @@ -5241,7 +5100,7 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -5263,25 +5122,24 @@ snapshots: stubborn-utils@1.0.2: {} - stylelint-config-recommended@18.0.0(stylelint@17.3.0(typescript@5.9.3)): + stylelint-config-recommended@18.0.0(stylelint@17.4.0(typescript@5.9.3)): dependencies: - stylelint: 17.3.0(typescript@5.9.3) + stylelint: 17.4.0(typescript@5.9.3) - stylelint-config-standard@40.0.0(stylelint@17.3.0(typescript@5.9.3)): + stylelint-config-standard@40.0.0(stylelint@17.4.0(typescript@5.9.3)): dependencies: - stylelint: 17.3.0(typescript@5.9.3) - stylelint-config-recommended: 18.0.0(stylelint@17.3.0(typescript@5.9.3)) + stylelint: 17.4.0(typescript@5.9.3) + stylelint-config-recommended: 18.0.0(stylelint@17.4.0(typescript@5.9.3)) - stylelint@17.3.0(typescript@5.9.3): + stylelint@17.4.0(typescript@5.9.3): dependencies: '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-syntax-patches-for-csstree': 1.0.27 + '@csstools/css-syntax-patches-for-csstree': 1.0.28 '@csstools/css-tokenizer': 4.0.0 '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/selector-resolve-nested': 4.0.0(postcss-selector-parser@7.1.1) '@csstools/selector-specificity': 6.0.0(postcss-selector-parser@7.1.1) - balanced-match: 3.0.1 colord: 2.9.3 cosmiconfig: 9.0.0(typescript@5.9.3) css-functions-list: 3.3.3 @@ -5298,7 +5156,6 @@ snapshots: import-meta-resolve: 4.2.0 imurmurhash: 0.1.4 is-plain-object: 5.0.0 - known-css-properties: 0.37.0 mathml-tag-names: 4.0.0 meow: 14.1.0 micromatch: 4.0.8 @@ -5312,7 +5169,7 @@ snapshots: supports-hyperlinks: 4.4.0 svg-tags: 1.0.0 table: 6.9.0 - write-file-atomic: 7.0.0 + write-file-atomic: 7.0.1 transitivePeerDependencies: - supports-color - typescript @@ -5410,12 +5267,12 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.3(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -5431,7 +5288,7 @@ snapshots: unicorn-magic@0.4.0: {} - unimport@5.6.0: + unimport@5.7.0: dependencies: acorn: 8.16.0 escape-string-regexp: 5.0.0 @@ -5489,13 +5346,13 @@ snapshots: uuid@8.3.2: {} - vite-node@5.3.0(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2): + vite-node@5.3.0(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2): dependencies: cac: 6.7.14 es-module-lexer: 2.0.0 obug: 2.1.1 pathe: 2.0.3 - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -5509,24 +5366,24 @@ snapshots: - tsx - yaml - vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2): + vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.58.0 + rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 fsevents: 2.3.3 jiti: 2.6.1 yaml: 2.8.2 - vitest@4.0.18(@types/node@25.3.0)(jiti@2.6.1)(jsdom@26.1.0)(yaml@2.8.2): + vitest@4.0.18(@types/node@25.3.3)(jiti@2.6.1)(jsdom@26.1.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -5543,10 +5400,10 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 jsdom: 26.1.0 transitivePeerDependencies: - jiti @@ -5645,6 +5502,12 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@10.0.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 8.2.0 + strip-ansi: 7.2.0 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -5655,11 +5518,10 @@ snapshots: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 - write-file-atomic@7.0.0: + write-file-atomic@7.0.1: dependencies: - imurmurhash: 0.1.4 signal-exit: 4.1.0 ws@8.19.0: @@ -5670,15 +5532,15 @@ snapshots: is-wsl: 3.1.1 powershell-utils: 0.1.0 - wxt@0.20.17(@types/node@25.3.0)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(rollup@4.58.0)(yaml@2.8.2): + wxt@0.20.18(@types/node@25.3.3)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(rollup@4.59.0)(yaml@2.8.2): dependencies: '@1natsu/wait-element': 4.1.2 - '@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.58.0) + '@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.59.0) '@webext-core/fake-browser': 1.3.4 '@webext-core/isolated-element': 1.1.3 '@webext-core/match-patterns': 1.0.3 '@wxt-dev/browser': 0.1.37 - '@wxt-dev/storage': 1.2.7 + '@wxt-dev/storage': 1.2.8 async-mutex: 0.5.0 c12: 3.3.3(magicast@0.5.2) cac: 6.7.14 @@ -5701,7 +5563,7 @@ snapshots: jszip: 3.10.1 linkedom: 0.18.12 magicast: 0.5.2 - minimatch: 10.2.2 + minimatch: 10.2.4 nano-spawn: 2.0.0 normalize-path: 3.0.0 nypm: 0.6.5 @@ -5711,11 +5573,11 @@ snapshots: perfect-debounce: 2.1.0 picocolors: 1.1.1 prompts: 2.4.2 - publish-browser-extension: 4.0.3 + publish-browser-extension: 4.0.4 scule: 1.3.0 - unimport: 5.6.0 - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2) - vite-node: 5.3.0(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2) + unimport: 5.7.0 + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2) + vite-node: 5.3.0(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2) web-ext-run: 0.2.4 optionalDependencies: eslint: 9.39.3(jiti@2.6.1) diff --git a/src/entrypoints/content/common/test/utils.ts b/src/entrypoints/content/common/test/utils.ts index f8ae6d9..609f774 100644 --- a/src/entrypoints/content/common/test/utils.ts +++ b/src/entrypoints/content/common/test/utils.ts @@ -1,3 +1,7 @@ +import { vi } from 'vitest' + +import { isPage, Page } from '@/entrypoints/content/common/utils/pages' + /** * Helper for creating a DOM element with the HTML content for testing. * @@ -10,3 +14,7 @@ export const createElement = (html: string): HTMLDivElement => { return div } + +export const mockIsPage = (page: Page) => { + vi.mocked(isPage).mockImplementation((...pages: Page[]) => pages.includes(page)) +} diff --git a/src/entrypoints/content/common/types/module.ts b/src/entrypoints/content/common/types/module.ts index dc3dc7c..8a990a4 100644 --- a/src/entrypoints/content/common/types/module.ts +++ b/src/entrypoints/content/common/types/module.ts @@ -11,9 +11,6 @@ export type Module = { name: string // Pages where the module should run (see @common/utils/pages.ts for a list of pages) pages: Page[] - // Pages where the module should not run - // This is only evaluated when `pages: [pages.all]`, otherwise it is ignored - excludePages?: Page[] // Function containing the module's logic run: () => void } diff --git a/src/entrypoints/content/common/utils/location.ts b/src/entrypoints/content/common/utils/location.ts index 19d527d..bfc9cab 100644 --- a/src/entrypoints/content/common/utils/location.ts +++ b/src/entrypoints/content/common/utils/location.ts @@ -4,3 +4,10 @@ * @returns The pathname (e.g., '/Club/Players/') */ export const getCurrentPathname = (): string => window.location.pathname + +/** + * Get the current page's search params from the browser location. + * + * @returns The URLSearchParams (e.g., '?YouthTeamId=123') + */ +export const getCurrentSearchParams = (): URLSearchParams => new URLSearchParams(window.location.search) diff --git a/src/entrypoints/content/common/utils/pages.test.ts b/src/entrypoints/content/common/utils/pages.test.ts index f5b6e15..853ad98 100644 --- a/src/entrypoints/content/common/utils/pages.test.ts +++ b/src/entrypoints/content/common/utils/pages.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest' -import { getCurrentPathname } from '@/entrypoints/content/common/utils/location' +import { getCurrentPathname, getCurrentSearchParams } from '@/entrypoints/content/common/utils/location' import { getCurrentPage, isPage, Page, pages } from '@/entrypoints/content/common/utils/pages' import { isOwnTeamPage } from '@/entrypoints/content/common/utils/team/utils' @@ -8,74 +8,173 @@ vi.mock(import('@/entrypoints/content/common/utils/location')) vi.mock(import('@/entrypoints/content/common/utils/team/utils')) describe(isPage, () => { - it.each([ - { - desc: 'different path', - currentPathname: '/Foo', - page: new Page('/Bar'), - ownTeamPage: false, - expected: false, - }, - { - desc: 'no teamContext, own team page', - currentPathname: '/Foo', - page: new Page('/Foo'), - ownTeamPage: true, - expected: true, - }, - { - desc: 'no teamContext, not own team page', - currentPathname: '/Foo', - page: new Page('/Foo'), - ownTeamPage: false, - expected: true, - }, - { - desc: 'OWN_TEAM, own team page', - currentPathname: '/Foo', - page: new Page('/Foo', 'OWN_TEAM'), - ownTeamPage: true, - expected: true, - }, - { - desc: 'OWN_TEAM, other team page', - currentPathname: '/Foo', - page: new Page('/Foo', 'OWN_TEAM'), - ownTeamPage: false, - expected: false, - }, - { - desc: 'OTHER_TEAM, own team page', - currentPathname: '/Foo', - page: new Page('/Foo', 'OTHER_TEAM'), - ownTeamPage: true, - expected: false, - }, - { - desc: 'OTHER_TEAM, other team page', - currentPathname: '/Foo', - page: new Page('/Foo', 'OTHER_TEAM'), - ownTeamPage: false, - expected: true, - }, - ])('$desc', ({ currentPathname, page, ownTeamPage, expected }) => { - vi.mocked(getCurrentPathname).mockReturnValue(currentPathname) - vi.mocked(isOwnTeamPage).mockReturnValue(ownTeamPage) - - expect(isPage(page)).toBe(expected) + describe('pathname matching', () => { + it.each([ + { + desc: 'returns false when pathnames differ', + currentPathname: '/Foo', + page: new Page('/Bar'), + expected: false, + }, + { + desc: 'returns true when pathnames match and there are no options', + currentPathname: '/Foo', + page: new Page('/Foo'), + expected: true, + }, + ])('$desc', ({ currentPathname, page, expected }) => { + vi.mocked(getCurrentPathname).mockReturnValue(currentPathname) + vi.mocked(getCurrentSearchParams).mockReturnValue(new URLSearchParams()) + + expect(isPage(page)).toBe(expected) + }) + }) + + describe('teamContext', () => { + it.each([ + { + desc: 'no teamContext, matches own team page', + page: new Page('/Foo'), + ownTeamPage: true, + expected: true, + }, + { + desc: 'no teamContext, matches other team page', + page: new Page('/Foo'), + ownTeamPage: false, + expected: true, + }, + { + desc: 'OWN_TEAM, matches own team page', + page: new Page('/Foo', { teamContext: 'OWN_TEAM' }), + ownTeamPage: true, + expected: true, + }, + { + desc: 'OWN_TEAM, does not match own team page', + page: new Page('/Foo', { teamContext: 'OWN_TEAM' }), + ownTeamPage: false, + expected: false, + }, + { + desc: 'OTHER_TEAM, does not match own team page', + page: new Page('/Foo', { teamContext: 'OTHER_TEAM' }), + ownTeamPage: true, + expected: false, + }, + { + desc: 'OTHER_TEAM, matches other team page', + page: new Page('/Foo', { teamContext: 'OTHER_TEAM' }), + ownTeamPage: false, + expected: true, + }, + ])('$desc', ({ page, ownTeamPage, expected }) => { + vi.mocked(getCurrentPathname).mockReturnValue('/Foo') + vi.mocked(getCurrentSearchParams).mockReturnValue(new URLSearchParams()) + vi.mocked(isOwnTeamPage).mockReturnValue(ownTeamPage) + + expect(isPage(page)).toBe(expected) + }) + }) + + describe('queryParams', () => { + it.each([ + { + desc: 'matches when required param is present (no value constraint)', + page: new Page('/Foo', { queryParams: [{ name: 'BarId' }] }), + search: '?BarId=123', + expected: true, + }, + { + desc: 'does not match when required param is absent', + page: new Page('/Foo', { queryParams: [{ name: 'BarId' }] }), + search: '', + expected: false, + }, + { + desc: 'matches when param has the required value', + page: new Page('/Foo', { queryParams: [{ name: 'BarId', value: '123' }] }), + search: '?BarId=123', + expected: true, + }, + { + desc: 'does not match when param has a different value', + page: new Page('/Foo', { queryParams: [{ name: 'BarId', value: '123' }] }), + search: '?BarId=456', + expected: false, + }, + { + desc: 'does not match when param with required value is absent', + page: new Page('/Foo', { queryParams: [{ name: 'BarId', value: '123' }] }), + search: '', + expected: false, + }, + { + desc: 'matches when all required params are present', + page: new Page('/Foo', { queryParams: [{ name: 'foo' }, { name: 'bar' }] }), + search: '?foo=1&bar=2', + expected: true, + }, + { + desc: 'does not match when only some required params are present', + page: new Page('/Foo', { queryParams: [{ name: 'foo' }, { name: 'bar' }] }), + search: '?foo=1', + expected: false, + }, + ])('$desc', ({ page, search, expected }) => { + vi.mocked(getCurrentPathname).mockReturnValue('/Foo') + vi.mocked(getCurrentSearchParams).mockReturnValue(new URLSearchParams(search)) + vi.mocked(isOwnTeamPage).mockReturnValue(false) + + expect(isPage(page)).toBe(expected) + }) }) }) describe(getCurrentPage, () => { - it('returns the current page', () => { + it('returns the correct page for a simple pathname', () => { vi.mocked(getCurrentPathname).mockReturnValue(pages.club.pathname) + vi.mocked(getCurrentSearchParams).mockReturnValue(new URLSearchParams()) vi.mocked(isOwnTeamPage).mockReturnValue(false) expect(getCurrentPage()).toBe(pages.club) }) - it('throws an error when no page matches', () => { + it('distinguishes own team player list from other team player list', () => { + vi.mocked(getCurrentPathname).mockReturnValue(pages.playerList.senior.own.pathname) + vi.mocked(getCurrentSearchParams).mockReturnValue(new URLSearchParams()) + vi.mocked(isOwnTeamPage).mockReturnValue(true) + + expect(getCurrentPage()).toBe(pages.playerList.senior.own) + }) + + it('distinguishes other team player list from own team player list', () => { + vi.mocked(getCurrentPathname).mockReturnValue(pages.playerList.senior.other.pathname) + vi.mocked(getCurrentSearchParams).mockReturnValue(new URLSearchParams()) + vi.mocked(isOwnTeamPage).mockReturnValue(false) + + expect(getCurrentPage()).toBe(pages.playerList.senior.other) + }) + + it('distinguishes youth matches from senior matches by query param', () => { + vi.mocked(getCurrentPathname).mockReturnValue(pages.matchList.youth.own.pathname) + vi.mocked(getCurrentSearchParams).mockReturnValue(new URLSearchParams('?YouthTeamId=123')) + vi.mocked(isOwnTeamPage).mockReturnValue(true) + + expect(getCurrentPage()).toBe(pages.matchList.youth.own) + }) + + it('returns senior matches when YouthTeamId param is absent', () => { + vi.mocked(getCurrentPathname).mockReturnValue(pages.matchList.senior.own.pathname) + vi.mocked(getCurrentSearchParams).mockReturnValue(new URLSearchParams()) + vi.mocked(isOwnTeamPage).mockReturnValue(true) + + expect(getCurrentPage()).toBe(pages.matchList.senior.own) + }) + + it('throws error when no page matches', () => { vi.mocked(getCurrentPathname).mockReturnValue('/Unsupported/Path/') + vi.mocked(getCurrentSearchParams).mockReturnValue(new URLSearchParams()) vi.mocked(isOwnTeamPage).mockReturnValue(false) expect(() => getCurrentPage()).toThrowError('The current page is not supported') diff --git a/src/entrypoints/content/common/utils/pages.ts b/src/entrypoints/content/common/utils/pages.ts index b85aa68..4e994f4 100644 --- a/src/entrypoints/content/common/utils/pages.ts +++ b/src/entrypoints/content/common/utils/pages.ts @@ -1,8 +1,20 @@ -import { getCurrentPathname } from '@/entrypoints/content/common/utils/location' +import { getCurrentPathname, getCurrentSearchParams } from '@/entrypoints/content/common/utils/location' import { isOwnTeamPage } from '@/entrypoints/content/common/utils/team/utils' type TeamContext = 'OWN_TEAM' | 'OTHER_TEAM' +type QueryParam = { + name: string + value?: string +} + +type PageOptions = { + teamContext?: TeamContext + queryParams?: QueryParam[] +} + +type PageTree = Page | { [key: string]: PageTree } + /** * Represents a specific page on Hattrick. * @@ -16,68 +28,125 @@ export class Page { /** * @param pathname - The URL pathname of the Hattrick page (e.g., '/Club/Players/') - * @param teamContext - If this page exists for both my team and other teams, specify which one it refers to + * @param options - Optional settings to distinguish pages with the same pathname */ constructor( public readonly pathname: string, - public readonly teamContext?: TeamContext, + public readonly options?: PageOptions, ) {} - toString(): string { - return `Page(pathname=${this.pathname}, teamContext=${this.teamContext})` + toString() { + return this.options ? `Page("${this.pathname}", ${JSON.stringify(this.options)})` : `Page("${this.pathname}")` } } +/** + * Create a pair of {@link Page} instances for a pathname available for both own and other teams. + */ +const teamPages = (pathname: string, options?: Omit) => { + const own = new Page(pathname, { ...options, teamContext: 'OWN_TEAM' }) + const other = new Page(pathname, { ...options, teamContext: 'OTHER_TEAM' }) + return { own, other } +} + /** * Dictionary of all supported Hattrick pages. - * - * Modules reference these pages to determine where they should run. */ export const pages = { - // Special case all: new Page(Page.__ALL__), - - // Pages not related to the user's team appDenominations: new Page('/Help/Rules/AppDenominations.aspx'), + club: new Page('/Club/'), forum: new Page('/Forum/'), + matchList: { + senior: teamPages('/Club/Matches/'), + youth: teamPages('/Club/Matches/', { queryParams: [{ name: 'YouthTeamId' }] }), + }, + playerDetail: { + senior: teamPages('/Club/Players/Player.aspx'), + youth: teamPages('/Club/Players/YouthPlayer.aspx'), + }, + playerList: { + senior: teamPages('/Club/Players/'), + youth: teamPages('/Club/Players/YouthPlayers.aspx'), + }, series: new Page('/World/Series/'), - transfers: new Page('/World/Transfers/'), - transfersSearchResult: new Page('/World/Transfers/TransfersSearchResult.aspx'), - - // Pages accessible only to the user's own team - club: new Page('/Club/'), - matches: new Page('/Club/Matches/'), specialists: new Page('/Club/Specialists/'), stadium: new Page('/Club/Stadium/'), + transferSearch: new Page('/World/Transfers/'), + transferSearchResults: new Page('/World/Transfers/TransfersSearchResult.aspx'), +} as const satisfies Record - // Pages accessible to both the user's own team and other teams - playerDetailOtherTeam: new Page('/Club/Players/Player.aspx', 'OTHER_TEAM'), - playerDetailOwnTeam: new Page('/Club/Players/Player.aspx', 'OWN_TEAM'), - playerListOtherTeam: new Page('/Club/Players/', 'OTHER_TEAM'), - playerListOwnTeam: new Page('/Club/Players/', 'OWN_TEAM'), - // Pages that don't need to distinguish between the user's own team and other teams yet - youthPlayer: new Page('/Club/Players/YouthPlayer.aspx'), - youthPlayers: new Page('/Club/Players/YouthPlayers.aspx'), -} as const satisfies Record +/** + * Checks if any of the given pages match the current browser location. + */ +export const isPage = (...pages: Page[]): boolean => { + return pages.some((page) => { + if (page.pathname !== getCurrentPathname()) return false + + const { options } = page + if (!options) return true + + const { teamContext, queryParams } = options + + if (teamContext) { + const ownTeam = isOwnTeamPage() + if (teamContext === 'OWN_TEAM' && !ownTeam) return false + if (teamContext === 'OTHER_TEAM' && ownTeam) return false + } + + if (queryParams) { + const searchParams = getCurrentSearchParams() + + for (const { name, value } of queryParams) { + if (value === undefined ? !searchParams.has(name) : !searchParams.has(name, value)) return false + } + } + + return true + }) +} /** - * Checks if the given page matches the current browser location. + * Recursively flattens a {@link PageTree} into a flat array of {@link Page} instances. */ -export const isPage = (page: Page): boolean => { - if (page.pathname !== getCurrentPathname()) return false - if (page.teamContext === undefined) return true - if (page.teamContext === 'OWN_TEAM') return isOwnTeamPage() - return !isOwnTeamPage() // OTHER_TEAM +const flattenPages = (tree: PageTree): Page[] => { + if (tree instanceof Page) return [tree] + return Object.values(tree).flatMap(flattenPages) } /** * Returns the current page based on the browser's location. - * - * @throws {@link Error} If the current page is not in {@link pages} */ export const getCurrentPage = (): Page => { - const page = Object.values(pages).find((page) => isPage(page)) - if (page === undefined) throw new Error('The current page is not supported') + const matchingPages = flattenPages(pages).filter((page) => isPage(page)) + + if (matchingPages.length === 0) throw new Error('The current page is not supported') + if (matchingPages.length === 1) return matchingPages[0] + + // Multiple pages can match the same URL when one page is a more specific variant of another. For example, + // `pages.matchList.senior` and `pages.matchList.youth` share the same pathname, but `pages.matchList.youth` requires + // an additional query param 'YouthTeamId'. Both pass `isPage()`, so we score the pages to pick the most specific + // match; more query params = higher score. + let topPages: Page[] = [] + let topScore = -Infinity + + for (const page of matchingPages) { + const score = page.options?.queryParams?.length ?? 0 + + if (score > topScore) { + topScore = score + topPages = [page] + } else if (score === topScore) { + topPages.push(page) + } + } + + if (topPages.length > 1) { + throw new Error( + `Multiple pages matched with the same specificity score (${topScore}): ${topPages}. ` + + 'Add more specific options to disambiguate.', + ) + } - return page + return topPages[0] } diff --git a/src/entrypoints/content/index.ts b/src/entrypoints/content/index.ts index 911e2ad..94247d1 100644 --- a/src/entrypoints/content/index.ts +++ b/src/entrypoints/content/index.ts @@ -37,9 +37,8 @@ export default defineContentScript({ modules.forEach((module) => { const isAll = module.pages.includes(pages.all) - const matchesPage = isAll || module.pages.some((page) => isPage(page)) - const isExcluded = isAll && module.excludePages?.some((page) => isPage(page)) - if (!matchesPage || isExcluded) return + const matchesPage = isAll || isPage(...module.pages) + if (!matchesPage) return logger.debug(`Running module: ${module.name}`) diff --git a/src/entrypoints/content/modules/htms-points/index.test.ts b/src/entrypoints/content/modules/htms-points/index.test.ts index 45f215c..b38af7f 100644 --- a/src/entrypoints/content/modules/htms-points/index.test.ts +++ b/src/entrypoints/content/modules/htms-points/index.test.ts @@ -1,30 +1,27 @@ import { describe, expect, it, vi } from 'vitest' +import { mockIsPage } from '@/entrypoints/content/common/test/utils' import { isPage, pages } from '@/entrypoints/content/common/utils/pages' import htmsPoints from '@/entrypoints/content/modules/htms-points/index' import { calcHTMSPoints } from '@/entrypoints/content/modules/htms-points/utils' -vi.mock(import('@/entrypoints/content/common/utils/pages'), async () => { - const originalModule = await vi.importActual('@/entrypoints/content/common/utils/pages') - +vi.mock(import('@/entrypoints/content/common/utils/pages'), async (importOriginal) => { return { - ...originalModule, + ...(await importOriginal()), isPage: vi.fn(), } }) -vi.mock(import('@/entrypoints/content/modules/htms-points/utils'), async () => { - const originalModule = await vi.importActual('@/entrypoints/content/modules/htms-points/utils') - +vi.mock(import('@/entrypoints/content/modules/htms-points/utils'), async (importOriginal) => { return { - ...originalModule, + ...(await importOriginal()), calcHTMSPoints: vi.fn(), } }) describe('htms-points module', () => { it('adds HTMS points to the player detail page', () => { - vi.mocked(isPage).mockImplementation((page) => page === pages.playerDetailOwnTeam) + mockIsPage(pages.playerDetail.senior.own) vi.mocked(calcHTMSPoints).mockReturnValue({ ability: 1234, potential: 5678 }) document.body.innerHTML = ` @@ -86,7 +83,7 @@ describe('htms-points module', () => { }) it('adds HTMS points to the player list page', () => { - vi.mocked(isPage).mockImplementation((page) => page === pages.playerListOwnTeam) + vi.mocked(isPage).mockImplementation((page) => page === pages.playerList.senior.own) vi.mocked(calcHTMSPoints) .mockReturnValueOnce({ ability: 1234, potential: 5678 }) .mockReturnValueOnce({ ability: 2345, potential: 6789 }) @@ -204,7 +201,7 @@ describe('htms-points module', () => { }) it('adds HTMS points to the transfers search result page', () => { - vi.mocked(isPage).mockImplementation((page) => page === pages.transfersSearchResult) + vi.mocked(isPage).mockImplementation((page) => page === pages.transferSearchResults) vi.mocked(calcHTMSPoints) .mockReturnValueOnce({ ability: 1234, potential: 5678 }) .mockReturnValueOnce({ ability: 2345, potential: 6789 }) diff --git a/src/entrypoints/content/modules/htms-points/index.ts b/src/entrypoints/content/modules/htms-points/index.ts index b8961df..fb5739f 100644 --- a/src/entrypoints/content/modules/htms-points/index.ts +++ b/src/entrypoints/content/modules/htms-points/index.ts @@ -77,17 +77,22 @@ const processPlayers = (playerSelector: string, ageSelector: string): void => { */ const htmsPoints: Module = { name: 'HTMS Points', - pages: [pages.playerDetailOwnTeam, pages.playerDetailOtherTeam, pages.playerListOwnTeam, pages.transfersSearchResult], + pages: [ + pages.playerDetail.senior.own, + pages.playerDetail.senior.other, + pages.playerList.senior.own, + pages.transferSearchResults, + ], run: () => { - if (isPage(pages.playerDetailOwnTeam) || isPage(pages.playerDetailOtherTeam)) { + if (isPage(pages.playerDetail.senior.own, pages.playerDetail.senior.other)) { const playerElement = querySelector('#mainBody .playerInfo') const ageElement = querySelector('#mainBody > .byline') if (playerElement && ageElement) processPlayer(playerElement, ageElement) - } else if (isPage(pages.playerListOwnTeam)) { + } else if (isPage(pages.playerList.senior.own)) { const playerSelector = '#mainBody > .playerList > .teamphoto-player .playerInfo' const ageSelector = '.transferPlayerInformation table tbody tr:first-child td:nth-child(2)' processPlayers(playerSelector, ageSelector) - } else if (isPage(pages.transfersSearchResult)) { + } else if (isPage(pages.transferSearchResults)) { const playerSelector = '#mainBody .playerListDetails' const ageSelector = '.transferPlayerInformation table tbody tr:nth-child(2) td:nth-child(2)' processPlayers(playerSelector, ageSelector) diff --git a/src/entrypoints/content/modules/links/constants.ts b/src/entrypoints/content/modules/links/constants.ts index a346405..5e06632 100644 --- a/src/entrypoints/content/modules/links/constants.ts +++ b/src/entrypoints/content/modules/links/constants.ts @@ -59,14 +59,14 @@ export const SCOUTRICK: Link = { export const linkMap = new Map([ [pages.club, { links: [HATTID_TEAM], getReplacements: getOwnTeamData }], - [pages.matches, { links: [DHTH] }], - [pages.playerDetailOwnTeam, { links: [HATTRICK_PORTAL_TRACKER, HATTRICK_CYCLE_PLANNER] }], - [pages.playerListOwnTeam, { links: [HATTRICK_PORTAL_TRACKER, HATTRICK_CYCLE_PLANNER] }], + [pages.matchList.senior.own, { links: [DHTH] }], + [pages.playerDetail.senior.own, { links: [HATTRICK_PORTAL_TRACKER, HATTRICK_CYCLE_PLANNER] }], + [pages.playerList.senior.own, { links: [HATTRICK_PORTAL_TRACKER, HATTRICK_CYCLE_PLANNER] }], [ pages.series, { links: [HATTID_LEAGUE, NICKARANA_LEAGUE_SIMULATOR], getReplacements: () => ({ seriesId: getPageSeriesId() }) }, ], [pages.stadium, { links: [ENTERPRISE_CONSTRUCTION_ONLINE] }], - [pages.youthPlayer, { links: [HATTRICK_YOUTHCLUB, SCOUTRICK] }], - [pages.youthPlayers, { links: [HATTRICK_YOUTHCLUB, SCOUTRICK] }], + [pages.playerDetail.youth.own, { links: [HATTRICK_YOUTHCLUB, SCOUTRICK] }], + [pages.playerList.youth.own, { links: [HATTRICK_YOUTHCLUB, SCOUTRICK] }], ]) diff --git a/src/entrypoints/content/modules/links/index.test.ts b/src/entrypoints/content/modules/links/index.test.ts index 8dd40e7..24f69bd 100644 --- a/src/entrypoints/content/modules/links/index.test.ts +++ b/src/entrypoints/content/modules/links/index.test.ts @@ -4,20 +4,16 @@ import { getCurrentPage, pages } from '@/entrypoints/content/common/utils/pages' import { getOwnTeamData } from '@/entrypoints/content/common/utils/team/utils' import links from '@/entrypoints/content/modules/links/index' -vi.mock(import('@/entrypoints/content/common/utils/pages'), async () => { - const originalModule = await vi.importActual('@/entrypoints/content/common/utils/pages') - +vi.mock(import('@/entrypoints/content/common/utils/pages'), async (importOriginal) => { return { - ...originalModule, + ...(await importOriginal()), getCurrentPage: vi.fn(), } }) -vi.mock(import('@/entrypoints/content/common/utils/team/utils'), async () => { - const originalModule = await vi.importActual('@/entrypoints/content/common/utils/team/utils') - +vi.mock(import('@/entrypoints/content/common/utils/team/utils'), async (importOriginal) => { return { - ...originalModule, + ...(await importOriginal()), getOwnTeamData: vi.fn(), } }) @@ -39,7 +35,7 @@ describe('links module', () => { }) it('inserts box at the beginning of sidebar', () => { - vi.mocked(getCurrentPage).mockReturnValue(pages.matches) + vi.mocked(getCurrentPage).mockReturnValue(pages.matchList.senior.own) document.body.innerHTML = `