diff --git a/docs/plan-codebase-quality.md b/docs/plan-codebase-quality.md index b70b219..9bf00b9 100644 --- a/docs/plan-codebase-quality.md +++ b/docs/plan-codebase-quality.md @@ -432,13 +432,35 @@ file-result-инструментам. ветке `from` (смена `clamp(t, 0, 100)` на `0, 90` проходила зелёной). Добавлен отдельный тест на производный кламп; после этого мутация падает. -#### Q7c–Q7d. Оставшиеся направления +#### Q7c. Базовый JS recommended для инфраструктуры линтинга + +**Статус:** выполнен. `eslint-plugins/**` и `scripts/**` больше не вне линта. + +- `web/eslint.config.js`: + `toolingFiles = ["**/eslint-plugins/**/*.js", "**/scripts/**/*.mjs"]` получают + `js.configs.recommended` плюс `languageOptions` с `globals.node` (иначе + `no-undef` ругается на `console`, `process` и `URL` в Node-скриптах). +- Полные TS/svelte-наборы туда не подключаются: это `.mjs` и конфиги, а не + продуктовый код. +- Масштаб оказался небольшим: 28 проблем, из них 26 — `no-undef` на + Node-глобалах и только 2 настоящие: мёртвые импорты `existsSync` и `resolve` в + `scripts/serve-static.mjs`. Линтер сразу нашёл пыль в инфраструктуре, для + которой его раньше не было. +- `eslint-plugins/**` дал ноль проблем, а новые тесты `scripts/__tests__` тоже + попали под правило. +- Проверено пробой: после включения неиспользуемая переменная и вызов + неопределённого глобала в `scripts/` дают ошибки, то есть правило применилось, + а не молча пропустило файлы. + +#### Q7d. Оставшиеся направления -- Покрыть базовым JS recommended сам код ESLint-плагинов и lint-скриптов. - Отдельно решить, должен ли обычный CSS проходить проверку undefined tokens и hardcoded colors наравне со Svelte styles. -- Новые правила подключать только после fixtures, `test:rules` и baseline. +- Решить, должны ли сами конфиги (`eslint.config.js`, `postcss.config.js`, + `stylelint.config.js`, `svelte.config.js`, `vite.config.ts`) тоже попасть под + рекомендации: сейчас вне `toolingFiles`. - Решить, должен ли unused audit стать fail-режимом (см. Q7a). +- Новые правила подключать только после fixtures, `test:rules` и baseline. ### Q8. Новые автоматические правила diff --git a/web/eslint-plugins/README.md b/web/eslint-plugins/README.md index 02cecc8..89f8746 100644 --- a/web/eslint-plugins/README.md +++ b/web/eslint-plugins/README.md @@ -32,6 +32,9 @@ `eslint-plugin-svelte`) навешаны на UI-код (`src/lib/components/**`, `src/routes/**`). Scoped-пути двигаются вместе с папками: не оставлять устаревшие пути в `eslint.config.js`. +- Базовый `js.configs.recommended` + `globals.node` навешаны на инфраструктуру + линтинга: `eslint-plugins/**/*.js` и `scripts/**/*.mjs` (Q7c). + TS/svelte-рекомендации туда не подключаются. - Для `*.svelte` выключен `prefer-const` (пропсы в Svelte 5 пишутся через `let`). - `allowDefaultProject` перечисляет test-файлы и фикстуры точечно (glob'ы с `**` diff --git a/web/eslint.config.js b/web/eslint.config.js index e3025d1..167750e 100644 --- a/web/eslint.config.js +++ b/web/eslint.config.js @@ -11,6 +11,12 @@ import i18nPlugin from "./eslint-plugins/i18n/index.js"; // Новый код редизайна: к нему применяем полные recommended-наборы уже сейчас. const newCode = ["**/src/lib/components/**", "**/src/routes/**"]; +// Инфраструктура линтинга: сами плагины и скрипты. Это не продуктовый код, но +// он влияет на все гейты, поэтому к нему тоже применяется базовый JS +// recommended. Полные TS/svelte-наборы здесь не подключаются: файлы .mjs и +// конфиги проверяются только базовым набором. +const toolingFiles = ["**/eslint-plugins/**/*.js", "**/scripts/**/*.mjs"]; + // Полные recommended-наборы — только на новый код (см. ниже, блок перед prettier). const jsRecommended = Array.isArray(js.configs.recommended) ? js.configs.recommended @@ -175,12 +181,26 @@ export default tseslint.config( ], }, }, + { + files: toolingFiles, + languageOptions: { + ecmaVersion: "latest", + sourceType: "module", + globals: { + ...globals.node, + }, + }, + }, // Полные recommended-наборы — только на новый код. ...[ ...jsRecommended.map((cfg) => ({ ...cfg, files: newCode, })), + ...jsRecommended.map((cfg) => ({ + ...cfg, + files: toolingFiles, + })), ...tseslint.configs.recommended.map((cfg) => ({ ...cfg, files: newCode, diff --git a/web/scripts/serve-static.mjs b/web/scripts/serve-static.mjs index d1c5a62..25685d5 100644 --- a/web/scripts/serve-static.mjs +++ b/web/scripts/serve-static.mjs @@ -2,8 +2,8 @@ // (adapter-static): /foo -> foo.html | foo/index.html, MIME по расширению. // Запуск: pnpm build && node scripts/serve-static.mjs --port 4173 import { createServer } from "node:http"; -import { readFileSync, existsSync, statSync } from "node:fs"; -import { extname, join, resolve } from "node:path"; +import { readFileSync, statSync } from "node:fs"; +import { extname, join } from "node:path"; import { fileURLToPath } from "node:url"; const portIndex = process.argv.indexOf("--port");