diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e1d9495d..289ef317 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,25 +26,40 @@ jobs: - name: Check for unreleased version id: tag + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | VERSION=$(node -p "require('./package.json').version") TAG="v${VERSION}" - if git rev-parse "$TAG" >/dev/null 2>&1; then - echo "Tag $TAG already exists — nothing to release." + # Check if a GitHub Release (not just a tag) exists for this version. + # Tags are now created on the development branch before merging to main, + # so we check for the Release object instead. + if gh release view "$TAG" >/dev/null 2>&1; then + echo "GitHub Release $TAG already exists — nothing to release." echo "should_release=false" >> "$GITHUB_OUTPUT" else echo "version=${VERSION}" >> "$GITHUB_OUTPUT" echo "should_release=true" >> "$GITHUB_OUTPUT" - echo "New version ${VERSION} detected — will create tag and release." + echo "New version ${VERSION} detected — will create release." fi - - name: Create version tag + - name: Ensure version tag points to this commit if: steps.tag.outputs.should_release == 'true' env: TAG_VERSION: ${{ steps.tag.outputs.version }} run: | - git tag "v${TAG_VERSION}" - git push origin "v${TAG_VERSION}" + TAG="v${TAG_VERSION}" + if git rev-parse "$TAG" >/dev/null 2>&1; then + TAG_SHA="$(git rev-list -n 1 "$TAG")" + if [ "$TAG_SHA" != "$GITHUB_SHA" ]; then + echo "Tag $TAG points to $TAG_SHA, retagging to $GITHUB_SHA (main merge commit)." + git tag -f "$TAG" "$GITHUB_SHA" + git push origin "$TAG" --force + fi + else + git tag "$TAG" + git push origin "$TAG" + fi - name: Log in to GHCR if: steps.tag.outputs.should_release == 'true' diff --git a/CHANGELOG.md b/CHANGELOG.md index 0712cbd8..089f4c9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,40 +1,50 @@ # Changelog -## [2.8.7](https://github.com/jordanlambrecht/tracker-tracker/compare/v2.8.6...v2.8.7) (2026-04-10) +## [2.8.9](https://github.com/jordanlambrecht/tracker-tracker/compare/v2.8.8...v2.8.9) (2026-04-10) -### Features +### Bug Fixes + +- timeout for fetch requests +- ensure version tag points to the correct commit during release -- **trackers:** detects truncated cookies +## [2.8.8](https://github.com/jordanlambrecht/tracker-tracker/compare/v2.8.7...v2.8.8) (2026-04-10) ### Bug Fixes -- **events:** update event categories and improve error logging -- **trackers:** missing profile parsing items for AnimeZ +- **release:** broken auto-release ci -## [2.8.6](https://github.com/jordanlambrecht/tracker-tracker/compare/v2.8.5...v2.8.6) (2026-04-09) +## [2.8.7](https://github.com/jordanlambrecht/tracker-tracker/releases/tag/v2.8.7) (2026-04-10) +### Features -### Bug Fixes +* **trackers:** detects truncated cookies -- **trackers:** profile parsing +### Bug Fixes -## [2.8.5](https://github.com/jordanlambrecht/tracker-tracker/compare/v2.8.4...v2.8.5) (2026-04-09) +* **events:** update event categories and improve error logging +* **trackers:** missing profile parsing items for AnimeZ +## [2.8.6](https://github.com/jordanlambrecht/tracker-tracker/releases/tag/v2.8.6) (2026-04-09) ### Bug Fixes -- changelog now shows all missed releases not just latest -- **trackers:** add batch tolerance for overdue checks to prevent drift +* **trackers:** profile parsing + +## [2.8.5](https://github.com/jordanlambrecht/tracker-tracker/releases/tag/v2.8.5) (2026-04-09) + +### Bug Fixes -## [2.8.4](https://github.com/jordanlambrecht/tracker-tracker/compare/v2.8.3...v2.8.4) (2026-04-09) +* changelog now shows all missed releases not just latest +* **trackers:** add batch tolerance for overdue checks to prevent drift +## [2.8.4](https://github.com/jordanlambrecht/tracker-tracker/releases/tag/v2.8.4) (2026-04-09) ### Features -- new "What's New" dialog -- **settings:** log files now batch in the events tab +* new "What's New" dialog +* **settings:** log files now batch in the events tab ## [2.8.3](https://github.com/jordanlambrecht/tracker-tracker/releases/tag/v2.8.3) (2026-04-09) diff --git a/package.json b/package.json index 0de0cd24..89213109 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "private-tracker-tracker", - "version": "2.8.7", + "version": "2.8.9", "description": "Self-hosted dashboard for monitoring private tracker stats over time", "license": "GPL-3.0", "repository": { @@ -69,9 +69,9 @@ "pino-pretty": "^13.1.3", "postgres": "^3.4.9", "qrcode.react": "^4.2.0", - "react": "19.2.4", + "react": "19.2.5", "react-colorful": "^5.6.1", - "react-dom": "19.2.4", + "react-dom": "19.2.5", "react-markdown": "^10.1.0", "remark-gfm": "^4.0.1", "socks-proxy-agent": "^10.0.0" @@ -85,19 +85,18 @@ "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", "@types/jsdom": "^28.0.1", - "@types/node": "^25.5.2", + "@types/node": "^25.6.0", "@types/node-cron": "^3.0.11", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "commit-and-tag-version": "^12.7.1", "conventional-changelog-cli": "^5.0.0", - "conventional-changelog-conventionalcommits": "^9.3.1", "dotenv": "^17.4.1", "husky": "^9.1.7", "jsdom": "^29.0.2", "knip": "^6.3.1", "postcss": "^8.5.9", - "prettier": "^3.8.1", + "prettier": "^3.8.2", "tailwindcss": "^4.2.2", "tsx": "^4.21.0", "typescript": "^6.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aabfe6a4..dbf6629c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,13 +13,13 @@ importers: dependencies: '@dnd-kit/core': specifier: ^6.3.1 - version: 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@dnd-kit/sortable': specifier: ^10.0.0 - version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5) '@dnd-kit/utilities': specifier: ^3.2.2 - version: 3.2.2(react@19.2.4) + version: 3.2.2(react@19.2.5) '@formkit/auto-animate': specifier: ^0.9.0 version: 0.9.0 @@ -28,7 +28,7 @@ importers: version: 0.5.19(tailwindcss@4.2.2) '@tanstack/react-query': specifier: ^5.97.0 - version: 5.97.0(react@19.2.4) + version: 5.97.0(react@19.2.5) argon2: specifier: ^0.44.0 version: 0.44.0 @@ -49,13 +49,13 @@ importers: version: 6.0.0 echarts-for-react: specifier: ^3.0.6 - version: 3.0.6(echarts@6.0.0)(react@19.2.4) + version: 3.0.6(echarts@6.0.0)(react@19.2.5) echarts-gl: specifier: ^2.0.9 version: 2.0.9(echarts@6.0.0) emoji-picker-react: specifier: ^4.18.0 - version: 4.18.0(react@19.2.4) + version: 4.18.0(react@19.2.5) https-proxy-agent: specifier: ^9.0.0 version: 9.0.0 @@ -64,7 +64,7 @@ importers: version: 6.2.2 next: specifier: 16.2.2 - version: 16.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 16.2.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) node-cron: specifier: ^4.2.1 version: 4.2.1 @@ -85,19 +85,19 @@ importers: version: 3.4.9 qrcode.react: specifier: ^4.2.0 - version: 4.2.0(react@19.2.4) + version: 4.2.0(react@19.2.5) react: - specifier: 19.2.4 - version: 19.2.4 + specifier: 19.2.5 + version: 19.2.5 react-colorful: specifier: ^5.6.1 - version: 5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 5.6.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react-dom: - specifier: 19.2.4 - version: 19.2.4(react@19.2.4) + specifier: 19.2.5 + version: 19.2.5(react@19.2.5) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@19.2.14)(react@19.2.4) + version: 10.1.0(@types/react@19.2.14)(react@19.2.5) remark-gfm: specifier: ^4.0.1 version: 4.0.1 @@ -110,7 +110,7 @@ importers: version: 2.4.11 '@commitlint/cli': specifier: ^20.5.0 - version: 20.5.0(@types/node@25.5.2)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@6.0.2) + version: 20.5.0(@types/node@25.6.0)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@6.0.2) '@commitlint/config-conventional': specifier: ^20.5.0 version: 20.5.0 @@ -122,7 +122,7 @@ importers: version: 6.9.1 '@testing-library/react': specifier: ^16.3.2 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) @@ -130,8 +130,8 @@ importers: specifier: ^28.0.1 version: 28.0.1 '@types/node': - specifier: ^25.5.2 - version: 25.5.2 + specifier: ^25.6.0 + version: 25.6.0 '@types/node-cron': specifier: ^3.0.11 version: 3.0.11 @@ -147,9 +147,6 @@ importers: conventional-changelog-cli: specifier: ^5.0.0 version: 5.0.0(conventional-commits-filter@5.0.0) - conventional-changelog-conventionalcommits: - specifier: ^9.3.1 - version: 9.3.1 dotenv: specifier: ^17.4.1 version: 17.4.1 @@ -166,8 +163,8 @@ importers: specifier: ^8.5.9 version: 8.5.9 prettier: - specifier: ^3.8.1 - version: 3.8.1 + specifier: ^3.8.2 + version: 3.8.2 tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -179,7 +176,7 @@ importers: version: 6.0.2 vitest: specifier: ^4.1.4 - version: 4.1.4(@types/node@25.5.2)(jsdom@29.0.2(@noble/hashes@2.0.1))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.4(@types/node@25.6.0)(jsdom@29.0.2(@noble/hashes@2.0.1))(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) packages: @@ -1428,8 +1425,8 @@ packages: '@types/node-cron@3.0.11': resolution: {integrity: sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==} - '@types/node@25.5.2': - resolution: {integrity: sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -2919,8 +2916,8 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-expression-matcher@1.4.0: - resolution: {integrity: sha512-s4DQMxIdhj3jLFWd9LxHOplj4p9yQ4ffMGowFf3cpEgrrJjEhN0V5nxw4Ye1EViAGDoL4/1AeO6qHpqYPOzE4Q==} + path-expression-matcher@1.5.0: + resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} engines: {node: '>=14.0.0'} path-key@3.1.1: @@ -2986,8 +2983,8 @@ packages: resolution: {integrity: sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw==} engines: {node: '>=12'} - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.8.2: + resolution: {integrity: sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==} engines: {node: '>=14'} hasBin: true @@ -3032,10 +3029,10 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - react-dom@19.2.4: - resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + react-dom@19.2.5: + resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} peerDependencies: - react: ^19.2.4 + react: ^19.2.5 react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -3046,8 +3043,8 @@ packages: '@types/react': '>=18' react: '>=18' - react@19.2.4: - resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + react@19.2.5: + resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} engines: {node: '>=0.10.0'} read-package-up@11.0.0: @@ -3424,8 +3421,8 @@ packages: resolution: {integrity: sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w==} engines: {node: '>=14'} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} undici-types@7.24.7: resolution: {integrity: sha512-XA+gOBkzYD3C74sZowtCLTpgtaCdqZhqCvR6y9LXvrKTt/IVU6bz49T4D+BPi475scshCCkb0IklJRw6T1ZlgQ==} @@ -3715,11 +3712,11 @@ snapshots: dependencies: css-tree: 3.2.1 - '@commitlint/cli@20.5.0(@types/node@25.5.2)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@6.0.2)': + '@commitlint/cli@20.5.0(@types/node@25.6.0)(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(typescript@6.0.2)': dependencies: '@commitlint/format': 20.5.0 '@commitlint/lint': 20.5.0 - '@commitlint/load': 20.5.0(@types/node@25.5.2)(typescript@6.0.2) + '@commitlint/load': 20.5.0(@types/node@25.6.0)(typescript@6.0.2) '@commitlint/read': 20.5.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) '@commitlint/types': 20.5.0 tinyexec: 1.1.1 @@ -3768,14 +3765,14 @@ snapshots: '@commitlint/rules': 20.5.0 '@commitlint/types': 20.5.0 - '@commitlint/load@20.5.0(@types/node@25.5.2)(typescript@6.0.2)': + '@commitlint/load@20.5.0(@types/node@25.6.0)(typescript@6.0.2)': dependencies: '@commitlint/config-validator': 20.5.0 '@commitlint/execute-rule': 20.0.0 '@commitlint/resolve-extends': 20.5.0 '@commitlint/types': 20.5.0 cosmiconfig: 9.0.1(typescript@6.0.2) - cosmiconfig-typescript-loader: 6.3.0(@types/node@25.5.2)(cosmiconfig@9.0.1(typescript@6.0.2))(typescript@6.0.2) + cosmiconfig-typescript-loader: 6.3.0(@types/node@25.6.0)(cosmiconfig@9.0.1(typescript@6.0.2))(typescript@6.0.2) is-plain-obj: 4.1.0 lodash.mergewith: 4.6.2 picocolors: 1.1.1 @@ -3862,29 +3859,29 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} - '@dnd-kit/accessibility@3.1.1(react@19.2.4)': + '@dnd-kit/accessibility@3.1.1(react@19.2.5)': dependencies: - react: 19.2.4 + react: 19.2.5 tslib: 2.8.1 - '@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@dnd-kit/core@6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@dnd-kit/accessibility': 3.1.1(react@19.2.4) - '@dnd-kit/utilities': 3.2.2(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@dnd-kit/accessibility': 3.1.1(react@19.2.5) + '@dnd-kit/utilities': 3.2.2(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) tslib: 2.8.1 - '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)': + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@dnd-kit/utilities': 3.2.2(react@19.2.4) - react: 19.2.4 + '@dnd-kit/core': 6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@dnd-kit/utilities': 3.2.2(react@19.2.5) + react: 19.2.5 tslib: 2.8.1 - '@dnd-kit/utilities@3.2.2(react@19.2.4)': + '@dnd-kit/utilities@3.2.2(react@19.2.5)': dependencies: - react: 19.2.4 + react: 19.2.5 tslib: 2.8.1 '@drizzle-team/brocli@0.10.2': {} @@ -4467,10 +4464,10 @@ snapshots: '@tanstack/query-core@5.97.0': {} - '@tanstack/react-query@5.97.0(react@19.2.4)': + '@tanstack/react-query@5.97.0(react@19.2.5)': dependencies: '@tanstack/query-core': 5.97.0 - react: 19.2.4 + react: 19.2.5 '@testing-library/dom@10.4.1': dependencies: @@ -4492,12 +4489,12 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@babel/runtime': 7.29.2 '@testing-library/dom': 10.4.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) @@ -4536,7 +4533,7 @@ snapshots: '@types/jsdom@28.0.1': dependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 undici-types: 7.24.7 @@ -4551,9 +4548,9 @@ snapshots: '@types/node-cron@3.0.11': {} - '@types/node@25.5.2': + '@types/node@25.6.0': dependencies: - undici-types: 7.18.2 + undici-types: 7.19.2 '@types/normalize-package-data@2.4.4': {} @@ -4582,13 +4579,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.4(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.4(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@25.5.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) '@vitest/pretty-format@4.1.4': dependencies: @@ -4965,9 +4962,9 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@6.3.0(@types/node@25.5.2)(cosmiconfig@9.0.1(typescript@6.0.2))(typescript@6.0.2): + cosmiconfig-typescript-loader@6.3.0(@types/node@25.6.0)(cosmiconfig@9.0.1(typescript@6.0.2))(typescript@6.0.2): dependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 cosmiconfig: 9.0.1(typescript@6.0.2) jiti: 2.6.1 typescript: 6.0.2 @@ -5099,11 +5096,11 @@ snapshots: optionalDependencies: postgres: 3.4.9 - echarts-for-react@3.0.6(echarts@6.0.0)(react@19.2.4): + echarts-for-react@3.0.6(echarts@6.0.0)(react@19.2.5): dependencies: echarts: 6.0.0 fast-deep-equal: 3.1.3 - react: 19.2.4 + react: 19.2.5 size-sensor: 1.0.3 echarts-gl@2.0.9(echarts@6.0.0): @@ -5117,10 +5114,10 @@ snapshots: tslib: 2.3.0 zrender: 6.0.0 - emoji-picker-react@4.18.0(react@19.2.4): + emoji-picker-react@4.18.0(react@19.2.5): dependencies: flairup: 1.0.0 - react: 19.2.4 + react: 19.2.5 emoji-regex@8.0.0: {} @@ -5208,12 +5205,12 @@ snapshots: fast-xml-builder@1.1.4: dependencies: - path-expression-matcher: 1.4.0 + path-expression-matcher: 1.5.0 fast-xml-parser@5.5.11: dependencies: fast-xml-builder: 1.1.4 - path-expression-matcher: 1.4.0 + path-expression-matcher: 1.5.0 strnum: 2.2.3 fastq@1.20.1: @@ -6036,16 +6033,16 @@ snapshots: neo-async@2.6.2: {} - next@16.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next@16.2.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: '@next/env': 16.2.2 '@swc/helpers': 0.5.15 baseline-browser-mapping: 2.10.17 caniuse-lite: 1.0.30001787 postcss: 8.4.31 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + styled-jsx: 5.1.6(react@19.2.5) optionalDependencies: '@next/swc-darwin-arm64': 16.2.2 '@next/swc-darwin-x64': 16.2.2 @@ -6237,7 +6234,7 @@ snapshots: path-exists@4.0.0: {} - path-expression-matcher@1.4.0: {} + path-expression-matcher@1.5.0: {} path-key@3.1.1: {} @@ -6314,7 +6311,7 @@ snapshots: postgres@3.4.9: {} - prettier@3.8.1: {} + prettier@3.8.2: {} pretty-format@27.5.1: dependencies: @@ -6335,9 +6332,9 @@ snapshots: punycode@2.3.1: {} - qrcode.react@4.2.0(react@19.2.4): + qrcode.react@4.2.0(react@19.2.5): dependencies: - react: 19.2.4 + react: 19.2.5 queue-microtask@1.2.3: {} @@ -6345,19 +6342,19 @@ snapshots: quick-lru@4.0.1: {} - react-colorful@5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-colorful@5.6.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) - react-dom@19.2.4(react@19.2.4): + react-dom@19.2.5(react@19.2.5): dependencies: - react: 19.2.4 + react: 19.2.5 scheduler: 0.27.0 react-is@17.0.2: {} - react-markdown@10.1.0(@types/react@19.2.14)(react@19.2.4): + react-markdown@10.1.0(@types/react@19.2.14)(react@19.2.5): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -6366,7 +6363,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 mdast-util-to-hast: 13.2.1 - react: 19.2.4 + react: 19.2.5 remark-parse: 11.0.0 remark-rehype: 11.1.2 unified: 11.0.5 @@ -6375,7 +6372,7 @@ snapshots: transitivePeerDependencies: - supports-color - react@19.2.4: {} + react@19.2.5: {} read-package-up@11.0.0: dependencies: @@ -6686,10 +6683,10 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - styled-jsx@5.1.6(react@19.2.4): + styled-jsx@5.1.6(react@19.2.5): dependencies: client-only: 0.0.1 - react: 19.2.4 + react: 19.2.5 supports-color@5.5.0: dependencies: @@ -6785,7 +6782,7 @@ snapshots: unbash@2.2.0: {} - undici-types@7.18.2: {} + undici-types@7.19.2: {} undici-types@7.24.7: {} @@ -6843,7 +6840,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3): + vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: esbuild: 0.28.0 fdir: 6.5.0(picomatch@4.0.4) @@ -6852,17 +6849,17 @@ snapshots: rollup: 4.60.1 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.32.0 tsx: 4.21.0 yaml: 2.8.3 - vitest@4.1.4(@types/node@25.5.2)(jsdom@29.0.2(@noble/hashes@2.0.1))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.4(@types/node@25.6.0)(jsdom@29.0.2(@noble/hashes@2.0.1))(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.4 - '@vitest/mocker': 4.1.4(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.4(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.4 '@vitest/runner': 4.1.4 '@vitest/snapshot': 4.1.4 @@ -6879,10 +6876,10 @@ snapshots: tinyexec: 1.1.1 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 7.3.2(@types/node@25.5.2)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 jsdom: 29.0.2(@noble/hashes@2.0.1) transitivePeerDependencies: - msw diff --git a/src/lib/query-options.ts b/src/lib/query-options.ts index 9b90a627..5beb1e54 100644 --- a/src/lib/query-options.ts +++ b/src/lib/query-options.ts @@ -9,7 +9,7 @@ import type { SafeDownloadClient, TrackerSummary } from "@/types/api" export const clientQueryOptions = queryOptions({ queryKey: ["clients"] as const, queryFn: async ({ signal }) => { - const res = await fetch("/api/clients", { signal }) + const res = await fetch("/api/clients", { signal: signal ?? AbortSignal.timeout(15_000) }) if (!res.ok) return [] as SafeDownloadClient[] return res.json() as Promise }, @@ -18,7 +18,7 @@ export const clientQueryOptions = queryOptions({ export const trackerQueryOptions = queryOptions({ queryKey: ["trackers"] as const, queryFn: async ({ signal }) => { - const res = await fetch("/api/trackers", { signal }) + const res = await fetch("/api/trackers", { signal: signal ?? AbortSignal.timeout(15_000) }) if (!res.ok) return [] as TrackerSummary[] return res.json() as Promise },