@triggery/codemod
Codemod-скрипты, которые механически переводят side-effect код React / Redux в модель Triggery «событие → условия → действия». На ts-morph, поэтому на выходе — настоящий TypeScript: JSX, типы и импорты сохранены.
Установка
Заголовок раздела «Установка»pnpm add -D @triggery/codemod npm install --save-dev @triggery/codemod yarn add --save-dev @triggery/codemod bun add -D @triggery/codemod Что внутри
Заголовок раздела «Что внутри»| Команда / Экспорт | Назначение |
|---|---|
triggery-codemod extract-trigger --name <event> <file> | Вытаскивает блок useEffect(() => { ... }, []) из компонента в соседний <name>.trigger.ts. |
triggery-codemod migrate-from-listener-middleware <file> | Генерирует по одному триггеру на каждый вызов RTK startListening({ actionCreator, effect }). |
extractTrigger, migrateFromListenerMiddleware | Программный API этих двух codemod-скриптов. |
Добавь --dry-run, чтобы посмотреть результат без записи.
Быстрый пример
Заголовок раздела «Быстрый пример»# Pull a useEffect block out of a component into a *.trigger.ts file.
npx triggery-codemod extract-trigger --name new-message src/Chat.tsx
# Generate one trigger per RTK listenerMiddleware effect.
npx triggery-codemod migrate-from-listener-middleware src/store/middleware.tsПрограммный API:
import { extractTrigger, migrateFromListenerMiddleware } from '@triggery/codemod';
extractTrigger({ file: 'src/Chat.tsx', name: 'new-message' });
migrateFromListenerMiddleware({ file: 'src/store/middleware.ts' });Что делает каждый codemod
Заголовок раздела «Что делает каждый codemod»extract-trigger
Заголовок раздела «extract-trigger»Читает первый useEffect(() => { ... }, []) в файле и создаёт соседний <name>.trigger.ts со скелетным createTrigger({...}). Компонент переписывается так, чтобы вместо эффекта вызывался useEvent(<name>Trigger, '<event-name>').
Codemod намеренно не:
- Выводит схему-дженерик
events/conditions/actions— это пишешь ты. - Переносит захваченное замыканием состояние в типизированные условия — рефактори вручную.
- Трогает функции очистки или эффекты с условными зависимостями — обрабатывай вручную.
migrate-from-listener-middleware
Заголовок раздела «migrate-from-listener-middleware»Для каждого вызова startListening({ actionCreator, effect }) в файле генерирует один <event-name>.trigger.ts. Тело effect дословно переносится в обработчик нового триггера с маркером // TODO: refactor dispatch/getState into actions/conditions.
Другие формы listenerMiddleware (matcher, predicate, type) распознаются, но пропускаются — их нужно смотреть глазами.