function escapeRegex(str: string): string { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') } export function matchesTarget(url: string, target: string): boolean { if (target === url) return true if (target.includes('*')) { const escaped = escapeRegex(target) const regex = new RegExp('^' + escaped.replace(/\\\*/g, '.*') + '$') return regex.test(url) } return url.includes(target) } export function matchesWildcardPattern(value: string, pattern: string): boolean { if (!pattern.includes('*') && !pattern.includes('?')) { return value.toLowerCase() === pattern.toLowerCase() } const escaped = escapeRegex(pattern) const regexPattern = '^' + escaped.replace(/\\\*/g, '.*').replace(/\\\?/g, '.') + '$' return new RegExp(regexPattern, 'i').test(value) }