0015. Frontend tooling: mise, pnpm, TypeScript 7, Biome, Vitest, Playwright
- Status: Accepted
- Date: 2026-11-06
Decision
Section titled “Decision”| 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 |
The flagship E2E
Section titled “The flagship E2E”- The real binary starts with a temp data dir and seed data.
- Telegram points to a fake Bot API server, reused from the Go tests.
- The test advances the clock → the reminder arrives with its buttons.
- It simulates “Change date” → 10 → “This charge only” → Confirm.
- It asserts the message was re-edited and the open web page updated by itself via SSE.
- 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).