// Match webhook events against event trigger conditions. import { getEnabledEventTriggers, type EventTrigger } from "./event-store"; import { type ParsedEvent } from "./template"; function escapeRegex(s: string): string { return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function globMatch(pattern: string, value: string): boolean { const regex = new RegExp( "^" + pattern.split("*").map(escapeRegex).join(".*") + "$", ); return regex.test(value); } export function matchesTrigger(trigger: EventTrigger, event: ParsedEvent): boolean { if (!trigger.enabled) return false; if (trigger.eventType !== "*" && trigger.eventType !== event.eventType) return false; if (trigger.repoFilter && !globMatch(trigger.repoFilter, event.repo)) return false; if (trigger.stateFilter && trigger.stateFilter !== event.state) return false; if (trigger.contextFilter && !event.context.includes(trigger.contextFilter)) return false; return true; } export async function findMatchingTriggers(event: ParsedEvent): Promise { const triggers = await getEnabledEventTriggers(); return triggers.filter(t => matchesTrigger(t, event)); }