You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
29 dependencies are outdated, including a full major version behind across most of the build and test toolchain. Nothing is broken today — ci:local is green and all 5,239 unit tests pass — but the gap grows more expensive to close the longer it is left.
Current drift
npm outdated (as of v1.7.9):
Major version behind — toolchain
Package
Current
Latest
Notes
vite
5.4.21
8.2.2
3 majors
vitest / @vitest/ui / @vitest/coverage-v8
1.6.1
4.1.11
3 majors; also relevant to the coverage config in #84
Do this in separate PRs, smallest blast radius first. Do not batch — a single mega-bump makes failures impossible to attribute.
Patch/minor sweep — everything in the third table. Low risk, one PR. prettier may reformat files (expect a large diff; run npm run format as its own commit). dompurify + date-holidays also help close npm audit: 2 vulnerabilities from transitive js-yaml@4.1.1 #85.
Playwright — bump @playwright/test, then regenerate VRT baselines in Docker (npm run test:vrt:update) since a renderer change can shift screenshots. See CLAUDE.md → Visual Regression Tests.
ESLint 8 → 10 — requires flat config (eslint.config.js replacing .eslintrc), moving @typescript-eslint/* to v8 and eslint-plugin-react-hooks to v7 in the same PR. Self-contained.
Vite 5 → 8 — with @vitejs/plugin-react and vite-plugin-svgr. Verify the export pipeline chunks still split correctly (pdfExport, date-vendor, html2canvas are large manual chunks).
TypeScript 5 → 7 — expect new strictness errors; project is already strict.
Tailwind 3 → 4 — config rewrite. Careful: the color system (Issue audit: analyze color system — consolidate scales, eliminate hardcoded values #56) depends on tailwind.config.js importing from src/styles/colors.js and on theme("colors.slate.X") resolving in index.css. Tailwind v4 moves theme config into CSS. This needs its own plan; npm run lint:colors must still pass.
React 18 → 19 — last, with @testing-library/react v16. Largest surface: 278 source files, React.memo usage, D3/SVG interop, @dnd-kit compatibility.
Acceptance criteria
Per PR:
npm run ci:local passes
npm run test:e2e passes (Docker)
npm run test:vrt passes, or baselines regenerated in Docker with the diff reviewed
Export pipeline manually verified (PNG/PDF/SVG) for any PR touching vite, react, or tailwind
Notes
Steps 7 and 8 are large enough to be their own issues once the earlier steps land. Steps 1-2 are worth doing now regardless.
Problem
29 dependencies are outdated, including a full major version behind across most of the build and test toolchain. Nothing is broken today —
ci:localis green and all 5,239 unit tests pass — but the gap grows more expensive to close the longer it is left.Current drift
npm outdated(as of v1.7.9):Major version behind — toolchain
vitevitest/@vitest/ui/@vitest/coverage-v8typescripteslint@typescript-eslint/*eslint-plugin-react-hookstailwindcss@vitejs/plugin-reactvite-plugin-svgrjsdomcommit-and-tag-versionMajor version behind — runtime / testing
react/react-dom@types/react/@types/react-dom@testing-library/react@testing-library/jest-domMinor/patch only — safe, low effort
@playwright/test1.57.0→1.62.1,@testing-library/user-event14.6.1→14.6.5,autoprefixer10.4.22→10.5.4,date-fns4.1.0→4.4.0,date-holidays3.26.6→3.35.0,dompurify3.3.3→3.4.14,immer11.0.1→11.1.18,postcss8.5.6→8.5.26,prettier3.7.4→3.9.6Proposed approach
Do this in separate PRs, smallest blast radius first. Do not batch — a single mega-bump makes failures impossible to attribute.
prettiermay reformat files (expect a large diff; runnpm run formatas its own commit).dompurify+date-holidaysalso help close npm audit: 2 vulnerabilities from transitive js-yaml@4.1.1 #85.@playwright/test, then regenerate VRT baselines in Docker (npm run test:vrt:update) since a renderer change can shift screenshots. SeeCLAUDE.md→ Visual Regression Tests.thresholdsshape, so land that first.eslint.config.jsreplacing.eslintrc), moving@typescript-eslint/*to v8 andeslint-plugin-react-hooksto v7 in the same PR. Self-contained.@vitejs/plugin-reactandvite-plugin-svgr. Verify the export pipeline chunks still split correctly (pdfExport,date-vendor,html2canvasare large manual chunks).strict.tailwind.config.jsimporting fromsrc/styles/colors.jsand ontheme("colors.slate.X")resolving inindex.css. Tailwind v4 moves theme config into CSS. This needs its own plan;npm run lint:colorsmust still pass.@testing-library/reactv16. Largest surface: 278 source files,React.memousage, D3/SVG interop,@dnd-kitcompatibility.Acceptance criteria
Per PR:
npm run ci:localpassesnpm run test:e2epasses (Docker)npm run test:vrtpasses, or baselines regenerated in Docker with the diff reviewedNotes
Steps 7 and 8 are large enough to be their own issues once the earlier steps land. Steps 1-2 are worth doing now regardless.
Related: #84, #85