Стабильный · с 0.1.0
Плагин Vite, который на этапе сборки прогоняет glob по всем файлам *.trigger.{ts,tsx,js,jsx} в проекте и генерирует виртуальный модуль — virtual:triggery-registry — импортирующий их все. Импортни этот виртуальный модуль один раз в точке входа приложения, и каждый триггер сам зарегистрируется в рантайме; без ручной разводки, без построчных import './foo.trigger'.
HMR-осведомлён: правка существующего файла триггера переиспполняет его вызов createTrigger(...), а last-mount-wins в рантайме заменяет старую регистрацию. Добавление, удаление или переименование файла триггера инвалидирует виртуальный модуль, так что список импортов пересобирается при следующем запросе.
import triggery from '@triggery/vite' ;
// or
import { triggery } from '@triggery/vite' ;
function triggery ( options ?: TriggeryViteOptions ) : Plugin ;
type TriggeryViteOptions = {
readonly glob ?: string | readonly string [];
};
Поле Тип По умолчанию Описание globstring | readonly string[]'src/**/*.trigger.{ts,tsx,js,jsx}'Паттерн(ы) для файлов триггеров. Разрешаются относительно корня проекта, который сообщает Vite.
import { defineConfig } from 'vite' ;
import triggery from '@triggery/vite' ;
export default defineConfig ({
plugins : [ triggery ()] ,
}) ;
Затем в точке входа приложения:
// src/main.tsx
import 'virtual:triggery-registry' ;
import { StrictMode } from 'react' ;
import { createRoot } from 'react-dom/client' ;
import { App } from './App' ;
createRoot (document. getElementById ( 'root' ) ! ). render (
< StrictMode >
< App />
</ StrictMode > ,
);
import { defineConfig } from 'vite' ;
import triggery from '@triggery/vite' ;
export default defineConfig ({
plugins : [
triggery ({
glob : 'src/features/**/*.trigger.ts' ,
}),
] ,
}) ;
import { defineConfig } from 'vite' ;
import triggery from '@triggery/vite' ;
export default defineConfig ({
plugins : [
triggery ({
glob : [ 'src/**/*.trigger.ts' , 'packages/*/src/**/*.trigger.ts' ],
}),
] ,
}) ;
Добавь в глобальный .d.ts, чтобы TypeScript перестал жаловаться на bare-string импорт:
declare module 'virtual:triggery-registry' {
export {};
}
Совет
Виртуальный модуль сортируется по пути файла в алфавитном порядке — порядок регистрации детерминирован между сборками и машинами. Last-mount-wins в рантайме — это tiebreaker, если у двух триггеров совпадает id (стоит починить, но не упадёт).
Side-effect-импорты
Каждый матч glob’а импортируется ради side-эффектов , не ради экспортов. Убедись, что каждый файл *.trigger.ts зовёт createTrigger(...) на уровне модуля — ленивая инициализация внутри функции не будет подхвачена.
Порядок pre-bundle
Плагин ставит enforce: 'pre', чтобы виртуальный модуль резолвился до пользовательских импортов. Если ты стакаешь плагины, которые тоже используют enforce: 'pre', порядок определяется тем, во что превратит зависимостный граф Vite — обычно совпадает с порядком в массиве plugins:.
createTrigger Конструктор, который зовёт каждый файл `*.trigger.ts`. createRuntime Триггеры по умолчанию регистрируются против дефолтного рантайма.