From 19c39f02afa5bb6235f1ac931da7599a11cde9a4 Mon Sep 17 00:00:00 2001 From: martin-mfg <2026226+martin-mfg@users.noreply.github.com> Date: Sun, 8 Mar 2026 09:42:09 +0100 Subject: [PATCH 01/57] document default regeneration times --- docs/deploy.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/deploy.md b/docs/deploy.md index 1ad48734..a837d1ec 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -163,12 +163,12 @@ GitHub Stats Extended provides several environment variables that can be used to UPDATE_AFTER_HOURS - Sets the duration in hours after which the server proactively regenerates a previously requested card. + Sets the duration in hours after which the server proactively regenerates a previously requested card. Defaults to 11 hours. Any int or float DELETE_AFTER_HOURS - Sets the duration in hours after which the server stops proactively regenerating a previously requested card if it hasn't been requested again in the meantime. + Sets the duration in hours after which the server stops proactively regenerating a previously requested card if it hasn't been requested again in the meantime. Defaults to 8 days, i.e. 192 hours. Any int or float From d476f8cbe10d5981ef4dd72045ce0ff917c89075 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Sat, 18 Apr 2026 10:37:26 +0200 Subject: [PATCH 02/57] extract "core" package, small improvements (#137) This PR mainly refactors the code by extracting a "core" package which is then used by the "backend" and "frontend" apps. Apart from this the PR also contains several smaller changes like fixing dependabot, upgrading dependencies, aligned "package.json" files, added tests, ... addresses step 1 of #32 closes #136 --------- Co-authored-by: Marco Pasqualetti --- .github/CONTRIBUTING.md | 3 +- .../actions/install-dependencies/action.yml | 6 +- .github/dependabot.yml | 15 +- .github/workflows/ci.yml | 59 +- .github/workflows/generate-theme-doc.yml | 8 +- .github/workflows/release.yml | 18 + .github/workflows/repeat-recent-requests.yml | 2 +- .github/workflows/update-langs.yml | 6 +- .gitignore | 17 +- .husky/pre-commit | 3 +- .../output/functions/api.func/router.js | 76 - apps/backend/api-renamed/authenticate.js | 3 +- apps/backend/api-renamed/delete-user.js | 3 +- apps/backend/api-renamed/downgrade.js | 2 +- apps/backend/api-renamed/gist.js | 129 - apps/backend/api-renamed/status/pat-info.js | 24 +- apps/backend/api-renamed/status/up.js | 10 +- apps/backend/api-renamed/user-access.js | 3 +- apps/backend/api-renamed/wakatime-proxy.js | 6 +- apps/backend/api-renamed/wakatime.js | 148 - apps/backend/express.js | 15 +- apps/backend/index.js | 1 + apps/backend/package.json | 49 +- apps/backend/powered-by-vercel.svg | 6 - apps/backend/router.js | 225 ++ apps/backend/src/cards/index.js | 4 - apps/backend/src/common/access.js | 50 +- apps/backend/src/common/cache.js | 9 +- apps/backend/src/common/database.js | 18 +- apps/backend/src/common/envs.js | 15 - apps/backend/src/common/index.js | 13 - apps/backend/src/index.js | 2 - apps/backend/src/users.js | 1 + .../tests/__snapshots__/wakatime.test.js.snap | 115 - apps/backend/tests/_setup.private-instance.js | 2 - apps/backend/tests/api.test.js | 433 +-- apps/backend/tests/bench/api.bench.js | 91 +- .../tests/bench/calculateRank.bench.js | 22 - apps/backend/tests/bench/gist.bench.js | 66 +- apps/backend/tests/bench/pin.bench.js | 63 +- apps/backend/tests/e2e/e2e.test.js | 366 ++- apps/backend/tests/gist.test.js | 259 +- apps/backend/tests/pat-info.test.js | 27 +- apps/backend/tests/pin.test.js | 232 +- .../tests/private-instance/api.test.js | 41 - .../tests/private-instance/gist.test.js | 41 - .../tests/private-instance/pin.test.js | 64 - .../tests/private-instance/top-langs.test.js | 41 - .../__snapshots__/api.test.js.snap | 514 ++++ .../__snapshots__/gist.test.js.snap | 252 ++ .../__snapshots__/pin.test.js.snap | 406 +++ .../__snapshots__/top-langs.test.js.snap | 460 +++ .../__snapshots__/wakatime.test.js.snap | 546 ++++ .../backend/tests/public-instance/api.test.js | 180 +- .../tests/public-instance/gist.test.js | 125 +- .../backend/tests/public-instance/pin.test.js | 235 +- .../tests/public-instance/top-langs.test.js | 194 +- .../tests/public-instance/wakatime.test.js | 212 ++ apps/backend/tests/test-data/api-data.js | 51 - apps/backend/tests/test-data/gist-data.js | 28 - apps/backend/tests/test-data/langs-data.js | 36 - apps/backend/tests/test-data/pin-data.js | 26 - apps/backend/tests/top-langs.test.js | 239 +- apps/backend/tests/utils.js | 315 +- apps/backend/tests/wakatime.test.js | 246 +- apps/backend/tsconfig.typecheck.json | 7 + apps/backend/vercel.json | 2 +- apps/backend/vitest.config.bench.ts | 3 + apps/backend/vitest.config.e2e.ts | 3 + apps/backend/vitest.config.ts | 37 +- apps/frontend/package.json | 49 +- .../src/components/Card/SvgInline.tsx | 4 +- apps/frontend/src/constants.ts | 8 +- apps/frontend/src/pages/Home/Home.tsx | 2 +- apps/frontend/src/pages/Home/stages/Theme.tsx | 22 +- apps/frontend/tsconfig.typecheck.json | 7 + apps/frontend/vercel.json | 2 +- apps/frontend/vite.config.ts | 54 +- docs/advanced_documentation.md | 6 +- docs/deploy.md | 1 + eslint.config.js | 20 + knip.jsonc | 15 +- package.json | 41 +- {apps/backend => packages/core}/codecov.yml | 0 packages/core/package.json | 94 + .../core}/scripts/generate-langs-json.js | 0 .../core}/scripts/generate-theme-doc.js | 4 +- packages/core/src/api/gist.js | 97 + .../core/src/api}/index.js | 93 +- .../core/src/api}/pin.js | 95 +- .../core/src/api}/top-langs.js | 100 +- packages/core/src/api/wakatime.js | 113 + .../core}/src/calculateRank.js | 0 .../core}/src/cards/gist.js | 0 .../core}/src/cards/repo.js | 0 .../core}/src/cards/stats.js | 2 +- .../core}/src/cards/top-languages.js | 4 +- .../core}/src/cards/types.d.ts | 16 +- .../core}/src/cards/wakatime.js | 2 +- .../core}/src/common/Card.js | 2 +- .../core}/src/common/I18n.js | 0 .../core}/src/common/color.js | 2 +- packages/core/src/common/config.js | 78 + .../core}/src/common/constants.js | 0 .../core}/src/common/error.js | 0 .../core}/src/common/fmt.js | 2 +- .../core}/src/common/html.js | 0 .../core}/src/common/http.js | 0 .../core}/src/common/icons.js | 0 .../core}/src/common/languageColors.json | 3 + .../core}/src/common/log.js | 6 +- .../core}/src/common/ops.js | 0 .../core}/src/common/render.js | 1 - .../core}/src/common/retryer.js | 21 +- .../core}/src/fetchers/gist.js | 5 +- .../core}/src/fetchers/repo.js | 5 +- .../core}/src/fetchers/stats.js | 67 +- .../core}/src/fetchers/top-languages.js | 21 +- .../core}/src/fetchers/types.d.ts | 40 +- .../core}/src/fetchers/wakatime.js | 0 packages/core/src/index.ts | 25 + .../core/src}/themes/README.md | 0 .../core/src/themes/index.ts | 13 +- .../core}/src/translations.js | 0 .../renderWakatimeCard.test.js.snap | 72 + packages/core/tests/_setup.js | 7 + .../core}/tests/calculateRank.test.js | 2 - .../core}/tests/card.test.js | 2 - .../core}/tests/color.test.js | 0 .../core}/tests/fetchGist.test.js | 2 - .../core}/tests/fetchRepo.test.js | 2 - .../core}/tests/fetchStats.test.js | 7 +- .../core}/tests/fetchTopLanguages.test.js | 2 - .../core}/tests/fetchWakatime.test.js | 2 - .../core}/tests/flexLayout.test.js | 0 .../core}/tests/fmt.test.js | 0 .../core}/tests/html.test.js | 0 .../core}/tests/i18n.test.js | 0 .../core}/tests/ops.test.js | 0 .../core}/tests/render.test.js | 2 - .../core}/tests/renderGistCard.test.js | 4 +- .../core}/tests/renderRepoCard.test.js | 4 +- .../core}/tests/renderStatsCard.test.js | 4 +- .../tests/renderTopLanguagesCard.test.js | 4 +- .../core}/tests/renderWakatimeCard.test.js | 2 - .../core}/tests/retryer.test.js | 15 +- packages/core/tests/utils.js | 41 + packages/core/tsconfig.build.json | 9 + packages/core/tsconfig.json | 21 + packages/core/tsconfig.typecheck.json | 7 + packages/core/vitest.config.ts | 9 + pnpm-lock.yaml | 2582 +++++++---------- pnpm-workspace.yaml | 5 +- tsconfig.base.json | 9 + tsconfig.json | 11 +- turbo.json | 16 + vercel-preparation.sh | 1 - vitest.config.coverage.ts | 13 + vitest.config.ts | 11 + 159 files changed, 6515 insertions(+), 4424 deletions(-) create mode 100644 .github/workflows/release.yml delete mode 100644 apps/backend/_dot_vercel_copy/output/functions/api.func/router.js delete mode 100644 apps/backend/api-renamed/gist.js delete mode 100644 apps/backend/api-renamed/wakatime.js create mode 100644 apps/backend/index.js delete mode 100644 apps/backend/powered-by-vercel.svg create mode 100644 apps/backend/router.js delete mode 100644 apps/backend/src/cards/index.js delete mode 100644 apps/backend/src/common/envs.js delete mode 100644 apps/backend/src/common/index.js delete mode 100644 apps/backend/src/index.js delete mode 100644 apps/backend/tests/__snapshots__/wakatime.test.js.snap delete mode 100644 apps/backend/tests/_setup.private-instance.js delete mode 100644 apps/backend/tests/bench/calculateRank.bench.js delete mode 100644 apps/backend/tests/private-instance/api.test.js delete mode 100644 apps/backend/tests/private-instance/gist.test.js delete mode 100644 apps/backend/tests/private-instance/pin.test.js delete mode 100644 apps/backend/tests/private-instance/top-langs.test.js create mode 100644 apps/backend/tests/public-instance/__snapshots__/api.test.js.snap create mode 100644 apps/backend/tests/public-instance/__snapshots__/gist.test.js.snap create mode 100644 apps/backend/tests/public-instance/__snapshots__/pin.test.js.snap create mode 100644 apps/backend/tests/public-instance/__snapshots__/top-langs.test.js.snap create mode 100644 apps/backend/tests/public-instance/__snapshots__/wakatime.test.js.snap create mode 100644 apps/backend/tests/public-instance/wakatime.test.js delete mode 100644 apps/backend/tests/test-data/api-data.js delete mode 100644 apps/backend/tests/test-data/gist-data.js delete mode 100644 apps/backend/tests/test-data/langs-data.js delete mode 100644 apps/backend/tests/test-data/pin-data.js create mode 100644 apps/backend/tsconfig.typecheck.json create mode 100644 apps/frontend/tsconfig.typecheck.json rename {apps/backend => packages/core}/codecov.yml (100%) create mode 100644 packages/core/package.json rename {apps/backend => packages/core}/scripts/generate-langs-json.js (100%) rename {apps/backend => packages/core}/scripts/generate-theme-doc.js (96%) create mode 100644 packages/core/src/api/gist.js rename {apps/backend/api-renamed => packages/core/src/api}/index.js (71%) rename {apps/backend/api-renamed => packages/core/src/api}/pin.js (63%) rename {apps/backend/api-renamed => packages/core/src/api}/top-langs.js (64%) create mode 100644 packages/core/src/api/wakatime.js rename {apps/backend => packages/core}/src/calculateRank.js (100%) rename {apps/backend => packages/core}/src/cards/gist.js (100%) rename {apps/backend => packages/core}/src/cards/repo.js (100%) rename {apps/backend => packages/core}/src/cards/stats.js (99%) rename {apps/backend => packages/core}/src/cards/top-languages.js (99%) rename {apps/backend => packages/core}/src/cards/types.d.ts (88%) rename {apps/backend => packages/core}/src/cards/wakatime.js (99%) rename {apps/backend => packages/core}/src/common/Card.js (98%) rename {apps/backend => packages/core}/src/common/I18n.js (100%) rename {apps/backend => packages/core}/src/common/color.js (98%) create mode 100644 packages/core/src/common/config.js rename {apps/backend => packages/core}/src/common/constants.js (100%) rename {apps/backend => packages/core}/src/common/error.js (100%) rename {apps/backend => packages/core}/src/common/fmt.js (99%) rename {apps/backend => packages/core}/src/common/html.js (100%) rename {apps/backend => packages/core}/src/common/http.js (100%) rename {apps/backend => packages/core}/src/common/icons.js (100%) rename {apps/backend => packages/core}/src/common/languageColors.json (99%) rename {apps/backend => packages/core}/src/common/log.js (57%) rename {apps/backend => packages/core}/src/common/ops.js (100%) rename {apps/backend => packages/core}/src/common/render.js (99%) rename {apps/backend => packages/core}/src/common/retryer.js (83%) rename {apps/backend => packages/core}/src/fetchers/gist.js (94%) rename {apps/backend => packages/core}/src/fetchers/repo.js (97%) rename {apps/backend => packages/core}/src/fetchers/stats.js (91%) rename {apps/backend => packages/core}/src/fetchers/top-languages.js (93%) rename {apps/backend => packages/core}/src/fetchers/types.d.ts (89%) rename {apps/backend => packages/core}/src/fetchers/wakatime.js (100%) create mode 100644 packages/core/src/index.ts rename {apps/backend => packages/core/src}/themes/README.md (100%) rename apps/backend/themes/index.js => packages/core/src/themes/index.ts (97%) rename {apps/backend => packages/core}/src/translations.js (100%) rename {apps/backend => packages/core}/tests/__snapshots__/renderWakatimeCard.test.js.snap (91%) create mode 100644 packages/core/tests/_setup.js rename {apps/backend => packages/core}/tests/calculateRank.test.js (98%) rename {apps/backend => packages/core}/tests/card.test.js (99%) rename {apps/backend => packages/core}/tests/color.test.js (100%) rename {apps/backend => packages/core}/tests/fetchGist.test.js (98%) rename {apps/backend => packages/core}/tests/fetchRepo.test.js (98%) rename {apps/backend => packages/core}/tests/fetchStats.test.js (98%) rename {apps/backend => packages/core}/tests/fetchTopLanguages.test.js (99%) rename {apps/backend => packages/core}/tests/fetchWakatime.test.js (98%) rename {apps/backend => packages/core}/tests/flexLayout.test.js (100%) rename {apps/backend => packages/core}/tests/fmt.test.js (100%) rename {apps/backend => packages/core}/tests/html.test.js (100%) rename {apps/backend => packages/core}/tests/i18n.test.js (100%) rename {apps/backend => packages/core}/tests/ops.test.js (100%) rename {apps/backend => packages/core}/tests/render.test.js (95%) rename {apps/backend => packages/core}/tests/renderGistCard.test.js (98%) rename {apps/backend => packages/core}/tests/renderRepoCard.test.js (99%) rename {apps/backend => packages/core}/tests/renderStatsCard.test.js (99%) rename {apps/backend => packages/core}/tests/renderTopLanguagesCard.test.js (99%) rename {apps/backend => packages/core}/tests/renderWakatimeCard.test.js (98%) rename {apps/backend => packages/core}/tests/retryer.test.js (83%) create mode 100644 packages/core/tests/utils.js create mode 100644 packages/core/tsconfig.build.json create mode 100644 packages/core/tsconfig.json create mode 100644 packages/core/tsconfig.typecheck.json create mode 100644 packages/core/vitest.config.ts create mode 100644 turbo.json create mode 100644 vitest.config.coverage.ts create mode 100644 vitest.config.ts diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a304b2f9..002e4576 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -7,7 +7,8 @@ To set up the project GitHub-Stats-Extended locally, run the following commands: ```bash ./vercel-preparation.sh pnpm install -pnpm --filter frontend run build +pnpm run build:packages +pnpm run dev:frontend ``` The easiest way to run and test the project is to deploy it to Vercel as described in the [deployment guide](../docs/deploy.md). diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml index 901d2f63..ba1ccbae 100644 --- a/.github/actions/install-dependencies/action.yml +++ b/.github/actions/install-dependencies/action.yml @@ -14,11 +14,11 @@ runs: steps: - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5 - name: Setup Node.js (via input) if: ${{ inputs.node-version }} - uses: actions/setup-node@v6 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: ${{ inputs.node-version }} cache: "pnpm" @@ -26,7 +26,7 @@ runs: - name: Setup Node.js (via .nvmrc) if: ${{ !inputs.node-version }} - uses: actions/setup-node@v6 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version-file: ".nvmrc" cache: "pnpm" diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e0eeed90..6bb49064 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,9 +4,8 @@ updates: - package-ecosystem: npm directory: "/" schedule: - interval: cron - cronjob: every day at 5am - open-pull-requests-limit: 10 + interval: daily + open-pull-requests-limit: 20 commit-message: prefix: "build(deps)" prefix-development: "build(deps-dev)" @@ -20,9 +19,8 @@ updates: - package-ecosystem: github-actions directory: "/" schedule: - interval: cron - cronjob: every day at 5am - open-pull-requests-limit: 10 + interval: daily + open-pull-requests-limit: 20 commit-message: prefix: "ci(deps)" prefix-development: "ci(deps-dev)" @@ -33,9 +31,8 @@ updates: - package-ecosystem: devcontainers directory: "/" schedule: - interval: cron - cronjob: every day at 5am - open-pull-requests-limit: 10 + interval: daily + open-pull-requests-limit: 20 commit-message: prefix: "build(deps)" prefix-development: "build(deps-dev)" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67d0bad2..9f27b1fd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run vercel-preparation.sh run: | @@ -43,14 +43,14 @@ jobs: with: node-version: ${{ matrix.node }} + - name: Build packages + run: pnpm run build:packages + - name: Build frontend - run: pnpm --filter frontend run build + run: pnpm run build:frontend - - name: Run frontend tests - run: pnpm --filter frontend run test - - - name: Run backend tests - run: pnpm --filter github-readme-stats run test + - name: Run tests + run: pnpm run test --silent frontend-test-e2e: name: Frontend E2E test @@ -64,21 +64,42 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install Dependencies uses: ./.github/actions/install-dependencies - - name: Run vercel-preparation.sh - run: | - chmod +x ./vercel-preparation.sh - ./vercel-preparation.sh + - name: Build packages + run: pnpm run build:packages - name: Install Playwright Browsers run: pnpm exec playwright install --with-deps - name: Run Playwright tests - run: pnpm --filter frontend run test:e2e + run: pnpm --filter ./apps/frontend/ run test:e2e + + backend-test-e2e: + name: Backend E2E test + + runs-on: ubuntu-latest + + permissions: + contents: read + + continue-on-error: true + + steps: + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Install Dependencies + uses: ./.github/actions/install-dependencies + + - name: Build packages + run: pnpm run build:packages + + - name: Run backend end-to-end tests + run: pnpm --filter ./apps/backend/ run test:e2e code-checks: name: Code checks @@ -90,17 +111,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v6 - - # Heads up! - # - # 1. Execution of this script is needed to resolve `.vercel` folder from `apps/frontend/src/components/Card/SVG.js` - # 2. This scripts removes `apps/backend/node_modules` breaking ESLint’s module resolution. - # Dependency installation must occur after running ./vercel-preparation.sh. - - name: Run vercel-preparation.sh - run: | - chmod +x ./vercel-preparation.sh - ./vercel-preparation.sh + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install Dependencies uses: ./.github/actions/install-dependencies diff --git a/.github/workflows/generate-theme-doc.yml b/.github/workflows/generate-theme-doc.yml index c985fded..92cce540 100644 --- a/.github/workflows/generate-theme-doc.yml +++ b/.github/workflows/generate-theme-doc.yml @@ -4,7 +4,7 @@ on: branches: - master paths: - - "apps/backend/themes/index.js" + - "packages/core/src/themes/index.js" workflow_dispatch: permissions: {} @@ -30,17 +30,17 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install Dependencies uses: ./.github/actions/install-dependencies - name: Generate readme run: | - pnpm --filter github-readme-stats run theme-readme-gen + pnpm --filter ./packages/core/ run theme-readme-gen - name: Create Pull Request if themes README has changed - uses: peter-evans/create-pull-request@v8 + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8 with: commit-message: "feat(backend): update themes README" branch: "update_themes_readme/patch" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..f8ba92bc --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,18 @@ +name: Update version tags +on: + push: + branches-ignore: + - "**" + tags: + - "v*.*.*" + +permissions: {} + +jobs: + update-semver: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: haya14busa/action-update-semver@7d2c558640ea49e798d46539536190aff8c18715 # v1.5.1 diff --git a/.github/workflows/repeat-recent-requests.yml b/.github/workflows/repeat-recent-requests.yml index ebf23adf..6e4d6801 100644 --- a/.github/workflows/repeat-recent-requests.yml +++ b/.github/workflows/repeat-recent-requests.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Make Request id: myRequest - uses: fjogeleit/http-request-action@v2 + uses: fjogeleit/http-request-action@551353b829c3646756b2ec2b3694f819d7957495 # v2 with: url: "https://github-stats-extended.vercel.app/api/repeat-recent" method: "POST" diff --git a/.github/workflows/update-langs.yml b/.github/workflows/update-langs.yml index 8ead85e2..b720eecb 100644 --- a/.github/workflows/update-langs.yml +++ b/.github/workflows/update-langs.yml @@ -38,16 +38,16 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install Dependencies uses: ./.github/actions/install-dependencies - name: Run update-languages-json.js script - run: pnpm --filter github-readme-stats run generate-langs-json + run: pnpm --filter ./packages/core/ run generate-langs-json - name: Create Pull Request if upstream language file is changed - uses: peter-evans/create-pull-request@v8 + uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8 with: commit-message: "feat(backend): update languages JSON" branch: "update_langs/patch" diff --git a/.gitignore b/.gitignore index bd17695b..2890613a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,8 @@ node_modules -.env.local -.env.development.local -.env.test.local -.env.production.local - # OS .DS_Store -# Logs -npm-debug.log* -yarn-debug.log* -yarn-error.log* - # Project coverage @@ -26,11 +16,12 @@ apps/backend/vercel_token apps/backend-copy apps/frontend/.env -apps/frontend/src/backend -apps/frontend/build + +.turbo +build build-ts -tsconfig.tsbuildinfo +*.tsbuildinfo # IDE .idea/ diff --git a/.husky/pre-commit b/.husky/pre-commit index b4c15f46..e742101e 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,3 @@ pnpm lint-staged pnpm run lint -# TODO enable -# npm test +pnpm test diff --git a/apps/backend/_dot_vercel_copy/output/functions/api.func/router.js b/apps/backend/_dot_vercel_copy/output/functions/api.func/router.js deleted file mode 100644 index b9a98e1e..00000000 --- a/apps/backend/_dot_vercel_copy/output/functions/api.func/router.js +++ /dev/null @@ -1,76 +0,0 @@ -/* eslint-disable import-x/no-unresolved */ -import { default as authenticate } from "./api-renamed/authenticate.js"; -import { default as deleteUser } from "./api-renamed/delete-user.js"; -import { default as downgrade } from "./api-renamed/downgrade.js"; -import { default as gist } from "./api-renamed/gist.js"; -import { default as api } from "./api-renamed/index.js"; -import { default as pin } from "./api-renamed/pin.js"; -import { default as repeatRecent } from "./api-renamed/repeat-recent.js"; -import { default as patInfo } from "./api-renamed/status/pat-info.js"; -import { default as statusUp } from "./api-renamed/status/up.js"; -import { default as topLangs } from "./api-renamed/top-langs.js"; -import { default as userAccess } from "./api-renamed/user-access.js"; -import { default as wakatimeProxy } from "./api-renamed/wakatime-proxy.js"; -import { default as wakatime } from "./api-renamed/wakatime.js"; - -export default async (req, res) => { - // remaining code expects express.js-like request and response objects - res.send = function (data) { - if (typeof data === "object") { - res.setHeader("Content-Type", "application/json"); - res.end(JSON.stringify(data)); - } else if (typeof data === "string") { - res.end(data); - } else { - res.end(String(data)); - } - }; - const url = new URL(req.url, "https://localhost"); - req.query = Object.fromEntries(url.searchParams.entries()); - - switch (url.pathname) { - case "/api": - await api(req, res); - break; - case "/api/gist": - await gist(req, res); - break; - case "/api/pin": - await pin(req, res); - break; - case "/api/top-langs": - await topLangs(req, res); - break; - case "/api/wakatime": - await wakatime(req, res); - break; - case "/api/wakatime-proxy": - await wakatimeProxy(req, res); - break; - case "/api/repeat-recent": - await repeatRecent(req, res); - break; - case "/api/status/pat-info": - await patInfo(req, res); - break; - case "/api/status/up": - await statusUp(req, res); - break; - case "/api/authenticate": - await authenticate(req, res); - break; - case "/api/delete-user": - await deleteUser(req, res); - break; - case "/api/user-access": - await userAccess(req, res); - break; - case "/api/downgrade": - await downgrade(req, res); - break; - default: - res.statusCode = 404; - res.end("Not Found"); - break; - } -}; diff --git a/apps/backend/api-renamed/authenticate.js b/apps/backend/api-renamed/authenticate.js index 18511a22..bcfaa3ec 100644 --- a/apps/backend/api-renamed/authenticate.js +++ b/apps/backend/api-renamed/authenticate.js @@ -1,4 +1,5 @@ -import { logger } from "../src/common/log.js"; +import { logger } from "@stats-organization/github-readme-stats-core"; + import { authenticate } from "../src/users.js"; /** diff --git a/apps/backend/api-renamed/delete-user.js b/apps/backend/api-renamed/delete-user.js index 83c073e9..f19c3672 100644 --- a/apps/backend/api-renamed/delete-user.js +++ b/apps/backend/api-renamed/delete-user.js @@ -1,5 +1,6 @@ +import { logger } from "@stats-organization/github-readme-stats-core"; + import { deleteUser } from "../src/common/database.js"; -import { logger } from "../src/common/log.js"; /** * @param {any} req The request. diff --git a/apps/backend/api-renamed/downgrade.js b/apps/backend/api-renamed/downgrade.js index 519d3f9f..e52600d7 100644 --- a/apps/backend/api-renamed/downgrade.js +++ b/apps/backend/api-renamed/downgrade.js @@ -1,7 +1,7 @@ +import { logger } from "@stats-organization/github-readme-stats-core"; import axios from "axios"; import { deleteUser, getUserAccessByKey } from "../src/common/database.js"; -import { logger } from "../src/common/log.js"; export default async (req, res) => { // We could optimize this method by doing both database operations in one statement, using "DELETE ... RETURNING ..." diff --git a/apps/backend/api-renamed/gist.js b/apps/backend/api-renamed/gist.js deleted file mode 100644 index 26e973ee..00000000 --- a/apps/backend/api-renamed/gist.js +++ /dev/null @@ -1,129 +0,0 @@ -// @ts-check - -import { renderGistCard } from "../src/cards/gist.js"; -import { guardAccess } from "../src/common/access.js"; -import { - CACHE_TTL, - resolveCacheSeconds, - setCacheHeaders, - setErrorCacheHeaders, -} from "../src/common/cache.js"; -import { storeRequest } from "../src/common/database.js"; -import { - MissingParamError, - retrieveSecondaryMessage, -} from "../src/common/error.js"; -import { parseBoolean } from "../src/common/ops.js"; -import { renderError } from "../src/common/render.js"; -import { fetchGist } from "../src/fetchers/gist.js"; -import { isLocaleAvailable } from "../src/translations.js"; - -// @ts-ignore -export default async (req, res) => { - const { - id, - title_color, - icon_color, - text_color, - bg_color, - theme, - cache_seconds, - locale, - border_radius, - border_color, - show_owner, - hide_border, - } = req.query; - - res.setHeader("Content-Type", "image/svg+xml"); - - const access = guardAccess({ - res, - id, - type: "gist", - colors: { - title_color, - text_color, - bg_color, - border_color, - theme, - }, - }); - if (!access.isPassed) { - return access.result; - } - - if (locale && !isLocaleAvailable(locale)) { - return res.send( - renderError({ - message: "Something went wrong", - secondaryMessage: "Language not found", - renderOptions: { - title_color, - text_color, - bg_color, - border_color, - theme, - }, - }), - ); - } - - try { - await storeRequest(req); - const gistData = await fetchGist(id); - const cacheSeconds = resolveCacheSeconds({ - requested: parseInt(cache_seconds, 10), - def: CACHE_TTL.GIST_CARD.DEFAULT, - min: CACHE_TTL.GIST_CARD.MIN, - max: CACHE_TTL.GIST_CARD.MAX, - }); - - setCacheHeaders(res, cacheSeconds); - - return res.send( - renderGistCard(gistData, { - title_color, - icon_color, - text_color, - bg_color, - theme, - border_radius, - border_color, - locale: locale ? locale.toLowerCase() : null, - show_owner: parseBoolean(show_owner), - hide_border: parseBoolean(hide_border), - }), - ); - } catch (err) { - setErrorCacheHeaders(res); - if (err instanceof Error) { - return res.send( - renderError({ - message: err.message, - secondaryMessage: retrieveSecondaryMessage(err), - renderOptions: { - title_color, - text_color, - bg_color, - border_color, - theme, - show_repo_link: !(err instanceof MissingParamError), - }, - }), - ); - } - return res.send( - renderError({ - message: "An unknown error occurred", - renderOptions: { - title_color, - text_color, - bg_color, - border_color, - theme, - }, - }), - ); - } -}; diff --git a/apps/backend/api-renamed/status/pat-info.js b/apps/backend/api-renamed/status/pat-info.js index 998d7cbc..5725fc12 100644 --- a/apps/backend/api-renamed/status/pat-info.js +++ b/apps/backend/api-renamed/status/pat-info.js @@ -6,10 +6,12 @@ * * @description This function is currently rate limited to 1 request per 3 minutes. */ - -import { request } from "../../src/common/http.js"; -import { logger } from "../../src/common/log.js"; -import { dateDiff } from "../../src/common/ops.js"; +import { + dateDiff, + getConfig, + logger, + request, +} from "@stats-organization/github-readme-stats-core"; export const RATE_LIMIT_SECONDS = 60 * 3; // 1 request per 3 minutes @@ -39,7 +41,7 @@ const uptimeFetcher = (variables, token) => { }; const getAllPATs = () => { - return Object.keys(process.env).filter((key) => /PAT_\d*$/.exec(key)); + return getConfig().pats; }; /** @@ -61,7 +63,7 @@ const getPATInfo = async (fetcher, variables) => { for (const pat of PATs) { try { - const response = await fetcher(variables, process.env[pat]); + const response = await fetcher(variables, pat.value); const errors = response.data.errors; const hasErrors = Boolean(errors); const errorType = errors?.[0]?.type; @@ -71,7 +73,7 @@ const getPATInfo = async (fetcher, variables) => { // Store PATs with errors. if (hasErrors && errorType !== "RATE_LIMITED") { - details[pat] = { + details[pat.name] = { status: "error", error: { type: errors[0].type, @@ -82,13 +84,13 @@ const getPATInfo = async (fetcher, variables) => { } else if (isRateLimited) { const date1 = new Date(); const date2 = new Date(response.data?.data?.rateLimit?.resetAt); - details[pat] = { + details[pat.name] = { status: "exhausted", remaining: 0, resetIn: dateDiff(date2, date1) + " minutes", }; } else { - details[pat] = { + details[pat.name] = { status: "valid", remaining: response.data.data.rateLimit.remaining, }; @@ -97,11 +99,11 @@ const getPATInfo = async (fetcher, variables) => { // Store the PAT if it is expired. const errorMessage = err.response?.data?.message?.toLowerCase(); if (errorMessage === "bad credentials") { - details[pat] = { + details[pat.name] = { status: "expired", }; } else if (errorMessage === "sorry. your account was suspended.") { - details[pat] = { + details[pat.name] = { status: "suspended", }; } else { diff --git a/apps/backend/api-renamed/status/up.js b/apps/backend/api-renamed/status/up.js index 3afe5853..66162b67 100644 --- a/apps/backend/api-renamed/status/up.js +++ b/apps/backend/api-renamed/status/up.js @@ -7,9 +7,11 @@ * @description This function is currently rate limited to 1 request per 3 minutes. */ -import { request } from "../../src/common/http.js"; -import { logger } from "../../src/common/log.js"; -import { default as retryer } from "../../src/common/retryer.js"; +import { + logger, + request, + retryer, +} from "@stats-organization/github-readme-stats-core"; export const RATE_LIMIT_SECONDS = 60 * 3; // 1 request per 3 minutes @@ -87,7 +89,7 @@ export default async (req, res) => { try { let PATsValid = true; try { - await retryer(uptimeFetcher, null, {}); + await retryer(uptimeFetcher, {}); } catch (err) { // Resolve eslint no-unused-vars err; diff --git a/apps/backend/api-renamed/user-access.js b/apps/backend/api-renamed/user-access.js index 218ceac0..0e868216 100644 --- a/apps/backend/api-renamed/user-access.js +++ b/apps/backend/api-renamed/user-access.js @@ -1,5 +1,6 @@ +import { logger } from "@stats-organization/github-readme-stats-core"; + import { getUserAccessByKey } from "../src/common/database.js"; -import { logger } from "../src/common/log.js"; /** * @param {any} req The request. diff --git a/apps/backend/api-renamed/wakatime-proxy.js b/apps/backend/api-renamed/wakatime-proxy.js index 34dc4611..d370ed0e 100644 --- a/apps/backend/api-renamed/wakatime-proxy.js +++ b/apps/backend/api-renamed/wakatime-proxy.js @@ -1,5 +1,7 @@ -import { logger } from "../src/common/log.js"; -import { fetchWakatimeStats } from "../src/fetchers/wakatime.js"; +import { + fetchWakatimeStats, + logger, +} from "@stats-organization/github-readme-stats-core"; /** * @param {any} req The request. diff --git a/apps/backend/api-renamed/wakatime.js b/apps/backend/api-renamed/wakatime.js deleted file mode 100644 index dd1c3ead..00000000 --- a/apps/backend/api-renamed/wakatime.js +++ /dev/null @@ -1,148 +0,0 @@ -// @ts-check - -import { renderWakatimeCard } from "../src/cards/wakatime.js"; -import { guardAccess } from "../src/common/access.js"; -import { - CACHE_TTL, - resolveCacheSeconds, - setCacheHeaders, - setErrorCacheHeaders, -} from "../src/common/cache.js"; -import { storeRequest } from "../src/common/database.js"; -import { - MissingParamError, - retrieveSecondaryMessage, -} from "../src/common/error.js"; -import { parseArray, parseBoolean } from "../src/common/ops.js"; -import { renderError } from "../src/common/render.js"; -import { fetchWakatimeStats } from "../src/fetchers/wakatime.js"; -import { isLocaleAvailable } from "../src/translations.js"; - -// @ts-ignore -export default async (req, res) => { - const { - username, - title_color, - icon_color, - hide_border, - card_width, - line_height, - text_color, - bg_color, - theme, - cache_seconds, - hide_title, - hide_progress, - custom_title, - locale, - layout, - langs_count, - hide, - api_domain, - border_radius, - border_color, - display_format, - disable_animations, - } = req.query; - - res.setHeader("Content-Type", "image/svg+xml"); - - const access = guardAccess({ - res, - id: username, - type: "wakatime", - colors: { - title_color, - text_color, - bg_color, - border_color, - theme, - }, - }); - if (!access.isPassed) { - return access.result; - } - - if (locale && !isLocaleAvailable(locale)) { - return res.send( - renderError({ - message: "Something went wrong", - secondaryMessage: "Language not found", - renderOptions: { - title_color, - text_color, - bg_color, - border_color, - theme, - }, - }), - ); - } - - try { - await storeRequest(req); - const stats = await fetchWakatimeStats({ username, api_domain }); - const cacheSeconds = resolveCacheSeconds({ - requested: parseInt(cache_seconds, 10), - def: CACHE_TTL.WAKATIME_CARD.DEFAULT, - min: CACHE_TTL.WAKATIME_CARD.MIN, - max: CACHE_TTL.WAKATIME_CARD.MAX, - }); - - setCacheHeaders(res, cacheSeconds); - - return res.send( - renderWakatimeCard(stats, { - custom_title, - hide_title: parseBoolean(hide_title), - hide_border: parseBoolean(hide_border), - card_width: parseInt(card_width, 10), - hide: parseArray(hide), - line_height, - title_color, - icon_color, - text_color, - bg_color, - theme, - hide_progress, - border_radius, - border_color, - locale: locale ? locale.toLowerCase() : null, - layout, - langs_count, - display_format, - disable_animations: parseBoolean(disable_animations), - }), - ); - } catch (err) { - setErrorCacheHeaders(res); - if (err instanceof Error) { - return res.send( - renderError({ - message: err.message, - secondaryMessage: retrieveSecondaryMessage(err), - renderOptions: { - title_color, - text_color, - bg_color, - border_color, - theme, - show_repo_link: !(err instanceof MissingParamError), - }, - }), - ); - } - return res.send( - renderError({ - message: "An unknown error occurred", - renderOptions: { - title_color, - text_color, - bg_color, - border_color, - theme, - }, - }), - ); - } -}; diff --git a/apps/backend/express.js b/apps/backend/express.js index 35a24a36..099c7254 100644 --- a/apps/backend/express.js +++ b/apps/backend/express.js @@ -1,21 +1,10 @@ import express from "express"; -import gistCard from "./api-renamed/gist.js"; -import statsCard from "./api-renamed/index.js"; -import repoCard from "./api-renamed/pin.js"; -import langCard from "./api-renamed/top-langs.js"; -import wakatimeCard from "./api-renamed/wakatime.js"; +import router from "./router.js"; const app = express(); -const router = express.Router(); -router.get("/", statsCard); -router.get("/pin", repoCard); -router.get("/top-langs", langCard); -router.get("/wakatime", wakatimeCard); -router.get("/gist", gistCard); - -app.use("/api", router); +app.use(router); const port = process.env.PORT || process.env.port || 9000; app.listen(port, "0.0.0.0", () => { diff --git a/apps/backend/index.js b/apps/backend/index.js new file mode 100644 index 00000000..5dce81e4 --- /dev/null +++ b/apps/backend/index.js @@ -0,0 +1 @@ +export { default as router } from "./router.js"; diff --git a/apps/backend/package.json b/apps/backend/package.json index e6ef6ed0..8d5a8adf 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -1,52 +1,29 @@ { - "name": "github-readme-stats", - "version": "1.0.0", - "description": "Dynamically generate stats for your GitHub readme", - "keywords": [ - "github-readme-stats", - "readme-stats", - "cards", - "card-generator" - ], - "main": "src/index.js", + "name": "@stats-organization/github-readme-stats-backend", "type": "module", - "homepage": "https://github-stats-extended.vercel.app/frontend", - "bugs": { - "url": "https://github.com/stats-organization/github-stats-extended/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/stats-organization/github-stats-extended.git" + "license": "MIT", + "engines": { + "node": "24.x" }, + "private": true, + "main": "index.js", "scripts": { "test": "vitest", "test:update:snapshot": "vitest -u", "test:e2e": "vitest --config vitest.config.e2e.ts", - "theme-readme-gen": "node scripts/generate-theme-doc", - "generate-langs-json": "node scripts/generate-langs-json", - "bench": "vitest bench --run --config vitest.config.bench.ts" + "bench": "vitest bench --run --config vitest.config.bench.ts", + "lint": "eslint", + "typecheck": "tsc -p tsconfig.typecheck.json" }, - "author": "Anurag Hazra", - "license": "MIT", "devDependencies": { - "@testing-library/dom": "^10.4.1", - "@testing-library/jest-dom": "^6.9.1", - "@uppercod/css-to-object": "^1.1.1", - "@vitest/coverage-v8": "catalog:default", - "axios-mock-adapter": "^2.1.0", - "express": "^5.2.1", - "js-yaml": "^4.1.1", + "axios-mock-adapter": "2.1.0", + "express": "5.2.1", "jsdom": "28.1.0", "vitest": "catalog:default" }, "dependencies": { "axios": "^1.13.5", - "emoji-name-map": "^2.0.3", - "github-username-regex": "^1.0.0", - "pg": "^8.18.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": "24.x" + "@stats-organization/github-readme-stats-core": "workspace:^", + "pg": "^8.18.0" } } diff --git a/apps/backend/powered-by-vercel.svg b/apps/backend/powered-by-vercel.svg deleted file mode 100644 index 87782868..00000000 --- a/apps/backend/powered-by-vercel.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/backend/router.js b/apps/backend/router.js new file mode 100644 index 00000000..3da27ad5 --- /dev/null +++ b/apps/backend/router.js @@ -0,0 +1,225 @@ +import { + api, + gist, + pin, + topLangs, + wakatime, +} from "@stats-organization/github-readme-stats-core"; + +import { default as authenticate } from "./api-renamed/authenticate.js"; +import { default as deleteUser } from "./api-renamed/delete-user.js"; +import { default as downgrade } from "./api-renamed/downgrade.js"; +import { default as repeatRecent } from "./api-renamed/repeat-recent.js"; +import { default as patInfo } from "./api-renamed/status/pat-info.js"; +import { default as statusUp } from "./api-renamed/status/up.js"; +import { default as userAccess } from "./api-renamed/user-access.js"; +import { default as wakatimeProxy } from "./api-renamed/wakatime-proxy.js"; +import { guardAccess } from "./src/common/access.js"; +import { + CACHE_TTL, + resolveCacheSeconds, + setCacheHeaders, + setErrorCacheHeaders, +} from "./src/common/cache.js"; +import { getUserAccessByName, storeRequest } from "./src/common/database.js"; + +const getGuardResult = (query, type, id) => { + const access = guardAccess({ + id, + type, + colors: { + title_color: query.title_color, + text_color: query.text_color, + bg_color: query.bg_color, + border_color: query.border_color, + theme: query.theme, + }, + }); + + if (access.isPassed) { + return null; + } + + return { + status: "error - permanent", + content: access.result, + }; +}; + +const getUserPat = async (username) => { + if (!username) { + return null; + } + + const userAccess = await getUserAccessByName(username); + if (!userAccess?.token) { + return null; + } + + return userAccess.token; +}; + +export default async (req, res) => { + const url = new URL(req.url, "https://localhost"); + if (res.send === undefined) { + // remaining code expects express.js-like request and response objects + res.send = function (data) { + if (typeof data === "object") { + res.setHeader("Content-Type", "application/json"); + res.end(JSON.stringify(data)); + } else if (typeof data === "string") { + res.end(data); + } else { + res.end(String(data)); + } + }; + req.query = Object.fromEntries(url.searchParams.entries()); + } + + let result; + + switch (url.pathname) { + case "/api": { + result = getGuardResult(req.query, "username", req.query.username); + if (!result) { + const userPat = await getUserPat(req.query.username); + result = await api(req.query, userPat); + } + if (result.status === "error - temporary") { + setErrorCacheHeaders(res); + } else { + const cacheSeconds = resolveCacheSeconds({ + requested: parseInt(req.query.cache_seconds, 10), + def: CACHE_TTL.STATS_CARD.DEFAULT, + min: CACHE_TTL.STATS_CARD.MIN, + max: CACHE_TTL.STATS_CARD.MAX, + }); + setCacheHeaders(res, cacheSeconds); + } + res.setHeader("Content-Type", "image/svg+xml"); + res.end(result.content); + if (result.status !== "error - permanent") { + await storeRequest(req); + } + break; + } + case "/api/gist": + result = + getGuardResult(req.query, "gist", req.query.id) ?? + (await gist(req.query)); + if (result.status === "error - temporary") { + setErrorCacheHeaders(res); + } else { + const cacheSeconds = resolveCacheSeconds({ + requested: parseInt(req.query.cache_seconds, 10), + def: CACHE_TTL.GIST_CARD.DEFAULT, + min: CACHE_TTL.GIST_CARD.MIN, + max: CACHE_TTL.GIST_CARD.MAX, + }); + setCacheHeaders(res, cacheSeconds); + } + res.setHeader("Content-Type", "image/svg+xml"); + res.end(result.content); + if (result.status !== "error - permanent") { + await storeRequest(req); + } + break; + case "/api/pin": { + result = getGuardResult(req.query, "username", req.query.username); + if (!result) { + const userPat = await getUserPat(req.query.username); + result = await pin(req.query, userPat); + } + if (result.status === "error - temporary") { + setErrorCacheHeaders(res); + } else { + const cacheSeconds = resolveCacheSeconds({ + requested: parseInt(req.query.cache_seconds, 10), + def: CACHE_TTL.PIN_CARD.DEFAULT, + min: CACHE_TTL.PIN_CARD.MIN, + max: CACHE_TTL.PIN_CARD.MAX, + }); + setCacheHeaders(res, cacheSeconds); + } + res.setHeader("Content-Type", "image/svg+xml"); + res.end(result.content); + if (result.status !== "error - permanent") { + await storeRequest(req); + } + break; + } + case "/api/top-langs": { + result = getGuardResult(req.query, "username", req.query.username); + if (!result) { + const userPat = await getUserPat(req.query.username); + result = await topLangs(req.query, userPat); + } + if (result.status === "error - temporary") { + setErrorCacheHeaders(res); + } else { + const cacheSeconds = resolveCacheSeconds({ + requested: parseInt(req.query.cache_seconds, 10), + def: CACHE_TTL.TOP_LANGS_CARD.DEFAULT, + min: CACHE_TTL.TOP_LANGS_CARD.MIN, + max: CACHE_TTL.TOP_LANGS_CARD.MAX, + }); + setCacheHeaders(res, cacheSeconds); + } + res.setHeader("Content-Type", "image/svg+xml"); + res.end(result.content); + if (result.status !== "error - permanent") { + await storeRequest(req); + } + break; + } + case "/api/wakatime": + result = + getGuardResult(req.query, "wakatime", req.query.username) ?? + (await wakatime(req.query)); + if (result.status === "error - temporary") { + setErrorCacheHeaders(res); + } else { + const cacheSeconds = resolveCacheSeconds({ + requested: parseInt(req.query.cache_seconds, 10), + def: CACHE_TTL.WAKATIME_CARD.DEFAULT, + min: CACHE_TTL.WAKATIME_CARD.MIN, + max: CACHE_TTL.WAKATIME_CARD.MAX, + }); + setCacheHeaders(res, cacheSeconds); + } + res.setHeader("Content-Type", "image/svg+xml"); + res.end(result.content); + if (result.status !== "error - permanent") { + await storeRequest(req); + } + break; + case "/api/wakatime-proxy": + await wakatimeProxy(req, res); + break; + case "/api/repeat-recent": + await repeatRecent(req, res); + break; + case "/api/status/pat-info": + await patInfo(req, res); + break; + case "/api/status/up": + await statusUp(req, res); + break; + case "/api/authenticate": + await authenticate(req, res); + break; + case "/api/delete-user": + await deleteUser(req, res); + break; + case "/api/user-access": + await userAccess(req, res); + break; + case "/api/downgrade": + await downgrade(req, res); + break; + default: + res.statusCode = 404; + res.end("Not Found"); + break; + } +}; diff --git a/apps/backend/src/cards/index.js b/apps/backend/src/cards/index.js deleted file mode 100644 index 5ca3a97a..00000000 --- a/apps/backend/src/cards/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export { renderRepoCard } from "./repo.js"; -export { renderStatsCard } from "./stats.js"; -export { renderTopLanguages } from "./top-languages.js"; -export { renderWakatimeCard } from "./wakatime.js"; diff --git a/apps/backend/src/common/access.js b/apps/backend/src/common/access.js index 05a5dbe5..09cf5b30 100644 --- a/apps/backend/src/common/access.js +++ b/apps/backend/src/common/access.js @@ -1,8 +1,11 @@ // @ts-check +import { + getConfig, + renderError, +} from "@stats-organization/github-readme-stats-core"; + import { blacklist } from "./blacklist.js"; -import { gistWhitelist, whitelist } from "./envs.js"; -import { renderError } from "./render.js"; const NOT_WHITELISTED_USERNAME_MESSAGE = "This username is not whitelisted"; const NOT_WHITELISTED_GIST_MESSAGE = "This gist ID is not whitelisted"; @@ -12,36 +15,35 @@ const BLACKLISTED_MESSAGE = "This username is blacklisted"; * Guards access using whitelist/blacklist. * * @param {Object} args The parameters object. - * @param {any} args.res The response object. * @param {string} args.id Resource identifier (username or gist id). * @param {"username"|"gist"|"wakatime"} args.type The type of identifier. * @param {{ title_color?: string, text_color?: string, bg_color?: string, border_color?: string, theme?: string }} args.colors Color options for the error card. * @returns {{ isPassed: boolean, result?: any }} The result object indicating success or failure. */ -const guardAccess = ({ res, id, type, colors }) => { +const guardAccess = ({ id, type, colors }) => { if (!["username", "gist", "wakatime"].includes(type)) { throw new Error( 'Invalid type. Expected "username", "gist", or "wakatime".', ); } - const currentWhitelist = type === "gist" ? gistWhitelist : whitelist; + const config = getConfig(); + const currentWhitelist = + type === "gist" ? config.gistWhitelist : config.whitelist; const notWhitelistedMsg = type === "gist" ? NOT_WHITELISTED_GIST_MESSAGE : NOT_WHITELISTED_USERNAME_MESSAGE; if (Array.isArray(currentWhitelist) && !currentWhitelist.includes(id)) { - const result = res.send( - renderError({ - message: notWhitelistedMsg, - secondaryMessage: "Please deploy your own instance", - renderOptions: { - ...colors, - show_repo_link: false, - }, - }), - ); + const result = renderError({ + message: notWhitelistedMsg, + secondaryMessage: "Please deploy your own instance", + renderOptions: { + ...colors, + show_repo_link: false, + }, + }); return { isPassed: false, result }; } @@ -50,16 +52,14 @@ const guardAccess = ({ res, id, type, colors }) => { currentWhitelist === undefined && blacklist.includes(id) ) { - const result = res.send( - renderError({ - message: BLACKLISTED_MESSAGE, - secondaryMessage: "Please deploy your own instance", - renderOptions: { - ...colors, - show_repo_link: false, - }, - }), - ); + const result = renderError({ + message: BLACKLISTED_MESSAGE, + secondaryMessage: "Please deploy your own instance", + renderOptions: { + ...colors, + show_repo_link: false, + }, + }); return { isPassed: false, result }; } diff --git a/apps/backend/src/common/cache.js b/apps/backend/src/common/cache.js index 6fe2ea59..f71f300b 100644 --- a/apps/backend/src/common/cache.js +++ b/apps/backend/src/common/cache.js @@ -1,6 +1,6 @@ // @ts-check -import { clampValue } from "./ops.js"; +import { clampValue } from "@stats-organization/github-readme-stats-core"; const MIN = 60; const HOUR = 60 * MIN; @@ -106,7 +106,7 @@ const disableCaching = (res) => { * @param {number} cacheSeconds The cache seconds to set in the headers. */ const setCacheHeaders = (res, cacheSeconds) => { - if (cacheSeconds < 1 || process.env.NODE_ENV === "development") { + if (cacheSeconds < 1) { disableCaching(res); return; } @@ -128,10 +128,7 @@ const setErrorCacheHeaders = (res) => { const envCacheSeconds = process.env.CACHE_SECONDS ? parseInt(process.env.CACHE_SECONDS, 10) : NaN; - if ( - (!isNaN(envCacheSeconds) && envCacheSeconds < 1) || - process.env.NODE_ENV === "development" - ) { + if (!isNaN(envCacheSeconds) && envCacheSeconds < 1) { disableCaching(res); return; } diff --git a/apps/backend/src/common/database.js b/apps/backend/src/common/database.js index e76c3109..8bf2e83f 100644 --- a/apps/backend/src/common/database.js +++ b/apps/backend/src/common/database.js @@ -1,14 +1,10 @@ -/** - * In the browser this has to be mocked to avoid runtime errors - * @see apps/frontend/vite.config.ts - */ -import { Pool } from "pg"; - -export const pool = process.env.POSTGRES_URL - ? new Pool({ - connectionString: process.env.POSTGRES_URL, - }) - : null; +export let pool = null; +if (process.env.POSTGRES_URL) { + const { Pool } = await import("pg"); + pool = new Pool({ + connectionString: process.env.POSTGRES_URL, + }); +} /** * Creates all required tables if they do not exist. diff --git a/apps/backend/src/common/envs.js b/apps/backend/src/common/envs.js deleted file mode 100644 index 5f131966..00000000 --- a/apps/backend/src/common/envs.js +++ /dev/null @@ -1,15 +0,0 @@ -// @ts-check - -const whitelist = process.env.WHITELIST - ? process.env.WHITELIST.split(",") - : undefined; - -const gistWhitelist = process.env.GIST_WHITELIST - ? process.env.GIST_WHITELIST.split(",") - : undefined; - -const excludeRepositories = process.env.EXCLUDE_REPO - ? process.env.EXCLUDE_REPO.split(",") - : []; - -export { whitelist, gistWhitelist, excludeRepositories }; diff --git a/apps/backend/src/common/index.js b/apps/backend/src/common/index.js deleted file mode 100644 index db914b86..00000000 --- a/apps/backend/src/common/index.js +++ /dev/null @@ -1,13 +0,0 @@ -// @ts-check - -export { blacklist } from "./blacklist.js"; -export { Card } from "./Card.js"; -export { I18n } from "./I18n.js"; -export { icons } from "./icons.js"; -export { retryer } from "./retryer.js"; -export { - ERROR_CARD_LENGTH, - renderError, - flexLayout, - measureText, -} from "./render.js"; diff --git a/apps/backend/src/index.js b/apps/backend/src/index.js deleted file mode 100644 index ca8d586d..00000000 --- a/apps/backend/src/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./common/index.js"; -export * from "./cards/index.js"; diff --git a/apps/backend/src/users.js b/apps/backend/src/users.js index 12e87457..3f40c8f8 100644 --- a/apps/backend/src/users.js +++ b/apps/backend/src/users.js @@ -80,6 +80,7 @@ async function githubAuthenticate(code, privateAccess) { return { userId, accessToken, needDowngrade }; } catch (err) { if (err.response) { + // eslint-disable-next-line preserve-caught-error throw new Error(`OAuth Error: ${err.response.status}`); } throw err; diff --git a/apps/backend/tests/__snapshots__/wakatime.test.js.snap b/apps/backend/tests/__snapshots__/wakatime.test.js.snap deleted file mode 100644 index 34f060a5..00000000 --- a/apps/backend/tests/__snapshots__/wakatime.test.js.snap +++ /dev/null @@ -1,115 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Test /api/wakatime > should render error if user data is not accessible 1`] = ` -" - - - - - - - - - - - - - WakaTime Stats - - - - - - - - - WakaTime user profile not public - - - - - - " -`; diff --git a/apps/backend/tests/_setup.private-instance.js b/apps/backend/tests/_setup.private-instance.js deleted file mode 100644 index f4f094e5..00000000 --- a/apps/backend/tests/_setup.private-instance.js +++ /dev/null @@ -1,2 +0,0 @@ -process.env.GIST_WHITELIST = "bbfce31e0217a3689c8d961a356cb10d"; -process.env.WHITELIST = "anuraghazra"; diff --git a/apps/backend/tests/api.test.js b/apps/backend/tests/api.test.js index 7aeef4ca..e086abb5 100644 --- a/apps/backend/tests/api.test.js +++ b/apps/backend/tests/api.test.js @@ -1,345 +1,182 @@ // @ts-check -import axios from "axios"; -import MockAdapter from "axios-mock-adapter"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; -import api from "../api-renamed/index.js"; -import { calculateRank } from "../src/calculateRank.js"; -import { renderStatsCard } from "../src/cards/stats.js"; -import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; -import { renderError } from "../src/common/render.js"; +const mocks = vi.hoisted(() => ({ + api: vi.fn(), + storeRequest: vi.fn(), + getUserAccessByName: vi.fn(), + config: {}, +})); -import { data_stats, stats } from "./test-data/api-data.js"; - -stats.rank = calculateRank({ - all_commits: false, - commits: stats.totalCommits, - prs: stats.totalPRs, - reviews: stats.totalReviews, - issues: stats.totalIssues, - repos: 1, - stars: stats.totalStars, - followers: 0, +vi.mock("@stats-organization/github-readme-stats-core", async () => { + const { mockCore } = await import("./utils.js"); + return mockCore({ api: mocks.api, getConfig: () => mocks.config }); }); -const error = { - errors: [ - { - type: "NOT_FOUND", - path: ["user"], - locations: [], - message: "Could not fetch user", - }, - ], -}; +vi.mock("../src/common/database.js", () => ({ + storeRequest: mocks.storeRequest, + getUserAccessByName: mocks.getUserAccessByName, +})); -const mock = new MockAdapter(axios); +import router from "../router.js"; +import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; -// @ts-ignore -const faker = (query, data) => { - const req = { - query: { - username: "anuraghazra", - ...query, - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").replyOnce(200, data); +const createRequest = (search = "") => ({ + headers: {}, + url: `/api?${search}`, +}); - return { req, res }; -}; +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); + +const defaultCacheHeader = + `max-age=${CACHE_TTL.STATS_CARD.DEFAULT}, ` + + `s-maxage=${CACHE_TTL.STATS_CARD.DEFAULT}, ` + + `stale-while-revalidate=${DURATIONS.ONE_DAY}`; + +const errorCacheHeader = + `max-age=${CACHE_TTL.ERROR}, ` + + `s-maxage=${CACHE_TTL.ERROR}, ` + + `stale-while-revalidate=${DURATIONS.ONE_DAY}`; beforeEach(() => { - process.env.CACHE_SECONDS = undefined; + mocks.api.mockReset(); + mocks.storeRequest.mockReset().mockResolvedValue(undefined); + mocks.getUserAccessByName.mockReset().mockResolvedValue(null); + mocks.config = {}; + // CACHE_SECONDS is not set here, this is just to safeguard against CACHE_SECONDS being set externally + delete process.env.CACHE_SECONDS; }); -afterEach(() => { - mock.reset(); -}); +describe("Test /api backend routing", () => { + it("happy path should pass query params and user PAT, respond with stats content and persist request", async () => { + mocks.getUserAccessByName.mockResolvedValue({ token: "user-pat" }); + mocks.api.mockResolvedValue({ + status: "success", + content: "mock-stats-svg", + }); -describe("Test /api/", () => { - it("should test the request", async () => { - const { req, res } = faker({}, data_stats); - - await api(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderStatsCard(stats, { ...req.query }), + const req = createRequest( + "username=anuraghazra&theme=dark&hide=issues,prs,contribs", ); - }); + const res = createResponse(); - it("should render error card on error", async () => { - const { req, res } = faker({}, error); + await router(req, res); - await api(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: error.errors[0].message, - secondaryMessage: - "Make sure the provided username is not an organization", - }), - ); - }); - - it("should render error card in same theme as requested card", async () => { - const { req, res } = faker({ theme: "merko" }, error); - - await api(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: error.errors[0].message, - secondaryMessage: - "Make sure the provided username is not an organization", - renderOptions: { theme: "merko" }, - }), - ); - }); - - it("should get the query options", async () => { - const { req, res } = faker( + expect(mocks.getUserAccessByName).toHaveBeenCalledWith("anuraghazra"); + expect(mocks.api).toHaveBeenCalledWith( { username: "anuraghazra", + theme: "dark", hide: "issues,prs,contribs", - show_icons: true, - hide_border: true, - line_height: 100, - title_color: "fff", - icon_color: "fff", - text_color: "fff", - bg_color: "fff", }, - data_stats, + "user-pat", ); - - await api(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderStatsCard(stats, { - hide: ["issues", "prs", "contribs"], - show_icons: true, - hide_border: true, - line_height: 100, - title_color: "fff", - icon_color: "fff", - text_color: "fff", - bg_color: "fff", - }), - ); - }); - - it("should have proper cache", async () => { - const { req, res } = faker({}, data_stats); - - await api(req, res); - + expect(req.query).toEqual({ + username: "anuraghazra", + theme: "dark", + hide: "issues,prs,contribs", + }); expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", defaultCacheHeader], ["Content-Type", "image/svg+xml"], - [ - "Cache-Control", - `max-age=${CACHE_TTL.STATS_CARD.DEFAULT}, ` + - `s-maxage=${CACHE_TTL.STATS_CARD.DEFAULT}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, - ], ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith("mock-stats-svg"); + expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); }); - it("should set proper cache", async () => { - const cache_seconds = DURATIONS.TWELVE_HOURS; - const { req, res } = faker({ cache_seconds }, data_stats); - await api(req, res); + it("should use the shorter error cache for temporary stats errors", async () => { + mocks.api.mockResolvedValue({ + status: "error - temporary", + content: "temporary-error-svg", + }); - expect(res.setHeader.mock.calls).toEqual([ - ["Content-Type", "image/svg+xml"], - [ - "Cache-Control", - `max-age=${cache_seconds}, ` + - `s-maxage=${cache_seconds}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, - ], - ]); - }); + const req = createRequest("username=anuraghazra"); + const res = createResponse(); - it("should set shorter cache when error", async () => { - const { req, res } = faker({}, error); - await api(req, res); + await router(req, res); - expect(res.setHeader.mock.calls).toEqual([ - ["Content-Type", "image/svg+xml"], - [ - "Cache-Control", - `max-age=${CACHE_TTL.ERROR}, ` + - `s-maxage=${CACHE_TTL.ERROR}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, - ], - ]); - }); - - it("should properly set cache using CACHE_SECONDS env variable", async () => { - const cacheSeconds = "10000"; - process.env.CACHE_SECONDS = cacheSeconds; - - const { req, res } = faker({}, data_stats); - await api(req, res); - - expect(res.setHeader.mock.calls).toEqual([ - ["Content-Type", "image/svg+xml"], - [ - "Cache-Control", - `max-age=${cacheSeconds}, ` + - `s-maxage=${cacheSeconds}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, - ], - ]); - }); - - it("should disable cache when CACHE_SECONDS is set to 0", async () => { - process.env.CACHE_SECONDS = "0"; - - const { req, res } = faker({}, data_stats); - await api(req, res); - - expect(res.setHeader.mock.calls).toEqual([ - ["Content-Type", "image/svg+xml"], - [ - "Cache-Control", - "no-cache, no-store, must-revalidate, max-age=0, s-maxage=0", - ], - ["Pragma", "no-cache"], - ["Expires", "0"], - ]); - }); - - it("should set proper cache with clamped values", async () => { - { - let { req, res } = faker({ cache_seconds: 200_000 }, data_stats); - await api(req, res); - - expect(res.setHeader.mock.calls).toEqual([ - ["Content-Type", "image/svg+xml"], - [ - "Cache-Control", - `max-age=${CACHE_TTL.STATS_CARD.MAX}, ` + - `s-maxage=${CACHE_TTL.STATS_CARD.MAX}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, - ], - ]); - } - - // note i'm using block scoped vars - { - let { req, res } = faker({ cache_seconds: 0 }, data_stats); - await api(req, res); - - expect(res.setHeader.mock.calls).toEqual([ - ["Content-Type", "image/svg+xml"], - [ - "Cache-Control", - `max-age=${CACHE_TTL.STATS_CARD.MIN}, ` + - `s-maxage=${CACHE_TTL.STATS_CARD.MIN}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, - ], - ]); - } - - { - let { req, res } = faker({ cache_seconds: -10_000 }, data_stats); - await api(req, res); - - expect(res.setHeader.mock.calls).toEqual([ - ["Content-Type", "image/svg+xml"], - [ - "Cache-Control", - `max-age=${CACHE_TTL.STATS_CARD.MIN}, ` + - `s-maxage=${CACHE_TTL.STATS_CARD.MIN}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, - ], - ]); - } - }); - - it("should allow changing ring_color", async () => { - const { req, res } = faker( + expect(mocks.getUserAccessByName).toHaveBeenCalledWith("anuraghazra"); + expect(mocks.api).toHaveBeenCalledWith( { username: "anuraghazra", - hide: "issues,prs,contribs", - show_icons: true, - hide_border: true, - line_height: 100, - title_color: "fff", - ring_color: "0000ff", - icon_color: "fff", - text_color: "fff", - bg_color: "fff", }, - data_stats, - ); - - await api(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderStatsCard(stats, { - hide: ["issues", "prs", "contribs"], - show_icons: true, - hide_border: true, - line_height: 100, - title_color: "fff", - ring_color: "0000ff", - icon_color: "fff", - text_color: "fff", - bg_color: "fff", - }), + null, ); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", errorCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith("temporary-error-svg"); + expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); }); - it("should render error card when wrong locale is provided", async () => { - const { req, res } = faker({ locale: "asdf" }, data_stats); + it("should not persist permanent stats errors returned by core", async () => { + mocks.api.mockResolvedValue({ + status: "error - permanent", + content: "permanent-error-svg", + }); - await api(req, res); + const req = createRequest("username=anuraghazra"); + const res = createResponse(); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "Something went wrong", - secondaryMessage: "Language not found", - }), + await router(req, res); + + expect(mocks.getUserAccessByName).toHaveBeenCalledWith("anuraghazra"); + expect(mocks.api).toHaveBeenCalledWith( + { + username: "anuraghazra", + }, + null, ); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", defaultCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith("permanent-error-svg"); + expect(mocks.storeRequest).not.toHaveBeenCalled(); }); - it("should render error card when include_all_commits true and upstream API fails", async () => { - mock - .onGet( - "https://api.github.com/search/commits?per_page=1&q=author:anuraghazra", - ) - .reply(200, { error: "Some test error message" }); + it("should reject blacklisted usernames before calling core logic", async () => { + const req = createRequest("username=renovate-bot"); + const res = createResponse(); - const { req, res } = faker( - { username: "anuraghazra", include_all_commits: true }, - data_stats, - ); + await router(req, res); - await api(req, res); + expect(mocks.api).not.toHaveBeenCalled(); + expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", defaultCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith( + "render-error:This username is blacklisted", + ); + expect(mocks.storeRequest).not.toHaveBeenCalled(); + }); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "Could not fetch data from GitHub REST API.", - secondaryMessage: "Please try again later", - }), - ); - // Received SVG output should not contain string "https://tiny.one/readme-stats" - expect(res.send.mock.calls[0][0]).not.toContain( - "https://tiny.one/readme-stats", + it("should reject non-whitelisted usernames before calling core logic", async () => { + mocks.config = { + whitelist: ["allowed-user"], + }; + + const req = createRequest("username=blocked-user"); + const res = createResponse(); + + await router(req, res); + + expect(mocks.api).not.toHaveBeenCalled(); + expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", defaultCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith( + "render-error:This username is not whitelisted", ); + expect(mocks.storeRequest).not.toHaveBeenCalled(); }); }); diff --git a/apps/backend/tests/bench/api.bench.js b/apps/backend/tests/bench/api.bench.js index a7326840..6b4a47ae 100644 --- a/apps/backend/tests/bench/api.bench.js +++ b/apps/backend/tests/bench/api.bench.js @@ -1,81 +1,40 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { bench, describe, vi } from "vitest"; +import { beforeAll, bench, describe, vi } from "vitest"; -import api from "../../api-renamed/index.js"; - -const stats = { - name: "Anurag Hazra", - totalStars: 100, - totalCommits: 200, - totalIssues: 300, - totalPRs: 400, - totalPRsMerged: 320, - mergedPRsPercentage: 80, - totalReviews: 50, - totalDiscussionsStarted: 10, - totalDiscussionsAnswered: 40, - contributedTo: 50, - rank: null, -}; - -const data_stats = { - data: { - user: { - name: stats.name, - repositoriesContributedTo: { totalCount: stats.contributedTo }, - commits: { - totalCommitContributions: stats.totalCommits, - }, - reviews: { - totalPullRequestReviewContributions: stats.totalReviews, - }, - pullRequests: { totalCount: stats.totalPRs }, - mergedPullRequests: { totalCount: stats.totalPRsMerged }, - openIssues: { totalCount: stats.totalIssues }, - closedIssues: { totalCount: 0 }, - followers: { totalCount: 0 }, - repositoryDiscussions: { totalCount: stats.totalDiscussionsStarted }, - repositoryDiscussionComments: { - totalCount: stats.totalDiscussionsAnswered, - }, - repositories: { - totalCount: 1, - nodes: [{ stargazers: { totalCount: 100 } }], - pageInfo: { - hasNextPage: false, - endCursor: "cursor", - }, - }, - }, - }, -}; +import { data_stats } from "../utils.js"; const mock = new MockAdapter(axios); -const faker = (query, data) => { - const req = { - query: { - username: "anuraghazra", - ...query, - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").replyOnce(200, data); +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); - return { req, res }; -}; +let router; -describe("/api", () => { +beforeAll(async () => { + vi.stubEnv("CACHE_SECONDS", ""); + vi.stubEnv("GIST_WHITELIST", ""); + vi.stubEnv("POSTGRES_URL", ""); + vi.stubEnv("WHITELIST", ""); + + ({ default: router } = await import("../../router.js")); + + mock.onPost("https://api.github.com/graphql").reply(200, data_stats); +}); + +describe("bench /api", () => { bench( "base", async () => { - const { req, res } = faker({}, data_stats); + const req = { + headers: {}, + url: "/api?username=anuraghazra", + }; + const res = createResponse(); - await api(req, res); + await router(req, res); }, { warmupIterations: 50 }, ); diff --git a/apps/backend/tests/bench/calculateRank.bench.js b/apps/backend/tests/bench/calculateRank.bench.js deleted file mode 100644 index a9e52d09..00000000 --- a/apps/backend/tests/bench/calculateRank.bench.js +++ /dev/null @@ -1,22 +0,0 @@ -import { bench, describe } from "vitest"; - -import { calculateRank } from "../../src/calculateRank.js"; - -describe("calculateRank", () => { - bench( - "base", - async () => { - calculateRank({ - all_commits: false, - commits: 1300, - prs: 1500, - issues: 4500, - reviews: 1000, - repos: 0, - stars: 600000, - followers: 50000, - }); - }, - { warmupIterations: 50 }, - ); -}); diff --git a/apps/backend/tests/bench/gist.bench.js b/apps/backend/tests/bench/gist.bench.js index 9b15c47c..997a28f9 100644 --- a/apps/backend/tests/bench/gist.bench.js +++ b/apps/backend/tests/bench/gist.bench.js @@ -1,54 +1,42 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { bench, describe, vi } from "vitest"; +import { beforeAll, bench, describe, vi } from "vitest"; -import gist from "../../api-renamed/gist.js"; - -const gist_data = { - data: { - viewer: { - gist: { - description: - "List of countries and territories in English and Spanish: name, continent, capital, dial code, country codes, TLD, and area in sq km. Lista de países y territorios en Inglés y Español: nombre, continente, capital, código de teléfono, códigos de país, dominio y área en km cuadrados. Updated 2023", - owner: { - login: "Yizack", - }, - stargazerCount: 33, - forks: { - totalCount: 11, - }, - files: [ - { - name: "countries.json", - language: { - name: "JSON", - }, - size: 85858, - }, - ], - }, - }, - }, -}; +import { happy_path_gist_data } from "../utils.js"; const mock = new MockAdapter(axios); -mock.onPost("https://api.github.com/graphql").reply(200, gist_data); -describe("test /api/gist", () => { +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); + +let router; + +beforeAll(async () => { + vi.stubEnv("CACHE_SECONDS", ""); + vi.stubEnv("GIST_WHITELIST", ""); + vi.stubEnv("POSTGRES_URL", ""); + vi.stubEnv("WHITELIST", ""); + + ({ default: router } = await import("../../router.js")); + + mock + .onPost("https://api.github.com/graphql") + .reply(200, happy_path_gist_data); +}); + +describe("bench /api/gist", () => { bench( "base", async () => { const req = { - query: { - id: "bbfce31e0217a3689c8d961a356cb10d", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), + headers: {}, + url: "/api/gist?id=happy-gist-id", }; + const res = createResponse(); - await gist(req, res); + await router(req, res); }, { warmupIterations: 50 }, ); diff --git a/apps/backend/tests/bench/pin.bench.js b/apps/backend/tests/bench/pin.bench.js index 790c3a1b..f57acdda 100644 --- a/apps/backend/tests/bench/pin.bench.js +++ b/apps/backend/tests/bench/pin.bench.js @@ -1,53 +1,40 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { bench, describe, vi } from "vitest"; +import { beforeAll, bench, describe, vi } from "vitest"; -import pin from "../../api-renamed/pin.js"; - -const data_repo = { - repository: { - username: "anuraghazra", - name: "convoychat", - stargazers: { - totalCount: 38000, - }, - description: "Help us take over the world! React + TS + GraphQL Chat App", - primaryLanguage: { - color: "#2b7489", - id: "MDg6TGFuZ3VhZ2UyODc=", - name: "TypeScript", - }, - forkCount: 100, - isTemplate: false, - }, -}; - -const data_user = { - data: { - user: { repository: data_repo.repository }, - organization: null, - }, -}; +import { data_user } from "../utils.js"; const mock = new MockAdapter(axios); -mock.onPost("https://api.github.com/graphql").reply(200, data_user); -describe("/api/pin", () => { +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); + +let router; + +beforeAll(async () => { + vi.stubEnv("CACHE_SECONDS", ""); + vi.stubEnv("GIST_WHITELIST", ""); + vi.stubEnv("POSTGRES_URL", ""); + vi.stubEnv("WHITELIST", ""); + + ({ default: router } = await import("../../router.js")); + + mock.onPost("https://api.github.com/graphql").reply(200, data_user); +}); + +describe("bench /api/pin", () => { bench( "base", async () => { const req = { - query: { - username: "anuraghazra", - repo: "convoychat", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), + headers: {}, + url: "/api/pin?username=anuraghazra&repo=convoychat", }; + const res = createResponse(); - await pin(req, res); + await router(req, res); }, { warmupIterations: 50 }, ); diff --git a/apps/backend/tests/e2e/e2e.test.js b/apps/backend/tests/e2e/e2e.test.js index a923922a..3b13143f 100644 --- a/apps/backend/tests/e2e/e2e.test.js +++ b/apps/backend/tests/e2e/e2e.test.js @@ -3,221 +3,343 @@ */ import axios from "axios"; -import { beforeAll, describe, expect, test } from "vitest"; - -import { renderGistCard } from "../../src/cards/gist.js"; -import { renderRepoCard } from "../../src/cards/repo.js"; -import { renderStatsCard } from "../../src/cards/stats.js"; -import { renderTopLanguages } from "../../src/cards/top-languages.js"; -import { renderWakatimeCard } from "../../src/cards/wakatime.js"; +import MockAdapter from "axios-mock-adapter"; +import { afterAll, beforeAll, describe, expect, test, vi } from "vitest"; const REPO = "curly-fiesta"; const USER = "catelinemnemosyne"; const STATS_CARD_USER = "e2eninja"; const GIST_ID = "372cef55fd897b31909fdeb3a7262758"; -const STATS_DATA = { - name: "CodeNinja", - totalPRs: 1, - totalReviews: 0, - totalCommits: 3, - totalIssues: 1, - totalStars: 1, - contributedTo: 0, - rank: { - level: "C", - percentile: 98.73972605284538, +const STATS_MOCK_RESPONSE = { + data: { + user: { + name: "CodeNinja", + login: STATS_CARD_USER, + repositoriesContributedTo: { totalCount: 0 }, + commits: { + totalCommitContributions: 3, + }, + reviews: { + totalPullRequestReviewContributions: 0, + }, + pullRequests: { totalCount: 1 }, + openIssues: { totalCount: 1 }, + closedIssues: { totalCount: 0 }, + followers: { totalCount: 0 }, + repositories: { + totalCount: 1, + nodes: [{ name: REPO, stargazers: { totalCount: 1 } }], + pageInfo: { + hasNextPage: false, + endCursor: "cursor", + }, + }, + }, }, }; -const LANGS_DATA = { - HTML: { - color: "#e34c26", - name: "HTML", - size: 1721, - }, - CSS: { - color: "#663399", - name: "CSS", - size: 930, - }, - JavaScript: { - color: "#f1e05a", - name: "JavaScript", - size: 1912, +const COMMITS_SEARCH_MOCK_RESPONSE = { + total_count: 3, +}; + +const TOP_LANGS_MOCK_RESPONSE = { + data: { + user: { + repositories: { + nodes: [ + { + name: REPO, + languages: { + edges: [ + { + size: 1721, + node: { + color: "#e34c26", + name: "HTML", + }, + }, + { + size: 930, + node: { + color: "#663399", + name: "CSS", + }, + }, + { + size: 1912, + node: { + color: "#f1e05a", + name: "JavaScript", + }, + }, + ], + }, + }, + ], + }, + }, }, }; -const WAKATIME_DATA = { - human_readable_range: "last week", - is_already_updating: false, - is_coding_activity_visible: true, - is_including_today: false, - is_other_usage_visible: false, - is_stuck: false, - is_up_to_date: false, - is_up_to_date_pending_future: false, - percent_calculated: 0, - range: "all_time", - status: "pending_update", - timeout: 15, - username: USER, - writes_only: false, +const WAKATIME_MOCK_RESPONSE = { + data: { + human_readable_range: "last week", + is_already_updating: false, + is_coding_activity_visible: true, + is_including_today: false, + is_other_usage_visible: false, + is_stuck: false, + is_up_to_date: false, + is_up_to_date_pending_future: false, + percent_calculated: 0, + range: "all_time", + status: "pending_update", + timeout: 15, + username: USER, + writes_only: false, + }, }; -const REPOSITORY_DATA = { - name: REPO, - nameWithOwner: `${USER}/cra-test`, - isPrivate: false, - isArchived: false, - isTemplate: false, - stargazers: { - totalCount: 1, +const REPO_MOCK_RESPONSE = { + data: { + user: { + repository: { + name: REPO, + nameWithOwner: `${USER}/cra-test`, + isPrivate: false, + isArchived: false, + isTemplate: false, + stargazers: { + totalCount: 1, + }, + description: "Simple cra test repo.", + primaryLanguage: { + color: "#f1e05a", + id: "MDg6TGFuZ3VhZ2UxNDA=", + name: "JavaScript", + }, + forkCount: 0, + }, + }, + organization: null, }, - description: "Simple cra test repo.", - primaryLanguage: { - color: "#f1e05a", - id: "MDg6TGFuZ3VhZ2UxNDA=", - name: "JavaScript", - }, - forkCount: 0, - starCount: 1, }; -/** - * @typedef {import("../../src/fetchers/types").GistData} GistData Gist data type. - */ - -/** - * @type {GistData} - */ -const GIST_DATA = { - name: "link.txt", - nameWithOwner: "qwerty541/link.txt", - description: - "Trying to access this path on Windows 10 ver. 1803+ will breaks NTFS", - language: "Text", - starsCount: 1, - forksCount: 0, +const GIST_MOCK_RESPONSE = { + data: { + viewer: { + gist: { + description: + "Trying to access this path on Windows 10 ver. 1803+ will breaks NTFS", + owner: { + login: "qwerty541", + }, + stargazerCount: 1, + forks: { + totalCount: 0, + }, + files: [ + { + name: "link.txt", + language: { + name: "Text", + }, + size: 1, + }, + ], + }, + }, + }, }; const CACHE_BURST_STRING = `v=${new Date().getTime()}`; -describe("Fetch Cards", () => { - let VERCEL_PREVIEW_URL = "https://github-stats-extended.vercel.app"; +const mock = new MockAdapter(axios, { onNoMatch: "passthrough" }); - beforeAll(() => { - process.env.NODE_ENV = "development"; +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); + +let router; + +/** + * Renders a card locally through the backend router. + * @param {string} url Card URL to render through the router. + * @returns {Promise} Rendered SVG markup. + */ +async function getLocalSvg(url) { + const req = { + headers: {}, + url, + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + return res.end.mock.calls[0][0]; +} + +beforeAll(async () => { + vi.stubEnv("CACHE_SECONDS", ""); + vi.stubEnv("GIST_WHITELIST", ""); + vi.stubEnv("POSTGRES_URL", ""); + vi.stubEnv("WHITELIST", ""); + + vi.stubEnv("PAT_1", "dummyPAT1"); + vi.stubEnv("PAT_2", "dummyPAT2"); + + ({ default: router } = await import("../../router.js")); + + mock.onPost("https://api.github.com/graphql").reply((config) => { + const { query, variables } = JSON.parse(config.data); + + if ( + query.includes("query userInfo") && + variables?.login === STATS_CARD_USER + ) { + return [200, STATS_MOCK_RESPONSE]; + } + + if (query.includes("query userInfo") && variables?.login === USER) { + return [200, TOP_LANGS_MOCK_RESPONSE]; + } + + if (query.includes("query getRepo")) { + return [200, REPO_MOCK_RESPONSE]; + } + + if (query.includes("query gistInfo")) { + return [200, GIST_MOCK_RESPONSE]; + } + + return [500, { error: "Unhandled GraphQL request in e2e test" }]; }); + mock + .onGet( + `https://api.github.com/search/commits?per_page=1&q=author:${STATS_CARD_USER}`, + ) + .reply(200, COMMITS_SEARCH_MOCK_RESPONSE); + + mock + .onGet( + `https://wakatime.com/api/v1/users/${USER}/stats?is_including_today=true`, + ) + .reply(200, WAKATIME_MOCK_RESPONSE); +}); + +afterAll(() => { + mock.restore(); + vi.unstubAllEnvs(); +}); + +describe("Fetch Cards", () => { + const VERCEL_PREVIEW_URL = "https://github-stats-extended-preview.vercel.app"; + test("retrieve stats card", async () => { expect(VERCEL_PREVIEW_URL).toBeDefined(); + const cardPath = `/api?username=${STATS_CARD_USER}&include_all_commits=true&${CACHE_BURST_STRING}`; + // Check if the Vercel preview instance stats card function is up and running. await expect( - axios.get(`${VERCEL_PREVIEW_URL}/api?username=${STATS_CARD_USER}`), + axios.get(`${VERCEL_PREVIEW_URL}${cardPath}`), ).resolves.not.toThrow(); // Get local stats card. - const localStatsCardSVG = renderStatsCard(STATS_DATA, { - include_all_commits: true, - }); + const localStatsCardSVG = await getLocalSvg(cardPath); // Get the Vercel preview stats card response. - const serverStatsSvg = await axios.get( - `${VERCEL_PREVIEW_URL}/api?username=${STATS_CARD_USER}&include_all_commits=true&${CACHE_BURST_STRING}`, - ); + const serverStatsSvg = await axios.get(`${VERCEL_PREVIEW_URL}${cardPath}`); // Check if stats card from deployment matches the stats card from local. expect(serverStatsSvg.data).toEqual(localStatsCardSVG); - }, 15000); + }, 20000); test("retrieve language card", async () => { expect(VERCEL_PREVIEW_URL).toBeDefined(); + const cardPath = `/api/top-langs?username=${USER}&${CACHE_BURST_STRING}`; + // Check if the Vercel preview instance language card function is up and running. - console.log( - `${VERCEL_PREVIEW_URL}/api/top-langs/?username=${USER}&${CACHE_BURST_STRING}`, - ); await expect( - axios.get( - `${VERCEL_PREVIEW_URL}/api/top-langs/?username=${USER}&${CACHE_BURST_STRING}`, - ), + axios.get(`${VERCEL_PREVIEW_URL}${cardPath}`), ).resolves.not.toThrow(); // Get local language card. - const localLanguageCardSVG = renderTopLanguages(LANGS_DATA); + const localLanguageCardSVG = await getLocalSvg(cardPath); // Get the Vercel preview language card response. - const severLanguageSVG = await axios.get( - `${VERCEL_PREVIEW_URL}/api/top-langs/?username=${USER}&${CACHE_BURST_STRING}`, + const serverLanguageSVG = await axios.get( + `${VERCEL_PREVIEW_URL}${cardPath}`, ); // Check if language card from deployment matches the local language card. - expect(severLanguageSVG.data).toEqual(localLanguageCardSVG); - }, 15000); + expect(serverLanguageSVG.data).toEqual(localLanguageCardSVG); + }, 20000); test("retrieve WakaTime card", async () => { expect(VERCEL_PREVIEW_URL).toBeDefined(); + const cardPath = `/api/wakatime?username=${USER}&${CACHE_BURST_STRING}`; + // Check if the Vercel preview instance WakaTime function is up and running. await expect( - axios.get(`${VERCEL_PREVIEW_URL}/api/wakatime?username=${USER}`), + axios.get(`${VERCEL_PREVIEW_URL}${cardPath}`), ).resolves.not.toThrow(); // Get local WakaTime card. - const localWakaCardSVG = renderWakatimeCard(WAKATIME_DATA); + const localWakaCardSVG = await getLocalSvg(cardPath); // Get the Vercel preview WakaTime card response. const serverWakaTimeSvg = await axios.get( - `${VERCEL_PREVIEW_URL}/api/wakatime?username=${USER}&${CACHE_BURST_STRING}`, + `${VERCEL_PREVIEW_URL}${cardPath}`, ); // Check if WakaTime card from deployment matches the local WakaTime card. expect(serverWakaTimeSvg.data).toEqual(localWakaCardSVG); - }, 15000); + }, 20000); test("retrieve repo card", async () => { expect(VERCEL_PREVIEW_URL).toBeDefined(); + const cardPath = `/api/pin?username=${USER}&repo=${REPO}&${CACHE_BURST_STRING}`; + // Check if the Vercel preview instance Repo function is up and running. await expect( - axios.get( - `${VERCEL_PREVIEW_URL}/api/pin/?username=${USER}&repo=${REPO}&${CACHE_BURST_STRING}`, - ), + axios.get(`${VERCEL_PREVIEW_URL}${cardPath}`), ).resolves.not.toThrow(); // Get local repo card. - const localRepoCardSVG = renderRepoCard(REPOSITORY_DATA); + const localRepoCardSVG = await getLocalSvg(cardPath); // Get the Vercel preview repo card response. - const serverRepoSvg = await axios.get( - `${VERCEL_PREVIEW_URL}/api/pin/?username=${USER}&repo=${REPO}&${CACHE_BURST_STRING}`, - ); + const serverRepoSvg = await axios.get(`${VERCEL_PREVIEW_URL}${cardPath}`); // Check if Repo card from deployment matches the local Repo card. expect(serverRepoSvg.data).toEqual(localRepoCardSVG); - }, 15000); + }, 20000); test("retrieve gist card", async () => { expect(VERCEL_PREVIEW_URL).toBeDefined(); + const cardPath = `/api/gist?id=${GIST_ID}&${CACHE_BURST_STRING}`; + // Check if the Vercel preview instance Gist function is up and running. await expect( - axios.get( - `${VERCEL_PREVIEW_URL}/api/gist?id=${GIST_ID}&${CACHE_BURST_STRING}`, - ), + axios.get(`${VERCEL_PREVIEW_URL}${cardPath}`), ).resolves.not.toThrow(); // Get local gist card. - const localGistCardSVG = renderGistCard(GIST_DATA); + const localGistCardSVG = await getLocalSvg(cardPath); // Get the Vercel preview gist card response. - const serverGistSvg = await axios.get( - `${VERCEL_PREVIEW_URL}/api/gist?id=${GIST_ID}&${CACHE_BURST_STRING}`, - ); + const serverGistSvg = await axios.get(`${VERCEL_PREVIEW_URL}${cardPath}`); // Check if Gist card from deployment matches the local Gist card. expect(serverGistSvg.data).toEqual(localGistCardSVG); - }, 15000); + }, 20000); }); diff --git a/apps/backend/tests/gist.test.js b/apps/backend/tests/gist.test.js index 2cb6d4c3..8ee56379 100644 --- a/apps/backend/tests/gist.test.js +++ b/apps/backend/tests/gist.test.js @@ -1,161 +1,150 @@ // @ts-check -import axios from "axios"; -import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; -import gist from "../api-renamed/gist.js"; -import { renderGistCard } from "../src/cards/gist.js"; +const mocks = vi.hoisted(() => ({ + gist: vi.fn(), + storeRequest: vi.fn(), + getUserAccessByName: vi.fn(), + config: {}, +})); + +vi.mock("@stats-organization/github-readme-stats-core", async () => { + const { mockCore } = await import("./utils.js"); + return mockCore({ gist: mocks.gist, getConfig: () => mocks.config }); +}); + +vi.mock("../src/common/database.js", () => ({ + storeRequest: mocks.storeRequest, + getUserAccessByName: mocks.getUserAccessByName, +})); + +import router from "../router.js"; import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; -import { renderError } from "../src/common/render.js"; -import { gist_data } from "./test-data/gist-data.js"; - -import "@testing-library/jest-dom/vitest"; - -const gist_not_found_data = { - data: { - viewer: { - gist: null, - }, - }, -}; - -const mock = new MockAdapter(axios); - -afterEach(() => { - mock.reset(); +const createRequest = (search) => ({ + headers: {}, + url: `/api/gist?${search}`, }); -describe("Test /api/gist", () => { - it("should test the request", async () => { - const req = { - query: { - id: "bbfce31e0217a3689c8d961a356cb10d", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, gist_data); +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); - await gist(req, res); +const defaultCacheHeader = + `max-age=${CACHE_TTL.GIST_CARD.DEFAULT}, ` + + `s-maxage=${CACHE_TTL.GIST_CARD.DEFAULT}, ` + + `stale-while-revalidate=${DURATIONS.ONE_DAY}`; - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderGistCard({ - name: gist_data.data.viewer.gist.files[0].name, - nameWithOwner: `${gist_data.data.viewer.gist.owner.login}/${gist_data.data.viewer.gist.files[0].name}`, - description: gist_data.data.viewer.gist.description, - language: gist_data.data.viewer.gist.files[0].language.name, - starsCount: gist_data.data.viewer.gist.stargazerCount, - forksCount: gist_data.data.viewer.gist.forks.totalCount, - }), - ); +const errorCacheHeader = + `max-age=${CACHE_TTL.ERROR}, ` + + `s-maxage=${CACHE_TTL.ERROR}, ` + + `stale-while-revalidate=${DURATIONS.ONE_DAY}`; + +beforeEach(() => { + mocks.gist.mockReset(); + mocks.storeRequest.mockReset().mockResolvedValue(undefined); + mocks.getUserAccessByName.mockReset().mockResolvedValue(null); + mocks.config = {}; + // CACHE_SECONDS is not set here, this is just to safeguard against CACHE_SECONDS being set externally + delete process.env.CACHE_SECONDS; +}); + +describe("Test /api/gist backend routing", () => { + it("happy path should pass query params, respond with gist content and persist request", async () => { + mocks.gist.mockResolvedValue({ + status: "success", + content: "mock-gist-svg", + }); + + const req = createRequest("id=bbfce31e0217a3689c8d961a356cb10d&theme=dark"); + const res = createResponse(); + + await router(req, res); + + expect(mocks.gist).toHaveBeenCalledWith({ + id: "bbfce31e0217a3689c8d961a356cb10d", + theme: "dark", + }); + expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(req.query).toEqual({ + id: "bbfce31e0217a3689c8d961a356cb10d", + theme: "dark", + }); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", defaultCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith("mock-gist-svg"); + expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); }); - it("should get the query options", async () => { - const req = { - query: { - id: "bbfce31e0217a3689c8d961a356cb10d", - title_color: "fff", - icon_color: "fff", - text_color: "fff", - bg_color: "fff", - show_owner: true, - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, gist_data); + it("should use the shorter error cache for temporary gist errors", async () => { + mocks.gist.mockResolvedValue({ + status: "error - temporary", + content: "temporary-error-svg", + }); - await gist(req, res); + const req = createRequest("id=bbfce31e0217a3689c8d961a356cb10d"); + const res = createResponse(); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderGistCard( - { - name: gist_data.data.viewer.gist.files[0].name, - nameWithOwner: `${gist_data.data.viewer.gist.owner.login}/${gist_data.data.viewer.gist.files[0].name}`, - description: gist_data.data.viewer.gist.description, - language: gist_data.data.viewer.gist.files[0].language.name, - starsCount: gist_data.data.viewer.gist.stargazerCount, - forksCount: gist_data.data.viewer.gist.forks.totalCount, - }, - { ...req.query }, - ), - ); + await router(req, res); + + expect(mocks.gist).toHaveBeenCalledWith({ + id: "bbfce31e0217a3689c8d961a356cb10d", + }); + expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", errorCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith("temporary-error-svg"); + expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); }); - it("should render error if gist is not found", async () => { - const req = { - query: { - id: "bbfce31e0217a3689c8d961a356cb10d", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock - .onPost("https://api.github.com/graphql") - .reply(200, gist_not_found_data); + it("should not persist permanent gist errors returned by core", async () => { + mocks.gist.mockResolvedValue({ + status: "error - permanent", + content: "permanent-error-svg", + }); - await gist(req, res); + const req = createRequest("id=bbfce31e0217a3689c8d961a356cb10d"); + const res = createResponse(); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ message: "Gist not found" }), - ); + await router(req, res); + + expect(mocks.gist).toHaveBeenCalledWith({ + id: "bbfce31e0217a3689c8d961a356cb10d", + }); + expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", defaultCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith("permanent-error-svg"); + expect(mocks.storeRequest).not.toHaveBeenCalled(); }); - it("should render error if wrong locale is provided", async () => { - const req = { - query: { - id: "bbfce31e0217a3689c8d961a356cb10d", - locale: "asdf", - }, + it("should reject non-whitelisted gist ids before calling core logic", async () => { + mocks.config = { + gistWhitelist: ["allowed-gist-id"], }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, gist_data); - await gist(req, res); + const req = createRequest("id=blocked-gist-id"); + const res = createResponse(); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "Something went wrong", - secondaryMessage: "Language not found", - }), - ); - }); + await router(req, res); - it("should have proper cache", async () => { - const req = { - query: { - id: "bbfce31e0217a3689c8d961a356cb10d", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, gist_data); - - await gist(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.setHeader).toHaveBeenCalledWith( - "Cache-Control", - `max-age=${CACHE_TTL.GIST_CARD.DEFAULT}, ` + - `s-maxage=${CACHE_TTL.GIST_CARD.DEFAULT}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, + expect(mocks.gist).not.toHaveBeenCalled(); + expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", defaultCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith( + "render-error:This gist ID is not whitelisted", ); + expect(mocks.storeRequest).not.toHaveBeenCalled(); }); }); diff --git a/apps/backend/tests/pat-info.test.js b/apps/backend/tests/pat-info.test.js index 3e98fa8b..ef01b9ba 100644 --- a/apps/backend/tests/pat-info.test.js +++ b/apps/backend/tests/pat-info.test.js @@ -6,8 +6,6 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; -import patInfo, { RATE_LIMIT_SECONDS } from "../api-renamed/status/pat-info.js"; - const mock = new MockAdapter(axios); const successData = { @@ -57,20 +55,26 @@ const bad_credentials_error = { message: "Bad credentials", }; +let RATE_LIMIT_SECONDS, patInfo; + +beforeAll(async () => { + vi.stubEnv("PAT_1", "testPAT1"); + vi.stubEnv("PAT_2", "testPAT2"); + vi.stubEnv("PAT_3", "testPAT3"); + vi.stubEnv("PAT_4", "testPAT4"); + + ({ RATE_LIMIT_SECONDS, default: patInfo } = + await import("../api-renamed/status/pat-info.js")); +}); + afterEach(() => { mock.reset(); + vi.unstubAllEnvs(); + // modules may cache environment variables, so we need to reset them + vi.resetModules(); }); describe("Test /api/status/pat-info", () => { - beforeAll(() => { - // reset patenv first so that they are not populated with local envs - process.env = {}; - process.env.PAT_1 = "testPAT1"; - process.env.PAT_2 = "testPAT2"; - process.env.PAT_3 = "testPAT3"; - process.env.PAT_4 = "testPAT4"; - }); - it("should return only 'validPATs' if all PATs are valid", async () => { mock .onPost("https://api.github.com/graphql") @@ -243,7 +247,6 @@ describe("Test /api/status/pat-info", () => { }); it("should have proper cache when error is thrown", async () => { - mock.reset(); mock.onPost("https://api.github.com/graphql").networkError(); const { req, res } = faker({}, {}); diff --git a/apps/backend/tests/pin.test.js b/apps/backend/tests/pin.test.js index b9fa0356..628e68fa 100644 --- a/apps/backend/tests/pin.test.js +++ b/apps/backend/tests/pin.test.js @@ -1,175 +1,83 @@ // @ts-check -import axios from "axios"; -import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; -import pin from "../api-renamed/pin.js"; -import { renderRepoCard } from "../src/cards/repo.js"; +const mocks = vi.hoisted(() => ({ + pin: vi.fn(), + storeRequest: vi.fn(), + getUserAccessByName: vi.fn(), +})); + +vi.mock("@stats-organization/github-readme-stats-core", async () => { + const { mockCore } = await import("./utils.js"); + return mockCore({ pin: mocks.pin }); +}); + +vi.mock("../src/common/database.js", () => ({ + storeRequest: mocks.storeRequest, + getUserAccessByName: mocks.getUserAccessByName, +})); + +import router from "../router.js"; import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; -import { renderError } from "../src/common/render.js"; -import { data_repo, data_user } from "./test-data/pin-data.js"; - -import "@testing-library/jest-dom/vitest"; - -const mock = new MockAdapter(axios); - -afterEach(() => { - mock.reset(); +const createRequest = (search = "") => ({ + headers: {}, + url: `/api/pin?${search}`, }); -describe("Test /api/pin", () => { - it("should test the request", async () => { - const req = { - query: { +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); + +const defaultCacheHeader = + `max-age=${CACHE_TTL.PIN_CARD.DEFAULT}, ` + + `s-maxage=${CACHE_TTL.PIN_CARD.DEFAULT}, ` + + `stale-while-revalidate=${DURATIONS.ONE_DAY}`; + +beforeEach(() => { + mocks.pin.mockReset(); + mocks.storeRequest.mockReset().mockResolvedValue(undefined); + mocks.getUserAccessByName.mockReset().mockResolvedValue(null); + // CACHE_SECONDS is not set here, this is just to safeguard against CACHE_SECONDS being set externally + delete process.env.CACHE_SECONDS; +}); + +describe("Test /api/pin backend routing", () => { + it("happy path should pass query params and user PAT, respond with pin content and persist request", async () => { + mocks.getUserAccessByName.mockResolvedValue({ token: "user-pat" }); + mocks.pin.mockResolvedValue({ + status: "success", + content: "mock-pin-svg", + }); + + const req = createRequest( + "username=anuraghazra&repo=convoychat&theme=dark", + ); + const res = createResponse(); + + await router(req, res); + + expect(mocks.getUserAccessByName).toHaveBeenCalledWith("anuraghazra"); + expect(mocks.pin).toHaveBeenCalledWith( + { username: "anuraghazra", repo: "convoychat", + theme: "dark", }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_user); - - await pin(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - // @ts-ignore - renderRepoCard({ - ...data_repo.repository, - starCount: data_repo.repository.stargazers.totalCount, - }), - ); - }); - - it("should get the query options", async () => { - const req = { - query: { - username: "anuraghazra", - repo: "convoychat", - title_color: "fff", - icon_color: "fff", - text_color: "fff", - bg_color: "fff", - full_name: "1", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_user); - - await pin(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderRepoCard( - // @ts-ignore - { - ...data_repo.repository, - starCount: data_repo.repository.stargazers.totalCount, - }, - { ...req.query }, - ), - ); - }); - - it("should render error card if user repo not found", async () => { - const req = { - query: { - username: "anuraghazra", - repo: "convoychat", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock - .onPost("https://api.github.com/graphql") - .reply(200, { data: { user: { repository: null }, organization: null } }); - - await pin(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ message: "User Repository Not found" }), - ); - }); - - it("should render error card if org repo not found", async () => { - const req = { - query: { - username: "anuraghazra", - repo: "convoychat", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock - .onPost("https://api.github.com/graphql") - .reply(200, { data: { user: null, organization: { repository: null } } }); - - await pin(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ message: "Organization Repository Not found" }), - ); - }); - - it("should render error card if wrong locale provided", async () => { - const req = { - query: { - username: "anuraghazra", - repo: "convoychat", - locale: "asdf", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_user); - - await pin(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "Something went wrong", - secondaryMessage: "Language not found", - }), - ); - }); - - it("should have proper cache", async () => { - const req = { - query: { - username: "anuraghazra", - repo: "convoychat", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_user); - - await pin(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.setHeader).toHaveBeenCalledWith( - "Cache-Control", - `max-age=${CACHE_TTL.PIN_CARD.DEFAULT}, ` + - `s-maxage=${CACHE_TTL.PIN_CARD.DEFAULT}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, + "user-pat", ); + expect(req.query).toEqual({ + username: "anuraghazra", + repo: "convoychat", + theme: "dark", + }); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", defaultCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith("mock-pin-svg"); + expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); }); }); diff --git a/apps/backend/tests/private-instance/api.test.js b/apps/backend/tests/private-instance/api.test.js deleted file mode 100644 index b422a3b1..00000000 --- a/apps/backend/tests/private-instance/api.test.js +++ /dev/null @@ -1,41 +0,0 @@ -// @ts-check - -import axios from "axios"; -import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; - -import api from "../../api-renamed/index.js"; -import { renderError } from "../../src/common/render.js"; -import { data_stats } from "../test-data/api-data.js"; - -const mock = new MockAdapter(axios); - -afterEach(() => { - mock.reset(); -}); - -describe("Test /api/", () => { - it("should render error card if username not in whitelist", async () => { - const req = { - query: { - username: "renovate-bot", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").replyOnce(200, data_stats); - - await api(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "This username is not whitelisted", - secondaryMessage: "Please deploy your own instance", - renderOptions: { show_repo_link: false }, - }), - ); - }); -}); diff --git a/apps/backend/tests/private-instance/gist.test.js b/apps/backend/tests/private-instance/gist.test.js deleted file mode 100644 index 9a23afea..00000000 --- a/apps/backend/tests/private-instance/gist.test.js +++ /dev/null @@ -1,41 +0,0 @@ -// @ts-check - -import axios from "axios"; -import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; - -import gist from "../../api-renamed/gist.js"; -import { renderError } from "../../src/common/render.js"; -import { gist_data } from "../test-data/gist-data.js"; - -const mock = new MockAdapter(axios); - -afterEach(() => { - mock.reset(); -}); - -describe("Test /api/gist with gist whitelist", () => { - it("should render error card if id not in whitelist", async () => { - const req = { - query: { - id: "9bae0392ee3a26bac5cc388a6c8b1469", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, gist_data); - - await gist(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "This gist ID is not whitelisted", - secondaryMessage: "Please deploy your own instance", - renderOptions: { show_repo_link: false }, - }), - ); - }); -}); diff --git a/apps/backend/tests/private-instance/pin.test.js b/apps/backend/tests/private-instance/pin.test.js deleted file mode 100644 index fb81dc55..00000000 --- a/apps/backend/tests/private-instance/pin.test.js +++ /dev/null @@ -1,64 +0,0 @@ -// @ts-check - -import axios from "axios"; -import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; - -import pin from "../../api-renamed/pin.js"; -import { renderError } from "../../src/common/render.js"; -import { data_user } from "../test-data/pin-data.js"; - -const mock = new MockAdapter(axios); - -afterEach(() => { - mock.reset(); -}); - -describe("Test /api/pin", () => { - it("should render error card if username not in whitelist", async () => { - const req = { - query: { - username: "renovate-bot", - repo: "convoychat", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_user); - - await pin(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "This username is not whitelisted", - secondaryMessage: "Please deploy your own instance", - renderOptions: { show_repo_link: false }, - }), - ); - }); - - it("should render error card if missing required parameters", async () => { - const req = { - query: {}, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_user); - - await pin(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "This username is not whitelisted", - secondaryMessage: "Please deploy your own instance", - renderOptions: { show_repo_link: false }, - }), - ); - }); -}); diff --git a/apps/backend/tests/private-instance/top-langs.test.js b/apps/backend/tests/private-instance/top-langs.test.js deleted file mode 100644 index c72f4d6f..00000000 --- a/apps/backend/tests/private-instance/top-langs.test.js +++ /dev/null @@ -1,41 +0,0 @@ -// @ts-check - -import axios from "axios"; -import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; - -import topLangs from "../../api-renamed/top-langs.js"; -import { renderError } from "../../src/common/render.js"; -import { data_langs } from "../test-data/langs-data.js"; - -const mock = new MockAdapter(axios); - -afterEach(() => { - mock.reset(); -}); - -describe("Test /api/top-langs", () => { - it("should render error card if username not in whitelist", async () => { - const req = { - query: { - username: "renovate-bot", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_langs); - - await topLangs(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "This username is not whitelisted", - secondaryMessage: "Please deploy your own instance", - renderOptions: { show_repo_link: false }, - }), - ); - }); -}); diff --git a/apps/backend/tests/public-instance/__snapshots__/api.test.js.snap b/apps/backend/tests/public-instance/__snapshots__/api.test.js.snap new file mode 100644 index 00000000..1edbcd22 --- /dev/null +++ b/apps/backend/tests/public-instance/__snapshots__/api.test.js.snap @@ -0,0 +1,514 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Test /api contract > should match the private missing-username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This username is not whitelisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api contract > should match the public blacklisted-username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This username is blacklisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api contract > should match the public happy-path response snapshot 1`] = ` +{ + "content": " + Anurag Hazra's GitHub Stats, Rank: A+ + Total Stars Earned: 14099, Total Commits (last year) : 200, Total PRs: 4000, Total Issues: 340, Contributed to (last year): 51 + + + + + + + + + + Anurag Hazra's GitHub Stats + + + + + + + + + + + + + A+ + + + + + + + + + Total Stars Earned: + 14.1k + + + + + Total Commits (last year): + 200 + + + + + Total PRs: + 4k + + + + + Total Issues: + 340 + + + + + Contributed to (last year): + 51 + + + + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api contract > should match the public many-params response snapshot 1`] = ` +{ + "content": " + a custom title, Rank: A+ + कुल अर्जित सितारे: 4100, कुल commits (2024) : 200, कुल PR: 4000, कुल PR का विलय: 3200, मर्ज किए गए PRs प्रतिशत: 80.0, कुल PRs की समीक्षा की गई: 1234, कुल चर्चाएँ शुरू हुईं: 222, कुल चर्चाओं के उत्तर: 111, (पिछले वर्ष) में योगदान दिया: 51 + + + + + + + + + + a custom title + + + + + + + + + + + + + + + + + + + + + + + + कुल अर्जित सितारे: + 4100 + + + + + + + + + कुल commits (2024): + 200 + + + + + + + + + कुल PR: + 4000 + + + + + + + + + कुल PR का विलय: + 3200 + + + + + + + + + मर्ज किए गए PRs प्रतिशत: + 80.0 % + + + + + + + + + कुल PRs की समीक्षा की गई: + 1234 + + + + + + + + + कुल चर्चाएँ शुरू हुईं: + 222 + + + + + + + + + कुल चर्चाओं के उत्तर: + 111 + + + + + + + + + (पिछले वर्ष) में योगदान दिया: + 51 + + + + + + ", + "graphqlRequest": "{"query":"\\n query userInfo($login: String!, $after: String, $includeMergedPullRequests: Boolean!, $includeDiscussions: Boolean!, $includeDiscussionsAnswers: Boolean!, $startTime: DateTime = null, $ownerAffiliations: [RepositoryAffiliation]) {\\n user(login: $login) {\\n name\\n login\\n commits: contributionsCollection (from: $startTime) {\\n totalCommitContributions,\\n }\\n reviews: contributionsCollection {\\n totalPullRequestReviewContributions\\n }\\n repositoriesContributedTo(first: 1, contributionTypes: [COMMIT, ISSUE, PULL_REQUEST, REPOSITORY]) {\\n totalCount\\n }\\n pullRequests(first: 1) {\\n totalCount\\n }\\n mergedPullRequests: pullRequests(states: MERGED) @include(if: $includeMergedPullRequests) {\\n totalCount\\n }\\n openIssues: issues(states: OPEN) {\\n totalCount\\n }\\n closedIssues: issues(states: CLOSED) {\\n totalCount\\n }\\n followers {\\n totalCount\\n }\\n repositoryDiscussions @include(if: $includeDiscussions) {\\n totalCount\\n }\\n repositoryDiscussionComments(onlyAnswers: true) @include(if: $includeDiscussionsAnswers) {\\n totalCount\\n }\\n \\n repositories(first: 100, after: $after, ownerAffiliations: $ownerAffiliations, orderBy: {direction: DESC, field: STARGAZERS}) {\\n totalCount\\n nodes {\\n name\\n stargazers {\\n totalCount\\n }\\n }\\n pageInfo {\\n hasNextPage\\n endCursor\\n }\\n }\\n\\n }\\n }\\n","variables":{"login":"anuraghazra","first":100,"after":null,"includeMergedPullRequests":true,"includeDiscussions":true,"includeDiscussionsAnswers":true,"startTime":"2024-01-01T00:00:00Z","ownerAffiliations":["OWNER","COLLABORATOR"]}}", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api contract > should match the public missing-username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + Missing params "username" make sure you pass the parameters in URL + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=600, s-maxage=600, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api contract > should render error card in same theme as requested card 1`] = ` +{ + "content": " + + + Something went wrong! + + Missing params "username" make sure you pass the parameters in URL + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=600, s-maxage=600, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; diff --git a/apps/backend/tests/public-instance/__snapshots__/gist.test.js.snap b/apps/backend/tests/public-instance/__snapshots__/gist.test.js.snap new file mode 100644 index 00000000..6e8e2779 --- /dev/null +++ b/apps/backend/tests/public-instance/__snapshots__/gist.test.js.snap @@ -0,0 +1,252 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Test /api/gist contract > should match the private missing-id response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This gist ID is not whitelisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/gist contract > should match the public happy-path response snapshot 1`] = ` +{ + "content": " + + + + + + + + + + + + + + + + countries.json + + + + + + + + List of countries and territories in English and Spanish:name, continent, capital, dial code, country codes, TLD,and area in sq km. Lista de países y territorios enInglés y Español: nombre, continente, capital,código de teléfono, códigos de país,dominio y área en km cuadrados. Updated 2023 + + + + + + + JSON + + + + + + 33 + + + + 11 + + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/gist contract > should match the public many-params response snapshot 1`] = ` +{ + "content": " + + + + + + + + + + + + + + + + Yizack/countries.json + + + + + + + + List of countries and territories in English and Spanish:name, continent, capital, dial code, country codes, TLD,and area in sq km. Lista de países y territorios enInglés y Español: nombre, continente, capital,código de teléfono, códigos de país,dominio y área en km cuadrados. Updated 2023 + + + + + + + JSON + + + + + + 33 + + + + 11 + + + + ", + "graphqlRequest": "{"query":"\\nquery gistInfo($gistName: String!) {\\n viewer {\\n gist(name: $gistName) {\\n description\\n owner {\\n login\\n }\\n stargazerCount\\n forks {\\n totalCount\\n }\\n files {\\n name\\n language {\\n name\\n }\\n size\\n }\\n }\\n }\\n}\\n","variables":{"gistName":"happy-gist-id"}}", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/gist contract > should match the public missing-id response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + Missing params "id" make sure you pass the parameters in URL + /api/gist?id=GIST_ID + + ", + "headers": [ + [ + "Cache-Control", + "max-age=600, s-maxage=600, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; diff --git a/apps/backend/tests/public-instance/__snapshots__/pin.test.js.snap b/apps/backend/tests/public-instance/__snapshots__/pin.test.js.snap new file mode 100644 index 00000000..959c008a --- /dev/null +++ b/apps/backend/tests/public-instance/__snapshots__/pin.test.js.snap @@ -0,0 +1,406 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Test /api/pin contract > should match the private missing-username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This username is not whitelisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/pin contract > should match the private non-whitelisted username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This username is not whitelisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/pin contract > should match the public blacklisted-username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This username is blacklisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/pin contract > should match the public happy-path response snapshot 1`] = ` +{ + "content": " + + + + + + + + + + + + + + + + convoychat + + + + + + + + + + Help us take over the world with a deeply customizableReact, TypeScript and GraphQL chat app that has enough textto wrap across multiple lines in the repository card. + + + + + + + TypeScript + + + + + + 38k + + + + 100 + + + + + + + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/pin contract > should match the public many-params response snapshot 1`] = ` +{ + "content": " + + + + + + + + + + + + + + + + anuraghazra/convoychat + + + + + + + + + + Help us take over the world with a deeply customizable React, TypeScript and GraphQL... + + + + + + + TypeScript + + + + + + 38k + + + + 100 + + + + + + + my created PRs: + 1234 + + + + + my commented PRs: + 2345 + + + + + my reviewed PRs: + 3456 + + + + + my created issues: + 4567 + + + + + my commented issues: + 5678 + + + + + + + ", + "graphqlRequest": "{"query":"\\n fragment RepoInfo on Repository {\\n name\\n nameWithOwner\\n isPrivate\\n isArchived\\n isTemplate\\n stargazers {\\n totalCount\\n }\\n description\\n primaryLanguage {\\n color\\n id\\n name\\n }\\n forkCount\\n }\\n query getRepo($login: String!, $repo: String!) {\\n user(login: $login) {\\n repository(name: $repo) {\\n ...RepoInfo\\n }\\n }\\n organization(login: $login) {\\n repository(name: $repo) {\\n ...RepoInfo\\n }\\n }\\n }\\n ","variables":{"login":"anuraghazra","repo":"convoychat"}}", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/pin contract > should match the public missing-params response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + Missing params "username", "repo" make sure you pass the parameters in URL + /api/pin?username=USERNAME&repo=REPO_NAME + + ", + "headers": [ + [ + "Cache-Control", + "max-age=600, s-maxage=600, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/pin contract > should render error card in same theme as requested card 1`] = ` +{ + "content": " + + + Something went wrong! + + Missing params "username", "repo" make sure you pass the parameters in URL + /api/pin?username=USERNAME&repo=REPO_NAME + + ", + "headers": [ + [ + "Cache-Control", + "max-age=600, s-maxage=600, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; diff --git a/apps/backend/tests/public-instance/__snapshots__/top-langs.test.js.snap b/apps/backend/tests/public-instance/__snapshots__/top-langs.test.js.snap new file mode 100644 index 00000000..589f315e --- /dev/null +++ b/apps/backend/tests/public-instance/__snapshots__/top-langs.test.js.snap @@ -0,0 +1,460 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Test /api/top-langs contract > should match the private missing-username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This username is not whitelisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/top-langs contract > should match the private non-whitelisted username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This username is not whitelisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/top-langs contract > should match the public blacklisted-username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This username is blacklisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/top-langs contract > should match the public happy-path response snapshot 1`] = ` +{ + "content": " + + + + + + + + + + + + Most Used Languages + + + + + + + + + + Rust + 70.92% + + + + + + + + + + + + HTML + 12.77% + + + + + + + + + + + + JavaScript + 8.51% + + + + + + + + + + + + TypeScript + 6.38% + + + + + + + + + + + + Java + 1.42% + + + + + + + + + + + + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/top-langs contract > should match the public many-params response snapshot 1`] = ` +{ + "content": " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TypeScript 19.0 B + + + + + + + Java 4.5 B + + + + + + + Python 3.9 B + + + + + + + + + ", + "graphqlRequest": "{"query":"\\n query userInfo($login: String!, $ownerAffiliations: [RepositoryAffiliation]) {\\n user(login: $login) {\\n # do not fetch forks\\n repositories(ownerAffiliations: $ownerAffiliations, isFork: false, first: 100) {\\n nodes {\\n name\\n languages(first: 10, orderBy: {field: SIZE, direction: DESC}) {\\n edges {\\n size\\n node {\\n color\\n name\\n }\\n }\\n }\\n }\\n }\\n }\\n }\\n ","variables":{"login":"anuraghazra","ownerAffiliations":["OWNER","COLLABORATOR"]}}", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/top-langs contract > should match the public missing-username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + Missing params "username" make sure you pass the parameters in URL + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=600, s-maxage=600, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/top-langs contract > should render error card in same theme as requested card 1`] = ` +{ + "content": " + + + Something went wrong! + + Missing params "username" make sure you pass the parameters in URL + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=600, s-maxage=600, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; diff --git a/apps/backend/tests/public-instance/__snapshots__/wakatime.test.js.snap b/apps/backend/tests/public-instance/__snapshots__/wakatime.test.js.snap new file mode 100644 index 00000000..a1a3075a --- /dev/null +++ b/apps/backend/tests/public-instance/__snapshots__/wakatime.test.js.snap @@ -0,0 +1,546 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Test /api/wakatime contract > should match the private missing-username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This username is not whitelisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/wakatime contract > should match the private non-whitelisted username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + This username is not whitelisted + Please deploy your own instance + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/wakatime contract > should match the public happy-path response snapshot 1`] = ` +{ + "content": " + + + + + + + + + + + + WakaTime Stats (last 7 days) + + + + + + + + + + TypeScript: + 12 hrs + + + + + + + + + + + + JavaScript: + 6 hrs 30 mins + + + + + + + + + + + + Other: + 3 hrs + + + + + + + + + + + + YAML: + 1 hr + + + + + + + + + + + + JSON: + 30 mins + + + + + + + + + + + + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/wakatime contract > should match the public inaccessible-profile response snapshot 1`] = ` +{ + "content": " + + + + + + + + + + + + WakaTime Stats + + + + + + + + + WakaTime user profile not public + + + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/wakatime contract > should match the public many-params response snapshot 1`] = ` +{ + "content": " + + + + + + + + + + + + a custom title + + + + + + + + + + + + + + + + + + + + + + + TypeScript - 61.88 % + + + + + + + JavaScript - 33.32 % + + + + + + + YAML - 4.76 % + + + + + + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=36000, s-maxage=36000, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/wakatime contract > should match the public missing-username response snapshot 1`] = ` +{ + "content": " + + + Something went wrong! + + Missing params "username" make sure you pass the parameters in URL + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=600, s-maxage=600, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; + +exports[`Test /api/wakatime contract > should render error card in same theme as requested card 1`] = ` +{ + "content": " + + + Something went wrong! + + Missing params "username" make sure you pass the parameters in URL + + + ", + "headers": [ + [ + "Cache-Control", + "max-age=600, s-maxage=600, stale-while-revalidate=86400", + ], + [ + "Content-Type", + "image/svg+xml", + ], + ], +} +`; diff --git a/apps/backend/tests/public-instance/api.test.js b/apps/backend/tests/public-instance/api.test.js index 52080c89..506d9f05 100644 --- a/apps/backend/tests/public-instance/api.test.js +++ b/apps/backend/tests/public-instance/api.test.js @@ -2,40 +2,176 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import api from "../../api-renamed/index.js"; -import { renderError } from "../../src/common/render.js"; -import { data_stats } from "../test-data/api-data.js"; +import { data_stats, normalizeSvg } from "../utils.js"; const mock = new MockAdapter(axios); +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); + +beforeEach(() => { + vi.stubEnv("CACHE_SECONDS", ""); + vi.stubEnv("GIST_WHITELIST", ""); + vi.stubEnv("POSTGRES_URL", ""); + vi.stubEnv("WHITELIST", ""); + + mock.onPost("https://api.github.com/graphql").reply(200, data_stats); +}); + afterEach(() => { mock.reset(); + vi.unstubAllEnvs(); + // modules may cache environment variables, so we need to reset them + vi.resetModules(); }); -describe("Test /api/", () => { - it("should render error card if username in blacklist", async () => { +describe("Test /api contract", () => { + it("should match the public happy-path response snapshot", async () => { + const { default: router } = await import("../../router.js"); + const req = { - query: { - username: "renovate-bot", - }, + headers: {}, + url: "/api?username=anuraghazra", }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public many-params response snapshot", async () => { + mock.onPost("https://api.github.com/graphql").reply(200, data_stats); + + const { default: router } = await import("../../router.js"); + + const params = new URLSearchParams({ + username: "anuraghazra", + show_icons: "true", + card_width: "540", + line_height: "32", + title_color: "123456", + ring_color: "654321", + icon_color: "ff00aa", + text_color: "abcdef", + text_bold: "false", + bg_color: "0f172a", + exclude_repo: "repo-exclude-me", + custom_title: "a custom title", + locale: "hi", + disable_animations: "true", + border_radius: "12", + number_format: "long", + number_precision: "1", + border_color: "fedcba", + rank_icon: "github", + commits_year: "2024", + hide: "issues", + role: "OWNER,COLLABORATOR", + show: "reviews,prs_merged,prs_merged_percentage,discussions_started,discussions_answered", + }); + + const req = { + headers: {}, + url: `/api?${params.toString()}`, }; - mock.onPost("https://api.github.com/graphql").replyOnce(200, data_stats); + const res = createResponse(); - await api(req, res); + await router(req, res); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "This username is blacklisted", - secondaryMessage: "Please deploy your own instance", - renderOptions: { show_repo_link: false }, - }), - ); + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + graphqlRequest: mock.history.post[0].data, + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public missing-username response snapshot", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should render error card in same theme as requested card", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api?theme=merko", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public blacklisted-username response snapshot", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api?username=renovate-bot", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the private missing-username response snapshot", async () => { + vi.stubEnv("WHITELIST", "anuraghazra"); + + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); }); }); diff --git a/apps/backend/tests/public-instance/gist.test.js b/apps/backend/tests/public-instance/gist.test.js index 42154736..0742ab3b 100644 --- a/apps/backend/tests/public-instance/gist.test.js +++ b/apps/backend/tests/public-instance/gist.test.js @@ -2,38 +2,123 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import gist from "../../api-renamed/gist.js"; -import { renderError } from "../../src/common/render.js"; -import { gist_data } from "../test-data/gist-data.js"; +import { happy_path_gist_data, normalizeSvg } from "../utils.js"; const mock = new MockAdapter(axios); +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); + +beforeEach(() => { + vi.stubEnv("CACHE_SECONDS", ""); + vi.stubEnv("GIST_WHITELIST", ""); + vi.stubEnv("POSTGRES_URL", ""); + vi.stubEnv("WHITELIST", ""); + + mock + .onPost("https://api.github.com/graphql") + .reply(200, happy_path_gist_data); +}); + afterEach(() => { mock.reset(); + vi.unstubAllEnvs(); + // modules may cache environment variables, so we need to reset them + vi.resetModules(); }); -describe("Test /api/gist", () => { - it("should render error if id is not provided", async () => { +describe("Test /api/gist contract", () => { + it("should match the public happy-path response snapshot", async () => { + const { default: router } = await import("../../router.js"); + const req = { - query: {}, + headers: {}, + url: "/api/gist?id=happy-gist-id", }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public many-params response snapshot", async () => { + const { default: router } = await import("../../router.js"); + + const params = new URLSearchParams({ + id: "happy-gist-id", + title_color: "123456", + icon_color: "ff00aa", + text_color: "abcdef", + bg_color: "0f172a", + border_radius: "12", + border_color: "fedcba", + show_owner: "true", + }); + + const req = { + headers: {}, + url: `/api/gist?${params.toString()}`, }; - mock.onPost("https://api.github.com/graphql").reply(200, gist_data); + const res = createResponse(); - await gist(req, res); + await router(req, res); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: 'Missing params "id" make sure you pass the parameters in URL', - secondaryMessage: "/api/gist?id=GIST_ID", - renderOptions: { show_repo_link: false }, - }), - ); + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + graphqlRequest: mock.history.post[0].data, + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public missing-id response snapshot", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/gist", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the private missing-id response snapshot", async () => { + vi.stubEnv("GIST_WHITELIST", "allowed-gist-id"); + + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/gist", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); }); }); diff --git a/apps/backend/tests/public-instance/pin.test.js b/apps/backend/tests/public-instance/pin.test.js index fdbdfe98..12da77f9 100644 --- a/apps/backend/tests/public-instance/pin.test.js +++ b/apps/backend/tests/public-instance/pin.test.js @@ -2,64 +2,215 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import pin from "../../api-renamed/pin.js"; -import { renderError } from "../../src/common/render.js"; -import { data_user } from "../test-data/pin-data.js"; +import { data_user, normalizeSvg } from "../utils.js"; const mock = new MockAdapter(axios); +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); + +beforeEach(() => { + vi.stubEnv("CACHE_SECONDS", ""); + vi.stubEnv("GIST_WHITELIST", ""); + vi.stubEnv("POSTGRES_URL", ""); + vi.stubEnv("WHITELIST", ""); + + mock.onPost("https://api.github.com/graphql").reply(200, data_user); +}); + afterEach(() => { mock.reset(); + vi.unstubAllEnvs(); + // modules may cache environment variables, so we need to reset them + vi.resetModules(); }); -describe("Test /api/pin", () => { - it("should render error card if username in blacklist", async () => { +describe("Test /api/pin contract", () => { + it("should match the public happy-path response snapshot", async () => { + const { default: router } = await import("../../router.js"); + const req = { - query: { - username: "renovate-bot", - repo: "convoychat", - }, + headers: {}, + url: "/api/pin?username=anuraghazra&repo=convoychat", }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_user); + const res = createResponse(); - await pin(req, res); + await router(req, res); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "This username is blacklisted", - secondaryMessage: "Please deploy your own instance", - renderOptions: { show_repo_link: false }, - }), - ); + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); }); - it("should render error card if missing required parameters", async () => { - const req = { - query: {}, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; + it("should match the public many-params response snapshot", async () => { mock.onPost("https://api.github.com/graphql").reply(200, data_user); + mock + .onGet( + "https://api.github.com/search/issues?per_page=1&q=repo:anuraghazra/convoychat+author:anuraghazra+type:pr", + ) + .reply(200, { total_count: 1234 }); + mock + .onGet( + "https://api.github.com/search/issues?per_page=1&q=repo:anuraghazra/convoychat+commenter:anuraghazra+-author:anuraghazra+type:pr", + ) + .reply(200, { total_count: 2345 }); + mock + .onGet( + "https://api.github.com/search/issues?per_page=1&q=repo:anuraghazra/convoychat+reviewed-by:anuraghazra+-author:anuraghazra+type:pr", + ) + .reply(200, { total_count: 3456 }); + mock + .onGet( + "https://api.github.com/search/issues?per_page=1&q=repo:anuraghazra/convoychat+author:anuraghazra+type:issue", + ) + .reply(200, { total_count: 4567 }); + mock + .onGet( + "https://api.github.com/search/issues?per_page=1&q=repo:anuraghazra/convoychat+commenter:anuraghazra+-author:anuraghazra+type:issue", + ) + .reply(200, { total_count: 5678 }); - await pin(req, res); + const { default: router } = await import("../../router.js"); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: - 'Missing params "username", "repo" make sure you pass the parameters in URL', - secondaryMessage: "/api/pin?username=USERNAME&repo=REPO_NAME", - renderOptions: { show_repo_link: false }, - }), - ); + const params = new URLSearchParams({ + username: "anuraghazra", + repo: "convoychat", + title_color: "123456", + icon_color: "ff00aa", + text_color: "abcdef", + bg_color: "0f172a", + card_width: "560", + show_owner: "true", + show: "prs_authored,prs_commented,prs_reviewed,issues_authored,issues_commented", + show_icons: "false", + number_format: "long", + text_bold: "true", + line_height: "30", + border_radius: "12", + border_color: "fedcba", + description_lines_count: "1", + }); + + const req = { + headers: {}, + url: `/api/pin?${params.toString()}`, + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + graphqlRequest: mock.history.post[0].data, + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public missing-params response snapshot", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/pin", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should render error card in same theme as requested card", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/pin?theme=merko", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public blacklisted-username response snapshot", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/pin?username=renovate-bot&repo=convoychat", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the private non-whitelisted username response snapshot", async () => { + vi.stubEnv("WHITELIST", "anuraghazra"); + + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/pin?username=martin-mfg", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the private missing-username response snapshot", async () => { + vi.stubEnv("WHITELIST", "anuraghazra"); + + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/pin", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); }); }); diff --git a/apps/backend/tests/public-instance/top-langs.test.js b/apps/backend/tests/public-instance/top-langs.test.js index 2e180e34..9eaba86c 100644 --- a/apps/backend/tests/public-instance/top-langs.test.js +++ b/apps/backend/tests/public-instance/top-langs.test.js @@ -2,40 +2,190 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import topLangs from "../../api-renamed/top-langs.js"; -import { renderError } from "../../src/common/render.js"; -import { data_langs } from "../test-data/langs-data.js"; +import { data_langs, normalizeSvg } from "../utils.js"; const mock = new MockAdapter(axios); +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); + +beforeEach(() => { + vi.stubEnv("CACHE_SECONDS", ""); + vi.stubEnv("GIST_WHITELIST", ""); + vi.stubEnv("POSTGRES_URL", ""); + vi.stubEnv("WHITELIST", ""); + + mock.onPost("https://api.github.com/graphql").reply(200, data_langs); +}); + afterEach(() => { mock.reset(); + vi.unstubAllEnvs(); + // modules may cache environment variables, so we need to reset them + vi.resetModules(); }); -describe("Test /api/top-langs", () => { - it("should render error card if username in blacklist", async () => { +describe("Test /api/top-langs contract", () => { + it("should match the public happy-path response snapshot", async () => { + const { default: router } = await import("../../router.js"); + const req = { - query: { - username: "renovate-bot", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), + headers: {}, + url: "/api/top-langs?username=anuraghazra", }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public many-params response snapshot", async () => { mock.onPost("https://api.github.com/graphql").reply(200, data_langs); - await topLangs(req, res); + const { default: router } = await import("../../router.js"); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "This username is blacklisted", - secondaryMessage: "Please deploy your own instance", - renderOptions: { show_repo_link: false }, - }), - ); + const params = new URLSearchParams({ + username: "anuraghazra", + hide: "javascript,HTML", + hide_title: "true", + hide_border: "true", + card_width: "420", + title_color: "123456", + text_color: "abcdef", + bg_color: "0f172a", + layout: "compact", + langs_count: "3", + exclude_repo: "repo-hidden", + size_weight: "0.5", + count_weight: "1", + role: "OWNER,COLLABORATOR", + disable_animations: "true", + stats_format: "bytes", + }); + + const req = { + headers: {}, + url: `/api/top-langs?${params.toString()}`, + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + graphqlRequest: mock.history.post[0].data, + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public missing-username response snapshot", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/top-langs", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should render error card in same theme as requested card", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/top-langs?theme=merko", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public blacklisted-username response snapshot", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/top-langs?username=renovate-bot", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the private non-whitelisted username response snapshot", async () => { + vi.stubEnv("WHITELIST", "anuraghazra"); + + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/top-langs?username=martin-mfg", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the private missing-username response snapshot", async () => { + vi.stubEnv("WHITELIST", "anuraghazra"); + + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/top-langs", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); }); }); diff --git a/apps/backend/tests/public-instance/wakatime.test.js b/apps/backend/tests/public-instance/wakatime.test.js new file mode 100644 index 00000000..48a23bf8 --- /dev/null +++ b/apps/backend/tests/public-instance/wakatime.test.js @@ -0,0 +1,212 @@ +// @ts-check + +import axios from "axios"; +import MockAdapter from "axios-mock-adapter"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +import { normalizeSvg, wakaTimeData } from "../utils.js"; + +const mock = new MockAdapter(axios); + +const wakaTimeProfileNotPublicData = { + data: { + viewer: { + gist: null, + }, + }, +}; + +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); + +beforeEach(() => { + vi.stubEnv("CACHE_SECONDS", ""); + vi.stubEnv("GIST_WHITELIST", ""); + vi.stubEnv("POSTGRES_URL", ""); + vi.stubEnv("WHITELIST", ""); + + mock + .onGet( + "https://wakatime.com/api/v1/users/anuraghazra/stats?is_including_today=true", + ) + .reply(200, wakaTimeData); +}); + +afterEach(() => { + mock.reset(); + vi.unstubAllEnvs(); + // modules may cache environment variables, so we need to reset them + vi.resetModules(); +}); + +describe("Test /api/wakatime contract", () => { + it("should match the public happy-path response snapshot", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/wakatime?username=anuraghazra", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public many-params response snapshot", async () => { + mock.reset(); // to verify api_domain param is working + mock + .onGet( + "https://wakatime.local/api/v1/users/anuraghazra/stats?is_including_today=true", + ) + .reply(200, wakaTimeData); + + const { default: router } = await import("../../router.js"); + + const params = new URLSearchParams({ + username: "anuraghazra", + title_color: "123456", + text_color: "abcdef", + bg_color: "0f172a", + card_width: "620", + custom_title: "a custom title", + layout: "compact", + langs_count: "3", + hide: "other", + api_domain: "wakatime.local", + border_radius: "12", + border_color: "fedcba", + display_format: "percent", + disable_animations: "true", + }); + + const req = { + headers: {}, + url: `/api/wakatime?${params.toString()}`, + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public missing-username response snapshot", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/wakatime", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should render error card in same theme as requested card", async () => { + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/wakatime?theme=merko", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the public inaccessible-profile response snapshot", async () => { + mock.reset(); + mock + .onGet( + "https://wakatime.com/api/v1/users/anuraghazra/stats?is_including_today=true", + ) + .reply(200, wakaTimeProfileNotPublicData); + + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/wakatime?username=anuraghazra", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the private non-whitelisted username response snapshot", async () => { + vi.stubEnv("WHITELIST", "anuraghazra"); + + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/wakatime?username=martin-mfg", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); + + it("should match the private missing-username response snapshot", async () => { + vi.stubEnv("WHITELIST", "anuraghazra"); + + const { default: router } = await import("../../router.js"); + + const req = { + headers: {}, + url: "/api/wakatime", + }; + const res = createResponse(); + + await router(req, res); + + expect(res.end).toHaveBeenCalledOnce(); + + expect({ + headers: res.setHeader.mock.calls, + content: normalizeSvg(res.end.mock.calls[0][0]), + }).toMatchSnapshot(); + }); +}); diff --git a/apps/backend/tests/test-data/api-data.js b/apps/backend/tests/test-data/api-data.js deleted file mode 100644 index cd0c1e64..00000000 --- a/apps/backend/tests/test-data/api-data.js +++ /dev/null @@ -1,51 +0,0 @@ -// @ts-check - -/** - * @type {import("../../src/fetchers/stats").StatsData} - */ -export const stats = { - name: "Anurag Hazra", - totalStars: 100, - totalCommits: 200, - totalIssues: 300, - totalPRs: 400, - totalPRsMerged: 320, - mergedPRsPercentage: 80, - totalReviews: 50, - totalDiscussionsStarted: 10, - totalDiscussionsAnswered: 40, - contributedTo: 50, - rank: { level: "DEV", percentile: 0 }, -}; - -export const data_stats = { - data: { - user: { - name: stats.name, - repositoriesContributedTo: { totalCount: stats.contributedTo }, - commits: { - totalCommitContributions: stats.totalCommits, - }, - reviews: { - totalPullRequestReviewContributions: stats.totalReviews, - }, - pullRequests: { totalCount: stats.totalPRs }, - mergedPullRequests: { totalCount: stats.totalPRsMerged }, - openIssues: { totalCount: stats.totalIssues }, - closedIssues: { totalCount: 0 }, - followers: { totalCount: 0 }, - repositoryDiscussions: { totalCount: stats.totalDiscussionsStarted }, - repositoryDiscussionComments: { - totalCount: stats.totalDiscussionsAnswered, - }, - repositories: { - totalCount: 1, - nodes: [{ stargazers: { totalCount: 100 } }], - pageInfo: { - hasNextPage: false, - endCursor: "cursor", - }, - }, - }, - }, -}; diff --git a/apps/backend/tests/test-data/gist-data.js b/apps/backend/tests/test-data/gist-data.js deleted file mode 100644 index 8bab8d2a..00000000 --- a/apps/backend/tests/test-data/gist-data.js +++ /dev/null @@ -1,28 +0,0 @@ -// @ts-check - -export const gist_data = { - data: { - viewer: { - gist: { - description: - "List of countries and territories in English and Spanish: name, continent, capital, dial code, country codes, TLD, and area in sq km. Lista de países y territorios en Inglés y Español: nombre, continente, capital, código de teléfono, códigos de país, dominio y área en km cuadrados. Updated 2023", - owner: { - login: "Yizack", - }, - stargazerCount: 33, - forks: { - totalCount: 11, - }, - files: [ - { - name: "countries.json", - language: { - name: "JSON", - }, - size: 85858, - }, - ], - }, - }, - }, -}; diff --git a/apps/backend/tests/test-data/langs-data.js b/apps/backend/tests/test-data/langs-data.js deleted file mode 100644 index febec1c7..00000000 --- a/apps/backend/tests/test-data/langs-data.js +++ /dev/null @@ -1,36 +0,0 @@ -// @ts-check - -export const data_langs = { - data: { - user: { - repositories: { - nodes: [ - { - languages: { - edges: [{ size: 150, node: { color: "#0f0", name: "HTML" } }], - }, - }, - { - languages: { - edges: [{ size: 100, node: { color: "#0f0", name: "HTML" } }], - }, - }, - { - languages: { - edges: [ - { size: 100, node: { color: "#0ff", name: "javascript" } }, - ], - }, - }, - { - languages: { - edges: [ - { size: 100, node: { color: "#0ff", name: "javascript" } }, - ], - }, - }, - ], - }, - }, - }, -}; diff --git a/apps/backend/tests/test-data/pin-data.js b/apps/backend/tests/test-data/pin-data.js deleted file mode 100644 index 549f2c61..00000000 --- a/apps/backend/tests/test-data/pin-data.js +++ /dev/null @@ -1,26 +0,0 @@ -// @ts-check - -export const data_repo = { - repository: { - username: "anuraghazra", - name: "convoychat", - stargazers: { - totalCount: 38000, - }, - description: "Help us take over the world! React + TS + GraphQL Chat App", - primaryLanguage: { - color: "#2b7489", - id: "MDg6TGFuZ3VhZ2UyODc=", - name: "TypeScript", - }, - forkCount: 100, - isTemplate: false, - }, -}; - -export const data_user = { - data: { - user: { repository: data_repo.repository }, - organization: null, - }, -}; diff --git a/apps/backend/tests/top-langs.test.js b/apps/backend/tests/top-langs.test.js index f0519629..96d424e7 100644 --- a/apps/backend/tests/top-langs.test.js +++ b/apps/backend/tests/top-langs.test.js @@ -1,192 +1,83 @@ // @ts-check -import axios from "axios"; -import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; -import topLangs from "../api-renamed/top-langs.js"; -import { renderTopLanguages } from "../src/cards/top-languages.js"; +const mocks = vi.hoisted(() => ({ + topLangs: vi.fn(), + storeRequest: vi.fn(), + getUserAccessByName: vi.fn(), +})); + +vi.mock("@stats-organization/github-readme-stats-core", async () => { + const { mockCore } = await import("./utils.js"); + return mockCore({ topLangs: mocks.topLangs }); +}); + +vi.mock("../src/common/database.js", () => ({ + storeRequest: mocks.storeRequest, + getUserAccessByName: mocks.getUserAccessByName, +})); + +import router from "../router.js"; import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; -import { renderError } from "../src/common/render.js"; -import { data_langs } from "./test-data/langs-data.js"; - -import "@testing-library/jest-dom/vitest"; - -const error = { - errors: [ - { - type: "NOT_FOUND", - path: ["user"], - locations: [], - message: "Could not fetch user", - }, - ], -}; - -const langs = { - HTML: { - color: "#0f0", - name: "HTML", - size: 250, - }, - javascript: { - color: "#0ff", - name: "javascript", - size: 200, - }, -}; - -const mock = new MockAdapter(axios); - -afterEach(() => { - mock.reset(); +const createRequest = (search = "") => ({ + headers: {}, + url: `/api/top-langs?${search}`, }); -describe("Test /api/top-langs", () => { - it("should test the request", async () => { - const req = { - query: { - username: "anuraghazra", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_langs); +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); - await topLangs(req, res); +const defaultCacheHeader = + `max-age=${CACHE_TTL.TOP_LANGS_CARD.DEFAULT}, ` + + `s-maxage=${CACHE_TTL.TOP_LANGS_CARD.DEFAULT}, ` + + `stale-while-revalidate=${DURATIONS.ONE_DAY}`; - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith(renderTopLanguages(langs)); - }); +beforeEach(() => { + mocks.topLangs.mockReset(); + mocks.storeRequest.mockReset().mockResolvedValue(undefined); + mocks.getUserAccessByName.mockReset().mockResolvedValue(null); + // CACHE_SECONDS is not set here, this is just to safeguard against CACHE_SECONDS being set externally + delete process.env.CACHE_SECONDS; +}); - it("should work with the query options", async () => { - const req = { - query: { - username: "anuraghazra", - hide_title: true, - card_width: 100, - title_color: "fff", - icon_color: "fff", - text_color: "fff", - bg_color: "fff", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_langs); +describe("Test /api/top-langs backend routing", () => { + it("happy path should pass query params and user PAT, respond with top languages content and persist request", async () => { + mocks.getUserAccessByName.mockResolvedValue({ token: "user-pat" }); + mocks.topLangs.mockResolvedValue({ + status: "success", + content: "mock-top-langs-svg", + }); - await topLangs(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderTopLanguages(langs, { - hide_title: true, - card_width: 100, - title_color: "fff", - icon_color: "fff", - text_color: "fff", - bg_color: "fff", - }), + const req = createRequest( + "username=anuraghazra&layout=compact&langs_count=5", ); - }); + const res = createResponse(); - it("should render error card on user data fetch error", async () => { - const req = { - query: { + await router(req, res); + + expect(mocks.getUserAccessByName).toHaveBeenCalledWith("anuraghazra"); + expect(mocks.topLangs).toHaveBeenCalledWith( + { username: "anuraghazra", + layout: "compact", + langs_count: "5", }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, error); - - await topLangs(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: error.errors[0].message, - secondaryMessage: - "Make sure the provided username is not an organization", - }), - ); - }); - - it("should render error card on incorrect layout input", async () => { - const req = { - query: { - username: "anuraghazra", - layout: ["pie"], - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_langs); - - await topLangs(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "Something went wrong", - secondaryMessage: "Incorrect layout input", - }), - ); - }); - - it("should render error card if wrong locale provided", async () => { - const req = { - query: { - username: "anuraghazra", - locale: "asdf", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_langs); - - await topLangs(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "Something went wrong", - secondaryMessage: "Locale not found", - }), - ); - }); - - it("should have proper cache", async () => { - const req = { - query: { - username: "anuraghazra", - }, - }; - const res = { - setHeader: vi.fn(), - send: vi.fn(), - }; - mock.onPost("https://api.github.com/graphql").reply(200, data_langs); - - await topLangs(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.setHeader).toHaveBeenCalledWith( - "Cache-Control", - `max-age=${CACHE_TTL.TOP_LANGS_CARD.DEFAULT}, ` + - `s-maxage=${CACHE_TTL.TOP_LANGS_CARD.DEFAULT}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, + "user-pat", ); + expect(req.query).toEqual({ + username: "anuraghazra", + layout: "compact", + langs_count: "5", + }); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", defaultCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith("mock-top-langs-svg"); + expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); }); }); diff --git a/apps/backend/tests/utils.js b/apps/backend/tests/utils.js index 21b9f1f8..9108685a 100644 --- a/apps/backend/tests/utils.js +++ b/apps/backend/tests/utils.js @@ -1,41 +1,288 @@ // @ts-check +export const data_stats = { + data: { + user: { + name: "Anurag Hazra", + login: "anuraghazra", + repositoriesContributedTo: { totalCount: 51 }, + commits: { + totalCommitContributions: 200, + }, + reviews: { + totalPullRequestReviewContributions: 1234, + }, + pullRequests: { totalCount: 4000 }, + mergedPullRequests: { totalCount: 3200 }, + openIssues: { totalCount: 300 }, + closedIssues: { totalCount: 40 }, + followers: { totalCount: 150 }, + repositoryDiscussions: { totalCount: 222 }, + repositoryDiscussionComments: { + totalCount: 111, + }, + repositories: { + totalCount: 3, + nodes: [ + { name: "repo-keep-1", stargazers: { totalCount: 1500 } }, + { name: "repo-exclude-me", stargazers: { totalCount: 9999 } }, + { name: "repo-keep-2", stargazers: { totalCount: 2600 } }, + ], + pageInfo: { + hasNextPage: false, + endCursor: "cursor", + }, + }, + }, + }, +}; + +export const happy_path_gist_data = { + data: { + viewer: { + gist: { + description: + "List of countries and territories in English and Spanish: name, continent, capital, dial code, country codes, TLD, and area in sq km. Lista de países y territorios en Inglés y Español: nombre, continente, capital, código de teléfono, códigos de país, dominio y área en km cuadrados. Updated 2023", + owner: { + login: "Yizack", + }, + stargazerCount: 33, + forks: { + totalCount: 11, + }, + files: [ + { + name: "countries.json", + language: { + name: "JSON", + }, + size: 85858, + }, + ], + }, + }, + }, +}; + +export const data_user = { + data: { + user: { + repository: { + username: "anuraghazra", + name: "convoychat", + nameWithOwner: "anuraghazra/convoychat", + stargazers: { + totalCount: 38000, + }, + description: + "Help us take over the world with a deeply customizable React, TypeScript and GraphQL chat app that has enough text to wrap across multiple lines in the repository card.", + primaryLanguage: { + color: "#2b7489", + id: "MDg6TGFuZ3VhZ2UyODc=", + name: "TypeScript", + }, + forkCount: 100, + isTemplate: false, + isArchived: false, + }, + }, + organization: null, + }, +}; + +export const data_langs = { + data: { + user: { + repositories: { + nodes: [ + { + name: "repo-html", + languages: { + edges: [{ size: 180, node: { color: "#0f0", name: "HTML" } }], + }, + }, + { + name: "repo-javascript", + languages: { + edges: [ + { size: 120, node: { color: "#0ff", name: "JavaScript" } }, + ], + }, + }, + { + name: "repo-ts-1", + languages: { + edges: [ + { size: 45, node: { color: "#3178c6", name: "TypeScript" } }, + ], + }, + }, + { + name: "repo-ts-2", + languages: { + edges: [ + { size: 45, node: { color: "#3178c6", name: "TypeScript" } }, + ], + }, + }, + { + name: "repo-other-langs", + languages: { + edges: [ + { size: 20, node: { color: "#f00", name: "Java" } }, + { size: 10, node: { color: "#0f0", name: "Cobol" } }, + { size: 15, node: { color: "#00f", name: "Python" } }, + ], + }, + }, + { + name: "repo-hidden", + languages: { + edges: [{ size: 1000, node: { color: "#dea584", name: "Rust" } }], + }, + }, + ], + }, + }, + }, +}; + +export const wakaTimeData = { + data: { + categories: [ + { + digital: "22:40", + hours: 22, + minutes: 40, + name: "Coding", + percent: 100, + text: "22 hrs 40 mins", + total_seconds: 81643.570077, + }, + ], + daily_average: 16095, + daily_average_including_other_language: 16329, + days_including_holidays: 7, + days_minus_holidays: 5, + editors: [ + { + digital: "22:40", + hours: 22, + minutes: 40, + name: "VS Code", + percent: 100, + text: "22 hrs 40 mins", + total_seconds: 81643.570077, + }, + ], + holidays: 2, + human_readable_daily_average: "4 hrs 28 mins", + human_readable_daily_average_including_other_language: "4 hrs 32 mins", + human_readable_total: "22 hrs 21 mins", + human_readable_total_including_other_language: "22 hrs 40 mins", + id: "random hash", + is_already_updating: false, + is_coding_activity_visible: true, + is_including_today: false, + is_other_usage_visible: true, + is_stuck: false, + is_up_to_date: true, + languages: [ + { + digital: "12:00", + hours: 12, + minutes: 0, + name: "TypeScript", + percent: 52, + text: "12 hrs", + total_seconds: 43200, + }, + { + digital: "6:30", + hours: 6, + minutes: 30, + name: "JavaScript", + percent: 28, + text: "6 hrs 30 mins", + total_seconds: 23400, + }, + { + digital: "3:00", + hours: 3, + minutes: 0, + name: "Other", + percent: 13, + text: "3 hrs", + total_seconds: 10800, + }, + { + digital: "1:00", + hours: 1, + minutes: 0, + name: "YAML", + percent: 4, + text: "1 hr", + total_seconds: 3600, + }, + { + digital: "0:30", + hours: 0, + minutes: 30, + name: "JSON", + percent: 3, + text: "30 mins", + total_seconds: 1800, + }, + ], + operating_systems: [ + { + digital: "22:40", + hours: 22, + minutes: 40, + name: "Mac", + percent: 100, + text: "22 hrs 40 mins", + total_seconds: 81643.570077, + }, + ], + percent_calculated: 100, + range: "last_7_days", + status: "ok", + timeout: 15, + total_seconds: 80473.135716, + total_seconds_including_other_language: 81643.570077, + user_id: "random hash", + username: "anuraghazra", + writes_only: false, + }, +}; + /** - * Creates an asymmetric matcher for approximate numeric equality. - * - * This helper is intended for use in test frameworks (e.g., Jest) where - * values need to be compared within a configurable decimal precision - * instead of strict equality. - * - * The comparison succeeds when: - * - * |actual - expected| < 10^(-precision) - * - * For example, with `precision = 3`, values must be within `0.001`. - * - * @param {number} expected The expected numeric value to compare against. - * - * @param {number} [precision=10] - * The number of decimal places of tolerance. Higher values mean stricter - * comparison. Internally converted to epsilon = 10^-precision. - * - * @returns {{ - * asymmetricMatch(actual: unknown): boolean, - * toAsymmetricMatcher(): string - * }} An object implementing Jest-style asymmetric matcher methods. - * + * Creates a mock module for @stats-organization/github-readme-stats-core. + * @param {any} mocks Mocked functions of the core module. + * @returns {any} Mocked core module. */ -export function approxNumber(expected, precision = 10) { +export function mockCore(mocks) { + const noop = () => undefined; + return { - asymmetricMatch(actual) { - if (typeof actual !== "number" || typeof expected !== "number") { - return false; - } - const epsilon = Math.pow(10, -precision); - return Math.abs(actual - expected) < epsilon; - }, - toAsymmetricMatcher() { - return `≈ ${expected} (precision ${precision})`; - }, + api: mocks.api ?? noop, + gist: mocks.gist ?? noop, + pin: mocks.pin ?? noop, + topLangs: mocks.topLangs ?? noop, + wakatime: mocks.wakatime ?? noop, + getConfig: mocks.getConfig ?? (() => mocks.config ?? {}), + renderError: ({ message }) => `render-error:${message}`, + clampValue: (value, min, max) => Math.min(Math.max(value, min), max), }; } + +/** + * Normalizes SVG code for stable test comparisons. + * @param {string} svg SVG code to normalize. + * @returns {string} Normalized SVG code. + */ +export function normalizeSvg(svg) { + const document = new DOMParser().parseFromString(svg, "image/svg+xml"); + return new XMLSerializer().serializeToString(document); +} diff --git a/apps/backend/tests/wakatime.test.js b/apps/backend/tests/wakatime.test.js index f27eec0b..e1561724 100644 --- a/apps/backend/tests/wakatime.test.js +++ b/apps/backend/tests/wakatime.test.js @@ -1,195 +1,77 @@ -import axios from "axios"; -import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; +// @ts-check -import wakatime from "../api-renamed/wakatime.js"; -import { renderWakatimeCard } from "../src/cards/wakatime.js"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const mocks = vi.hoisted(() => ({ + wakatime: vi.fn(), + storeRequest: vi.fn(), + getUserAccessByName: vi.fn(), +})); + +vi.mock("@stats-organization/github-readme-stats-core", async () => { + const { mockCore } = await import("./utils.js"); + return mockCore({ wakatime: mocks.wakatime }); +}); + +vi.mock("../src/common/database.js", () => ({ + storeRequest: mocks.storeRequest, + getUserAccessByName: mocks.getUserAccessByName, +})); + +import router from "../router.js"; import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; -import { renderError } from "../src/index.js"; -import "@testing-library/jest-dom/vitest"; - -const wakaTimeData = { - data: { - categories: [ - { - digital: "22:40", - hours: 22, - minutes: 40, - name: "Coding", - percent: 100, - text: "22 hrs 40 mins", - total_seconds: 81643.570077, - }, - ], - daily_average: 16095, - daily_average_including_other_language: 16329, - days_including_holidays: 7, - days_minus_holidays: 5, - editors: [ - { - digital: "22:40", - hours: 22, - minutes: 40, - name: "VS Code", - percent: 100, - text: "22 hrs 40 mins", - total_seconds: 81643.570077, - }, - ], - holidays: 2, - human_readable_daily_average: "4 hrs 28 mins", - human_readable_daily_average_including_other_language: "4 hrs 32 mins", - human_readable_total: "22 hrs 21 mins", - human_readable_total_including_other_language: "22 hrs 40 mins", - id: "random hash", - is_already_updating: false, - is_coding_activity_visible: true, - is_including_today: false, - is_other_usage_visible: true, - is_stuck: false, - is_up_to_date: true, - languages: [ - { - digital: "0:19", - hours: 0, - minutes: 19, - name: "Other", - percent: 1.43, - text: "19 mins", - total_seconds: 1170.434361, - }, - { - digital: "0:01", - hours: 0, - minutes: 1, - name: "TypeScript", - percent: 0.1, - text: "1 min", - total_seconds: 83.293809, - }, - { - digital: "0:00", - hours: 0, - minutes: 0, - name: "YAML", - percent: 0.07, - text: "0 secs", - total_seconds: 54.975151, - }, - ], - operating_systems: [ - { - digital: "22:40", - hours: 22, - minutes: 40, - name: "Mac", - percent: 100, - text: "22 hrs 40 mins", - total_seconds: 81643.570077, - }, - ], - percent_calculated: 100, - range: "last_7_days", - status: "ok", - timeout: 15, - total_seconds: 80473.135716, - total_seconds_including_other_language: 81643.570077, - user_id: "random hash", - username: "anuraghazra", - writes_only: false, - }, -}; - -const wakaTimeNotFoundData = { - data: { - viewer: { - gist: null, - }, - }, -}; - -const mock = new MockAdapter(axios); - -afterEach(() => { - mock.reset(); +const createRequest = (search = "") => ({ + headers: {}, + url: `/api/wakatime?${search}`, }); -describe("Test /api/wakatime", () => { - it("should test the request", async () => { - const username = "anuraghazra"; - const req = { query: { username } }; - const res = { setHeader: vi.fn(), send: vi.fn() }; - mock - .onGet( - `https://wakatime.com/api/v1/users/${username}/stats?is_including_today=true`, - ) - .reply(200, wakaTimeData); +const createResponse = () => ({ + end: vi.fn(), + setHeader: vi.fn(), +}); - await wakatime(req, res); +const defaultCacheHeader = + `max-age=${CACHE_TTL.WAKATIME_CARD.DEFAULT}, ` + + `s-maxage=${CACHE_TTL.WAKATIME_CARD.DEFAULT}, ` + + `stale-while-revalidate=${DURATIONS.ONE_DAY}`; - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderWakatimeCard(wakaTimeData.data, {}), - ); - }); +beforeEach(() => { + mocks.wakatime.mockReset(); + mocks.storeRequest.mockReset().mockResolvedValue(undefined); + mocks.getUserAccessByName.mockReset().mockResolvedValue(null); + // CACHE_SECONDS is not set here, this is just to safeguard against CACHE_SECONDS being set externally + delete process.env.CACHE_SECONDS; +}); - it("should render error if wrong locale is provided", async () => { - const username = "anuraghazra"; - const req = { query: { username, locale: "asdf" } }; - const res = { setHeader: vi.fn(), send: vi.fn() }; - mock - .onGet( - `https://wakatime.com/api/v1/users/${username}/stats?is_including_today=true`, - ) - .reply(200, wakaTimeData); +describe("Test /api/wakatime backend routing", () => { + it("happy path should pass query params, respond with wakatime content and persist request", async () => { + mocks.wakatime.mockResolvedValue({ + status: "success", + content: "mock-wakatime-svg", + }); - await wakatime(req, res); + const req = createRequest("username=anuraghazra&theme=dark&layout=compact"); + const res = createResponse(); - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledWith( - renderError({ - message: "Something went wrong", - secondaryMessage: "Language not found", - }), - ); - }); + await router(req, res); - it("should render error if user data is not accessible", async () => { - const username = "anuraghazra"; - const req = { query: { username } }; - const res = { setHeader: vi.fn(), send: vi.fn() }; - mock - .onGet( - `https://wakatime.com/api/v1/users/${username}/stats?is_including_today=true`, - ) - .reply(200, wakaTimeNotFoundData); - - await wakatime(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.send).toHaveBeenCalledTimes(1); - expect(res.send.mock.calls[0][0]).toMatchSnapshot(); - }); - - it("should have proper cache", async () => { - const username = "anuraghazra"; - const req = { query: { username } }; - const res = { setHeader: vi.fn(), send: vi.fn() }; - mock - .onGet( - `https://wakatime.com/api/v1/users/${username}/stats?is_including_today=true`, - ) - .reply(200, wakaTimeData); - - await wakatime(req, res); - - expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.setHeader).toHaveBeenCalledWith( - "Cache-Control", - `max-age=${CACHE_TTL.WAKATIME_CARD.DEFAULT}, ` + - `s-maxage=${CACHE_TTL.WAKATIME_CARD.DEFAULT}, ` + - `stale-while-revalidate=${DURATIONS.ONE_DAY}`, - ); + expect(mocks.wakatime).toHaveBeenCalledWith({ + username: "anuraghazra", + theme: "dark", + layout: "compact", + }); + expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(req.query).toEqual({ + username: "anuraghazra", + theme: "dark", + layout: "compact", + }); + expect(res.setHeader.mock.calls).toEqual([ + ["Cache-Control", defaultCacheHeader], + ["Content-Type", "image/svg+xml"], + ]); + expect(res.end).toHaveBeenCalledExactlyOnceWith("mock-wakatime-svg"); + expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); }); }); diff --git a/apps/backend/tsconfig.typecheck.json b/apps/backend/tsconfig.typecheck.json new file mode 100644 index 00000000..4c13d7b1 --- /dev/null +++ b/apps/backend/tsconfig.typecheck.json @@ -0,0 +1,7 @@ +{ + "extends": ["./tsconfig.json"], + "compilerOptions": { + "noEmit": true, + "customConditions": [] + } +} diff --git a/apps/backend/vercel.json b/apps/backend/vercel.json index 62ccb490..addf7bdd 100644 --- a/apps/backend/vercel.json +++ b/apps/backend/vercel.json @@ -1,6 +1,6 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", - "buildCommand": "cd ../../ && git clean ./apps -fx && pnpm --filter ./apps/backend/ --legacy deploy ./apps/deployment/ && mv ./apps/deployment/node_modules/ ./apps/backend/node_modules/ && ./vercel-preparation.sh", + "buildCommand": "cd ../../ && git clean ./apps -fx && pnpm run build:packages && pnpm --filter ./apps/backend/ --legacy deploy ./apps/deployment/ && mv ./apps/deployment/node_modules/ ./apps/backend/node_modules/ && ./vercel-preparation.sh", "redirects": [ { "source": "/", diff --git a/apps/backend/vitest.config.bench.ts b/apps/backend/vitest.config.bench.ts index 9fe2e73d..1f3eef9d 100644 --- a/apps/backend/vitest.config.bench.ts +++ b/apps/backend/vitest.config.bench.ts @@ -1,6 +1,9 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ + resolve: { + conditions: ["@stats/source"], + }, test: { dir: "./tests/bench", environment: "jsdom", diff --git a/apps/backend/vitest.config.e2e.ts b/apps/backend/vitest.config.e2e.ts index 0e6c6312..f7433de3 100644 --- a/apps/backend/vitest.config.e2e.ts +++ b/apps/backend/vitest.config.e2e.ts @@ -1,6 +1,9 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ + resolve: { + conditions: ["@stats/source"], + }, test: { environment: "node", dir: "tests/e2e", diff --git a/apps/backend/vitest.config.ts b/apps/backend/vitest.config.ts index 5da6c76b..54dcb613 100644 --- a/apps/backend/vitest.config.ts +++ b/apps/backend/vitest.config.ts @@ -1,32 +1,15 @@ -import { defineConfig } from "vitest/config"; +import { defineProject } from "vitest/config"; -export default defineConfig({ +export default defineProject({ + resolve: { + conditions: ["@stats/source"], + }, test: { - coverage: { - enabled: true, - }, - projects: [ - { - test: { - name: "backend/public-instance", - environment: "jsdom", - dir: "tests", - include: ["./*.test.{ts,js}", "./public-instance/*.test.{ts,js}"], - setupFiles: ["./tests/_setup.js"], - }, - }, - { - test: { - name: "backend/private-instance", - environment: "jsdom", - dir: "tests", - include: ["./*.test.{ts,js}", "./private-instance/*.test.{ts,js}"], - setupFiles: [ - "./tests/_setup.js", - "./tests/_setup.private-instance.js", - ], - }, - }, + environment: "jsdom", + include: [ + "./tests/*.test.{ts,js}", + "./tests/public-instance/*.test.{ts,js}", ], + setupFiles: ["./tests/_setup.js"], }, }); diff --git a/apps/frontend/package.json b/apps/frontend/package.json index aa6d33c5..7e3031f4 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -1,27 +1,35 @@ { - "name": "frontend", - "version": "0.1.0", - "private": true, + "name": "@stats-organization/github-readme-stats-frontend", "type": "module", + "license": "MIT", + "private": true, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "test": "vitest", + "test:e2e": "playwright test", + "lint": "eslint", + "typecheck": "tsc -p tsconfig.typecheck.json" + }, "dependencies": { - "@reduxjs/toolkit": "2.11.2", - "@tailwindcss/vite": "4.2.1", + "@reduxjs/toolkit": "^2.11.2", + "@tailwindcss/vite": "^4.2.1", "axios": "^1", "axios-cache-interceptor": "^1", - "daisyui": "5.5.19", - "emoji-name-map": "^2.0.3", - "github-username-regex": "^1.0.0", - "react": "18.3.1", - "react-dom": "18.3.1", + "daisyui": "^5.5.19", + "@stats-organization/github-readme-stats-backend": "workspace:^", + "@stats-organization/github-readme-stats-core": "workspace:^", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-icons": "^5.5.0", "react-loading-skeleton": "^3.3.1", - "react-redux": "9.2.0", + "react-redux": "^9.2.0", "react-spinners": "^0.17.0", - "react-toastify": "11.0.5", - "redux": "5.0.1", + "react-toastify": "^11.0.5", + "redux": "^5.0.1", "save-svg-as-png": "^1.4.17", - "uuid": "13.0.0", - "word-wrap": "^1.2.5" + "uuid": "^13.0.0" }, "devDependencies": { "@types/react": "18.3.27", @@ -30,19 +38,8 @@ "clsx": "2.1.1", "tailwindcss": "4.2.1", "vite": "catalog:default", - "vite-plugin-node-polyfills": "0.25.0", - "vite-plugin-string-replace": "1.1.5", "vitest": "catalog:default" }, - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview", - "test": "vitest", - "test:e2e": "playwright test", - "typecheck": "tsc --noEmit" - }, - "homepage": "/frontend", "browserslist": { "production": [ ">0.2%", diff --git a/apps/frontend/src/components/Card/SvgInline.tsx b/apps/frontend/src/components/Card/SvgInline.tsx index 7c85a010..2834864e 100644 --- a/apps/frontend/src/components/Card/SvgInline.tsx +++ b/apps/frontend/src/components/Card/SvgInline.tsx @@ -1,3 +1,5 @@ +// @ts-expect-error type info should be added later +import { router } from "@stats-organization/github-readme-stats-backend"; import axios from "axios"; import { useEffect, useRef, useState } from "react"; import type { JSX } from "react"; @@ -5,8 +7,6 @@ import Skeleton from "react-loading-skeleton"; import "react-loading-skeleton/dist/skeleton.css"; import { setShouldMock } from "../../axios-override.js"; -// @ts-expect-error will be solved by npm package -import { default as router } from "../../backend/.vercel/output/functions/api.func/router.js"; import { createMockRequest, createMockResponse } from "../../mock-http.js"; import { useIsAuthenticated, diff --git a/apps/frontend/src/constants.ts b/apps/frontend/src/constants.ts index 79c02da9..e3328ed2 100644 --- a/apps/frontend/src/constants.ts +++ b/apps/frontend/src/constants.ts @@ -13,10 +13,10 @@ const REDIRECT_URI = `https://${HOST}/frontend`; export const GITHUB_PRIVATE_AUTH_URL = `https://github.com/login/oauth/authorize?scope=user,repo&client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}?mode=private`; export const GITHUB_PUBLIC_AUTH_URL = `https://github.com/login/oauth/authorize?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}?mode=public`; -export const DEMO_USER = "anuraghazra"; -export const DEMO_REPO = "anuraghazra/github-readme-stats"; -export const DEMO_GIST = "bbfce31e0217a3689c8d961a356cb10d"; -export const DEMO_WAKATIME_USER = "alan"; +export const DEMO_USER = "anuraghazra" as string; +export const DEMO_REPO = "anuraghazra/github-readme-stats" as string; +export const DEMO_GIST = "bbfce31e0217a3689c8d961a356cb10d" as string; +export const DEMO_WAKATIME_USER = "alan" as string; window.process = { env: { diff --git a/apps/frontend/src/pages/Home/Home.tsx b/apps/frontend/src/pages/Home/Home.tsx index e73cb397..a7b0b665 100644 --- a/apps/frontend/src/pages/Home/Home.tsx +++ b/apps/frontend/src/pages/Home/Home.tsx @@ -48,7 +48,7 @@ export function HomeScreen({ stage, setStage }: HomeScreenProps): JSX.Element { const dispatch = useDispatch(); // for stage two - const [selectedUserId, setSelectedUserId] = useState(userId); + const [selectedUserId, setSelectedUserId] = useState(userId); const [repo, setRepo] = useState(DEMO_REPO); const [gist, setGist] = useState(DEMO_GIST); const [wakatimeUser, setWakatimeUser] = useState(DEMO_WAKATIME_USER); diff --git a/apps/frontend/src/pages/Home/stages/Theme.tsx b/apps/frontend/src/pages/Home/stages/Theme.tsx index 247d8caf..23797cf3 100644 --- a/apps/frontend/src/pages/Home/stages/Theme.tsx +++ b/apps/frontend/src/pages/Home/stages/Theme.tsx @@ -1,21 +1,8 @@ +import { themes } from "@stats-organization/github-readme-stats-core"; import type { JSX } from "react"; -// @ts-expect-error this will be provided by the npm package -import { themes } from "../../../backend/themes/index"; import { Card } from "../../../components/Card/Card"; -// to be removed once npm package has been created -type ThemeData = Record< - string, - { - title_color: string; - icon_color: string; - text_color: string; - bg_color: string; - border_color: string; - } ->; - const excludedThemes = [ "merko", "blue-green", @@ -25,10 +12,9 @@ const excludedThemes = [ "holi", ]; -const themeList = Object.keys( - /* Needed until themes is typed correctly and retrieved from npm package */ - themes as ThemeData, -).filter((myTheme) => !excludedThemes.includes(myTheme)); +const themeList = Object.keys(themes).filter( + (myTheme) => !excludedThemes.includes(myTheme), +); interface ThemeStageProps { fullSuffix: string; diff --git a/apps/frontend/tsconfig.typecheck.json b/apps/frontend/tsconfig.typecheck.json new file mode 100644 index 00000000..4c13d7b1 --- /dev/null +++ b/apps/frontend/tsconfig.typecheck.json @@ -0,0 +1,7 @@ +{ + "extends": ["./tsconfig.json"], + "compilerOptions": { + "noEmit": true, + "customConditions": [] + } +} diff --git a/apps/frontend/vercel.json b/apps/frontend/vercel.json index 138025f9..6ed94648 100644 --- a/apps/frontend/vercel.json +++ b/apps/frontend/vercel.json @@ -1,6 +1,6 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", - "installCommand": "cd ../../ && git clean ./apps -fx && pnpm install && rm -rf ./apps/frontend/node_modules && ./vercel-preparation.sh && pnpm --filter ./apps/frontend/ --legacy deploy ./apps/deployment/ && mv ./apps/deployment/node_modules/ ./apps/frontend/node_modules/", + "installCommand": "cd ../../ && git clean ./apps -fx && pnpm install && pnpm run build:packages && rm -rf ./apps/frontend/node_modules && pnpm --filter ./apps/frontend/ --legacy deploy ./apps/deployment/ && mv ./apps/deployment/node_modules/ ./apps/frontend/node_modules/", "buildCommand": "pnpm run build", "outputDirectory": "build" } diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts index b6c6e152..da01ed72 100644 --- a/apps/frontend/vite.config.ts +++ b/apps/frontend/vite.config.ts @@ -2,57 +2,12 @@ import path from "node:path"; import tailwindcss from "@tailwindcss/vite"; import react from "@vitejs/plugin-react-swc"; -import { nodePolyfills } from "vite-plugin-node-polyfills"; -import StringReplace from "vite-plugin-string-replace"; -import { defineConfig } from "vitest/config"; +import { defineProject } from "vitest/config"; // https://vitejs.dev/config/ -export default defineConfig({ +export default defineProject({ base: "/frontend/", - plugins: [ - StringReplace([ - { - search: "process.env", - replace: "window.process.env", - fileName: ".*backend.*", - }, - ]), - nodePolyfills({ - include: [ - "path", - "querystring", - "url", - "http", - "util", - "stream", - "buffer", - ], - exclude: ["fs", "net"], - }), - - react(), - tailwindcss(), - - /** - * mock pg (postgres) package in the browser to avoid runtime errors - * @see apps/backend/src/common/database.js - */ - { - name: "empty-pg-package", - resolveId(id) { - if (id === "pg") { - return id; - } - return undefined; - }, - load(id) { - if (id === "pg") { - return "export class Pool { constructor(config) {} }"; - } - return undefined; - }, - }, - ], + plugins: [react(), tailwindcss()], build: { outDir: "build", sourcemap: true, @@ -61,6 +16,7 @@ export default defineConfig({ chunkSizeWarningLimit: 800, }, resolve: { + conditions: ["@stats/source"], alias: [ { find: "../src/fetchers/wakatime.js", @@ -72,7 +28,7 @@ export default defineConfig({ ], }, test: { - dir: "./src", + dir: path.join(import.meta.dirname, "./src"), exclude: ["**/backend/**"], }, }); diff --git a/docs/advanced_documentation.md b/docs/advanced_documentation.md index 10965e45..bd2e7877 100644 --- a/docs/advanced_documentation.md +++ b/docs/advanced_documentation.md @@ -76,7 +76,7 @@ GitHub Stats Extended comes with several built-in themes (e.g. `dark`, `radical` GitHub Stats Extended Themes -You can look at a preview for [all available themes](../backend/themes/README.md) or checkout the [theme config file](../backend/themes/index.js). Please note that we paused the addition of new themes to decrease maintenance efforts; all pull requests related to new themes will be closed. +You can look at a preview for [all available themes](../packages/core/src/themes/README.md) or checkout the [theme config file](../packages/core/src/themes/index.js). Please note that we paused the addition of new themes to decrease maintenance efforts; all pull requests related to new themes will be closed. #### Responsive Card Theme @@ -102,7 +102,7 @@ We have included a `transparent` theme that has a transparent background. This t ##### Add transparent alpha channel to a themes bg\_color -You can use the `bg_color` parameter to make any of [the available themes](../backend/themes/README.md) transparent. This is done by setting the `bg_color` to a color with a transparent alpha channel (i.e. `bg_color=00000000`): +You can use the `bg_color` parameter to make any of [the available themes](../packages/core/src/themes/README.md) transparent. This is done by setting the `bg_color` to a color with a transparent alpha channel (i.e. `bg_color=00000000`): ```md ![Anurag's GitHub stats](https://github-stats-extended.vercel.app/api?username=anuraghazra&show_icons=true&bg_color=00000000) @@ -181,7 +181,7 @@ You can customize the appearance of all your cards however you wish with URL par | `border_color` | Card's border color. Does not apply when `hide_border` is enabled. | string (hex color) | `e4e2e2` | | `bg_color` | Card's background color. | string (hex color or a gradient in the form of *angle,start,end*) | `fffefe` | | `hide_border` | Hides the card's border. | boolean | `false` | -| `theme` | Name of the theme, choose from [all available themes](../backend/themes/README.md). | enum | `default` | +| `theme` | Name of the theme, choose from [all available themes](../packages/core/src/themes/README.md). | enum | `default` | | `cache_seconds` | Sets the cache header manually (min: 21600, max: 86400). | integer | `21600` | | `locale` | Sets the language in the card, you can check full list of available locales [here](#available-locales). | enum | `en` | | `border_radius` | Corner rounding on the card. | number | `4.5` | diff --git a/docs/deploy.md b/docs/deploy.md index a837d1ec..637cb46a 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -123,6 +123,7 @@ Click on the deploy button to get started! 13. optional: add an SQL database; by using e.g. the ["Nile" integration](https://vercel.com/marketplace/nile) or by manually setting the environment variable `POSTGRES_URL` 14. optional: [create your own OAuth App](https://github.com/settings/developers) and set environment variables `OAUTH_REDIRECT_URI`, `OAUTH_CLIENT_ID` and `OAUTH_CLIENT_SECRET` on Vercel accordingly 15. optional: in addition to the Vercel project based on the `apps/backend` folder, create a second project based on the `apps/frontend` folder. No environment variables needed. +16. optional: set the environment variable `TURBO_PLATFORM_ENV_DISABLED` to `true` to disable the build-time warning from [turbo](https://turborepo.dev/) about environment variables missing from "turbo.json" - This warning is not relevant in our project. diff --git a/eslint.config.js b/eslint.config.js index b1b9de20..270d6cbb 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -3,6 +3,7 @@ import { fileURLToPath } from "node:url"; import { includeIgnoreFile } from "@eslint/compat"; import js from "@eslint/js"; import { defineConfig } from "eslint/config"; +import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript"; import { importX } from "eslint-plugin-import-x"; import { default as jsdoc } from "eslint-plugin-jsdoc"; import react from "eslint-plugin-react"; @@ -18,6 +19,25 @@ export default defineConfig( { extends: [importX.flatConfigs.recommended, importX.flatConfigs.typescript], + settings: { + "import-x/resolver-next": [ + createTypeScriptImportResolver({ + conditionNames: [ + /** Keep in sync with `tsconfig.base.json#customConditions` */ + "@stats/source", + + "types", + "import", + + "require", + "node", + "node-addons", + "browser", + "default", + ], + }), + ], + }, rules: { "import-x/consistent-type-specifier-style": ["error", "prefer-top-level"], "import-x/order": [ diff --git a/knip.jsonc b/knip.jsonc index 5de96712..1980b45b 100644 --- a/knip.jsonc +++ b/knip.jsonc @@ -2,21 +2,10 @@ "$schema": "./node_modules/knip/schema.json", "workspaces": { "apps/backend": { - "entry": ["api-renamed/*.js", "express.js", "tests/bench/*.bench.js"], - "ignoreFiles": [ - "_dot_vercel_copy/**/*" // Hopefully by using a npm package this file will be removed - ] + "entry": ["api-renamed/*.js", "express.js", "tests/bench/*.bench.js"] }, "apps/frontend": { - "entry": ["src/wakatime-override.ts"], - - "ignoreDependencies": [ - // below dependencies are added because backend folder is copied inside frontend folder, - // so some of his dependencies must be present here - "github-username-regex", - "emoji-name-map", - "word-wrap" - ] + "entry": ["src/wakatime-override.ts"] } } } diff --git a/package.json b/package.json index b0ed2b1c..53e0d770 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,44 @@ { - "name": "root", + "name": "@stats-organization/root", "private": true, "type": "module", - "packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017", + "packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319", "devDependencies": { - "@eslint/compat": "2.0.2", - "@eslint/js": "9.39.3", - "@playwright/test": "1.58.2", - "@types/node": "24.10.13", - "eslint": "9.39.2", + "@eslint/compat": "2.0.3", + "@eslint/js": "10.0.1", + "@playwright/test": "1.59.1", + "@types/node": "24.12.0", + "@vitest/coverage-v8": "catalog:default", + "eslint": "10.1.0", "eslint-import-resolver-typescript": "4.4.4", - "eslint-plugin-import-x": "4.16.1", - "eslint-plugin-jsdoc": "62.7.1", + "eslint-plugin-import-x": "4.16.2", + "eslint-plugin-jsdoc": "62.9.0", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", - "globals": "17.3.0", + "globals": "17.4.0", "husky": "9.1.7", - "knip": "5.85.0", - "lint-staged": "16.2.7", + "knip": "6.2.0", + "lint-staged": "16.4.0", "prettier": "3.8.1", + "turbo": "2.9.3", "typescript": "5.9.3", - "typescript-eslint": "8.56.1" + "typescript-eslint": "8.58.0", + "vitest": "catalog:default" }, "scripts": { "prepare": "husky", + "build:packages": "turbo run build --filter=./packages/*", + "build:frontend": "turbo run build --filter=./apps/frontend", + "dev:frontend": "pnpm run --filter=./apps/frontend dev", + "test": "vitest", + "test:coverage": "vitest --config vitest.config.coverage.ts", "format": "prettier --write .", "format:check": "prettier --check .", - "lint": "eslint", - "lint:fix": "eslint --fix", + "lint": "turbo run lint", + "lint:eslint": "eslint", + "lint:eslint:fix": "eslint --fix", "lint:knip": "knip", - "typecheck": "tsc --build --noEmit" + "typecheck": "turbo run typecheck" }, "lint-staged": { "*.{js,jsx,ts,tsx,css,json,jsonc,yaml,yml}": "prettier --write" diff --git a/apps/backend/codecov.yml b/packages/core/codecov.yml similarity index 100% rename from apps/backend/codecov.yml rename to packages/core/codecov.yml diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 00000000..e9e10e70 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,94 @@ +{ + "name": "@stats-organization/github-readme-stats-core", + "version": "2.0.0", + "type": "module", + "homepage": "https://github-stats-extended.vercel.app/frontend", + "bugs": { + "url": "https://github.com/stats-organization/github-stats-extended/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/stats-organization/github-stats-extended.git", + "directory": "packages/core" + }, + "author": { + "name": "Anurag Hazra", + "url": "https://github.com/anuraghazra/" + }, + "contributors": [ + { + "name": "Rick Staa", + "url": "https://github.com/rickstaa" + }, + { + "name": "Alexandr Garbuzov", + "url": "https://github.com/qwerty541" + }, + { + "name": "Abhijit Gupta", + "url": "https://github.com/avgupta456" + }, + { + "name": "Marco Pasqualetti", + "url": "https://github.com/marcalexiei" + }, + { + "name": "martin-mfg", + "url": "https://github.com/martin-mfg" + } + ], + "license": "MIT", + "engines": { + "node": "24.x" + }, + "description": "Dynamically generate stats for your GitHub readme", + "keywords": [ + "github-readme-stats", + "readme-stats", + "cards", + "card-generator", + "github-stats", + "github-stats-extended", + "github-readme-stats-extended" + ], + "main": "./build/index.js", + "exports": { + ".": { + "@stats/source": "./src/index.ts", + "default": "./build/index.js" + } + }, + "files": [ + "build", + "src" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "tsc -p tsconfig.build.json", + "test": "vitest", + "test:update:snapshot": "vitest -u", + "test:e2e": "vitest --config vitest.config.e2e.ts", + "bench": "vitest bench --run --config vitest.config.bench.ts", + "lint": "eslint", + "typecheck": "tsc -p tsconfig.typecheck.json", + "theme-readme-gen": "node scripts/generate-theme-doc", + "generate-langs-json": "node scripts/generate-langs-json" + }, + "devDependencies": { + "@testing-library/dom": "10.4.1", + "@testing-library/jest-dom": "6.9.1", + "@uppercod/css-to-object": "1.1.1", + "axios-mock-adapter": "2.1.0", + "js-yaml": "4.1.1", + "jsdom": "28.1.0", + "vitest": "catalog:default" + }, + "dependencies": { + "axios": "^1.13.5", + "emoji-name-map": "^2.0.3", + "github-username-regex": "^1.0.0", + "word-wrap": "^1.2.5" + } +} diff --git a/apps/backend/scripts/generate-langs-json.js b/packages/core/scripts/generate-langs-json.js similarity index 100% rename from apps/backend/scripts/generate-langs-json.js rename to packages/core/scripts/generate-langs-json.js diff --git a/apps/backend/scripts/generate-theme-doc.js b/packages/core/scripts/generate-theme-doc.js similarity index 96% rename from apps/backend/scripts/generate-theme-doc.js rename to packages/core/scripts/generate-theme-doc.js index 93c8e6a7..afd4b1b3 100644 --- a/apps/backend/scripts/generate-theme-doc.js +++ b/packages/core/scripts/generate-theme-doc.js @@ -1,8 +1,8 @@ import fs from "fs"; -import { themes } from "../themes/index.js"; +import { themes } from "../src/themes/index.js"; -const TARGET_FILE = "./themes/README.md"; +const TARGET_FILE = "./src/themes/README.md"; const REPO_CARD_LINKS_FLAG = ""; const STAT_CARD_LINKS_FLAG = ""; diff --git a/packages/core/src/api/gist.js b/packages/core/src/api/gist.js new file mode 100644 index 00000000..ebce051e --- /dev/null +++ b/packages/core/src/api/gist.js @@ -0,0 +1,97 @@ +// @ts-check + +import { renderGistCard } from "../cards/gist.js"; +import { + MissingParamError, + retrieveSecondaryMessage, +} from "../common/error.js"; +import { parseBoolean } from "../common/ops.js"; +import { renderError } from "../common/render.js"; +import { fetchGist } from "../fetchers/gist.js"; +import { isLocaleAvailable } from "../translations.js"; + +// @ts-ignore +export default async ( + { + id, + title_color, + icon_color, + text_color, + bg_color, + theme, + locale, + border_radius, + border_color, + show_owner, + hide_border, + }, + pat = null, +) => { + if (locale && !isLocaleAvailable(locale)) { + return { + status: "error - permanent", + content: renderError({ + message: "Something went wrong", + secondaryMessage: "Language not found", + renderOptions: { + title_color, + text_color, + bg_color, + border_color, + theme, + }, + }), + }; + } + + try { + const gistData = await fetchGist(id, pat); + + return { + status: "success", + content: renderGistCard(gistData, { + title_color, + icon_color, + text_color, + bg_color, + theme, + border_radius, + border_color, + locale: locale ? locale.toLowerCase() : null, + show_owner: parseBoolean(show_owner), + hide_border: parseBoolean(hide_border), + }), + }; + } catch (err) { + if (err instanceof Error) { + return { + status: "error - temporary", + content: renderError({ + message: err.message, + secondaryMessage: retrieveSecondaryMessage(err), + renderOptions: { + title_color, + text_color, + bg_color, + border_color, + theme, + show_repo_link: !(err instanceof MissingParamError), + }, + }), + }; + } + return { + status: "error - temporary", + content: renderError({ + message: "An unknown error occurred", + renderOptions: { + title_color, + text_color, + bg_color, + border_color, + theme, + }, + }), + }; + } +}; diff --git a/apps/backend/api-renamed/index.js b/packages/core/src/api/index.js similarity index 71% rename from apps/backend/api-renamed/index.js rename to packages/core/src/api/index.js index 55ac2e72..5709e30a 100644 --- a/apps/backend/api-renamed/index.js +++ b/packages/core/src/api/index.js @@ -1,26 +1,18 @@ // @ts-check -import { renderStatsCard } from "../src/cards/stats.js"; -import { guardAccess } from "../src/common/access.js"; -import { - CACHE_TTL, - resolveCacheSeconds, - setCacheHeaders, - setErrorCacheHeaders, -} from "../src/common/cache.js"; -import { storeRequest } from "../src/common/database.js"; +import { renderStatsCard } from "../cards/stats.js"; import { MissingParamError, retrieveSecondaryMessage, -} from "../src/common/error.js"; -import { parseArray, parseBoolean } from "../src/common/ops.js"; -import { renderError } from "../src/common/render.js"; -import { fetchStats } from "../src/fetchers/stats.js"; -import { isLocaleAvailable } from "../src/translations.js"; +} from "../common/error.js"; +import { parseArray, parseBoolean } from "../common/ops.js"; +import { renderError } from "../common/render.js"; +import { fetchStats } from "../fetchers/stats.js"; +import { isLocaleAvailable } from "../translations.js"; // @ts-ignore -export default async (req, res) => { - const { +export default async ( + { username, repo, owner, @@ -40,7 +32,6 @@ export default async (req, res) => { text_bold, bg_color, theme, - cache_seconds, exclude_repo, custom_title, locale, @@ -52,28 +43,13 @@ export default async (req, res) => { border_color, rank_icon, show, - } = req.query; - res.setHeader("Content-Type", "image/svg+xml"); - - const access = guardAccess({ - res, - id: username, - type: "username", - colors: { - title_color, - text_color, - bg_color, - border_color, - theme, - }, - }); - if (!access.isPassed) { - return access.result; - } - + }, + pat = null, +) => { if (locale && !isLocaleAvailable(locale)) { - return res.send( - renderError({ + return { + status: "error - permanent", + content: renderError({ message: "Something went wrong", secondaryMessage: "Language not found", renderOptions: { @@ -84,7 +60,7 @@ export default async (req, res) => { theme, }, }), - ); + }; } const safePattern = /^[-\w/.,]+$/; @@ -93,8 +69,9 @@ export default async (req, res) => { (repo && !safePattern.test(repo)) || (owner && !safePattern.test(owner)) ) { - return res.send( - renderError({ + return { + status: "error - permanent", + content: renderError({ message: "Something went wrong", secondaryMessage: "Username, repository or owner contains unsafe characters", @@ -106,11 +83,10 @@ export default async (req, res) => { theme, }, }), - ); + }; } try { - await storeRequest(req); const showStats = parseArray(show); const repoOwner = parseArray(owner); let repository = parseArray(repo); @@ -135,18 +111,12 @@ export default async (req, res) => { showStats.includes("issues_authored"), showStats.includes("issues_commented"), parseArray(role), + pat, ); - const cacheSeconds = resolveCacheSeconds({ - requested: parseInt(cache_seconds, 10), - def: CACHE_TTL.STATS_CARD.DEFAULT, - min: CACHE_TTL.STATS_CARD.MIN, - max: CACHE_TTL.STATS_CARD.MAX, - }); - setCacheHeaders(res, cacheSeconds); - - return res.send( - renderStatsCard( + return { + status: "success", + content: renderStatsCard( stats, { hide: parseArray(hide), @@ -179,12 +149,12 @@ export default async (req, res) => { repository, repoOwner, ), - ); + }; } catch (err) { - setErrorCacheHeaders(res); if (err instanceof Error) { - return res.send( - renderError({ + return { + status: "error - temporary", + content: renderError({ message: err.message, secondaryMessage: retrieveSecondaryMessage(err), renderOptions: { @@ -196,10 +166,11 @@ export default async (req, res) => { show_repo_link: !(err instanceof MissingParamError), }, }), - ); + }; } - return res.send( - renderError({ + return { + status: "error - temporary", + content: renderError({ message: "An unknown error occurred", renderOptions: { title_color, @@ -209,6 +180,6 @@ export default async (req, res) => { theme, }, }), - ); + }; } }; diff --git a/apps/backend/api-renamed/pin.js b/packages/core/src/api/pin.js similarity index 63% rename from apps/backend/api-renamed/pin.js rename to packages/core/src/api/pin.js index b79a74f6..77107373 100644 --- a/apps/backend/api-renamed/pin.js +++ b/packages/core/src/api/pin.js @@ -1,26 +1,18 @@ // @ts-check -import { renderRepoCard } from "../src/cards/repo.js"; -import { guardAccess } from "../src/common/access.js"; -import { - CACHE_TTL, - resolveCacheSeconds, - setCacheHeaders, - setErrorCacheHeaders, -} from "../src/common/cache.js"; -import { storeRequest } from "../src/common/database.js"; +import { renderRepoCard } from "../cards/repo.js"; import { MissingParamError, retrieveSecondaryMessage, -} from "../src/common/error.js"; -import { parseArray, parseBoolean } from "../src/common/ops.js"; -import { renderError } from "../src/common/render.js"; -import { fetchRepo } from "../src/fetchers/repo.js"; -import { isLocaleAvailable } from "../src/translations.js"; +} from "../common/error.js"; +import { parseArray, parseBoolean } from "../common/ops.js"; +import { renderError } from "../common/render.js"; +import { fetchRepo } from "../fetchers/repo.js"; +import { isLocaleAvailable } from "../translations.js"; // @ts-ignore -export default async (req, res) => { - const { +export default async ( + { username, repo, hide_border, @@ -36,34 +28,17 @@ export default async (req, res) => { number_format, text_bold, line_height, - cache_seconds, locale, border_radius, border_color, description_lines_count, - } = req.query; - - res.setHeader("Content-Type", "image/svg+xml"); - - const access = guardAccess({ - res, - id: username, - type: "username", - colors: { - title_color, - text_color, - bg_color, - border_color, - theme, - }, - }); - if (!access.isPassed) { - return access.result; - } - + }, + pat = null, +) => { if (locale && !isLocaleAvailable(locale)) { - return res.send( - renderError({ + return { + status: "error - permanent", + content: renderError({ message: "Something went wrong", secondaryMessage: "Language not found", renderOptions: { @@ -74,7 +49,7 @@ export default async (req, res) => { theme, }, }), - ); + }; } const safePattern = /^[-\w/.,]+$/; @@ -82,8 +57,9 @@ export default async (req, res) => { (username && !safePattern.test(username)) || (repo && !safePattern.test(repo)) ) { - return res.send( - renderError({ + return { + status: "error - permanent", + content: renderError({ message: "Something went wrong", secondaryMessage: "Username or repository contains unsafe characters", renderOptions: { @@ -94,11 +70,10 @@ export default async (req, res) => { theme, }, }), - ); + }; } try { - await storeRequest(req); const showStats = parseArray(show); const repoData = await fetchRepo( username, @@ -108,19 +83,12 @@ export default async (req, res) => { showStats.includes("prs_reviewed"), showStats.includes("issues_authored"), showStats.includes("issues_commented"), + pat, ); - const cacheSeconds = resolveCacheSeconds({ - requested: parseInt(cache_seconds, 10), - def: CACHE_TTL.PIN_CARD.DEFAULT, - min: CACHE_TTL.PIN_CARD.MIN, - max: CACHE_TTL.PIN_CARD.MAX, - }); - - setCacheHeaders(res, cacheSeconds); - - return res.send( - renderRepoCard(repoData, { + return { + status: "success", + content: renderRepoCard(repoData, { hide_border: parseBoolean(hide_border), title_color, icon_color, @@ -140,12 +108,12 @@ export default async (req, res) => { locale: locale ? locale.toLowerCase() : null, description_lines_count, }), - ); + }; } catch (err) { - setErrorCacheHeaders(res); if (err instanceof Error) { - return res.send( - renderError({ + return { + status: "error - temporary", + content: renderError({ message: err.message, secondaryMessage: retrieveSecondaryMessage(err), renderOptions: { @@ -157,10 +125,11 @@ export default async (req, res) => { show_repo_link: !(err instanceof MissingParamError), }, }), - ); + }; } - return res.send( - renderError({ + return { + status: "error - temporary", + content: renderError({ message: "An unknown error occurred", renderOptions: { title_color, @@ -170,6 +139,6 @@ export default async (req, res) => { theme, }, }), - ); + }; } }; diff --git a/apps/backend/api-renamed/top-langs.js b/packages/core/src/api/top-langs.js similarity index 64% rename from apps/backend/api-renamed/top-langs.js rename to packages/core/src/api/top-langs.js index 056193c8..4972b6fd 100644 --- a/apps/backend/api-renamed/top-langs.js +++ b/packages/core/src/api/top-langs.js @@ -1,26 +1,18 @@ // @ts-check -import { renderTopLanguages } from "../src/cards/top-languages.js"; -import { guardAccess } from "../src/common/access.js"; -import { - CACHE_TTL, - resolveCacheSeconds, - setCacheHeaders, - setErrorCacheHeaders, -} from "../src/common/cache.js"; -import { storeRequest } from "../src/common/database.js"; +import { renderTopLanguages } from "../cards/top-languages.js"; import { MissingParamError, retrieveSecondaryMessage, -} from "../src/common/error.js"; -import { parseArray, parseBoolean } from "../src/common/ops.js"; -import { renderError } from "../src/common/render.js"; -import { fetchTopLanguages } from "../src/fetchers/top-languages.js"; -import { isLocaleAvailable } from "../src/translations.js"; +} from "../common/error.js"; +import { parseArray, parseBoolean } from "../common/ops.js"; +import { renderError } from "../common/render.js"; +import { fetchTopLanguages } from "../fetchers/top-languages.js"; +import { isLocaleAvailable } from "../translations.js"; // @ts-ignore -export default async (req, res) => { - const { +export default async ( + { username, hide, hide_title, @@ -31,7 +23,6 @@ export default async (req, res) => { bg_color, prog_bar_bg_color, theme, - cache_seconds, layout, langs_count, exclude_repo, @@ -45,28 +36,13 @@ export default async (req, res) => { disable_animations, hide_progress, stats_format, - } = req.query; - res.setHeader("Content-Type", "image/svg+xml"); - - const access = guardAccess({ - res, - id: username, - type: "username", - colors: { - title_color, - text_color, - bg_color, - border_color, - theme, - }, - }); - if (!access.isPassed) { - return access.result; - } - + }, + pat = null, +) => { if (locale && !isLocaleAvailable(locale)) { - return res.send( - renderError({ + return { + status: "error - permanent", + content: renderError({ message: "Something went wrong", secondaryMessage: "Locale not found", renderOptions: { @@ -77,7 +53,7 @@ export default async (req, res) => { theme, }, }), - ); + }; } if ( @@ -85,8 +61,9 @@ export default async (req, res) => { (typeof layout !== "string" || !["compact", "normal", "donut", "donut-vertical", "pie"].includes(layout)) ) { - return res.send( - renderError({ + return { + status: "error - permanent", + content: renderError({ message: "Something went wrong", secondaryMessage: "Incorrect layout input", renderOptions: { @@ -97,7 +74,7 @@ export default async (req, res) => { theme, }, }), - ); + }; } if ( @@ -105,8 +82,9 @@ export default async (req, res) => { (typeof stats_format !== "string" || !["bytes", "percentages"].includes(stats_format)) ) { - return res.send( - renderError({ + return { + status: "error - permanent", + content: renderError({ message: "Something went wrong", secondaryMessage: "Incorrect stats_format input", renderOptions: { @@ -117,29 +95,22 @@ export default async (req, res) => { theme, }, }), - ); + }; } try { - await storeRequest(req); const topLangs = await fetchTopLanguages( username, parseArray(exclude_repo), size_weight, count_weight, parseArray(role), + pat, ); - const cacheSeconds = resolveCacheSeconds({ - requested: parseInt(cache_seconds, 10), - def: CACHE_TTL.TOP_LANGS_CARD.DEFAULT, - min: CACHE_TTL.TOP_LANGS_CARD.MIN, - max: CACHE_TTL.TOP_LANGS_CARD.MAX, - }); - setCacheHeaders(res, cacheSeconds); - - return res.send( - renderTopLanguages(topLangs, { + return { + status: "success", + content: renderTopLanguages(topLangs, { custom_title, hide_title: parseBoolean(hide_title), hide_border: parseBoolean(hide_border), @@ -159,12 +130,12 @@ export default async (req, res) => { hide_progress: parseBoolean(hide_progress), stats_format, }), - ); + }; } catch (err) { - setErrorCacheHeaders(res); if (err instanceof Error) { - return res.send( - renderError({ + return { + status: "error - temporary", + content: renderError({ message: err.message, secondaryMessage: retrieveSecondaryMessage(err), renderOptions: { @@ -176,10 +147,11 @@ export default async (req, res) => { show_repo_link: !(err instanceof MissingParamError), }, }), - ); + }; } - return res.send( - renderError({ + return { + status: "error - temporary", + content: renderError({ message: "An unknown error occurred", renderOptions: { title_color, @@ -189,6 +161,6 @@ export default async (req, res) => { theme, }, }), - ); + }; } }; diff --git a/packages/core/src/api/wakatime.js b/packages/core/src/api/wakatime.js new file mode 100644 index 00000000..eaf02daf --- /dev/null +++ b/packages/core/src/api/wakatime.js @@ -0,0 +1,113 @@ +// @ts-check + +import { renderWakatimeCard } from "../cards/wakatime.js"; +import { + MissingParamError, + retrieveSecondaryMessage, +} from "../common/error.js"; +import { parseArray, parseBoolean } from "../common/ops.js"; +import { renderError } from "../common/render.js"; +import { fetchWakatimeStats } from "../fetchers/wakatime.js"; +import { isLocaleAvailable } from "../translations.js"; + +// @ts-ignore +export default async ({ + username, + title_color, + icon_color, + hide_border, + card_width, + line_height, + text_color, + bg_color, + theme, + hide_title, + hide_progress, + custom_title, + locale, + layout, + langs_count, + hide, + api_domain, + border_radius, + border_color, + display_format, + disable_animations, +}) => { + if (locale && !isLocaleAvailable(locale)) { + return { + status: "error - permanent", + content: renderError({ + message: "Something went wrong", + secondaryMessage: "Language not found", + renderOptions: { + title_color, + text_color, + bg_color, + border_color, + theme, + }, + }), + }; + } + + try { + const stats = await fetchWakatimeStats({ username, api_domain }); + + return { + status: "success", + content: renderWakatimeCard(stats, { + custom_title, + hide_title: parseBoolean(hide_title), + hide_border: parseBoolean(hide_border), + card_width: parseInt(card_width, 10), + hide: parseArray(hide), + line_height, + title_color, + icon_color, + text_color, + bg_color, + theme, + hide_progress, + border_radius, + border_color, + locale: locale ? locale.toLowerCase() : null, + layout, + langs_count, + display_format, + disable_animations: parseBoolean(disable_animations), + }), + }; + } catch (err) { + if (err instanceof Error) { + return { + status: "error - temporary", + content: renderError({ + message: err.message, + secondaryMessage: retrieveSecondaryMessage(err), + renderOptions: { + title_color, + text_color, + bg_color, + border_color, + theme, + show_repo_link: !(err instanceof MissingParamError), + }, + }), + }; + } + return { + status: "error - temporary", + content: renderError({ + message: "An unknown error occurred", + renderOptions: { + title_color, + text_color, + bg_color, + border_color, + theme, + }, + }), + }; + } +}; diff --git a/apps/backend/src/calculateRank.js b/packages/core/src/calculateRank.js similarity index 100% rename from apps/backend/src/calculateRank.js rename to packages/core/src/calculateRank.js diff --git a/apps/backend/src/cards/gist.js b/packages/core/src/cards/gist.js similarity index 100% rename from apps/backend/src/cards/gist.js rename to packages/core/src/cards/gist.js diff --git a/apps/backend/src/cards/repo.js b/packages/core/src/cards/repo.js similarity index 100% rename from apps/backend/src/cards/repo.js rename to packages/core/src/cards/repo.js diff --git a/apps/backend/src/cards/stats.js b/packages/core/src/cards/stats.js similarity index 99% rename from apps/backend/src/cards/stats.js rename to packages/core/src/cards/stats.js index 09aef286..940271a3 100644 --- a/apps/backend/src/cards/stats.js +++ b/packages/core/src/cards/stats.js @@ -233,7 +233,7 @@ const getStyles = ({ transform: rotate(-90deg); animation: rankAnimation 1s forwards ease-in-out; } - ${process.env.NODE_ENV === "test" ? "" : getProgressAnimation({ progress })} + ${getProgressAnimation({ progress })} `; }; diff --git a/apps/backend/src/cards/top-languages.js b/packages/core/src/cards/top-languages.js similarity index 99% rename from apps/backend/src/cards/top-languages.js rename to packages/core/src/cards/top-languages.js index 85739c46..4b91a739 100644 --- a/apps/backend/src/cards/top-languages.js +++ b/packages/core/src/cards/top-languages.js @@ -647,7 +647,7 @@ const renderPieLayout = (langs, totalLanguageSize, statsFormat) => { const createDonutPaths = (cx, cy, radius, percentages) => { const paths = []; let startAngle = 0; - let endAngle = 0; + let endAngle; const totalPercent = percentages.reduce((acc, curr) => acc + curr, 0); for (let i = 0; i < percentages.length; i++) { @@ -840,7 +840,7 @@ const renderTopLanguages = (topLangs, options = {}) => { theme, }); - let finalLayout = ""; + let finalLayout; if (langs.length === 0) { height = COMPACT_LAYOUT_BASE_HEIGHT; finalLayout = noLanguagesDataNode({ diff --git a/apps/backend/src/cards/types.d.ts b/packages/core/src/cards/types.d.ts similarity index 88% rename from apps/backend/src/cards/types.d.ts rename to packages/core/src/cards/types.d.ts index 27e04c2a..1d72262e 100644 --- a/apps/backend/src/cards/types.d.ts +++ b/packages/core/src/cards/types.d.ts @@ -1,7 +1,7 @@ -type ThemeNames = keyof typeof import("../../themes/index.js"); +type ThemeNames = keyof typeof import("../themes/index.ts"); type RankIcon = "default" | "github" | "percentile"; -type CommonOptions = { +interface CommonOptions { title_color: string; icon_color: string; text_color: string; @@ -11,10 +11,10 @@ type CommonOptions = { border_color: string; locale: string; hide_border: boolean; -}; +} export type StatCardOptions = CommonOptions & { - hide: string[]; + hide: Array; show_icons: boolean; hide_title: boolean; card_width: number; @@ -29,14 +29,14 @@ export type StatCardOptions = CommonOptions & { ring_color: string; text_bold: boolean; rank_icon: RankIcon; - show: string[]; + show: Array; }; export type RepoCardOptions = CommonOptions & { show_owner: boolean; description_lines_count: number; card_width_input; - show: string[]; + show: Array; show_icons: boolean; number_format: string; text_bold: boolean; @@ -47,7 +47,7 @@ export type RepoCardOptions = CommonOptions & { export type TopLangOptions = CommonOptions & { hide_title: boolean; card_width: number; - hide: string[]; + hide: Array; layout: "compact" | "normal" | "donut" | "donut-vertical" | "pie"; custom_title: string; langs_count: number; @@ -59,7 +59,7 @@ export type TopLangOptions = CommonOptions & { export type WakaTimeOptions = CommonOptions & { hide_title: boolean; - hide: string[]; + hide: Array; card_width: number; line_height: string; hide_progress: boolean; diff --git a/apps/backend/src/cards/wakatime.js b/packages/core/src/cards/wakatime.js similarity index 99% rename from apps/backend/src/cards/wakatime.js rename to packages/core/src/cards/wakatime.js index 02eac539..f7eeeee3 100644 --- a/apps/backend/src/cards/wakatime.js +++ b/packages/core/src/cards/wakatime.js @@ -305,7 +305,7 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => { textColor, }); - let finalLayout = ""; + let finalLayout; // RENDER COMPACT LAYOUT if (layout === "compact") { diff --git a/apps/backend/src/common/Card.js b/packages/core/src/common/Card.js similarity index 98% rename from apps/backend/src/common/Card.js rename to packages/core/src/common/Card.js index 45bc81fe..6345b662 100644 --- a/apps/backend/src/common/Card.js +++ b/packages/core/src/common/Card.js @@ -230,7 +230,7 @@ class Card { } ${this.css} - ${process.env.NODE_ENV === "test" ? "" : this.getAnimations()} + ${this.getAnimations()} ${ this.animations === false ? `* { animation-duration: 0s !important; animation-delay: 0s !important; }` diff --git a/apps/backend/src/common/I18n.js b/packages/core/src/common/I18n.js similarity index 100% rename from apps/backend/src/common/I18n.js rename to packages/core/src/common/I18n.js diff --git a/apps/backend/src/common/color.js b/packages/core/src/common/color.js similarity index 98% rename from apps/backend/src/common/color.js rename to packages/core/src/common/color.js index 622ed161..bc1395e8 100644 --- a/apps/backend/src/common/color.js +++ b/packages/core/src/common/color.js @@ -1,6 +1,6 @@ // @ts-check -import { themes } from "../../themes/index.js"; +import { themes } from "../themes/index.js"; /** * Checks if a string is a valid hex color. diff --git a/packages/core/src/common/config.js b/packages/core/src/common/config.js new file mode 100644 index 00000000..32456ce8 --- /dev/null +++ b/packages/core/src/common/config.js @@ -0,0 +1,78 @@ +// @ts-check + +/** + * @param {string | undefined} value Comma-separated string. + * @returns {string[] | undefined} Parsed string values. + */ +const parseCsv = (value) => { + if (!value) { + return undefined; + } + return value.split(","); +}; + +/** + * @param {Record} env Environment variables to inspect. + * @returns {{name: string, value: string}[]} Personal access tokens found in the environment. + */ +const parsePATsFromEnv = (env) => { + return Object.keys(env) + .filter((key) => /PAT_\d*$/.exec(key)) + .map((name) => ({ + name, + value: env[name], + })); +}; + +/** + * @returns {Record} `process.env` if available, otherwise `{}`. + */ +const getDefaultEnv = () => { + if (typeof process !== "undefined" && process?.env) { + return process.env; + } + return {}; +}; + +/** + * @param {Partial>} config (Partial) config values to normalize. + * @returns {{ + * whitelist: string[] | undefined, + * gistWhitelist: string[] | undefined, + * excludeRepositories: string[], + * fetchMultiPageStars: string | undefined, + * pats: {name: string, value: string}[], + * }} Normalized config object with defaults applied. + */ +const normalizeConfig = (config = {}) => { + return { + whitelist: config.whitelist, + gistWhitelist: config.gistWhitelist, + excludeRepositories: config.excludeRepositories || [], + fetchMultiPageStars: config.fetchMultiPageStars, + pats: config.pats || [], + }; +}; + +let currentConfig; + +/** + * @param {Record} env Environment variables used to build the runtime config. + */ +export const loadConfigFromEnv = (env = getDefaultEnv()) => { + const whitelist = parseCsv(env.WHITELIST); + const gistWhitelist = parseCsv(env.GIST_WHITELIST); + const excludeRepositories = parseCsv(env.EXCLUDE_REPO) || []; + + currentConfig = normalizeConfig({ + whitelist, + gistWhitelist, + excludeRepositories, + fetchMultiPageStars: env.FETCH_MULTI_PAGE_STARS, + pats: parsePATsFromEnv(env), + }); +}; + +loadConfigFromEnv(); + +export const getConfig = () => currentConfig; diff --git a/apps/backend/src/common/constants.js b/packages/core/src/common/constants.js similarity index 100% rename from apps/backend/src/common/constants.js rename to packages/core/src/common/constants.js diff --git a/apps/backend/src/common/error.js b/packages/core/src/common/error.js similarity index 100% rename from apps/backend/src/common/error.js rename to packages/core/src/common/error.js diff --git a/apps/backend/src/common/fmt.js b/packages/core/src/common/fmt.js similarity index 99% rename from apps/backend/src/common/fmt.js rename to packages/core/src/common/fmt.js index 16c80b8b..5bc3ad14 100644 --- a/apps/backend/src/common/fmt.js +++ b/packages/core/src/common/fmt.js @@ -66,7 +66,7 @@ const wrapTextMultiline = (text, width = 59, maxLines = 3) => { const encoded = encodeHTML(text); const isChinese = encoded.includes(fullWidthComma); - let wrapped = []; + let wrapped; if (isChinese) { wrapped = encoded.split(fullWidthComma); // Chinese full punctuation diff --git a/apps/backend/src/common/html.js b/packages/core/src/common/html.js similarity index 100% rename from apps/backend/src/common/html.js rename to packages/core/src/common/html.js diff --git a/apps/backend/src/common/http.js b/packages/core/src/common/http.js similarity index 100% rename from apps/backend/src/common/http.js rename to packages/core/src/common/http.js diff --git a/apps/backend/src/common/icons.js b/packages/core/src/common/icons.js similarity index 100% rename from apps/backend/src/common/icons.js rename to packages/core/src/common/icons.js diff --git a/apps/backend/src/common/languageColors.json b/packages/core/src/common/languageColors.json similarity index 99% rename from apps/backend/src/common/languageColors.json rename to packages/core/src/common/languageColors.json index 63bbbe94..86adccb2 100644 --- a/apps/backend/src/common/languageColors.json +++ b/packages/core/src/common/languageColors.json @@ -171,6 +171,7 @@ "Faust": "#c37240", "Fennel": "#fff3d7", "Filebench WML": "#F6B900", + "FlatBuffers": "#ed284a", "Flix": "#d44a45", "Fluent": "#ffcc33", "Forth": "#341708", @@ -323,6 +324,7 @@ "LigoLANG": "#0e74ff", "LilyPond": "#9ccc7c", "Liquid": "#67b8de", + "Liquidsoap": "#990066", "Literate Agda": "#315665", "Literate CoffeeScript": "#244776", "Literate Haskell": "#5e5086", @@ -348,6 +350,7 @@ "Mask": "#f97732", "Mathematical Programming System": "#0530ad", "Max": "#c4a79c", + "MeTTa": "#6a5acd", "Mercury": "#ff2b2b", "Mermaid": "#ff3670", "Meson": "#007800", diff --git a/apps/backend/src/common/log.js b/packages/core/src/common/log.js similarity index 57% rename from apps/backend/src/common/log.js rename to packages/core/src/common/log.js index 5836d50a..88cf7dd9 100644 --- a/apps/backend/src/common/log.js +++ b/packages/core/src/common/log.js @@ -1,13 +1,9 @@ // @ts-check - -const noop = () => {}; - /** * Return console instance based on the environment. * * @type {Console | {log: () => void, error: () => void}} */ -const logger = - process.env.NODE_ENV === "test" ? { log: noop, error: noop } : console; +const logger = console; export { logger }; diff --git a/apps/backend/src/common/ops.js b/packages/core/src/common/ops.js similarity index 100% rename from apps/backend/src/common/ops.js rename to packages/core/src/common/ops.js diff --git a/apps/backend/src/common/render.js b/packages/core/src/common/render.js similarity index 99% rename from apps/backend/src/common/render.js rename to packages/core/src/common/render.js index 36533464..7aba75c0 100644 --- a/apps/backend/src/common/render.js +++ b/packages/core/src/common/render.js @@ -229,7 +229,6 @@ const measureText = (str, fontSize = 10) => { }; export { - ERROR_CARD_LENGTH, renderError, createLanguageNode, createProgressNode, diff --git a/apps/backend/src/common/retryer.js b/packages/core/src/common/retryer.js similarity index 83% rename from apps/backend/src/common/retryer.js rename to packages/core/src/common/retryer.js index 4661deff..79d294dc 100644 --- a/apps/backend/src/common/retryer.js +++ b/packages/core/src/common/retryer.js @@ -1,6 +1,6 @@ // @ts-check -import { getUserAccessByName } from "./database.js"; +import { getConfig } from "./config.js"; import { CustomError } from "./error.js"; import { logger } from "./log.js"; @@ -27,24 +27,16 @@ function getRandomInt(max) { * Try to execute the fetcher function until it succeeds or the max number of retries is reached. * * @param {FetcherFunction} fetcher The fetcher function. - * @param {string?} username GitHub username of the user whose PAT to use, if available * @param {any} variables Object with arguments to pass to the fetcher function. + * @param {string | null} pat Optional PAT override. * @returns {Promise} The response from the fetcher function. */ -const retryer = async (fetcher, username, variables) => { - let userPAT; - if (username) { - userPAT = await getUserAccessByName(username); - } - +const retryer = async (fetcher, variables, pat = null) => { let PATs; - if (userPAT?.token) { - PATs = [{ name: `USER_${username}`, value: userPAT.token }]; + if (pat) { + PATs = [{ name: "user PAT from database", value: pat }]; } else { - const patNames = Object.keys(process.env).filter((key) => - /PAT_\d*$/.exec(key), - ); - PATs = patNames.map((name) => ({ name, value: process.env[name] })); + PATs = getConfig().pats; } if (!PATs.length) { @@ -110,4 +102,3 @@ const retryer = async (fetcher, username, variables) => { }; export { retryer }; -export default retryer; diff --git a/apps/backend/src/fetchers/gist.js b/packages/core/src/fetchers/gist.js similarity index 94% rename from apps/backend/src/fetchers/gist.js rename to packages/core/src/fetchers/gist.js index e80264ff..450b1711 100644 --- a/apps/backend/src/fetchers/gist.js +++ b/packages/core/src/fetchers/gist.js @@ -84,13 +84,14 @@ const calculatePrimaryLanguage = (files) => { * Fetch GitHub gist information by given username and ID. * * @param {string} id GitHub gist ID. + * @param {string | null} pat Optional PAT override. * @returns {Promise} Gist data. */ -const fetchGist = async (id) => { +const fetchGist = async (id, pat = null) => { if (!id) { throw new MissingParamError(["id"], "/api/gist?id=GIST_ID"); } - const res = await retryer(fetcher, null, { gistName: id }); + const res = await retryer(fetcher, { gistName: id }, pat); if (res.data.errors) { throw new Error(res.data.errors[0].message); } diff --git a/apps/backend/src/fetchers/repo.js b/packages/core/src/fetchers/repo.js similarity index 97% rename from apps/backend/src/fetchers/repo.js rename to packages/core/src/fetchers/repo.js index 90b269c4..96d727f6 100644 --- a/apps/backend/src/fetchers/repo.js +++ b/packages/core/src/fetchers/repo.js @@ -76,6 +76,7 @@ const fetchRepo = async ( include_prs_reviewed = false, include_issues_authored = false, include_issues_commented = false, + pat = null, ) => { let owner = username; if (reponame && reponame.includes("/")) { @@ -100,7 +101,7 @@ const fetchRepo = async ( throw new MissingParamError(["repo"], urlExample); } - let res = await retryer(fetcher, username, { login: owner, repo: reponame }); + let res = await retryer(fetcher, { login: owner, repo: reponame }, pat); const data = res.data.data; @@ -124,6 +125,7 @@ const fetchRepo = async ( include_prs_reviewed, include_issues_authored, include_issues_commented, + pat, ); return { ...repoUserStats, @@ -148,6 +150,7 @@ const fetchRepo = async ( include_prs_reviewed, include_issues_authored, include_issues_commented, + pat, ); return { ...repoUserStats, diff --git a/apps/backend/src/fetchers/stats.js b/packages/core/src/fetchers/stats.js similarity index 91% rename from apps/backend/src/fetchers/stats.js rename to packages/core/src/fetchers/stats.js index f4a6be86..1e2f3a55 100644 --- a/apps/backend/src/fetchers/stats.js +++ b/packages/core/src/fetchers/stats.js @@ -4,7 +4,7 @@ import axios from "axios"; import githubUsernameRegex from "github-username-regex"; import { calculateRank } from "../calculateRank.js"; -import { excludeRepositories } from "../common/envs.js"; +import { getConfig } from "../common/config.js"; import { CustomError, MissingParamError } from "../common/error.js"; import { wrapTextMultiline } from "../common/fmt.js"; import { request } from "../common/http.js"; @@ -106,7 +106,8 @@ const fetcher = (variables, token) => { * @param {boolean} variables.includeDiscussions Include discussions. * @param {boolean} variables.includeDiscussionsAnswers Include discussions answers. * @param {string|undefined} variables.startTime Time to start the count of total commits. - * @param {string[]} ownerAffiliations The owner affiliations to filter by. Default: OWNER. + * @param {string[]} variables.ownerAffiliations The owner affiliations to filter by. Default: OWNER. + * @param {string | null} variables.pat PAT override or null. * @returns {Promise} Axios response. * * @description This function supports multi-page fetching if the 'FETCH_MULTI_PAGE_STARS' environment variable is set to true or a limit of fetches. @@ -118,6 +119,7 @@ const statsFetcher = async ({ includeDiscussionsAnswers, startTime, ownerAffiliations, + pat, }) => { let stats; let hasNextPage = true; @@ -134,7 +136,7 @@ const statsFetcher = async ({ startTime, ownerAffiliations, }; - let res = await retryer(fetcher, username, variables); + let res = await retryer(fetcher, variables, pat); if (res.data.errors) { return res; } @@ -161,8 +163,8 @@ const statsFetcher = async ({ ); hasNextPage = - (process.env.FETCH_MULTI_PAGE_STARS === "true" || - process.env.FETCH_MULTI_PAGE_STARS > fetchedPages) && + (getConfig().fetchMultiPageStars === "true" || + getConfig().fetchMultiPageStars > fetchedPages) && repoNodes.length === repoNodesWithStars.length && res.data.data.user.repositories.pageInfo.hasNextPage; @@ -207,7 +209,7 @@ const fetchTotalItems = (variables, token) => { * @description Done like this because the GitHub API does not provide a way to fetch all the commits. See * #92#issuecomment-661026467 and #211 for more information. */ -const totalItemsFetcher = async (username, repo, owner, type, filter) => { +const totalItemsFetcher = async (username, repo, owner, type, filter, pat) => { if (!githubUsernameRegex.test(username)) { logger.log("Invalid username provided."); throw new Error("Invalid username provided."); @@ -215,16 +217,20 @@ const totalItemsFetcher = async (username, repo, owner, type, filter) => { let res; try { - res = await retryer(fetchTotalItems, username, { - login: username, - repo, - owner, - type, - filter, - }); + res = await retryer( + fetchTotalItems, + { + login: username, + repo, + owner, + type, + filter, + }, + pat, + ); } catch (err) { logger.log(err); - throw new Error(err); + throw err; } const totalCount = res.data.total_count; @@ -247,6 +253,7 @@ const fetchRepoUserStats = async ( include_prs_reviewed, include_issues_authored, include_issues_commented, + pat, ) => { let stats = {}; if (include_prs_authored) { @@ -256,6 +263,7 @@ const fetchRepoUserStats = async ( owner, "issues", `author:${username}+type:pr`, + pat, ); } if (include_prs_commented) { @@ -265,6 +273,7 @@ const fetchRepoUserStats = async ( owner, "issues", `commenter:${username}+-author:${username}+type:pr`, + pat, ); } if (include_prs_reviewed) { @@ -274,6 +283,7 @@ const fetchRepoUserStats = async ( owner, "issues", `reviewed-by:${username}+-author:${username}+type:pr`, + pat, ); } if (include_issues_authored) { @@ -283,6 +293,7 @@ const fetchRepoUserStats = async ( owner, "issues", `author:${username}+type:issue`, + pat, ); } if (include_issues_commented) { @@ -292,6 +303,7 @@ const fetchRepoUserStats = async ( owner, "issues", `commenter:${username}+-author:${username}+type:issue`, + pat, ); } return stats; @@ -326,6 +338,7 @@ const fetchStats = async ( include_issues_authored = false, include_issues_commented = false, ownerAffiliations = [], + pat = null, ) => { if (!username) { throw new MissingParamError(["username"]); @@ -352,14 +365,17 @@ const fetchStats = async ( }; ownerAffiliations = parseOwnerAffiliations(ownerAffiliations); - let res = await statsFetcher({ - username, - includeMergedPullRequests: include_merged_pull_requests, - includeDiscussions: include_discussions, - includeDiscussionsAnswers: include_discussions_answers, - startTime: commits_year ? `${commits_year}-01-01T00:00:00Z` : undefined, - ownerAffiliations, - }); + let res = await statsFetcher( + { + username, + includeMergedPullRequests: include_merged_pull_requests, + includeDiscussions: include_discussions, + includeDiscussionsAnswers: include_discussions_answers, + startTime: commits_year ? `${commits_year}-01-01T00:00:00Z` : undefined, + ownerAffiliations, + }, + pat, + ); // Catch GraphQL errors. if (res.data.errors) { @@ -394,6 +410,7 @@ const fetchStats = async ( owner, "commits", `author:${username}`, + pat, ); } else { stats.totalCommits = user.commits.totalCommitContributions; @@ -407,6 +424,7 @@ const fetchStats = async ( include_prs_reviewed, include_issues_authored, include_issues_commented, + pat, ); Object.assign(stats, repoUserStats); @@ -429,7 +447,10 @@ const fetchStats = async ( stats.contributedTo = user.repositoriesContributedTo.totalCount; // Retrieve stars while filtering out repositories to be hidden. - const allExcludedRepos = [...exclude_repo, ...excludeRepositories]; + const allExcludedRepos = [ + ...exclude_repo, + ...getConfig().excludeRepositories, + ]; let repoToHide = new Set(allExcludedRepos); stats.totalStars = user.repositories.nodes diff --git a/apps/backend/src/fetchers/top-languages.js b/packages/core/src/fetchers/top-languages.js similarity index 93% rename from apps/backend/src/fetchers/top-languages.js rename to packages/core/src/fetchers/top-languages.js index dad43ebe..541bb3b1 100644 --- a/apps/backend/src/fetchers/top-languages.js +++ b/packages/core/src/fetchers/top-languages.js @@ -1,6 +1,6 @@ // @ts-check -import { excludeRepositories } from "../common/envs.js"; +import { getConfig } from "../common/config.js"; import { CustomError, MissingParamError } from "../common/error.js"; import { wrapTextMultiline } from "../common/fmt.js"; import { request } from "../common/http.js"; @@ -59,6 +59,7 @@ const fetcher = (variables, token) => { * @param {number} size_weight Weightage to be given to size. * @param {number} count_weight Weightage to be given to count. * @param {string[]} ownerAffiliations The owner affiliations to filter by. Default: OWNER. + * @param {string|null} pat Optional PAT override. * @returns {Promise} Top languages data. */ const fetchTopLanguages = async ( @@ -67,16 +68,21 @@ const fetchTopLanguages = async ( size_weight = 1, count_weight = 0, ownerAffiliations = [], + pat = null, ) => { if (!username) { throw new MissingParamError(["username"]); } ownerAffiliations = parseOwnerAffiliations(ownerAffiliations); - const res = await retryer(fetcher, username, { - login: username, - ownerAffiliations, - }); + const res = await retryer( + fetcher, + { + login: username, + ownerAffiliations, + }, + pat, + ); if (res.data.errors) { logger.error(res.data.errors); @@ -101,7 +107,10 @@ const fetchTopLanguages = async ( let repoNodes = res.data.data.user.repositories.nodes; /** @type {Record} */ let repoToHide = {}; - const allExcludedRepos = [...exclude_repo, ...excludeRepositories]; + const allExcludedRepos = [ + ...exclude_repo, + ...getConfig().excludeRepositories, + ]; // populate repoToHide map for quick lookup // while filtering out diff --git a/apps/backend/src/fetchers/types.d.ts b/packages/core/src/fetchers/types.d.ts similarity index 89% rename from apps/backend/src/fetchers/types.d.ts rename to packages/core/src/fetchers/types.d.ts index 1588c921..b26b0661 100644 --- a/apps/backend/src/fetchers/types.d.ts +++ b/packages/core/src/fetchers/types.d.ts @@ -1,13 +1,13 @@ -export type GistData = { +export interface GistData { name: string; nameWithOwner: string; description: string | null; language: string | null; starsCount: number; forksCount: number; -}; +} -export type RepositoryData = { +export interface RepositoryData { name: string; nameWithOwner: string; isPrivate: boolean; @@ -27,9 +27,9 @@ export type RepositoryData = { totalPRsReviewed: number; totalIssuesAuthored: number; totalIssuesCommented: number; -}; +} -export type StatsData = { +export interface StatsData { name: string; totalPRs: number; totalPRsMerged: number; @@ -47,18 +47,18 @@ export type StatsData = { totalIssuesAuthored: number; totalIssuesCommented: number; rank: { level: string; percentile: number }; -}; +} -export type Lang = { +export interface Lang { name: string; color: string; size: number; -}; +} export type TopLangData = Record; -export type WakaTimeData = { - categories: { +export interface WakaTimeData { + categories: Array<{ digital: string; hours: number; minutes: number; @@ -66,12 +66,12 @@ export type WakaTimeData = { percent: number; text: string; total_seconds: number; - }[]; + }>; daily_average: number; daily_average_including_other_language: number; days_including_holidays: number; days_minus_holidays: number; - editors: { + editors: Array<{ digital: string; hours: number; minutes: number; @@ -79,7 +79,7 @@ export type WakaTimeData = { percent: number; text: string; total_seconds: number; - }[]; + }>; holidays: number; human_readable_daily_average: string; human_readable_daily_average_including_other_language: string; @@ -92,7 +92,7 @@ export type WakaTimeData = { is_other_usage_visible: boolean; is_stuck: boolean; is_up_to_date: boolean; - languages: { + languages: Array<{ digital: string; hours: number; minutes: number; @@ -100,8 +100,8 @@ export type WakaTimeData = { percent: number; text: string; total_seconds: number; - }[]; - operating_systems: { + }>; + operating_systems: Array<{ digital: string; hours: number; minutes: number; @@ -109,7 +109,7 @@ export type WakaTimeData = { percent: number; text: string; total_seconds: number; - }[]; + }>; percent_calculated: number; range: string; status: string; @@ -119,10 +119,10 @@ export type WakaTimeData = { user_id: string; username: string; writes_only: boolean; -}; +} -export type WakaTimeLang = { +export interface WakaTimeLang { name: string; text: string; percent: number; -}; +} diff --git a/apps/backend/src/fetchers/wakatime.js b/packages/core/src/fetchers/wakatime.js similarity index 100% rename from apps/backend/src/fetchers/wakatime.js rename to packages/core/src/fetchers/wakatime.js diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 00000000..23606735 --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1,25 @@ +/** + * We need this file to be in ts to allow custom conditions to work + * The package will be converted + * + * @todo https://github.com/stats-organization/github-stats-extended/issues/140 + */ +export { fetchWakatimeStats } from "./fetchers/wakatime.js"; +export { retryer } from "./common/retryer.js"; + +export { renderError } from "./common/render.js"; + +export { dateDiff, clampValue } from "./common/ops.js"; + +export { logger } from "./common/log.js"; +export { request } from "./common/http.js"; + +export { default as gist } from "./api/gist.js"; +export { default as api } from "./api/index.js"; +export { default as pin } from "./api/pin.js"; +export { default as topLangs } from "./api/top-langs.js"; +export { default as wakatime } from "./api/wakatime.js"; + +export { getConfig } from "./common/config.js"; + +export { themes } from "./themes/index.js"; diff --git a/apps/backend/themes/README.md b/packages/core/src/themes/README.md similarity index 100% rename from apps/backend/themes/README.md rename to packages/core/src/themes/README.md diff --git a/apps/backend/themes/index.js b/packages/core/src/themes/index.ts similarity index 97% rename from apps/backend/themes/index.js rename to packages/core/src/themes/index.ts index 98fab2d3..565cd3a9 100644 --- a/apps/backend/themes/index.js +++ b/packages/core/src/themes/index.ts @@ -1,3 +1,14 @@ +interface Theme { + title_color: string; + icon_color: string; + text_color: string; + bg_color: string; + border_color?: string; +} + +/** + * Collection of available themes. + */ export const themes = { default: { title_color: "2f80ed", @@ -462,4 +473,4 @@ export const themes = { icon_color: "ffffff", bg_color: "35,4158d0,c850c0,ffcc70", }, -}; +} as const satisfies Record; diff --git a/apps/backend/src/translations.js b/packages/core/src/translations.js similarity index 100% rename from apps/backend/src/translations.js rename to packages/core/src/translations.js diff --git a/apps/backend/tests/__snapshots__/renderWakatimeCard.test.js.snap b/packages/core/tests/__snapshots__/renderWakatimeCard.test.js.snap similarity index 91% rename from apps/backend/tests/__snapshots__/renderWakatimeCard.test.js.snap rename to packages/core/tests/__snapshots__/renderWakatimeCard.test.js.snap index c60b504f..206a71b8 100644 --- a/apps/backend/tests/__snapshots__/renderWakatimeCard.test.js.snap +++ b/packages/core/tests/__snapshots__/renderWakatimeCard.test.js.snap @@ -65,6 +65,24 @@ exports[`Test Render WakaTime Card > should render correctly 1`] = ` + /* Animations */ + @keyframes scaleInAnimation { + from { + transform: translate(-5px, 5px) scale(0); + } + to { + transform: translate(-5px, 5px) scale(1); + } + } + @keyframes fadeInAnimation { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @@ -223,6 +241,24 @@ exports[`Test Render WakaTime Card > should render correctly with compact layout + /* Animations */ + @keyframes scaleInAnimation { + from { + transform: translate(-5px, 5px) scale(0); + } + to { + transform: translate(-5px, 5px) scale(1); + } + } + @keyframes fadeInAnimation { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @@ -375,6 +411,24 @@ exports[`Test Render WakaTime Card > should render correctly with compact layout + /* Animations */ + @keyframes scaleInAnimation { + from { + transform: translate(-5px, 5px) scale(0); + } + to { + transform: translate(-5px, 5px) scale(1); + } + } + @keyframes fadeInAnimation { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @@ -527,6 +581,24 @@ exports[`Test Render WakaTime Card > should render correctly with percent displa + /* Animations */ + @keyframes scaleInAnimation { + from { + transform: translate(-5px, 5px) scale(0); + } + to { + transform: translate(-5px, 5px) scale(1); + } + } + @keyframes fadeInAnimation { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + diff --git a/packages/core/tests/_setup.js b/packages/core/tests/_setup.js new file mode 100644 index 00000000..39566617 --- /dev/null +++ b/packages/core/tests/_setup.js @@ -0,0 +1,7 @@ +import * as matchers from "@testing-library/jest-dom/matchers"; +import { expect } from "vitest"; + +expect.extend(matchers); + +process.env.PAT_1 = "dummyPAT1"; +process.env.PAT_2 = "dummyPAT2"; diff --git a/apps/backend/tests/calculateRank.test.js b/packages/core/tests/calculateRank.test.js similarity index 98% rename from apps/backend/tests/calculateRank.test.js rename to packages/core/tests/calculateRank.test.js index 3997f666..e432cef1 100644 --- a/apps/backend/tests/calculateRank.test.js +++ b/packages/core/tests/calculateRank.test.js @@ -4,8 +4,6 @@ import { calculateRank } from "../src/calculateRank.js"; import { approxNumber } from "./utils.js"; -import "@testing-library/jest-dom/vitest"; - describe("Test calculateRank", () => { it("new user gets C rank", () => { expect( diff --git a/apps/backend/tests/card.test.js b/packages/core/tests/card.test.js similarity index 99% rename from apps/backend/tests/card.test.js rename to packages/core/tests/card.test.js index 960bc344..c9d289d4 100644 --- a/apps/backend/tests/card.test.js +++ b/packages/core/tests/card.test.js @@ -6,8 +6,6 @@ import { Card } from "../src/common/Card.js"; import { getCardColors } from "../src/common/color.js"; import { icons } from "../src/common/icons.js"; -import "@testing-library/jest-dom/vitest"; - describe("Card", () => { it("should hide border", () => { const card = new Card({}); diff --git a/apps/backend/tests/color.test.js b/packages/core/tests/color.test.js similarity index 100% rename from apps/backend/tests/color.test.js rename to packages/core/tests/color.test.js diff --git a/apps/backend/tests/fetchGist.test.js b/packages/core/tests/fetchGist.test.js similarity index 98% rename from apps/backend/tests/fetchGist.test.js rename to packages/core/tests/fetchGist.test.js index ca0d41ed..a0336e67 100644 --- a/apps/backend/tests/fetchGist.test.js +++ b/packages/core/tests/fetchGist.test.js @@ -4,8 +4,6 @@ import { afterEach, describe, expect, it } from "vitest"; import { fetchGist } from "../src/fetchers/gist.js"; -import "@testing-library/jest-dom/vitest"; - const gist_data = { data: { viewer: { diff --git a/apps/backend/tests/fetchRepo.test.js b/packages/core/tests/fetchRepo.test.js similarity index 98% rename from apps/backend/tests/fetchRepo.test.js rename to packages/core/tests/fetchRepo.test.js index b98eca47..d72b1e4b 100644 --- a/apps/backend/tests/fetchRepo.test.js +++ b/packages/core/tests/fetchRepo.test.js @@ -4,8 +4,6 @@ import { afterEach, describe, expect, it } from "vitest"; import { fetchRepo } from "../src/fetchers/repo.js"; -import "@testing-library/jest-dom/vitest"; - const data_repo = { repository: { name: "convoychat", diff --git a/apps/backend/tests/fetchStats.test.js b/packages/core/tests/fetchStats.test.js similarity index 98% rename from apps/backend/tests/fetchStats.test.js rename to packages/core/tests/fetchStats.test.js index b4681f59..7d4531aa 100644 --- a/apps/backend/tests/fetchStats.test.js +++ b/packages/core/tests/fetchStats.test.js @@ -3,10 +3,9 @@ import MockAdapter from "axios-mock-adapter"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { calculateRank } from "../src/calculateRank.js"; +import { loadConfigFromEnv } from "../src/common/config.js"; import { fetchStats } from "../src/fetchers/stats.js"; -import "@testing-library/jest-dom/vitest"; - // Test parameters. const data_stats = { data: { @@ -107,6 +106,7 @@ const mock = new MockAdapter(axios); beforeEach(() => { process.env.FETCH_MULTI_PAGE_STARS = "false"; // Set to `false` to fetch only one page of stars. + loadConfigFromEnv(); mock.onPost("https://api.github.com/graphql").reply((cfg) => { let req = JSON.parse(cfg.data); @@ -313,6 +313,7 @@ describe("Test fetchStats", () => { it("should fetch two pages of stars if 'FETCH_MULTI_PAGE_STARS' env variable is set to `true`", async () => { process.env.FETCH_MULTI_PAGE_STARS = true; + loadConfigFromEnv(); let stats = await fetchStats("anuraghazra"); const rank = calculateRank({ @@ -349,6 +350,7 @@ describe("Test fetchStats", () => { it("should fetch one page of stars if 'FETCH_MULTI_PAGE_STARS' env variable is set to `false`", async () => { process.env.FETCH_MULTI_PAGE_STARS = "false"; + loadConfigFromEnv(); let stats = await fetchStats("anuraghazra"); const rank = calculateRank({ @@ -385,6 +387,7 @@ describe("Test fetchStats", () => { it("should fetch one page of stars if 'FETCH_MULTI_PAGE_STARS' env variable is not set", async () => { process.env.FETCH_MULTI_PAGE_STARS = undefined; + loadConfigFromEnv(); let stats = await fetchStats("anuraghazra"); const rank = calculateRank({ diff --git a/apps/backend/tests/fetchTopLanguages.test.js b/packages/core/tests/fetchTopLanguages.test.js similarity index 99% rename from apps/backend/tests/fetchTopLanguages.test.js rename to packages/core/tests/fetchTopLanguages.test.js index f4f24859..798c5a38 100644 --- a/apps/backend/tests/fetchTopLanguages.test.js +++ b/packages/core/tests/fetchTopLanguages.test.js @@ -6,8 +6,6 @@ import { fetchTopLanguages } from "../src/fetchers/top-languages.js"; import { approxNumber } from "./utils.js"; -import "@testing-library/jest-dom/vitest"; - const mock = new MockAdapter(axios); afterEach(() => { diff --git a/apps/backend/tests/fetchWakatime.test.js b/packages/core/tests/fetchWakatime.test.js similarity index 98% rename from apps/backend/tests/fetchWakatime.test.js rename to packages/core/tests/fetchWakatime.test.js index 5149b49f..cc1ac289 100644 --- a/apps/backend/tests/fetchWakatime.test.js +++ b/packages/core/tests/fetchWakatime.test.js @@ -4,8 +4,6 @@ import { afterEach, describe, expect, it } from "vitest"; import { fetchWakatimeStats } from "../src/fetchers/wakatime.js"; -import "@testing-library/jest-dom/vitest"; - const mock = new MockAdapter(axios); afterEach(() => { diff --git a/apps/backend/tests/flexLayout.test.js b/packages/core/tests/flexLayout.test.js similarity index 100% rename from apps/backend/tests/flexLayout.test.js rename to packages/core/tests/flexLayout.test.js diff --git a/apps/backend/tests/fmt.test.js b/packages/core/tests/fmt.test.js similarity index 100% rename from apps/backend/tests/fmt.test.js rename to packages/core/tests/fmt.test.js diff --git a/apps/backend/tests/html.test.js b/packages/core/tests/html.test.js similarity index 100% rename from apps/backend/tests/html.test.js rename to packages/core/tests/html.test.js diff --git a/apps/backend/tests/i18n.test.js b/packages/core/tests/i18n.test.js similarity index 100% rename from apps/backend/tests/i18n.test.js rename to packages/core/tests/i18n.test.js diff --git a/apps/backend/tests/ops.test.js b/packages/core/tests/ops.test.js similarity index 100% rename from apps/backend/tests/ops.test.js rename to packages/core/tests/ops.test.js diff --git a/apps/backend/tests/render.test.js b/packages/core/tests/render.test.js similarity index 95% rename from apps/backend/tests/render.test.js rename to packages/core/tests/render.test.js index d5cd6ca4..9eb55d01 100644 --- a/apps/backend/tests/render.test.js +++ b/packages/core/tests/render.test.js @@ -5,8 +5,6 @@ import { describe, expect, it } from "vitest"; import { renderError } from "../src/common/render.js"; -import "@testing-library/jest-dom/vitest"; - describe("Test render.js", () => { it("should test renderError", () => { document.body.innerHTML = renderError({ message: "Something went wrong" }); diff --git a/apps/backend/tests/renderGistCard.test.js b/packages/core/tests/renderGistCard.test.js similarity index 98% rename from apps/backend/tests/renderGistCard.test.js rename to packages/core/tests/renderGistCard.test.js index 28fbfa33..fe06b4b8 100644 --- a/apps/backend/tests/renderGistCard.test.js +++ b/packages/core/tests/renderGistCard.test.js @@ -3,9 +3,7 @@ import { cssToObject } from "@uppercod/css-to-object"; import { describe, expect, it } from "vitest"; import { renderGistCard } from "../src/cards/gist.js"; -import { themes } from "../themes/index.js"; - -import "@testing-library/jest-dom/vitest"; +import { themes } from "../src/themes/index.js"; /** * @type {import("../src/fetchers/gist").GistData} diff --git a/apps/backend/tests/renderRepoCard.test.js b/packages/core/tests/renderRepoCard.test.js similarity index 99% rename from apps/backend/tests/renderRepoCard.test.js rename to packages/core/tests/renderRepoCard.test.js index 4efecf57..f14f7998 100644 --- a/apps/backend/tests/renderRepoCard.test.js +++ b/packages/core/tests/renderRepoCard.test.js @@ -3,9 +3,7 @@ import { cssToObject } from "@uppercod/css-to-object"; import { describe, expect, it } from "vitest"; import { renderRepoCard } from "../src/cards/repo.js"; -import { themes } from "../themes/index.js"; - -import "@testing-library/jest-dom/vitest"; +import { themes } from "../src/themes/index.js"; const data_repo = { repository: { diff --git a/apps/backend/tests/renderStatsCard.test.js b/packages/core/tests/renderStatsCard.test.js similarity index 99% rename from apps/backend/tests/renderStatsCard.test.js rename to packages/core/tests/renderStatsCard.test.js index c21bcf45..c5e459fe 100644 --- a/apps/backend/tests/renderStatsCard.test.js +++ b/packages/core/tests/renderStatsCard.test.js @@ -8,9 +8,7 @@ import { describe, expect, it } from "vitest"; import { renderStatsCard } from "../src/cards/stats.js"; import { CustomError } from "../src/common/error.js"; -import { themes } from "../themes/index.js"; - -import "@testing-library/jest-dom/vitest"; +import { themes } from "../src/themes/index.js"; const stats = { name: "Anurag Hazra", diff --git a/apps/backend/tests/renderTopLanguagesCard.test.js b/packages/core/tests/renderTopLanguagesCard.test.js similarity index 99% rename from apps/backend/tests/renderTopLanguagesCard.test.js rename to packages/core/tests/renderTopLanguagesCard.test.js index ad50cc2d..3cd8c63e 100644 --- a/apps/backend/tests/renderTopLanguagesCard.test.js +++ b/packages/core/tests/renderTopLanguagesCard.test.js @@ -20,12 +20,10 @@ import { renderTopLanguages, trimTopLanguages, } from "../src/cards/top-languages.js"; -import { themes } from "../themes/index.js"; +import { themes } from "../src/themes/index.js"; import { approxNumber } from "./utils.js"; -import "@testing-library/jest-dom/vitest"; - const langs = { HTML: { color: "#0f0", diff --git a/apps/backend/tests/renderWakatimeCard.test.js b/packages/core/tests/renderWakatimeCard.test.js similarity index 98% rename from apps/backend/tests/renderWakatimeCard.test.js rename to packages/core/tests/renderWakatimeCard.test.js index 8c4971cf..ba8577c7 100644 --- a/apps/backend/tests/renderWakatimeCard.test.js +++ b/packages/core/tests/renderWakatimeCard.test.js @@ -5,8 +5,6 @@ import { renderWakatimeCard } from "../src/cards/wakatime.js"; import { wakaTimeData } from "./fetchWakatime.test.js"; -import "@testing-library/jest-dom/vitest"; - describe("Test Render WakaTime Card", () => { it("should render correctly", () => { const card = renderWakatimeCard(wakaTimeData.data); diff --git a/apps/backend/tests/retryer.test.js b/packages/core/tests/retryer.test.js similarity index 83% rename from apps/backend/tests/retryer.test.js rename to packages/core/tests/retryer.test.js index b82716b3..10572081 100644 --- a/apps/backend/tests/retryer.test.js +++ b/packages/core/tests/retryer.test.js @@ -2,8 +2,6 @@ import { describe, expect, it, vi } from "vitest"; -import "@testing-library/jest-dom/vitest"; - import { logger } from "../src/common/log.js"; import { retryer } from "../src/common/retryer.js"; @@ -51,6 +49,11 @@ const fetcherFailWithMessageBasedRateLimitErr = vi.fn( }, ); +const customFetcher = vi.fn((variables, token) => { + logger.log(variables, token); + return Promise.resolve({ data: { token } }); +}); + describe("Test Retryer", () => { it("retryer should return value and have zero retries on first try", async () => { let res = await retryer(fetcher, {}); @@ -82,4 +85,12 @@ describe("Test Retryer", () => { expect(err.message).toBe("Downtime due to GitHub API rate limiting"); } }); + + it("retryer should use injected PATs when provided", async () => { + const res = await retryer(customFetcher, {}, "user-pat-token"); + + expect(customFetcher).toHaveBeenCalledTimes(1); + expect(customFetcher).toHaveBeenCalledWith({}, "user-pat-token", 0); + expect(res).toStrictEqual({ data: { token: "user-pat-token" } }); + }); }); diff --git a/packages/core/tests/utils.js b/packages/core/tests/utils.js new file mode 100644 index 00000000..21b9f1f8 --- /dev/null +++ b/packages/core/tests/utils.js @@ -0,0 +1,41 @@ +// @ts-check + +/** + * Creates an asymmetric matcher for approximate numeric equality. + * + * This helper is intended for use in test frameworks (e.g., Jest) where + * values need to be compared within a configurable decimal precision + * instead of strict equality. + * + * The comparison succeeds when: + * + * |actual - expected| < 10^(-precision) + * + * For example, with `precision = 3`, values must be within `0.001`. + * + * @param {number} expected The expected numeric value to compare against. + * + * @param {number} [precision=10] + * The number of decimal places of tolerance. Higher values mean stricter + * comparison. Internally converted to epsilon = 10^-precision. + * + * @returns {{ + * asymmetricMatch(actual: unknown): boolean, + * toAsymmetricMatcher(): string + * }} An object implementing Jest-style asymmetric matcher methods. + * + */ +export function approxNumber(expected, precision = 10) { + return { + asymmetricMatch(actual) { + if (typeof actual !== "number" || typeof expected !== "number") { + return false; + } + const epsilon = Math.pow(10, -precision); + return Math.abs(actual - expected) < epsilon; + }, + toAsymmetricMatcher() { + return `≈ ${expected} (precision ${precision})`; + }, + }; +} diff --git a/packages/core/tsconfig.build.json b/packages/core/tsconfig.build.json new file mode 100644 index 00000000..e58f87a7 --- /dev/null +++ b/packages/core/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": ["./tsconfig.json"], + "include": ["src"], + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "customConditions": [] + } +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 00000000..c1b9c120 --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": ["../../tsconfig.base.json"], + "include": ["src", "tests", "vitest.config.ts"], + "compilerOptions": { + /** + * This workspace contains a lot of type errors. + * We will add typecheck later: + * @see https://github.com/stats-organization/github-stats-extended/issues/140 + * + * At the moment we just need to output `js` and `.d.ts` files + */ + "noCheck": true, + + "allowJs": true, + "checkJs": true, + + "module": "nodenext", + "moduleResolution": "nodenext", + "outDir": "build" + } +} diff --git a/packages/core/tsconfig.typecheck.json b/packages/core/tsconfig.typecheck.json new file mode 100644 index 00000000..4c13d7b1 --- /dev/null +++ b/packages/core/tsconfig.typecheck.json @@ -0,0 +1,7 @@ +{ + "extends": ["./tsconfig.json"], + "compilerOptions": { + "noEmit": true, + "customConditions": [] + } +} diff --git a/packages/core/vitest.config.ts b/packages/core/vitest.config.ts new file mode 100644 index 00000000..4e11ea53 --- /dev/null +++ b/packages/core/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineProject } from "vitest/config"; + +export default defineProject({ + test: { + environment: "jsdom", + include: ["./tests/*.test.{ts,js}"], + setupFiles: ["./tests/_setup.js"], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a23363aa..be659cdc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,72 +7,182 @@ settings: catalogs: default: '@vitest/coverage-v8': - specifier: 4.0.18 - version: 4.0.18 + specifier: 4.1.2 + version: 4.1.2 vite: specifier: 7.3.1 version: 7.3.1 vitest: - specifier: 4.0.18 - version: 4.0.18 + specifier: 4.1.2 + version: 4.1.2 importers: .: devDependencies: '@eslint/compat': - specifier: 2.0.2 - version: 2.0.2(eslint@9.39.2(jiti@2.6.1)) + specifier: 2.0.3 + version: 2.0.3(eslint@10.1.0(jiti@2.6.1)) '@eslint/js': - specifier: 9.39.3 - version: 9.39.3 + specifier: 10.0.1 + version: 10.0.1(eslint@10.1.0(jiti@2.6.1)) '@playwright/test': - specifier: 1.58.2 - version: 1.58.2 + specifier: 1.59.1 + version: 1.59.1 '@types/node': - specifier: 24.10.13 - version: 24.10.13 + specifier: 24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: catalog:default + version: 4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3))) eslint: - specifier: 9.39.2 - version: 9.39.2(jiti@2.6.1) + specifier: 10.1.0 + version: 10.1.0(jiti@2.6.1) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-import-x: - specifier: 4.16.1 - version: 4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + specifier: 4.16.2 + version: 4.16.2(@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-jsdoc: - specifier: 62.7.1 - version: 62.7.1(eslint@9.39.2(jiti@2.6.1)) + specifier: 62.9.0 + version: 62.9.0(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) + version: 7.37.5(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: 7.0.1 - version: 7.0.1(eslint@9.39.2(jiti@2.6.1)) + version: 7.0.1(eslint@10.1.0(jiti@2.6.1)) globals: - specifier: 17.3.0 - version: 17.3.0 + specifier: 17.4.0 + version: 17.4.0 husky: specifier: 9.1.7 version: 9.1.7 knip: - specifier: 5.85.0 - version: 5.85.0(@types/node@24.10.13)(typescript@5.9.3) + specifier: 6.2.0 + version: 6.2.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) lint-staged: - specifier: 16.2.7 - version: 16.2.7 + specifier: 16.4.0 + version: 16.4.0 prettier: specifier: 3.8.1 version: 3.8.1 + turbo: + specifier: 2.9.3 + version: 2.9.3 typescript: specifier: 5.9.3 version: 5.9.3 typescript-eslint: - specifier: 8.56.1 - version: 8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.58.0 + version: 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + vitest: + specifier: catalog:default + version: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) apps/backend: + dependencies: + '@stats-organization/github-readme-stats-core': + specifier: workspace:^ + version: link:../../packages/core + axios: + specifier: ^1.13.5 + version: 1.13.5 + pg: + specifier: ^8.18.0 + version: 8.18.0 + devDependencies: + axios-mock-adapter: + specifier: 2.1.0 + version: 2.1.0(axios@1.13.5) + express: + specifier: 5.2.1 + version: 5.2.1 + jsdom: + specifier: 28.1.0 + version: 28.1.0 + vitest: + specifier: catalog:default + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + + apps/frontend: + dependencies: + '@reduxjs/toolkit': + specifier: ^2.11.2 + version: 2.11.2(react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1))(react@18.3.1) + '@stats-organization/github-readme-stats-backend': + specifier: workspace:^ + version: link:../backend + '@stats-organization/github-readme-stats-core': + specifier: workspace:^ + version: link:../../packages/core + '@tailwindcss/vite': + specifier: ^4.2.1 + version: 4.2.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + axios: + specifier: ^1 + version: 1.13.5 + axios-cache-interceptor: + specifier: ^1 + version: 1.11.4(axios@1.13.5) + daisyui: + specifier: ^5.5.19 + version: 5.5.19 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-icons: + specifier: ^5.5.0 + version: 5.5.0(react@18.3.1) + react-loading-skeleton: + specifier: ^3.3.1 + version: 3.5.0(react@18.3.1) + react-redux: + specifier: ^9.2.0 + version: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1) + react-spinners: + specifier: ^0.17.0 + version: 0.17.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-toastify: + specifier: ^11.0.5 + version: 11.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + redux: + specifier: ^5.0.1 + version: 5.0.1 + save-svg-as-png: + specifier: ^1.4.17 + version: 1.4.17 + uuid: + specifier: ^13.0.0 + version: 13.0.0 + devDependencies: + '@types/react': + specifier: 18.3.27 + version: 18.3.27 + '@types/react-dom': + specifier: 18.3.7 + version: 18.3.7(@types/react@18.3.27) + '@vitejs/plugin-react-swc': + specifier: 4.2.3 + version: 4.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + clsx: + specifier: 2.1.1 + version: 2.1.1 + tailwindcss: + specifier: 4.2.1 + version: 4.2.1 + vite: + specifier: catalog:default + version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) + vitest: + specifier: catalog:default + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + + packages/core: dependencies: axios: specifier: ^1.13.5 @@ -83,125 +193,31 @@ importers: github-username-regex: specifier: ^1.0.0 version: 1.0.0 - pg: - specifier: ^8.18.0 - version: 8.18.0 word-wrap: specifier: ^1.2.5 version: 1.2.5 devDependencies: '@testing-library/dom': - specifier: ^10.4.1 + specifier: 10.4.1 version: 10.4.1 '@testing-library/jest-dom': - specifier: ^6.9.1 + specifier: 6.9.1 version: 6.9.1 '@uppercod/css-to-object': - specifier: ^1.1.1 + specifier: 1.1.1 version: 1.1.1 - '@vitest/coverage-v8': - specifier: catalog:default - version: 4.0.18(vitest@4.0.18(@types/node@25.2.3)(happy-dom@20.6.1)(jiti@2.6.1)(jsdom@28.1.0)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2)) axios-mock-adapter: - specifier: ^2.1.0 + specifier: 2.1.0 version: 2.1.0(axios@1.13.5) - express: - specifier: ^5.2.1 - version: 5.2.1 js-yaml: - specifier: ^4.1.1 + specifier: 4.1.1 version: 4.1.1 jsdom: specifier: 28.1.0 version: 28.1.0 vitest: specifier: catalog:default - version: 4.0.18(@types/node@25.2.3)(happy-dom@20.6.1)(jiti@2.6.1)(jsdom@28.1.0)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2) - - apps/frontend: - dependencies: - '@reduxjs/toolkit': - specifier: 2.11.2 - version: 2.11.2(react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1))(react@18.3.1) - '@tailwindcss/vite': - specifier: 4.2.1 - version: 4.2.1(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2)) - axios: - specifier: ^1 - version: 1.13.5 - axios-cache-interceptor: - specifier: ^1 - version: 1.11.4(axios@1.13.5) - daisyui: - specifier: 5.5.19 - version: 5.5.19 - emoji-name-map: - specifier: ^2.0.3 - version: 2.0.3 - github-username-regex: - specifier: ^1.0.0 - version: 1.0.0 - react: - specifier: 18.3.1 - version: 18.3.1 - react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) - react-icons: - specifier: ^5.5.0 - version: 5.5.0(react@18.3.1) - react-loading-skeleton: - specifier: ^3.3.1 - version: 3.5.0(react@18.3.1) - react-redux: - specifier: 9.2.0 - version: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1) - react-spinners: - specifier: ^0.17.0 - version: 0.17.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-toastify: - specifier: 11.0.5 - version: 11.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - redux: - specifier: 5.0.1 - version: 5.0.1 - save-svg-as-png: - specifier: ^1.4.17 - version: 1.4.17 - uuid: - specifier: 13.0.0 - version: 13.0.0 - word-wrap: - specifier: ^1.2.5 - version: 1.2.5 - devDependencies: - '@types/react': - specifier: 18.3.27 - version: 18.3.27 - '@types/react-dom': - specifier: 18.3.7 - version: 18.3.7(@types/react@18.3.27) - '@vitejs/plugin-react-swc': - specifier: 4.2.3 - version: 4.2.3(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2)) - clsx: - specifier: 2.1.1 - version: 2.1.1 - tailwindcss: - specifier: 4.2.1 - version: 4.2.1 - vite: - specifier: catalog:default - version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2) - vite-plugin-node-polyfills: - specifier: 0.25.0 - version: 0.25.0(rollup@4.59.0)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2)) - vite-plugin-string-replace: - specifier: 1.1.5 - version: 1.1.5 - vitest: - specifier: catalog:default - version: 4.0.18(@types/node@25.2.3)(happy-dom@20.6.1)(jiti@2.6.1)(jsdom@28.1.0)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2) + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) packages: @@ -267,12 +283,12 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} hasBin: true @@ -331,17 +347,17 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} - '@emnapi/core@1.8.1': - resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@es-joy/jsdoccomment@0.84.0': - resolution: {integrity: sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==} + '@es-joy/jsdoccomment@0.86.0': + resolution: {integrity: sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@es-joy/resolve.exports@1.2.0': @@ -514,8 +530,8 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@2.0.2': - resolution: {integrity: sha512-pR1DoD0h3HfF675QZx0xsyrsU8q70Z/plx7880NOhS02NuWLgBCOMDL787nUeQ7EWLkxv3bPQJaarjcPQb2Dwg==} + '@eslint/compat@2.0.3': + resolution: {integrity: sha512-SjIJhGigp8hmd1YGIBwh7Ovri7Kisl42GYFjrOyHhtfYGGoLW6teYi/5p8W50KSsawUPpuLOSmsq1bD0NGQLBw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: ^8.40 || 9 || 10 @@ -523,41 +539,34 @@ packages: eslint: optional: true - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@1.1.0': - resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==} + '@eslint/config-array@0.23.3': + resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.4': - resolution: {integrity: sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.5.3': + resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.2': - resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.1.1': + resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.3': - resolution: {integrity: sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.3': + resolution: {integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.6.1': + resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@exodus/bytes@1.14.1': resolution: {integrity: sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ==} @@ -606,8 +615,11 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@napi-rs/wasm-runtime@1.1.2': + resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -621,116 +633,249 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-resolver/binding-android-arm-eabi@11.19.0': - resolution: {integrity: sha512-dlMjjWE3h+qMujLp5nBX/x7R5ny+xfr4YtsyaMNuM5JImOtQBzpFxQr9kJOKGL+9RbaoTOXpt5KF05f9pnOsgw==} + '@oxc-parser/binding-android-arm-eabi@0.121.0': + resolution: {integrity: sha512-n07FQcySwOlzap424/PLMtOkbS7xOu8nsJduKL8P3COGHKgKoDYXwoAHCbChfgFpHnviehrLWIPX0lKGtbEk/A==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm64@11.19.0': - resolution: {integrity: sha512-x5P0Y12oMcSC9PKkz1FtdVVLosXYi/05m+ufxPrUggd6vZRBPJhW4zZUsMVbz8dwwk71Dh0f6/2ntw3WPOq+Ig==} + '@oxc-parser/binding-android-arm64@0.121.0': + resolution: {integrity: sha512-/Dd1xIXboYAicw+twT2utxPD7bL8qh7d3ej0qvaYIMj3/EgIrGR+tSnjCUkiCT6g6uTC0neSS4JY8LxhdSU/sA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.19.0': - resolution: {integrity: sha512-DjnuIPB60IQrVSCiuVBzN8/8AeeIjthdkk+dZYdZzgLeP2T5ZF41u50haJMtIdGr5cRzRH6zPV/gh6+RFjlvKA==} + '@oxc-parser/binding-darwin-arm64@0.121.0': + resolution: {integrity: sha512-A0jNEvv7QMtCO1yk205t3DWU9sWUjQ2KNF0hSVO5W9R9r/R1BIvzG01UQAfmtC0dQm7sCrs5puixurKSfr2bRQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.19.0': - resolution: {integrity: sha512-dVAqIZIIY7xOXCCV0nJPs8ExlYc6R7mcNpFobwNyE3qlXGbgvwb7Gl3iOumOiPBfF+sbJR3MMP7RAPfKqbvYyA==} + '@oxc-parser/binding-darwin-x64@0.121.0': + resolution: {integrity: sha512-SsHzipdxTKUs3I9EOAPmnIimEeJOemqRlRDOp9LIj+96wtxZejF51gNibmoGq8KoqbT1ssAI5po/E3J+vEtXGA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.19.0': - resolution: {integrity: sha512-kwcZ30bIpJNFcT22sIlde4mz0EyXmB3lAefCFWtffqpbmLweQUwz1dKDcsutxEjpkbEKLmfrj1wCyRZp7n5Hnw==} + '@oxc-parser/binding-freebsd-x64@0.121.0': + resolution: {integrity: sha512-v1APOTkCp+RWOIDAHRoaeW/UoaHF15a60E8eUL6kUQXh+i4K7PBwq2Wi7jm8p0ymID5/m/oC1w3W31Z/+r7HQw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.0': - resolution: {integrity: sha512-GImk/cb3X+zBGEwr6l9h0dbiNo5zNd52gamZmluEpbyybiZ8kc5q44/7zRR4ILChWRW7pI92W57CJwhkF+wRmg==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': + resolution: {integrity: sha512-PmqPQuqHZyFVWA4ycr0eu4VnTMmq9laOHZd+8R359w6kzuNZPvmmunmNJ8ybkm769A0nCoVp3TJ6dUz7B3FYIQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.19.0': - resolution: {integrity: sha512-uIEyws3bBD1gif4SZCOV2XIr6q5fd1WbzzBbpL8qk+TbzOvKMWnMNNtfNacnAGGa2lLRNXR1Fffot2mlZ/Xmbw==} + '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': + resolution: {integrity: sha512-vF24htj+MOH+Q7y9A8NuC6pUZu8t/C2Fr/kDOi2OcNf28oogr2xadBPXAbml802E8wRAVfbta6YLDQTearz+jw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.19.0': - resolution: {integrity: sha512-bIkgp+AB+yZfvdKDfjFT7PycsRtih7+zCV5AbnkzfyvNvQ47rfssf8R1IbG++mx+rZ4YUCUu8EbP66HC3O5c5w==} + '@oxc-parser/binding-linux-arm64-gnu@0.121.0': + resolution: {integrity: sha512-wjH8cIG2Lu/3d64iZpbYr73hREMgKAfu7fqpXjgM2S16y2zhTfDIp8EQjxO8vlDtKP5Rc7waZW72lh8nZtWrpA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-arm64-musl@11.19.0': - resolution: {integrity: sha512-bOt5pKPcbidTSy64m2CfM0XcaCmxBEFclCMPuOPO08hh8QIFTiZVhFf/OxTFqyRwhq/tlzzKmXpMo7DfzbO5lQ==} + '@oxc-parser/binding-linux-arm64-musl@0.121.0': + resolution: {integrity: sha512-qT663J/W8yQFw3dtscbEi9LKJevr20V7uWs2MPGTnvNZ3rm8anhhE16gXGpxDOHeg9raySaSHKhd4IGa3YZvuw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-ppc64-gnu@11.19.0': - resolution: {integrity: sha512-BymEPqVeLZzA/1kXow9U9rdniq1r5kk4u686Cx3ZU77YygR48NJI/2TyjM70vKHZffGx75ZShobcc1M5GXG3WA==} + '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': + resolution: {integrity: sha512-mYNe4NhVvDBbPkAP8JaVS8lC1dsoJZWH5WCjpw5E+sjhk1R08wt3NnXYUzum7tIiWPfgQxbCMcoxgeemFASbRw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-gnu@11.19.0': - resolution: {integrity: sha512-aFgPTzZZY+XCYe4B+3A1S63xcIh2i136+2TPXWr9NOwXXTdMdBntb1J9fEgxXDnX82MjBknLUpJqAZHNTJzixA==} + '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': + resolution: {integrity: sha512-+QiFoGxhAbaI/amqX567784cDyyuZIpinBrJNxUzb+/L2aBRX67mN6Jv40pqduHf15yYByI+K5gUEygCuv0z9w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-musl@11.19.0': - resolution: {integrity: sha512-9WDGt7fV9GK97WrWE/VEDhMFv9m0ZXYn5NQ+16QvyT0ux8yGLAvyadi6viaTjEdJII/OaHBRYHcL+zUjmaWwmg==} + '@oxc-parser/binding-linux-riscv64-musl@0.121.0': + resolution: {integrity: sha512-9ykEgyTa5JD/Uhv2sttbKnCfl2PieUfOjyxJC/oDL2UO0qtXOtjPLl7H8Kaj5G7p3hIvFgu3YWvAxvE0sqY+hQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-s390x-gnu@11.19.0': - resolution: {integrity: sha512-SY3di6tccocppAVal5Hev3D6D1N5Y6TCEypAvNCOiPqku2Y8U/aXfvGbthqdPNa72KYqjUR1vomOv6J9thHITA==} + '@oxc-parser/binding-linux-s390x-gnu@0.121.0': + resolution: {integrity: sha512-DB1EW5VHZdc1lIRjOI3bW/wV6R6y0xlfvdVrqj6kKi7Ayu2U3UqUBdq9KviVkcUGd5Oq+dROqvUEEFRXGAM7EQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-x64-gnu@11.19.0': - resolution: {integrity: sha512-SV+4zBeCC3xjSE2wvhN45eyABoVRX3xryWBABFKfLwAWhF3wsB3bUF+CantYfQ/TLpasyvplRS9ovvFT9cb/0A==} + '@oxc-parser/binding-linux-x64-gnu@0.121.0': + resolution: {integrity: sha512-s4lfobX9p4kPTclvMiH3gcQUd88VlnkMTF6n2MTMDAyX5FPNRhhRSFZK05Ykhf8Zy5NibV4PbGR6DnK7FGNN6A==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-x64-musl@11.19.0': - resolution: {integrity: sha512-LkbjO+r5Isl8Xl29pJYOCB/iSUIULFUJDGdMp+yJD3OgWtSa6VJta2iw7QXmpcoOkq18UIL09yWrlyjLDL0Hug==} + '@oxc-parser/binding-linux-x64-musl@0.121.0': + resolution: {integrity: sha512-P9KlyTpuBuMi3NRGpJO8MicuGZfOoqZVRP1WjOecwx8yk4L/+mrCRNc5egSi0byhuReblBF2oVoDSMgV9Bj4Hw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxc-resolver/binding-openharmony-arm64@11.19.0': - resolution: {integrity: sha512-Ud1gelL5slpEU5AjzBWQz1WheprOAl5CPnCKTWynvvdlBbAZXA6fPYLuCrlRo0uw+x3f37XJ71kirpSew8Zyvg==} + '@oxc-parser/binding-openharmony-arm64@0.121.0': + resolution: {integrity: sha512-R+4jrWOfF2OAPPhj3Eb3U5CaKNAH9/btMveMULIrcNW/hjfysFQlF8wE0GaVBr81dWz8JLgQlsxwctoL78JwXw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-resolver/binding-wasm32-wasi@11.19.0': - resolution: {integrity: sha512-wXLNAVmL4vWXKaYJnFPgg5zQsSr3Rv+ftNReIU3UkzTcoVLK0805Pnbr2NwcBWSO5hhpOEdys02qlT2kxVgjWw==} + '@oxc-parser/binding-wasm32-wasi@0.121.0': + resolution: {integrity: sha512-5TFISkPTymKvsmIlKasPVTPuWxzCcrT8pM+p77+mtQbIZDd1UC8zww4CJcRI46kolmgrEX6QpKO8AvWMVZ+ifw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.19.0': - resolution: {integrity: sha512-zszvr0dJfvv0Jg49hLwjAJ4SRzfsq28SoearUtT1qv3qXRYsBWuctdlRa/lEZkiuG4tZWiY425Jh9QqLafwsAg==} + '@oxc-parser/binding-win32-arm64-msvc@0.121.0': + resolution: {integrity: sha512-V0pxh4mql4XTt3aiEtRNUeBAUFOw5jzZNxPABLaOKAWrVzSr9+XUaB095lY7jqMf5t8vkfh8NManGB28zanYKw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-ia32-msvc@11.19.0': - resolution: {integrity: sha512-I7ZYujr5XL1l7OwuddbOeqdUyFOaf51W1U2xUogInFdupIAKGqbpugpAK6RaccLcSlN0bbuo3CS5h7ue38SUAg==} + '@oxc-parser/binding-win32-ia32-msvc@0.121.0': + resolution: {integrity: sha512-4Ob1qvYMPnlF2N9rdmKdkQFdrq16QVcQwBsO8yiPZXof0fHKFF+LmQV501XFbi7lHyrKm8rlJRfQ/M8bZZPVLw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@11.19.0': - resolution: {integrity: sha512-NxErbI1TmJEZZVvGPePjgXFZCuOzrjQuJ6YwHjcWkelReK7Uhg4QeL05zRdfTpgkH6IY/C8OjbKx5ZilQ4yDFg==} + '@oxc-parser/binding-win32-x64-msvc@0.121.0': + resolution: {integrity: sha512-BOp1KCzdboB1tPqoCPXgntgFs0jjeSyOXHzgxVFR7B/qfr3F8r4YDacHkTOUNXtDgM8YwKnkf3rE5gwALYX7NA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@playwright/test@1.58.2': - resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} + '@oxc-project/types@0.121.0': + resolution: {integrity: sha512-CGtOARQb9tyv7ECgdAlFxi0Fv7lmzvmlm2rpD/RdijOO9rfk/JvB1CjT8EnoD+tjna/IYgKKw3IV7objRb+aYw==} + + '@oxc-resolver/binding-android-arm-eabi@11.19.1': + resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.19.1': + resolution: {integrity: sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.19.1': + resolution: {integrity: sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.19.1': + resolution: {integrity: sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.19.1': + resolution: {integrity: sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': + resolution: {integrity: sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': + resolution: {integrity: sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': + resolution: {integrity: sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-arm64-musl@11.19.1': + resolution: {integrity: sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': + resolution: {integrity: sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': + resolution: {integrity: sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': + resolution: {integrity: sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': + resolution: {integrity: sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-gnu@11.19.1': + resolution: {integrity: sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-musl@11.19.1': + resolution: {integrity: sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-openharmony-arm64@11.19.1': + resolution: {integrity: sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA==} + cpu: [arm64] + os: [openharmony] + + '@oxc-resolver/binding-wasm32-wasi@11.19.1': + resolution: {integrity: sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': + resolution: {integrity: sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': + resolution: {integrity: sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA==} + cpu: [ia32] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.19.1': + resolution: {integrity: sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw==} + cpu: [x64] + os: [win32] + + '@package-json/types@0.0.12': + resolution: {integrity: sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==} + + '@playwright/test@1.59.1': + resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==} engines: {node: '>=18'} hasBin: true @@ -748,24 +893,6 @@ packages: '@rolldown/pluginutils@1.0.0-rc.2': resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} - '@rollup/plugin-inject@5.0.5': - resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/rollup-android-arm-eabi@4.59.0': resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] @@ -908,10 +1035,6 @@ packages: resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} engines: {node: '>=18'} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1099,6 +1222,36 @@ packages: resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@turbo/darwin-64@2.9.3': + resolution: {integrity: sha512-P8foouaP+y/p+hhEGBoZpzMbpVvUMwPjDpcy6wN7EYfvvyISD1USuV27qWkczecihwuPJzQ1lDBuL8ERcavTyg==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.9.3': + resolution: {integrity: sha512-SIzEkvtNdzdI50FJDaIQ6kQGqgSSdFPcdn0wqmmONN6iGKjy6hsT+EH99GP65FsfV7DLZTh2NmtTIRl2kdoz5Q==} + cpu: [arm64] + os: [darwin] + + '@turbo/linux-64@2.9.3': + resolution: {integrity: sha512-pLRwFmcHHNBvsCySLS6OFabr/07kDT2pxEt/k6eBf/3asiVQZKJ7Rk88AafQx2aYA641qek4RsXvYO3JYpiBug==} + cpu: [x64] + os: [linux] + + '@turbo/linux-arm64@2.9.3': + resolution: {integrity: sha512-gy6ApUroC2Nzv+qjGtE/uPNkhHAFU4c8God+zd5Aiv9L9uBgHlxVJpHT3XWl5xwlJZ2KWuMrlHTaS5kmNB+q1Q==} + cpu: [arm64] + os: [linux] + + '@turbo/windows-64@2.9.3': + resolution: {integrity: sha512-d0YelTX6hAsB7kIEtGB3PzIzSfAg3yDoUlHwuwJc3adBXUsyUIs0YLG+1NNtuhcDOUGnWQeKUoJ2pGWvbpRj7w==} + cpu: [x64] + os: [win32] + + '@turbo/windows-arm64@2.9.3': + resolution: {integrity: sha512-/08CwpKJl3oRY8nOlh2YgilZVJDHsr60XTNxRhuDeuFXONpUZ5X+Nv65izbG/xBew9qxcJFbDX9/sAmAX+ITcQ==} + cpu: [arm64] + os: [win32] + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -1111,17 +1264,20 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@24.10.13': - resolution: {integrity: sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==} + '@types/node@24.12.0': + resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==} - '@types/node@25.2.3': - resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} + '@types/node@25.5.0': + resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -1143,63 +1299,63 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.56.1': - resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} + '@typescript-eslint/eslint-plugin@8.58.0': + resolution: {integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.56.1 + '@typescript-eslint/parser': ^8.58.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.56.1': - resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==} + '@typescript-eslint/parser@8.58.0': + resolution: {integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==} 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: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.56.1': - resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} + '@typescript-eslint/project-service@8.58.0': + resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.56.1': - resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} + '@typescript-eslint/scope-manager@8.58.0': + resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.56.1': - resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} + '@typescript-eslint/tsconfig-utils@8.58.0': + resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.56.1': - resolution: {integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==} + '@typescript-eslint/type-utils@8.58.0': + resolution: {integrity: sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==} 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: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.56.1': - resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} + '@typescript-eslint/types@8.58.0': + resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.56.1': - resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} + '@typescript-eslint/typescript-estree@8.58.0': + resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.56.1': - resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} + '@typescript-eslint/utils@8.58.0': + resolution: {integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==} 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: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.56.1': - resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} + '@typescript-eslint/visitor-keys@8.58.0': + resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -1314,43 +1470,43 @@ packages: peerDependencies: vite: ^4 || ^5 || ^6 || ^7 - '@vitest/coverage-v8@4.0.18': - resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} + '@vitest/coverage-v8@4.1.2': + resolution: {integrity: sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==} peerDependencies: - '@vitest/browser': 4.0.18 - vitest: 4.0.18 + '@vitest/browser': 4.1.2 + vitest: 4.1.2 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.18': - resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + '@vitest/expect@4.1.2': + resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} - '@vitest/mocker@4.0.18': - resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + '@vitest/mocker@4.1.2': + resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.0.18': - resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + '@vitest/pretty-format@4.1.2': + resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} - '@vitest/runner@4.0.18': - resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + '@vitest/runner@4.1.2': + resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==} - '@vitest/snapshot@4.0.18': - resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + '@vitest/snapshot@4.1.2': + resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==} - '@vitest/spy@4.0.18': - resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + '@vitest/spy@4.1.2': + resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==} - '@vitest/utils@4.0.18': - resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + '@vitest/utils@4.1.2': + resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} @@ -1385,10 +1541,6 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} @@ -1439,18 +1591,12 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - asn1.js@4.10.1: - resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-v8-to-istanbul@0.3.11: - resolution: {integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==} + ast-v8-to-istanbul@1.0.0: + resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} @@ -1484,81 +1630,37 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - baseline-browser-mapping@2.10.0: - resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + baseline-browser-mapping@2.10.13: + resolution: {integrity: sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==} engines: {node: '>=6.0.0'} hasBin: true bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - bn.js@4.12.3: - resolution: {integrity: sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==} - - bn.js@5.2.3: - resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} - body-parser@2.2.2: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.13: + resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} - brace-expansion@5.0.3: - resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - - browser-resolve@2.0.0: - resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} - - browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - - browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} - - browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} - - browserify-rsa@4.1.1: - resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} - engines: {node: '>= 0.10'} - - browserify-sign@4.2.5: - resolution: {integrity: sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==} - engines: {node: '>= 0.10'} - - browserify-zlib@0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - builtin-status-codes@3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1578,44 +1680,25 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - caniuse-lite@1.0.30001774: - resolution: {integrity: sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==} + caniuse-lite@1.0.30001784: + resolution: {integrity: sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==} chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - cipher-base@1.0.7: - resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} - engines: {node: '>= 0.10'} - cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} - cli-truncate@5.1.1: - resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} engines: {node: '>=20'} clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -1630,19 +1713,13 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - comment-parser@1.4.5: - resolution: {integrity: sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==} + comment-parser@1.4.6: + resolution: {integrity: sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==} engines: {node: '>= 12.0.0'} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - console-browserify@1.2.0: - resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} - - constants-browserify@1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - content-disposition@1.0.1: resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} engines: {node: '>=18'} @@ -1662,29 +1739,10 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} - - create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - - create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crypto-browserify@3.12.1: - resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} - engines: {node: '>= 0.10'} - css-tree@3.1.0: resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} @@ -1753,16 +1811,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -1773,10 +1825,6 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - domain-browser@4.22.0: - resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} - engines: {node: '>=10'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1784,11 +1832,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.302: - resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} - - elliptic@6.6.1: - resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + electron-to-chromium@1.5.331: + resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} emoji-name-map@2.0.3: resolution: {integrity: sha512-3KBuQuhYkRtLd9utBKfTtclbWP3IytC1FNcXg+NKARltPSYpkg/MLiklGv4vLwl8A8jMQjdneXNBYx8k0rrg+g==} @@ -1824,12 +1869,12 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.2: - resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} + es-iterator-helpers@1.3.1: + resolution: {integrity: sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -1863,10 +1908,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - eslint-import-context@0.1.9: resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -1889,12 +1930,12 @@ packages: eslint-plugin-import-x: optional: true - eslint-plugin-import-x@4.16.1: - resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} + eslint-plugin-import-x@4.16.2: + resolution: {integrity: sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/utils': ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/utils': ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 eslint-import-resolver-node: '*' peerDependenciesMeta: '@typescript-eslint/utils': @@ -1902,8 +1943,8 @@ packages: eslint-import-resolver-node: optional: true - eslint-plugin-jsdoc@62.7.1: - resolution: {integrity: sha512-4Zvx99Q7d1uggYBUX/AIjvoyqXhluGbbKrRmG8SQTLprPFg6fa293tVJH1o1GQwNe3lUydd8ZHzn37OaSncgSQ==} + eslint-plugin-jsdoc@62.9.0: + resolution: {integrity: sha512-PY7/X4jrVgoIDncUmITlUqK546Ltmx/Pd4Hdsu4CvSjryQZJI2mEV4vrdMufyTetMiZ5taNSqvK//BTgVUlNkA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -1920,25 +1961,21 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.39.2: - resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@10.1.0: + resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -1946,12 +1983,8 @@ packages: jiti: optional: true - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@11.1.1: - resolution: {integrity: sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} esquery@1.7.0: @@ -1966,9 +1999,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -1983,13 +2013,6 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -2049,8 +2072,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} @@ -2126,8 +2149,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.13.6: - resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + get-tsconfig@4.13.7: + resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} github-username-regex@1.0.0: resolution: {integrity: sha512-EqDVkN0/5MQyDPOSDLInVRRXdeISRfcN1UW/1FUqD2knV1HHw8DndMB3UPNn5lO51DvRnjzbLXwWqNNV86PLOw==} @@ -2140,22 +2163,14 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - globals@17.3.0: - resolution: {integrity: sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==} + globals@17.4.0: + resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -2190,17 +2205,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hash-base@3.0.5: - resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} - engines: {node: '>= 0.10'} - - hash-base@3.1.2: - resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} - engines: {node: '>= 0.8'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -2211,9 +2215,6 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - html-encoding-sniffer@6.0.0: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -2235,9 +2236,6 @@ packages: http-vary@1.0.3: resolution: {integrity: sha512-sx7Y8YTqF3o0mFJJvF66n8dbaE8v3liV1RgCz46XP5xK7dnzyZHvwMWRA115q5kjbCPBV65/nOMlgW54WLyiag==} - https-browserify@1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -2251,9 +2249,6 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2265,10 +2260,6 @@ packages: immer@11.1.4: resolution: {integrity: sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==} - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -2288,10 +2279,6 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -2355,10 +2342,6 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -2413,19 +2396,12 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isomorphic-timers-promises@1.0.1: - resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} - engines: {node: '>=10'} - istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -2456,8 +2432,8 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsdoc-type-pratt-parser@7.1.1: - resolution: {integrity: sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==} + jsdoc-type-pratt-parser@7.2.0: + resolution: {integrity: sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==} engines: {node: '>=20.0.0'} jsdom@28.1.0: @@ -2495,13 +2471,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - knip@5.85.0: - resolution: {integrity: sha512-V2kyON+DZiYdNNdY6GALseiNCwX7dYdpz9Pv85AUn69Gk0UKCts+glOKWfe5KmaMByRjM9q17Mzj/KinTVOyxg==} - engines: {node: '>=18.18.0'} + knip@6.2.0: + resolution: {integrity: sha512-4OMUMJARvNble8e8TeFv12flp4fKzAITrQec1eKO4g2eA4HnNqEa8CXy2UOPLjuYuAETpe0N0r25jF9yY9FLig==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - peerDependencies: - '@types/node': '>=18' - typescript: '>=5.0.4 <7' levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -2581,8 +2554,8 @@ packages: resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} - lint-staged@16.2.7: - resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} + lint-staged@16.4.0: + resolution: {integrity: sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==} engines: {node: '>=20.17'} hasBin: true @@ -2594,9 +2567,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -2630,9 +2600,6 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} @@ -2652,10 +2619,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2680,18 +2643,12 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - - minimatch@10.2.3: - resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.4: - resolution: {integrity: sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -2699,10 +2656,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nano-spawn@2.0.0: - resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} - engines: {node: '>=20.17'} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2724,12 +2677,8 @@ packages: resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} engines: {node: '>= 0.4'} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - - node-stdlib-browser@1.3.1: - resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} - engines: {node: '>=10'} + node-releases@2.0.37: + resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -2745,10 +2694,6 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -2787,15 +2732,16 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - os-browserify@0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - oxc-resolver@11.19.0: - resolution: {integrity: sha512-oEe42WEoZc2T5sCQqgaRBx8huzP4cJvrnm+BfNTJESdtM633Tqs6iowkpsMTXgnb7SLwU6N6D9bqwW/PULjo6A==} + oxc-parser@0.121.0: + resolution: {integrity: sha512-ek9o58+SCv6AV7nchiAcUJy1DNE2CC5WRdBcO0mF+W4oRjNQfPO7b3pLjTHSFECpHkKGOZSQxx3hk8viIL5YCg==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-resolver@11.19.1: + resolution: {integrity: sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg==} p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} @@ -2805,17 +2751,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-asn1@5.1.9: - resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} - engines: {node: '>= 0.10'} - parse-imports-exports@0.2.4: resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} @@ -2829,9 +2764,6 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2846,17 +2778,9 @@ packages: path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} - path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pbkdf2@3.1.5: - resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} - engines: {node: '>= 0.10'} - pg-cloudflare@1.3.0: resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} @@ -2894,30 +2818,21 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - - pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} - - playwright-core@1.58.2: - resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} + playwright-core@1.59.1: + resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} engines: {node: '>=18'} hasBin: true - playwright@1.58.2: - resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} + playwright@1.59.1: + resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} engines: {node: '>=18'} hasBin: true @@ -2958,13 +2873,6 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -2975,12 +2883,6 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - - punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2989,19 +2891,9 @@ packages: resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} engines: {node: '>=0.6'} - querystring-es3@0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -3059,13 +2951,6 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -3097,18 +2982,9 @@ packages: resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} engines: {node: '>=18'} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} - engines: {node: '>= 0.4'} - hasBin: true - resolve@2.0.0-next.6: resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} engines: {node: '>= 0.4'} @@ -3125,10 +3001,6 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - ripemd160@2.0.3: - resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} - engines: {node: '>= 0.8'} - rollup@4.59.0: resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3145,12 +3017,6 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -3201,17 +3067,9 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sha.js@2.4.12: - resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} - engines: {node: '>= 0.10'} - hasBin: true - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3243,16 +3101,16 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} - smol-toml@1.6.0: - resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + + smol-toml@1.6.1: + resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} engines: {node: '>= 18'} source-map-js@1.2.1: @@ -3290,19 +3148,13 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.0.0: + resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} - - stream-http@3.2.0: - resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -3334,24 +3186,14 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - 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-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - strip-json-comments@5.0.3: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} @@ -3379,23 +3221,19 @@ packages: engines: {node: '>=10'} hasBin: true - timers-browserify@2.0.12: - resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} - engines: {node: '>=0.6.0'} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + tinyexec@1.0.4: + resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} engines: {node: '>=18'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinyrainbow@3.0.3: - resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} tldts-core@7.0.23: @@ -3405,10 +3243,6 @@ packages: resolution: {integrity: sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw==} hasBin: true - to-buffer@1.2.2: - resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} - engines: {node: '>= 0.4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3432,8 +3266,8 @@ packages: try@1.0.3: resolution: {integrity: sha512-AHA8khVCII6zKyRkyPo6pRwoR9v5jb7QFw6e5avtaVSkxVfaEucYIo06xnwB+pJaEarfYNbs7W3Vq+LZLZiWyA==} - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -3441,8 +3275,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tty-browserify@0.0.1: - resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + turbo@2.9.3: + resolution: {integrity: sha512-J/VUvsGRykPb9R8Kh8dHVBOqioDexLk9BhLCU/ZybRR+HN9UR3cURdazFvNgMDt9zPP8TF6K73Z+tplfmi0PqQ==} + hasBin: true type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -3468,18 +3303,22 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.56.1: - resolution: {integrity: sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==} + typescript-eslint@8.58.0: + resolution: {integrity: sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==} 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: '>=4.8.4 <6.1.0' typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true + unbash@2.2.0: + resolution: {integrity: sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w==} + engines: {node: '>=14'} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -3487,14 +3326,13 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici@7.22.0: resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} engines: {node: '>=20.18.1'} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -3511,21 +3349,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url@0.11.4: - resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} - engines: {node: '>= 0.4'} - use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - uuid@13.0.0: resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true @@ -3534,14 +3362,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite-plugin-node-polyfills@0.25.0: - resolution: {integrity: sha512-rHZ324W3LhfGPxWwQb2N048TThB6nVvnipsqBUJEzh3R9xeK9KI3si+GMQxCuAcpPJBVf0LpDtJ+beYzB3/chg==} - peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - - vite-plugin-string-replace@1.1.5: - resolution: {integrity: sha512-6kxox6rs/v5mbmV7BvRmSjALyYEmXC/IRBVS5ymgaV9iXe/OW84s3XNJrQX8B8/u9M/LK3gbQ6hWiYiOzqSRYQ==} - vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3582,20 +3402,21 @@ packages: yaml: optional: true - vitest@4.0.18: - resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + vitest@4.1.2: + resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.18 - '@vitest/browser-preview': 4.0.18 - '@vitest/browser-webdriverio': 4.0.18 - '@vitest/ui': 4.0.18 + '@vitest/browser-playwright': 4.1.2 + '@vitest/browser-preview': 4.1.2 + '@vitest/browser-webdriverio': 4.1.2 + '@vitest/ui': 4.1.2 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -3616,9 +3437,6 @@ packages: jsdom: optional: true - vm-browserify@1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} - w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -3680,8 +3498,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -3706,8 +3524,8 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} engines: {node: '>= 14.6'} hasBin: true @@ -3762,8 +3580,8 @@ snapshots: '@babel/generator': 7.29.1 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -3778,7 +3596,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -3788,7 +3606,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -3816,12 +3634,12 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.28.6': + '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/parser@7.29.0': + '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 @@ -3830,7 +3648,7 @@ snapshots: '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': @@ -3838,7 +3656,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3 @@ -3878,29 +3696,29 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} - '@emnapi/core@1.8.1': + '@emnapi/core@1.9.2': dependencies: - '@emnapi/wasi-threads': 1.1.0 + '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.8.1': + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.1.0': + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true - '@es-joy/jsdoccomment@0.84.0': + '@es-joy/jsdoccomment@0.86.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.56.1 - comment-parser: 1.4.5 + '@typescript-eslint/types': 8.58.0 + comment-parser: 1.4.6 esquery: 1.7.0 - jsdoc-type-pratt-parser: 7.1.1 + jsdoc-type-pratt-parser: 7.2.0 '@es-joy/resolve.exports@1.2.0': {} @@ -3982,62 +3800,44 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.6.1))': dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.0.2(eslint@9.39.2(jiti@2.6.1))': + '@eslint/compat@2.0.3(eslint@10.1.0(jiti@2.6.1))': dependencies: - '@eslint/core': 1.1.0 + '@eslint/core': 1.1.1 optionalDependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.23.3': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.3 debug: 4.4.3 - minimatch: 3.1.4 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.5.3': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.1.1 - '@eslint/core@0.17.0': + '@eslint/core@1.1.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@1.1.0': + '@eslint/js@10.0.1(eslint@10.1.0(jiti@2.6.1))': + optionalDependencies: + eslint: 10.1.0(jiti@2.6.1) + + '@eslint/object-schema@3.0.3': {} + + '@eslint/plugin-kit@0.6.1': dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@3.3.4': - dependencies: - ajv: 6.14.0 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.4 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.39.2': {} - - '@eslint/js@9.39.3': {} - - '@eslint/object-schema@2.1.7': {} - - '@eslint/plugin-kit@0.4.1': - dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.1.1 levn: 0.4.1 '@exodus/bytes@1.14.1': {} @@ -4080,15 +3880,15 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.1': + '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 '@tybys/wasm-util': 0.10.1 optional: true @@ -4104,71 +3904,143 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-resolver/binding-android-arm-eabi@11.19.0': + '@oxc-parser/binding-android-arm-eabi@0.121.0': optional: true - '@oxc-resolver/binding-android-arm64@11.19.0': + '@oxc-parser/binding-android-arm64@0.121.0': optional: true - '@oxc-resolver/binding-darwin-arm64@11.19.0': + '@oxc-parser/binding-darwin-arm64@0.121.0': optional: true - '@oxc-resolver/binding-darwin-x64@11.19.0': + '@oxc-parser/binding-darwin-x64@0.121.0': optional: true - '@oxc-resolver/binding-freebsd-x64@11.19.0': + '@oxc-parser/binding-freebsd-x64@0.121.0': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.19.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.19.0': + '@oxc-parser/binding-linux-arm64-gnu@0.121.0': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.19.0': + '@oxc-parser/binding-linux-arm64-musl@0.121.0': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.19.0': + '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.19.0': + '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.19.0': + '@oxc-parser/binding-linux-riscv64-musl@0.121.0': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.19.0': + '@oxc-parser/binding-linux-s390x-gnu@0.121.0': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.19.0': + '@oxc-parser/binding-linux-x64-gnu@0.121.0': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.19.0': + '@oxc-parser/binding-linux-x64-musl@0.121.0': optional: true - '@oxc-resolver/binding-openharmony-arm64@11.19.0': + '@oxc-parser/binding-openharmony-arm64@0.121.0': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.19.0': + '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true - '@oxc-resolver/binding-win32-arm64-msvc@11.19.0': + '@oxc-parser/binding-win32-arm64-msvc@0.121.0': optional: true - '@oxc-resolver/binding-win32-ia32-msvc@11.19.0': + '@oxc-parser/binding-win32-ia32-msvc@0.121.0': optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.19.0': + '@oxc-parser/binding-win32-x64-msvc@0.121.0': optional: true - '@playwright/test@1.58.2': + '@oxc-project/types@0.121.0': {} + + '@oxc-resolver/binding-android-arm-eabi@11.19.1': + optional: true + + '@oxc-resolver/binding-android-arm64@11.19.1': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.19.1': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.19.1': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.19.1': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.19.1': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.19.1': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.19.1': + optional: true + + '@oxc-resolver/binding-openharmony-arm64@11.19.1': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: - playwright: 1.58.2 + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': + optional: true + + '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.19.1': + optional: true + + '@package-json/types@0.0.12': {} + + '@playwright/test@1.59.1': + dependencies: + playwright: 1.59.1 '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': dependencies: @@ -4184,22 +4056,6 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.2': {} - '@rollup/plugin-inject@5.0.5(rollup@4.59.0)': - dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - estree-walker: 2.0.2 - magic-string: 0.30.21 - optionalDependencies: - rollup: 4.59.0 - - '@rollup/pluginutils@5.3.0(rollup@4.59.0)': - dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.3 - optionalDependencies: - rollup: 4.59.0 - '@rollup/rollup-android-arm-eabi@4.59.0': optional: true @@ -4277,8 +4133,6 @@ snapshots: '@sindresorhus/base62@1.0.0': {} - '@sindresorhus/merge-streams@2.3.0': {} - '@standard-schema/spec@1.1.0': {} '@standard-schema/utils@0.3.0': {} @@ -4396,12 +4250,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 - '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2))': + '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 tailwindcss: 4.2.1 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) '@testing-library/dom@10.4.1': dependencies: @@ -4423,6 +4277,24 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 + '@turbo/darwin-64@2.9.3': + optional: true + + '@turbo/darwin-arm64@2.9.3': + optional: true + + '@turbo/linux-64@2.9.3': + optional: true + + '@turbo/linux-arm64@2.9.3': + optional: true + + '@turbo/windows-64@2.9.3': + optional: true + + '@turbo/windows-arm64@2.9.3': + optional: true + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -4437,17 +4309,19 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/esrecurse@4.3.1': {} + '@types/estree@1.0.8': {} '@types/json-schema@7.0.15': {} - '@types/node@24.10.13': + '@types/node@24.12.0': dependencies: undici-types: 7.16.0 - '@types/node@25.2.3': + '@types/node@25.5.0': dependencies: - undici-types: 7.16.0 + undici-types: 7.18.2 optional: true '@types/prop-types@15.7.15': {} @@ -4468,98 +4342,98 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.10.13 + '@types/node': 24.12.0 optional: true - '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.56.1(eslint@9.39.2(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.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.56.1 - eslint: 9.39.2(jiti@2.6.1) + '@typescript-eslint/parser': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/type-utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.58.0 + eslint: 10.1.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@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 + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.58.0 debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.58.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) + '@typescript-eslint/types': 8.58.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.56.1': + '@typescript-eslint/scope-manager@8.58.0': dependencies: - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/visitor-keys': 8.58.0 - '@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.58.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@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.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.56.1': {} + '@typescript-eslint/types@8.58.0': {} - '@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.58.0(typescript@5.9.3)': dependencies: - '@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 + '@typescript-eslint/project-service': 8.58.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/visitor-keys': 8.58.0 debug: 4.4.3 - minimatch: 10.2.3 + minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - '@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.2(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.56.1': + '@typescript-eslint/visitor-keys@8.58.0': dependencies: - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/types': 8.58.0 eslint-visitor-keys: 5.0.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -4623,66 +4497,76 @@ snapshots: '@uppercod/css-to-object@1.1.1': {} - '@vitejs/plugin-react-swc@4.2.3(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2))': + '@vitejs/plugin-react-swc@4.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 '@swc/core': 1.15.13 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) transitivePeerDependencies: - '@swc/helpers' - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.2.3)(happy-dom@20.6.1)(jiti@2.6.1)(jsdom@28.1.0)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2))': + '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)))': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.18 - ast-v8-to-istanbul: 0.3.11 + '@vitest/utils': 4.1.2 + ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 magicast: 0.5.2 obug: 2.1.1 - std-env: 3.10.0 - tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.2.3)(happy-dom@20.6.1)(jiti@2.6.1)(jsdom@28.1.0)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2) + std-env: 4.0.0 + tinyrainbow: 3.1.0 + vitest: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) - '@vitest/expect@4.0.18': + '@vitest/expect@4.1.2': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 + '@vitest/spy': 4.1.2 + '@vitest/utils': 4.1.2 chai: 6.2.2 - tinyrainbow: 3.0.3 + tinyrainbow: 3.1.0 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2))': + '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: - '@vitest/spy': 4.0.18 + '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) - '@vitest/pretty-format@4.0.18': + '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: - tinyrainbow: 3.0.3 + '@vitest/spy': 4.1.2 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) - '@vitest/runner@4.0.18': + '@vitest/pretty-format@4.1.2': dependencies: - '@vitest/utils': 4.0.18 + tinyrainbow: 3.1.0 + + '@vitest/runner@4.1.2': + dependencies: + '@vitest/utils': 4.1.2 pathe: 2.0.3 - '@vitest/snapshot@4.0.18': + '@vitest/snapshot@4.1.2': dependencies: - '@vitest/pretty-format': 4.0.18 + '@vitest/pretty-format': 4.1.2 + '@vitest/utils': 4.1.2 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.18': {} + '@vitest/spy@4.1.2': {} - '@vitest/utils@4.0.18': + '@vitest/utils@4.1.2': dependencies: - '@vitest/pretty-format': 4.0.18 - tinyrainbow: 3.0.3 + '@vitest/pretty-format': 4.1.2 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 accepts@2.0.0: dependencies: @@ -4712,10 +4596,6 @@ snapshots: ansi-regex@6.2.2: {} - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - ansi-styles@5.2.0: {} ansi-styles@6.2.3: {} @@ -4787,23 +4667,9 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - asn1.js@4.10.1: - dependencies: - bn.js: 4.12.3 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - assert@2.1.0: - dependencies: - call-bind: 1.0.8 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.7 - util: 0.12.5 - assertion-error@2.0.1: {} - ast-v8-to-istanbul@0.3.11: + ast-v8-to-istanbul@1.0.0: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -4844,18 +4710,12 @@ snapshots: balanced-match@4.0.4: {} - base64-js@1.5.1: {} - - baseline-browser-mapping@2.10.0: {} + baseline-browser-mapping@2.10.13: {} bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 - bn.js@4.12.3: {} - - bn.js@5.2.3: {} - body-parser@2.2.2: dependencies: bytes: 3.1.2 @@ -4870,12 +4730,12 @@ snapshots: transitivePeerDependencies: - supports-color - brace-expansion@1.1.12: + brace-expansion@1.1.13: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@5.0.3: + brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 @@ -4883,76 +4743,17 @@ snapshots: dependencies: fill-range: 7.1.1 - brorand@1.1.0: {} - - browser-resolve@2.0.0: + browserslist@4.28.2: dependencies: - resolve: 1.22.11 - - browserify-aes@1.2.0: - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.7 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - browserify-cipher@1.0.1: - dependencies: - browserify-aes: 1.2.0 - browserify-des: 1.0.2 - evp_bytestokey: 1.0.3 - - browserify-des@1.0.2: - dependencies: - cipher-base: 1.0.7 - des.js: 1.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - browserify-rsa@4.1.1: - dependencies: - bn.js: 5.2.3 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - - browserify-sign@4.2.5: - dependencies: - bn.js: 5.2.3 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - create-hmac: 1.1.7 - elliptic: 6.6.1 - inherits: 2.0.4 - parse-asn1: 5.1.9 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - - browserify-zlib@0.2.0: - dependencies: - pako: 1.0.11 - - browserslist@4.28.1: - dependencies: - baseline-browser-mapping: 2.10.0 - caniuse-lite: 1.0.30001774 - electron-to-chromium: 1.5.302 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.10.13 + caniuse-lite: 1.0.30001784 + electron-to-chromium: 1.5.331 + node-releases: 2.0.37 + update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-from@1.1.2: optional: true - buffer-xor@1.0.3: {} - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - builtin-status-codes@3.0.0: {} - bytes@3.1.2: {} cache-parser@1.2.6: {} @@ -4974,40 +4775,21 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - callsites@3.1.0: {} - - caniuse-lite@1.0.30001774: {} + caniuse-lite@1.0.30001784: {} chai@6.2.2: {} - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - cipher-base@1.0.7: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - to-buffer: 1.2.2 - cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 - cli-truncate@5.1.1: + cli-truncate@5.2.0: dependencies: - slice-ansi: 7.1.2 + slice-ansi: 8.0.0 string-width: 8.2.0 clsx@2.1.1: {} - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - colorette@2.0.20: {} combined-stream@1.0.8: @@ -5019,14 +4801,10 @@ snapshots: commander@2.20.3: optional: true - comment-parser@1.4.5: {} + comment-parser@1.4.6: {} concat-map@0.0.1: {} - console-browserify@1.2.0: {} - - constants-browserify@1.0.0: {} - content-disposition@1.0.1: {} content-type@1.0.5: {} @@ -5037,53 +4815,12 @@ snapshots: cookie@0.7.2: {} - core-util-is@1.0.3: {} - - create-ecdh@4.0.4: - dependencies: - bn.js: 4.12.3 - elliptic: 6.6.1 - - create-hash@1.2.0: - dependencies: - cipher-base: 1.0.7 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.3 - sha.js: 2.4.12 - - create-hmac@1.1.7: - dependencies: - cipher-base: 1.0.7 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.3 - safe-buffer: 5.2.1 - sha.js: 2.4.12 - - create-require@1.1.1: {} - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - crypto-browserify@3.12.1: - dependencies: - browserify-cipher: 1.0.1 - browserify-sign: 4.2.5 - create-ecdh: 4.0.4 - create-hash: 1.2.0 - create-hmac: 1.1.7 - diffie-hellman: 5.0.3 - hash-base: 3.0.5 - inherits: 2.0.4 - pbkdf2: 3.1.5 - public-encrypt: 4.0.3 - randombytes: 2.1.0 - randomfill: 1.0.4 - css-tree@3.1.0: dependencies: mdn-data: 2.12.2 @@ -5153,19 +4890,8 @@ snapshots: dequal@2.0.3: {} - des.js@1.1.0: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - detect-libc@2.1.2: {} - diffie-hellman@5.0.3: - dependencies: - bn.js: 4.12.3 - miller-rabin: 4.0.1 - randombytes: 2.1.0 - doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -5174,8 +4900,6 @@ snapshots: dom-accessibility-api@0.6.3: {} - domain-browser@4.22.0: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5184,17 +4908,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.302: {} - - elliptic@6.6.1: - dependencies: - bn.js: 4.12.3 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 + electron-to-chromium@1.5.331: {} emoji-name-map@2.0.3: {} @@ -5272,7 +4986,7 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.2.2: + es-iterator-helpers@1.3.1: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 @@ -5289,9 +5003,10 @@ snapshots: has-symbols: 1.1.0 internal-slot: 1.1.0 iterator.prototype: 1.1.5 + math-intrinsics: 1.1.0 safe-array-concat: 1.1.3 - es-module-lexer@1.7.0: {} + es-module-lexer@2.0.0: {} es-object-atoms@1.1.1: dependencies: @@ -5349,57 +5064,56 @@ snapshots: escape-string-regexp@4.0.0: {} - escape-string-regexp@5.0.0: {} - eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: - get-tsconfig: 4.13.6 + get-tsconfig: 4.13.7 stable-hash-x: 0.2.0 optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1)): dependencies: debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) - get-tsconfig: 4.13.6 + get-tsconfig: 4.13.7 is-bun-module: 2.0.0 stable-hash-x: 0.2.0 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)): dependencies: - '@typescript-eslint/types': 8.56.1 - comment-parser: 1.4.5 + '@package-json/types': 0.0.12 + '@typescript-eslint/types': 8.58.0 + comment-parser: 1.4.6 debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 - minimatch: 10.2.3 + minimatch: 10.2.5 semver: 7.7.4 stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - supports-color - eslint-plugin-jsdoc@62.7.1(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-jsdoc@62.9.0(eslint@10.1.0(jiti@2.6.1)): dependencies: - '@es-joy/jsdoccomment': 0.84.0 + '@es-joy/jsdoccomment': 0.86.0 '@es-joy/resolve.exports': 1.2.0 are-docs-informative: 0.0.2 - comment-parser: 1.4.5 + comment-parser: 1.4.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 9.39.2(jiti@2.6.1) - espree: 11.1.1 + eslint: 10.1.0(jiti@2.6.1) + espree: 11.2.0 esquery: 1.7.0 html-entities: 2.6.0 object-deep-merge: 2.0.0 @@ -5410,30 +5124,30 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-react-hooks@7.0.1(eslint@10.1.0(jiti@2.6.1)): dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 - eslint: 9.39.2(jiti@2.6.1) + '@babel/parser': 7.29.2 + eslint: 10.1.0(jiti@2.6.1) hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@10.1.0(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.2 - eslint: 9.39.2(jiti@2.6.1) + es-iterator-helpers: 1.3.1 + eslint: 10.1.0(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 - minimatch: 3.1.4 + minimatch: 3.1.5 object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 @@ -5443,39 +5157,36 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.1: {} - eslint-visitor-keys@5.0.1: {} - eslint@9.39.2(jiti@2.6.1): + eslint@10.1.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.4 - '@eslint/js': 9.39.2 - '@eslint/plugin-kit': 0.4.1 + '@eslint/config-array': 0.23.3 + '@eslint/config-helpers': 0.5.3 + '@eslint/core': 1.1.1 + '@eslint/plugin-kit': 0.6.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 ajv: 6.14.0 - chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -5486,8 +5197,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.4 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -5495,13 +5205,7 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.4.0: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 4.2.1 - - espree@11.1.1: + espree@11.2.0: dependencies: acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) @@ -5517,8 +5221,6 @@ snapshots: estraverse@5.3.0: {} - estree-walker@2.0.2: {} - estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -5529,13 +5231,6 @@ snapshots: eventemitter3@5.0.4: {} - events@3.3.0: {} - - evp_bytestokey@1.0.3: - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - expect-type@1.3.0: {} express@5.2.1: @@ -5595,9 +5290,9 @@ snapshots: dependencies: walk-up-path: 4.0.0 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 file-entry-cache@8.0.0: dependencies: @@ -5625,10 +5320,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 - flatted@3.3.3: {} + flatted@3.4.2: {} follow-redirects@1.15.11: {} @@ -5701,7 +5396,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.13.6: + get-tsconfig@4.13.7: dependencies: resolve-pkg-maps: 1.0.0 @@ -5715,36 +5410,25 @@ snapshots: dependencies: is-glob: 4.0.3 - globals@14.0.0: {} - - globals@17.3.0: {} + globals@17.4.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 - globby@14.1.0: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.3 - ignore: 7.0.5 - path-type: 6.0.0 - slash: 5.1.0 - unicorn-magic: 0.3.0 - gopd@1.2.0: {} graceful-fs@4.2.11: {} happy-dom@20.6.1: dependencies: - '@types/node': 24.10.13 + '@types/node': 24.12.0 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 entities: 6.0.1 whatwg-mimetype: 3.0.0 - ws: 8.19.0 + ws: 8.20.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -5768,23 +5452,6 @@ snapshots: dependencies: has-symbols: 1.1.0 - hash-base@3.0.5: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - hash-base@3.1.2: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - to-buffer: 1.2.2 - - hash.js@1.1.7: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -5795,12 +5462,6 @@ snapshots: dependencies: hermes-estree: 0.25.1 - hmac-drbg@1.0.1: - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - html-encoding-sniffer@6.0.0: dependencies: '@exodus/bytes': 1.14.1 @@ -5828,8 +5489,6 @@ snapshots: http-vary@1.0.3: {} - https-browserify@1.0.0: {} - https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -5843,19 +5502,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ieee754@1.2.1: {} - ignore@5.3.2: {} ignore@7.0.5: {} immer@11.1.4: {} - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -5870,11 +5522,6 @@ snapshots: ipaddr.js@1.9.1: {} - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -5945,11 +5592,6 @@ snapshots: is-map@2.0.3: {} - is-nan@1.3.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - is-negative-zero@2.0.3: {} is-number-object@1.1.1: @@ -6002,14 +5644,10 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - isarray@1.0.0: {} - isarray@2.0.5: {} isexe@2.0.0: {} - isomorphic-timers-promises@1.0.1: {} - istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -6042,7 +5680,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsdoc-type-pratt-parser@7.1.1: {} + jsdoc-type-pratt-parser@7.2.0: {} jsdom@28.1.0: dependencies: @@ -6092,22 +5730,26 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.85.0(@types/node@24.10.13)(typescript@5.9.3): + knip@6.2.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 24.10.13 fast-glob: 3.3.3 formatly: 0.3.0 + get-tsconfig: 4.13.7 jiti: 2.6.1 - js-yaml: 4.1.1 minimist: 1.2.8 - oxc-resolver: 11.19.0 + oxc-parser: 0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + oxc-resolver: 11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) picocolors: 1.1.1 - picomatch: 4.0.3 - smol-toml: 1.6.0 + picomatch: 4.0.4 + smol-toml: 1.6.1 strip-json-comments: 5.0.3 - typescript: 5.9.3 + unbash: 2.2.0 + yaml: 2.8.3 zod: 4.3.6 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' levn@0.4.1: dependencies: @@ -6163,19 +5805,18 @@ snapshots: lightningcss-win32-arm64-msvc: 1.31.1 lightningcss-win32-x64-msvc: 1.31.1 - lint-staged@16.2.7: + lint-staged@16.4.0: dependencies: commander: 14.0.3 listr2: 9.0.5 - micromatch: 4.0.8 - nano-spawn: 2.0.0 - pidtree: 0.6.0 + picomatch: 4.0.4 string-argv: 0.3.2 - yaml: 2.8.2 + tinyexec: 1.0.4 + yaml: 2.8.3 listr2@9.0.5: dependencies: - cli-truncate: 5.1.1 + cli-truncate: 5.2.0 colorette: 2.0.20 eventemitter3: 5.0.4 log-update: 6.1.0 @@ -6186,14 +5827,12 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.merge@4.6.2: {} - log-update@6.1.0: dependencies: 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 loose-envify@1.4.0: @@ -6214,7 +5853,7 @@ snapshots: magicast@0.5.2: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 source-map-js: 1.2.1 @@ -6224,12 +5863,6 @@ snapshots: math-intrinsics@1.1.0: {} - md5.js@1.3.5: - dependencies: - hash-base: 3.0.5 - inherits: 2.0.4 - safe-buffer: 5.2.1 - mdn-data@2.12.2: {} media-typer@1.1.0: {} @@ -6241,12 +5874,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 - - miller-rabin@4.0.1: - dependencies: - bn.js: 4.12.3 - brorand: 1.1.0 + picomatch: 2.3.2 mime-db@1.52.0: {} @@ -6264,24 +5892,18 @@ snapshots: min-indent@1.0.1: {} - minimalistic-assert@1.0.1: {} - - minimalistic-crypto-utils@1.0.1: {} - - minimatch@10.2.3: + minimatch@10.2.5: dependencies: - brace-expansion: 5.0.3 + brace-expansion: 5.0.5 - minimatch@3.1.4: + minimatch@3.1.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.13 minimist@1.2.8: {} ms@2.1.3: {} - nano-spawn@2.0.0: {} - nanoid@3.3.11: {} napi-postinstall@0.3.4: {} @@ -6297,37 +5919,7 @@ snapshots: object.entries: 1.1.9 semver: 6.3.1 - node-releases@2.0.27: {} - - node-stdlib-browser@1.3.1: - dependencies: - assert: 2.1.0 - browser-resolve: 2.0.0 - browserify-zlib: 0.2.0 - buffer: 5.7.1 - console-browserify: 1.2.0 - constants-browserify: 1.0.0 - create-require: 1.1.1 - crypto-browserify: 3.12.1 - domain-browser: 4.22.0 - events: 3.3.0 - https-browserify: 1.0.0 - isomorphic-timers-promises: 1.0.1 - os-browserify: 0.3.0 - path-browserify: 1.0.1 - pkg-dir: 5.0.0 - process: 0.11.10 - punycode: 1.4.1 - querystring-es3: 0.2.1 - readable-stream: 3.6.2 - stream-browserify: 3.0.0 - stream-http: 3.2.0 - string_decoder: 1.3.0 - timers-browserify: 2.0.12 - tty-browserify: 0.0.1 - url: 0.11.4 - util: 0.12.5 - vm-browserify: 1.1.2 + node-releases@2.0.37: {} object-assign@4.1.1: {} @@ -6337,11 +5929,6 @@ snapshots: object-inspect@1.13.4: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - object-keys@1.1.1: {} object.assign@4.1.7: @@ -6397,36 +5984,65 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - os-browserify@0.3.0: {} - own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-resolver@11.19.0: + oxc-parser@0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + dependencies: + '@oxc-project/types': 0.121.0 optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.19.0 - '@oxc-resolver/binding-android-arm64': 11.19.0 - '@oxc-resolver/binding-darwin-arm64': 11.19.0 - '@oxc-resolver/binding-darwin-x64': 11.19.0 - '@oxc-resolver/binding-freebsd-x64': 11.19.0 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.19.0 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.19.0 - '@oxc-resolver/binding-linux-arm64-gnu': 11.19.0 - '@oxc-resolver/binding-linux-arm64-musl': 11.19.0 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.19.0 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.19.0 - '@oxc-resolver/binding-linux-riscv64-musl': 11.19.0 - '@oxc-resolver/binding-linux-s390x-gnu': 11.19.0 - '@oxc-resolver/binding-linux-x64-gnu': 11.19.0 - '@oxc-resolver/binding-linux-x64-musl': 11.19.0 - '@oxc-resolver/binding-openharmony-arm64': 11.19.0 - '@oxc-resolver/binding-wasm32-wasi': 11.19.0 - '@oxc-resolver/binding-win32-arm64-msvc': 11.19.0 - '@oxc-resolver/binding-win32-ia32-msvc': 11.19.0 - '@oxc-resolver/binding-win32-x64-msvc': 11.19.0 + '@oxc-parser/binding-android-arm-eabi': 0.121.0 + '@oxc-parser/binding-android-arm64': 0.121.0 + '@oxc-parser/binding-darwin-arm64': 0.121.0 + '@oxc-parser/binding-darwin-x64': 0.121.0 + '@oxc-parser/binding-freebsd-x64': 0.121.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.121.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.121.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.121.0 + '@oxc-parser/binding-linux-arm64-musl': 0.121.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.121.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.121.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.121.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.121.0 + '@oxc-parser/binding-linux-x64-gnu': 0.121.0 + '@oxc-parser/binding-linux-x64-musl': 0.121.0 + '@oxc-parser/binding-openharmony-arm64': 0.121.0 + '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-parser/binding-win32-arm64-msvc': 0.121.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.121.0 + '@oxc-parser/binding-win32-x64-msvc': 0.121.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + oxc-resolver@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.19.1 + '@oxc-resolver/binding-android-arm64': 11.19.1 + '@oxc-resolver/binding-darwin-arm64': 11.19.1 + '@oxc-resolver/binding-darwin-x64': 11.19.1 + '@oxc-resolver/binding-freebsd-x64': 11.19.1 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.19.1 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.19.1 + '@oxc-resolver/binding-linux-arm64-gnu': 11.19.1 + '@oxc-resolver/binding-linux-arm64-musl': 11.19.1 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.19.1 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.19.1 + '@oxc-resolver/binding-linux-riscv64-musl': 11.19.1 + '@oxc-resolver/binding-linux-s390x-gnu': 11.19.1 + '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 + '@oxc-resolver/binding-linux-x64-musl': 11.19.1 + '@oxc-resolver/binding-openharmony-arm64': 11.19.1 + '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 + '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 + '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' p-limit@3.1.0: dependencies: @@ -6436,20 +6052,6 @@ snapshots: dependencies: p-limit: 3.1.0 - pako@1.0.11: {} - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-asn1@5.1.9: - dependencies: - asn1.js: 4.10.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - pbkdf2: 3.1.5 - safe-buffer: 5.2.1 - parse-imports-exports@0.2.4: dependencies: parse-statements: 1.0.11 @@ -6462,8 +6064,6 @@ snapshots: parseurl@1.3.3: {} - path-browserify@1.0.1: {} - path-exists@4.0.0: {} path-key@3.1.1: {} @@ -6472,19 +6072,8 @@ snapshots: path-to-regexp@8.3.0: {} - path-type@6.0.0: {} - pathe@2.0.3: {} - pbkdf2@3.1.5: - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.3 - safe-buffer: 5.2.1 - sha.js: 2.4.12 - to-buffer: 1.2.2 - pg-cloudflare@1.3.0: optional: true @@ -6522,21 +6111,15 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} - pidtree@0.6.0: {} + playwright-core@1.59.1: {} - pkg-dir@5.0.0: + playwright@1.59.1: dependencies: - find-up: 5.0.0 - - playwright-core@1.58.2: {} - - playwright@1.58.2: - dependencies: - playwright-core: 1.58.2 + playwright-core: 1.59.1 optionalDependencies: fsevents: 2.3.2 @@ -6568,10 +6151,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - process-nextick-args@2.0.1: {} - - process@0.11.10: {} - prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -6585,36 +6164,14 @@ snapshots: proxy-from-env@1.1.0: {} - public-encrypt@4.0.3: - dependencies: - bn.js: 4.12.3 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - parse-asn1: 5.1.9 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - - punycode@1.4.1: {} - punycode@2.3.1: {} qs@6.15.0: dependencies: side-channel: 1.1.0 - querystring-es3@0.2.1: {} - queue-microtask@1.2.3: {} - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - randomfill@1.0.4: - dependencies: - randombytes: 2.1.0 - safe-buffer: 5.2.1 - range-parser@1.2.1: {} raw-body@3.0.2: @@ -6666,22 +6223,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -6719,16 +6260,8 @@ snapshots: reserved-identifiers@1.2.0: {} - resolve-from@4.0.0: {} - resolve-pkg-maps@1.0.0: {} - resolve@1.22.11: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.6: dependencies: es-errors: 1.3.0 @@ -6747,11 +6280,6 @@ snapshots: rfdc@1.4.1: {} - ripemd160@2.0.3: - dependencies: - hash-base: 3.1.2 - inherits: 2.0.4 - rollup@4.59.0: dependencies: '@types/estree': 1.0.8 @@ -6805,10 +6333,6 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -6883,16 +6407,8 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - setimmediate@1.0.5: {} - setprototypeof@1.2.0: {} - sha.js@2.4.12: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - to-buffer: 1.2.2 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -6931,14 +6447,17 @@ snapshots: signal-exit@4.1.0: {} - slash@5.1.0: {} - slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 - smol-toml@1.6.0: {} + slice-ansi@8.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + smol-toml@1.6.1: {} source-map-js@1.2.1: {} @@ -6968,37 +6487,25 @@ snapshots: statuses@2.0.2: {} - std-env@3.10.0: {} + std-env@4.0.0: {} stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 internal-slot: 1.1.0 - stream-browserify@3.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - - stream-http@3.2.0: - dependencies: - builtin-status-codes: 3.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - xtend: 4.0.2 - string-argv@0.3.2: {} string-width@7.2.0: 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.prototype.matchall@4.0.12: dependencies: @@ -7044,15 +6551,7 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@7.1.2: + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -7060,8 +6559,6 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@3.1.1: {} - strip-json-comments@5.0.3: {} supports-color@7.2.0: @@ -7084,20 +6581,16 @@ snapshots: source-map-support: 0.5.21 optional: true - timers-browserify@2.0.12: - dependencies: - setimmediate: 1.0.5 - tinybench@2.9.0: {} - tinyexec@1.0.2: {} + tinyexec@1.0.4: {} tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - tinyrainbow@3.0.3: {} + tinyrainbow@3.1.0: {} tldts-core@7.0.23: {} @@ -7105,12 +6598,6 @@ snapshots: dependencies: tldts-core: 7.0.23 - to-buffer@1.2.2: - dependencies: - isarray: 2.0.5 - safe-buffer: 5.2.1 - typed-array-buffer: 1.0.3 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -7132,14 +6619,21 @@ snapshots: try@1.0.3: {} - ts-api-utils@2.4.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 tslib@2.8.1: optional: true - tty-browserify@0.0.1: {} + turbo@2.9.3: + optionalDependencies: + '@turbo/darwin-64': 2.9.3 + '@turbo/darwin-arm64': 2.9.3 + '@turbo/linux-64': 2.9.3 + '@turbo/linux-arm64': 2.9.3 + '@turbo/windows-64': 2.9.3 + '@turbo/windows-arm64': 2.9.3 type-check@0.4.0: dependencies: @@ -7184,19 +6678,21 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.56.1(eslint@9.39.2(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.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color typescript@5.9.3: {} + unbash@2.2.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -7206,9 +6702,10 @@ snapshots: undici-types@7.16.0: {} - undici@7.22.0: {} + undici-types@7.18.2: + optional: true - unicorn-magic@0.3.0: {} + undici@7.22.0: {} unpipe@1.0.0: {} @@ -7236,9 +6733,9 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -7246,98 +6743,103 @@ snapshots: dependencies: punycode: 2.3.1 - url@0.11.4: - dependencies: - punycode: 1.4.1 - qs: 6.15.0 - use-sync-external-store@1.6.0(react@18.3.1): dependencies: react: 18.3.1 - util-deprecate@1.0.2: {} - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.2 - is-typed-array: 1.1.15 - which-typed-array: 1.1.20 - uuid@13.0.0: {} vary@1.1.2: {} - vite-plugin-node-polyfills@0.25.0(rollup@4.59.0)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2)): - dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.59.0) - node-stdlib-browser: 1.3.1 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2) - transitivePeerDependencies: - - rollup - - vite-plugin-string-replace@1.1.5: - dependencies: - escape-string-regexp: 5.0.0 - globby: 14.1.0 - - vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2): + vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3): dependencies: esbuild: 0.27.3 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 postcss: 8.5.6 rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 24.12.0 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.31.1 terser: 5.44.1 - yaml: 2.8.2 + yaml: 2.8.3 - vitest@4.0.18(@types/node@25.2.3)(happy-dom@20.6.1)(jiti@2.6.1)(jsdom@28.1.0)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2): + vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3): dependencies: - '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.18 - '@vitest/runner': 4.0.18 - '@vitest/snapshot': 4.0.18 - '@vitest/spy': 4.0.18 - '@vitest/utils': 4.0.18 - es-module-lexer: 1.7.0 + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.6 + rollup: 4.59.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.5.0 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.31.1 + terser: 5.44.1 + yaml: 2.8.3 + + vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)): + dependencies: + '@vitest/expect': 4.1.2 + '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.2 + '@vitest/runner': 4.1.2 + '@vitest/snapshot': 4.1.2 + '@vitest/spy': 4.1.2 + '@vitest/utils': 4.1.2 + es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 + picomatch: 4.0.4 + std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.2 + tinyexec: 1.0.4 tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.2) + tinyrainbow: 3.1.0 + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.2.3 + '@types/node': 24.12.0 happy-dom: 20.6.1 jsdom: 28.1.0 transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml - vm-browserify@1.1.2: {} + vitest@4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)): + dependencies: + '@vitest/expect': 4.1.2 + '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.2 + '@vitest/runner': 4.1.2 + '@vitest/snapshot': 4.1.2 + '@vitest/spy': 4.1.2 + '@vitest/utils': 4.1.2 + es-module-lexer: 2.0.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.0.0 + tinybench: 2.9.0 + tinyexec: 1.0.4 + tinyglobby: 0.2.15 + tinyrainbow: 3.1.0 + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.5.0 + happy-dom: 20.6.1 + jsdom: 28.1.0 + transitivePeerDependencies: + - msw w3c-xmlserializer@5.0.0: dependencies: @@ -7416,11 +6918,11 @@ snapshots: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrappy@1.0.2: {} - ws@8.19.0: + ws@8.20.0: optional: true xml-name-validator@5.0.0: {} @@ -7431,7 +6933,7 @@ snapshots: yallist@3.1.1: {} - yaml@2.8.2: {} + yaml@2.8.3: {} yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6e443191..a01c6b71 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,10 +1,11 @@ packages: - apps/* + - packages/* catalog: - "@vitest/coverage-v8": 4.0.18 + "@vitest/coverage-v8": 4.1.2 vite: 7.3.1 - vitest: 4.0.18 + vitest: 4.1.2 minimumReleaseAge: 10080 diff --git a/tsconfig.base.json b/tsconfig.base.json index 39e84b3a..00912579 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -18,6 +18,15 @@ "types": [], "noUncheckedSideEffectImports": true, "moduleDetection": "force", + "customConditions": [ + /** + * Custom condition that resolved to original typescript source + * It allows realtime typechecking between packages without the need to rebuild them. + + * Keep in sync with `eslint.config.js` `createTypeScriptImportResolver` + */ + "@stats/source" + ], // Interop Constraints "verbatimModuleSyntax": true, diff --git a/tsconfig.json b/tsconfig.json index 2a537f3a..3dcd0840 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,4 @@ { - "files": [], - "references": [ - { - "path": "./apps/backend" - }, - { - "path": "./apps/frontend" - } - ] + // Visit https://aka.ms/tsconfig to read more about this file + "extends": "./tsconfig.base.json" } diff --git a/turbo.json b/turbo.json new file mode 100644 index 00000000..48832af8 --- /dev/null +++ b/turbo.json @@ -0,0 +1,16 @@ +{ + "$schema": "./node_modules/turbo/schema.json", + "globalDependencies": ["tsconfig.base.json"], + "tasks": { + "build": { + "dependsOn": ["^build"], + "outputs": ["build/**"] + }, + "lint": { + "dependsOn": ["^build"] + }, + "typecheck": { + "dependsOn": ["^build"] + } + } +} diff --git a/vercel-preparation.sh b/vercel-preparation.sh index 35ebfe01..29b82d84 100755 --- a/vercel-preparation.sh +++ b/vercel-preparation.sh @@ -13,4 +13,3 @@ cp -RP apps/backend/. apps/backend-copy/ (shopt -s dotglob && mv apps/backend-copy/* apps/backend/.vercel/output/functions/api.func/) cp -RP apps/backend/.vercel/output/functions/api.func/_dot_vercel_copy/output apps/backend/.vercel/ rm -rf apps/backend/node_modules -cp -RP apps/backend apps/frontend/src/backend/ diff --git a/vitest.config.coverage.ts b/vitest.config.coverage.ts new file mode 100644 index 00000000..22fc386c --- /dev/null +++ b/vitest.config.coverage.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + }, + projects: [ + "packages/core/vitest.config.ts", + "apps/backend/vitest.config.ts", + ], + }, +}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..c3c14e5b --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + projects: [ + "packages/core/vitest.config.ts", + "apps/backend/vitest.config.ts", + "apps/frontend/vite.config.ts", + ], + }, +}); From fc4ee7507b3782f5bcd0a8de40be544cbcc3abaa Mon Sep 17 00:00:00 2001 From: Marco Pasqualetti <24919330+marcalexiei@users.noreply.github.com> Date: Sun, 19 Apr 2026 09:28:46 +0200 Subject: [PATCH 03/57] test: remove stdout and std from test by mocking logger module (#161) - Same as #143 - Resolves https://github.com/stats-organization/github-stats-extended/pull/143#discussion_r3105155487 - Closes #141 --- .github/workflows/ci.yml | 2 +- apps/backend/tests/api.test.js | 85 +++++++++---------- apps/backend/tests/gist.test.js | 77 +++++++++-------- apps/backend/tests/pat-info.test.js | 19 ++++- apps/backend/tests/pin.test.js | 45 +++++----- .../backend/tests/public-instance/api.test.js | 21 ++++- .../tests/public-instance/gist.test.js | 21 ++++- .../backend/tests/public-instance/pin.test.js | 21 ++++- .../tests/public-instance/top-langs.test.js | 21 ++++- .../tests/public-instance/wakatime.test.js | 21 ++++- apps/backend/tests/status.up.test.js | 20 ++++- apps/backend/tests/top-langs.test.js | 45 +++++----- apps/backend/tests/utils.js | 33 ++++--- apps/backend/tests/wakatime.test.js | 43 +++++----- packages/core/src/common/log.js | 9 -- packages/core/src/common/log.ts | 12 +++ packages/core/tests/fetchStats.test.js | 8 +- packages/core/tests/fetchTopLanguages.test.js | 18 +++- packages/core/tests/retryer.test.js | 77 ++++++++--------- packages/core/tests/utils.js | 41 --------- packages/core/tests/utils.ts | 73 ++++++++++++++++ 21 files changed, 450 insertions(+), 262 deletions(-) delete mode 100644 packages/core/src/common/log.js create mode 100644 packages/core/src/common/log.ts delete mode 100644 packages/core/tests/utils.js create mode 100644 packages/core/tests/utils.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f27b1fd..63eedac3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,7 +50,7 @@ jobs: run: pnpm run build:frontend - name: Run tests - run: pnpm run test --silent + run: pnpm run test frontend-test-e2e: name: Frontend E2E test diff --git a/apps/backend/tests/api.test.js b/apps/backend/tests/api.test.js index e086abb5..ec5d7ca1 100644 --- a/apps/backend/tests/api.test.js +++ b/apps/backend/tests/api.test.js @@ -1,26 +1,27 @@ // @ts-check +import { api, getConfig } from "@stats-organization/github-readme-stats-core"; import { beforeEach, describe, expect, it, vi } from "vitest"; -const mocks = vi.hoisted(() => ({ - api: vi.fn(), - storeRequest: vi.fn(), - getUserAccessByName: vi.fn(), - config: {}, -})); - -vi.mock("@stats-organization/github-readme-stats-core", async () => { - const { mockCore } = await import("./utils.js"); - return mockCore({ api: mocks.api, getConfig: () => mocks.config }); -}); - -vi.mock("../src/common/database.js", () => ({ - storeRequest: mocks.storeRequest, - getUserAccessByName: mocks.getUserAccessByName, -})); - import router from "../router.js"; import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; +import { getUserAccessByName, storeRequest } from "../src/common/database.js"; + +vi.mock(import("@stats-organization/github-readme-stats-core"), async () => { + const { mockCore } = await import("./utils.js"); + return mockCore(); +}); + +vi.mock(import("../src/common/database.js"), async (importOriginal) => ({ + ...(await importOriginal()), + storeRequest: vi.fn(), + getUserAccessByName: vi.fn(), +})); + +const apiMock = vi.mocked(api); +const getConfigMock = vi.mocked(getConfig); +const storeRequestMock = vi.mocked(storeRequest); +const getUserAccessByNameMock = vi.mocked(getUserAccessByName); const createRequest = (search = "") => ({ headers: {}, @@ -43,18 +44,18 @@ const errorCacheHeader = `stale-while-revalidate=${DURATIONS.ONE_DAY}`; beforeEach(() => { - mocks.api.mockReset(); - mocks.storeRequest.mockReset().mockResolvedValue(undefined); - mocks.getUserAccessByName.mockReset().mockResolvedValue(null); - mocks.config = {}; + apiMock.mockReset(); + getConfigMock.mockReset().mockReturnValue({}); + storeRequestMock.mockReset().mockResolvedValue(undefined); + getUserAccessByNameMock.mockReset().mockResolvedValue(null); // CACHE_SECONDS is not set here, this is just to safeguard against CACHE_SECONDS being set externally delete process.env.CACHE_SECONDS; }); describe("Test /api backend routing", () => { it("happy path should pass query params and user PAT, respond with stats content and persist request", async () => { - mocks.getUserAccessByName.mockResolvedValue({ token: "user-pat" }); - mocks.api.mockResolvedValue({ + getUserAccessByNameMock.mockResolvedValue({ token: "user-pat" }); + apiMock.mockResolvedValue({ status: "success", content: "mock-stats-svg", }); @@ -66,8 +67,8 @@ describe("Test /api backend routing", () => { await router(req, res); - expect(mocks.getUserAccessByName).toHaveBeenCalledWith("anuraghazra"); - expect(mocks.api).toHaveBeenCalledWith( + expect(getUserAccessByNameMock).toHaveBeenCalledWith("anuraghazra"); + expect(apiMock).toHaveBeenCalledWith( { username: "anuraghazra", theme: "dark", @@ -85,11 +86,11 @@ describe("Test /api backend routing", () => { ["Content-Type", "image/svg+xml"], ]); expect(res.end).toHaveBeenCalledExactlyOnceWith("mock-stats-svg"); - expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); + expect(storeRequestMock).toHaveBeenCalledExactlyOnceWith(req); }); it("should use the shorter error cache for temporary stats errors", async () => { - mocks.api.mockResolvedValue({ + apiMock.mockResolvedValue({ status: "error - temporary", content: "temporary-error-svg", }); @@ -99,8 +100,8 @@ describe("Test /api backend routing", () => { await router(req, res); - expect(mocks.getUserAccessByName).toHaveBeenCalledWith("anuraghazra"); - expect(mocks.api).toHaveBeenCalledWith( + expect(getUserAccessByNameMock).toHaveBeenCalledWith("anuraghazra"); + expect(apiMock).toHaveBeenCalledWith( { username: "anuraghazra", }, @@ -111,11 +112,11 @@ describe("Test /api backend routing", () => { ["Content-Type", "image/svg+xml"], ]); expect(res.end).toHaveBeenCalledExactlyOnceWith("temporary-error-svg"); - expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); + expect(storeRequestMock).toHaveBeenCalledExactlyOnceWith(req); }); it("should not persist permanent stats errors returned by core", async () => { - mocks.api.mockResolvedValue({ + apiMock.mockResolvedValue({ status: "error - permanent", content: "permanent-error-svg", }); @@ -125,8 +126,8 @@ describe("Test /api backend routing", () => { await router(req, res); - expect(mocks.getUserAccessByName).toHaveBeenCalledWith("anuraghazra"); - expect(mocks.api).toHaveBeenCalledWith( + expect(getUserAccessByNameMock).toHaveBeenCalledWith("anuraghazra"); + expect(apiMock).toHaveBeenCalledWith( { username: "anuraghazra", }, @@ -137,7 +138,7 @@ describe("Test /api backend routing", () => { ["Content-Type", "image/svg+xml"], ]); expect(res.end).toHaveBeenCalledExactlyOnceWith("permanent-error-svg"); - expect(mocks.storeRequest).not.toHaveBeenCalled(); + expect(storeRequestMock).not.toHaveBeenCalled(); }); it("should reject blacklisted usernames before calling core logic", async () => { @@ -146,8 +147,8 @@ describe("Test /api backend routing", () => { await router(req, res); - expect(mocks.api).not.toHaveBeenCalled(); - expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(apiMock).not.toHaveBeenCalled(); + expect(getUserAccessByNameMock).not.toHaveBeenCalled(); expect(res.setHeader.mock.calls).toEqual([ ["Cache-Control", defaultCacheHeader], ["Content-Type", "image/svg+xml"], @@ -155,21 +156,19 @@ describe("Test /api backend routing", () => { expect(res.end).toHaveBeenCalledExactlyOnceWith( "render-error:This username is blacklisted", ); - expect(mocks.storeRequest).not.toHaveBeenCalled(); + expect(storeRequestMock).not.toHaveBeenCalled(); }); it("should reject non-whitelisted usernames before calling core logic", async () => { - mocks.config = { - whitelist: ["allowed-user"], - }; + getConfigMock.mockReturnValue({ whitelist: ["allowed-user"] }); const req = createRequest("username=blocked-user"); const res = createResponse(); await router(req, res); - expect(mocks.api).not.toHaveBeenCalled(); - expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(apiMock).not.toHaveBeenCalled(); + expect(getUserAccessByNameMock).not.toHaveBeenCalled(); expect(res.setHeader.mock.calls).toEqual([ ["Cache-Control", defaultCacheHeader], ["Content-Type", "image/svg+xml"], @@ -177,6 +176,6 @@ describe("Test /api backend routing", () => { expect(res.end).toHaveBeenCalledExactlyOnceWith( "render-error:This username is not whitelisted", ); - expect(mocks.storeRequest).not.toHaveBeenCalled(); + expect(storeRequestMock).not.toHaveBeenCalled(); }); }); diff --git a/apps/backend/tests/gist.test.js b/apps/backend/tests/gist.test.js index 8ee56379..564a733d 100644 --- a/apps/backend/tests/gist.test.js +++ b/apps/backend/tests/gist.test.js @@ -1,26 +1,27 @@ // @ts-check +import { getConfig, gist } from "@stats-organization/github-readme-stats-core"; import { beforeEach, describe, expect, it, vi } from "vitest"; -const mocks = vi.hoisted(() => ({ - gist: vi.fn(), - storeRequest: vi.fn(), - getUserAccessByName: vi.fn(), - config: {}, -})); - -vi.mock("@stats-organization/github-readme-stats-core", async () => { - const { mockCore } = await import("./utils.js"); - return mockCore({ gist: mocks.gist, getConfig: () => mocks.config }); -}); - -vi.mock("../src/common/database.js", () => ({ - storeRequest: mocks.storeRequest, - getUserAccessByName: mocks.getUserAccessByName, -})); - import router from "../router.js"; import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; +import { getUserAccessByName, storeRequest } from "../src/common/database.js"; + +vi.mock(import("@stats-organization/github-readme-stats-core"), async () => { + const { mockCore } = await import("./utils.js"); + return mockCore(); +}); + +vi.mock(import("../src/common/database.js"), async (importOriginal) => ({ + ...(await importOriginal()), + storeRequest: vi.fn(), + getUserAccessByName: vi.fn(), +})); + +const gistMock = vi.mocked(gist); +const getConfigMock = vi.mocked(getConfig); +const storeRequestMock = vi.mocked(storeRequest); +const getUserAccessByNameMock = vi.mocked(getUserAccessByName); const createRequest = (search) => ({ headers: {}, @@ -43,17 +44,17 @@ const errorCacheHeader = `stale-while-revalidate=${DURATIONS.ONE_DAY}`; beforeEach(() => { - mocks.gist.mockReset(); - mocks.storeRequest.mockReset().mockResolvedValue(undefined); - mocks.getUserAccessByName.mockReset().mockResolvedValue(null); - mocks.config = {}; + gistMock.mockReset(); + getConfigMock.mockReset().mockReturnValue({}); + storeRequestMock.mockReset().mockResolvedValue(undefined); + getUserAccessByNameMock.mockReset().mockResolvedValue(null); // CACHE_SECONDS is not set here, this is just to safeguard against CACHE_SECONDS being set externally delete process.env.CACHE_SECONDS; }); describe("Test /api/gist backend routing", () => { it("happy path should pass query params, respond with gist content and persist request", async () => { - mocks.gist.mockResolvedValue({ + gistMock.mockResolvedValue({ status: "success", content: "mock-gist-svg", }); @@ -63,11 +64,11 @@ describe("Test /api/gist backend routing", () => { await router(req, res); - expect(mocks.gist).toHaveBeenCalledWith({ + expect(gistMock).toHaveBeenCalledWith({ id: "bbfce31e0217a3689c8d961a356cb10d", theme: "dark", }); - expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(getUserAccessByNameMock).not.toHaveBeenCalled(); expect(req.query).toEqual({ id: "bbfce31e0217a3689c8d961a356cb10d", theme: "dark", @@ -77,11 +78,11 @@ describe("Test /api/gist backend routing", () => { ["Content-Type", "image/svg+xml"], ]); expect(res.end).toHaveBeenCalledExactlyOnceWith("mock-gist-svg"); - expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); + expect(storeRequestMock).toHaveBeenCalledExactlyOnceWith(req); }); it("should use the shorter error cache for temporary gist errors", async () => { - mocks.gist.mockResolvedValue({ + gistMock.mockResolvedValue({ status: "error - temporary", content: "temporary-error-svg", }); @@ -91,20 +92,20 @@ describe("Test /api/gist backend routing", () => { await router(req, res); - expect(mocks.gist).toHaveBeenCalledWith({ + expect(gistMock).toHaveBeenCalledWith({ id: "bbfce31e0217a3689c8d961a356cb10d", }); - expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(getUserAccessByNameMock).not.toHaveBeenCalled(); expect(res.setHeader.mock.calls).toEqual([ ["Cache-Control", errorCacheHeader], ["Content-Type", "image/svg+xml"], ]); expect(res.end).toHaveBeenCalledExactlyOnceWith("temporary-error-svg"); - expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); + expect(storeRequestMock).toHaveBeenCalledExactlyOnceWith(req); }); it("should not persist permanent gist errors returned by core", async () => { - mocks.gist.mockResolvedValue({ + gistMock.mockResolvedValue({ status: "error - permanent", content: "permanent-error-svg", }); @@ -114,30 +115,28 @@ describe("Test /api/gist backend routing", () => { await router(req, res); - expect(mocks.gist).toHaveBeenCalledWith({ + expect(gistMock).toHaveBeenCalledWith({ id: "bbfce31e0217a3689c8d961a356cb10d", }); - expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(getUserAccessByNameMock).not.toHaveBeenCalled(); expect(res.setHeader.mock.calls).toEqual([ ["Cache-Control", defaultCacheHeader], ["Content-Type", "image/svg+xml"], ]); expect(res.end).toHaveBeenCalledExactlyOnceWith("permanent-error-svg"); - expect(mocks.storeRequest).not.toHaveBeenCalled(); + expect(storeRequestMock).not.toHaveBeenCalled(); }); it("should reject non-whitelisted gist ids before calling core logic", async () => { - mocks.config = { - gistWhitelist: ["allowed-gist-id"], - }; + getConfigMock.mockReturnValue({ gistWhitelist: ["allowed-gist-id"] }); const req = createRequest("id=blocked-gist-id"); const res = createResponse(); await router(req, res); - expect(mocks.gist).not.toHaveBeenCalled(); - expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(gistMock).not.toHaveBeenCalled(); + expect(getUserAccessByNameMock).not.toHaveBeenCalled(); expect(res.setHeader.mock.calls).toEqual([ ["Cache-Control", defaultCacheHeader], ["Content-Type", "image/svg+xml"], @@ -145,6 +144,6 @@ describe("Test /api/gist backend routing", () => { expect(res.end).toHaveBeenCalledExactlyOnceWith( "render-error:This gist ID is not whitelisted", ); - expect(mocks.storeRequest).not.toHaveBeenCalled(); + expect(storeRequestMock).not.toHaveBeenCalled(); }); }); diff --git a/apps/backend/tests/pat-info.test.js b/apps/backend/tests/pat-info.test.js index ef01b9ba..36665116 100644 --- a/apps/backend/tests/pat-info.test.js +++ b/apps/backend/tests/pat-info.test.js @@ -4,7 +4,15 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; +import { + afterAll, + afterEach, + beforeAll, + describe, + expect, + it, + vi, +} from "vitest"; const mock = new MockAdapter(axios); @@ -63,6 +71,11 @@ beforeAll(async () => { vi.stubEnv("PAT_3", "testPAT3"); vi.stubEnv("PAT_4", "testPAT4"); + const { logger } = + await import("@stats-organization/github-readme-stats-core"); + vi.spyOn(logger, "log").mockImplementation(() => {}); + vi.spyOn(logger, "error").mockImplementation(() => {}); + ({ RATE_LIMIT_SECONDS, default: patInfo } = await import("../api-renamed/status/pat-info.js")); }); @@ -74,6 +87,10 @@ afterEach(() => { vi.resetModules(); }); +afterAll(() => { + vi.restoreAllMocks(); +}); + describe("Test /api/status/pat-info", () => { it("should return only 'validPATs' if all PATs are valid", async () => { mock diff --git a/apps/backend/tests/pin.test.js b/apps/backend/tests/pin.test.js index 628e68fa..90eb6b8a 100644 --- a/apps/backend/tests/pin.test.js +++ b/apps/backend/tests/pin.test.js @@ -1,25 +1,26 @@ // @ts-check +import { pin } from "@stats-organization/github-readme-stats-core"; import { beforeEach, describe, expect, it, vi } from "vitest"; -const mocks = vi.hoisted(() => ({ - pin: vi.fn(), +import router from "../router.js"; +import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; +import { getUserAccessByName, storeRequest } from "../src/common/database.js"; + +vi.mock(import("@stats-organization/github-readme-stats-core"), async () => { + const { mockCore } = await import("./utils.js"); + return mockCore(); +}); + +vi.mock(import("../src/common/database.js"), async (importOriginal) => ({ + ...(await importOriginal()), storeRequest: vi.fn(), getUserAccessByName: vi.fn(), })); -vi.mock("@stats-organization/github-readme-stats-core", async () => { - const { mockCore } = await import("./utils.js"); - return mockCore({ pin: mocks.pin }); -}); - -vi.mock("../src/common/database.js", () => ({ - storeRequest: mocks.storeRequest, - getUserAccessByName: mocks.getUserAccessByName, -})); - -import router from "../router.js"; -import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; +const pinMock = vi.mocked(pin); +const storeRequestMock = vi.mocked(storeRequest); +const getUserAccessByNameMock = vi.mocked(getUserAccessByName); const createRequest = (search = "") => ({ headers: {}, @@ -37,17 +38,17 @@ const defaultCacheHeader = `stale-while-revalidate=${DURATIONS.ONE_DAY}`; beforeEach(() => { - mocks.pin.mockReset(); - mocks.storeRequest.mockReset().mockResolvedValue(undefined); - mocks.getUserAccessByName.mockReset().mockResolvedValue(null); + pinMock.mockReset(); + storeRequestMock.mockReset().mockResolvedValue(undefined); + getUserAccessByNameMock.mockReset().mockResolvedValue(null); // CACHE_SECONDS is not set here, this is just to safeguard against CACHE_SECONDS being set externally delete process.env.CACHE_SECONDS; }); describe("Test /api/pin backend routing", () => { it("happy path should pass query params and user PAT, respond with pin content and persist request", async () => { - mocks.getUserAccessByName.mockResolvedValue({ token: "user-pat" }); - mocks.pin.mockResolvedValue({ + getUserAccessByNameMock.mockResolvedValue({ token: "user-pat" }); + pinMock.mockResolvedValue({ status: "success", content: "mock-pin-svg", }); @@ -59,8 +60,8 @@ describe("Test /api/pin backend routing", () => { await router(req, res); - expect(mocks.getUserAccessByName).toHaveBeenCalledWith("anuraghazra"); - expect(mocks.pin).toHaveBeenCalledWith( + expect(getUserAccessByNameMock).toHaveBeenCalledWith("anuraghazra"); + expect(pinMock).toHaveBeenCalledWith( { username: "anuraghazra", repo: "convoychat", @@ -78,6 +79,6 @@ describe("Test /api/pin backend routing", () => { ["Content-Type", "image/svg+xml"], ]); expect(res.end).toHaveBeenCalledExactlyOnceWith("mock-pin-svg"); - expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); + expect(storeRequestMock).toHaveBeenCalledExactlyOnceWith(req); }); }); diff --git a/apps/backend/tests/public-instance/api.test.js b/apps/backend/tests/public-instance/api.test.js index 506d9f05..34a8d98f 100644 --- a/apps/backend/tests/public-instance/api.test.js +++ b/apps/backend/tests/public-instance/api.test.js @@ -1,8 +1,18 @@ // @ts-check +import { logger } from "@stats-organization/github-readme-stats-core"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { + afterAll, + afterEach, + beforeAll, + beforeEach, + describe, + expect, + it, + vi, +} from "vitest"; import { data_stats, normalizeSvg } from "../utils.js"; @@ -22,6 +32,11 @@ beforeEach(() => { mock.onPost("https://api.github.com/graphql").reply(200, data_stats); }); +beforeAll(() => { + vi.spyOn(logger, "log").mockImplementation(() => {}); + vi.spyOn(logger, "error").mockImplementation(() => {}); +}); + afterEach(() => { mock.reset(); vi.unstubAllEnvs(); @@ -29,6 +44,10 @@ afterEach(() => { vi.resetModules(); }); +afterAll(() => { + vi.restoreAllMocks(); +}); + describe("Test /api contract", () => { it("should match the public happy-path response snapshot", async () => { const { default: router } = await import("../../router.js"); diff --git a/apps/backend/tests/public-instance/gist.test.js b/apps/backend/tests/public-instance/gist.test.js index 0742ab3b..693617cf 100644 --- a/apps/backend/tests/public-instance/gist.test.js +++ b/apps/backend/tests/public-instance/gist.test.js @@ -1,8 +1,18 @@ // @ts-check +import { logger } from "@stats-organization/github-readme-stats-core"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { + afterAll, + afterEach, + beforeAll, + beforeEach, + describe, + expect, + it, + vi, +} from "vitest"; import { happy_path_gist_data, normalizeSvg } from "../utils.js"; @@ -24,6 +34,11 @@ beforeEach(() => { .reply(200, happy_path_gist_data); }); +beforeAll(() => { + vi.spyOn(logger, "log").mockImplementation(() => {}); + vi.spyOn(logger, "error").mockImplementation(() => {}); +}); + afterEach(() => { mock.reset(); vi.unstubAllEnvs(); @@ -31,6 +46,10 @@ afterEach(() => { vi.resetModules(); }); +afterAll(() => { + vi.restoreAllMocks(); +}); + describe("Test /api/gist contract", () => { it("should match the public happy-path response snapshot", async () => { const { default: router } = await import("../../router.js"); diff --git a/apps/backend/tests/public-instance/pin.test.js b/apps/backend/tests/public-instance/pin.test.js index 12da77f9..0c86dfe1 100644 --- a/apps/backend/tests/public-instance/pin.test.js +++ b/apps/backend/tests/public-instance/pin.test.js @@ -1,8 +1,18 @@ // @ts-check +import { logger } from "@stats-organization/github-readme-stats-core"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { + afterAll, + afterEach, + beforeAll, + beforeEach, + describe, + expect, + it, + vi, +} from "vitest"; import { data_user, normalizeSvg } from "../utils.js"; @@ -22,6 +32,11 @@ beforeEach(() => { mock.onPost("https://api.github.com/graphql").reply(200, data_user); }); +beforeAll(() => { + vi.spyOn(logger, "log").mockImplementation(() => {}); + vi.spyOn(logger, "error").mockImplementation(() => {}); +}); + afterEach(() => { mock.reset(); vi.unstubAllEnvs(); @@ -29,6 +44,10 @@ afterEach(() => { vi.resetModules(); }); +afterAll(() => { + vi.restoreAllMocks(); +}); + describe("Test /api/pin contract", () => { it("should match the public happy-path response snapshot", async () => { const { default: router } = await import("../../router.js"); diff --git a/apps/backend/tests/public-instance/top-langs.test.js b/apps/backend/tests/public-instance/top-langs.test.js index 9eaba86c..11739f21 100644 --- a/apps/backend/tests/public-instance/top-langs.test.js +++ b/apps/backend/tests/public-instance/top-langs.test.js @@ -1,8 +1,18 @@ // @ts-check +import { logger } from "@stats-organization/github-readme-stats-core"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { + afterAll, + afterEach, + beforeAll, + beforeEach, + describe, + expect, + it, + vi, +} from "vitest"; import { data_langs, normalizeSvg } from "../utils.js"; @@ -22,6 +32,11 @@ beforeEach(() => { mock.onPost("https://api.github.com/graphql").reply(200, data_langs); }); +beforeAll(() => { + vi.spyOn(logger, "log").mockImplementation(() => {}); + vi.spyOn(logger, "error").mockImplementation(() => {}); +}); + afterEach(() => { mock.reset(); vi.unstubAllEnvs(); @@ -29,6 +44,10 @@ afterEach(() => { vi.resetModules(); }); +afterAll(() => { + vi.restoreAllMocks(); +}); + describe("Test /api/top-langs contract", () => { it("should match the public happy-path response snapshot", async () => { const { default: router } = await import("../../router.js"); diff --git a/apps/backend/tests/public-instance/wakatime.test.js b/apps/backend/tests/public-instance/wakatime.test.js index 48a23bf8..aaa98bbd 100644 --- a/apps/backend/tests/public-instance/wakatime.test.js +++ b/apps/backend/tests/public-instance/wakatime.test.js @@ -1,8 +1,18 @@ // @ts-check +import { logger } from "@stats-organization/github-readme-stats-core"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { + afterAll, + afterEach, + beforeAll, + beforeEach, + describe, + expect, + it, + vi, +} from "vitest"; import { normalizeSvg, wakaTimeData } from "../utils.js"; @@ -34,6 +44,11 @@ beforeEach(() => { .reply(200, wakaTimeData); }); +beforeAll(() => { + vi.spyOn(logger, "log").mockImplementation(() => {}); + vi.spyOn(logger, "error").mockImplementation(() => {}); +}); + afterEach(() => { mock.reset(); vi.unstubAllEnvs(); @@ -41,6 +56,10 @@ afterEach(() => { vi.resetModules(); }); +afterAll(() => { + vi.restoreAllMocks(); +}); + describe("Test /api/wakatime contract", () => { it("should match the public happy-path response snapshot", async () => { const { default: router } = await import("../../router.js"); diff --git a/apps/backend/tests/status.up.test.js b/apps/backend/tests/status.up.test.js index de3a5a7f..02b9a28b 100644 --- a/apps/backend/tests/status.up.test.js +++ b/apps/backend/tests/status.up.test.js @@ -2,9 +2,18 @@ * @file Tests for the status/up cloud function. */ +import { logger } from "@stats-organization/github-readme-stats-core"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it, vi } from "vitest"; +import { + afterAll, + afterEach, + beforeAll, + describe, + expect, + it, + vi, +} from "vitest"; import up, { RATE_LIMIT_SECONDS } from "../api-renamed/status/up.js"; @@ -55,10 +64,19 @@ const shields_down = { color: "red", }; +beforeAll(() => { + vi.spyOn(logger, "log").mockImplementation(() => {}); + vi.spyOn(logger, "error").mockImplementation(() => {}); +}); + afterEach(() => { mock.reset(); }); +afterAll(() => { + vi.restoreAllMocks(); +}); + describe("Test /api/status/up", () => { it("should return `true` if request was successful", async () => { mock.onPost("https://api.github.com/graphql").replyOnce(200, successData); diff --git a/apps/backend/tests/top-langs.test.js b/apps/backend/tests/top-langs.test.js index 96d424e7..eb7a3ebc 100644 --- a/apps/backend/tests/top-langs.test.js +++ b/apps/backend/tests/top-langs.test.js @@ -1,25 +1,26 @@ // @ts-check +import { topLangs } from "@stats-organization/github-readme-stats-core"; import { beforeEach, describe, expect, it, vi } from "vitest"; -const mocks = vi.hoisted(() => ({ - topLangs: vi.fn(), +import router from "../router.js"; +import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; +import { getUserAccessByName, storeRequest } from "../src/common/database.js"; + +vi.mock(import("@stats-organization/github-readme-stats-core"), async () => { + const { mockCore } = await import("./utils.js"); + return mockCore(); +}); + +vi.mock(import("../src/common/database.js"), async (importOriginal) => ({ + ...(await importOriginal()), storeRequest: vi.fn(), getUserAccessByName: vi.fn(), })); -vi.mock("@stats-organization/github-readme-stats-core", async () => { - const { mockCore } = await import("./utils.js"); - return mockCore({ topLangs: mocks.topLangs }); -}); - -vi.mock("../src/common/database.js", () => ({ - storeRequest: mocks.storeRequest, - getUserAccessByName: mocks.getUserAccessByName, -})); - -import router from "../router.js"; -import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; +const topLangsMock = vi.mocked(topLangs); +const storeRequestMock = vi.mocked(storeRequest); +const getUserAccessByNameMock = vi.mocked(getUserAccessByName); const createRequest = (search = "") => ({ headers: {}, @@ -37,17 +38,17 @@ const defaultCacheHeader = `stale-while-revalidate=${DURATIONS.ONE_DAY}`; beforeEach(() => { - mocks.topLangs.mockReset(); - mocks.storeRequest.mockReset().mockResolvedValue(undefined); - mocks.getUserAccessByName.mockReset().mockResolvedValue(null); + topLangsMock.mockReset(); + storeRequestMock.mockReset().mockResolvedValue(undefined); + getUserAccessByNameMock.mockReset().mockResolvedValue(null); // CACHE_SECONDS is not set here, this is just to safeguard against CACHE_SECONDS being set externally delete process.env.CACHE_SECONDS; }); describe("Test /api/top-langs backend routing", () => { it("happy path should pass query params and user PAT, respond with top languages content and persist request", async () => { - mocks.getUserAccessByName.mockResolvedValue({ token: "user-pat" }); - mocks.topLangs.mockResolvedValue({ + getUserAccessByNameMock.mockResolvedValue({ token: "user-pat" }); + topLangsMock.mockResolvedValue({ status: "success", content: "mock-top-langs-svg", }); @@ -59,8 +60,8 @@ describe("Test /api/top-langs backend routing", () => { await router(req, res); - expect(mocks.getUserAccessByName).toHaveBeenCalledWith("anuraghazra"); - expect(mocks.topLangs).toHaveBeenCalledWith( + expect(getUserAccessByNameMock).toHaveBeenCalledWith("anuraghazra"); + expect(topLangsMock).toHaveBeenCalledWith( { username: "anuraghazra", layout: "compact", @@ -78,6 +79,6 @@ describe("Test /api/top-langs backend routing", () => { ["Content-Type", "image/svg+xml"], ]); expect(res.end).toHaveBeenCalledExactlyOnceWith("mock-top-langs-svg"); - expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); + expect(storeRequestMock).toHaveBeenCalledExactlyOnceWith(req); }); }); diff --git a/apps/backend/tests/utils.js b/apps/backend/tests/utils.js index 9108685a..8602f932 100644 --- a/apps/backend/tests/utils.js +++ b/apps/backend/tests/utils.js @@ -1,5 +1,7 @@ // @ts-check +import { vi } from "vitest"; + export const data_stats = { data: { user: { @@ -257,23 +259,32 @@ export const wakaTimeData = { }, }; +/** @typedef {import('@stats-organization/github-readme-stats-core')} CoreModule */ + /** * Creates a mock module for @stats-organization/github-readme-stats-core. - * @param {any} mocks Mocked functions of the core module. - * @returns {any} Mocked core module. + * @returns {CoreModule} Mocked core module. */ -export function mockCore(mocks) { - const noop = () => undefined; - +export function mockCore() { return { - api: mocks.api ?? noop, - gist: mocks.gist ?? noop, - pin: mocks.pin ?? noop, - topLangs: mocks.topLangs ?? noop, - wakatime: mocks.wakatime ?? noop, - getConfig: mocks.getConfig ?? (() => mocks.config ?? {}), + // @ts-expect-error no need to mock themes at the moment + themes: {}, + request: vi.fn(), + fetchWakatimeStats: vi.fn(), + retryer: vi.fn(), + dateDiff: vi.fn(), + api: vi.fn(), + gist: vi.fn(), + pin: vi.fn(), + topLangs: vi.fn(), + wakatime: vi.fn(), + getConfig: vi.fn().mockReturnValue({}), renderError: ({ message }) => `render-error:${message}`, clampValue: (value, min, max) => Math.min(Math.max(value, min), max), + logger: { + log: vi.fn(), + error: vi.fn(), + }, }; } diff --git a/apps/backend/tests/wakatime.test.js b/apps/backend/tests/wakatime.test.js index e1561724..0be8df96 100644 --- a/apps/backend/tests/wakatime.test.js +++ b/apps/backend/tests/wakatime.test.js @@ -1,25 +1,26 @@ // @ts-check +import { wakatime } from "@stats-organization/github-readme-stats-core"; import { beforeEach, describe, expect, it, vi } from "vitest"; -const mocks = vi.hoisted(() => ({ - wakatime: vi.fn(), +import router from "../router.js"; +import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; +import { getUserAccessByName, storeRequest } from "../src/common/database.js"; + +vi.mock(import("@stats-organization/github-readme-stats-core"), async () => { + const { mockCore } = await import("./utils.js"); + return mockCore(); +}); + +vi.mock(import("../src/common/database.js"), async (importOriginal) => ({ + ...(await importOriginal()), storeRequest: vi.fn(), getUserAccessByName: vi.fn(), })); -vi.mock("@stats-organization/github-readme-stats-core", async () => { - const { mockCore } = await import("./utils.js"); - return mockCore({ wakatime: mocks.wakatime }); -}); - -vi.mock("../src/common/database.js", () => ({ - storeRequest: mocks.storeRequest, - getUserAccessByName: mocks.getUserAccessByName, -})); - -import router from "../router.js"; -import { CACHE_TTL, DURATIONS } from "../src/common/cache.js"; +const wakatimeMock = vi.mocked(wakatime); +const storeRequestMock = vi.mocked(storeRequest); +const getUserAccessByNameMock = vi.mocked(getUserAccessByName); const createRequest = (search = "") => ({ headers: {}, @@ -37,16 +38,16 @@ const defaultCacheHeader = `stale-while-revalidate=${DURATIONS.ONE_DAY}`; beforeEach(() => { - mocks.wakatime.mockReset(); - mocks.storeRequest.mockReset().mockResolvedValue(undefined); - mocks.getUserAccessByName.mockReset().mockResolvedValue(null); + wakatimeMock.mockReset(); + storeRequestMock.mockReset().mockResolvedValue(undefined); + getUserAccessByNameMock.mockReset().mockResolvedValue(null); // CACHE_SECONDS is not set here, this is just to safeguard against CACHE_SECONDS being set externally delete process.env.CACHE_SECONDS; }); describe("Test /api/wakatime backend routing", () => { it("happy path should pass query params, respond with wakatime content and persist request", async () => { - mocks.wakatime.mockResolvedValue({ + wakatimeMock.mockResolvedValue({ status: "success", content: "mock-wakatime-svg", }); @@ -56,12 +57,12 @@ describe("Test /api/wakatime backend routing", () => { await router(req, res); - expect(mocks.wakatime).toHaveBeenCalledWith({ + expect(wakatimeMock).toHaveBeenCalledWith({ username: "anuraghazra", theme: "dark", layout: "compact", }); - expect(mocks.getUserAccessByName).not.toHaveBeenCalled(); + expect(getUserAccessByNameMock).not.toHaveBeenCalled(); expect(req.query).toEqual({ username: "anuraghazra", theme: "dark", @@ -72,6 +73,6 @@ describe("Test /api/wakatime backend routing", () => { ["Content-Type", "image/svg+xml"], ]); expect(res.end).toHaveBeenCalledExactlyOnceWith("mock-wakatime-svg"); - expect(mocks.storeRequest).toHaveBeenCalledExactlyOnceWith(req); + expect(storeRequestMock).toHaveBeenCalledExactlyOnceWith(req); }); }); diff --git a/packages/core/src/common/log.js b/packages/core/src/common/log.js deleted file mode 100644 index 88cf7dd9..00000000 --- a/packages/core/src/common/log.js +++ /dev/null @@ -1,9 +0,0 @@ -// @ts-check -/** - * Return console instance based on the environment. - * - * @type {Console | {log: () => void, error: () => void}} - */ -const logger = console; - -export { logger }; diff --git a/packages/core/src/common/log.ts b/packages/core/src/common/log.ts new file mode 100644 index 00000000..17c081e4 --- /dev/null +++ b/packages/core/src/common/log.ts @@ -0,0 +1,12 @@ +/** + * Return console instance based on the environment. + */ +const logger: { + log: (...args: Array) => void; + error: (...args: Array) => void; +} = { + log: console.log, + error: console.error, +}; + +export { logger }; diff --git a/packages/core/tests/fetchStats.test.js b/packages/core/tests/fetchStats.test.js index 7d4531aa..0593560c 100644 --- a/packages/core/tests/fetchStats.test.js +++ b/packages/core/tests/fetchStats.test.js @@ -1,11 +1,16 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { calculateRank } from "../src/calculateRank.js"; import { loadConfigFromEnv } from "../src/common/config.js"; import { fetchStats } from "../src/fetchers/stats.js"; +vi.mock(import("../src/common/log.js"), async () => { + const { createLoggerMock } = await import("./utils.js"); + return createLoggerMock(); +}); + // Test parameters. const data_stats = { data: { @@ -534,7 +539,6 @@ describe("Test fetchStats", () => { }); it("should return correct data when user don't have any pull requests", async () => { - mock.reset(); mock .onPost("https://api.github.com/graphql") .reply(200, data_without_pull_requests); diff --git a/packages/core/tests/fetchTopLanguages.test.js b/packages/core/tests/fetchTopLanguages.test.js index 798c5a38..abf746b9 100644 --- a/packages/core/tests/fetchTopLanguages.test.js +++ b/packages/core/tests/fetchTopLanguages.test.js @@ -1,15 +1,25 @@ import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { afterEach, describe, expect, it } from "vitest"; +import { afterEach, describe, expect, it, vi } from "vitest"; import { fetchTopLanguages } from "../src/fetchers/top-languages.js"; import { approxNumber } from "./utils.js"; +vi.mock(import("../src/common/log.js"), async () => { + const { createLoggerMock } = await import("./utils.js"); + return createLoggerMock(); +}); + +const { logger } = await import("../src/index.js"); + +const loggerErrorSpy = vi.mocked(logger.error); + const mock = new MockAdapter(axios); afterEach(() => { mock.reset(); + loggerErrorSpy.mockClear(); }); const data_langs = { @@ -149,6 +159,8 @@ describe("FetchTopLanguages", () => { await expect(fetchTopLanguages("anuraghazra")).rejects.toThrow( "Could not resolve to a User with the login of 'noname'.", ); + + expect(loggerErrorSpy).toHaveBeenCalledOnce(); }); it("should throw other errors with their message", async () => { @@ -159,6 +171,8 @@ describe("FetchTopLanguages", () => { await expect(fetchTopLanguages("anuraghazra")).rejects.toThrow( "Some test GraphQL error", ); + + expect(loggerErrorSpy).toHaveBeenCalledOnce(); }); it("should throw error with specific message when error does not contain message property", async () => { @@ -169,5 +183,7 @@ describe("FetchTopLanguages", () => { await expect(fetchTopLanguages("anuraghazra")).rejects.toThrow( "Something went wrong while trying to retrieve the language data using the GraphQL API.", ); + + expect(loggerErrorSpy).toHaveBeenCalledOnce(); }); }); diff --git a/packages/core/tests/retryer.test.js b/packages/core/tests/retryer.test.js index 10572081..d869296b 100644 --- a/packages/core/tests/retryer.test.js +++ b/packages/core/tests/retryer.test.js @@ -2,55 +2,45 @@ import { describe, expect, it, vi } from "vitest"; -import { logger } from "../src/common/log.js"; import { retryer } from "../src/common/retryer.js"; -const fetcher = vi.fn((variables, token) => { - logger.log(variables, token); - return new Promise((res) => res({ data: "ok" })); +vi.mock(import("../src/common/log.js"), async () => { + const { createLoggerMock } = await import("./utils.js"); + return createLoggerMock(); }); -const fetcherFail = vi.fn(() => { - return new Promise((res) => - res({ data: { errors: [{ type: "RATE_LIMITED" }] } }), - ); +const fetcher = vi.fn().mockResolvedValue({ data: "ok" }); + +const fetcherFail = vi.fn().mockResolvedValue({ + data: { errors: [{ type: "RATE_LIMITED" }] }, }); const fetcherFailOnSecondTry = vi.fn((_vars, _token, retries) => { - return new Promise((res) => { - // faking rate limit - // @ts-ignore - if (retries < 1) { - return res({ data: { errors: [{ type: "RATE_LIMITED" }] } }); - } - return res({ data: "ok" }); - }); + if (retries < 1) { + return Promise.resolve({ data: { errors: [{ type: "RATE_LIMITED" }] } }); + } + return Promise.resolve({ data: "ok" }); }); const fetcherFailWithMessageBasedRateLimitErr = vi.fn( (_vars, _token, retries) => { - return new Promise((res) => { - // faking rate limit - // @ts-ignore - if (retries < 1) { - return res({ - data: { - errors: [ - { - type: "ASDF", - message: "API rate limit already exceeded for user ID 11111111", - }, - ], - }, - }); - } - return res({ data: "ok" }); - }); + if (retries < 1) { + return Promise.resolve({ + data: { + errors: [ + { + type: "ASDF", + message: "API rate limit already exceeded for user ID 11111111", + }, + ], + }, + }); + } + return Promise.resolve({ data: "ok" }); }, ); const customFetcher = vi.fn((variables, token) => { - logger.log(variables, token); return Promise.resolve({ data: { token } }); }); @@ -77,20 +67,21 @@ describe("Test Retryer", () => { }); it("retryer should throw specific error if maximum retries reached", async () => { - try { - await retryer(fetcherFail, {}); - } catch (err) { - expect(fetcherFail).toHaveBeenCalledTimes(2); - // @ts-ignore - expect(err.message).toBe("Downtime due to GitHub API rate limiting"); - } + await expect(retryer(fetcherFail, {})).rejects.toThrow( + "Downtime due to GitHub API rate limiting", + ); + + expect(fetcherFail).toHaveBeenCalledTimes(2); }); it("retryer should use injected PATs when provided", async () => { const res = await retryer(customFetcher, {}, "user-pat-token"); - expect(customFetcher).toHaveBeenCalledTimes(1); - expect(customFetcher).toHaveBeenCalledWith({}, "user-pat-token", 0); + expect(customFetcher).toHaveBeenCalledExactlyOnceWith( + {}, + "user-pat-token", + 0, + ); expect(res).toStrictEqual({ data: { token: "user-pat-token" } }); }); }); diff --git a/packages/core/tests/utils.js b/packages/core/tests/utils.js deleted file mode 100644 index 21b9f1f8..00000000 --- a/packages/core/tests/utils.js +++ /dev/null @@ -1,41 +0,0 @@ -// @ts-check - -/** - * Creates an asymmetric matcher for approximate numeric equality. - * - * This helper is intended for use in test frameworks (e.g., Jest) where - * values need to be compared within a configurable decimal precision - * instead of strict equality. - * - * The comparison succeeds when: - * - * |actual - expected| < 10^(-precision) - * - * For example, with `precision = 3`, values must be within `0.001`. - * - * @param {number} expected The expected numeric value to compare against. - * - * @param {number} [precision=10] - * The number of decimal places of tolerance. Higher values mean stricter - * comparison. Internally converted to epsilon = 10^-precision. - * - * @returns {{ - * asymmetricMatch(actual: unknown): boolean, - * toAsymmetricMatcher(): string - * }} An object implementing Jest-style asymmetric matcher methods. - * - */ -export function approxNumber(expected, precision = 10) { - return { - asymmetricMatch(actual) { - if (typeof actual !== "number" || typeof expected !== "number") { - return false; - } - const epsilon = Math.pow(10, -precision); - return Math.abs(actual - expected) < epsilon; - }, - toAsymmetricMatcher() { - return `≈ ${expected} (precision ${precision})`; - }, - }; -} diff --git a/packages/core/tests/utils.ts b/packages/core/tests/utils.ts new file mode 100644 index 00000000..1a4c5205 --- /dev/null +++ b/packages/core/tests/utils.ts @@ -0,0 +1,73 @@ +import { vi } from "vitest"; + +import type * as loggerModule from "../src/common/log.js"; + +/** + * Creates an asymmetric matcher for approximate numeric equality. + * + * This helper is intended for use in test frameworks (e.g., Jest) where + * values need to be compared within a configurable decimal precision + * instead of strict equality. + * + * The comparison succeeds when: + * + * |actual - expected| < 10^(-precision) + * + * For example, with `precision = 3`, values must be within `0.001`. + * + * @param expected The expected numeric value to compare against. + * + * @param + * The number of decimal places of tolerance. Higher values mean stricter + * comparison. Internally converted to epsilon = 10^-precision. + * + * @returns An object implementing Jest-style asymmetric matcher methods. + * + */ +export function approxNumber( + expected: number, + precision = 10, +): { + asymmetricMatch(actual: unknown): boolean; + toAsymmetricMatcher(): string; +} { + return { + asymmetricMatch(actual) { + if (typeof actual !== "number" || typeof expected !== "number") { + return false; + } + const epsilon = Math.pow(10, -precision); + return Math.abs(actual - expected) < epsilon; + }, + toAsymmetricMatcher() { + return `≈ ${expected} (precision ${precision})`; + }, + }; +} + +/** + * Helper to create logger module mocks to use in unit tests. + * If you need to perform assertions on logger use `vi.mocked`. + * + * @example + * ```ts + * import { logger } from "../src/common/log.js"; + * + * vi.mock(import("../src/common/log.js"), async () => { + * const { createLoggerMock } = await import("./utils.js"); + * return createLoggerMock(); + * }); + * + * const logSpy = vi.mocked(logger.log); + * ``` + * + * @returns mocked logger module + */ +export function createLoggerMock(): typeof loggerModule { + return { + logger: { + log: vi.fn(), + error: vi.fn(), + }, + }; +} From f346dcaa7325f05e778d43b37daa22537baa67ce Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Sun, 19 Apr 2026 18:36:22 +0200 Subject: [PATCH 04/57] small frontend fixes (#162) --- apps/frontend/src/components/Card/SvgInline.tsx | 2 ++ apps/frontend/vite.config.ts | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/components/Card/SvgInline.tsx b/apps/frontend/src/components/Card/SvgInline.tsx index 2834864e..ae2968f7 100644 --- a/apps/frontend/src/components/Card/SvgInline.tsx +++ b/apps/frontend/src/components/Card/SvgInline.tsx @@ -13,6 +13,8 @@ import { useUserToken, } from "../../redux/selectors/userSelectors.js"; +import "../../constants.js"; // set process.env before the core package uses it + interface SvgInlineProps { url: string; stage: number; diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts index da01ed72..b8d1751f 100644 --- a/apps/frontend/vite.config.ts +++ b/apps/frontend/vite.config.ts @@ -19,7 +19,7 @@ export default defineProject({ conditions: ["@stats/source"], alias: [ { - find: "../src/fetchers/wakatime.js", + find: "../fetchers/wakatime.js", replacement: path.resolve( import.meta.dirname, "src/wakatime-override.ts", @@ -29,6 +29,5 @@ export default defineProject({ }, test: { dir: path.join(import.meta.dirname, "./src"), - exclude: ["**/backend/**"], }, }); From e58bee0bfdf7ed7691ab21d51e7c0deb69b08cbc Mon Sep 17 00:00:00 2001 From: martin-mfg <2026226+martin-mfg@users.noreply.github.com> Date: Sun, 19 Apr 2026 18:57:55 +0200 Subject: [PATCH 05/57] add debug logs --- packages/core/src/common/config.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/core/src/common/config.js b/packages/core/src/common/config.js index 32456ce8..f25a1f74 100644 --- a/packages/core/src/common/config.js +++ b/packages/core/src/common/config.js @@ -28,9 +28,12 @@ const parsePATsFromEnv = (env) => { * @returns {Record} `process.env` if available, otherwise `{}`. */ const getDefaultEnv = () => { + console.log((typeof process !== "undefined") + " | " + process?.env); if (typeof process !== "undefined" && process?.env) { + console.log("if branch"); return process.env; } + console.log("else branch"); return {}; }; From 3b67bd6bcb020024d2a23fae216384cf40d22bdc Mon Sep 17 00:00:00 2001 From: martin-mfg <2026226+martin-mfg@users.noreply.github.com> Date: Sun, 19 Apr 2026 18:57:55 +0200 Subject: [PATCH 06/57] add debug logs --- packages/core/src/common/config.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/src/common/config.js b/packages/core/src/common/config.js index 32456ce8..c3ed384b 100644 --- a/packages/core/src/common/config.js +++ b/packages/core/src/common/config.js @@ -28,9 +28,12 @@ const parsePATsFromEnv = (env) => { * @returns {Record} `process.env` if available, otherwise `{}`. */ const getDefaultEnv = () => { + console.log((typeof process !== "undefined") + " | " + process?.env); if (typeof process !== "undefined" && process?.env) { + console.log("if branch"); return process.env; } + console.log("else branch"); return {}; }; @@ -60,6 +63,7 @@ let currentConfig; * @param {Record} env Environment variables used to build the runtime config. */ export const loadConfigFromEnv = (env = getDefaultEnv()) => { + console.log("env: " + JSON.stringify(env)); const whitelist = parseCsv(env.WHITELIST); const gistWhitelist = parseCsv(env.GIST_WHITELIST); const excludeRepositories = parseCsv(env.EXCLUDE_REPO) || []; From 5ccb79919820ad421136085f5ac01f81e7e20862 Mon Sep 17 00:00:00 2001 From: martin-mfg <2026226+martin-mfg@users.noreply.github.com> Date: Sun, 19 Apr 2026 19:34:02 +0200 Subject: [PATCH 07/57] extend debug log --- packages/core/src/common/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/common/config.js b/packages/core/src/common/config.js index c3ed384b..7b1a50db 100644 --- a/packages/core/src/common/config.js +++ b/packages/core/src/common/config.js @@ -30,7 +30,7 @@ const parsePATsFromEnv = (env) => { const getDefaultEnv = () => { console.log((typeof process !== "undefined") + " | " + process?.env); if (typeof process !== "undefined" && process?.env) { - console.log("if branch"); + console.log("if branch, returning " + JSON.stringify(process.env)); return process.env; } console.log("else branch"); From f7b1b9f382b98808dbe463e830a3411582d97d59 Mon Sep 17 00:00:00 2001 From: martin-mfg <2026226+martin-mfg@users.noreply.github.com> Date: Sun, 19 Apr 2026 20:16:42 +0200 Subject: [PATCH 08/57] frontend: try loading env explicitly --- apps/frontend/src/components/Card/SvgInline.tsx | 3 +++ packages/core/src/index.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/components/Card/SvgInline.tsx b/apps/frontend/src/components/Card/SvgInline.tsx index ae2968f7..e4a8ee64 100644 --- a/apps/frontend/src/components/Card/SvgInline.tsx +++ b/apps/frontend/src/components/Card/SvgInline.tsx @@ -1,5 +1,6 @@ // @ts-expect-error type info should be added later import { router } from "@stats-organization/github-readme-stats-backend"; +import { loadConfigFromEnv } from "@stats-organization/github-readme-stats-core"; import axios from "axios"; import { useEffect, useRef, useState } from "react"; import type { JSX } from "react"; @@ -48,6 +49,8 @@ export function SvgInline(props: SvgInlineProps): JSX.Element { const loadSvg = async () => { window.process.env.PAT_1 = userToken as string; + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + loadConfigFromEnv(window.process.env); setLoaded(false); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 23606735..241db1eb 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -20,6 +20,6 @@ export { default as pin } from "./api/pin.js"; export { default as topLangs } from "./api/top-langs.js"; export { default as wakatime } from "./api/wakatime.js"; -export { getConfig } from "./common/config.js"; +export { getConfig, loadConfigFromEnv } from "./common/config.js"; export { themes } from "./themes/index.js"; From b40c4b7915b41050a89e037101e75bd1d1a4cb03 Mon Sep 17 00:00:00 2001 From: martin-mfg <2026226+martin-mfg@users.noreply.github.com> Date: Mon, 20 Apr 2026 16:39:17 +0200 Subject: [PATCH 09/57] move env from constants to SvgInline, cleanup --- apps/frontend/src/components/Card/SvgInline.tsx | 9 +++++---- apps/frontend/src/constants.ts | 7 ------- packages/core/src/common/config.js | 4 ---- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/apps/frontend/src/components/Card/SvgInline.tsx b/apps/frontend/src/components/Card/SvgInline.tsx index e4a8ee64..5fd0c9b6 100644 --- a/apps/frontend/src/components/Card/SvgInline.tsx +++ b/apps/frontend/src/components/Card/SvgInline.tsx @@ -14,8 +14,6 @@ import { useUserToken, } from "../../redux/selectors/userSelectors.js"; -import "../../constants.js"; // set process.env before the core package uses it - interface SvgInlineProps { url: string; stage: number; @@ -48,9 +46,12 @@ export function SvgInline(props: SvgInlineProps): JSX.Element { let isCurrent = true; const loadSvg = async () => { - window.process.env.PAT_1 = userToken as string; + const config: Record = { + FETCH_MULTI_PAGE_STARS: "10", + PAT_1: userToken as string, // even if it's null, core's retryer.js sees there is 1 PAT and sets `RETRIES` accordingly + }; // eslint-disable-next-line @typescript-eslint/no-unsafe-call - loadConfigFromEnv(window.process.env); + loadConfigFromEnv(config); setLoaded(false); diff --git a/apps/frontend/src/constants.ts b/apps/frontend/src/constants.ts index e3328ed2..f3baf303 100644 --- a/apps/frontend/src/constants.ts +++ b/apps/frontend/src/constants.ts @@ -17,10 +17,3 @@ export const DEMO_USER = "anuraghazra" as string; export const DEMO_REPO = "anuraghazra/github-readme-stats" as string; export const DEMO_GIST = "bbfce31e0217a3689c8d961a356cb10d" as string; export const DEMO_WAKATIME_USER = "alan" as string; - -window.process = { - env: { - FETCH_MULTI_PAGE_STARS: "10", - PAT_1: "placeholderPAT", // so the backend's retryer.js sees there is 1 PAT and sets `RETRIES` accordingly - }, -} as (typeof window)["process"]; diff --git a/packages/core/src/common/config.js b/packages/core/src/common/config.js index 7b1a50db..32456ce8 100644 --- a/packages/core/src/common/config.js +++ b/packages/core/src/common/config.js @@ -28,12 +28,9 @@ const parsePATsFromEnv = (env) => { * @returns {Record} `process.env` if available, otherwise `{}`. */ const getDefaultEnv = () => { - console.log((typeof process !== "undefined") + " | " + process?.env); if (typeof process !== "undefined" && process?.env) { - console.log("if branch, returning " + JSON.stringify(process.env)); return process.env; } - console.log("else branch"); return {}; }; @@ -63,7 +60,6 @@ let currentConfig; * @param {Record} env Environment variables used to build the runtime config. */ export const loadConfigFromEnv = (env = getDefaultEnv()) => { - console.log("env: " + JSON.stringify(env)); const whitelist = parseCsv(env.WHITELIST); const gistWhitelist = parseCsv(env.GIST_WHITELIST); const excludeRepositories = parseCsv(env.EXCLUDE_REPO) || []; From dbe6aa00337faad09c6f9e07b5e1a49e990b5abd Mon Sep 17 00:00:00 2001 From: martin-mfg <2026226+martin-mfg@users.noreply.github.com> Date: Mon, 20 Apr 2026 17:09:44 +0200 Subject: [PATCH 10/57] fix playwright test --- apps/frontend/src/constants.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/frontend/src/constants.ts b/apps/frontend/src/constants.ts index f3baf303..b54412f7 100644 --- a/apps/frontend/src/constants.ts +++ b/apps/frontend/src/constants.ts @@ -17,3 +17,8 @@ export const DEMO_USER = "anuraghazra" as string; export const DEMO_REPO = "anuraghazra/github-readme-stats" as string; export const DEMO_GIST = "bbfce31e0217a3689c8d961a356cb10d" as string; export const DEMO_WAKATIME_USER = "alan" as string; + +// imported backend code expects process.env to be defined +window.process = { + env: {}, +} as (typeof window)["process"]; From fca39d25a8eb22a5985943918b178fb10ea3b5d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 17:54:42 +0200 Subject: [PATCH 11/57] build(deps-dev): Bump globals from 17.4.0 to 17.5.0 (#163) Bumps [globals](https://github.com/sindresorhus/globals) from 17.4.0 to 17.5.0.
Release notes

Sourced from globals's releases.

v17.5.0

  • Update globals (2026-04-12) (#342) 5d84602

https://github.com/sindresorhus/globals/compare/v17.4.0...v17.5.0

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=globals&package-manager=npm_and_yarn&previous-version=17.4.0&new-version=17.5.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 53e0d770..de851a28 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "eslint-plugin-jsdoc": "62.9.0", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", - "globals": "17.4.0", + "globals": "17.5.0", "husky": "9.1.7", "knip": "6.2.0", "lint-staged": "16.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be659cdc..d28f68f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,8 +54,8 @@ importers: specifier: 7.0.1 version: 7.0.1(eslint@10.1.0(jiti@2.6.1)) globals: - specifier: 17.4.0 - version: 17.4.0 + specifier: 17.5.0 + version: 17.5.0 husky: specifier: 9.1.7 version: 9.1.7 @@ -2163,8 +2163,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - globals@17.4.0: - resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} + globals@17.5.0: + resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==} engines: {node: '>=18'} globalthis@1.0.4: @@ -5410,7 +5410,7 @@ snapshots: dependencies: is-glob: 4.0.3 - globals@17.4.0: {} + globals@17.5.0: {} globalthis@1.0.4: dependencies: From 775abe704c8810abff50ef35967d325e270d40c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:01:15 +0200 Subject: [PATCH 12/57] build(deps-dev): Bump knip from 6.2.0 to 6.4.1 (#164) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 6.2.0 to 6.4.1.
Release notes

Sourced from knip's releases.

Release 6.4.1

  • license (2d3d8d86ea51f18224c3558a38c28df00113f683)
  • Handle file path arguments in Bun plugin (resolve #1678) (cdbe298efcb226ae4baec6567a0cbb6fdf001ee8)

Release 6.4.0

  • chore: change license file to have more conventional casing (#1664) (ed97e6a37) - thanks @​Zamiell!
  • fix: whitelist spelling error (#1666) (bcad12012) - thanks @​Zamiell!
  • Add Panda CSS plugin (#1671) (7ab0d4d88) - thanks @​Faithfinder!
  • fix(rspack): detect plugins from swc-loader (#1675) (1431ff3d5) - thanks @​TkDodo!
  • docs: fix broken anchor link in DEVELOPMENT.md (#1677) (e78c7f609) - thanks @​vincent067!
  • Fix @jest-environment pragma resolution and limit pragma scope (3832364e2)
  • Track Object enumeration to skip enum-member checks in nsTypes mode (a47aff535)
  • Cache module resolution by directory + specifier (cefed38c2)
  • Skip read+parse in walkAndAnalyze when the file cache will hit (25a7982c1)
  • Collapse double statSync in FileEntryCache.reconcile (b63fbd9f2)
  • Refactor walkAndAnalyze: dedupe cached/uncached paths (573df54ba)
  • Cache glob results across --cache runs (6ab8de805)
  • Mark namespace members used when enumerated via Object.* (dabf8ce77)
  • Add config hints for redundant/unregistered extensions (close #1672, close #1673) (050689575)
  • Enable Tailwind CSS compiler for @​tailwindcss integrations (close #1674) (f3ed14d0e)
  • Resolve scss path aliases (resolve #1676) (00ae83be9)
  • Re-gen plugins.md (35d8fabaa)
  • Resolve path.join(__dirname, ...) in Worker/child_process calls (#1660) (40a917e3f)
  • license (608f0ed76)

Release 6.3.1

  • Fix peer dependency resolution (#1645) (0a6e93d16f89bde270a5458c0e76e1c6a996012f) - thanks @​controversial!
  • Support absolute file paths in react-router routes (#1659) (97bb283e31eb72da8c60fcede607b22da2929103) - thanks @​mpalmer685!
  • Track namespace imports used as object property values (resolve #1669) (c4d6b28df5955abbe9dde40d245ceb5a6e0bc669)
  • Split plugins/util smoke globs to fit Windows cmd.exe limit (33ef87d15770d0ee9dc248a640538ce2f0d75a46)

Release 6.3.0

  • Re-gen sponsorships chart (83ee4895f36d934bf9f2efaaaf3e141c33c889f8)
  • Add testimonial (be16c54d379698899e3f10646bb23b280024b989)
  • Add deferred resolve entries as direct entry paths to avoid ws exclusion (91a183539fb63528f900b187328c3bba1b161e88)
  • Add rolldown plugin (resolve #1661) (44bfd6273375384dc0b01b2cf673b6ad1b6783f0)
  • Housekeep plugins a bit (dc6986821bde185185b730e119d2c528048f9976)
  • Improve module.register handling (b9e36ea42d0b2b35d6080aafc94b292a3d7fd711)
  • Housekeep release script (f81bd0f5f6630c2cac9934c3b96ace0d42bd2353)
Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index de851a28..b56c2c7a 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "eslint-plugin-react-hooks": "7.0.1", "globals": "17.5.0", "husky": "9.1.7", - "knip": "6.2.0", + "knip": "6.4.1", "lint-staged": "16.4.0", "prettier": "3.8.1", "turbo": "2.9.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d28f68f9..053d59a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,8 +60,8 @@ importers: specifier: 9.1.7 version: 9.1.7 knip: - specifier: 6.2.0 - version: 6.2.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + specifier: 6.4.1 + version: 6.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) lint-staged: specifier: 16.4.0 version: 16.4.0 @@ -615,8 +615,8 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.2': - resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} + '@napi-rs/wasm-runtime@1.1.3': + resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -2471,8 +2471,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - knip@6.2.0: - resolution: {integrity: sha512-4OMUMJARvNble8e8TeFv12flp4fKzAITrQec1eKO4g2eA4HnNqEa8CXy2UOPLjuYuAETpe0N0r25jF9yY9FLig==} + knip@6.4.1: + resolution: {integrity: sha512-Ry+ywmDFSZvKp/jx7LxMgsZWRTs931alV84e60lh0Stf6kSRYqSIUTkviyyDFRcSO3yY1Kpbi83OirN+4lA2Xw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3885,7 +3885,7 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 @@ -3954,7 +3954,7 @@ snapshots: '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -4021,7 +4021,7 @@ snapshots: '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -5730,7 +5730,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@6.2.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + knip@6.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): dependencies: '@nodelib/fs.walk': 1.2.8 fast-glob: 3.3.3 From a552a0494202e412b941a8d6c07385872d45c80b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:04:12 +0200 Subject: [PATCH 13/57] build(deps-dev): Bump tailwindcss from 4.2.1 to 4.2.2 (#128) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.2.1 to 4.2.2.
Release notes

Sourced from tailwindcss's releases.

v4.2.2

Added

  • Support Vite 8 in @tailwindcss/vite (#19790)

Fixed

  • Don't crash when candidates contain prototype properties like row-constructor (#19725)
  • Canonicalize calc(var(--spacing)*…) expressions into --spacing(…) (#19769)
  • Fix crash in canonicalization step when handling utilities containing @property at-rules (e.g. shadow-sm border) (#19727)
  • Skip full reload for server only modules scanned by client CSS when using @tailwindcss/vite (#19745)
  • Improve canonicalization for bare values exceeding default spacing scale suggestions (e.g. w-1234 h-1234size-1234) (#19809)
  • Fix canonicalization resulting in empty list (e.g. w-5 h-5 size-5'' instead of size-5) (#19812)
Changelog

Sourced from tailwindcss's changelog.

[4.2.2] - 2026-03-18

Fixed

  • Don't crash when candidates contain prototype properties like row-constructor (#19725)
  • Canonicalize calc(var(--spacing)*…) expressions into --spacing(…) (#19769)
  • Fix crash in canonicalization step when handling utilities containing @property at-rules (e.g. shadow-sm border) (#19727)
  • Skip full reload for server only modules scanned by client CSS when using @tailwindcss/vite (#19745)
  • Add support for Vite 8 in @tailwindcss/vite (#19790)
  • Improve canonicalization for bare values exceeding default spacing scale suggestions (e.g. w-1234 h-1234size-1234) (#19809)
  • Fix canonicalization resulting in empty list (e.g. w-5 h-5 size-5'' instead of size-5) (#19812)
  • Resolve tsconfig paths to allow for @import '@/path/to/file'; when using @tailwindcss/vite (#19803)
Commits
  • d596b0c 4.2.2 (#19821)
  • 2228a57 Bump Lightning CSS (#19771)
  • f302fce Fix canonicalization resulting in empty list (#19812)
  • bb2f170 Improve canonicalization for bare values exceeding default spacing scale sugg...
  • faa5e88 Cleanup inconsistencies related to (regex) escapes (#19804)
  • d5717f2 run prettier
  • 51aa9d7 fix(canonicalize): handle utilities with empty property maps in collapse (#19...
  • c586bd6 Canonicalize calc(var(--spacing)*…) expressions into --spacing(…) (#19769)
  • 9ded4a2 Guard object lookups against inherited prototype properties (#19725)
  • See full diff in compare view

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/frontend/package.json | 2 +- pnpm-lock.yaml | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 7e3031f4..59dabe44 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -36,7 +36,7 @@ "@types/react-dom": "18.3.7", "@vitejs/plugin-react-swc": "4.2.3", "clsx": "2.1.1", - "tailwindcss": "4.2.1", + "tailwindcss": "4.2.2", "vite": "catalog:default", "vitest": "catalog:default" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 053d59a4..f88be28d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -173,8 +173,8 @@ importers: specifier: 2.1.1 version: 2.1.1 tailwindcss: - specifier: 4.2.1 - version: 4.2.1 + specifier: 4.2.2 + version: 4.2.2 vite: specifier: catalog:default version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) @@ -3212,6 +3212,9 @@ packages: tailwindcss@4.2.1: resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} @@ -6571,6 +6574,8 @@ snapshots: tailwindcss@4.2.1: {} + tailwindcss@4.2.2: {} + tapable@2.3.0: {} terser@5.44.1: From b2360c535ae378c956e3b92967c6b231adbe2f29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:05:39 +0200 Subject: [PATCH 14/57] build(deps): Bump react-icons from 5.5.0 to 5.6.0 (#132) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [react-icons](https://github.com/react-icons/react-icons) from 5.5.0 to 5.6.0.
Release notes

Sourced from react-icons's releases.

v5.6.0

What's Changed

Full Changelog: https://github.com/react-icons/react-icons/compare/v5.5.0...v5.6.0

Icon Library License Version Count
Circum Icons MPL-2.0 license 1.0.0 288
Font Awesome 5 CC BY 4.0 License 5.15.4-3-gafecf2a 1612
Font Awesome 6 CC BY 4.0 License 6.7.2-1-g840c215 2060
Ionicons 4 MIT 4.6.3 696
Ionicons 5 MIT 5.5.4 1332
Material Design icons Apache License Version 2.0 4.0.0-142-gbb04090f93 4341
Typicons CC BY-SA 3.0 2.1.2 336
Github Octicons icons MIT 18.3.0 264
Feather MIT 4.29.2 287
Lucide ISC 0.462.0 1541
Game Icons CC BY 3.0 12920d6565588f0512542a3cb0cdfd36a497f910 4040
Weather Icons SIL OFL 1.1 2.0.12 219
Devicons MIT 1.8.0 192
Ant Design Icons MIT 4.4.2 831
Bootstrap Icons MIT 1.13.1 2754
Remix Icon Apache License Version 2.0 4.6.0 3058
Flat Color Icons MIT 1.0.2 329
Grommet-Icons Apache License Version 2.0 4.14.0 637
Heroicons MIT 1.0.6 460
Heroicons 2 MIT 2.2.0 972

... (truncated)

Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/frontend/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 59dabe44..9e4f8f62 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -22,7 +22,7 @@ "@stats-organization/github-readme-stats-core": "workspace:^", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-icons": "^5.5.0", + "react-icons": "^5.6.0", "react-loading-skeleton": "^3.3.1", "react-redux": "^9.2.0", "react-spinners": "^0.17.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f88be28d..2039bd07 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,8 +136,8 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-icons: - specifier: ^5.5.0 - version: 5.5.0(react@18.3.1) + specifier: ^5.6.0 + version: 5.6.0(react@18.3.1) react-loading-skeleton: specifier: ^3.3.1 version: 3.5.0(react@18.3.1) @@ -2907,8 +2907,8 @@ packages: peerDependencies: react: ^18.3.1 - react-icons@5.5.0: - resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} + react-icons@5.6.0: + resolution: {integrity: sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==} peerDependencies: react: '*' @@ -6190,7 +6190,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-icons@5.5.0(react@18.3.1): + react-icons@5.6.0(react@18.3.1): dependencies: react: 18.3.1 From b29d7989eb0b9b33f533cf4d95279156af9b843f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:07:29 +0200 Subject: [PATCH 15/57] build(deps-dev): Bump turbo from 2.9.3 to 2.9.6 (#149) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [turbo](https://github.com/vercel/turborepo) from 2.9.3 to 2.9.6.
Release notes

Sourced from turbo's releases.

Turborepo v2.9.6

What's Changed

create-turbo

Examples

Changelog

Full Changelog: https://github.com/vercel/turborepo/compare/v2.9.5...v2.9.6

Turborepo v2.9.6-canary.3

What's Changed

Changelog

Full Changelog: https://github.com/vercel/turborepo/compare/v2.9.6-canary.2...v2.9.6-canary.3

Turborepo v2.9.6-canary.2

What's Changed

create-turbo

Examples

Changelog

Full Changelog: https://github.com/vercel/turborepo/compare/v2.9.6-canary.1...v2.9.6-canary.2

Turborepo v2.9.6-canary.1

What's Changed

@​turbo/telemetry

... (truncated)

Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 58 +++++++++++++++++++++++++------------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index b56c2c7a..54c6d751 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "knip": "6.4.1", "lint-staged": "16.4.0", "prettier": "3.8.1", - "turbo": "2.9.3", + "turbo": "2.9.6", "typescript": "5.9.3", "typescript-eslint": "8.58.0", "vitest": "catalog:default" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2039bd07..045abad1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,8 +69,8 @@ importers: specifier: 3.8.1 version: 3.8.1 turbo: - specifier: 2.9.3 - version: 2.9.3 + specifier: 2.9.6 + version: 2.9.6 typescript: specifier: 5.9.3 version: 5.9.3 @@ -1222,33 +1222,33 @@ packages: resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@turbo/darwin-64@2.9.3': - resolution: {integrity: sha512-P8foouaP+y/p+hhEGBoZpzMbpVvUMwPjDpcy6wN7EYfvvyISD1USuV27qWkczecihwuPJzQ1lDBuL8ERcavTyg==} + '@turbo/darwin-64@2.9.6': + resolution: {integrity: sha512-X/56SnVXIQZBLKwniGTwEQTGmtE5brSACnKMBWpY3YafuxVYefrC2acamfjgxP7BG5w3I+6jf0UrLoSzgPcSJg==} cpu: [x64] os: [darwin] - '@turbo/darwin-arm64@2.9.3': - resolution: {integrity: sha512-SIzEkvtNdzdI50FJDaIQ6kQGqgSSdFPcdn0wqmmONN6iGKjy6hsT+EH99GP65FsfV7DLZTh2NmtTIRl2kdoz5Q==} + '@turbo/darwin-arm64@2.9.6': + resolution: {integrity: sha512-aalBeSl4agT/QtYGDyf/XLajedWzUC9Vg/pm/YO6QQ93vkQ91Vz5uK1ta5RbVRDozQSz4njxUNqRNmOXDzW+qw==} cpu: [arm64] os: [darwin] - '@turbo/linux-64@2.9.3': - resolution: {integrity: sha512-pLRwFmcHHNBvsCySLS6OFabr/07kDT2pxEt/k6eBf/3asiVQZKJ7Rk88AafQx2aYA641qek4RsXvYO3JYpiBug==} + '@turbo/linux-64@2.9.6': + resolution: {integrity: sha512-YKi05jnNHaD7vevgYwahpzGwbsNNTwzU2c7VZdmdFm7+cGDP4oREUWSsainiMfRqjRuolQxBwRn8wf1jmu+YZA==} cpu: [x64] os: [linux] - '@turbo/linux-arm64@2.9.3': - resolution: {integrity: sha512-gy6ApUroC2Nzv+qjGtE/uPNkhHAFU4c8God+zd5Aiv9L9uBgHlxVJpHT3XWl5xwlJZ2KWuMrlHTaS5kmNB+q1Q==} + '@turbo/linux-arm64@2.9.6': + resolution: {integrity: sha512-02o/ZS69cOYEDczXvOB2xmyrtzjQ2hVFtWZK1iqxXUfzMmTjZK4UumrfNnjckSg+gqeBfnPRHa0NstA173Ik3g==} cpu: [arm64] os: [linux] - '@turbo/windows-64@2.9.3': - resolution: {integrity: sha512-d0YelTX6hAsB7kIEtGB3PzIzSfAg3yDoUlHwuwJc3adBXUsyUIs0YLG+1NNtuhcDOUGnWQeKUoJ2pGWvbpRj7w==} + '@turbo/windows-64@2.9.6': + resolution: {integrity: sha512-wVdQjvnBI15wB6JrA+43CtUtagjIMmX6XYO758oZHAsCNSxqRlJtdyujih0D8OCnwCRWiGWGI63zAxR0hO6s9g==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.9.3': - resolution: {integrity: sha512-/08CwpKJl3oRY8nOlh2YgilZVJDHsr60XTNxRhuDeuFXONpUZ5X+Nv65izbG/xBew9qxcJFbDX9/sAmAX+ITcQ==} + '@turbo/windows-arm64@2.9.6': + resolution: {integrity: sha512-1XUUyWW0W6FTSqGEhU8RHVqb2wP1SPkr7hIvBlMEwH9jr+sJQK5kqeosLJ/QaUv4ecSAd1ZhIrLoW7qslAzT4A==} cpu: [arm64] os: [win32] @@ -3278,8 +3278,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo@2.9.3: - resolution: {integrity: sha512-J/VUvsGRykPb9R8Kh8dHVBOqioDexLk9BhLCU/ZybRR+HN9UR3cURdazFvNgMDt9zPP8TF6K73Z+tplfmi0PqQ==} + turbo@2.9.6: + resolution: {integrity: sha512-+v2QJey7ZUeUiuigkU+uFfklvNUyPI2VO2vBpMYJA+a1hKFLFiKtUYlRHdb3P9CrAvMzi0upbjI4WT+zKtqkBg==} hasBin: true type-check@0.4.0: @@ -4280,22 +4280,22 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@turbo/darwin-64@2.9.3': + '@turbo/darwin-64@2.9.6': optional: true - '@turbo/darwin-arm64@2.9.3': + '@turbo/darwin-arm64@2.9.6': optional: true - '@turbo/linux-64@2.9.3': + '@turbo/linux-64@2.9.6': optional: true - '@turbo/linux-arm64@2.9.3': + '@turbo/linux-arm64@2.9.6': optional: true - '@turbo/windows-64@2.9.3': + '@turbo/windows-64@2.9.6': optional: true - '@turbo/windows-arm64@2.9.3': + '@turbo/windows-arm64@2.9.6': optional: true '@tybys/wasm-util@0.10.1': @@ -6631,14 +6631,14 @@ snapshots: tslib@2.8.1: optional: true - turbo@2.9.3: + turbo@2.9.6: optionalDependencies: - '@turbo/darwin-64': 2.9.3 - '@turbo/darwin-arm64': 2.9.3 - '@turbo/linux-64': 2.9.3 - '@turbo/linux-arm64': 2.9.3 - '@turbo/windows-64': 2.9.3 - '@turbo/windows-arm64': 2.9.3 + '@turbo/darwin-64': 2.9.6 + '@turbo/darwin-arm64': 2.9.6 + '@turbo/linux-64': 2.9.6 + '@turbo/linux-arm64': 2.9.6 + '@turbo/windows-64': 2.9.6 + '@turbo/windows-arm64': 2.9.6 type-check@0.4.0: dependencies: From 0e45db30413209b0ba6fe7b33ea90eb7a884bcf4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:09:07 +0200 Subject: [PATCH 16/57] build(deps-dev): Bump @eslint/compat from 2.0.3 to 2.0.5 (#152) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@eslint/compat](https://github.com/eslint/rewrite/tree/HEAD/packages/compat) from 2.0.3 to 2.0.5.
Release notes

Sourced from @​eslint/compat's releases.

migrate-config: v2.0.5

2.0.5 (2026-04-03)

Dependencies

  • The following workspace dependencies were updated
    • dependencies
      • @​eslint/compat bumped from ^2.0.3 to ^2.0.4
    • devDependencies
      • @​eslint/core bumped from ^1.1.1 to ^1.2.0

compat: v2.0.5

2.0.5 (2026-04-08)

Dependencies

  • The following workspace dependencies were updated
    • dependencies
      • @​eslint/core bumped from ^1.2.0 to ^1.2.1

migrate-config: v2.0.4

2.0.4 (2026-03-20)

Bug Fixes

  • update dependency @​eslint/eslintrc to ^3.3.5 (#397) (8567c19)

compat: v2.0.4

2.0.4 (2026-04-03)

Dependencies

  • The following workspace dependencies were updated
    • dependencies
      • @​eslint/core bumped from ^1.1.1 to ^1.2.0
Changelog

Sourced from @​eslint/compat's changelog.

2.0.5 (2026-04-08)

Dependencies

  • The following workspace dependencies were updated
    • dependencies
      • @​eslint/core bumped from ^1.2.0 to ^1.2.1

2.0.4 (2026-04-03)

Dependencies

  • The following workspace dependencies were updated
    • dependencies
      • @​eslint/core bumped from ^1.1.1 to ^1.2.0
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@eslint/compat&package-manager=npm_and_yarn&previous-version=2.0.3&new-version=2.0.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 54c6d751..37671f05 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "type": "module", "packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319", "devDependencies": { - "@eslint/compat": "2.0.3", + "@eslint/compat": "2.0.5", "@eslint/js": "10.0.1", "@playwright/test": "1.59.1", "@types/node": "24.12.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 045abad1..f9bade45 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: .: devDependencies: '@eslint/compat': - specifier: 2.0.3 - version: 2.0.3(eslint@10.1.0(jiti@2.6.1)) + specifier: 2.0.5 + version: 2.0.5(eslint@10.1.0(jiti@2.6.1)) '@eslint/js': specifier: 10.0.1 version: 10.0.1(eslint@10.1.0(jiti@2.6.1)) @@ -530,8 +530,8 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@2.0.3': - resolution: {integrity: sha512-SjIJhGigp8hmd1YGIBwh7Ovri7Kisl42GYFjrOyHhtfYGGoLW6teYi/5p8W50KSsawUPpuLOSmsq1bD0NGQLBw==} + '@eslint/compat@2.0.5': + resolution: {integrity: sha512-IbHDbHJfkVNv6xjlET8AIVo/K1NQt7YT4Rp6ok/clyBGcpRx1l6gv0Rq3vBvYfPJIZt6ODf66Zq08FJNDpnzgg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: ^8.40 || 9 || 10 @@ -551,6 +551,10 @@ packages: resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/js@10.0.1': resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -3810,9 +3814,9 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.0.3(eslint@10.1.0(jiti@2.6.1))': + '@eslint/compat@2.0.5(eslint@10.1.0(jiti@2.6.1))': dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 1.2.1 optionalDependencies: eslint: 10.1.0(jiti@2.6.1) @@ -3826,12 +3830,16 @@ snapshots: '@eslint/config-helpers@0.5.3': dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 1.2.1 '@eslint/core@1.1.1': dependencies: '@types/json-schema': 7.0.15 + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/js@10.0.1(eslint@10.1.0(jiti@2.6.1))': optionalDependencies: eslint: 10.1.0(jiti@2.6.1) @@ -3840,7 +3848,7 @@ snapshots: '@eslint/plugin-kit@0.6.1': dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 1.2.1 levn: 0.4.1 '@exodus/bytes@1.14.1': {} From 805e668715d5a72da92ee1879e0c182bf3c6b4a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:11:33 +0200 Subject: [PATCH 17/57] build(deps-dev): Bump prettier from 3.8.1 to 3.8.2 (#154) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [prettier](https://github.com/prettier/prettier) from 3.8.1 to 3.8.2.
Release notes

Sourced from prettier's releases.

3.8.2

  • Support Angular v21.2

🔗 Changelog

Changelog

Sourced from prettier's changelog.

3.8.2

diff

Angular: Support Angular v21.2 (#18722, #19034 by @​fisker)

Exhaustive typechecking with @default never;

<!-- Input -->
@switch (foo) {
  @case (1) {}
  @default never;
}

<!-- Prettier 3.8.1 --> SyntaxError: Incomplete block "default never". If you meant to write the @ character, you should use the "&#64;" HTML entity instead. (3:3)

<!-- Prettier 3.8.2 --> @​switch (foo) { @​case (1) {} @​default never; }

arrow function and instanceof expressions.

<!-- Input -->
@let fn = (a) =>        a?    1:2;

{{ fn ( a instanceof b)}}

<!-- Prettier 3.8.1 --> @​let fn = (a) => a? 1:2;

{{ fn ( a instanceof b)}}

<!-- Prettier 3.8.2 --> @​let fn = (a) => (a ? 1 : 2);

{{ fn(a instanceof b) }}

Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 37671f05..f986abb6 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "husky": "9.1.7", "knip": "6.4.1", "lint-staged": "16.4.0", - "prettier": "3.8.1", + "prettier": "3.8.2", "turbo": "2.9.6", "typescript": "5.9.3", "typescript-eslint": "8.58.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9bade45..c06ea726 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,8 +66,8 @@ importers: specifier: 16.4.0 version: 16.4.0 prettier: - specifier: 3.8.1 - version: 3.8.1 + specifier: 3.8.2 + version: 3.8.2 turbo: specifier: 2.9.6 version: 2.9.6 @@ -2868,8 +2868,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - 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 @@ -6154,7 +6154,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.8.1: {} + prettier@3.8.2: {} pretty-format@27.5.1: dependencies: From fc4dc9d01022afac20d6ac36bce4febb979a1cec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:13:17 +0200 Subject: [PATCH 18/57] ci(deps): Bump peter-evans/create-pull-request from 8.1.0 to 8.1.1 (#144) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 8.1.0 to 8.1.1.
Release notes

Sourced from peter-evans/create-pull-request's releases.

Create Pull Request v8.1.1

What's Changed

Full Changelog: https://github.com/peter-evans/create-pull-request/compare/v8.1.0...v8.1.1

Commits
  • 5f6978f fix: retry post-creation API calls on 422 eventual consistency errors (#4356)
  • d32e88d build(deps-dev): bump the npm group with 3 updates (#4349)
  • 8170bcc build(deps-dev): bump handlebars from 4.7.8 to 4.7.9 (#4344)
  • 0041819 build(deps): bump picomatch (#4339)
  • b993918 build(deps-dev): bump flatted from 3.3.1 to 3.4.2 (#4334)
  • 36d7c84 build(deps-dev): bump undici from 6.23.0 to 6.24.0 (#4328)
  • a45d1fb build(deps): bump @​tootallnate/once and jest-environment-jsdom (#4323)
  • 3499eb6 build(deps): bump the github-actions group with 2 updates (#4316)
  • 3f3b473 build(deps): bump minimatch (#4311)
  • 6699836 build(deps-dev): bump the npm group with 2 updates (#4305)
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=peter-evans/create-pull-request&package-manager=github_actions&previous-version=8.1.0&new-version=8.1.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/generate-theme-doc.yml | 2 +- .github/workflows/update-langs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/generate-theme-doc.yml b/.github/workflows/generate-theme-doc.yml index 92cce540..4e151147 100644 --- a/.github/workflows/generate-theme-doc.yml +++ b/.github/workflows/generate-theme-doc.yml @@ -40,7 +40,7 @@ jobs: pnpm --filter ./packages/core/ run theme-readme-gen - name: Create Pull Request if themes README has changed - uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8 + uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8 with: commit-message: "feat(backend): update themes README" branch: "update_themes_readme/patch" diff --git a/.github/workflows/update-langs.yml b/.github/workflows/update-langs.yml index b720eecb..8e0f7ce4 100644 --- a/.github/workflows/update-langs.yml +++ b/.github/workflows/update-langs.yml @@ -47,7 +47,7 @@ jobs: run: pnpm --filter ./packages/core/ run generate-langs-json - name: Create Pull Request if upstream language file is changed - uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8 + uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8 with: commit-message: "feat(backend): update languages JSON" branch: "update_langs/patch" From baf45b7e21f6b3f61dcc0d998d9056f88b3c088e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:18:25 +0200 Subject: [PATCH 19/57] build(deps): Bump axios-cache-interceptor from 1.11.4 to 1.12.0 (#160) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [axios-cache-interceptor](https://github.com/arthurfiorette/axios-cache-interceptor) from 1.11.4 to 1.12.0.
Release notes

Sourced from axios-cache-interceptor's releases.

v1.12.0

What's Changed

Full Changelog: https://github.com/arthurfiorette/axios-cache-interceptor/compare/v1.11.4...v1.12.0

Changelog

Sourced from axios-cache-interceptor's changelog.

v1.12.0

Merged

Commits

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=axios-cache-interceptor&package-manager=npm_and_yarn&previous-version=1.11.4&new-version=1.12.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c06ea726..bf8ff3e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,7 +125,7 @@ importers: version: 1.13.5 axios-cache-interceptor: specifier: ^1 - version: 1.11.4(axios@1.13.5) + version: 1.12.0(axios@1.13.5) daisyui: specifier: ^5.5.19 version: 5.5.19 @@ -1613,8 +1613,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios-cache-interceptor@1.11.4: - resolution: {integrity: sha512-xZ4OZUxdpcFUpZjrqfYlGK0VglpPRKKSoE3vMHrstxolixQNs/MrbMezOAO5uS454hIEcWpnk75RZK26WkPW/g==} + axios-cache-interceptor@1.12.0: + resolution: {integrity: sha512-15XuJkdeJmQo/HY2b0xx3zim8DMx7Nu+G8R4z6OG2VZLtbIDnsfn4qZsLLvkPfK4SVNRzXnoG4jPR7dqdQznRA==} engines: {node: '>=12'} peerDependencies: axios: ^1 @@ -4353,7 +4353,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.12.0 + '@types/node': 25.5.0 optional: true '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': @@ -4694,7 +4694,7 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios-cache-interceptor@1.11.4(axios@1.13.5): + axios-cache-interceptor@1.12.0(axios@1.13.5): dependencies: axios: 1.13.5 cache-parser: 1.2.6 @@ -5434,7 +5434,7 @@ snapshots: happy-dom@20.6.1: dependencies: - '@types/node': 24.12.0 + '@types/node': 25.5.0 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 entities: 6.0.1 From 3380ee97ccc0d14b9f513a97298a55de3ad2f637 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:41:54 +0200 Subject: [PATCH 20/57] build(deps): Bump @tailwindcss/vite from 4.2.1 to 4.2.2 (#155) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) from 4.2.1 to 4.2.2.
Release notes

Sourced from @​tailwindcss/vite's releases.

v4.2.2

Added

  • Support Vite 8 in @tailwindcss/vite (#19790)

Fixed

  • Don't crash when candidates contain prototype properties like row-constructor (#19725)
  • Canonicalize calc(var(--spacing)*…) expressions into --spacing(…) (#19769)
  • Fix crash in canonicalization step when handling utilities containing @property at-rules (e.g. shadow-sm border) (#19727)
  • Skip full reload for server only modules scanned by client CSS when using @tailwindcss/vite (#19745)
  • Improve canonicalization for bare values exceeding default spacing scale suggestions (e.g. w-1234 h-1234size-1234) (#19809)
  • Fix canonicalization resulting in empty list (e.g. w-5 h-5 size-5'' instead of size-5) (#19812)
Changelog

Sourced from @​tailwindcss/vite's changelog.

[4.2.2] - 2026-03-18

Fixed

  • Don't crash when candidates contain prototype properties like row-constructor (#19725)
  • Canonicalize calc(var(--spacing)*…) expressions into --spacing(…) (#19769)
  • Fix crash in canonicalization step when handling utilities containing @property at-rules (e.g. shadow-sm border) (#19727)
  • Skip full reload for server only modules scanned by client CSS when using @tailwindcss/vite (#19745)
  • Add support for Vite 8 in @tailwindcss/vite (#19790)
  • Improve canonicalization for bare values exceeding default spacing scale suggestions (e.g. w-1234 h-1234size-1234) (#19809)
  • Fix canonicalization resulting in empty list (e.g. w-5 h-5 size-5'' instead of size-5) (#19812)
  • Resolve tsconfig paths to allow for @import '@/path/to/file'; when using @tailwindcss/vite (#19803)
Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/frontend/package.json | 2 +- pnpm-lock.yaml | 297 ++++++++++++++++++------------------- 2 files changed, 147 insertions(+), 152 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 9e4f8f62..2a436871 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@reduxjs/toolkit": "^2.11.2", - "@tailwindcss/vite": "^4.2.1", + "@tailwindcss/vite": "^4.2.2", "axios": "^1", "axios-cache-interceptor": "^1", "daisyui": "^5.5.19", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf8ff3e2..7645934a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,7 +34,7 @@ importers: version: 24.12.0 '@vitest/coverage-v8': specifier: catalog:default - version: 4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3))) + version: 4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))) eslint: specifier: 10.1.0 version: 10.1.0(jiti@2.6.1) @@ -79,7 +79,7 @@ importers: version: 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: catalog:default - version: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) apps/backend: dependencies: @@ -104,7 +104,7 @@ importers: version: 28.1.0 vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) apps/frontend: dependencies: @@ -118,8 +118,8 @@ importers: specifier: workspace:^ version: link:../../packages/core '@tailwindcss/vite': - specifier: ^4.2.1 - version: 4.2.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + specifier: ^4.2.2 + version: 4.2.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) axios: specifier: ^1 version: 1.13.5 @@ -168,7 +168,7 @@ importers: version: 18.3.7(@types/react@18.3.27) '@vitejs/plugin-react-swc': specifier: 4.2.3 - version: 4.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -177,10 +177,10 @@ importers: version: 4.2.2 vite: specifier: catalog:default - version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) + version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) packages/core: dependencies: @@ -217,7 +217,7 @@ importers: version: 28.1.0 vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) packages: @@ -1124,69 +1124,69 @@ packages: '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} - '@tailwindcss/node@4.2.1': - resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} - '@tailwindcss/oxide-android-arm64@4.2.1': - resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==} + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.2.1': - resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.2.1': - resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==} + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.2.1': - resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': - resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': - resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.2.1': - resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.2.1': - resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.2.1': - resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.2.1': - resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1197,26 +1197,26 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': - resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==} + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.2.1': - resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.2.1': - resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} engines: {node: '>= 20'} - '@tailwindcss/vite@4.2.1': - resolution: {integrity: sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==} + '@tailwindcss/vite@4.2.2': + resolution: {integrity: sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==} peerDependencies: - vite: ^5.2.0 || ^6 || ^7 + vite: ^5.2.0 || ^6 || ^7 || ^8 '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} @@ -1849,8 +1849,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - enhanced-resolve@5.19.0: - resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} entities@6.0.1: @@ -2484,78 +2484,78 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.31.1: - resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.31.1: - resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.31.1: - resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.31.1: - resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.31.1: - resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.31.1: - resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.31.1: - resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.31.1: - resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.31.1: - resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.31.1: - resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.31.1: - resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.31.1: - resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} lint-staged@16.4.0: @@ -3213,14 +3213,11 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tailwindcss@4.2.1: - resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} - tailwindcss@4.2.2: resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.2: + resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} engines: {node: '>=6'} terser@5.44.1: @@ -4200,73 +4197,73 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@tailwindcss/node@4.2.1': + '@tailwindcss/node@4.2.2': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.20.1 jiti: 2.6.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.2.1 + tailwindcss: 4.2.2 - '@tailwindcss/oxide-android-arm64@4.2.1': + '@tailwindcss/oxide-android-arm64@4.2.2': optional: true - '@tailwindcss/oxide-darwin-arm64@4.2.1': + '@tailwindcss/oxide-darwin-arm64@4.2.2': optional: true - '@tailwindcss/oxide-darwin-x64@4.2.1': + '@tailwindcss/oxide-darwin-x64@4.2.2': optional: true - '@tailwindcss/oxide-freebsd-x64@4.2.1': + '@tailwindcss/oxide-freebsd-x64@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.2.1': + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.2.1': + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.2.1': + '@tailwindcss/oxide-linux-x64-musl@4.2.2': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.2.1': + '@tailwindcss/oxide-wasm32-wasi@4.2.2': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.2.1': + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': optional: true - '@tailwindcss/oxide@4.2.1': + '@tailwindcss/oxide@4.2.2': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.1 - '@tailwindcss/oxide-darwin-arm64': 4.2.1 - '@tailwindcss/oxide-darwin-x64': 4.2.1 - '@tailwindcss/oxide-freebsd-x64': 4.2.1 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.1 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.1 - '@tailwindcss/oxide-linux-x64-musl': 4.2.1 - '@tailwindcss/oxide-wasm32-wasi': 4.2.1 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': dependencies: - '@tailwindcss/node': 4.2.1 - '@tailwindcss/oxide': 4.2.1 - tailwindcss: 4.2.1 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + tailwindcss: 4.2.2 + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) '@testing-library/dom@10.4.1': dependencies: @@ -4508,15 +4505,15 @@ snapshots: '@uppercod/css-to-object@1.1.1': {} - '@vitejs/plugin-react-swc@4.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3))': + '@vitejs/plugin-react-swc@4.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 '@swc/core': 1.15.13 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) transitivePeerDependencies: - '@swc/helpers' - '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)))': + '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.2 @@ -4528,7 +4525,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + vitest: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) '@vitest/expect@4.1.2': dependencies: @@ -4539,21 +4536,21 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) - '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) '@vitest/pretty-format@4.1.2': dependencies: @@ -4927,10 +4924,10 @@ snapshots: encodeurl@2.0.0: {} - enhanced-resolve@5.19.0: + enhanced-resolve@5.20.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.2 entities@6.0.1: {} @@ -5767,54 +5764,54 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lightningcss-android-arm64@1.31.1: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.31.1: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.31.1: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.31.1: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.31.1: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.31.1: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.31.1: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.31.1: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.31.1: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.31.1: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.31.1: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.31.1: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.31.1 - lightningcss-darwin-arm64: 1.31.1 - lightningcss-darwin-x64: 1.31.1 - lightningcss-freebsd-x64: 1.31.1 - lightningcss-linux-arm-gnueabihf: 1.31.1 - lightningcss-linux-arm64-gnu: 1.31.1 - lightningcss-linux-arm64-musl: 1.31.1 - lightningcss-linux-x64-gnu: 1.31.1 - lightningcss-linux-x64-musl: 1.31.1 - lightningcss-win32-arm64-msvc: 1.31.1 - lightningcss-win32-x64-msvc: 1.31.1 + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 lint-staged@16.4.0: dependencies: @@ -6580,11 +6577,9 @@ snapshots: symbol-tree@3.2.4: {} - tailwindcss@4.2.1: {} - tailwindcss@4.2.2: {} - tapable@2.3.0: {} + tapable@2.3.2: {} terser@5.44.1: dependencies: @@ -6764,7 +6759,7 @@ snapshots: vary@1.1.2: {} - vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3): + vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.4) @@ -6776,11 +6771,11 @@ snapshots: '@types/node': 24.12.0 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 terser: 5.44.1 yaml: 2.8.3 - vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3): + vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.4) @@ -6792,14 +6787,14 @@ snapshots: '@types/node': 25.5.0 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 terser: 5.44.1 yaml: 2.8.3 - vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)): + vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.2 '@vitest/runner': 4.1.2 '@vitest/snapshot': 4.1.2 @@ -6816,7 +6811,7 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.12.0 @@ -6825,10 +6820,10 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)): + vitest@4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.2 '@vitest/runner': 4.1.2 '@vitest/snapshot': 4.1.2 @@ -6845,7 +6840,7 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.5.0 From 672777a7e19ceae83a8133aa0efda9f81ffee1da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:43:11 +0200 Subject: [PATCH 21/57] build(deps-dev): Bump typescript-eslint from 8.58.0 to 8.58.1 (#157) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.58.0 to 8.58.1.
Release notes

Sourced from typescript-eslint's releases.

v8.58.1

8.58.1 (2026-04-08)

🩹 Fixes

  • eslint-plugin: [no-unused-vars] fix false negative for type predicate parameter (#12004)

❤️ Thank You

See GitHub Releases for more information.

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from typescript-eslint's changelog.

8.58.1 (2026-04-08)

This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.

See GitHub Releases for more information.

You can read about our versioning strategy and releases on our website.

Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 157 +++++++++++++++++++++++++++---------------------- 2 files changed, 87 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index f986abb6..73de36cb 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "prettier": "3.8.2", "turbo": "2.9.6", "typescript": "5.9.3", - "typescript-eslint": "8.58.0", + "typescript-eslint": "8.58.1", "vitest": "catalog:default" }, "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7645934a..d4b717d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,10 +40,10 @@ importers: version: 10.1.0(jiti@2.6.1) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-import-x: specifier: 4.16.2 - version: 4.16.2(@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) + version: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-jsdoc: specifier: 62.9.0 version: 62.9.0(eslint@10.1.0(jiti@2.6.1)) @@ -75,8 +75,8 @@ importers: specifier: 5.9.3 version: 5.9.3 typescript-eslint: - specifier: 8.58.0 - version: 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.58.1 + version: 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: catalog:default version: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) @@ -1303,39 +1303,39 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.58.0': - resolution: {integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==} + '@typescript-eslint/eslint-plugin@8.58.1': + resolution: {integrity: sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.0 + '@typescript-eslint/parser': ^8.58.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.58.0': - resolution: {integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==} + '@typescript-eslint/parser@8.58.1': + resolution: {integrity: sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==} 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.1.0' - '@typescript-eslint/project-service@8.58.0': - resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} + '@typescript-eslint/project-service@8.58.1': + resolution: {integrity: sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.58.0': - resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} + '@typescript-eslint/scope-manager@8.58.1': + resolution: {integrity: sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.58.0': - resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} + '@typescript-eslint/tsconfig-utils@8.58.1': + resolution: {integrity: sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.0': - resolution: {integrity: sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==} + '@typescript-eslint/type-utils@8.58.1': + resolution: {integrity: sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -1345,21 +1345,25 @@ packages: resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.58.0': - resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} + '@typescript-eslint/types@8.58.1': + resolution: {integrity: sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.58.1': + resolution: {integrity: sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.58.0': - resolution: {integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==} + '@typescript-eslint/utils@8.58.1': + resolution: {integrity: sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==} 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.1.0' - '@typescript-eslint/visitor-keys@8.58.0': - resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} + '@typescript-eslint/visitor-keys@8.58.1': + resolution: {integrity: sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -3236,6 +3240,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} @@ -3307,8 +3315,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.58.0: - resolution: {integrity: sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==} + typescript-eslint@8.58.1: + resolution: {integrity: sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -3719,7 +3727,7 @@ snapshots: '@es-joy/jsdoccomment@0.86.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/types': 8.58.1 comment-parser: 1.4.6 esquery: 1.7.0 jsdoc-type-pratt-parser: 7.2.0 @@ -4350,17 +4358,17 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.5.0 + '@types/node': 24.12.0 optional: true - '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/type-utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/parser': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.58.1 + '@typescript-eslint/type-utils': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.58.1 eslint: 10.1.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 @@ -4369,41 +4377,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/scope-manager': 8.58.1 + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.58.1 debug: 4.4.3 eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.58.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) - '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3) + '@typescript-eslint/types': 8.58.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.0': + '@typescript-eslint/scope-manager@8.58.1': dependencies: - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/visitor-keys': 8.58.1 - '@typescript-eslint/tsconfig-utils@8.58.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.58.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 eslint: 10.1.0(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@5.9.3) @@ -4413,35 +4421,37 @@ snapshots: '@typescript-eslint/types@8.58.0': {} - '@typescript-eslint/typescript-estree@8.58.0(typescript@5.9.3)': + '@typescript-eslint/types@8.58.1': {} + + '@typescript-eslint/typescript-estree@8.58.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.58.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/project-service': 8.58.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3) + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/visitor-keys': 8.58.1 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.58.1 + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.0': + '@typescript-eslint/visitor-keys@8.58.1': dependencies: - '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/types': 8.58.1 eslint-visitor-keys: 5.0.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -5079,7 +5089,7 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1)): dependencies: debug: 4.4.3 eslint: 10.1.0(jiti@2.6.1) @@ -5090,11 +5100,11 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)): + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)): dependencies: '@package-json/types': 0.0.12 '@typescript-eslint/types': 8.58.0 @@ -5108,7 +5118,7 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - supports-color @@ -5431,7 +5441,7 @@ snapshots: happy-dom@20.6.1: dependencies: - '@types/node': 25.5.0 + '@types/node': 24.12.0 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 entities: 6.0.1 @@ -6598,6 +6608,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinyrainbow@3.1.0: {} tldts-core@7.0.23: {} @@ -6686,12 +6701,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: From d5e7217b4fe497778f1b5719c33e3d5a89f4cd09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:46:33 +0200 Subject: [PATCH 22/57] build(deps-dev): Bump jsdom from 28.1.0 to 29.0.2 (#145) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [jsdom](https://github.com/jsdom/jsdom) from 28.1.0 to 29.0.2.
Release notes

Sourced from jsdom's releases.

v29.0.2

  • Significantly improved and sped up getComputedStyle(). Computed value rules are now applied across a broader set of properties, and include fixes related to inheritance, defaulting keywords, custom properties, and color-related values such as currentcolor and system colors. (@​asamuzaK)
  • Fixed CSS 'background' and 'border' shorthand parsing. (@​asamuzaK)

v29.0.1

  • Fixed CSS parsing of 'border', 'background', and their sub-shorthands containing keywords or var(). (@​asamuzaK)
  • Fixed getComputedStyle() to return a more functional CSSStyleDeclaration object, including indexed access support, which regressed in v29.0.0.

v29.0.0

Breaking changes:

  • Node.js v22.13.0+ is now the minimum supported v22 version (was v22.12.0+).

Other changes:

  • Overhauled the CSSOM implementation, replacing the @acemir/cssom and cssstyle dependencies with fresh internal implementations built on webidl2js wrappers and the css-tree parser. Serialization, parsing, and API behavior is improved in various ways, especially around edge cases.
  • Added CSSCounterStyleRule and CSSNamespaceRule to jsdom Windows.
  • Added cssMediaRule.matches and cssSupportsRule.matches getters.
  • Added proper media query parsing in MediaList, using css-tree instead of naive comma-splitting. Invalid queries become "not all" per spec.
  • Added cssKeyframeRule.keyText getter/setter validation.
  • Added cssStyleRule.selectorText setter validation: invalid selectors are now rejected.
  • Added styleSheet.ownerNode, styleSheet.href, and styleSheet.title.
  • Added bad port blocking per the fetch specification, preventing fetches to commonly-abused ports.
  • Improved Document initialization performance by lazily initializing the CSS selector engine, avoiding ~0.5 ms of overhead per Document. (@​thypon)
  • Fixed a memory leak when stylesheets were removed from the document.
  • Fixed CSSStyleDeclaration modifications to properly trigger custom element reactions.
  • Fixed nested @media rule parsing.
  • Fixed CSSStyleSheet's "disallow modification" flag not being checked in all mutation methods.
  • Fixed XMLHttpRequest's response getter returning parsed JSON during the LOADING state instead of null.
  • Fixed getComputedStyle() crashing in XHTML documents when stylesheets contained at-rules such as @page or @font-face.
  • Fixed a potential hang in synchronous XMLHttpRequest caused by a race condition with the worker thread's idle timeout.
Commits
  • 2a1e2cd 29.0.2
  • 4097d66 Resolve computed CSS values lazily in CSSStyleDeclaration
  • cf5523f Add more test cases for nested color-mix with currentColor
  • b33b616 Add test that getComputedStyle() works with !important
  • 6bf559c Add test for custom property inheritance in computed styles
  • 6817657 Fix border shorthand handling
  • 470f5c5 Consolidate color helpers
  • 3db53cb Fix background shorthand handlers
  • 678e840 Remove some longhand property files
  • d526a07 Add regression test for getComputedStyle() liveness
  • Additional commits viewable in compare view
Maintainer changes

This version was pushed to npm by [GitHub Actions](https://www.npmjs.com/~GitHub Actions), a new releaser for jsdom since your current version.

Install script changes

This version modifies prepare script that runs during installation. Review the package contents before updating.


Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/backend/package.json | 2 +- packages/core/package.json | 2 +- pnpm-lock.yaml | 207 +++++++++++++++---------------------- 3 files changed, 86 insertions(+), 125 deletions(-) diff --git a/apps/backend/package.json b/apps/backend/package.json index 8d5a8adf..c53cec61 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -18,7 +18,7 @@ "devDependencies": { "axios-mock-adapter": "2.1.0", "express": "5.2.1", - "jsdom": "28.1.0", + "jsdom": "29.0.2", "vitest": "catalog:default" }, "dependencies": { diff --git a/packages/core/package.json b/packages/core/package.json index e9e10e70..2cdf34a6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -82,7 +82,7 @@ "@uppercod/css-to-object": "1.1.1", "axios-mock-adapter": "2.1.0", "js-yaml": "4.1.1", - "jsdom": "28.1.0", + "jsdom": "29.0.2", "vitest": "catalog:default" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d4b717d2..656a3334 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,7 +34,7 @@ importers: version: 24.12.0 '@vitest/coverage-v8': specifier: catalog:default - version: 4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))) + version: 4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))) eslint: specifier: 10.1.0 version: 10.1.0(jiti@2.6.1) @@ -79,7 +79,7 @@ importers: version: 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: catalog:default - version: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) apps/backend: dependencies: @@ -100,11 +100,11 @@ importers: specifier: 5.2.1 version: 5.2.1 jsdom: - specifier: 28.1.0 - version: 28.1.0 + specifier: 29.0.2 + version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) apps/frontend: dependencies: @@ -180,7 +180,7 @@ importers: version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) packages/core: dependencies: @@ -213,26 +213,24 @@ importers: specifier: 4.1.1 version: 4.1.1 jsdom: - specifier: 28.1.0 - version: 28.1.0 + specifier: 29.0.2 + version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) packages: - '@acemir/cssom@0.9.31': - resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} - '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@asamuzakjp/css-color@5.0.1': - resolution: {integrity: sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==} + '@asamuzakjp/css-color@5.1.10': + resolution: {integrity: sha512-02OhhkKtgNRuicQ/nF3TRnGsxL9wp0r3Y7VlKWyOHHGmGyvXv03y+PnymU8FKFJMTjIr1Bk8U2g1HWSLrpAHww==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/dom-selector@6.8.1': - resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==} + '@asamuzakjp/dom-selector@7.0.9': + resolution: {integrity: sha512-r3ElRr7y8ucyN2KdICwGsmj19RoN13CLCa/pvGydghWK6ZzeKQ+TcDjVdtEZz2ElpndM5jXw//B9CEee0mWnVg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -320,15 +318,15 @@ packages: resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.1.1': - resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==} + '@csstools/css-calc@3.2.0': + resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.0.2': - resolution: {integrity: sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==} + '@csstools/css-color-parser@4.1.0': + resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -340,8 +338,13 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.28': - resolution: {integrity: sha512-1NRf1CUBjnr3K7hu8BLxjQrKCxEe8FP/xmPTenAxCRZWVLbmGotkFvG9mfNpjA6k7Bw1bw4BilZq9cu19RA5pg==} + '@csstools/css-syntax-patches-for-csstree@1.1.3': + resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true '@csstools/css-tokenizer@4.0.0': resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} @@ -572,8 +575,8 @@ packages: resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@exodus/bytes@1.14.1': - resolution: {integrity: sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ==} + '@exodus/bytes@1.15.0': + resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -1530,10 +1533,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} @@ -1751,17 +1750,13 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssstyle@6.1.0: - resolution: {integrity: sha512-Ml4fP2UT2K3CUBQnVlbdV/8aFDdlY69E+YnwJM+3VUWl08S3J8c8aRuJqCkD9Py8DHZ7zNNvsfKl8psocHZEFg==} - engines: {node: '>=20'} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -2237,17 +2232,9 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - http-vary@1.0.3: resolution: {integrity: sha512-sx7Y8YTqF3o0mFJJvF66n8dbaE8v3liV1RgCz46XP5xK7dnzyZHvwMWRA115q5kjbCPBV65/nOMlgW54WLyiag==} - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -2444,9 +2431,9 @@ packages: resolution: {integrity: sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==} engines: {node: '>=20.0.0'} - jsdom@28.1.0: - resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + jsdom@29.0.2: + resolution: {integrity: sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -2583,8 +2570,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lru-cache@11.2.6: - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + lru-cache@11.3.5: + resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -2608,8 +2595,8 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} @@ -3248,11 +3235,11 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - tldts-core@7.0.23: - resolution: {integrity: sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ==} + tldts-core@7.0.28: + resolution: {integrity: sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==} - tldts@7.0.23: - resolution: {integrity: sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw==} + tldts@7.0.28: + resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==} hasBin: true to-regex-range@5.0.1: @@ -3267,8 +3254,8 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + tough-cookie@6.0.1: + resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} tr46@6.0.0: @@ -3341,8 +3328,8 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@7.22.0: - resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} + undici@7.25.0: + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} unpipe@1.0.0: @@ -3556,25 +3543,21 @@ packages: snapshots: - '@acemir/cssom@0.9.31': {} - '@adobe/css-tools@4.4.4': {} - '@asamuzakjp/css-color@5.0.1': + '@asamuzakjp/css-color@5.1.10': 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-color-parser': 4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.0(@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-tokenizer': 4.0.0 - lru-cache: 11.2.6 - '@asamuzakjp/dom-selector@6.8.1': + '@asamuzakjp/dom-selector@7.0.9': dependencies: '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 - css-tree: 3.1.0 + css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.6 '@asamuzakjp/nwsapi@2.3.9': {} @@ -3684,19 +3667,19 @@ snapshots: '@bramus/specificity@2.4.2': dependencies: - css-tree: 3.1.0 + css-tree: 3.2.1 '@csstools/color-helpers@6.0.2': {} - '@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-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/color-helpers': 6.0.2 - '@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-calc': 3.2.0(@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-tokenizer': 4.0.0 @@ -3704,7 +3687,9 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.28': {} + '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 '@csstools/css-tokenizer@4.0.0': {} @@ -3856,7 +3841,7 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@exodus/bytes@1.14.1': {} + '@exodus/bytes@1.15.0': {} '@humanfs/core@0.19.1': {} @@ -4523,7 +4508,7 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' - '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)))': + '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.2 @@ -4535,7 +4520,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + vitest: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) '@vitest/expect@4.1.2': dependencies: @@ -4597,8 +4582,6 @@ snapshots: acorn@8.16.0: {} - agent-base@7.1.4: {} - ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 @@ -4839,20 +4822,13 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-tree@3.1.0: + css-tree@3.2.1: dependencies: - mdn-data: 2.12.2 + mdn-data: 2.27.1 source-map-js: 1.2.1 css.escape@1.5.1: {} - cssstyle@6.1.0: - dependencies: - '@asamuzakjp/css-color': 5.0.1 - '@csstools/css-syntax-patches-for-csstree': 1.0.28 - css-tree: 3.1.0 - lru-cache: 11.2.6 - csstype@3.2.3: {} daisyui@5.5.19: {} @@ -5482,7 +5458,7 @@ snapshots: html-encoding-sniffer@6.0.0: dependencies: - '@exodus/bytes': 1.14.1 + '@exodus/bytes': 1.15.0 transitivePeerDependencies: - '@noble/hashes' @@ -5498,22 +5474,8 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - http-vary@1.0.3: {} - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - husky@9.1.7: {} iconv-lite@0.7.2: @@ -5700,24 +5662,24 @@ snapshots: jsdoc-type-pratt-parser@7.2.0: {} - jsdom@28.1.0: + jsdom@29.0.2: dependencies: - '@acemir/cssom': 0.9.31 - '@asamuzakjp/dom-selector': 6.8.1 + '@asamuzakjp/css-color': 5.1.10 + '@asamuzakjp/dom-selector': 7.0.9 '@bramus/specificity': 2.4.2 - '@exodus/bytes': 1.14.1 - cssstyle: 6.1.0 + '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) + '@exodus/bytes': 1.15.0 + css-tree: 3.2.1 data-urls: 7.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 + lru-cache: 11.3.5 parse5: 8.0.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.0 - undici: 7.22.0 + tough-cookie: 6.0.1 + undici: 7.25.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -5725,7 +5687,6 @@ snapshots: xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' - - supports-color jsesc@3.1.0: {} @@ -5857,7 +5818,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - lru-cache@11.2.6: {} + lru-cache@11.3.5: {} lru-cache@5.1.1: dependencies: @@ -5881,7 +5842,7 @@ snapshots: math-intrinsics@1.1.0: {} - mdn-data@2.12.2: {} + mdn-data@2.27.1: {} media-typer@1.1.0: {} @@ -6615,11 +6576,11 @@ snapshots: tinyrainbow@3.1.0: {} - tldts-core@7.0.23: {} + tldts-core@7.0.28: {} - tldts@7.0.23: + tldts@7.0.28: dependencies: - tldts-core: 7.0.23 + tldts-core: 7.0.28 to-regex-range@5.0.1: dependencies: @@ -6632,9 +6593,9 @@ snapshots: toidentifier@1.0.1: {} - tough-cookie@6.0.0: + tough-cookie@6.0.1: dependencies: - tldts: 7.0.23 + tldts: 7.0.28 tr46@6.0.0: dependencies: @@ -6728,7 +6689,7 @@ snapshots: undici-types@7.18.2: optional: true - undici@7.22.0: {} + undici@7.25.0: {} unpipe@1.0.0: {} @@ -6806,7 +6767,7 @@ snapshots: terser: 5.44.1 yaml: 2.8.3 - vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)): + vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) @@ -6831,11 +6792,11 @@ snapshots: optionalDependencies: '@types/node': 24.12.0 happy-dom: 20.6.1 - jsdom: 28.1.0 + jsdom: 29.0.2 transitivePeerDependencies: - msw - vitest@4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@28.1.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)): + vitest@4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) @@ -6860,7 +6821,7 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 happy-dom: 20.6.1 - jsdom: 28.1.0 + jsdom: 29.0.2 transitivePeerDependencies: - msw @@ -6879,7 +6840,7 @@ snapshots: whatwg-url@16.0.1: dependencies: - '@exodus/bytes': 1.14.1 + '@exodus/bytes': 1.15.0 tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: From c772f6ae56f44bdf1ce4f754404c565220f76ae4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:54:56 +0200 Subject: [PATCH 23/57] build(deps-dev): Bump @vitejs/plugin-react-swc from 4.2.3 to 4.3.0 (#129) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react-swc) from 4.2.3 to 4.3.0.
Release notes

Sourced from @​vitejs/plugin-react-swc's releases.

plugin-react-swc@4.3.0

Add Vite 8 to peerDependencies range #1142

This plugin is compatible with Vite 8.

Changelog

Sourced from @​vitejs/plugin-react-swc's changelog.

4.3.0 (2026-03-12)

Add Vite 8 to peerDependencies range #1142

This plugin is compatible with Vite 8.

Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/frontend/package.json | 2 +- pnpm-lock.yaml | 138 +++++++++++++++++++++---------------- 2 files changed, 81 insertions(+), 59 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 2a436871..39304c01 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -34,7 +34,7 @@ "devDependencies": { "@types/react": "18.3.27", "@types/react-dom": "18.3.7", - "@vitejs/plugin-react-swc": "4.2.3", + "@vitejs/plugin-react-swc": "4.3.0", "clsx": "2.1.1", "tailwindcss": "4.2.2", "vite": "catalog:default", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 656a3334..a4a998b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -167,8 +167,8 @@ importers: specifier: 18.3.7 version: 18.3.7(@types/react@18.3.27) '@vitejs/plugin-react-swc': - specifier: 4.2.3 - version: 4.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + specifier: 4.3.0 + version: 4.3.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -897,8 +897,8 @@ packages: react-redux: optional: true - '@rolldown/pluginutils@1.0.0-rc.2': - resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + '@rolldown/pluginutils@1.0.0-rc.7': + resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} '@rollup/rollup-android-arm-eabi@4.59.0': resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} @@ -1048,72 +1048,86 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@swc/core-darwin-arm64@1.15.13': - resolution: {integrity: sha512-ztXusRuC5NV2w+a6pDhX13CGioMLq8CjX5P4XgVJ21ocqz9t19288Do0y8LklplDtwcEhYGTNdMbkmUT7+lDTg==} + '@swc/core-darwin-arm64@1.15.24': + resolution: {integrity: sha512-uM5ZGfFXjtvtJ+fe448PVBEbn/CSxS3UAyLj3O9xOqKIWy3S6hPTXSPbszxkSsGDYKi+YFhzAsR4r/eXLxEQ0g==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.13': - resolution: {integrity: sha512-cVifxQUKhaE7qcO/y9Mq6PEhoyvN9tSLzCnnFZ4EIabFHBuLtDDO6a+vLveOy98hAs5Qu1+bb5Nv0oa1Pihe3Q==} + '@swc/core-darwin-x64@1.15.24': + resolution: {integrity: sha512-fMIb/Zfn929pw25VMBhV7Ji2Dl+lCWtUPNdYJQYOke+00E5fcQ9ynxtP8+qhUo/HZc+mYQb1gJxwHM9vty+lXg==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.13': - resolution: {integrity: sha512-t+xxEzZ48enl/wGGy7SRYd7kImWQ/+wvVFD7g5JZo234g6/QnIgZ+YdfIyjHB+ZJI3F7a2IQHS7RNjxF29UkWw==} + '@swc/core-linux-arm-gnueabihf@1.15.24': + resolution: {integrity: sha512-vOkjsyjjxnoYx3hMEWcGxQrMgnNrRm6WAegBXrN8foHtDAR+zpdhpGF5a4lj1bNPgXAvmysjui8cM1ov/Clkaw==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.13': - resolution: {integrity: sha512-VndeGvKmTXFn6AGwjy0Kg8i7HccOCE7Jt/vmZwRxGtOfNZM1RLYRQ7MfDLo6T0h1Bq6eYzps3L5Ma4zBmjOnOg==} + '@swc/core-linux-arm64-gnu@1.15.24': + resolution: {integrity: sha512-h/oNu+upkXJ6Cicnq7YGVj9PkdfarLCdQa8l/FlHYvfv8CEiMaeeTnpLU7gSBH/rGxosM6Qkfa/J9mThGF9CLA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [glibc] - '@swc/core-linux-arm64-musl@1.15.13': - resolution: {integrity: sha512-SmZ9m+XqCB35NddHCctvHFLqPZDAs5j8IgD36GoutufDJmeq2VNfgk5rQoqNqKmAK3Y7iFdEmI76QoHIWiCLyw==} + '@swc/core-linux-arm64-musl@1.15.24': + resolution: {integrity: sha512-ZpF/pRe1guk6sKzQI9D1jAORtjTdNlyeXn9GDz8ophof/w2WhojRblvSDJaGe7rJjcPN8AaOkhwdRUh7q8oYIg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [musl] - '@swc/core-linux-x64-gnu@1.15.13': - resolution: {integrity: sha512-5rij+vB9a29aNkHq72EXI2ihDZPszJb4zlApJY4aCC/q6utgqFA6CkrfTfIb+O8hxtG3zP5KERETz8mfFK6A0A==} + '@swc/core-linux-ppc64-gnu@1.15.24': + resolution: {integrity: sha512-QZEsZfisHTSJlmyChgDFNmKPb3W6Lhbfo/O76HhIngfEdnQNmukS38/VSe1feho+xkV5A5hETyCbx3sALBZKAQ==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-s390x-gnu@1.15.24': + resolution: {integrity: sha512-DLdJKVsJgglqQrJBuoUYNmzm3leI7kUZhLbZGHv42onfKsGf6JDS3+bzCUQfte/XOqDjh/tmmn1DR/CF/tCJFw==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@swc/core-linux-x64-gnu@1.15.24': + resolution: {integrity: sha512-IpLYfposPA/XLxYOKpRfeccl1p5dDa3+okZDHHTchBkXEaVCnq5MADPmIWwIYj1tudt7hORsEHccG5no6IUQRw==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [glibc] - '@swc/core-linux-x64-musl@1.15.13': - resolution: {integrity: sha512-OlSlaOK9JplQ5qn07WiBLibkOw7iml2++ojEXhhR3rbWrNEKCD7sd8+6wSavsInyFdw4PhLA+Hy6YyDBIE23Yw==} + '@swc/core-linux-x64-musl@1.15.24': + resolution: {integrity: sha512-JHy3fMSc0t/EPWgo74+OK5TGr51aElnzqfUPaiRf2qJ/BfX5CUCfMiWVBuhI7qmVMBnk1jTRnL/xZnOSHDPLYg==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [musl] - '@swc/core-win32-arm64-msvc@1.15.13': - resolution: {integrity: sha512-zwQii5YVdsfG8Ti9gIKgBKZg8qMkRZxl+OlYWUT5D93Jl4NuNBRausP20tfEkQdAPSRrMCSUZBM6FhW7izAZRg==} + '@swc/core-win32-arm64-msvc@1.15.24': + resolution: {integrity: sha512-Txj+qUH1z2bUd1P3JvwByfjKFti3cptlAxhWgmunBUUxy/IW3CXLZ6l6Gk4liANadKkU71nIU1X30Z5vpMT3BA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.13': - resolution: {integrity: sha512-hYXvyVVntqRlYoAIDwNzkS3tL2ijP3rxyWQMNKaxcCxxkCDto/w3meOK/OB6rbQSkNw0qTUcBfU9k+T0ptYdfQ==} + '@swc/core-win32-ia32-msvc@1.15.24': + resolution: {integrity: sha512-15D/nl3XwrhFpMv+MADFOiVwv3FvH9j8c6Rf8EXBT3Q5LoMh8YnDnSgPYqw1JzPnksvsBX6QPXLiPqmcR/Z4qQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.13': - resolution: {integrity: sha512-XTzKs7c/vYCcjmcwawnQvlHHNS1naJEAzcBckMI5OJlnrcgW8UtcX9NHFYvNjGtXuKv0/9KvqL4fuahdvlNGKw==} + '@swc/core-win32-x64-msvc@1.15.24': + resolution: {integrity: sha512-PR0PlTlPra2JbaDphrOAzm6s0v9rA0F17YzB+XbWD95B4g2cWcZY9LAeTa4xll70VLw9Jr7xBrlohqlQmelMFQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.13': - resolution: {integrity: sha512-0l1gl/72PErwUZuavcRpRAQN9uSst+Nk++niC5IX6lmMWpXoScYx3oq/narT64/sKv/eRiPTaAjBFGDEQiWJIw==} + '@swc/core@1.15.24': + resolution: {integrity: sha512-5Hj8aNasue7yusUt8LGCUe/AjM7RMAce8ZoyDyiFwx7Al+GbYKL+yE7g4sJk8vEr1dKIkTRARkNIJENc4CjkBQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -1124,8 +1138,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.25': - resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@swc/types@0.1.26': + resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} '@tailwindcss/node@4.2.2': resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} @@ -1475,11 +1489,11 @@ packages: '@uppercod/css-to-object@1.1.1': resolution: {integrity: sha512-dCTxxolI6fu28lzNRVwd7CzJV8EbARITFyCbP/JqLHYLfWHY7GJqXHDdk0GbtfXvsZosPCvjOE4dOIMT4XDFZQ==} - '@vitejs/plugin-react-swc@4.2.3': - resolution: {integrity: sha512-QIluDil2prhY1gdA3GGwxZzTAmLdi8cQ2CcuMW4PB/Wu4e/1pzqrwhYWVd09LInCRlDUidQjd0B70QWbjWtLxA==} + '@vitejs/plugin-react-swc@4.3.0': + resolution: {integrity: sha512-mOkXCII839dHyAt/gpoSlm28JIVDwhZ6tnG6wJxUy2bmOx7UaPjvOyIDf3SFv5s7Eo7HVaq6kRcu6YMEzt5Z7w==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^4 || ^5 || ^6 || ^7 + vite: ^4 || ^5 || ^6 || ^7 || ^8 '@vitest/coverage-v8@4.1.2': resolution: {integrity: sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==} @@ -4055,7 +4069,7 @@ snapshots: react: 18.3.1 react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1) - '@rolldown/pluginutils@1.0.0-rc.2': {} + '@rolldown/pluginutils@1.0.0-rc.7': {} '@rollup/rollup-android-arm-eabi@4.59.0': optional: true @@ -4138,55 +4152,63 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@swc/core-darwin-arm64@1.15.13': + '@swc/core-darwin-arm64@1.15.24': optional: true - '@swc/core-darwin-x64@1.15.13': + '@swc/core-darwin-x64@1.15.24': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.13': + '@swc/core-linux-arm-gnueabihf@1.15.24': optional: true - '@swc/core-linux-arm64-gnu@1.15.13': + '@swc/core-linux-arm64-gnu@1.15.24': optional: true - '@swc/core-linux-arm64-musl@1.15.13': + '@swc/core-linux-arm64-musl@1.15.24': optional: true - '@swc/core-linux-x64-gnu@1.15.13': + '@swc/core-linux-ppc64-gnu@1.15.24': optional: true - '@swc/core-linux-x64-musl@1.15.13': + '@swc/core-linux-s390x-gnu@1.15.24': optional: true - '@swc/core-win32-arm64-msvc@1.15.13': + '@swc/core-linux-x64-gnu@1.15.24': optional: true - '@swc/core-win32-ia32-msvc@1.15.13': + '@swc/core-linux-x64-musl@1.15.24': optional: true - '@swc/core-win32-x64-msvc@1.15.13': + '@swc/core-win32-arm64-msvc@1.15.24': optional: true - '@swc/core@1.15.13': + '@swc/core-win32-ia32-msvc@1.15.24': + optional: true + + '@swc/core-win32-x64-msvc@1.15.24': + optional: true + + '@swc/core@1.15.24': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.25 + '@swc/types': 0.1.26 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.13 - '@swc/core-darwin-x64': 1.15.13 - '@swc/core-linux-arm-gnueabihf': 1.15.13 - '@swc/core-linux-arm64-gnu': 1.15.13 - '@swc/core-linux-arm64-musl': 1.15.13 - '@swc/core-linux-x64-gnu': 1.15.13 - '@swc/core-linux-x64-musl': 1.15.13 - '@swc/core-win32-arm64-msvc': 1.15.13 - '@swc/core-win32-ia32-msvc': 1.15.13 - '@swc/core-win32-x64-msvc': 1.15.13 + '@swc/core-darwin-arm64': 1.15.24 + '@swc/core-darwin-x64': 1.15.24 + '@swc/core-linux-arm-gnueabihf': 1.15.24 + '@swc/core-linux-arm64-gnu': 1.15.24 + '@swc/core-linux-arm64-musl': 1.15.24 + '@swc/core-linux-ppc64-gnu': 1.15.24 + '@swc/core-linux-s390x-gnu': 1.15.24 + '@swc/core-linux-x64-gnu': 1.15.24 + '@swc/core-linux-x64-musl': 1.15.24 + '@swc/core-win32-arm64-msvc': 1.15.24 + '@swc/core-win32-ia32-msvc': 1.15.24 + '@swc/core-win32-x64-msvc': 1.15.24 '@swc/counter@0.1.3': {} - '@swc/types@0.1.25': + '@swc/types@0.1.26': dependencies: '@swc/counter': 0.1.3 @@ -4500,10 +4522,10 @@ snapshots: '@uppercod/css-to-object@1.1.1': {} - '@vitejs/plugin-react-swc@4.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': + '@vitejs/plugin-react-swc@4.3.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': dependencies: - '@rolldown/pluginutils': 1.0.0-rc.2 - '@swc/core': 1.15.13 + '@rolldown/pluginutils': 1.0.0-rc.7 + '@swc/core': 1.15.24 vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) transitivePeerDependencies: - '@swc/helpers' From c63bf09478ea4546b771382fbacc9e86a1940cde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 19:05:45 +0200 Subject: [PATCH 24/57] build(deps-dev): Bump @types/node from 24.12.0 to 24.12.2 (#148) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.12.0 to 24.12.2.
Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 73de36cb..4592568e 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "@eslint/compat": "2.0.5", "@eslint/js": "10.0.1", "@playwright/test": "1.59.1", - "@types/node": "24.12.0", + "@types/node": "24.12.2", "@vitest/coverage-v8": "catalog:default", "eslint": "10.1.0", "eslint-import-resolver-typescript": "4.4.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4a998b8..de78e939 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,11 +30,11 @@ importers: specifier: 1.59.1 version: 1.59.1 '@types/node': - specifier: 24.12.0 - version: 24.12.0 + specifier: 24.12.2 + version: 24.12.2 '@vitest/coverage-v8': specifier: catalog:default - version: 4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))) + version: 4.1.2(vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))) eslint: specifier: 10.1.0 version: 10.1.0(jiti@2.6.1) @@ -79,7 +79,7 @@ importers: version: 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: catalog:default - version: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) apps/backend: dependencies: @@ -1294,8 +1294,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@24.12.0': - resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==} + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} '@types/node@25.5.0': resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} @@ -4338,7 +4338,7 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@24.12.0': + '@types/node@24.12.2': dependencies: undici-types: 7.16.0 @@ -4365,7 +4365,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.12.0 + '@types/node': 24.12.2 optional: true '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': @@ -4530,7 +4530,7 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' - '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)))': + '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.2 @@ -4542,7 +4542,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + vitest: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) '@vitest/expect@4.1.2': dependencies: @@ -4553,13 +4553,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': dependencies: @@ -5439,7 +5439,7 @@ snapshots: happy-dom@20.6.1: dependencies: - '@types/node': 24.12.0 + '@types/node': 24.12.2 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 entities: 6.0.1 @@ -6757,7 +6757,7 @@ snapshots: vary@1.1.2: {} - vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3): + vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.4) @@ -6766,7 +6766,7 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.12.0 + '@types/node': 24.12.2 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.32.0 @@ -6789,10 +6789,10 @@ snapshots: terser: 5.44.1 yaml: 2.8.3 - vitest@4.1.2(@types/node@24.12.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)): + vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.2 '@vitest/runner': 4.1.2 '@vitest/snapshot': 4.1.2 @@ -6809,10 +6809,10 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.12.0 + '@types/node': 24.12.2 happy-dom: 20.6.1 jsdom: 29.0.2 transitivePeerDependencies: From ae341596f35642ff7826302d498f1498ed051c0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 19:10:19 +0200 Subject: [PATCH 25/57] build(deps): Bump pg from 8.18.0 to 8.20.0 (#150) Bumps [pg](https://github.com/brianc/node-postgres/tree/HEAD/packages/pg) from 8.18.0 to 8.20.0.
Changelog

Sourced from pg's changelog.

pg@8.20.0

  • Add onConnect callback to pg.Pool constructor options allowing for async initialization of newly created & connected pooled clients.

pg@8.19.0

Commits
  • c9070cc Publish
  • ad36e3c fix: typo in deprecation notice for client.query() (#3618)
  • f2d7d11 Publish
  • 5a4bafc Deprecate Client's internal query queue (#3603)
  • a215bfb Typo fix in PgPass deprecation (funciton) (#3605)
  • 01e0556 fix(pg-query-stream): invoke this.callback on cursor end/error (#2810)
  • e6e3692 Pass connection parameters to password callback (#3602)
  • d80d883 test: Fix TLS connection test ending too early
  • f332f28 fix: Connection timeout handling for native clients in connected state (#3512)
  • b2e9cb1 Remove testAsync - its redundant (#3588)
  • Additional commits viewable in compare view

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/backend/package.json | 2 +- pnpm-lock.yaml | 36 ++++++++++++++++++------------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/apps/backend/package.json b/apps/backend/package.json index c53cec61..5ec51ad7 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -24,6 +24,6 @@ "dependencies": { "axios": "^1.13.5", "@stats-organization/github-readme-stats-core": "workspace:^", - "pg": "^8.18.0" + "pg": "^8.20.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index de78e939..2f54f06c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -90,8 +90,8 @@ importers: specifier: ^1.13.5 version: 1.13.5 pg: - specifier: ^8.18.0 - version: 8.18.0 + specifier: ^8.20.0 + version: 8.20.0 devDependencies: axios-mock-adapter: specifier: 2.1.0 @@ -2793,27 +2793,27 @@ packages: pg-cloudflare@1.3.0: resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} - pg-connection-string@2.11.0: - resolution: {integrity: sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==} + pg-connection-string@2.12.0: + resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-pool@3.11.0: - resolution: {integrity: sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==} + pg-pool@3.13.0: + resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==} peerDependencies: pg: '>=8.0' - pg-protocol@1.11.0: - resolution: {integrity: sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==} + pg-protocol@1.13.0: + resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.18.0: - resolution: {integrity: sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==} + pg@8.20.0: + resolution: {integrity: sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==} engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -6078,15 +6078,15 @@ snapshots: pg-cloudflare@1.3.0: optional: true - pg-connection-string@2.11.0: {} + pg-connection-string@2.12.0: {} pg-int8@1.0.1: {} - pg-pool@3.11.0(pg@8.18.0): + pg-pool@3.13.0(pg@8.20.0): dependencies: - pg: 8.18.0 + pg: 8.20.0 - pg-protocol@1.11.0: {} + pg-protocol@1.13.0: {} pg-types@2.2.0: dependencies: @@ -6096,11 +6096,11 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.18.0: + pg@8.20.0: dependencies: - pg-connection-string: 2.11.0 - pg-pool: 3.11.0(pg@8.18.0) - pg-protocol: 1.11.0 + pg-connection-string: 2.12.0 + pg-pool: 3.13.0(pg@8.20.0) + pg-protocol: 1.13.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: From 9dcfce415dee63e560648ee266df17aec339d3e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 19:12:46 +0200 Subject: [PATCH 26/57] build(deps-dev): Bump eslint from 10.1.0 to 10.2.0 (#151) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [eslint](https://github.com/eslint/eslint) from 10.1.0 to 10.2.0.
Release notes

Sourced from eslint's releases.

v10.2.0

Features

  • 586ec2f feat: Add meta.languages support to rules (#20571) (Copilot)
  • 14207de feat: add Temporal to no-obj-calls (#20675) (Pixel998)
  • bbb2c93 feat: add Temporal to ES2026 globals (#20672) (Pixel998)

Bug Fixes

  • 542cb3e fix: update first-party dependencies (#20714) (Francesco Trotta)

Documentation

  • a2af743 docs: add language to configuration objects (#20712) (Francesco Trotta)
  • 845f23f docs: Update README (GitHub Actions Bot)
  • 5fbcf59 docs: remove sourceType from ts playground link (#20477) (Tanuj Kanti)
  • 8702a47 docs: Update README (GitHub Actions Bot)
  • ddeaded docs: Update README (GitHub Actions Bot)
  • 2b44966 docs: add Major Releases section to Manage Releases (#20269) (Milos Djermanovic)
  • eab65c7 docs: update eslint versions in examples (#20664) (루밀LuMir)
  • 3e4a299 docs: update ESM Dependencies policies with note for own-usage packages (#20660) (Milos Djermanovic)

Chores

  • 8120e30 refactor: extract no unmodified loop condition (#20679) (kuldeep kumar)
  • 46e8469 chore: update dependency markdownlint-cli2 to ^0.22.0 (#20697) (renovate[bot])
  • 01ed3aa test: add unit tests for unicode utilities (#20622) (Manish chaudhary)
  • 811f493 ci: remove --legacy-peer-deps from types integration tests (#20667) (Milos Djermanovic)
  • 6b86fcf chore: update dependency npm-run-all2 to v8 (#20663) (renovate[bot])
  • 632c4f8 chore: add prettier update commit to .git-blame-ignore-revs (#20662) (루밀LuMir)
  • b0b0f21 chore: update dependency eslint-plugin-regexp to ^3.1.0 (#20659) (Milos Djermanovic)
  • 228a2dd chore: update dependency eslint-plugin-eslint-plugin to ^7.3.2 (#20661) (Milos Djermanovic)
  • 3ab4d7e test: Add tests for eslintrc-style keys (#20645) (kuldeep kumar)
Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 150 +++++++++++++++++++++++-------------------------- 2 files changed, 72 insertions(+), 80 deletions(-) diff --git a/package.json b/package.json index 4592568e..c9b2613b 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "@playwright/test": "1.59.1", "@types/node": "24.12.2", "@vitest/coverage-v8": "catalog:default", - "eslint": "10.1.0", + "eslint": "10.2.0", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.2", "eslint-plugin-jsdoc": "62.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f54f06c..681ac1c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,10 +22,10 @@ importers: devDependencies: '@eslint/compat': specifier: 2.0.5 - version: 2.0.5(eslint@10.1.0(jiti@2.6.1)) + version: 2.0.5(eslint@10.2.0(jiti@2.6.1)) '@eslint/js': specifier: 10.0.1 - version: 10.0.1(eslint@10.1.0(jiti@2.6.1)) + version: 10.0.1(eslint@10.2.0(jiti@2.6.1)) '@playwright/test': specifier: 1.59.1 version: 1.59.1 @@ -36,23 +36,23 @@ importers: specifier: catalog:default version: 4.1.2(vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))) eslint: - specifier: 10.1.0 - version: 10.1.0(jiti@2.6.1) + specifier: 10.2.0 + version: 10.2.0(jiti@2.6.1) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-import-x: specifier: 4.16.2 - version: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) + version: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-jsdoc: specifier: 62.9.0 - version: 62.9.0(eslint@10.1.0(jiti@2.6.1)) + version: 62.9.0(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@10.1.0(jiti@2.6.1)) + version: 7.37.5(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: 7.0.1 - version: 7.0.1(eslint@10.1.0(jiti@2.6.1)) + version: 7.0.1(eslint@10.2.0(jiti@2.6.1)) globals: specifier: 17.5.0 version: 17.5.0 @@ -76,7 +76,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: 8.58.1 - version: 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: catalog:default version: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) @@ -542,16 +542,12 @@ packages: eslint: optional: true - '@eslint/config-array@0.23.3': - resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.5.3': - resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/core@1.1.1': - resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': @@ -567,12 +563,12 @@ packages: eslint: optional: true - '@eslint/object-schema@3.0.3': - resolution: {integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.6.1': - resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@exodus/bytes@1.15.0': @@ -1663,8 +1659,8 @@ packages: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} - brace-expansion@1.1.13: - resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} @@ -1990,8 +1986,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.1.0: - resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} + eslint@10.2.0: + resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -3811,46 +3807,42 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0(jiti@2.6.1))': dependencies: - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.0.5(eslint@10.1.0(jiti@2.6.1))': + '@eslint/compat@2.0.5(eslint@10.2.0(jiti@2.6.1))': dependencies: '@eslint/core': 1.2.1 optionalDependencies: - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) - '@eslint/config-array@0.23.3': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 3.0.3 + '@eslint/object-schema': 3.0.5 debug: 4.4.3 minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.3': + '@eslint/config-helpers@0.5.5': dependencies: '@eslint/core': 1.2.1 - '@eslint/core@1.1.1': - dependencies: - '@types/json-schema': 7.0.15 - '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.1.0(jiti@2.6.1))': + '@eslint/js@10.0.1(eslint@10.2.0(jiti@2.6.1))': optionalDependencies: - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) - '@eslint/object-schema@3.0.3': {} + '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.6.1': + '@eslint/plugin-kit@0.7.1': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 @@ -4368,15 +4360,15 @@ snapshots: '@types/node': 24.12.2 optional: true - '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/type-utils': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.58.1 - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -4384,14 +4376,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.58.1 '@typescript-eslint/types': 8.58.1 '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.58.1 debug: 4.4.3 - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4414,13 +4406,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.58.1 '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -4445,13 +4437,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.58.1 '@typescript-eslint/types': 8.58.1 '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4753,7 +4745,7 @@ snapshots: transitivePeerDependencies: - supports-color - brace-expansion@1.1.13: + brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -5087,10 +5079,10 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)))(eslint@10.1.0(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)): dependencies: debug: 4.4.3 - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.13.7 is-bun-module: 2.0.0 @@ -5098,17 +5090,17 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)): + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1)): dependencies: '@package-json/types': 0.0.12 '@typescript-eslint/types': 8.58.0 comment-parser: 1.4.6 debug: 4.4.3 - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.2.5 @@ -5116,11 +5108,11 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - supports-color - eslint-plugin-jsdoc@62.9.0(eslint@10.1.0(jiti@2.6.1)): + eslint-plugin-jsdoc@62.9.0(eslint@10.2.0(jiti@2.6.1)): dependencies: '@es-joy/jsdoccomment': 0.86.0 '@es-joy/resolve.exports': 1.2.0 @@ -5128,7 +5120,7 @@ snapshots: comment-parser: 1.4.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) espree: 11.2.0 esquery: 1.7.0 html-entities: 2.6.0 @@ -5140,18 +5132,18 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@7.0.1(eslint@10.1.0(jiti@2.6.1)): + eslint-plugin-react-hooks@7.0.1(eslint@10.2.0(jiti@2.6.1)): dependencies: '@babel/core': 7.29.0 '@babel/parser': 7.29.2 - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@10.1.0(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@10.2.0(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -5159,7 +5151,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.3.1 - eslint: 10.1.0(jiti@2.6.1) + eslint: 10.2.0(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5184,14 +5176,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.1.0(jiti@2.6.1): + eslint@10.2.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.3 - '@eslint/config-helpers': 0.5.3 - '@eslint/core': 1.1.1 - '@eslint/plugin-kit': 0.6.1 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -5899,7 +5891,7 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.13 + brace-expansion: 1.1.14 minimist@1.2.8: {} @@ -6684,13 +6676,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.1.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.2.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color From 4c2628fa674f590b0037742836c1e94b9c2e9859 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 19:18:24 +0200 Subject: [PATCH 27/57] build(deps): Bump axios from 1.13.5 to 1.15.0 (#153) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [axios](https://github.com/axios/axios) from 1.13.5 to 1.15.0.
Release notes

Sourced from axios's releases.

v1.15.0

This release delivers two critical security patches, adds runtime support for Deno and Bun, and includes significant CI hardening, documentation improvements, and routine dependency updates.

⚠️ Important Changes

  • Deprecation: url.parse() usage has been replaced to address Node.js deprecation warnings. If you are on a recent version of Node.js, this resolves console warnings you may have been seeing. (#10625)

🔒 Security Fixes

  • Proxy Handling: Fixed a no_proxy hostname normalisation bypass that could lead to Server-Side Request Forgery (SSRF). (#10661)
  • Header Injection: Fixed an unrestricted cloud metadata exfiltration vulnerability via a header injection chain. (#10660)

🚀 New Features

  • Runtime Support: Added compatibility checks and documentation for Deno and Bun environments. (#10652, #10653)

🔧 Maintenance & Chores

  • CI Security: Hardened workflow permissions to least privilege, added the zizmor security scanner, pinned action versions, and gated npm publishing with OIDC and environment protection. (#10618, #10619, #10627, #10637, #10666)
  • Dependencies: Bumped serialize-javascript, handlebars, picomatch, vite, and denoland/setup-deno to latest versions. Added a 7-day Dependabot cooldown period. (#10574, #10572, #10568, #10663, #10664, #10665, #10669, #10670, #10616)
  • Documentation: Unified docs, improved beforeRedirect credential leakage example, clarified withCredentials/withXSRFToken behaviour, HTTP/2 support notes, async/await timeout error handling, header case preservation, and various typo fixes. (#10649, #10624, #7452, #7471, #10654, #10644, #10589)
  • Housekeeping: Removed stale files, regenerated lockfile, and updated sponsor scripts and blocks. (#10584, #10650, #10582, #10640, #10659, #10668)
  • Tests: Added regression coverage for urlencoded Content-Type casing. (#10573)

🌟 New Contributors

We are thrilled to welcome our new contributors. Thank you for helping improve Axios:

v1.14.0

This release focuses on compatibility fixes, adapter stability improvements, and test/tooling modernisation.

⚠️ Important Changes

  • Breaking Changes: None identified in this release.
  • Action Required: If you rely on env-based proxy behaviour or CJS resolution edge-cases, validate your integration after upgrade (notably proxy-from-env v2 alignment and main entry compatibility fix).

🚀 New Features

  • Runtime Features: No new end-user features were introduced in this release.
  • Test Coverage Expansion: Added broader smoke/module test coverage for CJS and ESM package usage. (#7510)

🐛 Bug Fixes

  • Headers: Trim trailing CRLF in normalised header values. (#7456)
  • HTTP/2: Close detached HTTP/2 sessions on timeout to avoid lingering sessions. (#7457)
  • Fetch Adapter: Cancel ReadableStream created during request-stream capability probing to prevent async resource leaks. (#7515)
  • Proxy Handling: Fixed env proxy behavior with proxy-from-env v2 usage. (#7499)

... (truncated)

Changelog

Sourced from axios's changelog.

v1.15.0 — April 7, 2026

This release delivers two critical security patches targeting header injection and SSRF via proxy bypass, adds official runtime support for Deno and Bun, and includes significant CI security hardening.

🔒 Security Fixes

  • Header Injection (CRLF): Rejects any header value containing \r or \n characters to block CRLF injection chains that could be used to exfiltrate cloud metadata (IMDS). Behavior change: headers with CR/LF now throw "Invalid character in header content". (#10660)

  • SSRF via no_proxy Bypass: Introduces a shouldBypassProxy helper that normalises hostnames (strips trailing dots, handles bracketed IPv6) before evaluating no_proxy/NO_PROXY rules, closing a gap that could cause loopback or internal hosts to be inadvertently proxied. (#10661)

🚀 New Features

  • Deno & Bun Runtime Support: Added full smoke test suites for Deno and Bun, with CI workflows that run both runtimes before any release is cut. (#10652)

🐛 Bug Fixes

  • Node.js v22 Compatibility: Replaced deprecated url.parse() calls with the WHATWG URL/URLSearchParams API across examples, sandbox, and tests, eliminating DEP0169 deprecation warnings on Node.js v22+. (#10625)

🔧 Maintenance & Chores

  • CI Security Hardening: Added zizmor GitHub Actions security scanner; switched npm publish to OIDC Trusted Publishing (removing the long-lived NODE_AUTH_TOKEN); pinned all action references to full commit SHAs; narrowed workflow permissions to least privilege; gated the publish step behind a dedicated npm-publish environment; and blocked the sponsor-block workflow from running on forks. (#10618, #10619, #10627, #10637, #10641, #10666)

  • Docs: Clarified HTTP/2 support and the unsupported httpVersion option; added documentation for header case preservation; improved the beforeRedirect example to prevent accidental credential leakage. (#10644, #10654, #10624)

  • Dependencies: Bumped picomatch, handlebars, serialize-javascript, vite (×3), denoland/setup-deno, and 4 additional dev dependencies to latest versions. (#10564, #10565, #10567, #10568, #10572, #10574, #10663, #10664, #10665, #10669, #10670)

🌟 New Contributors

We are thrilled to welcome our new contributors. Thank you for helping improve axios:

Full Changelog


v1.14.0 — March 27, 2026

This release fixes a security vulnerability in the formidable dependency, resolves a CommonJS compatibility regression, hardens proxy and HTTP/2 handling, and modernises the build and test toolchain.

🔒 Security Fixes

  • Formidable Vulnerability: Upgraded formidable from v2 to v3 to address a reported arbitrary-file vulnerability. Updated test server and assertions to align with the v3 API. (#7533)

🐛 Bug Fixes

... (truncated)

Commits
  • 772a4e5 chore(release): prepare release 1.15.0 (#10671)
  • 4b07137 chore(deps-dev): bump vite from 8.0.0 to 8.0.5 in /tests/smoke/esm (#10663)
  • 51e57b3 chore(deps-dev): bump vite from 8.0.2 to 8.0.5 (#10664)
  • fba1a77 chore(deps-dev): bump vite from 8.0.2 to 8.0.5 in /tests/module/esm (#10665)
  • 0bf6e28 chore(deps): bump denoland/setup-deno in the github-actions group (#10669)
  • 8107157 chore(deps-dev): bump the development_dependencies group with 4 updates (#10670)
  • e66530e ci: require npm-publish environment for releases (#10666)
  • 49f23cb chore(sponsor): update sponsor block (#10668)
  • 3631854 fix: unrestricted cloud metadata exfiltration via header injection chain (#10...
  • fb3befb fix: no_proxy hostname normalization bypass leads to ssrf (#10661)
  • Additional commits viewable in compare view
Install script changes

This version modifies prepare script that runs during installation. Review the package contents before updating.


Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/backend/package.json | 2 +- packages/core/package.json | 2 +- pnpm-lock.yaml | 47 +++++++++++++++++++------------------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/apps/backend/package.json b/apps/backend/package.json index 5ec51ad7..ae3a05a2 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -22,7 +22,7 @@ "vitest": "catalog:default" }, "dependencies": { - "axios": "^1.13.5", + "axios": "^1.15.0", "@stats-organization/github-readme-stats-core": "workspace:^", "pg": "^8.20.0" } diff --git a/packages/core/package.json b/packages/core/package.json index 2cdf34a6..70896923 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -86,7 +86,7 @@ "vitest": "catalog:default" }, "dependencies": { - "axios": "^1.13.5", + "axios": "^1.15.0", "emoji-name-map": "^2.0.3", "github-username-regex": "^1.0.0", "word-wrap": "^1.2.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 681ac1c0..ce4bcc00 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,15 +87,15 @@ importers: specifier: workspace:^ version: link:../../packages/core axios: - specifier: ^1.13.5 - version: 1.13.5 + specifier: ^1.15.0 + version: 1.15.0 pg: specifier: ^8.20.0 version: 8.20.0 devDependencies: axios-mock-adapter: specifier: 2.1.0 - version: 2.1.0(axios@1.13.5) + version: 2.1.0(axios@1.15.0) express: specifier: 5.2.1 version: 5.2.1 @@ -122,10 +122,10 @@ importers: version: 4.2.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) axios: specifier: ^1 - version: 1.13.5 + version: 1.15.0 axios-cache-interceptor: specifier: ^1 - version: 1.12.0(axios@1.13.5) + version: 1.12.0(axios@1.15.0) daisyui: specifier: ^5.5.19 version: 5.5.19 @@ -185,8 +185,8 @@ importers: packages/core: dependencies: axios: - specifier: ^1.13.5 - version: 1.13.5 + specifier: ^1.15.0 + version: 1.15.0 emoji-name-map: specifier: ^2.0.3 version: 2.0.3 @@ -208,7 +208,7 @@ importers: version: 1.1.1 axios-mock-adapter: specifier: 2.1.0 - version: 2.1.0(axios@1.13.5) + version: 2.1.0(axios@1.15.0) js-yaml: specifier: 4.1.1 version: 4.1.1 @@ -1637,8 +1637,8 @@ packages: peerDependencies: axios: '>= 0.17.0' - axios@1.13.5: - resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + axios@1.15.0: + resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2088,8 +2088,8 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -2885,8 +2885,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -4698,26 +4699,26 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios-cache-interceptor@1.12.0(axios@1.13.5): + axios-cache-interceptor@1.12.0(axios@1.15.0): dependencies: - axios: 1.13.5 + axios: 1.15.0 cache-parser: 1.2.6 fast-defer: 1.1.9 http-vary: 1.0.3 object-code: 2.0.0 try: 1.0.3 - axios-mock-adapter@2.1.0(axios@1.13.5): + axios-mock-adapter@2.1.0(axios@1.15.0): dependencies: - axios: 1.13.5 + axios: 1.15.0 fast-deep-equal: 3.1.3 is-buffer: 2.0.5 - axios@1.13.5: + axios@1.15.0: dependencies: - follow-redirects: 1.15.11 + follow-redirects: 1.16.0 form-data: 4.0.5 - proxy-from-env: 1.1.0 + proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -5333,7 +5334,7 @@ snapshots: flatted@3.4.2: {} - follow-redirects@1.15.11: {} + follow-redirects@1.16.0: {} for-each@0.3.5: dependencies: @@ -6155,7 +6156,7 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} punycode@2.3.1: {} From 30e2233ae4c778c87c6035291e839934d3ae2035 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:22:40 +0200 Subject: [PATCH 28/57] build(deps): Bump vite from 7.3.1 to 8.0.8 (#147) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.3.1 to 8.0.8.
Release notes

Sourced from vite's releases.

v8.0.8

Please refer to CHANGELOG.md for details.

v8.0.7

Please refer to CHANGELOG.md for details.

v8.0.6

Please refer to CHANGELOG.md for details.

v8.0.5

Please refer to CHANGELOG.md for details.

v8.0.4

Please refer to CHANGELOG.md for details.

create-vite@8.0.3

Please refer to CHANGELOG.md for details.

v8.0.3

Please refer to CHANGELOG.md for details.

create-vite@8.0.2

Please refer to CHANGELOG.md for details.

v8.0.2

Please refer to CHANGELOG.md for details.

create-vite@8.0.1

Please refer to CHANGELOG.md for details.

v8.0.1

Please refer to CHANGELOG.md for details.

plugin-legacy@8.0.1

Please refer to CHANGELOG.md for details.

create-vite@8.0.0

Please refer to CHANGELOG.md for details.

plugin-legacy@8.0.0

Please refer to CHANGELOG.md for details.

v8.0.0

Please refer to CHANGELOG.md for details.

v8.0.0-beta.18

Please refer to CHANGELOG.md for details.

v8.0.0-beta.17

Please refer to CHANGELOG.md for details.

... (truncated)

Changelog

Sourced from vite's changelog.

8.0.8 (2026-04-09)

Features

Bug Fixes

  • avoid dns.getDefaultResultOrder temporary (#22202) (15f1c15)
  • ssr: class property keys hoisting matching imports (#22199) (e137601)

8.0.7 (2026-04-07)

Bug Fixes

  • use sync dns.getDefaultResultOrder instead of dns.promises (#22185) (5c05b04)

8.0.6 (2026-04-07)

Features

Bug Fixes

Performance Improvements

  • early return in getLocalhostAddressIfDiffersFromDNS when DNS order is verbatim (#22151) (56ec256)

Miscellaneous Chores

8.0.5 (2026-04-06)

Bug Fixes

  • apply server.fs check to env transport (#22159) (f02d9fd)
  • avoid path traversal with optimize deps sourcemap handler (#22161) (79f002f)
  • check server.fs after stripping query as well (#22160) (a9a3df2)
  • disallow referencing files outside the package from sourcemap (#22158) (f05f501)

8.0.4 (2026-04-06)

Features

  • allow esbuild 0.28 as peer deps (#22155) (b0da973)
  • hmr: truncate list of files on hmr update (#21535) (d00e806)
  • optimizer: log when dependency scanning or bundling takes over 1s (#21797) (f61a1ab)

Bug Fixes

... (truncated)

Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 425 +++++++++++++++++++------------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 180 insertions(+), 247 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce4bcc00..ae1a6a93 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: 4.1.2 version: 4.1.2 vite: - specifier: 7.3.1 - version: 7.3.1 + specifier: 8.0.8 + version: 8.0.8 vitest: specifier: 4.1.2 version: 4.1.2 @@ -34,7 +34,7 @@ importers: version: 24.12.2 '@vitest/coverage-v8': specifier: catalog:default - version: 4.1.2(vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))) + version: 4.1.2(vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))) eslint: specifier: 10.2.0 version: 10.2.0(jiti@2.6.1) @@ -79,7 +79,7 @@ importers: version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: catalog:default - version: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) apps/backend: dependencies: @@ -104,7 +104,7 @@ importers: version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) apps/frontend: dependencies: @@ -119,7 +119,7 @@ importers: version: link:../../packages/core '@tailwindcss/vite': specifier: ^4.2.2 - version: 4.2.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.2.2(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) axios: specifier: ^1 version: 1.15.0 @@ -168,7 +168,7 @@ importers: version: 18.3.7(@types/react@18.3.27) '@vitejs/plugin-react-swc': specifier: 4.3.0 - version: 4.3.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.3.0(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -177,10 +177,10 @@ importers: version: 4.2.2 vite: specifier: catalog:default - version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) + version: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) packages/core: dependencies: @@ -217,7 +217,7 @@ importers: version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) packages: @@ -766,6 +766,9 @@ packages: '@oxc-project/types@0.121.0': resolution: {integrity: sha512-CGtOARQb9tyv7ECgdAlFxi0Fv7lmzvmlm2rpD/RdijOO9rfk/JvB1CjT8EnoD+tjna/IYgKKw3IV7objRb+aYw==} + '@oxc-project/types@0.124.0': + resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==} + '@oxc-resolver/binding-android-arm-eabi@11.19.1': resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} cpu: [arm] @@ -893,146 +896,106 @@ packages: react-redux: optional: true - '@rolldown/pluginutils@1.0.0-rc.7': - resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} - - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + '@rolldown/binding-android-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + '@rolldown/binding-darwin-x64@1.0.0-rc.15': + resolution: {integrity: sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + resolution: {integrity: sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + resolution: {integrity: sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} - cpu: [arm] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + resolution: {integrity: sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} - cpu: [ppc64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + resolution: {integrity: sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + resolution: {integrity: sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + resolution: {integrity: sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + resolution: {integrity: sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} - cpu: [x64] - os: [win32] + '@rolldown/pluginutils@1.0.0-rc.15': + resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==} + + '@rolldown/pluginutils@1.0.0-rc.7': + resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} '@sindresorhus/base62@1.0.0': resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} @@ -2845,8 +2808,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.9: + resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -3007,9 +2970,9 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rolldown@1.0.0-rc.15: + resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true router@2.2.0: @@ -3372,15 +3335,16 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@8.0.8: + resolution: {integrity: sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -3391,12 +3355,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -3979,6 +3945,8 @@ snapshots: '@oxc-project/types@0.121.0': {} + '@oxc-project/types@0.124.0': {} + '@oxc-resolver/binding-android-arm-eabi@11.19.1': optional: true @@ -4062,83 +4030,59 @@ snapshots: react: 18.3.1 react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1) + '@rolldown/binding-android-arm64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.15': {} + '@rolldown/pluginutils@1.0.0-rc.7': {} - '@rollup/rollup-android-arm-eabi@4.59.0': - optional: true - - '@rollup/rollup-android-arm64@4.59.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.59.0': - optional: true - - '@rollup/rollup-darwin-x64@4.59.0': - optional: true - - '@rollup/rollup-freebsd-arm64@4.59.0': - optional: true - - '@rollup/rollup-freebsd-x64@4.59.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.59.0': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.59.0': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.59.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.59.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.59.0': - optional: true - - '@rollup/rollup-openbsd-x64@4.59.0': - optional: true - - '@rollup/rollup-openharmony-arm64@4.59.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.59.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.59.0': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.59.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.59.0': - optional: true - '@sindresorhus/base62@1.0.0': {} '@standard-schema/spec@1.1.0': {} @@ -4266,12 +4210,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - '@tailwindcss/vite@4.2.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.2(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@tailwindcss/node': 4.2.2 '@tailwindcss/oxide': 4.2.2 tailwindcss: 4.2.2 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) + vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) '@testing-library/dom@10.4.1': dependencies: @@ -4515,15 +4459,15 @@ snapshots: '@uppercod/css-to-object@1.1.1': {} - '@vitejs/plugin-react-swc@4.3.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': + '@vitejs/plugin-react-swc@4.3.0(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 '@swc/core': 1.15.24 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) + vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) transitivePeerDependencies: - '@swc/helpers' - '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)))': + '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.2 @@ -4535,7 +4479,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + vitest: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) '@vitest/expect@4.1.2': dependencies: @@ -4546,21 +4490,21 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.2(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) + vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) - '@vitest/mocker@4.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.2(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) + vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) '@vitest/pretty-format@4.1.2': dependencies: @@ -5066,6 +5010,7 @@ snapshots: '@esbuild/win32-arm64': 0.27.3 '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 + optional: true escalade@3.2.0: {} @@ -6119,7 +6064,7 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.6: + postcss@8.5.9: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -6274,36 +6219,26 @@ snapshots: rfdc@1.4.1: {} - rollup@4.59.0: + rolldown@1.0.0-rc.15: dependencies: - '@types/estree': 1.0.8 + '@oxc-project/types': 0.124.0 + '@rolldown/pluginutils': 1.0.0-rc.15 optionalDependencies: - '@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 + '@rolldown/binding-android-arm64': 1.0.0-rc.15 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.15 + '@rolldown/binding-darwin-x64': 1.0.0-rc.15 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.15 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.15 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.15 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.15 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.15 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.15 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15 router@2.2.0: dependencies: @@ -6750,42 +6685,40 @@ snapshots: vary@1.1.2: {} - vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3): + vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3): dependencies: - esbuild: 0.27.3 - fdir: 6.5.0(picomatch@4.0.4) + lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.6 - rollup: 4.59.0 - tinyglobby: 0.2.15 + postcss: 8.5.9 + rolldown: 1.0.0-rc.15 + tinyglobby: 0.2.16 optionalDependencies: '@types/node': 24.12.2 + esbuild: 0.27.3 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.32.0 terser: 5.44.1 yaml: 2.8.3 - vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3): + vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3): dependencies: - esbuild: 0.27.3 - fdir: 6.5.0(picomatch@4.0.4) + lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.6 - rollup: 4.59.0 - tinyglobby: 0.2.15 + postcss: 8.5.9 + rolldown: 1.0.0-rc.15 + tinyglobby: 0.2.16 optionalDependencies: '@types/node': 25.5.0 + esbuild: 0.27.3 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.32.0 terser: 5.44.1 yaml: 2.8.3 - vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)): + vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.2(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.2 '@vitest/runner': 4.1.2 '@vitest/snapshot': 4.1.2 @@ -6802,7 +6735,7 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) + vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.12.2 @@ -6811,10 +6744,10 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)): + vitest@4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.2(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.2 '@vitest/runner': 4.1.2 '@vitest/snapshot': 4.1.2 @@ -6831,7 +6764,7 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.1)(yaml@2.8.3) + vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.5.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a01c6b71..b4a3d351 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,7 +4,7 @@ packages: catalog: "@vitest/coverage-v8": 4.1.2 - vite: 7.3.1 + vite: 8.0.8 vitest: 4.1.2 minimumReleaseAge: 10080 From d2a2274eebaa4dff3579ace681793c6eee7c26dc Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:53:34 +0200 Subject: [PATCH 29/57] build(deps-dev): Bump typescript from 5.9.3 to 6.0.2 (#165) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- packages/core/tsconfig.build.json | 1 + pnpm-lock.yaml | 94 +++++++++++++++---------------- 3 files changed, 49 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index c9b2613b..c47ce2bc 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "lint-staged": "16.4.0", "prettier": "3.8.2", "turbo": "2.9.6", - "typescript": "5.9.3", + "typescript": "6.0.2", "typescript-eslint": "8.58.1", "vitest": "catalog:default" }, diff --git a/packages/core/tsconfig.build.json b/packages/core/tsconfig.build.json index e58f87a7..0167680b 100644 --- a/packages/core/tsconfig.build.json +++ b/packages/core/tsconfig.build.json @@ -2,6 +2,7 @@ "extends": ["./tsconfig.json"], "include": ["src"], "compilerOptions": { + "rootDir": "./src", "declaration": true, "declarationMap": true, "customConditions": [] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae1a6a93..d5332ac9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,10 +40,10 @@ importers: version: 10.2.0(jiti@2.6.1) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-import-x: specifier: 4.16.2 - version: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1)) + version: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-jsdoc: specifier: 62.9.0 version: 62.9.0(eslint@10.2.0(jiti@2.6.1)) @@ -72,11 +72,11 @@ importers: specifier: 2.9.6 version: 2.9.6 typescript: - specifier: 5.9.3 - version: 5.9.3 + specifier: 6.0.2 + version: 6.0.2 typescript-eslint: specifier: 8.58.1 - version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) vitest: specifier: catalog:default version: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) @@ -3283,8 +3283,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.2: + resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} engines: {node: '>=14.17'} hasBin: true @@ -4305,40 +4305,40 @@ snapshots: '@types/node': 24.12.2 optional: true - '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/type-utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/visitor-keys': 8.58.1 eslint: 10.2.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@typescript-eslint/scope-manager': 8.58.1 '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) '@typescript-eslint/visitor-keys': 8.58.1 debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.58.1(typescript@6.0.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.2) '@typescript-eslint/types': 8.58.1 debug: 4.4.3 - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color @@ -4347,19 +4347,19 @@ snapshots: '@typescript-eslint/types': 8.58.1 '@typescript-eslint/visitor-keys': 8.58.1 - '@typescript-eslint/tsconfig-utils@8.58.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.58.1(typescript@6.0.2)': dependencies: - typescript: 5.9.3 + typescript: 6.0.2 - '@typescript-eslint/type-utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color @@ -4367,29 +4367,29 @@ snapshots: '@typescript-eslint/types@8.58.1': {} - '@typescript-eslint/typescript-estree@8.58.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.58.1(typescript@6.0.2)': dependencies: - '@typescript-eslint/project-service': 8.58.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3) + '@typescript-eslint/project-service': 8.58.1(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.2) '@typescript-eslint/types': 8.58.1 '@typescript-eslint/visitor-keys': 8.58.1 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.58.1 '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) eslint: 10.2.0(jiti@2.6.1) - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color @@ -5025,7 +5025,7 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)): dependencies: debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) @@ -5036,11 +5036,11 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1)): + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)): dependencies: '@package-json/types': 0.0.12 '@typescript-eslint/types': 8.58.0 @@ -5054,7 +5054,7 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) transitivePeerDependencies: - supports-color @@ -6553,9 +6553,9 @@ snapshots: try@1.0.3: {} - ts-api-utils@2.5.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@6.0.2): dependencies: - typescript: 5.9.3 + typescript: 6.0.2 tslib@2.8.1: optional: true @@ -6612,18 +6612,18 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) eslint: 10.2.0(jiti@2.6.1) - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - typescript@5.9.3: {} + typescript@6.0.2: {} unbash@2.2.0: {} From 4cabac4bc1b3b9fce80ba88d2d79e4d9beb34064 Mon Sep 17 00:00:00 2001 From: martin-mfg <2026226+martin-mfg@users.noreply.github.com> Date: Tue, 21 Apr 2026 09:09:30 +0200 Subject: [PATCH 30/57] upgrade react to v19 --- apps/frontend/package.json | 8 +-- pnpm-lock.yaml | 117 +++++++++++++++++-------------------- 2 files changed, 57 insertions(+), 68 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 39304c01..4de6d8ff 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -20,8 +20,8 @@ "daisyui": "^5.5.19", "@stats-organization/github-readme-stats-backend": "workspace:^", "@stats-organization/github-readme-stats-core": "workspace:^", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "react": "^19.2.5", + "react-dom": "^19.2.5", "react-icons": "^5.6.0", "react-loading-skeleton": "^3.3.1", "react-redux": "^9.2.0", @@ -32,8 +32,8 @@ "uuid": "^13.0.0" }, "devDependencies": { - "@types/react": "18.3.27", - "@types/react-dom": "18.3.7", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", "@vitejs/plugin-react-swc": "4.3.0", "clsx": "2.1.1", "tailwindcss": "4.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5332ac9..6bae7d50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,7 +110,7 @@ importers: dependencies: '@reduxjs/toolkit': specifier: ^2.11.2 - version: 2.11.2(react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1))(react@18.3.1) + version: 2.11.2(react-redux@9.2.0(@types/react@19.2.14)(react@19.2.5)(redux@5.0.1))(react@19.2.5) '@stats-organization/github-readme-stats-backend': specifier: workspace:^ version: link:../backend @@ -130,26 +130,26 @@ importers: specifier: ^5.5.19 version: 5.5.19 react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: ^19.2.5 + version: 19.2.5 react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: ^19.2.5 + version: 19.2.5(react@19.2.5) react-icons: specifier: ^5.6.0 - version: 5.6.0(react@18.3.1) + version: 5.6.0(react@19.2.5) react-loading-skeleton: specifier: ^3.3.1 - version: 3.5.0(react@18.3.1) + version: 3.5.0(react@19.2.5) react-redux: specifier: ^9.2.0 - version: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1) + version: 9.2.0(@types/react@19.2.14)(react@19.2.5)(redux@5.0.1) react-spinners: specifier: ^0.17.0 - version: 0.17.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.17.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react-toastify: specifier: ^11.0.5 - version: 11.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5) redux: specifier: ^5.0.1 version: 5.0.1 @@ -161,11 +161,11 @@ importers: version: 13.0.0 devDependencies: '@types/react': - specifier: 18.3.27 - version: 18.3.27 + specifier: 19.2.14 + version: 19.2.14 '@types/react-dom': - specifier: 18.3.7 - version: 18.3.7(@types/react@18.3.27) + specifier: 19.2.3 + version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react-swc': specifier: 4.3.0 version: 4.3.0(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) @@ -1259,16 +1259,13 @@ packages: '@types/node@25.5.0': resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: - '@types/react': ^18.0.0 + '@types/react': ^19.2.0 - '@types/react@18.3.27': - resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==} + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} @@ -2871,10 +2868,10 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@19.2.5: + resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} peerDependencies: - react: ^18.3.1 + react: ^19.2.5 react-icons@5.6.0: resolution: {integrity: sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==} @@ -2916,8 +2913,8 @@ packages: react: ^18 || ^19 react-dom: ^18 || ^19 - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.2.5: + resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} engines: {node: '>=0.10.0'} redent@3.0.0: @@ -3004,8 +3001,8 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -4018,7 +4015,7 @@ snapshots: dependencies: playwright: 1.59.1 - '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': + '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@19.2.14)(react@19.2.5)(redux@5.0.1))(react@19.2.5)': dependencies: '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 @@ -4027,8 +4024,8 @@ snapshots: redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.1.1 optionalDependencies: - react: 18.3.1 - react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1) + react: 19.2.5 + react-redux: 9.2.0(@types/react@19.2.14)(react@19.2.5)(redux@5.0.1) '@rolldown/binding-android-arm64@1.0.0-rc.15': optional: true @@ -4284,15 +4281,12 @@ snapshots: undici-types: 7.18.2 optional: true - '@types/prop-types@15.7.15': {} - - '@types/react-dom@18.3.7(@types/react@18.3.27)': + '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: - '@types/react': 18.3.27 + '@types/react': 19.2.14 - '@types/react@18.3.27': + '@types/react@19.2.14': dependencies: - '@types/prop-types': 15.7.15 csstype: 3.2.3 '@types/use-sync-external-store@0.0.6': {} @@ -6120,47 +6114,44 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - react-dom@18.3.1(react@18.3.1): + react-dom@19.2.5(react@19.2.5): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 19.2.5 + scheduler: 0.27.0 - react-icons@5.6.0(react@18.3.1): + react-icons@5.6.0(react@19.2.5): dependencies: - react: 18.3.1 + react: 19.2.5 react-is@16.13.1: {} react-is@17.0.2: {} - react-loading-skeleton@3.5.0(react@18.3.1): + react-loading-skeleton@3.5.0(react@19.2.5): dependencies: - react: 18.3.1 + react: 19.2.5 - react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1): + react-redux@9.2.0(@types/react@19.2.14)(react@19.2.5)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 - react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) + react: 19.2.5 + use-sync-external-store: 1.6.0(react@19.2.5) optionalDependencies: - '@types/react': 18.3.27 + '@types/react': 19.2.14 redux: 5.0.1 - react-spinners@0.17.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-spinners@0.17.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) - react-toastify@11.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-toastify@11.0.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: clsx: 2.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) - react@18.3.1: - dependencies: - loose-envify: 1.4.0 + react@19.2.5: {} redent@3.0.0: dependencies: @@ -6281,9 +6272,7 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.27.0: {} semver@6.3.1: {} @@ -6677,9 +6666,9 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.6.0(react@18.3.1): + use-sync-external-store@1.6.0(react@19.2.5): dependencies: - react: 18.3.1 + react: 19.2.5 uuid@13.0.0: {} From b474572598d7158e7aef722e723e56a9f3e1f426 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Tue, 21 Apr 2026 14:11:24 +0200 Subject: [PATCH 31/57] remove node 22 (#170) --- apps/backend/.devcontainer/devcontainer.json | 2 +- .../_dot_vercel_copy/output/functions/api.func/.vc-config.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/backend/.devcontainer/devcontainer.json b/apps/backend/.devcontainer/devcontainer.json index 7e8a6f89..8a65cd7f 100644 --- a/apps/backend/.devcontainer/devcontainer.json +++ b/apps/backend/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "name": "GitHub Stats Extended Dev", "image": "mcr.microsoft.com/devcontainers/base:ubuntu", "features": { - "ghcr.io/devcontainers/features/node:1": { "version": "22" } + "ghcr.io/devcontainers/features/node:1": { "version": "24" } }, "forwardPorts": [3000], "portsAttributes": { diff --git a/apps/backend/_dot_vercel_copy/output/functions/api.func/.vc-config.json b/apps/backend/_dot_vercel_copy/output/functions/api.func/.vc-config.json index 605ee7c0..acaf927d 100644 --- a/apps/backend/_dot_vercel_copy/output/functions/api.func/.vc-config.json +++ b/apps/backend/_dot_vercel_copy/output/functions/api.func/.vc-config.json @@ -1,5 +1,4 @@ { - "runtime": "nodejs22.x", "handler": "router.js", "launcherType": "Nodejs" } From 1779475e1bc4df5e346c62bd5584c1f33b5676e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 14:12:15 +0200 Subject: [PATCH 32/57] build(deps-dev): Bump typescript-eslint from 8.58.1 to 8.58.2 (#166) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.58.1 to 8.58.2.
Release notes

Sourced from typescript-eslint's releases.

v8.58.2

8.58.2 (2026-04-13)

🩹 Fixes

  • remove tsbuildinfo cache file from published packages (#12187)
  • eslint-plugin: [no-unnecessary-condition] use assignability checks in checkTypePredicates (#12147)

❤️ Thank You

See GitHub Releases for more information.

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from typescript-eslint's changelog.

8.58.2 (2026-04-13)

🩹 Fixes

  • remove tsbuildinfo cache file from published packages (#12187)

❤️ Thank You

See GitHub Releases for more information.

You can read about our versioning strategy and releases on our website.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=typescript-eslint&package-manager=npm_and_yarn&previous-version=8.58.1&new-version=8.58.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 142 ++++++++++++++++++++++++------------------------- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index c47ce2bc..be5c277d 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "prettier": "3.8.2", "turbo": "2.9.6", "typescript": "6.0.2", - "typescript-eslint": "8.58.1", + "typescript-eslint": "8.58.2", "vitest": "catalog:default" }, "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6bae7d50..d7a204d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,10 +40,10 @@ importers: version: 10.2.0(jiti@2.6.1) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-import-x: specifier: 4.16.2 - version: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)) + version: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-jsdoc: specifier: 62.9.0 version: 62.9.0(eslint@10.2.0(jiti@2.6.1)) @@ -75,8 +75,8 @@ importers: specifier: 6.0.2 version: 6.0.2 typescript-eslint: - specifier: 8.58.1 - version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.2 + version: 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) vitest: specifier: catalog:default version: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) @@ -1276,39 +1276,39 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.58.1': - resolution: {integrity: sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==} + '@typescript-eslint/eslint-plugin@8.58.2': + resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.1 + '@typescript-eslint/parser': ^8.58.2 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.58.1': - resolution: {integrity: sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==} + '@typescript-eslint/parser@8.58.2': + resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} 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.1.0' - '@typescript-eslint/project-service@8.58.1': - resolution: {integrity: sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==} + '@typescript-eslint/project-service@8.58.2': + resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.58.1': - resolution: {integrity: sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==} + '@typescript-eslint/scope-manager@8.58.2': + resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.58.1': - resolution: {integrity: sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==} + '@typescript-eslint/tsconfig-utils@8.58.2': + resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.1': - resolution: {integrity: sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==} + '@typescript-eslint/type-utils@8.58.2': + resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -1318,25 +1318,25 @@ packages: resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.58.1': - resolution: {integrity: sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==} + '@typescript-eslint/types@8.58.2': + resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.58.1': - resolution: {integrity: sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==} + '@typescript-eslint/typescript-estree@8.58.2': + resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.58.1': - resolution: {integrity: sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==} + '@typescript-eslint/utils@8.58.2': + resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} 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.1.0' - '@typescript-eslint/visitor-keys@8.58.1': - resolution: {integrity: sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==} + '@typescript-eslint/visitor-keys@8.58.2': + resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -3273,8 +3273,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.58.1: - resolution: {integrity: sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==} + typescript-eslint@8.58.2: + resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -3686,7 +3686,7 @@ snapshots: '@es-joy/jsdoccomment@0.86.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/types': 8.58.2 comment-parser: 1.4.6 esquery: 1.7.0 jsdoc-type-pratt-parser: 7.2.0 @@ -4299,14 +4299,14 @@ snapshots: '@types/node': 24.12.2 optional: true - '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/type-utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.1 + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.2 eslint: 10.2.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 @@ -4315,41 +4315,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.1 + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.1(typescript@6.0.2)': + '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.2) - '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) + '@typescript-eslint/types': 8.58.2 debug: 4.4.3 typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.1': + '@typescript-eslint/scope-manager@8.58.2': dependencies: - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/visitor-keys': 8.58.1 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/visitor-keys': 8.58.2 - '@typescript-eslint/tsconfig-utils@8.58.1(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)': dependencies: typescript: 6.0.2 - '@typescript-eslint/type-utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@6.0.2) @@ -4359,14 +4359,14 @@ snapshots: '@typescript-eslint/types@8.58.0': {} - '@typescript-eslint/types@8.58.1': {} + '@typescript-eslint/types@8.58.2': {} - '@typescript-eslint/typescript-estree@8.58.1(typescript@6.0.2)': + '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': dependencies: - '@typescript-eslint/project-service': 8.58.1(typescript@6.0.2) - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.2) - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/visitor-keys': 8.58.1 + '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 @@ -4376,20 +4376,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) eslint: 10.2.0(jiti@2.6.1) typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.1': + '@typescript-eslint/visitor-keys@8.58.2': dependencies: - '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/types': 8.58.2 eslint-visitor-keys: 5.0.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -5019,7 +5019,7 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)): dependencies: debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) @@ -5030,11 +5030,11 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)): + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)): dependencies: '@package-json/types': 0.0.12 '@typescript-eslint/types': 8.58.0 @@ -5048,7 +5048,7 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) transitivePeerDependencies: - supports-color @@ -6601,12 +6601,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2): + typescript-eslint@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) eslint: 10.2.0(jiti@2.6.1) typescript: 6.0.2 transitivePeerDependencies: From 9c0f4a8390da5671f5e2d6459a67281ebbca91f9 Mon Sep 17 00:00:00 2001 From: Marco Pasqualetti <24919330+marcalexiei@users.noreply.github.com> Date: Wed, 22 Apr 2026 18:12:08 +0200 Subject: [PATCH 33/57] chore(dependabot): add groups (#171) Adds groups configuration to the Dependabot `npm` ecosystem block, consolidating related packages into single PRs instead of one PR per package --- .github/dependabot.yml | 43 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6bb49064..5e7101a8 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -14,6 +14,49 @@ updates: ignore: - dependency-name: "@types/node" update-types: ["version-update:semver-major"] + groups: + react: + patterns: + - "react" + - "react-dom" + - "react-*" + - "@types/react" + - "@types/react-dom" + redux: + patterns: + - "redux" + - "@reduxjs/*" + - "react-redux" + vite: + patterns: + - "vite" + - "@vitejs/*" + tailwind: + patterns: + - "tailwindcss" + - "@tailwindcss/*" + - "daisyui" + vitest: + patterns: + - "vitest" + - "@vitest/*" + eslint: + patterns: + - "eslint" + - "@eslint/*" + - "eslint-*" + - "typescript-eslint" + typescript: + patterns: + - "typescript" + - "@types/*" + playwright: + patterns: + - "@playwright/*" + axios: + patterns: + - "axios" + - "axios-*" # Maintain dependencies for GitHub Actions - package-ecosystem: github-actions From f8094ab5d32d31969b933bfae5c4d0140f644791 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 18:24:46 +0200 Subject: [PATCH 34/57] build(deps-dev): Bump prettier from 3.8.2 to 3.8.3 (#173) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [prettier](https://github.com/prettier/prettier) from 3.8.2 to 3.8.3.
Release notes

Sourced from prettier's releases.

3.8.3

🔗 Changelog

Changelog

Sourced from prettier's changelog.

3.8.3

diff

SCSS: Prevent trailing comma in if() function (#18471 by @​kovsu)

// Input
$value: if(sass(false): 1; else: -1);

// Prettier 3.8.2
$value: if(
sass(false): 1; else: -1,
);

// Prettier 3.8.3
$value: if(sass(false): 1; else: -1);

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=prettier&package-manager=npm_and_yarn&previous-version=3.8.2&new-version=3.8.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index be5c277d..bc78a492 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "husky": "9.1.7", "knip": "6.4.1", "lint-staged": "16.4.0", - "prettier": "3.8.2", + "prettier": "3.8.3", "turbo": "2.9.6", "typescript": "6.0.2", "typescript-eslint": "8.58.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7a204d6..dc28ab7a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,8 +66,8 @@ importers: specifier: 16.4.0 version: 16.4.0 prettier: - specifier: 3.8.2 - version: 3.8.2 + specifier: 3.8.3 + version: 3.8.3 turbo: specifier: 2.9.6 version: 2.9.6 @@ -2829,8 +2829,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.8.2: - resolution: {integrity: sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true @@ -6076,7 +6076,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.8.2: {} + prettier@3.8.3: {} pretty-format@27.5.1: dependencies: From e263e5dfc423846bc84fdf3d25845aa0d79a9c45 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Wed, 22 Apr 2026 18:50:59 +0200 Subject: [PATCH 35/57] upgrade pnpm and vite (#174) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 170 ++++++++++++++++++++++++-------------------- pnpm-workspace.yaml | 4 +- 3 files changed, 95 insertions(+), 81 deletions(-) diff --git a/package.json b/package.json index bc78a492..16944569 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@stats-organization/root", "private": true, "type": "module", - "packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319", + "packageManager": "pnpm@10.33.1+sha512.05ba3c1d5d1c18f68df06470d74055e62d41fc110a0c660db1b2dfb2785327f04cf0f68345d4609bc52089e7fa0343c31593b2f9594e2c5d5da426230acc9820", "devDependencies": { "@eslint/compat": "2.0.5", "@eslint/js": "10.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc28ab7a..ac91f00a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,14 +7,14 @@ settings: catalogs: default: '@vitest/coverage-v8': - specifier: 4.1.2 - version: 4.1.2 + specifier: 4.1.4 + version: 4.1.4 vite: specifier: 8.0.8 version: 8.0.8 vitest: - specifier: 4.1.2 - version: 4.1.2 + specifier: 4.1.4 + version: 4.1.4 importers: @@ -34,7 +34,7 @@ importers: version: 24.12.2 '@vitest/coverage-v8': specifier: catalog:default - version: 4.1.2(vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))) + version: 4.1.4(vitest@4.1.4) eslint: specifier: 10.2.0 version: 10.2.0(jiti@2.6.1) @@ -79,7 +79,7 @@ importers: version: 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) vitest: specifier: catalog:default - version: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) apps/backend: dependencies: @@ -104,7 +104,7 @@ importers: version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@25.5.0)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) apps/frontend: dependencies: @@ -180,7 +180,7 @@ importers: version: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@25.5.0)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) packages/core: dependencies: @@ -217,7 +217,7 @@ importers: version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@25.5.0)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) packages: @@ -1451,20 +1451,20 @@ packages: peerDependencies: vite: ^4 || ^5 || ^6 || ^7 || ^8 - '@vitest/coverage-v8@4.1.2': - resolution: {integrity: sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==} + '@vitest/coverage-v8@4.1.4': + resolution: {integrity: sha512-x7FptB5oDruxNPDNY2+S8tCh0pcq7ymCe1gTHcsp733jYjrJl8V1gMUlVysuCD9Kz46Xz9t1akkv08dPcYDs1w==} peerDependencies: - '@vitest/browser': 4.1.2 - vitest: 4.1.2 + '@vitest/browser': 4.1.4 + vitest: 4.1.4 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.2': - resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} + '@vitest/expect@4.1.4': + resolution: {integrity: sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==} - '@vitest/mocker@4.1.2': - resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==} + '@vitest/mocker@4.1.4': + resolution: {integrity: sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1474,20 +1474,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.2': - resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} + '@vitest/pretty-format@4.1.4': + resolution: {integrity: sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==} - '@vitest/runner@4.1.2': - resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==} + '@vitest/runner@4.1.4': + resolution: {integrity: sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==} - '@vitest/snapshot@4.1.2': - resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==} + '@vitest/snapshot@4.1.4': + resolution: {integrity: sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==} - '@vitest/spy@4.1.2': - resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==} + '@vitest/spy@4.1.4': + resolution: {integrity: sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==} - '@vitest/utils@4.1.2': - resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} + '@vitest/utils@4.1.4': + resolution: {integrity: sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==} accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} @@ -3114,8 +3114,8 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@4.0.0: - resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -3194,6 +3194,10 @@ packages: resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} engines: {node: '>=18'} + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -3375,18 +3379,20 @@ packages: yaml: optional: true - vitest@4.1.2: - resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} + vitest@4.1.4: + resolution: {integrity: sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.2 - '@vitest/browser-preview': 4.1.2 - '@vitest/browser-webdriverio': 4.1.2 - '@vitest/ui': 4.1.2 + '@vitest/browser-playwright': 4.1.4 + '@vitest/browser-preview': 4.1.4 + '@vitest/browser-webdriverio': 4.1.4 + '@vitest/coverage-istanbul': 4.1.4 + '@vitest/coverage-v8': 4.1.4 + '@vitest/ui': 4.1.4 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3403,6 +3409,10 @@ packages: optional: true '@vitest/browser-webdriverio': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -4461,66 +4471,66 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' - '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)))': + '@vitest/coverage-v8@4.1.4(vitest@4.1.4)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.2 + '@vitest/utils': 4.1.4 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 magicast: 0.5.2 obug: 2.1.1 - std-env: 4.0.0 + std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + vitest: 4.1.4(@types/node@25.5.0)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) - '@vitest/expect@4.1.2': + '@vitest/expect@4.1.4': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/spy': 4.1.4 + '@vitest/utils': 4.1.4 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.2(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.4(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: - '@vitest/spy': 4.1.2 + '@vitest/spy': 4.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) - '@vitest/mocker@4.1.2(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.4(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: - '@vitest/spy': 4.1.2 + '@vitest/spy': 4.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) - '@vitest/pretty-format@4.1.2': + '@vitest/pretty-format@4.1.4': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.2': + '@vitest/runner@4.1.4': dependencies: - '@vitest/utils': 4.1.2 + '@vitest/utils': 4.1.4 pathe: 2.0.3 - '@vitest/snapshot@4.1.2': + '@vitest/snapshot@4.1.4': dependencies: - '@vitest/pretty-format': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/pretty-format': 4.1.4 + '@vitest/utils': 4.1.4 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.2': {} + '@vitest/spy@4.1.4': {} - '@vitest/utils@4.1.2': + '@vitest/utils@4.1.4': dependencies: - '@vitest/pretty-format': 4.1.2 + '@vitest/pretty-format': 4.1.4 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -6405,7 +6415,7 @@ snapshots: statuses@2.0.2: {} - std-env@4.0.0: {} + std-env@4.1.0: {} stop-iteration-iterator@1.1.0: dependencies: @@ -6503,6 +6513,8 @@ snapshots: tinyexec@1.0.4: {} + tinyexec@1.1.1: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -6704,59 +6716,61 @@ snapshots: terser: 5.44.1 yaml: 2.8.3 - vitest@4.1.2(@types/node@24.12.2)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)): + vitest@4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)): dependencies: - '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.2 - '@vitest/runner': 4.1.2 - '@vitest/snapshot': 4.1.2 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/expect': 4.1.4 + '@vitest/mocker': 4.1.4(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.4 + '@vitest/runner': 4.1.4 + '@vitest/snapshot': 4.1.4 + '@vitest/spy': 4.1.4 + '@vitest/utils': 4.1.4 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.4 - std-env: 4.0.0 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 tinyrainbow: 3.1.0 vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.12.2 + '@vitest/coverage-v8': 4.1.4(vitest@4.1.4) happy-dom: 20.6.1 jsdom: 29.0.2 transitivePeerDependencies: - msw - vitest@4.1.2(@types/node@25.5.0)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)): + vitest@4.1.4(@types/node@25.5.0)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)): dependencies: - '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.2 - '@vitest/runner': 4.1.2 - '@vitest/snapshot': 4.1.2 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/expect': 4.1.4 + '@vitest/mocker': 4.1.4(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.4 + '@vitest/runner': 4.1.4 + '@vitest/snapshot': 4.1.4 + '@vitest/spy': 4.1.4 + '@vitest/utils': 4.1.4 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.4 - std-env: 4.0.0 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 tinyrainbow: 3.1.0 vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.5.0 + '@vitest/coverage-v8': 4.1.4(vitest@4.1.4) happy-dom: 20.6.1 jsdom: 29.0.2 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b4a3d351..34a1a59b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,9 +3,9 @@ packages: - packages/* catalog: - "@vitest/coverage-v8": 4.1.2 + "@vitest/coverage-v8": 4.1.4 vite: 8.0.8 - vitest: 4.1.2 + vitest: 4.1.4 minimumReleaseAge: 10080 From 5156a811cb3b9399f72418c634641b38cb68a81f Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Wed, 22 Apr 2026 19:34:43 +0200 Subject: [PATCH 36/57] exclude 'pg' from frontend build (#169) closes #142 --- apps/frontend/vite.config.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts index b8d1751f..8e29f53b 100644 --- a/apps/frontend/vite.config.ts +++ b/apps/frontend/vite.config.ts @@ -14,6 +14,10 @@ export default defineProject({ /** @todo use chunks to split bundle? */ chunkSizeWarningLimit: 800, + + rolldownOptions: { + external: ["pg"], + }, }, resolve: { conditions: ["@stats/source"], From 6d3145c3d8baa6a3f409d52c2e33c71f098b3c14 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Wed, 22 Apr 2026 20:07:52 +0200 Subject: [PATCH 37/57] run `pnpm upgrade` (#175) --- pnpm-lock.yaml | 327 +++++++++++++++++++++++-------------------------- 1 file changed, 156 insertions(+), 171 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac91f00a..9a9df4f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -290,8 +290,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} '@babel/template@7.28.6': @@ -618,8 +618,8 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.3': - resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -1007,86 +1007,86 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@swc/core-darwin-arm64@1.15.24': - resolution: {integrity: sha512-uM5ZGfFXjtvtJ+fe448PVBEbn/CSxS3UAyLj3O9xOqKIWy3S6hPTXSPbszxkSsGDYKi+YFhzAsR4r/eXLxEQ0g==} + '@swc/core-darwin-arm64@1.15.26': + resolution: {integrity: sha512-OmcP96CFsNOwa65tamQayRcfqhNlcQ3YCWOq+0Wb+CAM4uB7kOMrXY41Gj4atthxrGhLQ9pg7Vk26iApb88idA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.24': - resolution: {integrity: sha512-fMIb/Zfn929pw25VMBhV7Ji2Dl+lCWtUPNdYJQYOke+00E5fcQ9ynxtP8+qhUo/HZc+mYQb1gJxwHM9vty+lXg==} + '@swc/core-darwin-x64@1.15.26': + resolution: {integrity: sha512-liTTTpKSv89ivIxcZ+iU1cRige9Y7JkOjVnJ2Ystzl+DsWNHqt7wLTTgm/u7gEqmmAS2JKryODLQn3q1UtFNPQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.24': - resolution: {integrity: sha512-vOkjsyjjxnoYx3hMEWcGxQrMgnNrRm6WAegBXrN8foHtDAR+zpdhpGF5a4lj1bNPgXAvmysjui8cM1ov/Clkaw==} + '@swc/core-linux-arm-gnueabihf@1.15.26': + resolution: {integrity: sha512-Y/g+m3I8CeBof5A3kWWOS6QA2HOIUytF5EeTgfwcAK+GKT/tGe7Xqo5svBtaqflU5od2zzbMTWqkinPXgRWGgA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.24': - resolution: {integrity: sha512-h/oNu+upkXJ6Cicnq7YGVj9PkdfarLCdQa8l/FlHYvfv8CEiMaeeTnpLU7gSBH/rGxosM6Qkfa/J9mThGF9CLA==} + '@swc/core-linux-arm64-gnu@1.15.26': + resolution: {integrity: sha512-19IvwyPfBN/rz9s7qXhOTQmW0922+pjpRUUvIebu+CMM75nX6YuDzHsGx8hSmn5dS89SNaMCh1lgUuXqm++6jg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [glibc] - '@swc/core-linux-arm64-musl@1.15.24': - resolution: {integrity: sha512-ZpF/pRe1guk6sKzQI9D1jAORtjTdNlyeXn9GDz8ophof/w2WhojRblvSDJaGe7rJjcPN8AaOkhwdRUh7q8oYIg==} + '@swc/core-linux-arm64-musl@1.15.26': + resolution: {integrity: sha512-iNlbvTIo425rkKzDLLWFJGnFXr3myETUdIDHcjuiPNZE8b0ogmcAuilC4yEJX7FSHGbnlsoJcCT2xf4b3VJmmQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [musl] - '@swc/core-linux-ppc64-gnu@1.15.24': - resolution: {integrity: sha512-QZEsZfisHTSJlmyChgDFNmKPb3W6Lhbfo/O76HhIngfEdnQNmukS38/VSe1feho+xkV5A5hETyCbx3sALBZKAQ==} + '@swc/core-linux-ppc64-gnu@1.15.26': + resolution: {integrity: sha512-AuuEOtG+YXKIjIUup4RsxYNklx6XVB3WKWfhxG6hnfPrn7vp89RNOLbbyyprgj6Sk7k9ulwGVTJElEvmBNPSCA==} engines: {node: '>=10'} cpu: [ppc64] os: [linux] libc: [glibc] - '@swc/core-linux-s390x-gnu@1.15.24': - resolution: {integrity: sha512-DLdJKVsJgglqQrJBuoUYNmzm3leI7kUZhLbZGHv42onfKsGf6JDS3+bzCUQfte/XOqDjh/tmmn1DR/CF/tCJFw==} + '@swc/core-linux-s390x-gnu@1.15.26': + resolution: {integrity: sha512-JcMDWQvW1BchUyRg8E0jHiTx7CQYpUr5uDEL1dnPDECrEjBEGG2ynmJ3XX70sWXql0JagqR1t3VpANYFWdUnqA==} engines: {node: '>=10'} cpu: [s390x] os: [linux] libc: [glibc] - '@swc/core-linux-x64-gnu@1.15.24': - resolution: {integrity: sha512-IpLYfposPA/XLxYOKpRfeccl1p5dDa3+okZDHHTchBkXEaVCnq5MADPmIWwIYj1tudt7hORsEHccG5no6IUQRw==} + '@swc/core-linux-x64-gnu@1.15.26': + resolution: {integrity: sha512-FW7V7Mbpq4+PA7BiAq76LJs8MdNuUSylyuRVfQRkhIyeWadFroZ+KOPgjku8Z/fXzngxBRvsk+PGGB0t8mGcjA==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [glibc] - '@swc/core-linux-x64-musl@1.15.24': - resolution: {integrity: sha512-JHy3fMSc0t/EPWgo74+OK5TGr51aElnzqfUPaiRf2qJ/BfX5CUCfMiWVBuhI7qmVMBnk1jTRnL/xZnOSHDPLYg==} + '@swc/core-linux-x64-musl@1.15.26': + resolution: {integrity: sha512-w8erqMHsVcdGwUfJxF6LaiTuPoKnyLOcUbhLcxiXrlLt5MLjtlgcIeUY/NWK/oPoyqkgH+/i8pOJnMTxvl83ZQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [musl] - '@swc/core-win32-arm64-msvc@1.15.24': - resolution: {integrity: sha512-Txj+qUH1z2bUd1P3JvwByfjKFti3cptlAxhWgmunBUUxy/IW3CXLZ6l6Gk4liANadKkU71nIU1X30Z5vpMT3BA==} + '@swc/core-win32-arm64-msvc@1.15.26': + resolution: {integrity: sha512-uDCWCNpUiqkbvPmsuPUTn/P7ag9SqNXD2JT/W3dUu7yZ2krzN+nmmoQ2xRX63/J6RYiHI7aT4jo7Z++lsljlPA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.24': - resolution: {integrity: sha512-15D/nl3XwrhFpMv+MADFOiVwv3FvH9j8c6Rf8EXBT3Q5LoMh8YnDnSgPYqw1JzPnksvsBX6QPXLiPqmcR/Z4qQ==} + '@swc/core-win32-ia32-msvc@1.15.26': + resolution: {integrity: sha512-2k1ax1QmmqLEnpC0uRCw7OXhBfyvdPqERBXupDasjYbChT6ZSO/uha28Bp38cw0viKIG79L27aTDkbkABsMW3w==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.24': - resolution: {integrity: sha512-PR0PlTlPra2JbaDphrOAzm6s0v9rA0F17YzB+XbWD95B4g2cWcZY9LAeTa4xll70VLw9Jr7xBrlohqlQmelMFQ==} + '@swc/core-win32-x64-msvc@1.15.26': + resolution: {integrity: sha512-aUuYecSEGa4SUSdyCWaI/vk8jdseifYnsF1GZQx2+piL8GIuT/5QrVcFfmes4Iwy7FIVXxtzD063z/FfpZ7K7w==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.24': - resolution: {integrity: sha512-5Hj8aNasue7yusUt8LGCUe/AjM7RMAce8ZoyDyiFwx7Al+GbYKL+yE7g4sJk8vEr1dKIkTRARkNIJENc4CjkBQ==} + '@swc/core@1.15.26': + resolution: {integrity: sha512-tglZGyx8N5PC+x1Nd/JrZxqpqlcZoSuG9gTDKO6AuFToFiVB3uS8HvbKFuO7g3lJzvFf9riAb94xs9HU2UhAHQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -1314,10 +1314,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.58.0': - resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.58.2': resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1607,8 +1603,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.10.13: - resolution: {integrity: sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==} + baseline-browser-mapping@2.10.19: + resolution: {integrity: sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==} engines: {node: '>=6.0.0'} hasBin: true @@ -1649,16 +1645,16 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} engines: {node: '>= 0.4'} call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - caniuse-lite@1.0.30001784: - resolution: {integrity: sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==} + caniuse-lite@1.0.30001788: + resolution: {integrity: sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==} chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} @@ -1697,8 +1693,8 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - content-disposition@1.0.1: - resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} content-type@1.0.5: @@ -1805,8 +1801,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.331: - resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} + electron-to-chromium@1.5.336: + resolution: {integrity: sha512-AbH9q9J455r/nLmdNZes0G0ZKcRX73FicwowalLs6ijwOmCJSRRrLX63lcAlzy9ux3dWK1w1+1nsBJEWN11hcQ==} emoji-name-map@2.0.3: resolution: {integrity: sha512-3KBuQuhYkRtLd9utBKfTtclbWP3IytC1FNcXg+NKARltPSYpkg/MLiklGv4vLwl8A8jMQjdneXNBYx8k0rrg+g==} @@ -1830,8 +1826,8 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - es-abstract@1.24.1: - resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -1842,8 +1838,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.3.1: - resolution: {integrity: sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==} + es-iterator-helpers@1.3.2: + resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} engines: {node: '>= 0.4'} es-module-lexer@2.0.0: @@ -2125,6 +2121,9 @@ packages: get-tsconfig@4.13.7: resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + github-username-regex@1.0.0: resolution: {integrity: sha512-EqDVkN0/5MQyDPOSDLInVRRXdeISRfcN1UW/1FUqD2knV1HHw8DndMB3UPNn5lO51DvRnjzbLXwWqNNV86PLOw==} @@ -2740,8 +2739,8 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -2805,8 +2804,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.9: - resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -2853,8 +2852,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.15.0: - resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} + qs@6.15.1: + resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -3044,8 +3043,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} side-channel-map@1.0.1: @@ -3190,18 +3189,10 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} - engines: {node: '>=18'} - tinyexec@1.1.1: resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.16: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} @@ -3622,7 +3613,7 @@ snapshots: dependencies: '@babel/types': 7.29.0 - '@babel/runtime@7.28.6': {} + '@babel/runtime@7.29.2': {} '@babel/template@7.28.6': dependencies: @@ -3866,7 +3857,7 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 @@ -3935,7 +3926,7 @@ snapshots: '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -4004,7 +3995,7 @@ snapshots: '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -4077,7 +4068,7 @@ snapshots: dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': @@ -4096,59 +4087,59 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@swc/core-darwin-arm64@1.15.24': + '@swc/core-darwin-arm64@1.15.26': optional: true - '@swc/core-darwin-x64@1.15.24': + '@swc/core-darwin-x64@1.15.26': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.24': + '@swc/core-linux-arm-gnueabihf@1.15.26': optional: true - '@swc/core-linux-arm64-gnu@1.15.24': + '@swc/core-linux-arm64-gnu@1.15.26': optional: true - '@swc/core-linux-arm64-musl@1.15.24': + '@swc/core-linux-arm64-musl@1.15.26': optional: true - '@swc/core-linux-ppc64-gnu@1.15.24': + '@swc/core-linux-ppc64-gnu@1.15.26': optional: true - '@swc/core-linux-s390x-gnu@1.15.24': + '@swc/core-linux-s390x-gnu@1.15.26': optional: true - '@swc/core-linux-x64-gnu@1.15.24': + '@swc/core-linux-x64-gnu@1.15.26': optional: true - '@swc/core-linux-x64-musl@1.15.24': + '@swc/core-linux-x64-musl@1.15.26': optional: true - '@swc/core-win32-arm64-msvc@1.15.24': + '@swc/core-win32-arm64-msvc@1.15.26': optional: true - '@swc/core-win32-ia32-msvc@1.15.24': + '@swc/core-win32-ia32-msvc@1.15.26': optional: true - '@swc/core-win32-x64-msvc@1.15.24': + '@swc/core-win32-x64-msvc@1.15.26': optional: true - '@swc/core@1.15.24': + '@swc/core@1.15.26': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.26 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.24 - '@swc/core-darwin-x64': 1.15.24 - '@swc/core-linux-arm-gnueabihf': 1.15.24 - '@swc/core-linux-arm64-gnu': 1.15.24 - '@swc/core-linux-arm64-musl': 1.15.24 - '@swc/core-linux-ppc64-gnu': 1.15.24 - '@swc/core-linux-s390x-gnu': 1.15.24 - '@swc/core-linux-x64-gnu': 1.15.24 - '@swc/core-linux-x64-musl': 1.15.24 - '@swc/core-win32-arm64-msvc': 1.15.24 - '@swc/core-win32-ia32-msvc': 1.15.24 - '@swc/core-win32-x64-msvc': 1.15.24 + '@swc/core-darwin-arm64': 1.15.26 + '@swc/core-darwin-x64': 1.15.26 + '@swc/core-linux-arm-gnueabihf': 1.15.26 + '@swc/core-linux-arm64-gnu': 1.15.26 + '@swc/core-linux-arm64-musl': 1.15.26 + '@swc/core-linux-ppc64-gnu': 1.15.26 + '@swc/core-linux-s390x-gnu': 1.15.26 + '@swc/core-linux-x64-gnu': 1.15.26 + '@swc/core-linux-x64-musl': 1.15.26 + '@swc/core-win32-arm64-msvc': 1.15.26 + '@swc/core-win32-ia32-msvc': 1.15.26 + '@swc/core-win32-x64-msvc': 1.15.26 '@swc/counter@0.1.3': {} @@ -4227,7 +4218,7 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.2 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -4367,8 +4358,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.58.0': {} - '@typescript-eslint/types@8.58.2': {} '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': @@ -4466,7 +4455,7 @@ snapshots: '@vitejs/plugin-react-swc@4.3.0(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - '@swc/core': 1.15.24 + '@swc/core': 1.15.26 vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) transitivePeerDependencies: - '@swc/helpers' @@ -4483,7 +4472,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.4(@types/node@25.5.0)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + vitest: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) '@vitest/expect@4.1.4': dependencies: @@ -4581,10 +4570,10 @@ snapshots: array-includes@3.1.9: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 @@ -4592,41 +4581,41 @@ snapshots: array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -4674,7 +4663,7 @@ snapshots: balanced-match@4.0.4: {} - baseline-browser-mapping@2.10.13: {} + baseline-browser-mapping@2.10.19: {} bidi-js@1.0.3: dependencies: @@ -4688,7 +4677,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.15.0 + qs: 6.15.1 raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: @@ -4709,9 +4698,9 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.13 - caniuse-lite: 1.0.30001784 - electron-to-chromium: 1.5.331 + baseline-browser-mapping: 2.10.19 + caniuse-lite: 1.0.30001788 + electron-to-chromium: 1.5.336 node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -4727,7 +4716,7 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: + call-bind@1.0.9: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -4739,7 +4728,7 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - caniuse-lite@1.0.30001784: {} + caniuse-lite@1.0.30001788: {} chai@6.2.2: {} @@ -4769,7 +4758,7 @@ snapshots: concat-map@0.0.1: {} - content-disposition@1.0.1: {} + content-disposition@1.1.0: {} content-type@1.0.5: {} @@ -4865,7 +4854,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.331: {} + electron-to-chromium@1.5.336: {} emoji-name-map@2.0.3: {} @@ -4882,12 +4871,12 @@ snapshots: environment@1.1.0: {} - es-abstract@1.24.1: + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 @@ -4943,12 +4932,12 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.3.1: + es-iterator-helpers@1.3.2: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -4961,7 +4950,6 @@ snapshots: internal-slot: 1.1.0 iterator.prototype: 1.1.5 math-intrinsics: 1.1.0 - safe-array-concat: 1.1.3 es-module-lexer@2.0.0: {} @@ -5024,7 +5012,7 @@ snapshots: eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: - get-tsconfig: 4.13.7 + get-tsconfig: 4.14.0 stable-hash-x: 0.2.0 optionalDependencies: unrs-resolver: 1.11.1 @@ -5034,10 +5022,10 @@ snapshots: debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) - get-tsconfig: 4.13.7 + get-tsconfig: 4.14.0 is-bun-module: 2.0.0 stable-hash-x: 0.2.0 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)) @@ -5047,7 +5035,7 @@ snapshots: eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)): dependencies: '@package-json/types': 0.0.12 - '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/types': 8.58.2 comment-parser: 1.4.6 debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) @@ -5100,7 +5088,7 @@ snapshots: array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.3.1 + es-iterator-helpers: 1.3.2 eslint: 10.2.0(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 @@ -5195,7 +5183,7 @@ snapshots: dependencies: accepts: 2.0.0 body-parser: 2.2.2 - content-disposition: 1.0.1 + content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 @@ -5213,7 +5201,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.15.0 + qs: 6.15.1 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 @@ -5315,7 +5303,7 @@ snapshots: function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 @@ -5358,6 +5346,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + github-username-regex@1.0.0: {} glob-parent@5.1.2: @@ -5468,7 +5460,7 @@ snapshots: is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 get-intrinsic: 1.3.0 @@ -5754,7 +5746,7 @@ snapshots: listr2: 9.0.5 picomatch: 4.0.4 string-argv: 0.3.2 - tinyexec: 1.0.4 + tinyexec: 1.1.1 yaml: 2.8.3 listr2@9.0.5: @@ -5876,7 +5868,7 @@ snapshots: object.assign@4.1.7: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -5885,21 +5877,21 @@ snapshots: object.entries@1.1.9: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-object-atoms: 1.1.1 object.values@1.2.1: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -6013,7 +6005,7 @@ snapshots: path-parse@1.0.7: {} - path-to-regexp@8.3.0: {} + path-to-regexp@8.4.2: {} pathe@2.0.3: {} @@ -6068,7 +6060,7 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.9: + postcss@8.5.10: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -6109,7 +6101,7 @@ snapshots: punycode@2.3.1: {} - qs@6.15.0: + qs@6.15.1: dependencies: side-channel: 1.1.0 @@ -6176,9 +6168,9 @@ snapshots: reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -6187,7 +6179,7 @@ snapshots: regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 es-errors: 1.3.0 get-proto: 1.0.1 @@ -6247,7 +6239,7 @@ snapshots: depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.3.0 + path-to-regexp: 8.4.2 transitivePeerDependencies: - supports-color @@ -6257,7 +6249,7 @@ snapshots: safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 get-intrinsic: 1.3.0 has-symbols: 1.1.0 @@ -6343,7 +6335,7 @@ snapshots: shebang-regex@3.0.0: {} - side-channel-list@1.0.0: + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -6367,7 +6359,7 @@ snapshots: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - side-channel-list: 1.0.0 + side-channel-list: 1.0.1 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -6437,10 +6429,10 @@ snapshots: string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -6454,28 +6446,28 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -6511,15 +6503,8 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.0.4: {} - tinyexec@1.1.1: {} - tinyglobby@0.2.15: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -6588,7 +6573,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 @@ -6597,7 +6582,7 @@ snapshots: typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 @@ -6606,7 +6591,7 @@ snapshots: typed-array-length@1.0.7: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 @@ -6690,7 +6675,7 @@ snapshots: dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.9 + postcss: 8.5.10 rolldown: 1.0.0-rc.15 tinyglobby: 0.2.16 optionalDependencies: @@ -6705,7 +6690,7 @@ snapshots: dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.9 + postcss: 8.5.10 rolldown: 1.0.0-rc.15 tinyglobby: 0.2.16 optionalDependencies: @@ -6831,7 +6816,7 @@ snapshots: which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 for-each: 0.3.5 get-proto: 1.0.1 From 0898dbfb006d49c55fd9337154b1710d251f1521 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Wed, 22 Apr 2026 21:06:14 +0200 Subject: [PATCH 38/57] re-build lockfile (#176) Running `pnpm upgrade -r` in my previous PR didn't upgrade everything, because of a bug in pnpm: https://github.com/pnpm/pnpm/issues/9900 So I deleted the lockfile and node_modules and re-installed everything in order to upgrade all dependencies. --- pnpm-lock.yaml | 486 +++---------------------------------------------- 1 file changed, 22 insertions(+), 464 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a9df4f1..d00a8101 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,7 +79,7 @@ importers: version: 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) vitest: specifier: catalog:default - version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) apps/backend: dependencies: @@ -104,7 +104,7 @@ importers: version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.4(@types/node@25.5.0)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) apps/frontend: dependencies: @@ -119,7 +119,7 @@ importers: version: link:../../packages/core '@tailwindcss/vite': specifier: ^4.2.2 - version: 4.2.2(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.2.2(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) axios: specifier: ^1 version: 1.15.0 @@ -168,7 +168,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react-swc': specifier: 4.3.0 - version: 4.3.0(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.3.0(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -177,10 +177,10 @@ importers: version: 4.2.2 vite: specifier: catalog:default - version: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) + version: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) vitest: specifier: catalog:default - version: 4.1.4(@types/node@25.5.0)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) packages/core: dependencies: @@ -217,7 +217,7 @@ importers: version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.4(@types/node@25.5.0)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) packages: @@ -367,162 +367,6 @@ packages: resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} - '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.27.3': - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.27.3': - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.27.3': - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.27.3': - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.27.3': - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.27.3': - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.27.3': - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.27.3': - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.27.3': - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.27.3': - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.27.3': - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.27.3': - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.27.3': - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.27.3': - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.27.3': - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.27.3': - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.27.3': - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.27.3': - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.27.3': - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.27.3': - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.27.3': - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.27.3': - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.27.3': - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.27.3': - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.27.3': - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -606,9 +450,6 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -1256,9 +1097,6 @@ packages: '@types/node@24.12.2': resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} - '@types/node@25.5.0': - resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} - '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -1270,12 +1108,6 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - '@types/whatwg-mimetype@3.0.2': - resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.58.2': resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1631,9 +1463,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1683,9 +1512,6 @@ packages: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - comment-parser@1.4.6: resolution: {integrity: sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==} engines: {node: '>= 12.0.0'} @@ -1801,8 +1627,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.336: - resolution: {integrity: sha512-AbH9q9J455r/nLmdNZes0G0ZKcRX73FicwowalLs6ijwOmCJSRRrLX63lcAlzy9ux3dWK1w1+1nsBJEWN11hcQ==} + electron-to-chromium@1.5.337: + resolution: {integrity: sha512-15gKW9mRUNP9RdzhedJNypFUxtYWSXohFz2nTLzM272xbRXHws68kNDzyATG3qej+vUj/7Sn9hf5XTDh0XK6/w==} emoji-name-map@2.0.3: resolution: {integrity: sha512-3KBuQuhYkRtLd9utBKfTtclbWP3IytC1FNcXg+NKARltPSYpkg/MLiklGv4vLwl8A8jMQjdneXNBYx8k0rrg+g==} @@ -1861,11 +1687,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2150,10 +1971,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - happy-dom@20.6.1: - resolution: {integrity: sha512-+0vhESXXhFwkdjZnJ5DlmJIfUYGgIEEjzIjB+aKJbFuqlvvKyOi+XkI1fYbgYR9QCxG5T08koxsQ6HrQfa5gCQ==} - engines: {node: '>=20.0.0'} - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -3082,13 +2899,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} @@ -3181,11 +2991,6 @@ packages: resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} engines: {node: '>=6'} - terser@5.44.1: - resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} - engines: {node: '>=10'} - hasBin: true - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3291,9 +3096,6 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@7.25.0: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} @@ -3423,10 +3225,6 @@ packages: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} @@ -3472,18 +3270,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.20.0: - resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -3694,84 +3480,6 @@ snapshots: '@es-joy/resolve.exports@1.2.0': {} - '@esbuild/aix-ppc64@0.27.3': - optional: true - - '@esbuild/android-arm64@0.27.3': - optional: true - - '@esbuild/android-arm@0.27.3': - optional: true - - '@esbuild/android-x64@0.27.3': - optional: true - - '@esbuild/darwin-arm64@0.27.3': - optional: true - - '@esbuild/darwin-x64@0.27.3': - optional: true - - '@esbuild/freebsd-arm64@0.27.3': - optional: true - - '@esbuild/freebsd-x64@0.27.3': - optional: true - - '@esbuild/linux-arm64@0.27.3': - optional: true - - '@esbuild/linux-arm@0.27.3': - optional: true - - '@esbuild/linux-ia32@0.27.3': - optional: true - - '@esbuild/linux-loong64@0.27.3': - optional: true - - '@esbuild/linux-mips64el@0.27.3': - optional: true - - '@esbuild/linux-ppc64@0.27.3': - optional: true - - '@esbuild/linux-riscv64@0.27.3': - optional: true - - '@esbuild/linux-s390x@0.27.3': - optional: true - - '@esbuild/linux-x64@0.27.3': - optional: true - - '@esbuild/netbsd-arm64@0.27.3': - optional: true - - '@esbuild/netbsd-x64@0.27.3': - optional: true - - '@esbuild/openbsd-arm64@0.27.3': - optional: true - - '@esbuild/openbsd-x64@0.27.3': - optional: true - - '@esbuild/openharmony-arm64@0.27.3': - optional: true - - '@esbuild/sunos-x64@0.27.3': - optional: true - - '@esbuild/win32-arm64@0.27.3': - optional: true - - '@esbuild/win32-ia32@0.27.3': - optional: true - - '@esbuild/win32-x64@0.27.3': - optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0(jiti@2.6.1))': dependencies: eslint: 10.2.0(jiti@2.6.1) @@ -3837,12 +3545,6 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - optional: true - '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.31': @@ -4208,12 +3910,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - '@tailwindcss/vite@4.2.2(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.2(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@tailwindcss/node': 4.2.2 '@tailwindcss/oxide': 4.2.2 tailwindcss: 4.2.2 - vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) '@testing-library/dom@10.4.1': dependencies: @@ -4277,11 +3979,6 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/node@25.5.0': - dependencies: - undici-types: 7.18.2 - optional: true - '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: '@types/react': 19.2.14 @@ -4292,14 +3989,6 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@types/whatwg-mimetype@3.0.2': - optional: true - - '@types/ws@8.18.1': - dependencies: - '@types/node': 24.12.2 - optional: true - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -4452,11 +4141,11 @@ snapshots: '@uppercod/css-to-object@1.1.1': {} - '@vitejs/plugin-react-swc@4.3.0(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': + '@vitejs/plugin-react-swc@4.3.0(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 '@swc/core': 1.15.26 - vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) transitivePeerDependencies: - '@swc/helpers' @@ -4472,7 +4161,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + vitest: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) '@vitest/expect@4.1.4': dependencies: @@ -4483,21 +4172,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.4(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.4(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) - - '@vitest/mocker@4.1.4(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3))': - dependencies: - '@vitest/spy': 4.1.4 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) '@vitest/pretty-format@4.1.4': dependencies: @@ -4700,13 +4381,10 @@ snapshots: dependencies: baseline-browser-mapping: 2.10.19 caniuse-lite: 1.0.30001788 - electron-to-chromium: 1.5.336 + electron-to-chromium: 1.5.337 node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) - buffer-from@1.1.2: - optional: true - bytes@3.1.2: {} cache-parser@1.2.6: {} @@ -4751,9 +4429,6 @@ snapshots: commander@14.0.3: {} - commander@2.20.3: - optional: true - comment-parser@1.4.6: {} concat-map@0.0.1: {} @@ -4854,7 +4529,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.336: {} + electron-to-chromium@1.5.337: {} emoji-name-map@2.0.3: {} @@ -4974,36 +4649,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.27.3: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.3 - '@esbuild/android-arm': 0.27.3 - '@esbuild/android-arm64': 0.27.3 - '@esbuild/android-x64': 0.27.3 - '@esbuild/darwin-arm64': 0.27.3 - '@esbuild/darwin-x64': 0.27.3 - '@esbuild/freebsd-arm64': 0.27.3 - '@esbuild/freebsd-x64': 0.27.3 - '@esbuild/linux-arm': 0.27.3 - '@esbuild/linux-arm64': 0.27.3 - '@esbuild/linux-ia32': 0.27.3 - '@esbuild/linux-loong64': 0.27.3 - '@esbuild/linux-mips64el': 0.27.3 - '@esbuild/linux-ppc64': 0.27.3 - '@esbuild/linux-riscv64': 0.27.3 - '@esbuild/linux-s390x': 0.27.3 - '@esbuild/linux-x64': 0.27.3 - '@esbuild/netbsd-arm64': 0.27.3 - '@esbuild/netbsd-x64': 0.27.3 - '@esbuild/openbsd-arm64': 0.27.3 - '@esbuild/openbsd-x64': 0.27.3 - '@esbuild/openharmony-arm64': 0.27.3 - '@esbuild/sunos-x64': 0.27.3 - '@esbuild/win32-arm64': 0.27.3 - '@esbuild/win32-ia32': 0.27.3 - '@esbuild/win32-x64': 0.27.3 - optional: true - escalade@3.2.0: {} escape-html@1.0.3: {} @@ -5371,19 +5016,6 @@ snapshots: graceful-fs@4.2.11: {} - happy-dom@20.6.1: - dependencies: - '@types/node': 24.12.2 - '@types/whatwg-mimetype': 3.0.2 - '@types/ws': 8.18.1 - entities: 6.0.1 - whatwg-mimetype: 3.0.0 - ws: 8.20.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - optional: true - has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -6381,15 +6013,6 @@ snapshots: source-map-js@1.2.1: {} - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - optional: true - - source-map@0.6.1: - optional: true - spdx-exceptions@2.5.0: {} spdx-expression-parse@4.0.0: @@ -6493,14 +6116,6 @@ snapshots: tapable@2.3.2: {} - terser@5.44.1: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 - commander: 2.20.3 - source-map-support: 0.5.21 - optional: true - tinybench@2.9.0: {} tinyexec@1.1.1: {} @@ -6622,9 +6237,6 @@ snapshots: undici-types@7.16.0: {} - undici-types@7.18.2: - optional: true - undici@7.25.0: {} unpipe@1.0.0: {} @@ -6671,7 +6283,7 @@ snapshots: vary@1.1.2: {} - vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3): + vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -6680,31 +6292,14 @@ snapshots: tinyglobby: 0.2.16 optionalDependencies: '@types/node': 24.12.2 - esbuild: 0.27.3 fsevents: 2.3.3 jiti: 2.6.1 - terser: 5.44.1 yaml: 2.8.3 - vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3): - dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.10 - rolldown: 1.0.0-rc.15 - tinyglobby: 0.2.16 - optionalDependencies: - '@types/node': 25.5.0 - esbuild: 0.27.3 - fsevents: 2.3.3 - jiti: 2.6.1 - terser: 5.44.1 - yaml: 2.8.3 - - vitest@4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)): + vitest@4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.4 - '@vitest/mocker': 4.1.4(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.4(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.4 '@vitest/runner': 4.1.4 '@vitest/snapshot': 4.1.4 @@ -6721,42 +6316,11 @@ snapshots: tinyexec: 1.1.1 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) + vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.12.2 '@vitest/coverage-v8': 4.1.4(vitest@4.1.4) - happy-dom: 20.6.1 - jsdom: 29.0.2 - transitivePeerDependencies: - - msw - - vitest@4.1.4(@types/node@25.5.0)(@vitest/coverage-v8@4.1.4)(happy-dom@20.6.1)(jsdom@29.0.2)(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)): - dependencies: - '@vitest/expect': 4.1.4 - '@vitest/mocker': 4.1.4(vite@8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.4 - '@vitest/runner': 4.1.4 - '@vitest/snapshot': 4.1.4 - '@vitest/spy': 4.1.4 - '@vitest/utils': 4.1.4 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.1.1 - tinyglobby: 0.2.16 - tinyrainbow: 3.1.0 - vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.3) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 25.5.0 - '@vitest/coverage-v8': 4.1.4(vitest@4.1.4) - happy-dom: 20.6.1 jsdom: 29.0.2 transitivePeerDependencies: - msw @@ -6769,9 +6333,6 @@ snapshots: webidl-conversions@8.0.1: {} - whatwg-mimetype@3.0.0: - optional: true - whatwg-mimetype@5.0.0: {} whatwg-url@16.0.1: @@ -6842,9 +6403,6 @@ snapshots: wrappy@1.0.2: {} - ws@8.20.0: - optional: true - xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} From 9d8a7b7f0c4c6c3fba2500d3eeade07c63b65bbf Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Thu, 23 Apr 2026 21:27:20 +0200 Subject: [PATCH 39/57] 'plugin-react-swc' -> 'plugin-react' (#168) I upgraded several dependencies yesterday, including vite. Running `pnpm run dev:frontend` now prints: > [vite:react-swc] We recommend switching to `@vitejs/plugin-react` for improved performance as no swc plugins are used. More information at https://vite.dev/rolldown So in this PR I switch to `@vitejs/plugin-react`. Unless you had a specific reason to use `@vitejs/plugin-react-swc` instead? --- apps/frontend/package.json | 2 +- apps/frontend/vite.config.ts | 2 +- pnpm-lock.yaml | 177 +++-------------------------------- 3 files changed, 16 insertions(+), 165 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 4de6d8ff..2280f2a6 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -34,7 +34,7 @@ "devDependencies": { "@types/react": "19.2.14", "@types/react-dom": "19.2.3", - "@vitejs/plugin-react-swc": "4.3.0", + "@vitejs/plugin-react": "6.0.1", "clsx": "2.1.1", "tailwindcss": "4.2.2", "vite": "catalog:default", diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts index 8e29f53b..dc47bb39 100644 --- a/apps/frontend/vite.config.ts +++ b/apps/frontend/vite.config.ts @@ -1,7 +1,7 @@ import path from "node:path"; import tailwindcss from "@tailwindcss/vite"; -import react from "@vitejs/plugin-react-swc"; +import react from "@vitejs/plugin-react"; import { defineProject } from "vitest/config"; // https://vitejs.dev/config/ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d00a8101..90b79454 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -166,9 +166,9 @@ importers: '@types/react-dom': specifier: 19.2.3 version: 19.2.3(@types/react@19.2.14) - '@vitejs/plugin-react-swc': - specifier: 4.3.0 - version: 4.3.0(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + '@vitejs/plugin-react': + specifier: 6.0.1 + version: 6.0.1(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -848,99 +848,6 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@swc/core-darwin-arm64@1.15.26': - resolution: {integrity: sha512-OmcP96CFsNOwa65tamQayRcfqhNlcQ3YCWOq+0Wb+CAM4uB7kOMrXY41Gj4atthxrGhLQ9pg7Vk26iApb88idA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - - '@swc/core-darwin-x64@1.15.26': - resolution: {integrity: sha512-liTTTpKSv89ivIxcZ+iU1cRige9Y7JkOjVnJ2Ystzl+DsWNHqt7wLTTgm/u7gEqmmAS2JKryODLQn3q1UtFNPQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-linux-arm-gnueabihf@1.15.26': - resolution: {integrity: sha512-Y/g+m3I8CeBof5A3kWWOS6QA2HOIUytF5EeTgfwcAK+GKT/tGe7Xqo5svBtaqflU5od2zzbMTWqkinPXgRWGgA==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.15.26': - resolution: {integrity: sha512-19IvwyPfBN/rz9s7qXhOTQmW0922+pjpRUUvIebu+CMM75nX6YuDzHsGx8hSmn5dS89SNaMCh1lgUuXqm++6jg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@swc/core-linux-arm64-musl@1.15.26': - resolution: {integrity: sha512-iNlbvTIo425rkKzDLLWFJGnFXr3myETUdIDHcjuiPNZE8b0ogmcAuilC4yEJX7FSHGbnlsoJcCT2xf4b3VJmmQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@swc/core-linux-ppc64-gnu@1.15.26': - resolution: {integrity: sha512-AuuEOtG+YXKIjIUup4RsxYNklx6XVB3WKWfhxG6hnfPrn7vp89RNOLbbyyprgj6Sk7k9ulwGVTJElEvmBNPSCA==} - engines: {node: '>=10'} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@swc/core-linux-s390x-gnu@1.15.26': - resolution: {integrity: sha512-JcMDWQvW1BchUyRg8E0jHiTx7CQYpUr5uDEL1dnPDECrEjBEGG2ynmJ3XX70sWXql0JagqR1t3VpANYFWdUnqA==} - engines: {node: '>=10'} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@swc/core-linux-x64-gnu@1.15.26': - resolution: {integrity: sha512-FW7V7Mbpq4+PA7BiAq76LJs8MdNuUSylyuRVfQRkhIyeWadFroZ+KOPgjku8Z/fXzngxBRvsk+PGGB0t8mGcjA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@swc/core-linux-x64-musl@1.15.26': - resolution: {integrity: sha512-w8erqMHsVcdGwUfJxF6LaiTuPoKnyLOcUbhLcxiXrlLt5MLjtlgcIeUY/NWK/oPoyqkgH+/i8pOJnMTxvl83ZQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@swc/core-win32-arm64-msvc@1.15.26': - resolution: {integrity: sha512-uDCWCNpUiqkbvPmsuPUTn/P7ag9SqNXD2JT/W3dUu7yZ2krzN+nmmoQ2xRX63/J6RYiHI7aT4jo7Z++lsljlPA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.15.26': - resolution: {integrity: sha512-2k1ax1QmmqLEnpC0uRCw7OXhBfyvdPqERBXupDasjYbChT6ZSO/uha28Bp38cw0viKIG79L27aTDkbkABsMW3w==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.15.26': - resolution: {integrity: sha512-aUuYecSEGa4SUSdyCWaI/vk8jdseifYnsF1GZQx2+piL8GIuT/5QrVcFfmes4Iwy7FIVXxtzD063z/FfpZ7K7w==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.15.26': - resolution: {integrity: sha512-tglZGyx8N5PC+x1Nd/JrZxqpqlcZoSuG9gTDKO6AuFToFiVB3uS8HvbKFuO7g3lJzvFf9riAb94xs9HU2UhAHQ==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': '>=0.5.17' - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/types@0.1.26': - resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} - '@tailwindcss/node@4.2.2': resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} @@ -1273,11 +1180,18 @@ packages: '@uppercod/css-to-object@1.1.1': resolution: {integrity: sha512-dCTxxolI6fu28lzNRVwd7CzJV8EbARITFyCbP/JqLHYLfWHY7GJqXHDdk0GbtfXvsZosPCvjOE4dOIMT4XDFZQ==} - '@vitejs/plugin-react-swc@4.3.0': - resolution: {integrity: sha512-mOkXCII839dHyAt/gpoSlm28JIVDwhZ6tnG6wJxUy2bmOx7UaPjvOyIDf3SFv5s7Eo7HVaq6kRcu6YMEzt5Z7w==} + '@vitejs/plugin-react@6.0.1': + resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^4 || ^5 || ^6 || ^7 || ^8 + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true '@vitest/coverage-v8@4.1.4': resolution: {integrity: sha512-x7FptB5oDruxNPDNY2+S8tCh0pcq7ymCe1gTHcsp733jYjrJl8V1gMUlVysuCD9Kz46Xz9t1akkv08dPcYDs1w==} @@ -3789,66 +3703,6 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@swc/core-darwin-arm64@1.15.26': - optional: true - - '@swc/core-darwin-x64@1.15.26': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.15.26': - optional: true - - '@swc/core-linux-arm64-gnu@1.15.26': - optional: true - - '@swc/core-linux-arm64-musl@1.15.26': - optional: true - - '@swc/core-linux-ppc64-gnu@1.15.26': - optional: true - - '@swc/core-linux-s390x-gnu@1.15.26': - optional: true - - '@swc/core-linux-x64-gnu@1.15.26': - optional: true - - '@swc/core-linux-x64-musl@1.15.26': - optional: true - - '@swc/core-win32-arm64-msvc@1.15.26': - optional: true - - '@swc/core-win32-ia32-msvc@1.15.26': - optional: true - - '@swc/core-win32-x64-msvc@1.15.26': - optional: true - - '@swc/core@1.15.26': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.26 - optionalDependencies: - '@swc/core-darwin-arm64': 1.15.26 - '@swc/core-darwin-x64': 1.15.26 - '@swc/core-linux-arm-gnueabihf': 1.15.26 - '@swc/core-linux-arm64-gnu': 1.15.26 - '@swc/core-linux-arm64-musl': 1.15.26 - '@swc/core-linux-ppc64-gnu': 1.15.26 - '@swc/core-linux-s390x-gnu': 1.15.26 - '@swc/core-linux-x64-gnu': 1.15.26 - '@swc/core-linux-x64-musl': 1.15.26 - '@swc/core-win32-arm64-msvc': 1.15.26 - '@swc/core-win32-ia32-msvc': 1.15.26 - '@swc/core-win32-x64-msvc': 1.15.26 - - '@swc/counter@0.1.3': {} - - '@swc/types@0.1.26': - dependencies: - '@swc/counter': 0.1.3 - '@tailwindcss/node@4.2.2': dependencies: '@jridgewell/remapping': 2.3.5 @@ -4141,13 +3995,10 @@ snapshots: '@uppercod/css-to-object@1.1.1': {} - '@vitejs/plugin-react-swc@4.3.0(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': + '@vitejs/plugin-react@6.0.1(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - '@swc/core': 1.15.26 vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) - transitivePeerDependencies: - - '@swc/helpers' '@vitest/coverage-v8@4.1.4(vitest@4.1.4)': dependencies: From c4a4220448df1f949d84adc745b92465f5838ff9 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Thu, 23 Apr 2026 21:37:19 +0200 Subject: [PATCH 40/57] fix backend build (#177) --- .../_dot_vercel_copy/output/functions/api.func/.vc-config.json | 1 + apps/backend/vercel.json | 2 +- apps/frontend/vercel.json | 2 -- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/backend/_dot_vercel_copy/output/functions/api.func/.vc-config.json b/apps/backend/_dot_vercel_copy/output/functions/api.func/.vc-config.json index acaf927d..5b8cb30a 100644 --- a/apps/backend/_dot_vercel_copy/output/functions/api.func/.vc-config.json +++ b/apps/backend/_dot_vercel_copy/output/functions/api.func/.vc-config.json @@ -1,4 +1,5 @@ { + "runtime": "nodejs24.x", "handler": "router.js", "launcherType": "Nodejs" } diff --git a/apps/backend/vercel.json b/apps/backend/vercel.json index addf7bdd..34a769a4 100644 --- a/apps/backend/vercel.json +++ b/apps/backend/vercel.json @@ -1,6 +1,6 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", - "buildCommand": "cd ../../ && git clean ./apps -fx && pnpm run build:packages && pnpm --filter ./apps/backend/ --legacy deploy ./apps/deployment/ && mv ./apps/deployment/node_modules/ ./apps/backend/node_modules/ && ./vercel-preparation.sh", + "buildCommand": "cd ../../ && git clean ./apps -fx && pnpm run build:packages && pnpm --filter ./apps/backend/ --legacy --prod deploy ./apps/deployment/ && mv ./apps/deployment/node_modules/ ./apps/backend/node_modules/ && ./vercel-preparation.sh", "redirects": [ { "source": "/", diff --git a/apps/frontend/vercel.json b/apps/frontend/vercel.json index 6ed94648..d9bd05cb 100644 --- a/apps/frontend/vercel.json +++ b/apps/frontend/vercel.json @@ -1,6 +1,4 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", - "installCommand": "cd ../../ && git clean ./apps -fx && pnpm install && pnpm run build:packages && rm -rf ./apps/frontend/node_modules && pnpm --filter ./apps/frontend/ --legacy deploy ./apps/deployment/ && mv ./apps/deployment/node_modules/ ./apps/frontend/node_modules/", - "buildCommand": "pnpm run build", "outputDirectory": "build" } From c3f338780bc8caa64f380d975003410a63b9542d Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Sat, 25 Apr 2026 12:24:58 +0200 Subject: [PATCH 41/57] fix login, unify backend and frontend in 1 vercel project (#180) --- .github/CONTRIBUTING.md | 1 - .github/workflows/ci.yml | 5 ----- apps/backend/vercel.json | 6 ------ apps/frontend/src/constants.ts | 6 +----- apps/frontend/src/pages/Home/Home.tsx | 2 +- vercel-preparation.sh | 6 +++++- 6 files changed, 7 insertions(+), 19 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 002e4576..0ad080bd 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -5,7 +5,6 @@ To set up the project GitHub-Stats-Extended locally, run the following commands: ```bash -./vercel-preparation.sh pnpm install pnpm run build:packages pnpm run dev:frontend diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 63eedac3..2ca6ea81 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,11 +33,6 @@ jobs: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - name: Run vercel-preparation.sh - run: | - chmod +x ./vercel-preparation.sh - ./vercel-preparation.sh - - name: Install Dependencies uses: ./.github/actions/install-dependencies with: diff --git a/apps/backend/vercel.json b/apps/backend/vercel.json index 34a769a4..af0b1da5 100644 --- a/apps/backend/vercel.json +++ b/apps/backend/vercel.json @@ -6,11 +6,5 @@ "source": "/", "destination": "https://github.com/stats-organization/github-stats-extended" } - ], - "rewrites": [ - { - "source": "/frontend/:match*", - "destination": "https://gse-frontend-preview.vercel.app/:match*" - } ] } diff --git a/apps/frontend/src/constants.ts b/apps/frontend/src/constants.ts index b54412f7..8cc8f68c 100644 --- a/apps/frontend/src/constants.ts +++ b/apps/frontend/src/constants.ts @@ -1,12 +1,8 @@ -const PROD = false as boolean; - export const USE_LOGGER = true as boolean; export const CLIENT_ID = "Ov23lilAc5biyyRY0K1u"; -export const HOST = PROD - ? "github-stats-extended.vercel.app" - : "github-stats-extended-preview.vercel.app"; +export const HOST = window.location.host; const REDIRECT_URI = `https://${HOST}/frontend`; diff --git a/apps/frontend/src/pages/Home/Home.tsx b/apps/frontend/src/pages/Home/Home.tsx index a7b0b665..0372aac3 100644 --- a/apps/frontend/src/pages/Home/Home.tsx +++ b/apps/frontend/src/pages/Home/Home.tsx @@ -2,7 +2,7 @@ import axios from "axios"; import { useEffect, useMemo, useRef, useState } from "react"; import type { JSX } from "react"; import { useDispatch } from "react-redux"; -import BounceLoader from "react-spinners/BounceLoader"; +import { BounceLoader } from "react-spinners"; import { v4 as uuidv4 } from "uuid"; import { authenticate } from "../../api/user"; diff --git a/vercel-preparation.sh b/vercel-preparation.sh index 29b82d84..410356e2 100755 --- a/vercel-preparation.sh +++ b/vercel-preparation.sh @@ -12,4 +12,8 @@ cp -RP apps/backend/. apps/backend-copy/ # `shopt` includes dot-files in the `mv` operation (shopt -s dotglob && mv apps/backend-copy/* apps/backend/.vercel/output/functions/api.func/) cp -RP apps/backend/.vercel/output/functions/api.func/_dot_vercel_copy/output apps/backend/.vercel/ -rm -rf apps/backend/node_modules +rm -rf apps/deployment +pnpm install +pnpm build:frontend +mkdir -p apps/backend/.vercel/output/static/frontend/ +cp -RP apps/frontend/build/. apps/backend/.vercel/output/static/frontend/ From 609578da0c8d366c7c7d48777d83880081c70f17 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Apr 2026 12:32:52 +0200 Subject: [PATCH 42/57] build(deps-dev): Bump typescript from 6.0.2 to 6.0.3 in the typescript group (#179) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the typescript group with 1 update: [typescript](https://github.com/microsoft/TypeScript). Updates `typescript` from 6.0.2 to 6.0.3
Release notes

Sourced from typescript's releases.

TypeScript 6.0.3

For release notes, check out the release announcement blog post.

Downloads are available on:

Commits
  • 050880c Bump version to 6.0.3 and LKG
  • eeae9dd 🤖 Pick PR #63401 (Also check package name validity in...) into release-6.0 (#...
  • ad1c695 🤖 Pick PR #63368 (Harden ATA package name filtering) into release-6.0 (#63372)
  • 0725fb4 🤖 Pick PR #63310 (Mark class property initializers as...) into release-6.0 (#...
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=typescript&package-manager=npm_and_yarn&previous-version=6.0.2&new-version=6.0.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 94 +++++++++++++++++++++++++------------------------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index 16944569..0ebdfa8e 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "lint-staged": "16.4.0", "prettier": "3.8.3", "turbo": "2.9.6", - "typescript": "6.0.2", + "typescript": "6.0.3", "typescript-eslint": "8.58.2", "vitest": "catalog:default" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 90b79454..b5d3a9b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,10 +40,10 @@ importers: version: 10.2.0(jiti@2.6.1) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-import-x: specifier: 4.16.2 - version: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)) + version: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-jsdoc: specifier: 62.9.0 version: 62.9.0(eslint@10.2.0(jiti@2.6.1)) @@ -72,11 +72,11 @@ importers: specifier: 2.9.6 version: 2.9.6 typescript: - specifier: 6.0.2 - version: 6.0.2 + specifier: 6.0.3 + version: 6.0.3 typescript-eslint: specifier: 8.58.2 - version: 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + version: 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) vitest: specifier: catalog:default version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) @@ -2994,8 +2994,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -3843,40 +3843,40 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.58.2 eslint: 10.2.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.58.2 '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)': + '@typescript-eslint/project-service@8.58.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) '@typescript-eslint/types': 8.58.2 debug: 4.4.3 - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -3885,47 +3885,47 @@ snapshots: '@typescript-eslint/types': 8.58.2 '@typescript-eslint/visitor-keys': 8.58.2 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.3)': dependencies: - typescript: 6.0.2 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.58.2': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': + '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) + '@typescript-eslint/project-service': 8.58.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) '@typescript-eslint/types': 8.58.2 '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.58.2 '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) eslint: 10.2.0(jiti@2.6.1) - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -4513,7 +4513,7 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)): dependencies: debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) @@ -4524,11 +4524,11 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1)): + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1)): dependencies: '@package-json/types': 0.0.12 '@typescript-eslint/types': 8.58.2 @@ -4542,7 +4542,7 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -6005,9 +6005,9 @@ snapshots: try@1.0.3: {} - ts-api-utils@2.5.0(typescript@6.0.2): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 6.0.2 + typescript: 6.0.3 tslib@2.8.1: optional: true @@ -6064,18 +6064,18 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2): + typescript-eslint@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) eslint: 10.2.0(jiti@2.6.1) - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - typescript@6.0.2: {} + typescript@6.0.3: {} unbash@2.2.0: {} From 457c457cab1ac8801ac9d3748fe46837ead88614 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Apr 2026 12:33:42 +0200 Subject: [PATCH 43/57] build(deps-dev): Bump eslint-plugin-react-hooks from 7.0.1 to 7.1.0 in the eslint group (#178) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the eslint group with 1 update: [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks). Updates `eslint-plugin-react-hooks` from 7.0.1 to 7.1.0
Release notes

Sourced from eslint-plugin-react-hooks's releases.

eslint-plugin-react-hooks@7.1.0 (April 16, 2026)

This release adds ESLint v10 support, improves performance by skipping compilation for non-React files, and includes compiler lint improvements including better set-state-in-effect detection, improved ref validation, and more helpful error reporting.

Changelog

Sourced from eslint-plugin-react-hooks's changelog.

7.1.0

This release adds ESLint v10 support, improves performance by skipping compilation for non-React files, and includes compiler lint improvements including better set-state-in-effect detection, improved ref validation, and more helpful error reporting.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=eslint-plugin-react-hooks&package-manager=npm_and_yarn&previous-version=7.0.1&new-version=7.1.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 0ebdfa8e..cd787af4 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "eslint-plugin-import-x": "4.16.2", "eslint-plugin-jsdoc": "62.9.0", "eslint-plugin-react": "7.37.5", - "eslint-plugin-react-hooks": "7.0.1", + "eslint-plugin-react-hooks": "7.1.0", "globals": "17.5.0", "husky": "9.1.7", "knip": "6.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b5d3a9b7..5d5da2df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,8 +51,8 @@ importers: specifier: 7.37.5 version: 7.37.5(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-react-hooks: - specifier: 7.0.1 - version: 7.0.1(eslint@10.2.0(jiti@2.6.1)) + specifier: 7.1.0 + version: 7.1.0(eslint@10.2.0(jiti@2.6.1)) globals: specifier: 17.5.0 version: 17.5.0 @@ -1541,8 +1541,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.337: - resolution: {integrity: sha512-15gKW9mRUNP9RdzhedJNypFUxtYWSXohFz2nTLzM272xbRXHws68kNDzyATG3qej+vUj/7Sn9hf5XTDh0XK6/w==} + electron-to-chromium@1.5.339: + resolution: {integrity: sha512-Is+0BBHJ4NrdpAYiperrmp53pLywG/yV/6lIMTAnhxvzj/Cmn5Q/ogSHC6AKe7X+8kPLxxFk0cs5oc/3j/fxIg==} emoji-name-map@2.0.3: resolution: {integrity: sha512-3KBuQuhYkRtLd9utBKfTtclbWP3IytC1FNcXg+NKARltPSYpkg/MLiklGv4vLwl8A8jMQjdneXNBYx8k0rrg+g==} @@ -1653,11 +1653,11 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-react-hooks@7.0.1: - resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + eslint-plugin-react-hooks@7.1.0: + resolution: {integrity: sha512-LDicyhrRFrIaheDYryeM2W8gWyZXnAs4zIr2WVPiOSeTmIu2RjR4x/9N0xLaRWZ+9hssBDGo3AadcohuzAvSvg==} engines: {node: '>=18'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} @@ -4232,7 +4232,7 @@ snapshots: dependencies: baseline-browser-mapping: 2.10.19 caniuse-lite: 1.0.30001788 - electron-to-chromium: 1.5.337 + electron-to-chromium: 1.5.339 node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -4380,7 +4380,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.337: {} + electron-to-chromium@1.5.339: {} emoji-name-map@2.0.3: {} @@ -4566,7 +4566,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@7.0.1(eslint@10.2.0(jiti@2.6.1)): + eslint-plugin-react-hooks@7.1.0(eslint@10.2.0(jiti@2.6.1)): dependencies: '@babel/core': 7.29.0 '@babel/parser': 7.29.2 From eab14c89320027d8256b2dddecdc18ee609df475 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Sat, 25 Apr 2026 20:29:08 +0200 Subject: [PATCH 44/57] top-langs: add hide_values option (#181) based on https://github.com/anuraghazra/github-readme-stats/pull/4850 by @claw-explorer This PR adds a new hide_values query parameter for the Top Languages card that hides the percentage/byte display values while keeping progress bars and chart visualizations intact. top-langs5 top-langs top-langs2 top-langs3 top-langs4 --- apps/frontend/src/pages/Home/Home.tsx | 4 + .../src/pages/Home/getFullSuffix.test.ts | 1 + apps/frontend/src/pages/Home/getFullSuffix.ts | 6 ++ .../src/pages/Home/stages/Customize.tsx | 13 +++ docs/advanced_documentation.md | 1 + packages/core/src/api/top-langs.js | 2 + packages/core/src/cards/top-languages.js | 64 ++++++++++++-- packages/core/src/cards/types.d.ts | 1 + .../core/tests/renderTopLanguagesCard.test.js | 85 +++++++++++++++++++ 9 files changed, 168 insertions(+), 9 deletions(-) diff --git a/apps/frontend/src/pages/Home/Home.tsx b/apps/frontend/src/pages/Home/Home.tsx index 0372aac3..62a92bbb 100644 --- a/apps/frontend/src/pages/Home/Home.tsx +++ b/apps/frontend/src/pages/Home/Home.tsx @@ -76,6 +76,7 @@ export function HomeScreen({ stage, setStage }: HomeScreenProps): JSX.Element { >(); const [customTitle, setCustomTitle] = useState(""); const [langsCount, setLangsCount] = useState(); + const [hideValues, setHideValues] = useState(false); const [showAllStats, setShowAllStats] = useState(false); const [showIcons, setShowIcons] = useState(false); const [includeAllCommits, setIncludeAllCommits] = useState(true); @@ -121,6 +122,7 @@ export function HomeScreen({ stage, setStage }: HomeScreenProps): JSX.Element { descriptionLines, customTitle, langsCount, + hideValues, showAllStats, showIcons, includeAllCommits, @@ -306,6 +308,8 @@ export function HomeScreen({ stage, setStage }: HomeScreenProps): JSX.Element { setCustomTitle={setCustomTitle} langsCount={langsCount} setLangsCount={setLangsCount} + hideValues={hideValues} + setHideValues={setHideValues} showAllStats={showAllStats} setShowAllStats={setShowAllStats} showIcons={showIcons} diff --git a/apps/frontend/src/pages/Home/getFullSuffix.test.ts b/apps/frontend/src/pages/Home/getFullSuffix.test.ts index aa22224f..5351cb9f 100644 --- a/apps/frontend/src/pages/Home/getFullSuffix.test.ts +++ b/apps/frontend/src/pages/Home/getFullSuffix.test.ts @@ -22,6 +22,7 @@ const baseOptions = { descriptionLines: undefined, customTitle: "", langsCount: undefined, + hideValues: false, showAllStats: false, showIcons: false, includeAllCommits: false, diff --git a/apps/frontend/src/pages/Home/getFullSuffix.ts b/apps/frontend/src/pages/Home/getFullSuffix.ts index b333b429..e6dc776d 100644 --- a/apps/frontend/src/pages/Home/getFullSuffix.ts +++ b/apps/frontend/src/pages/Home/getFullSuffix.ts @@ -19,6 +19,7 @@ interface Options { descriptionLines: number | undefined; customTitle: string; langsCount: number | undefined; + hideValues: boolean; showAllStats: boolean; showIcons: boolean; includeAllCommits: boolean; @@ -41,6 +42,7 @@ export function getFullSuffix({ descriptionLines, customTitle, langsCount, + hideValues, showAllStats, showIcons, includeAllCommits, @@ -138,6 +140,10 @@ export function getFullSuffix({ fullSuffix += `&langs_count=${langsCount}`; } + if (hideValues && selectedCard === CardType.TOP_LANGS) { + fullSuffix += `&hide_values=true`; + } + if (showAllStats && selectedCard === CardType.STATS) { fullSuffix += `&show=reviews,discussions_started,discussions_answered,prs_merged,prs_merged_percentage,prs_commented,prs_reviewed,issues_commented`; } diff --git a/apps/frontend/src/pages/Home/stages/Customize.tsx b/apps/frontend/src/pages/Home/stages/Customize.tsx index 43b65f18..9443c9f0 100644 --- a/apps/frontend/src/pages/Home/stages/Customize.tsx +++ b/apps/frontend/src/pages/Home/stages/Customize.tsx @@ -47,6 +47,8 @@ interface CustomizeStageProps { setCustomTitle: Updater; langsCount: number | undefined; setLangsCount: Updater; + hideValues: boolean; + setHideValues: Updater; showIcons: boolean; setShowIcons: Updater; showAllStats: boolean; @@ -87,6 +89,8 @@ export function CustomizeStage({ setCustomTitle, langsCount, setLangsCount, + hideValues, + setHideValues, showIcons, setShowIcons, showAllStats, @@ -321,6 +325,15 @@ export function CustomizeStage({ max={20} /> )} + {cardType === CardType.TOP_LANGS && ( + + )} {cardType === CardType.WAKATIME && ( { * @param {number} props.size Size of the programming language. * @param {number} props.totalSize Total size of all languages. * @param {string} props.statsFormat Stats format. + * @param {boolean=} props.hideValues Whether to hide stats values. * @param {number} props.index Index of the programming language. * @returns {string} Programming language SVG node. */ @@ -232,10 +233,11 @@ const createProgressTextNode = ({ size, totalSize, statsFormat, + hideValues, index, }) => { const staggerDelay = (index + 3) * 150; - const paddingRight = 95; + const paddingRight = hideValues ? CARD_PADDING * 2 : 95; const progressTextX = width - paddingRight + 10; const progressWidth = width - paddingRight; @@ -245,7 +247,7 @@ const createProgressTextNode = ({ return ` ${name} - ${displayValue} + ${hideValues ? "" : `${displayValue}`} ${createProgressNode({ x: 0, y: 25, @@ -266,6 +268,7 @@ const createProgressTextNode = ({ * @param {Lang} props.lang Programming language object. * @param {number} props.totalSize Total size of all languages. * @param {boolean=} props.hideProgress Whether to hide percentage. + * @param {boolean=} props.hideValues Whether to hide stats values (percentages/bytes). * @param {string=} props.statsFormat Stats format * @param {number} props.index Index of the programming language. * @returns {string} Compact layout programming language SVG node. @@ -274,6 +277,7 @@ const createCompactLangNode = ({ lang, totalSize, hideProgress, + hideValues, statsFormat = "percentages", index, }) => { @@ -287,7 +291,7 @@ const createCompactLangNode = ({ - ${lang.name} ${hideProgress ? "" : displayValue} + ${lang.name} ${hideProgress || hideValues ? "" : displayValue} `; @@ -300,6 +304,7 @@ const createCompactLangNode = ({ * @param {Lang[]} props.langs Array of programming languages. * @param {number} props.totalSize Total size of all languages. * @param {boolean=} props.hideProgress Whether to hide percentage. + * @param {boolean=} props.hideValues Whether to hide stats values. * @param {string=} props.statsFormat Stats format * @returns {string} Programming languages SVG node. */ @@ -307,6 +312,7 @@ const createLanguageTextNode = ({ langs, totalSize, hideProgress, + hideValues, statsFormat, }) => { const longestLang = getLongestLang(langs); @@ -318,6 +324,7 @@ const createLanguageTextNode = ({ lang, totalSize, hideProgress, + hideValues, statsFormat, index, }), @@ -344,16 +351,23 @@ const createLanguageTextNode = ({ * @param {object} props Function properties. * @param {Lang[]} props.langs Array of programming languages. * @param {number} props.totalSize Total size of all languages. + * @param {boolean=} props.hideValues Whether to hide stats values. * @param {string} props.statsFormat Stats format * @returns {string} Donut layout programming language SVG node. */ -const createDonutLanguagesNode = ({ langs, totalSize, statsFormat }) => { +const createDonutLanguagesNode = ({ + langs, + totalSize, + hideValues, + statsFormat, +}) => { return flexLayout({ items: langs.map((lang, index) => { return createCompactLangNode({ lang, totalSize, hideProgress: false, + hideValues, statsFormat, index, }); @@ -371,6 +385,7 @@ const createDonutLanguagesNode = ({ langs, totalSize, statsFormat }) => { * @param {number} totalLanguageSize Total size of all languages. * @param progBarBgColor Color of the background of progress bar. * @param {string} statsFormat Stats format. + * @param {boolean=} hideValues Whether to hide stats values. * @returns {string} Normal layout card SVG object. */ const renderNormalLayout = ( @@ -379,6 +394,7 @@ const renderNormalLayout = ( totalLanguageSize, progBarBgColor, statsFormat, + hideValues, ) => { return flexLayout({ items: langs.map((lang, index) => { @@ -389,6 +405,7 @@ const renderNormalLayout = ( size: lang.size, totalSize: totalLanguageSize, statsFormat, + hideValues, index, progBarBgColor, }); @@ -406,6 +423,7 @@ const renderNormalLayout = ( * @param {number} totalLanguageSize Total size of all languages. * @param {boolean=} hideProgress Whether to hide progress bar. * @param {string} statsFormat Stats format. + * @param {boolean=} hideValues Whether to hide stats values. * @returns {string} Compact layout card SVG object. */ const renderCompactLayout = ( @@ -414,6 +432,7 @@ const renderCompactLayout = ( totalLanguageSize, hideProgress, statsFormat = "percentages", + hideValues, ) => { const paddingRight = 50; const offsetWidth = width - paddingRight; @@ -461,6 +480,7 @@ const renderCompactLayout = ( totalSize: totalLanguageSize, hideProgress, statsFormat, + hideValues, })} `; @@ -472,9 +492,15 @@ const renderCompactLayout = ( * @param {Lang[]} langs Array of programming languages. * @param {number} totalLanguageSize Total size of all languages. * @param {string} statsFormat Stats format. + * @param {boolean=} hideValues Whether to hide stats values. * @returns {string} Compact layout card SVG object. */ -const renderDonutVerticalLayout = (langs, totalLanguageSize, statsFormat) => { +const renderDonutVerticalLayout = ( + langs, + totalLanguageSize, + statsFormat, + hideValues, +) => { // Donut vertical chart radius and total length const radius = 80; const totalCircleLength = getCircleLength(radius); @@ -531,6 +557,7 @@ const renderDonutVerticalLayout = (langs, totalLanguageSize, statsFormat) => { totalSize: totalLanguageSize, hideProgress: false, statsFormat, + hideValues, })} @@ -544,9 +571,10 @@ const renderDonutVerticalLayout = (langs, totalLanguageSize, statsFormat) => { * @param {Lang[]} langs Array of programming languages. * @param {number} totalLanguageSize Total size of all languages. * @param {string} statsFormat Stats format. + * @param {boolean=} hideValues Whether to hide stats values. * @returns {string} Compact layout card SVG object. */ -const renderPieLayout = (langs, totalLanguageSize, statsFormat) => { +const renderPieLayout = (langs, totalLanguageSize, statsFormat, hideValues) => { // Pie chart radius and center coordinates const radius = 90; const centerX = 150; @@ -628,6 +656,7 @@ const renderPieLayout = (langs, totalLanguageSize, statsFormat) => { totalSize: totalLanguageSize, hideProgress: false, statsFormat, + hideValues, })} @@ -679,9 +708,16 @@ const createDonutPaths = (cx, cy, radius, percentages) => { * @param {number} width Card width. * @param {number} totalLanguageSize Total size of all languages. * @param {string} statsFormat Stats format. + * @param {boolean=} hideValues Whether to hide stats values. * @returns {string} Donut layout card SVG object. */ -const renderDonutLayout = (langs, width, totalLanguageSize, statsFormat) => { +const renderDonutLayout = ( + langs, + width, + totalLanguageSize, + statsFormat, + hideValues, +) => { const centerX = width / 3; const centerY = width / 3; const radius = centerX - 60; @@ -724,7 +760,7 @@ const renderDonutLayout = (langs, width, totalLanguageSize, statsFormat) => { return ` - ${createDonutLanguagesNode({ langs, totalSize: totalLanguageSize, statsFormat })} + ${createDonutLanguagesNode({ langs, totalSize: totalLanguageSize, hideValues, statsFormat })} @@ -800,6 +836,7 @@ const renderTopLanguages = (topLangs, options = {}) => { prog_bar_bg_color, hide, hide_progress, + hide_values, theme, layout, custom_title, @@ -850,13 +887,19 @@ const renderTopLanguages = (topLangs, options = {}) => { }); } else if (layout === "pie") { height = calculatePieLayoutHeight(langs.length); - finalLayout = renderPieLayout(langs, totalLanguageSize, stats_format); + finalLayout = renderPieLayout( + langs, + totalLanguageSize, + stats_format, + hide_values, + ); } else if (layout === "donut-vertical") { height = calculateDonutVerticalLayoutHeight(langs.length); finalLayout = renderDonutVerticalLayout( langs, totalLanguageSize, stats_format, + hide_values, ); } else if (layout === "compact" || hide_progress == true) { height = @@ -868,6 +911,7 @@ const renderTopLanguages = (topLangs, options = {}) => { totalLanguageSize, hide_progress, stats_format, + hide_values, ); } else if (layout === "donut") { height = calculateDonutLayoutHeight(langs.length); @@ -877,6 +921,7 @@ const renderTopLanguages = (topLangs, options = {}) => { width, totalLanguageSize, stats_format, + hide_values, ); } else { finalLayout = renderNormalLayout( @@ -885,6 +930,7 @@ const renderTopLanguages = (topLangs, options = {}) => { totalLanguageSize, fallbackColor(prog_bar_bg_color, "#ddd"), stats_format, + hide_values, ); } diff --git a/packages/core/src/cards/types.d.ts b/packages/core/src/cards/types.d.ts index 1d72262e..08b9f933 100644 --- a/packages/core/src/cards/types.d.ts +++ b/packages/core/src/cards/types.d.ts @@ -53,6 +53,7 @@ export type TopLangOptions = CommonOptions & { langs_count: number; disable_animations: boolean; hide_progress: boolean; + hide_values: boolean; prog_bar_bg_color: string; stats_format: "percentages" | "bytes"; }; diff --git a/packages/core/tests/renderTopLanguagesCard.test.js b/packages/core/tests/renderTopLanguagesCard.test.js index 3cd8c63e..d80e2860 100644 --- a/packages/core/tests/renderTopLanguagesCard.test.js +++ b/packages/core/tests/renderTopLanguagesCard.test.js @@ -909,4 +909,89 @@ describe("Test renderTopLanguages", () => { "css 100.0 B", ); }); + + it("should hide stats values when hide_values is true (compact layout)", () => { + document.body.innerHTML = renderTopLanguages(langs, { + layout: "compact", + hide_values: true, + }); + + expect(queryAllByTestId(document.body, "lang-name")[0]).toHaveTextContent( + "HTML", + ); + + expect(queryAllByTestId(document.body, "lang-name")[1]).toHaveTextContent( + "javascript", + ); + }); + + it("should hide stats values when hide_values is true (normal layout)", () => { + document.body.innerHTML = renderTopLanguages(langs, { + hide_values: true, + }); + + expect(queryAllByTestId(document.body, "lang-name")[0]).toHaveTextContent( + "HTML", + ); + + expect(queryAllByTestId(document.body, "lang-name").length).toBe(3); + }); + + it("should hide stats values when hide_values is true (donut layout)", () => { + document.body.innerHTML = renderTopLanguages(langs, { + layout: "donut", + hide_values: true, + }); + + expect(queryAllByTestId(document.body, "lang-name")[0]).toHaveTextContent( + "HTML", + ); + expect(queryAllByTestId(document.body, "lang-name")[1]).toHaveTextContent( + "javascript", + ); + expect(queryAllByTestId(document.body, "lang-name")[2]).toHaveTextContent( + "css", + ); + }); + + it("should hide stats values when hide_values is true (pie layout)", () => { + document.body.innerHTML = renderTopLanguages(langs, { + layout: "pie", + hide_values: true, + }); + + expect(queryAllByTestId(document.body, "lang-name")[0]).toHaveTextContent( + "HTML", + ); + expect(queryAllByTestId(document.body, "lang-name")[1]).toHaveTextContent( + "javascript", + ); + expect(queryAllByTestId(document.body, "lang-name")[2]).toHaveTextContent( + "css", + ); + expect(queryAllByTestId(document.body, "lang-pie")[0]).toHaveAttribute( + "size", + "40", + ); + + document.body.innerHTML = renderTopLanguages( + { HTML: langs.HTML }, + { + layout: "pie", + hide_values: true, + }, + ); + + expect(queryAllByTestId(document.body, "lang-name")[0]).toHaveTextContent( + "HTML", + ); + expect(queryAllByTestId(document.body, "lang-pie")).toHaveLength(1); + expect(queryAllByTestId(document.body, "lang-pie")[0]).toHaveAttribute( + "size", + "100", + ); + expect(queryAllByTestId(document.body, "lang-pie")[0].tagName).toBe( + "circle", + ); + }); }); From a963caaf5bca971162c82fb330ad7f0696f44861 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Mon, 27 Apr 2026 08:34:56 +0200 Subject: [PATCH 45/57] small refactoring: use constants in layout logic (#186) --- packages/core/src/cards/gist.js | 7 +++++-- packages/core/src/cards/repo.js | 20 +++++++++++++------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/core/src/cards/gist.js b/packages/core/src/cards/gist.js index b630dad8..c8d6437d 100644 --- a/packages/core/src/cards/gist.js +++ b/packages/core/src/cards/gist.js @@ -16,6 +16,7 @@ import { const ICON_SIZE = 16; const CARD_DEFAULT_WIDTH = 400; +const X_OFFSET = 25; const HEADER_MAX_LENGTH = 35; /** @@ -62,7 +63,9 @@ const renderGistCard = (gistData, options = {}) => { const multiLineDescription = wrapTextMultiline(desc, lineWidth, linesLimit); const descriptionLines = multiLineDescription.length; const descriptionSvg = multiLineDescription - .map((line) => `${encodeHTML(line)}`) + .map( + (line) => `${encodeHTML(line)}`, + ) .join(""); const lineHeight = descriptionLines > 3 ? 12 : 10; @@ -128,7 +131,7 @@ const renderGistCard = (gistData, options = {}) => { card.setHideBorder(hide_border); return card.render(` - + ${descriptionSvg} diff --git a/packages/core/src/cards/repo.js b/packages/core/src/cards/repo.js index 6b1afb50..d5bab6f1 100644 --- a/packages/core/src/cards/repo.js +++ b/packages/core/src/cards/repo.js @@ -19,6 +19,8 @@ import { createTextNode } from "./stats.js"; const ICON_SIZE = 16; const DESCRIPTION_LINE_WIDTH = 59; +const CARD_DEFAULT_WIDTH = 400; +const X_OFFSET = 25; const DESCRIPTION_MAX_LINES = 3; /** @@ -96,8 +98,8 @@ const renderRepoCard = (repo, options = {}) => { card_width_input && !isNaN(card_width_input) ? card_width_input : show.length >= 2 - ? 430 - : 400; + ? CARD_DEFAULT_WIDTH + 30 + : CARD_DEFAULT_WIDTH; const i18n = new I18n({ locale, @@ -182,7 +184,9 @@ const renderRepoCard = (repo, options = {}) => { const desc = parseEmojis(description || "No description provided"); const multiLineDescription = wrapTextMultiline( desc, - Math.round((card_width - 400) / 5.93 + DESCRIPTION_LINE_WIDTH), + Math.round( + (card_width - CARD_DEFAULT_WIDTH) / 5.93 + DESCRIPTION_LINE_WIDTH, + ), descriptionMaxLines, ); const descriptionLinesCount = description_lines_count @@ -190,7 +194,9 @@ const renderRepoCard = (repo, options = {}) => { : multiLineDescription.length; const descriptionSvg = multiLineDescription - .map((line) => `${encodeHTML(line)}`) + .map( + (line) => `${encodeHTML(line)}`, + ) .join(""); const extraHeight = Object.keys(STATS).length @@ -298,19 +304,19 @@ const renderRepoCard = (repo, options = {}) => { getBadgeSVG( i18n.t("repocard.template"), colors.textColor, - card_width - 400, + card_width - CARD_DEFAULT_WIDTH, ) : isArchived ? // @ts-ignore getBadgeSVG( i18n.t("repocard.archived"), colors.textColor, - card_width - 400, + card_width - CARD_DEFAULT_WIDTH, ) : "" } - + ${descriptionSvg} From f0c250a9545c02f75b86109269d7a68a8e3b89f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:08:17 +0200 Subject: [PATCH 46/57] build(deps): Bump uuid from 13.0.0 to 14.0.0 (#185) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [uuid](https://github.com/uuidjs/uuid) from 13.0.0 to 14.0.0.
Release notes

Sourced from uuid's releases.

v14.0.0

14.0.0 (2026-04-19)

⚠ BREAKING CHANGES

  • expect crypto to be global everywhere (requires node@20+) (#935)
  • drop node@18 support (#934)

Features

Bug Fixes

  • expect crypto to be global everywhere (requires node@20+) (#935) (f2c235f)
  • Use GITHUB_TOKEN for release-please and enable npm provenance (#925) (ffa3138)
Changelog

Sourced from uuid's changelog.

14.0.0 (2026-04-19)

Security

  • Fixes GHSA-w5hq-g745-h8pq: v3(), v5(), and v6() did not validate that writes would remain within the bounds of a caller-supplied buffer, allowing out-of-bounds writes when an invalid offset was provided. A RangeError is now thrown if offset < 0 or offset + 16 > buf.length.

⚠ BREAKING CHANGES

  • crypto is now expected to be globally defined (requires node@20+) (#935)
  • drop node@18 support (#934)
  • upgrade minimum supported TypeScript version to 5.4.3, in keeping with the project's policy of supporting TypeScript versions released within the last two years
Commits
  • 7c1ea08 chore(main): release 14.0.0 (#926)
  • 3d2c5b0 Merge commit from fork
  • f2c235f fix!: expect crypto to be global everywhere (requires node@20+) (#935)
  • 529ef08 chore: upgrade TypeScript and fixup types (#927)
  • 086fd79 chore: update dependencies (#933)
  • dc4ddb8 feat!: drop node@18 support (#934)
  • 0f1f9c9 chore: switch to Biome for parsing and linting (#932)
  • e2879e6 chore: use maintained version of npm-run-all (#930)
  • ffa3138 fix: Use GITHUB_TOKEN for release-please and enable npm provenance (#925)
  • 0423d49 docs: remove obsolete v1 option notes (#915)
  • Additional commits viewable in compare view
Maintainer changes

This version was pushed to npm by GitHub Actions, a new releaser for uuid since your current version.


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=uuid&package-manager=npm_and_yarn&previous-version=13.0.0&new-version=14.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/frontend/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 2280f2a6..3e54db5e 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -29,7 +29,7 @@ "react-toastify": "^11.0.5", "redux": "^5.0.1", "save-svg-as-png": "^1.4.17", - "uuid": "^13.0.0" + "uuid": "^14.0.0" }, "devDependencies": { "@types/react": "19.2.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d5da2df..2fe34035 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -157,8 +157,8 @@ importers: specifier: ^1.4.17 version: 1.4.17 uuid: - specifier: ^13.0.0 - version: 13.0.0 + specifier: ^14.0.0 + version: 14.0.0 devDependencies: '@types/react': specifier: 19.2.14 @@ -3035,8 +3035,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - uuid@13.0.0: - resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true vary@1.1.2: @@ -6130,7 +6130,7 @@ snapshots: dependencies: react: 19.2.5 - uuid@13.0.0: {} + uuid@14.0.0: {} vary@1.1.2: {} From c401be4d6c164da160930baa8c5e8665ebc0fe89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:09:18 +0200 Subject: [PATCH 47/57] build(deps): Bump vite from 8.0.8 to 8.0.9 in the vite group (#187) Bumps the vite group with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). Updates `vite` from 8.0.8 to 8.0.9
Release notes

Sourced from vite's releases.

v8.0.9

Please refer to CHANGELOG.md for details.

Changelog

Sourced from vite's changelog.

8.0.9 (2026-04-20)

Features

Bug Fixes

  • allow binding when strictPort is set but wildcard port is in use (#22150) (dfc8aa5)
  • build: emptyOutDir should happen for watch rebuilds (#22207) (ee52267)
  • bundled-dev: reject requests to HMR patch files in non potentially trustworthy origins (#22269) (868f141)
  • css: use unique key for cssEntriesMap to prevent same-basename collision (#22039) (374bb5d)
  • deps: update all non-major dependencies (#22219) (4cd0d67)
  • deps: update all non-major dependencies (#22268) (c28e9c1)
  • detect Deno workspace root (fix #22237) (#22238) (1b793c0)
  • dev: handle errors in watchChange hook (#22188) (fc08bda)
  • optimizer: handle more chars that will be sanitized (#22208) (3f24533)
  • skip fallback sourcemap generation for ?raw imports (#22148) (3ec9cda)

Documentation

Miscellaneous Chores

  • deps: update dependency dotenv-expand to v13 (#22271) (0a3887d)
Commits
  • ce729f5 release: v8.0.9
  • 605bb97 docs: update build CLI defaults (#22261)
  • c28e9c1 fix(deps): update all non-major dependencies (#22268)
  • 0a3887d chore(deps): update dependency dotenv-expand to v13 (#22271)
  • 868f141 fix(bundled-dev): reject requests to HMR patch files in non potentially trust...
  • 3ec9cda fix: skip fallback sourcemap generation for ?raw imports (#22148)
  • 3f24533 fix(optimizer): handle more chars that will be sanitized (#22208)
  • 1b793c0 fix: detect Deno workspace root (fix #22237) (#22238)
  • fc08bda fix(dev): handle errors in watchChange hook (#22188)
  • 374bb5d fix(css): use unique key for cssEntriesMap to prevent same-basename collision...
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=vite&package-manager=npm_and_yarn&previous-version=8.0.8&new-version=8.0.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 190 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 96 insertions(+), 96 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fe34035..416d9261 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: 4.1.4 version: 4.1.4 vite: - specifier: 8.0.8 - version: 8.0.8 + specifier: 8.0.9 + version: 8.0.9 vitest: specifier: 4.1.4 version: 4.1.4 @@ -79,7 +79,7 @@ importers: version: 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) vitest: specifier: catalog:default - version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) apps/backend: dependencies: @@ -104,7 +104,7 @@ importers: version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) apps/frontend: dependencies: @@ -119,7 +119,7 @@ importers: version: link:../../packages/core '@tailwindcss/vite': specifier: ^4.2.2 - version: 4.2.2(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.2.2(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) axios: specifier: ^1 version: 1.15.0 @@ -168,7 +168,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 6.0.1 - version: 6.0.1(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 6.0.1(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -177,10 +177,10 @@ importers: version: 4.2.2 vite: specifier: catalog:default - version: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) + version: 8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) vitest: specifier: catalog:default - version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) packages/core: dependencies: @@ -217,7 +217,7 @@ importers: version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) packages: @@ -607,8 +607,8 @@ packages: '@oxc-project/types@0.121.0': resolution: {integrity: sha512-CGtOARQb9tyv7ECgdAlFxi0Fv7lmzvmlm2rpD/RdijOO9rfk/JvB1CjT8EnoD+tjna/IYgKKw3IV7objRb+aYw==} - '@oxc-project/types@0.124.0': - resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==} + '@oxc-project/types@0.126.0': + resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} '@oxc-resolver/binding-android-arm-eabi@11.19.1': resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} @@ -737,103 +737,103 @@ packages: react-redux: optional: true - '@rolldown/binding-android-arm64@1.0.0-rc.15': - resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==} + '@rolldown/binding-android-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.15': - resolution: {integrity: sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.15': - resolution: {integrity: sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==} + '@rolldown/binding-darwin-x64@1.0.0-rc.16': + resolution: {integrity: sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.15': - resolution: {integrity: sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.16': + resolution: {integrity: sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': - resolution: {integrity: sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': + resolution: {integrity: sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': - resolution: {integrity: sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': - resolution: {integrity: sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': + resolution: {integrity: sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': - resolution: {integrity: sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': - resolution: {integrity: sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': - resolution: {integrity: sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': - resolution: {integrity: sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': + resolution: {integrity: sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': - resolution: {integrity: sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': - resolution: {integrity: sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==} - engines: {node: '>=14.0.0'} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': + resolution: {integrity: sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': - resolution: {integrity: sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': + resolution: {integrity: sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': - resolution: {integrity: sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': + resolution: {integrity: sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.15': - resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==} + '@rolldown/pluginutils@1.0.0-rc.16': + resolution: {integrity: sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA==} '@rolldown/pluginutils@1.0.0-rc.7': resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} @@ -2697,8 +2697,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.0.0-rc.15: - resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==} + rolldown@1.0.0-rc.16: + resolution: {integrity: sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3043,8 +3043,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite@8.0.8: - resolution: {integrity: sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==} + vite@8.0.9: + resolution: {integrity: sha512-t7g7GVRpMXjNpa67HaVWI/8BWtdVIQPCL2WoozXXA7LBGEFK4AkkKkHx2hAQf5x1GZSlcmEDPkVLSGahxnEEZw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3559,7 +3559,7 @@ snapshots: '@oxc-project/types@0.121.0': {} - '@oxc-project/types@0.124.0': {} + '@oxc-project/types@0.126.0': {} '@oxc-resolver/binding-android-arm-eabi@11.19.1': optional: true @@ -3644,56 +3644,56 @@ snapshots: react: 19.2.5 react-redux: 9.2.0(@types/react@19.2.14)(react@19.2.5)(redux@5.0.1) - '@rolldown/binding-android-arm64@1.0.0-rc.15': + '@rolldown/binding-android-arm64@1.0.0-rc.16': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + '@rolldown/binding-darwin-arm64@1.0.0-rc.16': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.15': + '@rolldown/binding-darwin-x64@1.0.0-rc.16': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + '@rolldown/binding-freebsd-x64@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': optional: true - '@rolldown/pluginutils@1.0.0-rc.15': {} + '@rolldown/pluginutils@1.0.0-rc.16': {} '@rolldown/pluginutils@1.0.0-rc.7': {} @@ -3764,12 +3764,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - '@tailwindcss/vite@4.2.2(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.2(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@tailwindcss/node': 4.2.2 '@tailwindcss/oxide': 4.2.2 tailwindcss: 4.2.2 - vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) '@testing-library/dom@10.4.1': dependencies: @@ -3995,10 +3995,10 @@ snapshots: '@uppercod/css-to-object@1.1.1': {} - '@vitejs/plugin-react@6.0.1(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': + '@vitejs/plugin-react@6.0.1(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) '@vitest/coverage-v8@4.1.4(vitest@4.1.4)': dependencies: @@ -4012,7 +4012,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + vitest: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) '@vitest/expect@4.1.4': dependencies: @@ -4023,13 +4023,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.4(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.4(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) '@vitest/pretty-format@4.1.4': dependencies: @@ -5695,26 +5695,26 @@ snapshots: rfdc@1.4.1: {} - rolldown@1.0.0-rc.15: + rolldown@1.0.0-rc.16: dependencies: - '@oxc-project/types': 0.124.0 - '@rolldown/pluginutils': 1.0.0-rc.15 + '@oxc-project/types': 0.126.0 + '@rolldown/pluginutils': 1.0.0-rc.16 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.15 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.15 - '@rolldown/binding-darwin-x64': 1.0.0-rc.15 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.15 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.15 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.15 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.15 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.15 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.15 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.15 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.15 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.15 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.15 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15 + '@rolldown/binding-android-arm64': 1.0.0-rc.16 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.16 + '@rolldown/binding-darwin-x64': 1.0.0-rc.16 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.16 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.16 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.16 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.16 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.16 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.16 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.16 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.16 router@2.2.0: dependencies: @@ -6134,12 +6134,12 @@ snapshots: vary@1.1.2: {} - vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3): + vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.10 - rolldown: 1.0.0-rc.15 + rolldown: 1.0.0-rc.16 tinyglobby: 0.2.16 optionalDependencies: '@types/node': 24.12.2 @@ -6147,10 +6147,10 @@ snapshots: jiti: 2.6.1 yaml: 2.8.3 - vitest@4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)): + vitest@4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.4 - '@vitest/mocker': 4.1.4(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.4(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.4 '@vitest/runner': 4.1.4 '@vitest/snapshot': 4.1.4 @@ -6167,7 +6167,7 @@ snapshots: tinyexec: 1.1.1 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.12.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 34a1a59b..e4110694 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,7 +4,7 @@ packages: catalog: "@vitest/coverage-v8": 4.1.4 - vite: 8.0.8 + vite: 8.0.9 vitest: 4.1.4 minimumReleaseAge: 10080 From b4ae648153a962418f9d261391e3a40cd8aacc67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:13:33 +0200 Subject: [PATCH 48/57] build(deps): Bump axios from 1.15.0 to 1.15.1 in the axios group across 1 directory (#184) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the axios group with 1 update in the / directory: [axios](https://github.com/axios/axios). Updates `axios` from 1.15.0 to 1.15.1
Release notes

Sourced from axios's releases.

v1.15.1

This release ships a coordinated set of security hardening fixes across headers, body/redirect limits, multipart handling, and XSRF/prototype-pollution vectors, alongside a broad sweep of bug fixes, test migrations, and threat-model documentation updates.

🔒 Security Fixes

  • Header Injection Hardening: Tightened validation and sanitisation across request header construction to close the header-injection attack surface. (#10749)
  • CRLF Stripping in Multipart Headers: Correctly strips CR/LF from multipart header values to prevent injection via field names and filenames. (#10758)
  • Prototype Pollution / Auth Bypass: Replaced unsafe in checks with hasOwnProperty to prevent authentication bypass via prototype pollution on config objects, with additional regression tests. (#10761, #10760)
  • withXSRFToken Truthy Bypass: Short-circuits on any truthy non-boolean value, so an ambiguous config no longer silently leaks the XSRF token cross-origin. (#10762)
  • maxBodyLength With Zero Redirects: Enforces maxBodyLength even when maxRedirects is set to 0, closing a bypass path for oversized request bodies. (#10753)
  • Streamed Response maxContentLength Bypass: Applies maxContentLength to streamed responses that previously bypassed the cap. (#10754)
  • Follow-up CVE Completion: Completes an earlier incomplete CVE fix to fully close the regression window. (#10755)

🚀 New Features

  • AI-Based Docs Translations: Initial scaffold for AI-assisted translations of the documentation site. (#10705)
  • Location Request Header Type: Adds Location to CommonRequestHeadersList for accurate typing of redirect-aware requests. (#7528)

🐛 Bug Fixes

  • FormData Handling: Removes Content-Type when no boundary is present on FormData fetch requests, supports multi-select fields, cancels request.body instead of the source stream on fetch abort, and fixes a recursion bug in form-data serialisation. (#7314, #10676, #10702, #10726)
  • HTTP Adapter: Handles socket-only request errors without leaking keep-alive listeners. (#10576)
  • Progress Events: Clamps loaded to total for computable upload/download progress events. (#7458)
  • Types: Aligns runWhen type with the runtime behaviour in InterceptorManager and makes response header keys case-insensitive. (#7529, #10677)
  • buildFullPath: Uses strict equality in the base/relative URL check. (#7252)
  • AxiosURLSearchParams Regex: Improves the regex used for param serialisation to avoid edge-case mismatches. (#10736)
  • Resilient Value Parsing: Parses out header/config values instead of throwing on malformed input. (#10687)
  • Docs Artefact Cleanup: Removes the docs content that was incorrectly committed. (#10727)

🔧 Maintenance & Chores

  • Threat Model & Security Docs: Ongoing refinement of THREATMODEL.md, including Hopper security update, TLS and tag-replay wording, mitigation descriptions, decompression-bomb guidance, and further cleanup. (#10672, #10715, #10718, #10722, #10763, #10765)
  • Test Coverage & Migration: Expanded shouldBypassProxy coverage for wildcard/IPv6/edge cases, documented and tested AxiosError.status, and migrated progressEventReducer tests to Vitest. (#10723, #10725, #10741)
  • Type Refactor: Uses TypeScript utility types to deduplicate literal unions. (#7520)
  • Repo & CI: Adds CODEOWNERS, switches v1.x releases to an ephemeral release branch, and removes orphaned Bower support. (#10739, #10738, #10746)
  • Changelog Backfill: Added missing version entries to the changelog. (#10704)
  • Dependencies: Bumped follow-redirects (1.15.111.16.0) in root and docs, axios (1.14.01.15.0) in docs, and a group of 5 development dependencies. (#10717, #10716, #10684, #10709)

🌟 New Contributors

We are thrilled to welcome our new contributors. Thank you for helping improve axios:

Full Changelog

Changelog

Sourced from axios's changelog.

v1.15.1 - April 19, 2026

This release ships a coordinated set of security hardening fixes across headers, body/redirect limits, multipart handling, and XSRF/prototype-pollution vectors, alongside a broad sweep of bug fixes, test migrations, and threat-model documentation updates.

🔒 Security Fixes

  • Header Injection Hardening: Tightened validation and sanitisation across request header construction to close the header-injection attack surface. (#10749)

  • CRLF Stripping in Multipart Headers: Correctly strips CR/LF from multipart header values to prevent injection via field names and filenames. (#10758)

  • Prototype Pollution / Auth Bypass: Replaced unsafe in checks with hasOwnProperty to prevent authentication bypass via prototype pollution on config objects, with additional regression tests. (#10761, #10760)

  • withXSRFToken Truthy Bypass: Short-circuits on any truthy non-boolean value, so an ambiguous config no longer silently leaks the XSRF token cross-origin. (#10762)

  • maxBodyLength With Zero Redirects: Enforces maxBodyLength even when maxRedirects is set to 0, closing a bypass path for oversized request bodies. (#10753)

  • Streamed Response maxContentLength Bypass: Applies maxContentLength to streamed responses that previously bypassed the cap. (#10754)

  • Follow-up CVE Completion: Completes an earlier incomplete CVE fix to fully close the regression window. (#10755)

🚀 New Features

  • AI-Based Docs Translations: Initial scaffold for AI-assisted translations of the documentation site. (#10705)

  • Location Request Header Type: Adds Location to CommonRequestHeadersList for accurate typing of redirect-aware requests. (#7528)

🐛 Bug Fixes

  • FormData Handling: Removes Content-Type when no boundary is present on FormData fetch requests, supports multi-select fields, cancels request.body instead of the source stream on fetch abort, and fixes a recursion bug in form-data serialisation. (#7314, #10676, #10702, #10726)

  • HTTP Adapter: Handles socket-only request errors without leaking keep-alive listeners. (#10576)

  • Progress Events: Clamps loaded to total for computable upload/download progress events. (#7458)

  • Types: Aligns runWhen type with the runtime behaviour in InterceptorManager and makes response header keys case-insensitive. (#7529, #10677)

  • buildFullPath: Uses strict equality in the base/relative URL check. (#7252)

  • AxiosURLSearchParams Regex: Improves the regex used for param serialisation to avoid edge-case mismatches. (#10736)

  • Resilient Value Parsing: Parses out header/config values instead of throwing on malformed input. (#10687)

  • Docs Artefact Cleanup: Removes the docs content that was incorrectly committed. (#10727)

🔧 Maintenance & Chores

  • Threat Model & Security Docs: Ongoing refinement of THREATMODEL.md, including Hopper security update, TLS and tag-replay wording, mitigation descriptions, decompression-bomb guidance, and further cleanup. (#10672, #10715, #10718, #10722, #10763, #10765)

  • Test Coverage & Migration: Expanded shouldBypassProxy coverage for wildcard/IPv6/edge cases, documented and tested AxiosError.status, and migrated progressEventReducer tests to Vitest. (#10723, #10725, #10741)

... (truncated)

Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/backend/package.json | 2 +- packages/core/package.json | 2 +- pnpm-lock.yaml | 56 ++++++++++++++++++++++---------------- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/apps/backend/package.json b/apps/backend/package.json index ae3a05a2..cdb2a503 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -22,7 +22,7 @@ "vitest": "catalog:default" }, "dependencies": { - "axios": "^1.15.0", + "axios": "^1.15.1", "@stats-organization/github-readme-stats-core": "workspace:^", "pg": "^8.20.0" } diff --git a/packages/core/package.json b/packages/core/package.json index 70896923..64c4734c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -86,7 +86,7 @@ "vitest": "catalog:default" }, "dependencies": { - "axios": "^1.15.0", + "axios": "^1.15.1", "emoji-name-map": "^2.0.3", "github-username-regex": "^1.0.0", "word-wrap": "^1.2.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 416d9261..41488b74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,15 +87,15 @@ importers: specifier: workspace:^ version: link:../../packages/core axios: - specifier: ^1.15.0 - version: 1.15.0 + specifier: ^1.15.1 + version: 1.15.1 pg: specifier: ^8.20.0 version: 8.20.0 devDependencies: axios-mock-adapter: specifier: 2.1.0 - version: 2.1.0(axios@1.15.0) + version: 2.1.0(axios@1.15.1) express: specifier: 5.2.1 version: 5.2.1 @@ -122,10 +122,10 @@ importers: version: 4.2.2(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) axios: specifier: ^1 - version: 1.15.0 + version: 1.15.1 axios-cache-interceptor: specifier: ^1 - version: 1.12.0(axios@1.15.0) + version: 1.12.0(axios@1.15.1) daisyui: specifier: ^5.5.19 version: 5.5.19 @@ -185,8 +185,8 @@ importers: packages/core: dependencies: axios: - specifier: ^1.15.0 - version: 1.15.0 + specifier: ^1.15.1 + version: 1.15.1 emoji-name-map: specifier: ^2.0.3 version: 2.0.3 @@ -208,7 +208,7 @@ importers: version: 1.1.1 axios-mock-adapter: specifier: 2.1.0 - version: 2.1.0(axios@1.15.0) + version: 2.1.0(axios@1.15.1) js-yaml: specifier: 4.1.1 version: 4.1.1 @@ -1339,8 +1339,8 @@ packages: peerDependencies: axios: '>= 0.17.0' - axios@1.15.0: - resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} + axios@1.15.1: + resolution: {integrity: sha512-WOG+Jj8ZOvR0a3rAn+Tuf1UQJRxw5venr6DgdbJzngJE3qG7X0kL83CZGpdHMxEm+ZK3seAbvFsw4FfOfP9vxg==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1912,6 +1912,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} @@ -4168,22 +4172,22 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios-cache-interceptor@1.12.0(axios@1.15.0): + axios-cache-interceptor@1.12.0(axios@1.15.1): dependencies: - axios: 1.15.0 + axios: 1.15.1 cache-parser: 1.2.6 fast-defer: 1.1.9 http-vary: 1.0.3 object-code: 2.0.0 try: 1.0.3 - axios-mock-adapter@2.1.0(axios@1.15.0): + axios-mock-adapter@2.1.0(axios@1.15.1): dependencies: - axios: 1.15.0 + axios: 1.15.1 fast-deep-equal: 3.1.3 is-buffer: 2.0.5 - axios@1.15.0: + axios@1.15.1: dependencies: follow-redirects: 1.16.0 form-data: 4.0.5 @@ -4421,7 +4425,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -4488,11 +4492,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 es-to-primitive@1.3.0: dependencies: @@ -4778,7 +4782,7 @@ snapshots: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.2 + hasown: 2.0.3 mime-types: 2.1.35 formatly@0.3.0: @@ -4803,7 +4807,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.2 + hasown: 2.0.3 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -4824,7 +4828,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-proto@1.0.1: @@ -4889,6 +4893,10 @@ snapshots: dependencies: function-bind: 1.1.2 + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + hermes-estree@0.25.1: {} hermes-parser@0.25.1: @@ -4936,7 +4944,7 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.2 + hasown: 2.0.3 side-channel: 1.1.0 ipaddr.js@1.9.1: {} @@ -4974,7 +4982,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-data-view@1.0.2: dependencies: @@ -5029,7 +5037,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 is-set@2.0.3: {} From 3263dd9c783d43a519e477bd4d4b916f39b92f0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:14:20 +0200 Subject: [PATCH 49/57] build(deps): Bump react-toastify from 11.0.5 to 11.1.0 in the react group across 1 directory (#182) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the react group with 1 update in the / directory: [react-toastify](https://github.com/fkhadra/react-toastify). Updates `react-toastify` from 11.0.5 to 11.1.0
Release notes

Sourced from react-toastify's releases.

v11.1.0

Release Notes

Features

  • CSP nonce support. <ToastContainer nonce={...}> applies the nonce to the injected <style> tag. Closes #1209.

Fixes

  • onChange fires status: 'removed' synchronously on toast.dismiss() instead of after the exit animation — observers (incl. useNotificationCenter) now see correctly ordered events. Also guards against double-onClose. Closes #1275.
  • Touch drag no longer re-pauses the toast on release — the old check compared a PointerEvent against 'touchend', which never matched. Closes #1217.
  • Vertical drag now visually moves the toast (--y gets a unit). Thanks @​janpaepke, #1277.
  • Stacked scale is clamped at 0.5, preventing zero/negative scale in deep stacks. Closes #1171, #1174.
  • Stacked container respects mobile 100vw again. Closes #1234.

Accessibility

Internal

  • Migrated to a pnpm workspace (pnpm link . no longer required for contributors). Publish layout unchanged — addon still ships inside the main package.
  • CSS now injected at mount via useStyleSheet (prerequisite for nonce).
  • Dep bumps: TypeScript 6, Vite 8, Cypress 15, React 19.2, plus the rest.
  • CI: upload-artifact v3 → v4.

Thanks to @​janpaepke, @​singhankit001, and reporters of the fixed issues.

Commits
  • 769ce82 11.1.0
  • de21958 remove year from license
  • c800992 fix: add unit to --y CSS variable to fix vertical drag
  • e4ab712 fix chicken and egg issue
  • b3bbab5 bump artifact action
  • 6d58ce4 fix: stacked toast invert size, when used as stacked
  • 50e8e42 fix: stacked container on mobile not 100vw
  • 1b2ee17 fix: dispatch 'removed' onChange event synchronously on dismiss
  • a2d376b feat: add ARIA accessibility attributes to ProgressBar
  • 8375ace fix: touch bug in onDragTransitionEnd, closes #1217
  • Additional commits viewable in compare view

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/frontend/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 3e54db5e..a1bbab74 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -26,7 +26,7 @@ "react-loading-skeleton": "^3.3.1", "react-redux": "^9.2.0", "react-spinners": "^0.17.0", - "react-toastify": "^11.0.5", + "react-toastify": "^11.1.0", "redux": "^5.0.1", "save-svg-as-png": "^1.4.17", "uuid": "^14.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41488b74..39933267 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -148,8 +148,8 @@ importers: specifier: ^0.17.0 version: 0.17.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react-toastify: - specifier: ^11.0.5 - version: 11.0.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + specifier: ^11.1.0 + version: 11.1.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) redux: specifier: ^5.0.1 version: 5.0.1 @@ -2641,8 +2641,8 @@ packages: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-toastify@11.0.5: - resolution: {integrity: sha512-EpqHBGvnSTtHYhCPLxML05NLY2ZX0JURbAdNYa6BUkk+amz4wbKBQvoKQAB0ardvSarUBuY4Q4s1sluAzZwkmA==} + react-toastify@11.1.0: + resolution: {integrity: sha512-e9h23x3phN0wbFeB6yovmWp7lobzV4CaCH0LO8nVP6H7Y+3GbcLpIzMm9dJhcp1RXbpyfvjgpfXqO80QAmn7sg==} peerDependencies: react: ^18 || ^19 react-dom: ^18 || ^19 @@ -5638,7 +5638,7 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - react-toastify@11.0.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-toastify@11.1.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: clsx: 2.1.1 react: 19.2.5 From 134b7381516b2f70da7a386046d7f24f7f88e711 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:15:11 +0200 Subject: [PATCH 50/57] build(deps-dev): Bump the eslint group across 1 directory with 2 updates (#183) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the eslint group with 2 updates in the / directory: [eslint](https://github.com/eslint/eslint) and [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks). Updates `eslint` from 10.2.0 to 10.2.1
Release notes

Sourced from eslint's releases.

v10.2.1

Bug Fixes

  • 14be92b fix: model generator yield resumption paths in code path analysis (#20665) (sethamus)
  • 84a19d2 fix: no-async-promise-executor false positives for shadowed Promise (#20740) (xbinaryx)
  • af764af fix: clarify language and processor validation errors (#20729) (Pixel998)
  • e251b89 fix: update eslint (#20715) (renovate[bot])

Documentation

  • ca92ca0 docs: reuse markdown-it instance for markdown filter (#20768) (Amaresh S M)
  • 57d2ee2 docs: Enable Eleventy incremental mode for watch (#20767) (Amaresh S M)
  • c1621b9 docs: fix typos in code-path-analyzer.js (#20700) (Ayush Shukla)
  • 1418d52 docs: Update README (GitHub Actions Bot)
  • 39771e6 docs: Update README (GitHub Actions Bot)
  • 71e0469 docs: fix incomplete JSDoc param description in no-shadow rule (#20728) (kuldeep kumar)
  • 22119ce docs: clarify scope of for-direction rule with dead code examples (#20723) (Amaresh S M)
  • 8f3fb77 docs: document meta.docs.dialects (#20718) (Pixel998)

Chores

  • 7ddfea9 chore: update dependency prettier to v3.8.2 (#20770) (renovate[bot])
  • fac40e1 ci: bump pnpm/action-setup from 5.0.0 to 6.0.0 (#20763) (dependabot[bot])
  • 7246f92 test: add tests for SuppressionsService.load() error handling (#20734) (kuldeep kumar)
  • 4f34b1e chore: update pnpm/action-setup action to v5 (#20762) (renovate[bot])
  • 51080eb test: processor service (#20731) (kuldeep kumar)
  • e7e1889 chore: remove stale babel-eslint10 fixture and test (#20727) (kuldeep kumar)
  • 4e1a87c test: remove redundant async/await in flat config array tests (#20722) (Pixel998)
  • 066eabb test: add rule metadata coverage for languages and docs.dialects (#20717) (Pixel998)
Commits

Updates `eslint-plugin-react-hooks` from 7.1.0 to 7.1.1
Release notes

Sourced from eslint-plugin-react-hooks's releases.

eslint-plugin-react-hooks@7.1.1 (April 17, 2026)

Note: 7.1.0 accidentally removed the component-hook-factories rule, causing errors for users who referenced it in their ESLint config. This is now fixed.

  • Add deprecated no-op component-hook-factories rule for backwards compatibility. (@​mofeiZ in #36307)
Changelog

Sourced from eslint-plugin-react-hooks's changelog.

7.1.1

Note: 7.1.0 accidentally removed the component-hook-factories rule, causing errors for users who referenced it in their ESLint config. This is now fixed.

  • Add deprecated no-op component-hook-factories rule for backwards compatibility. (@​mofeiZ in #36307)
Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 4 +- pnpm-lock.yaml | 149 ++++++++++++++++++++++++++----------------------- 2 files changed, 81 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index cd787af4..356e4a98 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,12 @@ "@playwright/test": "1.59.1", "@types/node": "24.12.2", "@vitest/coverage-v8": "catalog:default", - "eslint": "10.2.0", + "eslint": "10.2.1", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import-x": "4.16.2", "eslint-plugin-jsdoc": "62.9.0", "eslint-plugin-react": "7.37.5", - "eslint-plugin-react-hooks": "7.1.0", + "eslint-plugin-react-hooks": "7.1.1", "globals": "17.5.0", "husky": "9.1.7", "knip": "6.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 39933267..8c578f52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,10 +22,10 @@ importers: devDependencies: '@eslint/compat': specifier: 2.0.5 - version: 2.0.5(eslint@10.2.0(jiti@2.6.1)) + version: 2.0.5(eslint@10.2.1(jiti@2.6.1)) '@eslint/js': specifier: 10.0.1 - version: 10.0.1(eslint@10.2.0(jiti@2.6.1)) + version: 10.0.1(eslint@10.2.1(jiti@2.6.1)) '@playwright/test': specifier: 1.59.1 version: 1.59.1 @@ -36,23 +36,23 @@ importers: specifier: catalog:default version: 4.1.4(vitest@4.1.4) eslint: - specifier: 10.2.0 - version: 10.2.0(jiti@2.6.1) + specifier: 10.2.1 + version: 10.2.1(jiti@2.6.1) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)))(eslint@10.2.1(jiti@2.6.1)) eslint-plugin-import-x: specifier: 4.16.2 - version: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1)) + version: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)) eslint-plugin-jsdoc: specifier: 62.9.0 - version: 62.9.0(eslint@10.2.0(jiti@2.6.1)) + version: 62.9.0(eslint@10.2.1(jiti@2.6.1)) eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@10.2.0(jiti@2.6.1)) + version: 7.37.5(eslint@10.2.1(jiti@2.6.1)) eslint-plugin-react-hooks: - specifier: 7.1.0 - version: 7.1.0(eslint@10.2.0(jiti@2.6.1)) + specifier: 7.1.1 + version: 7.1.1(eslint@10.2.1(jiti@2.6.1)) globals: specifier: 17.5.0 version: 17.5.0 @@ -76,7 +76,7 @@ importers: version: 6.0.3 typescript-eslint: specifier: 8.58.2 - version: 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) + version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) vitest: specifier: catalog:default version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) @@ -424,12 +424,16 @@ packages: '@noble/hashes': optional: true - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -1349,8 +1353,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.10.19: - resolution: {integrity: sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==} + baseline-browser-mapping@2.10.20: + resolution: {integrity: sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -1541,8 +1545,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.339: - resolution: {integrity: sha512-Is+0BBHJ4NrdpAYiperrmp53pLywG/yV/6lIMTAnhxvzj/Cmn5Q/ogSHC6AKe7X+8kPLxxFk0cs5oc/3j/fxIg==} + electron-to-chromium@1.5.340: + resolution: {integrity: sha512-908qahOGocRMinT2nM3ajCEM99H4iPdv84eagPP3FfZy/1ZGeOy2CZYzjhms81ckOPCXPlW7LkY4XpxD8r1DrA==} emoji-name-map@2.0.3: resolution: {integrity: sha512-3KBuQuhYkRtLd9utBKfTtclbWP3IytC1FNcXg+NKARltPSYpkg/MLiklGv4vLwl8A8jMQjdneXNBYx8k0rrg+g==} @@ -1653,8 +1657,8 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-react-hooks@7.1.0: - resolution: {integrity: sha512-LDicyhrRFrIaheDYryeM2W8gWyZXnAs4zIr2WVPiOSeTmIu2RjR4x/9N0xLaRWZ+9hssBDGo3AadcohuzAvSvg==} + eslint-plugin-react-hooks@7.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} engines: {node: '>=18'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 @@ -1677,8 +1681,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.0: - resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + eslint@10.2.1: + resolution: {integrity: sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -3398,18 +3402,18 @@ snapshots: '@es-joy/resolve.exports@1.2.0': {} - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1(jiti@2.6.1))': dependencies: - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.0.5(eslint@10.2.0(jiti@2.6.1))': + '@eslint/compat@2.0.5(eslint@10.2.1(jiti@2.6.1))': dependencies: '@eslint/core': 1.2.1 optionalDependencies: - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) '@eslint/config-array@0.23.5': dependencies: @@ -3427,9 +3431,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.2.0(jiti@2.6.1))': + '@eslint/js@10.0.1(eslint@10.2.1(jiti@2.6.1))': optionalDependencies: - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) '@eslint/object-schema@3.0.5': {} @@ -3440,13 +3444,18 @@ snapshots: '@exodus/bytes@1.15.0': {} - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.7': + '@humanfs/core@0.19.2': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -3847,15 +3856,15 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3863,14 +3872,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.58.2 '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -3893,13 +3902,13 @@ snapshots: dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) debug: 4.4.3 - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -3922,13 +3931,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.58.2 '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -4199,7 +4208,7 @@ snapshots: balanced-match@4.0.4: {} - baseline-browser-mapping@2.10.19: {} + baseline-browser-mapping@2.10.20: {} bidi-js@1.0.3: dependencies: @@ -4234,9 +4243,9 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.19 + baseline-browser-mapping: 2.10.20 caniuse-lite: 1.0.30001788 - electron-to-chromium: 1.5.339 + electron-to-chromium: 1.5.340 node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -4384,7 +4393,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.339: {} + electron-to-chromium@1.5.340: {} emoji-name-map@2.0.3: {} @@ -4517,10 +4526,10 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1)))(eslint@10.2.0(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)))(eslint@10.2.1(jiti@2.6.1)): dependencies: debug: 4.4.3 - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.14.0 is-bun-module: 2.0.0 @@ -4528,17 +4537,17 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1)): + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)): dependencies: '@package-json/types': 0.0.12 '@typescript-eslint/types': 8.58.2 comment-parser: 1.4.6 debug: 4.4.3 - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.2.5 @@ -4546,11 +4555,11 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) transitivePeerDependencies: - supports-color - eslint-plugin-jsdoc@62.9.0(eslint@10.2.0(jiti@2.6.1)): + eslint-plugin-jsdoc@62.9.0(eslint@10.2.1(jiti@2.6.1)): dependencies: '@es-joy/jsdoccomment': 0.86.0 '@es-joy/resolve.exports': 1.2.0 @@ -4558,7 +4567,7 @@ snapshots: comment-parser: 1.4.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) espree: 11.2.0 esquery: 1.7.0 html-entities: 2.6.0 @@ -4570,18 +4579,18 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@7.1.0(eslint@10.2.0(jiti@2.6.1)): + eslint-plugin-react-hooks@7.1.1(eslint@10.2.1(jiti@2.6.1)): dependencies: '@babel/core': 7.29.0 '@babel/parser': 7.29.2 - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@10.2.0(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@10.2.1(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -4589,7 +4598,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.3.2 - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.2.1(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -4614,15 +4623,15 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.0(jiti@2.6.1): + eslint@10.2.1(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -6072,13 +6081,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3): + typescript-eslint@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.3) - eslint: 10.2.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + eslint: 10.2.1(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color From fe5ef06049d21707c386157ff0f384737e37c830 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:18:22 +0200 Subject: [PATCH 51/57] build(deps-dev): Bump knip from 6.4.1 to 6.5.0 (#188) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 6.4.1 to 6.5.0.
Release notes

Sourced from knip's releases.

Release 6.5.0

  • Drop project-extension-redundant config hint (resolve #1683) (f86092949d6dbd041fd621876da674fd3eac7534)
  • Add instructions to .agents/PLUGINS.md (e2943ed8fb6d2c0ab4cf12ff04d10bd5ab9fd5f7)
  • Add a plugin for react-email (#1684) (d8ae4d3ccb810b9a9211fd43e9d1e7d7b704fcaf) - thanks @​xaqrox!
  • Replace fast-glob with tinyglobby (#1462) (9f6b4c8aa6857fea40e66d008c905c948af10939) - thanks @​gameroman!
  • Added plugin for Serverless framework (#1478) (f885f1ded52427d984c67e7172e3141eb4e5ee29) - thanks @​BenCrinion-IW!
  • Add args to Prettier plugin to resolve --config CLI flag (#1685) (f4658c84e714afd8a2233b72be6169da1ac3723e) - thanks @​xaqrox!
  • fix(util): tolerate JSONC and array extends in findRootDirsBase (#1681) (f7e5464a6f70e9024a341fdb923766b5ff53a831) - thanks @​Hoffs!
  • Format (15bd7e7a56b470096cfee1690263d5d13ddb8fb6)
  • Inherit outDir/rootDir from tsconfig project references (resolve #1680) (b89b4f716f4c117b0106e9a212e9e5c46aa85035)
  • tsc → tsgo (a6e09ca1b65936b3790a6c3628a4646f030d18b8)
  • Update dependencies (4cb05c96a2ae7c790d29ee76ff13288c5bbb97a2)
  • Housekeep (28c56cb8bf68031b1c8e9bee75b18ee7274ec981)
  • Test test test (7eb4ab3a8a6635dcaf756bb2b4a88e1298615994)
  • Add pino plugin with transportCall visitor (resolve #1480) (53a033e4ddc5036c6a4a0e55c0abc42c5c64e4f5)
  • Add signal to projects using knip (dbedd665c1f8d735030600d3f68ef1825d9a2668)
  • Tune logos (3148f4d0485875370634b9b53c1b3aa7f6eafcc3)
  • Tweak knip-run tool response (42940381a947c46996ae4055e8789f6ea39cfca4)
  • Add workspace option to knip-run tool (64c4aaea89e3abb41d8695ebffc5538878520b21)
  • Remove old lingering experimentalTags (e503d108e5535800ac6467f4d92c7dd6a9e90037)
  • Fix compiler type (resolve #1689) (e7a69adb5e584eb6e5af9b4007820afcbcf27a08)
Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 313 ++++++++++++++++++++----------------------------- 2 files changed, 126 insertions(+), 189 deletions(-) diff --git a/package.json b/package.json index 356e4a98..7ee6c06d 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "eslint-plugin-react-hooks": "7.1.1", "globals": "17.5.0", "husky": "9.1.7", - "knip": "6.4.1", + "knip": "6.5.0", "lint-staged": "16.4.0", "prettier": "3.8.3", "turbo": "2.9.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c578f52..4d99819c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,8 +60,8 @@ importers: specifier: 9.1.7 version: 9.1.7 knip: - specifier: 6.4.1 - version: 6.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + specifier: 6.5.0 + version: 6.5.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) lint-staged: specifier: 16.4.0 version: 16.4.0 @@ -350,9 +350,15 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.9.2': resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} @@ -481,136 +487,133 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-parser/binding-android-arm-eabi@0.121.0': - resolution: {integrity: sha512-n07FQcySwOlzap424/PLMtOkbS7xOu8nsJduKL8P3COGHKgKoDYXwoAHCbChfgFpHnviehrLWIPX0lKGtbEk/A==} + '@oxc-parser/binding-android-arm-eabi@0.126.0': + resolution: {integrity: sha512-svyoHt25J4741QJ5aa4R+h0iiBeSRt63Lr3aAZcxy2c/NeSE1IfDeMnSij6rIg7EjxkdlXzz613wUjeCeilBNA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm64@0.121.0': - resolution: {integrity: sha512-/Dd1xIXboYAicw+twT2utxPD7bL8qh7d3ej0qvaYIMj3/EgIrGR+tSnjCUkiCT6g6uTC0neSS4JY8LxhdSU/sA==} + '@oxc-parser/binding-android-arm64@0.126.0': + resolution: {integrity: sha512-hPEBRKgplp1mG9GkINFsr4JVMDNrGJLOqfDaadTWpAoTnzYR5Rmv8RMvB3hJZpiNvbk1aacopdHUP1pggMQ/cw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-parser/binding-darwin-arm64@0.121.0': - resolution: {integrity: sha512-A0jNEvv7QMtCO1yk205t3DWU9sWUjQ2KNF0hSVO5W9R9r/R1BIvzG01UQAfmtC0dQm7sCrs5puixurKSfr2bRQ==} + '@oxc-parser/binding-darwin-arm64@0.126.0': + resolution: {integrity: sha512-ccRpu9sdYmznePJQG5halhs0FW5tw5a8zRSoZXOzM1OjoeZ4jiRRruFiPclsD59edoVAK1l83dvfjWz1nQi6lg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.121.0': - resolution: {integrity: sha512-SsHzipdxTKUs3I9EOAPmnIimEeJOemqRlRDOp9LIj+96wtxZejF51gNibmoGq8KoqbT1ssAI5po/E3J+vEtXGA==} + '@oxc-parser/binding-darwin-x64@0.126.0': + resolution: {integrity: sha512-CHB4zVjNSKqx8Fw9pHowzQQnjjuq04i4Ng0Avj+DixlwhwAoMYqlFbocYIlbg+q3zOLGlm7vEHm83jqEMitnyg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.121.0': - resolution: {integrity: sha512-v1APOTkCp+RWOIDAHRoaeW/UoaHF15a60E8eUL6kUQXh+i4K7PBwq2Wi7jm8p0ymID5/m/oC1w3W31Z/+r7HQw==} + '@oxc-parser/binding-freebsd-x64@0.126.0': + resolution: {integrity: sha512-RQ3nEJdcDKBfBjmLJ3Vl1d0KQERPV1P8eUrnBm7+VTYyoaJSPLVFuPg1mlD1hk3n0/879VLFMfusFkBal4ssWQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': - resolution: {integrity: sha512-PmqPQuqHZyFVWA4ycr0eu4VnTMmq9laOHZd+8R359w6kzuNZPvmmunmNJ8ybkm769A0nCoVp3TJ6dUz7B3FYIQ==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.126.0': + resolution: {integrity: sha512-onipc2wCDA7Bauzb4KK1mab0GsEDf4ujiIfWECdnmY/2LlzAoX3xdQRLAUyEDB1kn3yilHBrkmXDdHluyHXxiw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': - resolution: {integrity: sha512-vF24htj+MOH+Q7y9A8NuC6pUZu8t/C2Fr/kDOi2OcNf28oogr2xadBPXAbml802E8wRAVfbta6YLDQTearz+jw==} + '@oxc-parser/binding-linux-arm-musleabihf@0.126.0': + resolution: {integrity: sha512-5BuJJPohrV5NJ8lmcYOMbfRCUGoYH5J9HZHeuqOLwkHXWAuPMN3X1h8bC/2mWjmosdbfTtmyIdX3spS/TkqKNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.121.0': - resolution: {integrity: sha512-wjH8cIG2Lu/3d64iZpbYr73hREMgKAfu7fqpXjgM2S16y2zhTfDIp8EQjxO8vlDtKP5Rc7waZW72lh8nZtWrpA==} + '@oxc-parser/binding-linux-arm64-gnu@0.126.0': + resolution: {integrity: sha512-r2KApRgm2pOJaduRm6GOT8x0whcr67AyejNkSdzPt34GJ+Y3axcXN2mwlTs+8lfO/SSmpO5ZJGYiHYnxEE0jkw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-arm64-musl@0.121.0': - resolution: {integrity: sha512-qT663J/W8yQFw3dtscbEi9LKJevr20V7uWs2MPGTnvNZ3rm8anhhE16gXGpxDOHeg9raySaSHKhd4IGa3YZvuw==} + '@oxc-parser/binding-linux-arm64-musl@0.126.0': + resolution: {integrity: sha512-FQ+MMh7MT0Dr/u8+RWmWKlfoeWPQyHDbhhxJShJlYtROXXPHsRs9EvmQOZZ3sx4Nn7JU8NX+oyw2YzQ7anBJcA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': - resolution: {integrity: sha512-mYNe4NhVvDBbPkAP8JaVS8lC1dsoJZWH5WCjpw5E+sjhk1R08wt3NnXYUzum7tIiWPfgQxbCMcoxgeemFASbRw==} + '@oxc-parser/binding-linux-ppc64-gnu@0.126.0': + resolution: {integrity: sha512-Wv/T8C98hRQhGTlx2XFyLn5raRMp9U1lOQD+YnXNgAr7wHbJJpZ8mDBU7Rw+M3WytGcGTFcr6kqgfyQeHVtLbQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': - resolution: {integrity: sha512-+QiFoGxhAbaI/amqX567784cDyyuZIpinBrJNxUzb+/L2aBRX67mN6Jv40pqduHf15yYByI+K5gUEygCuv0z9w==} + '@oxc-parser/binding-linux-riscv64-gnu@0.126.0': + resolution: {integrity: sha512-DHx1rT1zauW0ZbLHOiQh5AC9Xs3UkWx2XmfZHs+7nnWYr3sagrufoUQC+/XPwwjMIlCFXiFGM0sFh3TyOCZwqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-musl@0.121.0': - resolution: {integrity: sha512-9ykEgyTa5JD/Uhv2sttbKnCfl2PieUfOjyxJC/oDL2UO0qtXOtjPLl7H8Kaj5G7p3hIvFgu3YWvAxvE0sqY+hQ==} + '@oxc-parser/binding-linux-riscv64-musl@0.126.0': + resolution: {integrity: sha512-umDc2mTShH0U2zcEYf8mIJ163seLJNn54ZUZYeI5jD4qlg9izPwoLrC2aNPKlMJTu6u/ysmQWiEvIiaAG+INkw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-s390x-gnu@0.121.0': - resolution: {integrity: sha512-DB1EW5VHZdc1lIRjOI3bW/wV6R6y0xlfvdVrqj6kKi7Ayu2U3UqUBdq9KviVkcUGd5Oq+dROqvUEEFRXGAM7EQ==} + '@oxc-parser/binding-linux-s390x-gnu@0.126.0': + resolution: {integrity: sha512-PXXeWayclRtO1pxQEeCpiqIglQdhK2mAI2VX5xnsWdImzSB5GpoQ8TNw7vTCKk2k+GZuxl+q1knncidjCyUP9w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.121.0': - resolution: {integrity: sha512-s4lfobX9p4kPTclvMiH3gcQUd88VlnkMTF6n2MTMDAyX5FPNRhhRSFZK05Ykhf8Zy5NibV4PbGR6DnK7FGNN6A==} + '@oxc-parser/binding-linux-x64-gnu@0.126.0': + resolution: {integrity: sha512-wzocjxm34TbB3bFlqG65JiLtvf6ZDg2ZxRkLLbgXwDQUNU+0MPjQN8zy/0jBKNA5fnPLk3XeVdZ7Uin+7+CVkg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-musl@0.121.0': - resolution: {integrity: sha512-P9KlyTpuBuMi3NRGpJO8MicuGZfOoqZVRP1WjOecwx8yk4L/+mrCRNc5egSi0byhuReblBF2oVoDSMgV9Bj4Hw==} + '@oxc-parser/binding-linux-x64-musl@0.126.0': + resolution: {integrity: sha512-e83uftP60jmkPs2+CW6T6A1GYzN2H6IumDAiTntv9WyHR73PI3ImHNBkYqnA3ukeKI3xjcCbhSh9QeJWmufxGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxc-parser/binding-openharmony-arm64@0.121.0': - resolution: {integrity: sha512-R+4jrWOfF2OAPPhj3Eb3U5CaKNAH9/btMveMULIrcNW/hjfysFQlF8wE0GaVBr81dWz8JLgQlsxwctoL78JwXw==} + '@oxc-parser/binding-openharmony-arm64@0.126.0': + resolution: {integrity: sha512-4WiOILHnPrTDY2/L4mE6PZCYwLN1d3ghma6BuTJ452CCgzRMt3uFplCtR+o3r9zdUWJYb370UizpI9CUcWXr1A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-wasm32-wasi@0.121.0': - resolution: {integrity: sha512-5TFISkPTymKvsmIlKasPVTPuWxzCcrT8pM+p77+mtQbIZDd1UC8zww4CJcRI46kolmgrEX6QpKO8AvWMVZ+ifw==} + '@oxc-parser/binding-wasm32-wasi@0.126.0': + resolution: {integrity: sha512-Y17hhnrQTrxgAxAyAq401vnN9URsAL4s5AjqpG1NDsXSlhe1yBNnns+rC2P6xcMoitgX5nKH2ryYt9oiFRlzLw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-parser/binding-win32-arm64-msvc@0.121.0': - resolution: {integrity: sha512-V0pxh4mql4XTt3aiEtRNUeBAUFOw5jzZNxPABLaOKAWrVzSr9+XUaB095lY7jqMf5t8vkfh8NManGB28zanYKw==} + '@oxc-parser/binding-win32-arm64-msvc@0.126.0': + resolution: {integrity: sha512-Znug1u1iRvT4VC3jANz6nhGBHsFwEFMxuimYpJFwMtsB6H5FcEoZRMmH26tHkSTD03JvDmG+gB65W3ajLjPcSw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.121.0': - resolution: {integrity: sha512-4Ob1qvYMPnlF2N9rdmKdkQFdrq16QVcQwBsO8yiPZXof0fHKFF+LmQV501XFbi7lHyrKm8rlJRfQ/M8bZZPVLw==} + '@oxc-parser/binding-win32-ia32-msvc@0.126.0': + resolution: {integrity: sha512-qrw7mx5hFFTxVSXToOA40hpnjgNB/DJprZchtB4rDKNLKqkD3F26HbzaQeH1nxAKej0efSZfJd5Sw3qdtOLGhw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.121.0': - resolution: {integrity: sha512-BOp1KCzdboB1tPqoCPXgntgFs0jjeSyOXHzgxVFR7B/qfr3F8r4YDacHkTOUNXtDgM8YwKnkf3rE5gwALYX7NA==} + '@oxc-parser/binding-win32-x64-msvc@0.126.0': + resolution: {integrity: sha512-ibB1s+mPUFXvS7MFJO2jpw/aCNs/P6ifnWlRyTYB+WYBpniOiCcHQQskZneJtwcjQMDRol3RGG3ihoYnzXSY4w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-project/types@0.121.0': - resolution: {integrity: sha512-CGtOARQb9tyv7ECgdAlFxi0Fv7lmzvmlm2rpD/RdijOO9rfk/JvB1CjT8EnoD+tjna/IYgKKw3IV7objRb+aYw==} - '@oxc-project/types@0.126.0': resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} @@ -1372,10 +1375,6 @@ packages: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - browserslist@4.28.2: resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1735,10 +1734,6 @@ packages: fast-defer@1.1.9: resolution: {integrity: sha512-JP7Xm9HuePSeTT1DI78NeE9eAQvgNb9qNP2jlyQrcx4jiWM189omV6oyd0xaUPWHPlKmvDzz6H1FfPWIDU+xfg==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -1764,10 +1759,6 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} @@ -1857,19 +1848,12 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} - get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} github-username-regex@1.0.0: resolution: {integrity: sha512-EqDVkN0/5MQyDPOSDLInVRRXdeISRfcN1UW/1FUqD2knV1HHw8DndMB3UPNn5lO51DvRnjzbLXwWqNNV86PLOw==} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -2053,10 +2037,6 @@ packages: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -2174,8 +2154,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - knip@6.4.1: - resolution: {integrity: sha512-Ry+ywmDFSZvKp/jx7LxMgsZWRTs931alV84e60lh0Stf6kSRYqSIUTkviyyDFRcSO3yY1Kpbi83OirN+4lA2Xw==} + knip@6.5.0: + resolution: {integrity: sha512-84xSq/g8CtPWLJcY5WZeGWj/pbqQxJRC7iXTTutB0MkMm260hKxlzIXSTnxuTuIxre2MBSokhLkfth8dQQYVPQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2314,14 +2294,6 @@ packages: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2439,8 +2411,8 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - oxc-parser@0.121.0: - resolution: {integrity: sha512-ek9o58+SCv6AV7nchiAcUJy1DNE2CC5WRdBcO0mF+W4oRjNQfPO7b3pLjTHSFECpHkKGOZSQxx3hk8viIL5YCg==} + oxc-parser@0.126.0: + resolution: {integrity: sha512-FktCvLby/mOHyuijZt22+nOt10dS24gGUZE3XwIbUg7Kf4+rer3/5T7RgwzazlNuVsCjPloZ3p8E+4ONT3A8Kw==} engines: {node: ^20.19.0 || >=22.12.0} oxc-resolver@11.19.1: @@ -2521,10 +2493,6 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -2935,10 +2903,6 @@ packages: resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==} hasBin: true - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - to-valid-identifier@1.0.0: resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} engines: {node: '>=20'} @@ -3376,12 +3340,23 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.9.2': dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 @@ -3481,8 +3456,15 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -3505,73 +3487,70 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-parser/binding-android-arm-eabi@0.121.0': + '@oxc-parser/binding-android-arm-eabi@0.126.0': optional: true - '@oxc-parser/binding-android-arm64@0.121.0': + '@oxc-parser/binding-android-arm64@0.126.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.121.0': + '@oxc-parser/binding-darwin-arm64@0.126.0': optional: true - '@oxc-parser/binding-darwin-x64@0.121.0': + '@oxc-parser/binding-darwin-x64@0.126.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.121.0': + '@oxc-parser/binding-freebsd-x64@0.126.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.126.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.126.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.121.0': + '@oxc-parser/binding-linux-arm64-gnu@0.126.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.121.0': + '@oxc-parser/binding-linux-arm64-musl@0.126.0': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': + '@oxc-parser/binding-linux-ppc64-gnu@0.126.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': + '@oxc-parser/binding-linux-riscv64-gnu@0.126.0': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.121.0': + '@oxc-parser/binding-linux-riscv64-musl@0.126.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.121.0': + '@oxc-parser/binding-linux-s390x-gnu@0.126.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.121.0': + '@oxc-parser/binding-linux-x64-gnu@0.126.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.121.0': + '@oxc-parser/binding-linux-x64-musl@0.126.0': optional: true - '@oxc-parser/binding-openharmony-arm64@0.121.0': + '@oxc-parser/binding-openharmony-arm64@0.126.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-parser/binding-wasm32-wasi@0.126.0': dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.121.0': + '@oxc-parser/binding-win32-arm64-msvc@0.126.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.121.0': + '@oxc-parser/binding-win32-ia32-msvc@0.126.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.121.0': + '@oxc-parser/binding-win32-x64-msvc@0.126.0': optional: true - '@oxc-project/types@0.121.0': {} - '@oxc-project/types@0.126.0': {} '@oxc-resolver/binding-android-arm-eabi@11.19.1': @@ -3622,9 +3601,9 @@ snapshots: '@oxc-resolver/binding-openharmony-arm64@11.19.1': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -4237,10 +4216,6 @@ snapshots: dependencies: balanced-match: 4.0.4 - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - browserslist@4.28.2: dependencies: baseline-browser-mapping: 2.10.20 @@ -4725,14 +4700,6 @@ snapshots: fast-defer@1.1.9: {} - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} @@ -4753,10 +4720,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -4851,20 +4814,12 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.13.7: - dependencies: - resolve-pkg-maps: 1.0.0 - get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 github-username-regex@1.0.0: {} - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -5035,8 +4990,6 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-number@7.0.0: {} - is-potential-custom-element-name@1.0.1: {} is-promise@4.0.0: {} @@ -5165,20 +5118,20 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@6.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + knip@6.5.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): dependencies: '@nodelib/fs.walk': 1.2.8 - fast-glob: 3.3.3 formatly: 0.3.0 - get-tsconfig: 4.13.7 + get-tsconfig: 4.14.0 jiti: 2.6.1 minimist: 1.2.8 - oxc-parser: 0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - oxc-resolver: 11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + oxc-parser: 0.126.0 + oxc-resolver: 11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) picocolors: 1.1.1 picomatch: 4.0.4 smol-toml: 1.6.1 strip-json-comments: 5.0.3 + tinyglobby: 0.2.16 unbash: 2.2.0 yaml: 2.8.3 zod: 4.3.6 @@ -5304,13 +5257,6 @@ snapshots: merge-descriptors@2.0.0: {} - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.2 - mime-db@1.52.0: {} mime-db@1.54.0: {} @@ -5425,35 +5371,32 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-parser@0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-parser@0.126.0: dependencies: - '@oxc-project/types': 0.121.0 + '@oxc-project/types': 0.126.0 optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.121.0 - '@oxc-parser/binding-android-arm64': 0.121.0 - '@oxc-parser/binding-darwin-arm64': 0.121.0 - '@oxc-parser/binding-darwin-x64': 0.121.0 - '@oxc-parser/binding-freebsd-x64': 0.121.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.121.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.121.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.121.0 - '@oxc-parser/binding-linux-arm64-musl': 0.121.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.121.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.121.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.121.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.121.0 - '@oxc-parser/binding-linux-x64-gnu': 0.121.0 - '@oxc-parser/binding-linux-x64-musl': 0.121.0 - '@oxc-parser/binding-openharmony-arm64': 0.121.0 - '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - '@oxc-parser/binding-win32-arm64-msvc': 0.121.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.121.0 - '@oxc-parser/binding-win32-x64-msvc': 0.121.0 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@oxc-parser/binding-android-arm-eabi': 0.126.0 + '@oxc-parser/binding-android-arm64': 0.126.0 + '@oxc-parser/binding-darwin-arm64': 0.126.0 + '@oxc-parser/binding-darwin-x64': 0.126.0 + '@oxc-parser/binding-freebsd-x64': 0.126.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.126.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.126.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.126.0 + '@oxc-parser/binding-linux-arm64-musl': 0.126.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.126.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.126.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.126.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.126.0 + '@oxc-parser/binding-linux-x64-gnu': 0.126.0 + '@oxc-parser/binding-linux-x64-musl': 0.126.0 + '@oxc-parser/binding-openharmony-arm64': 0.126.0 + '@oxc-parser/binding-wasm32-wasi': 0.126.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.126.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.126.0 + '@oxc-parser/binding-win32-x64-msvc': 0.126.0 - oxc-resolver@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.19.1 '@oxc-resolver/binding-android-arm64': 11.19.1 @@ -5471,7 +5414,7 @@ snapshots: '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 '@oxc-resolver/binding-linux-x64-musl': 11.19.1 '@oxc-resolver/binding-openharmony-arm64': 11.19.1 - '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 @@ -5546,8 +5489,6 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.2: {} - picomatch@4.0.4: {} playwright-core@1.59.1: {} @@ -6001,10 +5942,6 @@ snapshots: dependencies: tldts-core: 7.0.28 - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - to-valid-identifier@1.0.0: dependencies: '@sindresorhus/base62': 1.0.0 From b863992994e1c8708faa2c4bd8476cfdd49f6261 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:43:51 +0200 Subject: [PATCH 52/57] upgrade transitive dependencies and pnpm (#190) --- package.json | 2 +- pnpm-lock.yaml | 60 +++++++++++++++++++++++++------------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index 7ee6c06d..b632cf49 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@stats-organization/root", "private": true, "type": "module", - "packageManager": "pnpm@10.33.1+sha512.05ba3c1d5d1c18f68df06470d74055e62d41fc110a0c660db1b2dfb2785327f04cf0f68345d4609bc52089e7fa0343c31593b2f9594e2c5d5da426230acc9820", + "packageManager": "pnpm@10.33.2+sha512.a90faf6feeab71ad6c6e57f94e0fe1a12f5dcc22cd754db40ae9593eb6a3e0b6b12e3540218bb37ae083404b1f2ce6db2a4121e979829b4aff94b99f49da1cf8", "devDependencies": { "@eslint/compat": "2.0.5", "@eslint/js": "10.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4d99819c..7d55b5c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -224,12 +224,16 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@asamuzakjp/css-color@5.1.10': - resolution: {integrity: sha512-02OhhkKtgNRuicQ/nF3TRnGsxL9wp0r3Y7VlKWyOHHGmGyvXv03y+PnymU8FKFJMTjIr1Bk8U2g1HWSLrpAHww==} + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/dom-selector@7.0.9': - resolution: {integrity: sha512-r3ElRr7y8ucyN2KdICwGsmj19RoN13CLCa/pvGydghWK6ZzeKQ+TcDjVdtEZz2ElpndM5jXw//B9CEee0mWnVg==} + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} '@asamuzakjp/nwsapi@2.3.9': @@ -1561,9 +1565,9 @@ packages: resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} @@ -1896,10 +1900,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - hasown@2.0.3: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} @@ -2432,8 +2432,8 @@ packages: parse-statements@1.0.11: resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} - parse5@8.0.0: - resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -2685,8 +2685,8 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} safe-push-apply@1.0.0: @@ -3192,20 +3192,24 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@asamuzakjp/css-color@5.1.10': + '@asamuzakjp/css-color@5.1.11': dependencies: + '@asamuzakjp/generational-cache': 1.0.1 '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-color-parser': 4.1.0(@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-tokenizer': 4.0.0 - '@asamuzakjp/dom-selector@7.0.9': + '@asamuzakjp/dom-selector@7.1.1': dependencies: + '@asamuzakjp/generational-cache': 1.0.1 '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 + '@asamuzakjp/generational-cache@1.0.1': {} + '@asamuzakjp/nwsapi@2.3.9': {} '@babel/code-frame@7.29.0': @@ -4381,7 +4385,7 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.2 - entities@6.0.1: {} + entities@8.0.0: {} environment@1.1.0: {} @@ -4427,7 +4431,7 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 + safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 @@ -4575,7 +4579,7 @@ snapshots: es-iterator-helpers: 1.3.2 eslint: 10.2.1(jiti@2.6.1) estraverse: 5.3.0 - hasown: 2.0.2 + hasown: 2.0.3 jsx-ast-utils: 3.3.5 minimatch: 3.1.5 object.entries: 1.1.9 @@ -4853,10 +4857,6 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -5073,8 +5073,8 @@ snapshots: jsdom@29.0.2: dependencies: - '@asamuzakjp/css-color': 5.1.10 - '@asamuzakjp/dom-selector': 7.0.9 + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 '@bramus/specificity': 2.4.2 '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) '@exodus/bytes': 1.15.0 @@ -5084,7 +5084,7 @@ snapshots: html-encoding-sniffer: 6.0.0 is-potential-custom-element-name: 1.0.1 lru-cache: 11.3.5 - parse5: 8.0.0 + parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 @@ -5436,9 +5436,9 @@ snapshots: parse-statements@1.0.11: {} - parse5@8.0.0: + parse5@8.0.1: dependencies: - entities: 6.0.1 + entities: 8.0.0 parseurl@1.3.3: {} @@ -5688,7 +5688,7 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.3: + safe-array-concat@1.1.4: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 From 8305746754a0f0d814eb1a03fffe0fedea2d4b84 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Sun, 3 May 2026 11:20:05 +0200 Subject: [PATCH 53/57] add license info for icons (#200) solves https://github.com/anuraghazra/github-readme-stats/issues/4839 --- packages/core/src/common/icons.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/core/src/common/icons.js b/packages/core/src/common/icons.js index 4a805d44..9b0c33ac 100644 --- a/packages/core/src/common/icons.js +++ b/packages/core/src/common/icons.js @@ -1,5 +1,31 @@ // @ts-check +/* +The icons in this file are based on https://github.com/primer/octicons which is released under the MIT license: + +MIT License + +Copyright (c) 2026 GitHub Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + const icons = { star: ``, commits: ``, From f766c3b789202c95d810f1c1f4279620a12300d2 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Sun, 3 May 2026 12:06:50 +0200 Subject: [PATCH 54/57] various dependency upgrades (#201) --- apps/backend/package.json | 2 +- package.json | 4 +- packages/core/package.json | 2 +- pnpm-lock.yaml | 603 ++++++++++++++++++------------------- pnpm-workspace.yaml | 2 +- 5 files changed, 290 insertions(+), 323 deletions(-) diff --git a/apps/backend/package.json b/apps/backend/package.json index cdb2a503..8d245407 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -22,7 +22,7 @@ "vitest": "catalog:default" }, "dependencies": { - "axios": "^1.15.1", + "axios": "^1.15.2", "@stats-organization/github-readme-stats-core": "workspace:^", "pg": "^8.20.0" } diff --git a/package.json b/package.json index b632cf49..e3aa77fa 100644 --- a/package.json +++ b/package.json @@ -17,12 +17,12 @@ "eslint-plugin-react-hooks": "7.1.1", "globals": "17.5.0", "husky": "9.1.7", - "knip": "6.5.0", + "knip": "6.6.2", "lint-staged": "16.4.0", "prettier": "3.8.3", "turbo": "2.9.6", "typescript": "6.0.3", - "typescript-eslint": "8.58.2", + "typescript-eslint": "8.59.0", "vitest": "catalog:default" }, "scripts": { diff --git a/packages/core/package.json b/packages/core/package.json index 64c4734c..585d6264 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -86,7 +86,7 @@ "vitest": "catalog:default" }, "dependencies": { - "axios": "^1.15.1", + "axios": "^1.15.2", "emoji-name-map": "^2.0.3", "github-username-regex": "^1.0.0", "word-wrap": "^1.2.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7d55b5c6..ee56e4a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: 4.1.4 version: 4.1.4 vite: - specifier: 8.0.9 - version: 8.0.9 + specifier: 8.0.10 + version: 8.0.10 vitest: specifier: 4.1.4 version: 4.1.4 @@ -40,10 +40,10 @@ importers: version: 10.2.1(jiti@2.6.1) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)))(eslint@10.2.1(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)))(eslint@10.2.1(jiti@2.6.1)) eslint-plugin-import-x: specifier: 4.16.2 - version: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)) + version: 4.16.2(@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)) eslint-plugin-jsdoc: specifier: 62.9.0 version: 62.9.0(eslint@10.2.1(jiti@2.6.1)) @@ -60,8 +60,8 @@ importers: specifier: 9.1.7 version: 9.1.7 knip: - specifier: 6.5.0 - version: 6.5.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + specifier: 6.6.2 + version: 6.6.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) lint-staged: specifier: 16.4.0 version: 16.4.0 @@ -75,11 +75,11 @@ importers: specifier: 6.0.3 version: 6.0.3 typescript-eslint: - specifier: 8.58.2 - version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + specifier: 8.59.0 + version: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) vitest: specifier: catalog:default - version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) apps/backend: dependencies: @@ -87,15 +87,15 @@ importers: specifier: workspace:^ version: link:../../packages/core axios: - specifier: ^1.15.1 - version: 1.15.1 + specifier: ^1.15.2 + version: 1.15.2 pg: specifier: ^8.20.0 version: 8.20.0 devDependencies: axios-mock-adapter: specifier: 2.1.0 - version: 2.1.0(axios@1.15.1) + version: 2.1.0(axios@1.15.2) express: specifier: 5.2.1 version: 5.2.1 @@ -104,7 +104,7 @@ importers: version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) apps/frontend: dependencies: @@ -119,7 +119,7 @@ importers: version: link:../../packages/core '@tailwindcss/vite': specifier: ^4.2.2 - version: 4.2.2(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.2.2(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) axios: specifier: ^1 version: 1.15.1 @@ -168,7 +168,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 6.0.1 - version: 6.0.1(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 6.0.1(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -177,16 +177,16 @@ importers: version: 4.2.2 vite: specifier: catalog:default - version: 8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) + version: 8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) vitest: specifier: catalog:default - version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) packages/core: dependencies: axios: - specifier: ^1.15.1 - version: 1.15.1 + specifier: ^1.15.2 + version: 1.15.2 emoji-name-map: specifier: ^2.0.3 version: 2.0.3 @@ -208,7 +208,7 @@ importers: version: 1.1.1 axios-mock-adapter: specifier: 2.1.0 - version: 2.1.0(axios@1.15.1) + version: 2.1.0(axios@1.15.2) js-yaml: specifier: 4.1.1 version: 4.1.1 @@ -217,7 +217,7 @@ importers: version: 29.0.2 vitest: specifier: catalog:default - version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) packages: @@ -479,147 +479,135 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@oxc-parser/binding-android-arm-eabi@0.126.0': - resolution: {integrity: sha512-svyoHt25J4741QJ5aa4R+h0iiBeSRt63Lr3aAZcxy2c/NeSE1IfDeMnSij6rIg7EjxkdlXzz613wUjeCeilBNA==} + '@oxc-parser/binding-android-arm-eabi@0.127.0': + resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm64@0.126.0': - resolution: {integrity: sha512-hPEBRKgplp1mG9GkINFsr4JVMDNrGJLOqfDaadTWpAoTnzYR5Rmv8RMvB3hJZpiNvbk1aacopdHUP1pggMQ/cw==} + '@oxc-parser/binding-android-arm64@0.127.0': + resolution: {integrity: sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-parser/binding-darwin-arm64@0.126.0': - resolution: {integrity: sha512-ccRpu9sdYmznePJQG5halhs0FW5tw5a8zRSoZXOzM1OjoeZ4jiRRruFiPclsD59edoVAK1l83dvfjWz1nQi6lg==} + '@oxc-parser/binding-darwin-arm64@0.127.0': + resolution: {integrity: sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.126.0': - resolution: {integrity: sha512-CHB4zVjNSKqx8Fw9pHowzQQnjjuq04i4Ng0Avj+DixlwhwAoMYqlFbocYIlbg+q3zOLGlm7vEHm83jqEMitnyg==} + '@oxc-parser/binding-darwin-x64@0.127.0': + resolution: {integrity: sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.126.0': - resolution: {integrity: sha512-RQ3nEJdcDKBfBjmLJ3Vl1d0KQERPV1P8eUrnBm7+VTYyoaJSPLVFuPg1mlD1hk3n0/879VLFMfusFkBal4ssWQ==} + '@oxc-parser/binding-freebsd-x64@0.127.0': + resolution: {integrity: sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.126.0': - resolution: {integrity: sha512-onipc2wCDA7Bauzb4KK1mab0GsEDf4ujiIfWECdnmY/2LlzAoX3xdQRLAUyEDB1kn3yilHBrkmXDdHluyHXxiw==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + resolution: {integrity: sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.126.0': - resolution: {integrity: sha512-5BuJJPohrV5NJ8lmcYOMbfRCUGoYH5J9HZHeuqOLwkHXWAuPMN3X1h8bC/2mWjmosdbfTtmyIdX3spS/TkqKNg==} + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + resolution: {integrity: sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.126.0': - resolution: {integrity: sha512-r2KApRgm2pOJaduRm6GOT8x0whcr67AyejNkSdzPt34GJ+Y3axcXN2mwlTs+8lfO/SSmpO5ZJGYiHYnxEE0jkw==} + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + resolution: {integrity: sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-arm64-musl@0.126.0': - resolution: {integrity: sha512-FQ+MMh7MT0Dr/u8+RWmWKlfoeWPQyHDbhhxJShJlYtROXXPHsRs9EvmQOZZ3sx4Nn7JU8NX+oyw2YzQ7anBJcA==} + '@oxc-parser/binding-linux-arm64-musl@0.127.0': + resolution: {integrity: sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-ppc64-gnu@0.126.0': - resolution: {integrity: sha512-Wv/T8C98hRQhGTlx2XFyLn5raRMp9U1lOQD+YnXNgAr7wHbJJpZ8mDBU7Rw+M3WytGcGTFcr6kqgfyQeHVtLbQ==} + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + resolution: {integrity: sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-gnu@0.126.0': - resolution: {integrity: sha512-DHx1rT1zauW0ZbLHOiQh5AC9Xs3UkWx2XmfZHs+7nnWYr3sagrufoUQC+/XPwwjMIlCFXiFGM0sFh3TyOCZwqA==} + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + resolution: {integrity: sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-musl@0.126.0': - resolution: {integrity: sha512-umDc2mTShH0U2zcEYf8mIJ163seLJNn54ZUZYeI5jD4qlg9izPwoLrC2aNPKlMJTu6u/ysmQWiEvIiaAG+INkw==} + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + resolution: {integrity: sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-s390x-gnu@0.126.0': - resolution: {integrity: sha512-PXXeWayclRtO1pxQEeCpiqIglQdhK2mAI2VX5xnsWdImzSB5GpoQ8TNw7vTCKk2k+GZuxl+q1knncidjCyUP9w==} + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + resolution: {integrity: sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.126.0': - resolution: {integrity: sha512-wzocjxm34TbB3bFlqG65JiLtvf6ZDg2ZxRkLLbgXwDQUNU+0MPjQN8zy/0jBKNA5fnPLk3XeVdZ7Uin+7+CVkg==} + '@oxc-parser/binding-linux-x64-gnu@0.127.0': + resolution: {integrity: sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-musl@0.126.0': - resolution: {integrity: sha512-e83uftP60jmkPs2+CW6T6A1GYzN2H6IumDAiTntv9WyHR73PI3ImHNBkYqnA3ukeKI3xjcCbhSh9QeJWmufxGQ==} + '@oxc-parser/binding-linux-x64-musl@0.127.0': + resolution: {integrity: sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxc-parser/binding-openharmony-arm64@0.126.0': - resolution: {integrity: sha512-4WiOILHnPrTDY2/L4mE6PZCYwLN1d3ghma6BuTJ452CCgzRMt3uFplCtR+o3r9zdUWJYb370UizpI9CUcWXr1A==} + '@oxc-parser/binding-openharmony-arm64@0.127.0': + resolution: {integrity: sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-wasm32-wasi@0.126.0': - resolution: {integrity: sha512-Y17hhnrQTrxgAxAyAq401vnN9URsAL4s5AjqpG1NDsXSlhe1yBNnns+rC2P6xcMoitgX5nKH2ryYt9oiFRlzLw==} - engines: {node: '>=14.0.0'} + '@oxc-parser/binding-wasm32-wasi@0.127.0': + resolution: {integrity: sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@oxc-parser/binding-win32-arm64-msvc@0.126.0': - resolution: {integrity: sha512-Znug1u1iRvT4VC3jANz6nhGBHsFwEFMxuimYpJFwMtsB6H5FcEoZRMmH26tHkSTD03JvDmG+gB65W3ajLjPcSw==} + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + resolution: {integrity: sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.126.0': - resolution: {integrity: sha512-qrw7mx5hFFTxVSXToOA40hpnjgNB/DJprZchtB4rDKNLKqkD3F26HbzaQeH1nxAKej0efSZfJd5Sw3qdtOLGhw==} + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + resolution: {integrity: sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.126.0': - resolution: {integrity: sha512-ibB1s+mPUFXvS7MFJO2jpw/aCNs/P6ifnWlRyTYB+WYBpniOiCcHQQskZneJtwcjQMDRol3RGG3ihoYnzXSY4w==} + '@oxc-parser/binding-win32-x64-msvc@0.127.0': + resolution: {integrity: sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-project/types@0.126.0': - resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} '@oxc-resolver/binding-android-arm-eabi@11.19.1': resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} @@ -748,103 +736,103 @@ packages: react-redux: optional: true - '@rolldown/binding-android-arm64@1.0.0-rc.16': - resolution: {integrity: sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==} + '@rolldown/binding-android-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.16': - resolution: {integrity: sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.16': - resolution: {integrity: sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ==} + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.16': - resolution: {integrity: sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': - resolution: {integrity: sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': - resolution: {integrity: sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': - resolution: {integrity: sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': - resolution: {integrity: sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': - resolution: {integrity: sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': - resolution: {integrity: sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': - resolution: {integrity: sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': - resolution: {integrity: sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': - resolution: {integrity: sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': - resolution: {integrity: sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': - resolution: {integrity: sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.16': - resolution: {integrity: sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA==} + '@rolldown/pluginutils@1.0.0-rc.17': + resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} '@rolldown/pluginutils@1.0.0-rc.7': resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} @@ -1026,39 +1014,39 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - '@typescript-eslint/eslint-plugin@8.58.2': - resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} + '@typescript-eslint/eslint-plugin@8.59.0': + resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.2 + '@typescript-eslint/parser': ^8.59.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.58.2': - resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} + '@typescript-eslint/parser@8.59.0': + resolution: {integrity: sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==} 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.1.0' - '@typescript-eslint/project-service@8.58.2': - resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} + '@typescript-eslint/project-service@8.59.0': + resolution: {integrity: sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} + '@typescript-eslint/scope-manager@8.59.0': + resolution: {integrity: sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.58.2': - resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} + '@typescript-eslint/tsconfig-utils@8.59.0': + resolution: {integrity: sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.2': - resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} + '@typescript-eslint/type-utils@8.59.0': + resolution: {integrity: sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -1068,21 +1056,25 @@ packages: resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.58.2': - resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} + '@typescript-eslint/types@8.59.0': + resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.59.0': + resolution: {integrity: sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.58.2': - resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} + '@typescript-eslint/utils@8.59.0': + resolution: {integrity: sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==} 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.1.0' - '@typescript-eslint/visitor-keys@8.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} + '@typescript-eslint/visitor-keys@8.59.0': + resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -1353,6 +1345,9 @@ packages: axios@1.15.1: resolution: {integrity: sha512-WOG+Jj8ZOvR0a3rAn+Tuf1UQJRxw5venr6DgdbJzngJE3qG7X0kL83CZGpdHMxEm+ZK3seAbvFsw4FfOfP9vxg==} + axios@1.15.2: + resolution: {integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1744,9 +1739,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fd-package-json@2.0.0: resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} @@ -2154,8 +2146,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - knip@6.5.0: - resolution: {integrity: sha512-84xSq/g8CtPWLJcY5WZeGWj/pbqQxJRC7iXTTutB0MkMm260hKxlzIXSTnxuTuIxre2MBSokhLkfth8dQQYVPQ==} + knip@6.6.2: + resolution: {integrity: sha512-ma2p+SvgIs1GZZLUV9QJrLkb9gGNBQHk7fcrtt3aVhiW2XEXH/yfMOU88F7ZdriYuBYkB53djPNYMWb2pKVl/g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2411,8 +2403,8 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - oxc-parser@0.126.0: - resolution: {integrity: sha512-FktCvLby/mOHyuijZt22+nOt10dS24gGUZE3XwIbUg7Kf4+rer3/5T7RgwzazlNuVsCjPloZ3p8E+4ONT3A8Kw==} + oxc-parser@0.127.0: + resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} engines: {node: ^20.19.0 || >=22.12.0} oxc-resolver@11.19.1: @@ -2563,9 +2555,6 @@ packages: resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -2666,15 +2655,11 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.0.0-rc.16: - resolution: {integrity: sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==} + rolldown@1.0.0-rc.17: + resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2682,9 +2667,6 @@ packages: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.4: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} @@ -2959,8 +2941,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.58.2: - resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} + typescript-eslint@8.59.0: + resolution: {integrity: sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2971,8 +2953,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - unbash@2.2.0: - resolution: {integrity: sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w==} + unbash@3.0.0: + resolution: {integrity: sha512-FeFPZ/WFT0mbRCuydiZzpPFlrYN8ZUpphQKoq4EeElVIYjYyGzPMxQR/simUwCOJIyVhpFk4RbtyO7RuMpMnHA==} engines: {node: '>=14'} unbox-primitive@1.1.0: @@ -3015,8 +2997,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite@8.0.9: - resolution: {integrity: sha512-t7g7GVRpMXjNpa67HaVWI/8BWtdVIQPCL2WoozXXA7LBGEFK4AkkKkHx2hAQf5x1GZSlcmEDPkVLSGahxnEEZw==} + vite@8.0.10: + resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3479,83 +3461,71 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - - '@oxc-parser/binding-android-arm-eabi@0.126.0': + '@oxc-parser/binding-android-arm-eabi@0.127.0': optional: true - '@oxc-parser/binding-android-arm64@0.126.0': + '@oxc-parser/binding-android-arm64@0.127.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.126.0': + '@oxc-parser/binding-darwin-arm64@0.127.0': optional: true - '@oxc-parser/binding-darwin-x64@0.126.0': + '@oxc-parser/binding-darwin-x64@0.127.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.126.0': + '@oxc-parser/binding-freebsd-x64@0.127.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.126.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.126.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.126.0': + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.126.0': + '@oxc-parser/binding-linux-arm64-musl@0.127.0': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.126.0': + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.126.0': + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.126.0': + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.126.0': + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.126.0': + '@oxc-parser/binding-linux-x64-gnu@0.127.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.126.0': + '@oxc-parser/binding-linux-x64-musl@0.127.0': optional: true - '@oxc-parser/binding-openharmony-arm64@0.126.0': + '@oxc-parser/binding-openharmony-arm64@0.127.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.126.0': + '@oxc-parser/binding-wasm32-wasi@0.127.0': dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.126.0': + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.126.0': + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.126.0': + '@oxc-parser/binding-win32-x64-msvc@0.127.0': optional: true - '@oxc-project/types@0.126.0': {} + '@oxc-project/types@0.127.0': {} '@oxc-resolver/binding-android-arm-eabi@11.19.1': optional: true @@ -3640,56 +3610,56 @@ snapshots: react: 19.2.5 react-redux: 9.2.0(@types/react@19.2.14)(react@19.2.5)(redux@5.0.1) - '@rolldown/binding-android-arm64@1.0.0-rc.16': + '@rolldown/binding-android-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.16': + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.16': + '@rolldown/binding-darwin-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.16': + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': optional: true - '@rolldown/pluginutils@1.0.0-rc.16': {} + '@rolldown/pluginutils@1.0.0-rc.17': {} '@rolldown/pluginutils@1.0.0-rc.7': {} @@ -3760,12 +3730,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - '@tailwindcss/vite@4.2.2(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.2(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@tailwindcss/node': 4.2.2 '@tailwindcss/oxide': 4.2.2 tailwindcss: 4.2.2 - vite: 8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) '@testing-library/dom@10.4.1': dependencies: @@ -3839,14 +3809,14 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/parser': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.0 + '@typescript-eslint/type-utils': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.0 eslint: 10.2.1(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 @@ -3855,41 +3825,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/scope-manager': 8.59.0 + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 eslint: 10.2.1(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@6.0.3)': + '@typescript-eslint/project-service@8.59.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.2': + '@typescript-eslint/scope-manager@8.59.0': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/visitor-keys': 8.59.0 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.59.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) debug: 4.4.3 eslint: 10.2.1(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3899,12 +3869,14 @@ snapshots: '@typescript-eslint/types@8.58.2': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.3)': + '@typescript-eslint/types@8.59.0': {} + + '@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/project-service': 8.59.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 @@ -3914,20 +3886,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.0 + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) eslint: 10.2.1(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.2': + '@typescript-eslint/visitor-keys@8.59.0': dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -3991,10 +3963,10 @@ snapshots: '@uppercod/css-to-object@1.1.1': {} - '@vitejs/plugin-react@6.0.1(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': + '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) '@vitest/coverage-v8@4.1.4(vitest@4.1.4)': dependencies: @@ -4008,7 +3980,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + vitest: 4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) '@vitest/expect@4.1.4': dependencies: @@ -4019,13 +3991,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.4(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.4(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) '@vitest/pretty-format@4.1.4': dependencies: @@ -4173,9 +4145,9 @@ snapshots: object-code: 2.0.0 try: 1.0.3 - axios-mock-adapter@2.1.0(axios@1.15.1): + axios-mock-adapter@2.1.0(axios@1.15.2): dependencies: - axios: 1.15.1 + axios: 1.15.2 fast-deep-equal: 3.1.3 is-buffer: 2.0.5 @@ -4187,6 +4159,14 @@ snapshots: transitivePeerDependencies: - debug + axios@1.15.2: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + balanced-match@1.0.2: {} balanced-match@4.0.4: {} @@ -4505,7 +4485,7 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)))(eslint@10.2.1(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)))(eslint@10.2.1(jiti@2.6.1)): dependencies: debug: 4.4.3 eslint: 10.2.1(jiti@2.6.1) @@ -4516,11 +4496,11 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)): + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)): dependencies: '@package-json/types': 0.0.12 '@typescript-eslint/types': 8.58.2 @@ -4534,7 +4514,7 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -4708,10 +4688,6 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.20.1: - dependencies: - reusify: 1.1.0 - fd-package-json@2.0.0: dependencies: walk-up-path: 4.0.0 @@ -5118,21 +5094,20 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@6.5.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + knip@6.6.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): dependencies: - '@nodelib/fs.walk': 1.2.8 + fdir: 6.5.0(picomatch@4.0.4) formatly: 0.3.0 get-tsconfig: 4.14.0 jiti: 2.6.1 minimist: 1.2.8 - oxc-parser: 0.126.0 + oxc-parser: 0.127.0 oxc-resolver: 11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - picocolors: 1.1.1 picomatch: 4.0.4 smol-toml: 1.6.1 strip-json-comments: 5.0.3 tinyglobby: 0.2.16 - unbash: 2.2.0 + unbash: 3.0.0 yaml: 2.8.3 zod: 4.3.6 transitivePeerDependencies: @@ -5371,30 +5346,30 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-parser@0.126.0: + oxc-parser@0.127.0: dependencies: - '@oxc-project/types': 0.126.0 + '@oxc-project/types': 0.127.0 optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.126.0 - '@oxc-parser/binding-android-arm64': 0.126.0 - '@oxc-parser/binding-darwin-arm64': 0.126.0 - '@oxc-parser/binding-darwin-x64': 0.126.0 - '@oxc-parser/binding-freebsd-x64': 0.126.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.126.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.126.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.126.0 - '@oxc-parser/binding-linux-arm64-musl': 0.126.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.126.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.126.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.126.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.126.0 - '@oxc-parser/binding-linux-x64-gnu': 0.126.0 - '@oxc-parser/binding-linux-x64-musl': 0.126.0 - '@oxc-parser/binding-openharmony-arm64': 0.126.0 - '@oxc-parser/binding-wasm32-wasi': 0.126.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.126.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.126.0 - '@oxc-parser/binding-win32-x64-msvc': 0.126.0 + '@oxc-parser/binding-android-arm-eabi': 0.127.0 + '@oxc-parser/binding-android-arm64': 0.127.0 + '@oxc-parser/binding-darwin-arm64': 0.127.0 + '@oxc-parser/binding-darwin-x64': 0.127.0 + '@oxc-parser/binding-freebsd-x64': 0.127.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.127.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.127.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.127.0 + '@oxc-parser/binding-linux-arm64-musl': 0.127.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.127.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.127.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.127.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.127.0 + '@oxc-parser/binding-linux-x64-gnu': 0.127.0 + '@oxc-parser/binding-linux-x64-musl': 0.127.0 + '@oxc-parser/binding-openharmony-arm64': 0.127.0 + '@oxc-parser/binding-wasm32-wasi': 0.127.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.127.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.127.0 + '@oxc-parser/binding-win32-x64-msvc': 0.127.0 oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): optionalDependencies: @@ -5546,8 +5521,6 @@ snapshots: dependencies: side-channel: 1.1.0 - queue-microtask@1.2.3: {} - range-parser@1.2.1: {} raw-body@3.0.2: @@ -5649,30 +5622,28 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - reusify@1.1.0: {} - rfdc@1.4.1: {} - rolldown@1.0.0-rc.16: + rolldown@1.0.0-rc.17: dependencies: - '@oxc-project/types': 0.126.0 - '@rolldown/pluginutils': 1.0.0-rc.16 + '@oxc-project/types': 0.127.0 + '@rolldown/pluginutils': 1.0.0-rc.17 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.16 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.16 - '@rolldown/binding-darwin-x64': 1.0.0-rc.16 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.16 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.16 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.16 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.16 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.16 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.16 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.16 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.16 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.16 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.16 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.16 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.16 + '@rolldown/binding-android-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-x64': 1.0.0-rc.17 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 router@2.2.0: dependencies: @@ -5684,10 +5655,6 @@ snapshots: transitivePeerDependencies: - supports-color - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - safe-array-concat@1.1.4: dependencies: call-bind: 1.0.9 @@ -6018,12 +5985,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3): + typescript-eslint@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) eslint: 10.2.1(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: @@ -6031,7 +5998,7 @@ snapshots: typescript@6.0.3: {} - unbash@2.2.0: {} + unbash@3.0.0: {} unbox-primitive@1.1.0: dependencies: @@ -6088,12 +6055,12 @@ snapshots: vary@1.1.2: {} - vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3): + vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.10 - rolldown: 1.0.0-rc.16 + rolldown: 1.0.0-rc.17 tinyglobby: 0.2.16 optionalDependencies: '@types/node': 24.12.2 @@ -6101,10 +6068,10 @@ snapshots: jiti: 2.6.1 yaml: 2.8.3 - vitest@4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)): + vitest@4.1.4(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jsdom@29.0.2)(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.4 - '@vitest/mocker': 4.1.4(vite@8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.4(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.4 '@vitest/runner': 4.1.4 '@vitest/snapshot': 4.1.4 @@ -6121,7 +6088,7 @@ snapshots: tinyexec: 1.1.1 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.9(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.12.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e4110694..7a6da682 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,7 +4,7 @@ packages: catalog: "@vitest/coverage-v8": 4.1.4 - vite: 8.0.9 + vite: 8.0.10 vitest: 4.1.4 minimumReleaseAge: 10080 From 46df37adb7cc44a241ba97298e78ff3251e99d0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 May 2026 13:56:59 +0200 Subject: [PATCH 55/57] build(deps): Bump axios from 1.15.1 to 1.15.2 in the axios group across 1 directory (#195) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the axios group with 1 update in the / directory: [axios](https://github.com/axios/axios). Updates `axios` from 1.15.1 to 1.15.2
Release notes

Sourced from axios's releases.

v1.15.2

This release delivers prototype-pollution hardening for the Node HTTP adapter, adds an opt-in allowedSocketPaths allowlist to mitigate SSRF via Unix domain sockets, fixes a keep-alive socket memory leak, and ships supply-chain hardening across CI and security docs.

🔒 Security Fixes

  • Prototype Pollution Hardening (HTTP Adapter): Hardened the Node HTTP adapter and resolveConfig/mergeConfig/validator paths to read only own properties and use null-prototype config objects, preventing polluted auth, baseURL, socketPath, beforeRedirect, and insecureHTTPParser from influencing requests. (#10779)
  • SSRF via socketPath: Rejects non-string socketPath values and adds an opt-in allowedSocketPaths config option to restrict permitted Unix domain socket paths, returning AxiosError ERR_BAD_OPTION_VALUE on mismatch. (#10777)
  • Supply-chain Hardening: Added .npmrc with ignore-scripts=true, lockfile lint CI, non-blocking reproducible build diff, scoped CODEOWNERS, expanded SECURITY.md/THREATMODEL.md with provenance verification (npm audit signatures), 60-day resolution policy, and maintainer incident-response runbook. (#10776)

🚀 New Features

  • allowedSocketPaths Config Option: New request config option (and TypeScript types) to allowlist Unix domain socket paths used by the Node http adapter; backwards compatible when unset. (#10777)

🐛 Bug Fixes

  • Keep-alive Socket Memory Leak: Installs a single per-socket error listener tracking the active request via kAxiosSocketListener/kAxiosCurrentReq, eliminating per-request listener accumulation, MaxListenersExceededWarning, and linear heap growth under concurrent or long-running keep-alive workloads (fixes #10780). (#10788)

🔧 Maintenance & Chores

  • Changelog: Updated CHANGELOG.md with v1.15.1 release notes. (#10781)

Full Changelog

Changelog

Sourced from axios's changelog.

v1.15.2 - April 21, 2026

This release delivers prototype-pollution hardening for the Node HTTP adapter, adds an opt-in allowedSocketPaths allowlist to mitigate SSRF via Unix domain sockets, fixes a keep-alive socket memory leak, and ships supply-chain hardening across CI and security docs.

🔒 Security Fixes

  • Prototype Pollution Hardening (HTTP Adapter): Hardened the Node HTTP adapter and resolveConfig/mergeConfig/validator paths to read only own properties and use null-prototype config objects, preventing polluted auth, baseURL, socketPath, beforeRedirect, and insecureHTTPParser from influencing requests. (#10779)
  • SSRF via socketPath: Rejects non-string socketPath values and adds an opt-in allowedSocketPaths config option to restrict permitted Unix domain socket paths, returning AxiosError ERR_BAD_OPTION_VALUE on mismatch. (#10777)
  • Supply-chain Hardening: Added .npmrc with ignore-scripts=true, lockfile lint CI, non-blocking reproducible build diff, scoped CODEOWNERS, expanded SECURITY.md/THREATMODEL.md with provenance verification (npm audit signatures), 60-day resolution policy, and maintainer incident-response runbook. (#10776)

🚀 New Features

  • allowedSocketPaths Config Option: New request config option (and TypeScript types) to allowlist Unix domain socket paths used by the Node http adapter; backwards compatible when unset. (#10777)

🐛 Bug Fixes

  • Keep-alive Socket Memory Leak: Installs a single per-socket error listener tracking the active request via kAxiosSocketListener/kAxiosCurrentReq, eliminating per-request listener accumulation, MaxListenersExceededWarning, and linear heap growth under concurrent or long-running keep-alive workloads (fixes #10780). (#10788)

🔧 Maintenance & Chores

  • Changelog: Updated CHANGELOG.md with v1.15.1 release notes. (#10781)

Full Changelog


Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee56e4a6..2683dc56 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,10 +122,10 @@ importers: version: 4.2.2(vite@8.0.10(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) axios: specifier: ^1 - version: 1.15.1 + version: 1.15.2 axios-cache-interceptor: specifier: ^1 - version: 1.12.0(axios@1.15.1) + version: 1.12.0(axios@1.15.2) daisyui: specifier: ^5.5.19 version: 5.5.19 @@ -1342,9 +1342,6 @@ packages: peerDependencies: axios: '>= 0.17.0' - axios@1.15.1: - resolution: {integrity: sha512-WOG+Jj8ZOvR0a3rAn+Tuf1UQJRxw5venr6DgdbJzngJE3qG7X0kL83CZGpdHMxEm+ZK3seAbvFsw4FfOfP9vxg==} - axios@1.15.2: resolution: {integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==} @@ -4136,9 +4133,9 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios-cache-interceptor@1.12.0(axios@1.15.1): + axios-cache-interceptor@1.12.0(axios@1.15.2): dependencies: - axios: 1.15.1 + axios: 1.15.2 cache-parser: 1.2.6 fast-defer: 1.1.9 http-vary: 1.0.3 @@ -4151,14 +4148,6 @@ snapshots: fast-deep-equal: 3.1.3 is-buffer: 2.0.5 - axios@1.15.1: - dependencies: - follow-redirects: 1.16.0 - form-data: 4.0.5 - proxy-from-env: 2.1.0 - transitivePeerDependencies: - - debug - axios@1.15.2: dependencies: follow-redirects: 1.16.0 From 1da425c0bb7af13ac1f102ee453989420f5fc4d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 May 2026 13:57:31 +0200 Subject: [PATCH 56/57] build(deps-dev): Bump knip from 6.6.2 to 6.7.0 (#202) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 6.6.2 to 6.7.0.
Release notes

Sourced from knip's releases.

Release 6.7.0

  • Fix markdown reporter column width (resolve #1700) (4713108de98bcfe76eb606036b9f968abe3e89a0)
  • Handle Vitest agent and minimal reporters (#1701) (a71ead11b99aaa67f31eed7b35628907b2dddd06) - thanks @​dskwrite!
  • Add e2e tests w/ tsgo defs + lib consumption (98113e61d913e47631748b58c25d1042c8dd387e)
  • Fix pkg name inconsistencies (544c3e68d72dd754b20f8e0b0bf8ed107c05d677)
  • Add export {} to maintain module shape (27d8a0230c10f2827ba1e1a8b2c65020554f61f8)
  • Strip leading UTF-8 BOM before parsing package.json (47e4029c39ff95043cd495681e4c7558970b0ed9)
  • Skip workspace with invalid JSON manifest (bfb48670966387a3cd26005b9fb9d8769b2a1213)
  • Preserve out-of-bound writes to stdout/err (95faad8d6219ba456a3700df697273eb154c1dd9)
  • Consistent prefix in logError/logWarning (2c6d8a049d1c20d9427425b4abae3b76ac7a5720)
  • Don't exit on config file load error (0914bd3832b1851e4d34137577c0d08efaf8aef6)
  • Fix tsgo resolution in e2e tests (a68950131e33214ef2a4f13d11fab1a78c16bad6)

Release 6.6.3

  • Use venz chart svg directly from CDN (ba7e9073d1770e4a21ec18435bcb61f394db0d1c)
  • Bump that plugin counter (abae75bbd3030e006fe67d3f63641a31a65e671c)
  • Fix plugin title (f2b8fcfc94bb78fb70dfe2be3f48ef8f254066f7)
  • Work Table util class: fix bugs, tighten API, water-fill widths (2eb4045e0f34c2638875504b9b64e881e9a74db5)
  • Questionable.. (970a0dbdfc7b59df2fd0a3064a4bd6be4e5a59bc)
  • Fmt (14538ec1fe94cdf3c45798515160609f3ffbec9d)
  • Ensure output is flushed on exit (#1699) (9533365115d4704e9b057b7ba8d5f43fd553d1a1) - thanks @​joshkel!
  • Use currentColor to support light/dark themes (7ea055aa68b86ccc6cb302a3092c2da9e56cdde6)
  • Tighten type-chain alignment + gate via ignoreExportsUsedInFile (resolve #1698) (0910b33fc6c07867a751af2e26989a61c8a6c548)
  • Eating our own dog food ↻ (d5aa1f6b007a2dfef1a8326000dc1802510d64ab)
Commits
  • ca5545e Release knip@6.7.0
  • a689501 Fix tsgo resolution in e2e tests
  • 0914bd3 Don't exit on config file load error
  • 2c6d8a0 Consistent prefix in logError/logWarning
  • 95faad8 Preserve out-of-bound writes to stdout/err
  • bfb4867 Skip workspace with invalid JSON manifest
  • 47e4029 Strip leading UTF-8 BOM before parsing package.json
  • 27d8a02 Add export {} to maintain module shape
  • 544c3e6 Fix pkg name inconsistencies
  • 98113e6 Add e2e tests w/ tsgo defs + lib consumption
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=knip&package-manager=npm_and_yarn&previous-version=6.6.2&new-version=6.7.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e3aa77fa..0218d635 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "eslint-plugin-react-hooks": "7.1.1", "globals": "17.5.0", "husky": "9.1.7", - "knip": "6.6.2", + "knip": "6.7.0", "lint-staged": "16.4.0", "prettier": "3.8.3", "turbo": "2.9.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2683dc56..ce310c0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,8 +60,8 @@ importers: specifier: 9.1.7 version: 9.1.7 knip: - specifier: 6.6.2 - version: 6.6.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + specifier: 6.7.0 + version: 6.7.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) lint-staged: specifier: 16.4.0 version: 16.4.0 @@ -2143,8 +2143,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - knip@6.6.2: - resolution: {integrity: sha512-ma2p+SvgIs1GZZLUV9QJrLkb9gGNBQHk7fcrtt3aVhiW2XEXH/yfMOU88F7ZdriYuBYkB53djPNYMWb2pKVl/g==} + knip@6.7.0: + resolution: {integrity: sha512-ckL51NDH1YJxnv1kNB0iUdDngB4f/e9Igz8uIqYfmNDoyOFmmk1V0WFv3LQ7/hzC63b2Z9X41gGUE9eOWrZpaA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -5083,7 +5083,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@6.6.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + knip@6.7.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): dependencies: fdir: 6.5.0(picomatch@4.0.4) formatly: 0.3.0 From f67dd0f38103ac26484758d3896f3f60d1b4e066 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 3 May 2026 14:04:12 +0200 Subject: [PATCH 57/57] Update languages JSON (#203) The [update-langs](https://github.com/stats-organization/github-stats-extended/actions/workflows/update-langs.yml) action found new/updated languages in the [upstream languages JSON file](https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml). Co-authored-by: martin-mfg <2026226+martin-mfg@users.noreply.github.com> --- packages/core/src/common/languageColors.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/common/languageColors.json b/packages/core/src/common/languageColors.json index 86adccb2..c59f870c 100644 --- a/packages/core/src/common/languageColors.json +++ b/packages/core/src/common/languageColors.json @@ -538,6 +538,7 @@ "Snakemake": "#419179", "Solidity": "#AA6746", "SourcePawn": "#f69e1d", + "SpiceDB Schema": "#a5318a", "Squirrel": "#800000", "Stan": "#b2011d", "Standard ML": "#dc566d",