diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c6b1aa80..9c0b9679 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,3 +62,6 @@ jobs: - name: Lint run: pnpm run lint + + - name: Lint (knip) + run: pnpm run lint:knip diff --git a/.husky/pre-commit b/.husky/pre-commit index 0204386f..b4c15f46 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,5 +1,4 @@ -pnpm run format:check +pnpm lint-staged pnpm run lint # TODO enable # npm test -# npx lint-staged diff --git a/.prettierrc.json b/.prettierrc.json index d3ddf47e..f28cd600 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -5,5 +5,13 @@ "trailingComma": "all", "singleQuote": false, "printWidth": 80, - "tabWidth": 2 + "tabWidth": 2, + "overrides": [ + { + "files": ["*.jsonc"], + "options": { + "trailingComma": "none" + } + } + ] } diff --git a/apps/backend/express.js b/apps/backend/express.js index 92a7fb16..9948221a 100644 --- a/apps/backend/express.js +++ b/apps/backend/express.js @@ -1,9 +1,9 @@ import "dotenv/config"; -import statsCard from "./api/index.js"; -import repoCard from "./api/pin.js"; -import langCard from "./api/top-langs.js"; -import wakatimeCard from "./api/wakatime.js"; -import gistCard from "./api/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 gistCard from "./api-renamed/gist.js"; import express from "express"; const app = express(); diff --git a/apps/backend/package.json b/apps/backend/package.json index e70aefa4..cad22140 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -35,21 +35,19 @@ "devDependencies": { "@actions/core": "^2.0.1", "@actions/github": "^6.0.1", + "@jest/globals": "30.2.0", "@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", "color-contrast-checker": "^2.1.0", "express": "^5.2.1", - "globals": "^16.5.0", "hjson": "^3.2.2", "jest": "^30.2.0", "jest-environment-jsdom": "^30.2.0", "js-yaml": "^4.1.1", - "lint-staged": "^16.2.7", "lodash.snakecase": "^4.1.1", - "parse-diff": "^0.11.1", - "prettier": "^3.7.3" + "parse-diff": "^0.11.1" }, "dependencies": { "axios": "^1.13.1", @@ -59,9 +57,6 @@ "pg": "^8.16.2", "word-wrap": "^1.2.5" }, - "lint-staged": { - "*.{js,css,md}": "prettier --write" - }, "engines": { "node": "24.x" } diff --git a/apps/backend/src/calculateRank.js b/apps/backend/src/calculateRank.js index a7741985..377b3fbe 100644 --- a/apps/backend/src/calculateRank.js +++ b/apps/backend/src/calculateRank.js @@ -84,4 +84,3 @@ function calculateRank({ } export { calculateRank }; -export default calculateRank; diff --git a/apps/backend/src/cards/gist.js b/apps/backend/src/cards/gist.js index 5d1ccb50..b71c44f9 100644 --- a/apps/backend/src/cards/gist.js +++ b/apps/backend/src/cards/gist.js @@ -138,5 +138,4 @@ const renderGistCard = (gistData, options = {}) => { `); }; -export { renderGistCard, HEADER_MAX_LENGTH }; -export default renderGistCard; +export { renderGistCard }; diff --git a/apps/backend/src/cards/repo.js b/apps/backend/src/cards/repo.js index c9f13999..fbbbdf36 100644 --- a/apps/backend/src/cards/repo.js +++ b/apps/backend/src/cards/repo.js @@ -322,4 +322,3 @@ const renderRepoCard = (repo, options = {}) => { }; export { renderRepoCard }; -export default renderRepoCard; diff --git a/apps/backend/src/cards/stats.js b/apps/backend/src/cards/stats.js index 5a786fed..f3063ac1 100644 --- a/apps/backend/src/cards/stats.js +++ b/apps/backend/src/cards/stats.js @@ -672,4 +672,3 @@ const renderStatsCard = ( }; export { renderStatsCard, createTextNode }; -export default renderStatsCard; diff --git a/apps/backend/src/cards/types.d.ts b/apps/backend/src/cards/types.d.ts index ade80677..77e7f8a8 100644 --- a/apps/backend/src/cards/types.d.ts +++ b/apps/backend/src/cards/types.d.ts @@ -1,7 +1,7 @@ type ThemeNames = keyof typeof import("../../themes/index.js"); type RankIcon = "default" | "github" | "percentile"; -export type CommonOptions = { +type CommonOptions = { title_color: string; icon_color: string; text_color: string; diff --git a/apps/backend/src/cards/wakatime.js b/apps/backend/src/cards/wakatime.js index 235c25a1..2012f9c2 100644 --- a/apps/backend/src/cards/wakatime.js +++ b/apps/backend/src/cards/wakatime.js @@ -469,4 +469,3 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => { }; export { renderWakatimeCard }; -export default renderWakatimeCard; diff --git a/apps/backend/src/common/I18n.js b/apps/backend/src/common/I18n.js index 75b9c91a..8cf1f445 100644 --- a/apps/backend/src/common/I18n.js +++ b/apps/backend/src/common/I18n.js @@ -40,4 +40,3 @@ class I18n { } export { I18n }; -export default I18n; diff --git a/apps/backend/src/common/blacklist.js b/apps/backend/src/common/blacklist.js index c363a071..c9598b83 100644 --- a/apps/backend/src/common/blacklist.js +++ b/apps/backend/src/common/blacklist.js @@ -7,4 +7,3 @@ const blacklist = [ ]; export { blacklist }; -export default blacklist; diff --git a/apps/backend/src/common/icons.js b/apps/backend/src/common/icons.js index 18e556eb..4a805d44 100644 --- a/apps/backend/src/common/icons.js +++ b/apps/backend/src/common/icons.js @@ -53,4 +53,3 @@ const rankIcon = (rankIcon, rankLevel, percentile) => { }; export { icons, rankIcon }; -export default icons; diff --git a/apps/backend/src/common/log.js b/apps/backend/src/common/log.js index 8a0e58b6..5836d50a 100644 --- a/apps/backend/src/common/log.js +++ b/apps/backend/src/common/log.js @@ -11,4 +11,3 @@ const logger = process.env.NODE_ENV === "test" ? { log: noop, error: noop } : console; export { logger }; -export default logger; diff --git a/apps/backend/src/fetchers/gist.js b/apps/backend/src/fetchers/gist.js index ea4ec183..da27f994 100644 --- a/apps/backend/src/fetchers/gist.js +++ b/apps/backend/src/fetchers/gist.js @@ -111,4 +111,3 @@ const fetchGist = async (id) => { }; export { fetchGist }; -export default fetchGist; diff --git a/apps/backend/src/fetchers/repo.js b/apps/backend/src/fetchers/repo.js index 74d76f84..04371c5b 100644 --- a/apps/backend/src/fetchers/repo.js +++ b/apps/backend/src/fetchers/repo.js @@ -159,4 +159,3 @@ const fetchRepo = async ( }; export { fetchRepo }; -export default fetchRepo; diff --git a/apps/backend/src/fetchers/stats.js b/apps/backend/src/fetchers/stats.js index e3634457..535f9d7e 100644 --- a/apps/backend/src/fetchers/stats.js +++ b/apps/backend/src/fetchers/stats.js @@ -455,4 +455,3 @@ const fetchStats = async ( }; export { fetchStats, fetchRepoUserStats }; -export default fetchStats; diff --git a/apps/backend/src/fetchers/top-languages.js b/apps/backend/src/fetchers/top-languages.js index 2345bcc8..60e6d6f8 100644 --- a/apps/backend/src/fetchers/top-languages.js +++ b/apps/backend/src/fetchers/top-languages.js @@ -166,4 +166,3 @@ const fetchTopLanguages = async ( }; export { fetchTopLanguages }; -export default fetchTopLanguages; diff --git a/apps/backend/src/fetchers/wakatime.js b/apps/backend/src/fetchers/wakatime.js index a081dbd2..2cf11e87 100644 --- a/apps/backend/src/fetchers/wakatime.js +++ b/apps/backend/src/fetchers/wakatime.js @@ -34,4 +34,3 @@ const fetchWakatimeStats = async ({ username, api_domain }) => { }; export { fetchWakatimeStats }; -export default fetchWakatimeStats; diff --git a/apps/backend/src/translations.js b/apps/backend/src/translations.js index 5ba7e96e..dd2643e5 100644 --- a/apps/backend/src/translations.js +++ b/apps/backend/src/translations.js @@ -1126,7 +1126,6 @@ const isLocaleAvailable = (locale) => { }; export { - availableLocales, isLocaleAvailable, langCardLocales, repoCardLocales, diff --git a/apps/backend/tests/bench/api.bench.js b/apps/backend/tests/bench/api.bench.js index d6581da3..2106df54 100644 --- a/apps/backend/tests/bench/api.bench.js +++ b/apps/backend/tests/bench/api.bench.js @@ -1,4 +1,4 @@ -import api from "../../api/index.js"; +import api from "../../api-renamed/index.js"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; import { it, jest } from "@jest/globals"; diff --git a/apps/backend/tests/bench/gist.bench.js b/apps/backend/tests/bench/gist.bench.js index 66e618ec..f310ea37 100644 --- a/apps/backend/tests/bench/gist.bench.js +++ b/apps/backend/tests/bench/gist.bench.js @@ -1,4 +1,4 @@ -import gist from "../../api/gist.js"; +import gist from "../../api-renamed/gist.js"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; import { it, jest } from "@jest/globals"; diff --git a/apps/backend/tests/bench/pin.bench.js b/apps/backend/tests/bench/pin.bench.js index 9a249846..e862617b 100644 --- a/apps/backend/tests/bench/pin.bench.js +++ b/apps/backend/tests/bench/pin.bench.js @@ -1,4 +1,4 @@ -import pin from "../../api/pin.js"; +import pin from "../../api-renamed/pin.js"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; import { it, jest } from "@jest/globals"; diff --git a/apps/backend/themes/index.js b/apps/backend/themes/index.js index f5d8d916..98fab2d3 100644 --- a/apps/backend/themes/index.js +++ b/apps/backend/themes/index.js @@ -463,5 +463,3 @@ export const themes = { bg_color: "35,4158d0,c850c0,ffcc70", }, }; - -export default themes; diff --git a/knip.jsonc b/knip.jsonc new file mode 100644 index 00000000..edcceb34 --- /dev/null +++ b/knip.jsonc @@ -0,0 +1,22 @@ +{ + "$schema": "./node_modules/knip/schema.json", + "ignoreWorkspaces": ["apps/frontend/**"], + "workspaces": { + "apps/backend": { + "entry": [ + "api-renamed/*.js", + "express.js", + + "jest.*.js", + "tests/bench/*.bench.js" + ], + "ignoreFiles": [ + "_dot_vercel_copy/**/*" // Hopefully by using a npm package this file will be removed + ], + "ignoreDependencies": [ + "jest", // used by test scripts referencing binary due to lack of ESM support + "@octokit/request-error" // used by js scripts executed in a GitHub actions not listed in deps + ] + } + } +} diff --git a/package.json b/package.json index 22ffc78c..a9f958d5 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "eslint-plugin-react-hooks": "7.0.1", "globals": "16.5.0", "husky": "9.1.7", + "knip": "5.81.0", + "lint-staged": "16.2.7", "prettier": "3.7.4" }, "scripts": { @@ -19,7 +21,11 @@ "format": "prettier --write .", "format:check": "prettier --check .", "lint": "eslint", - "lint:fix": "eslint --fix" + "lint:fix": "eslint --fix", + "lint:knip": "knip" + }, + "lint-staged": { + "*.{js,ts,css}": "prettier --write" }, "resolutions": { "eslint": "9.39.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 56e49e7f..64b9d262 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,28 +17,34 @@ importers: devDependencies: '@eslint/compat': specifier: 2.0.1 - version: 2.0.1(eslint@9.39.2(jiti@1.21.7)) + version: 2.0.1(eslint@9.39.2(jiti@2.6.1)) '@eslint/js': specifier: 9.39.2 version: 9.39.2 eslint: specifier: 9.39.2 - version: 9.39.2(jiti@1.21.7) + version: 9.39.2(jiti@2.6.1) eslint-plugin-jsdoc: specifier: 61.7.1 - version: 61.7.1(eslint@9.39.2(jiti@1.21.7)) + version: 61.7.1(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@9.39.2(jiti@1.21.7)) + version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: 7.0.1 - version: 7.0.1(eslint@9.39.2(jiti@1.21.7)) + version: 7.0.1(eslint@9.39.2(jiti@2.6.1)) globals: specifier: 16.5.0 version: 16.5.0 husky: specifier: 9.1.7 version: 9.1.7 + knip: + specifier: 5.81.0 + version: 5.81.0(@types/node@25.0.3)(typescript@4.9.5) + lint-staged: + specifier: 16.2.7 + version: 16.2.7 prettier: specifier: 3.7.4 version: 3.7.4 @@ -70,6 +76,9 @@ importers: '@actions/github': specifier: ^6.0.1 version: 6.0.1 + '@jest/globals': + specifier: 30.2.0 + version: 30.2.0 '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -88,9 +97,6 @@ importers: express: specifier: ^5.2.1 version: 5.2.1 - globals: - specifier: ^16.5.0 - version: 16.5.0 hjson: specifier: ^3.2.2 version: 3.2.2 @@ -103,18 +109,12 @@ importers: js-yaml: specifier: ^4.1.1 version: 4.1.1 - lint-staged: - specifier: ^16.2.7 - version: 16.2.7 lodash.snakecase: specifier: ^4.1.1 version: 4.1.1 parse-diff: specifier: ^0.11.1 version: 0.11.1 - prettier: - specifier: ^3.7.3 - version: 3.7.4 apps/frontend: dependencies: @@ -1488,6 +1488,9 @@ 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==} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -1551,6 +1554,114 @@ packages: '@octokit/types@13.10.0': resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + '@oxc-resolver/binding-android-arm-eabi@11.16.3': + resolution: {integrity: sha512-CVyWHu6ACDqDcJxR4nmGiG8vDF4TISJHqRNzac5z/gPQycs/QrP/1pDsJBy0MD7jSw8nVq2E5WqeHQKabBG/Jg==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.16.3': + resolution: {integrity: sha512-tTIoB7plLeh2o6Ay7NnV5CJb6QUXdxI7Shnsp2ECrLSV81k+oVE3WXYrQSh4ltWL75i0OgU5Bj3bsuyg5SMepw==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.16.3': + resolution: {integrity: sha512-OXKVH7uwYd3Rbw1s2yJZd6/w+6b01iaokZubYhDAq4tOYArr+YCS+lr81q1hsTPPRZeIsWE+rJLulmf1qHdYZA==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.16.3': + resolution: {integrity: sha512-WwjQ4WdnCxVYZYd3e3oY5XbV3JeLy9pPMK+eQQ2m8DtqUtbxnvPpAYC2Knv/2bS6q5JiktqOVJ2Hfia3OSo0/A==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.16.3': + resolution: {integrity: sha512-4OHKFGJBBfOnuJnelbCS4eBorI6cj54FUxcZJwEXPeoLc8yzORBoJ2w+fQbwjlQcUUZLEg92uGhKCRiUoqznjg==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.16.3': + resolution: {integrity: sha512-OM3W0NLt9u7uKwG/yZbeXABansZC0oZeDF1nKgvcZoRw4/Yak6/l4S0onBfDFeYMY94eYeAt2bl60e30lgsb5A==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.16.3': + resolution: {integrity: sha512-MRs7D7i1t7ACsAdTuP81gLZES918EpBmiUyEl8fu302yQB+4L7L7z0Ui8BWnthUTQd3nAU9dXvENLK/SqRVH8A==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.16.3': + resolution: {integrity: sha512-0eVYZxSceNqGADzhlV4ZRqkHF0fjWxRXQOB7Qwl5y1gN/XYUDvMfip+ngtzj4dM7zQT4U97hUhJ7PUKSy/JIGQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-arm64-musl@11.16.3': + resolution: {integrity: sha512-B1BvLeZbgDdVN0FvU40l5Q7lej8310WlabCBaouk8jY7H7xbI8phtomTtk3Efmevgfy5hImaQJu6++OmcFb2NQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.16.3': + resolution: {integrity: sha512-q7khglic3Jqak7uDgA3MFnjDeI7krQT595GDZpvFq785fmFYSx8rlTkoHzmhQtUisYtl4XG7WUscwsoidFUI4w==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.16.3': + resolution: {integrity: sha512-aFRNmQNPzDgQEbw2s3c8yJYRimacSDI+u9df8rn5nSKzTVitHmbEpZqfxpwNLCKIuLSNmozHR1z1OT+oZVeYqg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-riscv64-musl@11.16.3': + resolution: {integrity: sha512-vZI85SvSMADcEL9G1TIrV0Rlkc1fY5Mup0DdlVC5EHPysZB4hXXHpr+h09pjlK5y+5om5foIzDRxE1baUCaWOA==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-s390x-gnu@11.16.3': + resolution: {integrity: sha512-xiLBnaUlddFEzRHiHiSGEMbkg8EwZY6VD8F+3GfnFsiK3xg/4boaUV2bwXd+nUzl3UDQOMW1QcZJ4jJSb0qiJA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-gnu@11.16.3': + resolution: {integrity: sha512-6y0b05wIazJJgwu7yU/AYGFswzQQudYJBOb/otDhiDacp1+6ye8egoxx63iVo9lSpDbipL++54AJQFlcOHCB+g==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-musl@11.16.3': + resolution: {integrity: sha512-RmMgwuMa42c9logS7Pjprf5KCp8J1a1bFiuBFtG9/+yMu0BhY2t+0VR/um7pwtkNFvIQqAVh6gDOg/PnoKRcdQ==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-openharmony-arm64@11.16.3': + resolution: {integrity: sha512-/7AYRkjjW7xu1nrHgWUFy99Duj4/ydOBVaHtODie9/M6fFngo+8uQDFFnzmr4q//sd/cchIerISp/8CQ5TsqIA==} + cpu: [arm64] + os: [openharmony] + + '@oxc-resolver/binding-wasm32-wasi@11.16.3': + resolution: {integrity: sha512-urM6aIPbi5di4BSlnpd/TWtDJgG6RD06HvLBuNM+qOYuFtY1/xPbzQ2LanBI2ycpqIoIZwsChyplALwAMdyfCQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.16.3': + resolution: {integrity: sha512-QuvLqGKf7frxWHQ5TnrcY0C/hJpANsaez99Q4dAk1hen7lDTD4FBPtBzPnntLFXeaVG3PnSmnVjlv0vMILwU7Q==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-ia32-msvc@11.16.3': + resolution: {integrity: sha512-QR/witXK6BmYTlEP8CCjC5fxeG5U9A6a50pNpC1nLnhAcJjtzFG8KcQ5etVy/XvCLiDc7fReaAWRNWtCaIhM8Q==} + cpu: [ia32] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.16.3': + resolution: {integrity: sha512-bFuJRKOscsDAEZ/a8BezcTMAe2BQ/OBRfuMLFUuINfTR5qGVcm4a3xBIrQVepBaPxFj16SJdRjGe05vDiwZmFw==} + cpu: [x64] + os: [win32] + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3535,6 +3646,9 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -3642,6 +3756,11 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} + formatly@0.3.0: + resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} + engines: {node: '>=18.3.0'} + hasBin: true + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -4567,6 +4686,10 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4661,6 +4784,14 @@ packages: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} + knip@5.81.0: + resolution: {integrity: sha512-EM9YdNg6zU2DWMJuc9zD8kPUpj0wvPspa63Qe9DPGygzL956uYThfoUQk5aNpPmMr9hs/k+Xm7FLuWFKERFkrQ==} + engines: {node: '>=18.18.0'} + hasBin: true + peerDependencies: + '@types/node': '>=18' + typescript: '>=5.0.4 <7' + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -5059,6 +5190,9 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxc-resolver@11.16.3: + resolution: {integrity: sha512-goLOJH3x69VouGWGp5CgCIHyksmOZzXr36lsRmQz1APg3SPFORrvV2q7nsUHMzLVa6ZJgNwkgUSJFsbCpAWkCA==} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -6251,6 +6385,10 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} + smol-toml@1.6.0: + resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} + engines: {node: '>= 18'} + sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} @@ -6445,6 +6583,10 @@ packages: 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'} + style-loader@3.3.4: resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} engines: {node: '>= 12.13.0'} @@ -6847,6 +6989,10 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -8329,13 +8475,18 @@ snapshots: eslint: 9.39.2(jiti@1.21.7) eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.0.1(eslint@9.39.2(jiti@1.21.7))': + '@eslint/compat@2.0.1(eslint@9.39.2(jiti@2.6.1))': dependencies: '@eslint/core': 1.0.1 optionalDependencies: - eslint: 9.39.2(jiti@1.21.7) + eslint: 9.39.2(jiti@2.6.1) '@eslint/config-array@0.21.1': dependencies: @@ -8864,6 +9015,13 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -8938,6 +9096,68 @@ snapshots: dependencies: '@octokit/openapi-types': 24.2.0 + '@oxc-resolver/binding-android-arm-eabi@11.16.3': + optional: true + + '@oxc-resolver/binding-android-arm64@11.16.3': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.16.3': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.16.3': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.16.3': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.16.3': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.16.3': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.16.3': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.16.3': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.16.3': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.16.3': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.16.3': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.16.3': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.16.3': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.16.3': + optional: true + + '@oxc-resolver/binding-openharmony-arm64@11.16.3': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.16.3': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.16.3': + optional: true + + '@oxc-resolver/binding-win32-ia32-msvc@11.16.3': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.16.3': + optional: true + '@pkgjs/parseargs@0.11.0': optional: true @@ -10927,7 +11147,7 @@ snapshots: - supports-color - typescript - eslint-plugin-jsdoc@61.7.1(eslint@9.39.2(jiti@1.21.7)): + eslint-plugin-jsdoc@61.7.1(eslint@9.39.2(jiti@2.6.1)): dependencies: '@es-joy/jsdoccomment': 0.78.0 '@es-joy/resolve.exports': 1.2.0 @@ -10935,7 +11155,7 @@ snapshots: comment-parser: 1.4.1 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 9.39.2(jiti@1.21.7) + eslint: 9.39.2(jiti@2.6.1) espree: 11.0.0 esquery: 1.7.0 html-entities: 2.6.0 @@ -10977,6 +11197,17 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + eslint: 9.39.2(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 4.3.5 + zod-validation-error: 4.0.2(zod@4.3.5) + transitivePeerDependencies: + - supports-color + eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@1.21.7)): dependencies: array-includes: 3.1.9 @@ -10999,6 +11230,28 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 + eslint-plugin-react@7.37.5(eslint@9.39.2(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) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + eslint-plugin-testing-library@5.11.1(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@1.21.7))(typescript@4.9.5) @@ -11076,6 +11329,47 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.39.2(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(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.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + 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 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + 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.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + espree@10.4.0: dependencies: acorn: 8.15.0 @@ -11249,6 +11543,10 @@ snapshots: dependencies: bser: 2.1.1 + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -11374,6 +11672,10 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + formatly@0.3.0: + dependencies: + fd-package-json: 2.0.0 + forwarded@0.2.0: {} fraction.js@5.3.4: {} @@ -12745,6 +13047,8 @@ snapshots: jiti@1.21.7: {} + jiti@2.6.1: {} + js-tokens@4.0.0: {} js-yaml@3.14.2: @@ -12870,6 +13174,23 @@ snapshots: klona@2.0.6: {} + knip@5.81.0(@types/node@25.0.3)(typescript@4.9.5): + dependencies: + '@nodelib/fs.walk': 1.2.8 + '@types/node': 25.0.3 + fast-glob: 3.3.3 + formatly: 0.3.0 + jiti: 2.6.1 + js-yaml: 4.1.1 + minimist: 1.2.8 + oxc-resolver: 11.16.3 + picocolors: 1.1.1 + picomatch: 4.0.3 + smol-toml: 1.6.0 + strip-json-comments: 5.0.3 + typescript: 4.9.5 + zod: 4.3.5 + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -13244,6 +13565,29 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxc-resolver@11.16.3: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.16.3 + '@oxc-resolver/binding-android-arm64': 11.16.3 + '@oxc-resolver/binding-darwin-arm64': 11.16.3 + '@oxc-resolver/binding-darwin-x64': 11.16.3 + '@oxc-resolver/binding-freebsd-x64': 11.16.3 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.16.3 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.16.3 + '@oxc-resolver/binding-linux-arm64-gnu': 11.16.3 + '@oxc-resolver/binding-linux-arm64-musl': 11.16.3 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.16.3 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.16.3 + '@oxc-resolver/binding-linux-riscv64-musl': 11.16.3 + '@oxc-resolver/binding-linux-s390x-gnu': 11.16.3 + '@oxc-resolver/binding-linux-x64-gnu': 11.16.3 + '@oxc-resolver/binding-linux-x64-musl': 11.16.3 + '@oxc-resolver/binding-openharmony-arm64': 11.16.3 + '@oxc-resolver/binding-wasm32-wasi': 11.16.3 + '@oxc-resolver/binding-win32-arm64-msvc': 11.16.3 + '@oxc-resolver/binding-win32-ia32-msvc': 11.16.3 + '@oxc-resolver/binding-win32-x64-msvc': 11.16.3 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -14574,6 +14918,8 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + smol-toml@1.6.0: {} + sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 @@ -14803,6 +15149,8 @@ snapshots: strip-json-comments@3.1.1: {} + strip-json-comments@5.0.3: {} + style-loader@3.3.4(webpack@5.104.1): dependencies: webpack: 5.104.1 @@ -15241,6 +15589,8 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + walk-up-path@4.0.0: {} + walker@1.0.8: dependencies: makeerror: 1.0.12