migrateFromListenerMiddleware
Проходит по файлу, использующему createListenerMiddleware / startListening из Redux Toolkit, и генерирует один *.trigger.ts на каждую регистрацию startListening({ actionCreator, effect }). Исходный файл остаётся нетронутым — адоптеры просматривают сгенерированные триггеры, подвязывают их в компонентах через useEvent, а когда готовы — удаляют регистрацию middleware.
Поставляется как программный API и как CLI-команда (triggery-codemod migrate-from-listener-middleware).
Сигнатура
Заголовок раздела «Сигнатура»Параметры
Заголовок раздела «Параметры»| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
file | string | да | Путь к файлу, объявляющему middleware. |
outDir | string | нет | Директория для сгенерированных файлов триггеров. По умолчанию — директория исходника. |
dryRun | boolean | нет | Спланировать изменения и вернуть их без записи на диск. |
project | ts-morph.Project | нет | Предсуществующий project — переиспользуй между батчами. |
Возвращает
Заголовок раздела «Возвращает»| Поле | Описание |
|---|---|
file | Исходный файл, который был обработан. |
migrated | По одной записи на каждый обработанный вызов startListening — имя, выходной путь, сгенерированный исходник. |
Поддерживаемые формы
Заголовок раздела «Поддерживаемые формы»Codemod распознаёт каноническую форму RTK:
Другие формы — matcher, predicate или type — обнаруживаются, но в V1 не трансформируются. Исходный файл не переписывается, так что повторные прогоны идемпотентны.
| Флаг | Обязательный | Описание |
|---|---|---|
--out-dir | нет | Переопределить дефолтную выходную директорию. |
--dry-run | нет | Распечатать запланированные изменения без записи. |
Примеры
Заголовок раздела «Примеры»Программно
Заголовок раздела «Программно»Вывод:
Что генерируется
Заголовок раздела «Что генерируется»Для каждого startListening({ actionCreator: userLoggedIn, effect: (action, api) => {...} }) codemod пишет:
Имя события выводится из текста символа actionCreator. Codemod не пытается разрезолвить .type на action creator’е — это требовало бы type info — поэтому если slug’и action creator’а не совпадают с type-строкой слайса, имена событий правь руками.
Шаги дальше
Заголовок раздела «Шаги дальше»Сгенерированные триггеры — это стартеры. После прогона codemod-скрипта:
- Замени
listenerApi.dispatch(x)на действие Triggery — добавьactions.<name>в схему, зарегистрируй черезuseActionв подходящем компоненте. - Замени чтения
listenerApi.getState()типизированными условиями — регистрируй черезuseCondition. - Подключи зажигание нового события: компоненты, которые раньше диспатчили слушаемое действие, теперь зовут
useEvent(trigger, 'name'). - Когда каждый потребитель подвязан — удаляй блок
startListening.