@triggery/core
Рантайм, на котором работают все биндинги Triggery. Framework-agnostic, без рантайм-зависимостей, запускается везде, где есть JavaScript (браузер, Node, Workers, React Native, edge).
Установка
Заголовок раздела «Установка»pnpm add @triggery/core npm install @triggery/core yarn add @triggery/core bun add @triggery/core Что внутри
Заголовок раздела «Что внутри»| Экспорт | Назначение |
|---|---|
createTrigger | Описать сценарий (события, условия, required, обработчик). |
createRuntime | Инстанцировать изолированный рантайм. |
getDefaultRuntime / setDefaultRuntime | Хелперы для глобального синглтона. |
createCheck | Собрать хелперы check.is/all/any для контекста обработчика. |
createInspector | Кастомный инспектор на кольцевом буфере. |
createScheduler | Собрать кастомный планировщик. |
| Все публичные типы | TriggerSchema, TriggerCtx, Middleware, ConcurrencyStrategy, … |
Быстрый пример
Заголовок раздела «Быстрый пример»import { createRuntime, createTrigger } from '@triggery/core';
const runtime = createRuntime();
const trigger = createTrigger<{
events: { tick: number };
actions: { log: number };
}>(
{
id: 'demo:tick',
events: ['tick'],
handler: ({ event, actions }) => actions.log?.(event.payload),
},
runtime,
);
runtime.registerAction('demo:tick', 'log', n => console.log('tick', n));
runtime.fireSync('tick', 42); // → "tick 42"Это рантайм в чистом виде. В реальном приложении ручной registerAction не нужен — биндинги делают это через useAction.
Почему «framework-agnostic»?
Заголовок раздела «Почему «framework-agnostic»?»Рантайм — обычный JavaScript-объект с реестром на Map. Он не импортирует React. Не импортирует виртуальный DOM. Запускается:
- В web-воркере или service-воркере.
- В Node.js-процессе — CLI, сервер, edge-функция.
- В React Native (DOM-адаптер рантайму не нужен).
- В ванильной HTML-странице без бандлера.
Одно и то же объявление createTrigger({ … }) без изменений работает во всех перечисленных средах. Биндинги (~50 строк каждый) связывают useEvent / useCondition / useAction с жизненным циклом хост-фреймворка.
Возможности
Заголовок раздела «Возможности»- Индексированный диспатч —
Map<eventKey, Trigger[]>, никаких полных сканов. required-гейт — обработчик пропускается (с записью в инспектор), пока не зарегистрированы все обязательные условия.- Стратегии конкурентности для асинхронных обработчиков:
take-latest(по умолчанию),take-every,take-first,queue,exhaust,sync. - Цепочки действий:
actions.debounce(ms).foo(p),actions.throttle,actions.defer,actions.queue. - Безопасность каскадов — лимит глубины и обнаружение циклов в цепочках
action → fireEvent. - Middleware —
onFire,onBeforeMatch,onSkip,onActionStart,onActionEnd,onError,onCascade. - Кольцевой буфер инспектора — встроен, по умолчанию автоматически отключается в PROD.
- Last-mount-wins для владения регистрацией с DEV warn-once.
- Чистый ESM, без side-effects, tree-shakable.
Размер бандла
Заголовок раздела «Размер бандла»Около 5 КБ gzipped только для самого ядра. Каждый биндинг добавляет сверху примерно 1 КБ.
Связанные пакеты
Заголовок раздела «Связанные пакеты» @triggery/react Биндинги для React 18+.
@triggery/solid Биндинги для SolidJS.
@triggery/vue Биндинги для Vue 3 Composition API.
@triggery/testing Тестовый рантайм + fakeScheduler.
@triggery/vite Автодискавери через virtual:triggery-registry.
@triggery/eslint-plugin 8 lint-правил: no-event-cascade, hook-rules, …