Pins the behavioural invariants that landed in PR #5490 (the frontend half of the #5375-regression fix-up backlog) so a future hardening pass cannot quietly undo them. Today these surfaces have only typecheck + bundle-build coverage; this lifts the floor. What's pinned (35 tests across 3 files, ~360 ms): - src/lib/__tests__/format-fastapi-error.test.ts (17) formatFastApiDetail + readFastApiError: string passthrough, array detail joined as "field: msg" / "; ", nested loc joined by ".", missing msg / missing loc / empty array / mixed valid+junk, plus Response shapes for 422 / 400 / 500 / 503 / non-JSON / object-detail + message fallback. Regression target: rendering `[object Object]` or `Request failed (422)` instead of "field: msg". - src/features/auth/__tests__/session.test.ts (10) storeAuthTokens writes only the two JWT keys (never the must-change key -- the CodeQL data-flow pin); clearAuthTokens removes all three; setMustChangePassword writes the literal "1" / removes the key (presence-encoded so the stored value stays a constant, not a derived boolean); isOnboardingDone treats only the literal "true" as done. - src/features/auth/__tests__/api.test.ts (8) refreshSession singleflight (5 racing callers -> 1 /api/auth/refresh request); in-flight slot clears so subsequent calls refetch; non-OK response clears tokens; no refresh token -> no fetch; logoutGeneration drops the new token pair when logout() lands mid-refresh; logout() clears local state on 204; logout() retries with a rotated access token on 401; logout() still clears state on network failure. Wiring: - vitest 4 + happy-dom 18 as devDependencies. - vitest.config.ts mirrors the @/ alias from tsconfig.app.json. - New `test` / `test:watch` scripts. Workflow step (CI gating) is intentionally NOT included in this PR because the publishing token lacks `workflow` scope. After merge, add this between the Typecheck and Build steps in .github/workflows/studio-frontend-ci.yml: - name: Unit tests (Vitest) run: npm run test `npm run typecheck` / `test` / `build` all clean locally.
106 lines
3.2 KiB
JSON
106 lines
3.2 KiB
JSON
{
|
|
"name": "unsloth-theme",
|
|
"private": true,
|
|
"version": "0.0.0",
|
|
"type": "module",
|
|
"engines": {
|
|
"node": "^20.19.0 || >=22.12.0"
|
|
},
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "tsc -b && vite build",
|
|
"lint": "eslint .",
|
|
"preview": "vite preview",
|
|
"typecheck": "tsc -b --pretty false",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"biome:check": "biome check .",
|
|
"biome:fix": "biome check . --write"
|
|
},
|
|
"dependencies": {
|
|
"@assistant-ui/core": "0.1.17",
|
|
"@assistant-ui/react": "0.12.28",
|
|
"@assistant-ui/tap": "0.5.10",
|
|
"@base-ui/react": "^1.2.0",
|
|
"@dagrejs/dagre": "^2.0.4",
|
|
"@dagrejs/graphlib": "^3.0.4",
|
|
"@fontsource-variable/figtree": "^5.2.10",
|
|
"@fontsource-variable/inter": "^5.2.8",
|
|
"@fontsource-variable/space-grotesk": "^5.2.10",
|
|
"@hugeicons/core-free-icons": "^4.1.1",
|
|
"@hugeicons/react": "^1.1.5",
|
|
"@huggingface/hub": "^2.9.0",
|
|
"@radix-ui/react-checkbox": "^1.3.3",
|
|
"@radix-ui/react-label": "^2.1.8",
|
|
"@radix-ui/react-select": "^2.2.6",
|
|
"@radix-ui/react-separator": "^1.1.8",
|
|
"@radix-ui/react-slot": "^1.2.4",
|
|
"@streamdown/code": "1.1.1",
|
|
"@streamdown/math": "1.0.2",
|
|
"@streamdown/mermaid": "1.0.2",
|
|
"@tailwindcss/vite": "^4.2.2",
|
|
"@tanstack/react-router": "1.169.2",
|
|
"@tanstack/react-table": "^8.21.3",
|
|
"@tauri-apps/api": "^2.10.1",
|
|
"@tauri-apps/plugin-clipboard-manager": "^2.3.2",
|
|
"@tauri-apps/plugin-notification": "^2.3.3",
|
|
"@tauri-apps/plugin-opener": "^2.5.3",
|
|
"@tauri-apps/plugin-process": "^2.3.1",
|
|
"@tauri-apps/plugin-updater": "^2.10.1",
|
|
"@toolwind/corner-shape": "^0.0.8-3",
|
|
"@xyflow/react": "^12.10.0",
|
|
"assistant-stream": "0.3.12",
|
|
"canvas-confetti": "^1.9.4",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"cmdk": "^1.1.1",
|
|
"dexie": "^4.3.0",
|
|
"js-yaml": "^4.1.1",
|
|
"katex": "^0.16.28",
|
|
"lucide-react": "^1.7.0",
|
|
"mammoth": "^1.11.0",
|
|
"motion": "^12.34.0",
|
|
"next-themes": "^0.4.6",
|
|
"node-forge": "^1.4.0",
|
|
"radix-ui": "^1.4.3",
|
|
"react": "^19.2.4",
|
|
"react-day-picker": "^9.13.2",
|
|
"react-dom": "^19.2.4",
|
|
"react-resizable-panels": "^4.6.4",
|
|
"recharts": "3.7.0",
|
|
"shadcn": "^4.2.0",
|
|
"sonner": "^2.0.7",
|
|
"streamdown": "2.5.0",
|
|
"tailwind-merge": "^3.4.0",
|
|
"tailwindcss": "^4.1.18",
|
|
"tw-animate-css": "^1.4.0",
|
|
"tw-shimmer": "^0.4.6",
|
|
"unpdf": "^1.4.0",
|
|
"zustand": "^5.0.11"
|
|
},
|
|
"overrides": {
|
|
"@tanstack/react-router": "1.169.2",
|
|
"@tanstack/router-core": "1.169.2",
|
|
"@tanstack/history": "1.161.6"
|
|
},
|
|
"devDependencies": {
|
|
"@biomejs/biome": "^1.9.4",
|
|
"@eslint/js": "^9.39.1",
|
|
"@types/canvas-confetti": "^1.9.0",
|
|
"@types/js-yaml": "^4.0.9",
|
|
"@types/node-forge": "^1.3.14",
|
|
"@types/node": "^25.5.2",
|
|
"@types/react": "^19.2.5",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@vitejs/plugin-react": "^6.0.1",
|
|
"eslint": "^9.39.1",
|
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
"eslint-plugin-react-refresh": "^0.5.2",
|
|
"globals": "^17.4.0",
|
|
"happy-dom": "^18.0.1",
|
|
"typescript": "~5.9.3",
|
|
"typescript-eslint": "^8.55.0",
|
|
"vite": "^8.0.1",
|
|
"vitest": "^4.0.0"
|
|
}
|
|
}
|