import { Matcher, } from './Matcher' import { MatchResult, } from './MatchResult' export interface RegExpUrlMatcherInput { req: { url: string } } export interface RegExpExecGroupArray< T extends object > extends Array { index: number input: string groups: T } export type RegExpUrlMatchResult = MatchResult<{ match: RegExpExecGroupArray }> export class RegExpUrlMatcher< R extends object, P extends RegExpUrlMatcherInput = RegExpUrlMatcherInput > implements Matcher, P> { constructor(private readonly urls: RegExp[]) { this.match = this.match.bind(this) } match({ req }: RegExpUrlMatcherInput): RegExpUrlMatchResult { for (const url of this.urls) { const result = url.exec(req.url) as never as RegExpExecGroupArray if (result !== null) { return { matched: true, result: { match: result, }, } } } return { matched: false, } } }