Skip to content

0015. Frontend tooling: mise, pnpm, TypeScript 7, Biome, Vitest, Playwright

  • Status: Accepted
  • Date: 2026-11-06
Piece Choice Why
Toolchain versions mise (mise.toml: Go, Node LTS, pnpm) mise install and you are done. CI uses the same file
Package manager pnpm v12 Install scripts blocked by default; minimumReleaseAge refuses freshly published packages; strict node_modules
Type checking TypeScript 7 (native compiler) About 10× faster. Any tool that needs the old API stays on 5.x on its own
Lint + format Biome v2 One tool instead of ESLint + Prettier + plugins + typescript-eslint
React Compiler Its own build-time diagnostics The build reports components it cannot optimize
Logic tests Vitest v5 Native to Vite and fast
Component tests Vitest browser mode (real Chromium) + MSW mocks generated by orval A real browser instead of a simulated DOM
E2E Playwright against the real binary —
Accessibility @axe-core/playwright in E2E Serious violations fail CI
PWA vite-plugin-pwa v2 (Workbox) Caches only the app shell, never API data. Shows an update prompt
Bundle budget size-limit Less than 250 KB gzipped of initial JS
Dependency updates Dependabot Covers Go, npm, GitHub Actions and Docker (.github/dependabot.yml). Renovate was the first choice; replaced on 2026-11-10 because Dependabot is built into GitHub and needs no app install
  1. The real binary starts with a temp data dir and seed data.
  2. Telegram points to a fake Bot API server, reused from the Go tests.
  3. The test advances the clock → the reminder arrives with its buttons.
  4. It simulates “Change date” → 10 → “This charge only” → Confirm.
  5. It asserts the message was re-edited and the open web page updated by itself via SSE.
  6. axe runs on the result.
  • PWA web push with action buttons (another channel of ⑥; needs HTTPS).
  • Visual snapshot tests.
  • A component workshop (Storybook or Ladle).