import { transform } from 'regexp-tree' // The Go regexp lib doesn't support lookaheads, so we need to remove them export const stripLookahead = (regex: string) => { // Early return if there's no lookahead if (!regex?.includes('(?!')) { return regex } try { // Parse the regexp into an AST const re = transform(`/${regex}/`, { Assertion(path) { // Remove the lookahead if (path.node.kind === 'Lookahead') { path.remove() } }, }) // Strip the leading and trailing slashes return re.toString().slice(1, -1) } catch { // Failed to parse regex, so return unchanged return regex } } const LOCALIZED_REGEX_PREFIX = '(?:\\/(_next\\/data\\/[^/]{1,}))?(?:\\/([^/.]{1,}))' const OPTIONAL_REGEX_PREFIX = '(?:\\/(_next\\/data\\/[^/]{1,}))?(?:\\/([^/.]{1,}))?' // Make the locale section of the matcher regex optional export const makeLocaleOptional = (regex: string) => regex.replace(LOCALIZED_REGEX_PREFIX, OPTIONAL_REGEX_PREFIX)