Files
HY2XS_flamy/apps/frontend/eslint.config.mjs
T
founder 32ff47731c 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.
2026-08-30 07:41:31 +05:00

97 lines
4.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
);