@t8/event-patterns
Version:
Lightweight event emitter with flexible event type matching
37 lines (27 loc) • 898 B
text/typescript
export type MatchParams = Record<string, string | undefined>;
function toObject(x: string[]) {
return x.reduce<Record<string, unknown>>((p, v, k) => {
p[String(k)] = v;
return p;
}, {});
}
export function matchPattern(pattern: unknown, value: unknown): MatchParams | null {
if (Array.isArray(pattern)) {
for (let p of pattern) {
let matches = matchPattern(p, value);
if (matches) return matches;
}
return null;
}
if (pattern instanceof RegExp) {
let matches = String(value).match(pattern);
if (matches)
return {
...toObject(Array.from(matches).slice(1)),
...matches.groups,
} as MatchParams;
}
if (pattern === '*' || pattern === value)
return {} as MatchParams;
return null;
}