Ядро без зависимостей
Ноль зависимостей в рантайме. Используй @triggery/core напрямую из Node, чистого JavaScript или любого фреймворка. Биндинги — тонкие обёртки вокруг жизненного цикла, примерно по 50 строк каждая.
Один файл описывает один сценарий. События приходят на вход, условия отсекают лишнее, действия выполняют побочные эффекты. Один и тот же API на хуках работает в React, Solid и Vue.
import { createTrigger } from "@triggery/core";
type Settings = { sound: boolean; notifications: boolean };
type Payload = { author: string; text: string; channelId: string };
export const messageTrigger = createTrigger<{
events: { "new-message": Payload };
conditions: { settings: Settings; activeChannelId: string | null };
actions: { showToast: { title: string; body: string }; playSound: "beep" };
}>({
id: "message-received",
required: ["settings"],
handler({ event, conditions, actions, check }) {
if (conditions.activeChannelId === event.payload.channelId) return;
if (!check.is("settings", (s) => s.notifications)) return;
actions.debounce(800).playSound?.("beep");
actions.showToast?.({
title: event.payload.author,
body: event.payload.text,
});
},
});Компоненты остаются сосредоточенными на своём порте. Никто из них не лезет в состояние соседа.
import { useEvent, useCondition, useAction } from "@triggery/react";
import { messageTrigger } from "./triggers/message.trigger";
// Продьюсер: поле ввода в чате отправляет событие.
const fireNewMessage = useEvent(messageTrigger, "new-message");
// Провайдер: панель настроек отдаёт снимок состояния через геттер.
useCondition(messageTrigger, "settings", () => settings, [settings]);
// Реактор: тост-компонент подписывается на действие.
useAction(messageTrigger, "showToast", (payload) =>
toast.success(payload.title, { description: payload.body }),
);Никакого проброса пропсов через всё дерево, никаких цепочек useEffect, никакой общей шины контекста. Меняешь файл триггера — меняется вся реакция, а компонентов касаться не нужно.
Ядро без зависимостей
Ноль зависимостей в рантайме. Используй @triggery/core напрямую из Node, чистого JavaScript или любого фреймворка. Биндинги — тонкие обёртки вокруг жизненного цикла, примерно по 50 строк каждая.
React · Solid · Vue
Один и тот же API на хуках в каждом биндинге. Меняй стек, не переписывая слой оркестрации.
Типобезопасность по умолчанию
Одна inline-обобщённая схема, три типизированные поверхности — события, условия, действия. Без приведений as, без .d.ts-файлов, без кодогенерации.
Тесты без React
Обработчики триггеров — почти чистые функции от снимка состояния. Подмени условия, подмени действия, отправь событие. React Testing Library не обязателен.
DevTools из коробки
Кольцевой буфер инспектора встроен в каждый рантайм. Подключи мост к Redux DevTools, поставь <InspectorView> или переигрывай записанные сессии.
ESLint и codemod-скрипты
Восемь правил ESLint ловят типичные ошибки. Codemod-скрипты переносят код с useEffect, RTK listenerMiddleware и (в 1.0) с Redux Saga.
pnpm add @triggery/core @triggery/react npm install @triggery/core @triggery/react yarn add @triggery/core @triggery/react bun add @triggery/core @triggery/react Для SolidJS используй @triggery/solid, для Vue 3 — @triggery/vue. API одинаковый.
Открыть руководство
Посмотреть готовый рецепт
Открыть в StackBlitz
Открыть в CodeSandbox
Triggery — единственная библиотека оркестрации, в которой один и тот же файл со сценарием понятен и джуну в понедельник, и сеньору на ревью в пятницу.
— early adopter, 2026
| Triggery | Redux Saga | RTK listenerMiddleware | XState | RxJS | |
|---|---|---|---|---|---|
| API на хуках | да | нет | частично | да | нет |
| Файл на сценарий | да | нет | частично | да | нет |
| Работает в любом фреймворке | да | только Redux | только Redux | да | да |
| Inline-обобщённая схема | да | нет | нет | да | n/a |
| Встроенные DevTools | да | внешние | RTK DevTools | да | внешние |
| Размер ядра (gzip) | < 6 кБ | ~17 кБ | внутри RTK | ~16 кБ | ~46 кБ |
Подробные сравнения — в разделе «Миграция → Сравнение».
Triggery находится в окне 0.9.x release candidate — заморозка фич, последний круг сообщественного тестирования перед 1.0. Рантайм уже работает в продакшене с начала 2026 года, в CI закреплены пороги покрытия (строки ≥ 95%, ветви ≥ 85%). Что дальше — смотри в публичной дорожной карте.
Поддержать проект