UNPKG

@vizzly-testing/static-site

Version:

Static site generator plugin for Vizzly - seamlessly integrate static sites (Gatsby, Astro, Jekyll, Next.js) into your visual development workflow

76 lines (69 loc) 2.34 kB
/** * Pattern matching utilities for page filtering * Pure functions for glob-like pattern matching */ /** * Check if a string matches a glob-like pattern * Supports wildcards: * (any characters), ** (any path segments) * @param {string} str - String to test * @param {string} pattern - Pattern to match against * @returns {boolean} True if string matches pattern */ export function matchPattern(str, pattern) { if (!pattern) return true; if (!str) return false; // Escape special regex characters except * and / let regexPattern = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&') // Replace ** with a placeholder .replace(/\*\*/g, '__DOUBLE_STAR__') // Replace * with regex for any characters except / .replace(/\*/g, '[^/]*') // Replace placeholder with regex for any characters including / .replace(/__DOUBLE_STAR__/g, '.*'); let regex = new RegExp(`^${regexPattern}$`); return regex.test(str); } /** * Filter pages by include and exclude patterns * @param {Array<Object>} pages - Array of page objects with path property * @param {string|null} includePattern - Include pattern * @param {string|null} excludePattern - Exclude pattern * @returns {Array<Object>} Filtered pages */ export function filterByPattern(pages, includePattern, excludePattern) { return pages.filter(page => { let path = page.path || page.url; // Check include pattern if (includePattern && !matchPattern(path, includePattern)) { return false; } // Check exclude pattern if (excludePattern && matchPattern(path, excludePattern)) { return false; } return true; }); } /** * Find matching interaction hook for a page * Patterns are tried in order, first match wins * @param {Object} page - Page object with path/url * @param {Object} interactions - Interactions config object with pattern keys * @returns {Function|null} Matching interaction function or null */ export function findMatchingHook(page, interactions) { if (!interactions) { return null; } let path = page.path || page.url; // Handle simple object map format: { pattern: hook } if (Object.keys(interactions).length === 0) { return null; } for (let [pattern, hook] of Object.entries(interactions)) { if (matchPattern(path, pattern)) { return hook; } } return null; }