chore: update lint rules, some docs terms

This commit is contained in:
2026-09-27 09:20:59 +05:00
parent 82207c82f2
commit e703451474
7 changed files with 54 additions and 44 deletions
+10 -5
View File
@@ -42,9 +42,13 @@
`__fixtures__/` дописать их туда же.
- design-tokens правила применяются к тем же scoped-путям
(`src/lib/components/**`, `src/routes/**`).
- `i18n/no-hardcoded-user-text` применяется к `src/lib/components/**` (`/kit`
исключён как витрина с намеренно hardcoded-подписями) и настраивается опцией
`allowWords` —brand не хардкодится в правиле.
- `i18n/no-hardcoded-user-text` применяется к обоим scoped-путям
(`src/lib/components/**` и `src/routes/**`): хардкод в `+page.svelte` и
`+layout.svelte` — такой же production-UI. Исключение одно — `/kit`, витрина с
намеренно латинскими подписями; выключается отдельным объектом конфига с
`files: ["**/src/routes/kit/**/*.svelte"]`, потому что негативные паттерны в
`files` не сужают область действия правила. Опция `allowWords` — brand не
хардкодится в правиле.
## Правила плагина design-tokens
@@ -115,9 +119,10 @@ report-only (`warn`), baseline — 0 срабатываний.
`tone`, `type`, `icon`, `size`, `href`, `class`) не проверяются, значения в
скобках (`{expr}`) тоже — они считаются в другом месте.
- Исключения списком, а не «на глаз»: форматы и единицы (`PNG`, `px`, `×`),
имена файлов и версии (`result.png`, `v0.1.0`), размеры (`512×512`),
имена файлов и версии (`result.png`, `v0.1.0`, `v1`), размеры (`512×512`),
registry-строки и прочие ALL CAPS идентификаторы (`BACKGROUND`), а также
`/kit` — витрина компонентов с намеренно латинскими подписями.
`/kit` — витрина компонентов с намеренно латинскими подписями (исключение
живёт в `eslint.config.js`, а не в правиле).
- Опция `allowWords: string[]` — brand и прочие собственные имена. Название
продукта передаётся конфигом, а не зашито в правило.
- Содержимое `<style>` и `<script>` пропускается: там код, а не копирайт.
+2 -1
View File
@@ -23,7 +23,8 @@
* Options (object, all optional):
* - allowPaths: dot-path keys excluded from every check.
* - baseLocaleFallback: patterns whose missing keys are allowed in BASE_LOCALE.
* - ignoreMissingPatterns: legacy patterns excluded from missing-key checks.
* - ignoreMissingPatterns: patterns temporarily excluded from missing-key
* checks.
*/
import fs from "node:fs";
import path from "node:path";
+26 -15
View File
@@ -8,8 +8,8 @@ import designTokens from "./eslint-plugins/index.js";
import conventionsPlugin from "./eslint-plugins/conventions/index.js";
import i18nPlugin from "./eslint-plugins/i18n/index.js";
// Новый код редизайна: к нему применяем полные recommended-наборы уже сейчас.
const newCode = ["**/src/lib/components/**", "**/src/routes/**"];
// Production-UI: к нему применяются полные recommended-наборы.
const productionCode = ["**/src/lib/components/**", "**/src/routes/**"];
// Инфраструктура линтинга: сами плагины, скрипты и конфиги. Это не
// продуктовый код, но всё это влияет на гейты, поэтому к нему тоже
@@ -21,16 +21,16 @@ const toolingFiles = [
"*.config.js",
];
// Полные recommended-наборы — только на новый код (см. ниже, блок перед prettier).
// Полные recommended-наборы — только на production-код (см. ниже, блок перед prettier).
const jsRecommended = Array.isArray(js.configs.recommended)
? js.configs.recommended
: [js.configs.recommended];
const svelteRecommended = Array.isArray(svelte.configs["flat/recommended"])
? svelte.configs["flat/recommended"]
: [svelte.configs["flat/recommended"]];
// Svelte-рекомендации применяем только к .svelte-файлам нового кода, иначе
// Svelte-рекомендации применяем только к .svelte-файлам production-кода, иначе
// svelte-eslint-parser "съедает" обычные .ts в тех же папках (напр. +page.ts).
const newSvelteFiles = [
const productionSvelte = [
"**/src/lib/components/**/*.svelte",
"**/src/routes/**/*.svelte",
];
@@ -128,7 +128,7 @@ export default tseslint.config(
// Правило дизайн-токенов: запрет хардкода цветов/размеров в style-блоках.
// Применяется к новому коду редизайна.
{
files: newSvelteFiles,
files: productionSvelte,
plugins: {
"design-tokens": designTokens,
},
@@ -142,7 +142,7 @@ export default tseslint.config(
// Конвенция Svelte 5: пропсы через локальный `interface Props` +
// `let {...}: Props = $props()` (плагин conventions/interface-props).
{
files: newSvelteFiles,
files: productionSvelte,
plugins: {
conventions: conventionsPlugin,
},
@@ -151,9 +151,9 @@ export default tseslint.config(
},
},
// Запрет строковых union-алиасов в пользу `as const` объектов
// (плагин conventions/no-string-union-alias). TS и Svelte-скрипты нового кода.
// (плагин conventions/no-string-union-alias). TS и Svelte-скрипты production-кода.
{
files: newCode,
files: productionCode,
plugins: {
conventions: conventionsPlugin,
},
@@ -182,8 +182,10 @@ export default tseslint.config(
},
},
{
// /kit — витрина компонентов с намеренно захардкоженными подписями.
files: newSvelteFiles.filter((pattern) => !pattern.includes("routes")),
// Хардкод пользовательского текста ловим и в components, и в routes:
// `+page.svelte`/`+layout.svelte` — такой же production-UI, иначе
// захардкоженная строка молча уедет в RU-локаль.
files: productionSvelte,
plugins: {
i18n: i18nPlugin,
},
@@ -197,6 +199,15 @@ export default tseslint.config(
],
},
},
{
// Исключение для /kit — витрина компонентов с намеренно латинскими
// подписями. Отдельный объект, а не негативный glob в `files` выше:
// негативные паттерны не сужают область действия правила.
files: ["**/src/routes/kit/**/*.svelte"],
rules: {
"i18n/no-hardcoded-user-text": "off",
},
},
{
files: toolingFiles,
languageOptions: {
@@ -207,11 +218,11 @@ export default tseslint.config(
},
},
},
// Полные recommended-наборы — только на новый код.
// Полные recommended-наборы — только на production-код.
...[
...jsRecommended.map((cfg) => ({
...cfg,
files: newCode,
files: productionCode,
})),
...jsRecommended.map((cfg) => ({
...cfg,
@@ -219,11 +230,11 @@ export default tseslint.config(
})),
...tseslint.configs.recommended.map((cfg) => ({
...cfg,
files: newCode,
files: productionCode,
})),
...svelteRecommended.map((cfg) => ({
...cfg,
files: newSvelteFiles,
files: productionSvelte,
})),
],