chore: lint rules for scripts

This commit is contained in:
2026-09-26 16:46:52 +05:00
parent bd941d5ac5
commit 67fdef4363
4 changed files with 50 additions and 5 deletions
+25 -3
View File
@@ -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. Новые автоматические правила
+3
View File
@@ -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'ы с `**`
+20
View File
@@ -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,
+2 -2
View File
@@ -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");