/** @file Url patterns module. */ export function matchesAny(url: string, patterns: readonly string[] | undefined): boolean { if (!patterns || patterns.length === 0) return false; return patterns.some((pattern) => matchesPattern(url, pattern)); } export function matchesPattern(url: string, pattern: string): boolean { if (pattern.startsWith("/") && pattern.endsWith("/") && pattern.length > 2) { return new RegExp(pattern.slice(1, -1), "u").test(url); } const escaped = pattern .split("*") .map((part) => part.replaceAll(/[.*+?^${}()|[\]\\]/gu, "\\$&")) .join(".*"); return new RegExp(`^${escaped}$`, "u").test(url); }