build(frontend): убрать неподдерживаемый плагин иконок и EOL-линтеры, audit до нуля
vite-plugin-svg-icons не обновлялся с 2022 года и был единственным источником половины оставшихся предупреждений: svgo 2.8, postcss 5.2.18, braces 2.3.2 и image-size 0.5.5 — у последней advisory прямо сообщает `Patched versions: <0.0.0`, то есть исправленной версии не существует. Задача, которую он решал, заняла один модуль: import.meta.glob собирает семнадцать локальных SVG в скрытый спрайт со <symbol>. Компонентный подход (unplugin-icons) здесь не подходит — имя иконки часто вычисляется в рантайме (onlyOneChild.meta.icon, isFullscreen ? ... : ...), а поиск по id нужен именно для этого. API <svg-icon icon-class="..."> не изменился. Проверка на реальных ассетах поймала то, что иначе уехало бы в релиз: три иконки из семнадцати не объявляют viewBox, задавая только width/height. Без viewBox <use> рисует иконку в натуральную величину и обрезает её. Плагин синтезировал viewBox сам; теперь это делает sprite.ts, а инвариант закреплён приёмкой — иконка без обоих способов задать координаты роняет сборку. Отдельно: typecheck поймал две ошибки уже в самом sprite.ts (SVGSVGElement против HTMLElement из getElementById). Ровно то, ради чего он возвращался. eslint 8 объявлен EOL и оставался вторым источником предупреждений. Переход на eslint 10 потребовал flat config: eslintrc в 9 работает только через переменную окружения, а в 10 удалён, поэтому обновление версии без смены формата было бы отсрочкой на релиз. Набор правил сохранён прежним; .eslintignore свёрнут в ignores, как требует новый формат. Проверено, что flat config действительно линтит, а не молча пропускает: пробный файл с неиспользуемой переменной и необъявленным именем даёт обе ошибки и в .ts, и в .vue. Оставшиеся предупреждения приходили из графов самих eslint 10 и stylelint 17, то есть уже последних версий, — закрыты pnpm.overrides. Override для ajv ограничен `table>ajv`: глобальный ломал eslint, который использует ajv 6. pnpm audit по всему графу: 33 предупреждения -> 0. typecheck/eslint/stylelint/build: 0. go build и go test с встроенным dist: OK.
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
import { createRequire } from "node:module";
|
||||
|
||||
import js from "@eslint/js";
|
||||
import globals from "globals";
|
||||
import tseslint from "typescript-eslint";
|
||||
import pluginVue from "eslint-plugin-vue";
|
||||
import prettier from "eslint-config-prettier";
|
||||
import vueParser from "vue-eslint-parser";
|
||||
|
||||
/**
|
||||
* Конфигурация ESLint во flat-формате.
|
||||
*
|
||||
* Заменяет `.eslintrc.cjs`. Причина не в моде на формат: eslint 8 объявлен
|
||||
* EOL, перестал получать исправления и оставался последним источником десятка
|
||||
* предупреждений `pnpm audit` в проекте (minimatch, brace-expansion, js-yaml,
|
||||
* flatted — всё в его собственном графе). Eslintrc-формат в eslint 9 работает
|
||||
* только через переменную окружения, а в 10 удалён вовсе, поэтому обновление
|
||||
* версии без перехода на flat-config было бы отсрочкой на один релиз.
|
||||
*
|
||||
* Набор правил сохранён ровно тем же, что был в `.eslintrc.cjs`: перевод
|
||||
* формата не место для изменения политики линтинга.
|
||||
*/
|
||||
|
||||
// Глобальные имена авто-импорта генерирует unplugin-auto-import в
|
||||
// eslintrc-формате (`{ globals: { ref: true, ... } }`). Flat-config такой файл
|
||||
// через `extends` не подключает, поэтому список читается напрямую — источник
|
||||
// истины остаётся один, и он по-прежнему пересоздаётся сборкой.
|
||||
const require = createRequire(import.meta.url);
|
||||
const autoImportGlobals = require("./.eslintrc-auto-import.json").globals;
|
||||
|
||||
export default tseslint.config(
|
||||
{
|
||||
// Перенесено из .eslintignore: eslint 9 этот файл больше не читает, и
|
||||
// список исключений обязан жить в самой конфигурации.
|
||||
//
|
||||
// src/assets — SVG и изображения; src/types/*.d.ts — объявления, которые
|
||||
// генерируют unplugin-auto-import и unplugin-vue-components, править их
|
||||
// вручную нельзя, а замечания линтера по ним только шумят.
|
||||
ignores: [
|
||||
"dist/**",
|
||||
"node_modules/**",
|
||||
"public/**",
|
||||
"src/assets/**",
|
||||
"src/types/*.d.ts",
|
||||
],
|
||||
},
|
||||
|
||||
js.configs.recommended,
|
||||
...tseslint.configs.recommended,
|
||||
...pluginVue.configs["flat/essential"],
|
||||
|
||||
{
|
||||
languageOptions: {
|
||||
ecmaVersion: "latest",
|
||||
sourceType: "module",
|
||||
globals: {
|
||||
...globals.browser,
|
||||
...globals.node,
|
||||
...autoImportGlobals,
|
||||
// Объявлены в src/types/global.d.ts и используются как глобальные типы.
|
||||
DialogType: "readonly",
|
||||
OptionType: "readonly",
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
// Имя компонента из одного слова — устоявшееся соглашение этого проекта.
|
||||
"vue/multi-word-component-names": "off",
|
||||
"vue/no-v-model-argument": "off",
|
||||
"@typescript-eslint/no-empty-function": "off",
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"@typescript-eslint/no-non-null-assertion": "off",
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
// .vue разбирает vue-eslint-parser, а <script lang="ts"> внутри него —
|
||||
// парсер TypeScript. Без второй половины содержимое блока не разбирается.
|
||||
files: ["**/*.vue"],
|
||||
languageOptions: {
|
||||
parser: vueParser,
|
||||
parserOptions: {
|
||||
parser: tseslint.parser,
|
||||
ecmaVersion: "latest",
|
||||
sourceType: "module",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
// Последним: отключает правила форматирования, которыми владеет prettier.
|
||||
//
|
||||
// Ни один из включённых наборов таких правил сейчас не содержит, так что это
|
||||
// страховка, а не исправление: форматированием занимается отдельный скрипт
|
||||
// lint:prettier, и правило-дубликат в линтере привело бы к двум источникам
|
||||
// истины о стиле.
|
||||
prettier
|
||||
);
|
||||
Reference in New Issue
Block a user