Перейти к содержимому
GitHubXDiscord

@triggery/codemod

Codemod-скрипты, которые механически переводят side-effect код React / Redux в модель Triggery «событие → условия → действия». На ts-morph, поэтому на выходе — настоящий TypeScript: JSX, типы и импорты сохранены.

npm bundle

pnpm 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' });

Читает первый useEffect(() => { ... }, []) в файле и создаёт соседний <name>.trigger.ts со скелетным createTrigger({...}). Компонент переписывается так, чтобы вместо эффекта вызывался useEvent(<name>Trigger, '<event-name>').

Codemod намеренно не:

  • Выводит схему-дженерик events / conditions / actions — это пишешь ты.
  • Переносит захваченное замыканием состояние в типизированные условия — рефактори вручную.
  • Трогает функции очистки или эффекты с условными зависимостями — обрабатывай вручную.

Для каждого вызова startListening({ actionCreator, effect }) в файле генерирует один <event-name>.trigger.ts. Тело effect дословно переносится в обработчик нового триггера с маркером // TODO: refactor dispatch/getState into actions/conditions.

Другие формы listenerMiddleware (matcher, predicate, type) распознаются, но пропускаются — их нужно смотреть глазами.