2d7d7d1188
Sprint 2 Phase B (modernization). Закрытие audit O-stack-04/05/07 + O-perf-06:
- O-stack-04: Vue 3.5 defineModel() в 3 диалогах (NewDealDialog,
ImpersonationDialog, ReminderDialog) — boilerplate −5 строк/файл.
+ useTemplateRef() в TwoFactorView (input v-for refs).
- O-stack-05: Vuetify 3.12 типизированные слоты VDataTable
(DealsView + AdminTenantsView) — inline-аннотации `{ item }: { item: T }`
на 6+7 scoped-slot bindings; vue-tsc проверяет доступ к полям статически.
- O-stack-07: ESLint flat-config verified — header-comment добавлен
в eslint.config.js. Legacy .eslintrc.json не используется.
- O-perf-06: defineAsyncComponent() для тяжёлых диалогов в 3 местах:
DealsView (DealDetailDrawer + NewDealDialog), DealDetailDrawer
(ReminderDialog), RemindersView (ReminderDialog). KanbanView оставлен
sync — async-загрузка приводила к EnvironmentTeardownError в jsdom
(KanbanView.spec.ts), see in-file comment. Сборка показывает chunk'и
ImpersonationDialog (7.61 kB), DealDetailDrawer (11.12 kB), NewDealDialog
и ReminderDialog как отдельные lazy-bundles.
vue-tsc: 0 errors. ESLint: 0. Vitest: 416/416 PASS. Build: success.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
1.4 KiB
JavaScript
33 lines
1.4 KiB
JavaScript
// ESLint flat-config (Sprint 2 verify O-stack-07): подтверждено как flat-config
|
||
// синтаксис (export default [...]). Совместимо с ESLint 10.x. Legacy .eslintrc.json
|
||
// в репозитории не используется (отсутствует физически).
|
||
import js from '@eslint/js';
|
||
import vue from 'eslint-plugin-vue';
|
||
import vueTsConfig from '@vue/eslint-config-typescript';
|
||
import prettier from 'eslint-config-prettier';
|
||
|
||
// ESLint flat config (фаза 2, Tooling §3.3 #22).
|
||
// Связка: ESLint + plugin-vue + @vue/eslint-config-typescript + config-prettier.
|
||
// Prettier — отдельный форматтер, ESLint его не дублирует (eslint-config-prettier
|
||
// отключает форматирующие правила).
|
||
export default [
|
||
js.configs.recommended,
|
||
...vue.configs['flat/recommended'],
|
||
...vueTsConfig(),
|
||
prettier,
|
||
{
|
||
ignores: ['public/build/**', 'storage/**', 'vendor/**', 'node_modules/**'],
|
||
},
|
||
{
|
||
rules: {
|
||
'vue/multi-word-component-names': 'off', // допускаем AppShell.vue
|
||
'no-restricted-imports': ['error', {
|
||
paths: [{
|
||
name: 'vuetify/components',
|
||
message: 'Используй auto-import через vite-plugin-vuetify (vite.config.ts). Явные импорты дублируют auto-injected.',
|
||
}],
|
||
}],
|
||
},
|
||
},
|
||
];
|