feat: initial dev-configs monorepo

Shared configs for TypeScript projects: ESLint, Prettier, TypeScript,
Vite, Jest, Playwright, Knip. Published as @vigdorov/* npm packages
to Gitea registry.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-16 23:40:22 +03:00
commit cf64bf6d7d
38 changed files with 11287 additions and 0 deletions

211
README.md Normal file
View File

@ -0,0 +1,211 @@
# @vigdorov/dev-configs
Набор общих конфигов для TypeScript-проектов. Единые правила линтинга, форматирования, сборки и тестирования.
## Установка
Добавь в `.npmrc` проекта:
```ini
@vigdorov:registry=https://git.vigdorov.ru/api/packages/vigdorov/npm/
```
Затем устанавливай нужные пакеты:
```bash
npm i -D @vigdorov/prettier-config @vigdorov/eslint-config @vigdorov/typescript-config
```
---
## Пакеты
### @vigdorov/prettier-config
Единый стиль форматирования: 120 символов, 4 пробела, одинарные кавычки.
```js
// prettier.config.js
import config from '@vigdorov/prettier-config';
export default config;
```
### @vigdorov/eslint-config
ESLint 9 flat config. Три пресета: `base` (любой TS-проект), `react` (фронтенд), `node` (бэкенд).
```js
// eslint.config.js — React-проект
import {react} from '@vigdorov/eslint-config';
export default react();
```
```js
// eslint.config.js — NestJS-проект
import {node} from '@vigdorov/eslint-config';
export default node();
```
Кастомизация через callback:
```js
import {react} from '@vigdorov/eslint-config';
export default react((configs) => [
...configs,
{
rules: {
'no-console': 'off',
},
},
]);
```
### @vigdorov/typescript-config
Базовые tsconfig для наследования.
```jsonc
// tsconfig.json — React-проект
{
"extends": "@vigdorov/typescript-config/react",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src"
},
"include": ["src"]
}
```
```jsonc
// tsconfig.json — Node/NestJS-проект
{
"extends": "@vigdorov/typescript-config/base",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src"
},
"include": ["src"]
}
```
### @vigdorov/vite-config
Конфиг Vite для SPA-приложений и библиотек.
```ts
// vite.config.ts — SPA
import {spa} from '@vigdorov/vite-config';
export default spa({
port: 5176,
aliases: {'@': 'src'},
proxy: {'/api': 'http://localhost:3003'},
});
```
```ts
// vite.config.ts — библиотека
import {library} from '@vigdorov/vite-config';
export default library({
entry: 'src/index.ts',
name: 'my-lib',
external: ['react', 'react-dom'],
});
```
| Параметр (spa) | По умолчанию | Описание |
|----------------|-------------|----------|
| `port` | `5173` | Порт dev-сервера |
| `aliases` | — | Алиасы путей (`{'@': 'src'}`) |
| `proxy` | — | Проксирование запросов |
| `base` | `'/'` | Base URL |
| `outDir` | `'dist'` | Папка сборки |
| Параметр (library) | По умолчанию | Описание |
|--------------------|-------------|----------|
| `entry` | — | Точка входа (обязательный) |
| `name` | — | Имя библиотеки (обязательный) |
| `aliases` | — | Алиасы путей |
| `external` | `[]` | Зависимости, исключаемые из бандла |
| `formats` | `['es', 'cjs']` | Форматы выходных файлов |
### @vigdorov/jest-config
Jest с быстрой трансформацией через SWC. Алиасы в едином формате с Vite.
```ts
// jest.config.ts
import {jestConfig} from '@vigdorov/jest-config';
export default jestConfig({
environment: 'jsdom',
aliases: {'@': 'src'},
});
```
| Параметр | По умолчанию | Описание |
|----------|-------------|----------|
| `environment` | `'node'` | `'node'` для бэкенда, `'jsdom'` для фронтенда |
| `aliases` | — | Алиасы путей (формат как в Vite) |
> Папку `coverage/` нужно добавить в `.gitignore` проекта.
### @vigdorov/playwright-config
E2E-тесты в трёх браузерах: Chromium, Firefox, WebKit. Автоматически адаптируется к CI-окружению.
```ts
// playwright.config.ts
import {playwrightConfig} from '@vigdorov/playwright-config';
export default playwrightConfig({
baseURL: 'http://localhost:5176',
});
```
| Параметр | По умолчанию | Описание |
|----------|-------------|----------|
| `baseURL` | — | URL приложения (обязательный) |
| `testDir` | `'e2e'` | Папка с тестами |
| `retries` | `0` (локально) / `2` (CI) | Количество ретраев |
### @vigdorov/knip-config
Поиск неиспользуемого кода: файлы, экспорты, зависимости. Завершается с ошибкой если находит проблемы — используй в check-скрипте для блокировки сборки.
```ts
// knip.config.ts
import {knipConfig} from '@vigdorov/knip-config';
export default knipConfig({
entry: ['src/main.tsx'],
});
```
| Параметр | По умолчанию | Описание |
|----------|-------------|----------|
| `entry` | `['src/index.ts']` | Точки входа |
| `project` | `['src/**/*.{ts,tsx,js,jsx}']` | Файлы проекта |
| `ignore` | `['**/*.test.*', '**/*.spec.*', 'e2e/**', '**/*.d.ts']` | Игнорируемые паттерны |
| `ignoreDependencies` | `[]` | Зависимости, которые не проверять |
---
## Рекомендуемые скрипты
```json
{
"scripts": {
"dev": "vite",
"build": "npm run check && vite build",
"check": "knip",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"format": "prettier --write src",
"test": "jest",
"e2e": "playwright test"
}
}
```