Утилита @eslint/migrate-config предназначена для
автоматизированной миграции конфигураций ESLint из устаревших форматов в
современную структуру, основанную на flat config. Основная задача
инструмента — снизить объём ручной работы при переходе проектов на новые
версии ESLint, где традиционный формат .eslintrc постепенно
заменяется конфигурацией через JavaScript-модули и массивы
конфигурационных объектов.
Миграция конфигурации затрагивает не только синтаксис, но и архитектурную модель ESLint. Старые подходы опираются на каскадное наследование и множество неявных правил, тогда как flat config строится на явной композиции конфигурационных блоков без скрытого объединения.
Ключевая функция утилиты заключается в анализе существующих конфигурационных файлов и генерации эквивалентной структуры в новом формате с учётом совместимости плагинов, правил и окружений.
Понимание работы @eslint/migrate-config требует
различения двух моделей конфигурации.
Старая система конфигурации опирается на несколько типов файлов:
.eslintrc.eslintrc.json.eslintrc.js.eslintrc.ymlОсновные характеристики:
extends для подключения пресетов;env и
globals.Эта модель удобна, но скрывает множество правил объединения, что усложняет отладку.
Новая система конфигурации строится вокруг единого JavaScript-модуля:
export default [
{
files: ["**/*.js"],
rules: {
semi: "error"
}
}
];
Особенности:
Утилита выполняет преобразование между двумя моделями конфигурации. Она анализирует входные данные и формирует эквивалентную структуру flat config, сохраняя поведение правил максимально близким к исходному.
Основные этапы работы:
extends и подключаемых пресетов;env, globals,
plugins;Установка осуществляется через пакетный менеджер:
npm install -D @eslint/migrate-config
После установки доступна CLI-команда:
npx @eslint/migrate-config
При запуске инструмент автоматически ищет конфигурационные файлы ESLint в проекте и начинает процесс преобразования.
Утилита обрабатывает:
.eslintrc.js.eslintrc.jsonpackage.jsonПри наличии нескольких источников применяется приоритетность, аналогичная ESLint:
package.json.Одним из самых сложных этапов является обработка
extends.
Пример старой конфигурации:
{
"extends": [
"eslint:recommended",
"plugin:react/recommended"
]
}
В процессе миграции:
eslint:recommended разворачивается в набор правил;plugin:react/recommended преобразуется в
flat-представление плагина;Утилита старается сохранить порядок применения правил, так как он влияет на итоговое поведение линтера.
Правила ESLint в flat config остаются концептуально теми же, но изменяется способ их группировки.
Исходная конфигурация:
{
"rules": {
"eqeqeq": "error",
"no-console": "warn"
}
}
После миграции:
export default [
{
rules: {
eqeqeq: "error",
"no-console": "warn"
}
}
];
В старом формате плагины указываются строками:
{
"plugins": ["react"]
}
В flat config они становятся импортируемыми объектами:
import react from "eslint-plugin-react";
export default [
{
plugins: {
react
}
}
];
Утилита автоматически пытается сопоставить имя плагина с установленным пакетом.
Старый формат:
{
"env": {
"browser": true,
"node": true
}
}
Преобразование:
env раскладывается в набор глобальных переменных и
параметров окружения;languageOptions.{
"globals": {
$: "readonly"
}
}
В flat config:
export default [
{
languageOptions: {
globals: {
$: "readonly"
}
}
}
];
Итоговый результат работы утилиты — файл
eslint.config.js, который содержит массив конфигурационных
объектов.
Пример структуры:
import js from "@eslint/js";
import react from "eslint-plugin-react";
export default [
js.configs.recommended,
{
files: ["**/*.js"],
plugins: {
react
},
rules: {
"react/react-in-jsx-scope": "off"
}
},
{
files: ["**/*.test.js"],
rules: {
"no-unused-expressions": "off"
}
}
];
Утилита старается разделять конфигурацию на логические блоки:
Старый формат:
{
"overrides": [
{
"files": ["*.test.js"],
"rules": {
"no-undef": "off"
}
}
]
}
В flat config:
export default [
{
files: ["*.test.js"],
rules: {
"no-undef": "off"
}
}
];
Каждый override становится отдельным объектом конфигурации.
При миграции возможны ситуации, когда одно и то же правило определяется в разных слоях конфигурации.
Механизм разрешения:
files перекрывают глобальные
настройки;Несмотря на высокую степень автоматизации, существуют сценарии, требующие ручной доработки.
Если .eslintrc.js использует функции:
module.exports = {
rules: process.env.NODE_ENV === "production" ? prodRules : devRules
};
автоматическое преобразование не всегда может корректно интерпретировать условную логику.
Плагины, не имеющие явного ESM-эквивалента или использующие нестандартную структуру экспорта, могут потребовать ручного подключения.
Некоторые пакеты используют цепочки расширений, которые сложно полностью развернуть в статическую структуру.
@eslint/migrate-config в корне проекта;eslint.config.js;После генерации конфигурации важно анализировать:
Особое внимание требуется к проектам с большим количеством
overrides и сложной иерархией extends, так как
именно в них чаще всего проявляются расхождения поведения линтера.
В монорепозиториях утилита обрабатывает несколько конфигураций, но итоговая структура может требовать разделения по пакетам.
Характерные особенности:
Миграция часто приводит к необходимости централизовать часть правил в shared-конфигурацию и распределить специфичные настройки по пакетам.
Утилита ориентирована на версии ESLint, где flat config становится основным форматом. В таких версиях:
.eslintrc считается устаревшим;eslint.config.js;@eslint/migrate-config выступает как промежуточный
инструмент, уменьшающий разрыв между поколениями конфигураций и
обеспечивающий детерминированный переход без ручного переписывания всей
структуры правил.