lite-fsm
lite-fsm — легковесная TypeScript-библиотека для описания конечных автоматов. Она выносит поведение приложения в явную модель состояний, событий и переходов, связывает автоматы общей шиной событий и в той же модели описывает динамические параллельные процессы — готовая архитектура для бизнес-логики проектов разного масштаба.
Быстрые ссылки
- Playground: демо с исходниками, UI-сценариями и DevTools
- Visualizer: визуальная модель автоматов на базе
@lite-fsm/graph, диагностика FSM-структуры и симуляция событий
О библиотеке
В основе lite-fsm лежит модель конечного автомата: система находится в одном из известных состояний и меняет его только через описанные события. Runtime библиотеки добавляет к этой модели контекст, effects, middleware, snapshots и MachineManager для координации нескольких автоматов.
С помощью lite-fsm вы сможете:
- Структурировать сложную интерактивную логику UI-компонентов
- Организовывать и контролировать жизненные циклы процессов
- Упрощать тестирование и отладку кода
- Делать потоки управления данными явными
- Избегать ошибок, связанных с неучтёнными состояниями
Ядро не зависит от UI-фреймворков, поэтому одна и та же модель работает в React, Node.js, worker-ах, тестах и приложениях без пользовательского интерфейса.
Почему конечные автоматы?
- Ясная логика: когда состояния и переходы описаны явно, поведение проще читать и обсуждать
- Надёжность: явная модель состояний снижает риск неучтённых состояний и недопустимых переходов
- Самодокументируемость: Структура автомата естественным образом документирует поведение компонента или процесса
- Снижение сложности: бизнес-логику можно разделить на дискретные состояния и правила перехода
- Наглядность: состояния и переходы можно экспортировать в граф и анализировать отдельно от UI
- Тестирование: детерминированные переходы проще покрывать unit-тестами
Ключевые возможности
- Компактный API: описание
config,reducer,effectsи запуск черезMachineManager - Композиция автоматов: разделение доменной логики на несколько независимых автоматов
- Интеграция с React: хуки, provider и hydration boundary для React-приложений
- Расширяемость через middleware: подключение Immer, Redux DevTools и собственных обработчиков
- Типизация TypeScript: вывод состояний, событий, контекста и зависимостей effects
- Небольшой runtime: Минимум обязательных зависимостей для базовых сценариев
- Расширенные паттерны: actor templates, effects, snapshots и hydration
- Прозрачная иммутабельность: Поддержка reducer-ов в стиле Immer через middleware
Быстрый старт
Установка
Runtime-пакеты доступны через npm.
npm install @lite-fsm/core @lite-fsm/middleware immerСтарт проекта с CLI
Если нужен React-проект с готовым MachineManager, начните через CLI и добавляйте автоматы по мере роста доменной логики:
npx @lite-fsm/cli create my-app --template vite
cd my-app
npx @lite-fsm/cli add-machine user-session
npm run devcreate собирает Next.js или Vite starter с src/store, React provider-ом и базовым автоматом app. add-machine создаёт src/store/machines/user-session.ts, регистрирует userSession в store и подключает его события к общему AppEvents.
Подробности, шаблоны, опции менеджера пакетов и ограничения generated store описаны в разделе @lite-fsm/cli.
Skill для работы с lite-fsm
Если вы используете Codex или другой агентный инструмент со skills, установите project skill для lite-fsm:
npx skills add https://github.com/AlexanderGureev/lite-fsm/tree/main/.agents/skills/lite-fsmПример использования
import { createMachine, MachineManager } from "@lite-fsm/core";
import { immerMiddleware } from "@lite-fsm/middleware/immer";
const lamp = createMachine({
config: {
OFF: {
TURN_ON: "ON",
RESET: "OFF",
},
ON: {
TURN_OFF: "OFF",
RESET: "OFF",
},
},
initialState: "OFF",
initialContext: {
toggleCount: 0,
},
reducer: (state, action, { nextState }) => {
state.state = nextState;
if (action.type === "RESET") {
state.context.toggleCount = 0;
return;
}
state.context.toggleCount += 1;
},
});
const manager = MachineManager({ lamp }, { middleware: [immerMiddleware] });
manager.onTransition((prev, next, action) => {
console.log("[onTransition]", action.type, next.lamp);
});
manager.transition({ type: "TURN_ON" });
manager.transition({ type: "TURN_OFF" });
manager.transition({ type: "RESET" });
const { state, context } = manager.getState().lamp;Состояния и события рекомендуем писать в
UPPER_SNAKE_CASE. Reducer выше используетimmerMiddleware— это позволяет мутироватьstateнапрямую безreturn. Без middleware reducer должен возвращать новый объект{ state, context }.
React: Для интеграции lite-fsm с React используйте специализированные хуки и компоненты, описанные в разделе @lite-fsm/react.
TypeScript: Если вы используете TypeScript, посмотрите раздел TypeScript: там показаны типизированные фабрики, события и React-хуки.
Playground: Примеры с исходниками — sync-автоматы, async-эффекты, actor templates и SSR-streaming — доступны в playground.
Куда дальше?
После ознакомления с основами, вы можете изучить другие разделы документации:
- Конечные автоматы: Подробное описание концепций FSM и statecharts
- Акторы: Динамические шаблоны автоматов для параллельных процессов и задач
- Hydration и snapshots: SSR, snapshot, hydrate/dehydrate и
FSMHydrationBoundary - Продвинутые концепции: Углублённое изучение возможностей библиотеки
- Лучшие практики: Практические рекомендации по проектированию автоматов
- Пакеты: Обзор
@lite-fsm/core,@lite-fsm/react,@lite-fsm/middleware,@lite-fsm/persist,@lite-fsm/graphи@lite-fsm/cli - @lite-fsm/react: Руководство по интеграции с React-приложениями
- Практика: TypeScript и Next.js интеграции
- API: Полная документация по всем функциям и параметрам
- @lite-fsm/middleware: Расширение функциональности с помощью промежуточных обработчиков
- @lite-fsm/persist: Долговременное хранение состояния
MachineManagerи синхронизация между вкладками - Инструменты: visualizer, CLI create/add-machine/export и
@lite-fsm/graph - Сравнение: Сравнение lite-fsm с другими решениями для управления состоянием
- Примеры: Готовые решения типовых задач и паттерны использования
- Playground: Демо-площадка на Next.js с подсветкой переходов FSM