Дмитрий
|
59299d3c2b
|
phase2(auth-frontend): axios + Pinia + auth-store + auth-guards + form integration
- axios@^1.16 + pinia@^3.0 (--legacy-peer-deps).
- api/client.ts: axios с withCredentials+withXSRFToken (Sanctum SPA auto-XSRF).
ensureCsrfCookie() + extractValidationErrors/Message helpers.
- api/auth.ts: типизированные login/register/me/logout с AuthUser interface.
- stores/auth.ts: Pinia composition-store (user/loading/requires2fa +
isAuthenticated computed + login/register/fetchMe/logout actions).
logout() catch-swallow - UI всегда выходит локально.
- LoginView/RegisterView: useAuthStore интеграция, real POST через store,
errors из 422 на v-text-fields, redirect на /dashboard или /2fa,
:loading на btn'ах.
- Auth-guard в router.beforeEach: meta.requiresAuth на 10 routes
(6 app + 4 admin), meta.guestOnly на login/register/forgot. При первом
переходе fetchMe() restore-session. Unauth → /login?redirect=<original>.
- / redirect → /dashboard (auth-guard перехватит если не залогинен).
- Pinia в app.ts через app.use(createPinia()).
- cspell-words.txt: мокаем.
Vitest +10 (всего 139/139 за 10.11s):
- auth-store 7 (initial state + login success/reject + register + fetchMe
success/401 + logout swallow).
- router 5 переписан (login.guestOnly + 6 protected + admin layout +
3 error без auth + unauth /dashboard → /login?redirect).
- LoginView/RegisterView/router тесты получили createPinia в plugins.
- vi.mock api/auth в router+auth-store specs.
Регресс: lint+type+format OK; vitest 139/139; vite build (main app-chunk
105→153.64 KB +axios+pinia+auth gzipped 54.54 KB) 806ms; story:build 21/28
за 31.73s; Pest 61/61 за 5.86s.
CLAUDE.md v1.32->v1.33, реестр Открытых_вопросов v1.41->v1.42.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-08 19:59:43 +03:00 |
|
Дмитрий
|
e909a95a8d
|
phase2(login): vue-router 4 + AuthLayout + LoginView - первый реальный экран
- vue-router@^4.6.4 (--legacy-peer-deps из-за Histoire vs Vite 8 peerDep).
- resources/js/router/index.ts: createWebHistory + lazy-imports + meta.layout.
Маршрут / -> /login, /login -> LoginView (meta.layout=auth).
- resources/js/layouts/AuthLayout.vue: двухпанельный (brand-pane тёмный с
radial-gradient акцентами + form-pane warm ivory). На mobile brand-pane скрыт.
- resources/js/views/auth/LoginView.vue: форма Vuetify по v8_login.html
секция #form-login - email/password (autocomplete + eye-icon), primary submit,
Yandex 360 SSO, RouterLink на /register и /forgot.
- AppShell.vue: layout-mapper по route.meta.layout (default/auth).
- routes/web.php: явные Route::view для 6 SPA-путей (НЕ catch-all - он перехватывал
/_test/* в Pest beforeEach и валил 5 SetTenantContextTest).
- Vitest: +LoginView.spec.ts (5), +router.spec.ts (2), AppShell.spec.ts переписан (3).
Vitest 10/10 за 3.01s.
- LoginView.story.vue для Histoire. Setup расширен memory-router'ом.
- cspell-words.txt: рендерят, коммиты, Лидерру.
- Регресс: lint:vue OK, type-check OK, format:check OK, vitest 10/10,
vite build 212 модулей за 383ms (LoginView lazy-chunk 43.5KB JS / 51.7KB CSS),
story:build 2/2 за 29.94s, Pest 48/48 за 4.86s.
CLAUDE.md v1.18->v1.19, реестр Открытых_вопросов v1.27->v1.28.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-08 16:59:00 +03:00 |
|
Дмитрий
|
952373fce5
|
phase2(trigger): Vue 3 + Vuetify 3 + ESLint+Prettier+Vue + vue-tsc + Vitest
Триггер фазы 2 выполнен — первый коммит в app/resources/js/. Активирует
5 из 6 инструментов фазы 2 (CLAUDE.md §3.3) — без Histoire (отдельно).
Tailwind удалён (правило CLAUDE.md §5 п.2).
Стек:
- vue@3.5, vuetify@3.12, @vitejs/plugin-vue@6 (для Vite 8 совместимости —
@vitejs/plugin-vue@5 поддерживает только Vite 5/6), vite-plugin-vuetify@2
(auto-import), sass-embedded
- eslint@10 (flat-config), eslint-plugin-vue@10,
@vue/eslint-config-typescript@14, eslint-config-prettier, prettier@3.8
- typescript@6, vue-tsc@3.2
- vitest@4.1, @vue/test-utils, jsdom, @vitest/coverage-v8
Конфиги:
- app/vite.config.js — vue + vuetify auto-import
- app/vitest.config.ts — jsdom + setup file для ResizeObserver/
IntersectionObserver/matchMedia/CSS.supports stubs (без них Vuetify
падает в JSDOM)
- app/eslint.config.js — flat-config
- app/.prettierrc.json, app/tsconfig.json
Frontend-структура:
- resources/js/app.ts — точка входа
- resources/js/plugins/vuetify.ts — палитра Forest (Teal/ivory/теало-нуар
из BRANDBOOK_v2 §3)
- resources/js/components/AppShell.vue — первый компонент: v-app +
v-app-bar + v-card
- resources/css/app.css — Inter (UI, opsz axis), JetBrains Mono
(.numeric, tnum)
- resources/views/welcome.blade.php — упрощён под Vue mount
Smoke-тесты Vitest 3/3 за 2.8 сек:
- монтируется без ошибок
- содержит «Лидерра.»
- рендерит chip с фазой 2
Build: 158 модулей за 386 ms (184 KB JS / 295 KB CSS gzipped).
npm-scripts: lint:vue, format, format:check, type-check, test:vue.
lefthook job #8 (ESLint на staged .ts/.vue) добавлен в pre-commit.
Полный type-check (vue-tsc) и Vitest — отдельно вручную (медленно для
pre-commit: ~3 сек на каждый).
CLAUDE.md v1.16 → v1.17 (фаза 1 → фаза 2 в §6).
Реестр Открытые_вопросы v1.25 → v1.26.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-08 16:07:14 +03:00 |
|