@stll/regex-set-wasm 1.0.5 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +10 -0
- package/dist/regex-set.wasm32-wasi.wasm +0 -0
- package/dist/vite.d.mts +3 -5
- package/dist/vite.mjs +1 -1
- package/dist/vite.mjs.map +1 -1
- package/dist/wasi-worker-browser.mjs +24 -9
- package/dist/wasi-worker-browser.mjs.map +1 -1
- package/dist/wasm.d.mts +21 -11
- package/dist/wasm.mjs +1192 -118
- package/dist/wasm.mjs.map +1 -1
- package/package.json +6 -3
package/dist/wasm.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasm.mjs","names":["native"],"sources":["../../regex-set.wasi-browser.js","../../src/core.ts","../../src/wasm.ts"],"sourcesContent":["import {\n createOnMessage as __wasmCreateOnMessageForFsProxy,\n getDefaultContext as __emnapiGetDefaultContext,\n instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync,\n WASI as __WASI,\n} from '@napi-rs/wasm-runtime'\n\n\n\nconst __wasi = new __WASI({\n version: 'preview1',\n})\n\nconst __wasmUrl = new URL('./regex-set.wasm32-wasi.wasm', import.meta.url).href\nconst __emnapiContext = __emnapiGetDefaultContext()\n\n\nconst __sharedMemory = new WebAssembly.Memory({\n initial: 4000,\n maximum: 65536,\n shared: true,\n})\n\nconst __wasmFile = await fetch(__wasmUrl).then((res) => res.arrayBuffer())\n\nconst {\n instance: __napiInstance,\n module: __wasiModule,\n napiModule: __napiModule,\n} = __emnapiInstantiateNapiModuleSync(__wasmFile, {\n context: __emnapiContext,\n asyncWorkPoolSize: 4,\n wasi: __wasi,\n onCreateWorker() {\n const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {\n type: 'module',\n })\n\n\n return worker\n },\n overwriteImports(importObject) {\n importObject.env = {\n ...importObject.env,\n ...importObject.napi,\n ...importObject.emnapi,\n memory: __sharedMemory,\n }\n return importObject\n },\n beforeInit({ instance }) {\n for (const name of Object.keys(instance.exports)) {\n if (name.startsWith('__napi_register__')) {\n instance.exports[name]()\n }\n }\n },\n})\nexport default __napiModule.exports\nexport const RegexSet = __napiModule.exports.RegexSet\nexport const _uax29Boundaries = __napiModule.exports._uax29Boundaries\n","/* Shared core: types, helpers, and the RegexSet\n * class that uses a late-bound native backend\n * (NAPI-RS or WASM).\n * Call initBinding() before constructing classes. */\n\nconst encoder = new TextEncoder();\nconst ALTERNATION_CHUNK_MIN_BRANCHES = 64;\nconst ALTERNATION_CHUNK_SIZE = 20;\nconst ALTERNATION_CHUNK_MAX_BODY_START = 32;\n\n// -- Native binding types --------------------------------\n\nexport type NativeBinding = {\n RegexSet: new (\n patterns: string[],\n options?: NativeOptions | null,\n ) => NativeRegexSetInstance;\n _uax29Boundaries: (\n haystack: Buffer | Uint8Array,\n ) => number[];\n};\n\ntype NativeOptions = {\n wholeWords?: boolean;\n unicodeBoundaries?: boolean;\n};\n\ntype NativeRegexSetInstance = {\n patternCount: number;\n isMatch(haystack: string): boolean;\n _isMatchBuf(haystack: Buffer | Uint8Array): boolean;\n _findIterPacked(haystack: string): Uint32Array;\n _findIterPackedBuf(\n haystack: Buffer | Uint8Array,\n ): Uint32Array;\n whichMatch(haystack: string): number[];\n replaceAll(\n haystack: string,\n replacements: string[],\n ): string;\n};\n\ntype JsFallback = {\n pattern: number;\n re: RegExp;\n};\n\ntype NativeSingle = {\n pattern: number;\n inner: NativeRegexSetInstance;\n};\n\ntype BoundaryOptions = {\n wholeWords: boolean;\n unicodeBoundaries: boolean;\n};\n\ntype AlternationGroup = {\n bodyStart: number;\n bodyEnd: number;\n branches: string[];\n};\n\n// -- Late-bound native binding ---------------------------\n\nlet binding: NativeBinding;\n\n/** Set the native backend. Must be called once\n * before any class constructor. */\nexport const initBinding = (b: NativeBinding) => {\n binding = b;\n};\n\n// -- Public types ----------------------------------------\n\n/** Options for constructing a RegexSet. */\nexport type Options = {\n /**\n * Only match whole words. Wraps each pattern\n * with `\\b...\\b`.\n * @default false\n */\n wholeWords?: boolean;\n /**\n * Use Unicode word boundaries. When `true`,\n * `\\b` treats accented letters, CJK, etc. as\n * word characters (correct for non-English text).\n * When `false` (default), `\\b` uses ASCII\n * semantics matching JS `RegExp` behavior.\n *\n * Zero performance overhead in either mode;\n * boundaries are verified inline per match.\n * Automatically uses UAX#29 segmentation for\n * Thai/CJK/Lao/Khmer/Myanmar text.\n * @default true\n */\n unicodeBoundaries?: boolean;\n /**\n * Case-insensitive matching. Wraps each pattern\n * with `(?i-u:...)` for ASCII case folding.\n * Uses `-u` to prevent DFA state explosion from\n * Unicode case tables.\n *\n * Edge `\\b`/`\\B` boundaries and leading bare-flag\n * prefixes (e.g. `(?m)`, `(?m-s)`) are extracted\n * before wrapping so they remain outside the `-u`\n * scope, preserving `unicodeBoundaries` semantics.\n * Patterns already containing any `(?{flags}-u`\n * group (from RegExp `/i`, inline `(?i)`, or\n * `scopeInlineFlags`) are not double-wrapped.\n * @default false\n */\n caseInsensitive?: boolean;\n};\n\n/** A named pattern entry. */\nexport type NamedPattern = {\n /** The regex pattern (string or RegExp). */\n pattern: string | RegExp;\n /** Optional name for this pattern. */\n name?: string;\n};\n\n/** A pattern entry: string, RegExp, or named. */\nexport type PatternEntry = string | RegExp | NamedPattern;\n\n/** A single match result. */\nexport type Match = {\n /** Index of the pattern that matched. */\n pattern: number;\n /** Start UTF-16 code unit offset. */\n start: number;\n /** End offset (exclusive). */\n end: number;\n /** The matched text. */\n text: string;\n /** Pattern name (if provided at construction). */\n name?: string;\n};\n\n// -- Unpack helper ---------------------------------------\n\nfunction unpack(\n packed: Uint32Array,\n haystack: string,\n names: (string | undefined)[] | null,\n indexMap?: number[],\n): Match[] {\n const len = packed.length;\n // eslint-disable-next-line unicorn/no-new-array\n const matches = new Array<Match>(len / 3);\n for (let i = 0, j = 0; i < len; i += 3, j++) {\n const idx = packed[i];\n const s = packed[i + 1];\n const e = packed[i + 2];\n if (\n idx === undefined ||\n s === undefined ||\n e === undefined\n ) {\n throw new Error(\n `Corrupt packed match data at offset ${i}`,\n );\n }\n const pattern = indexMap ? indexMap[idx] : idx;\n if (pattern === undefined) {\n throw new Error(`Missing native index map ${idx}`);\n }\n const m: Match = {\n pattern,\n start: s,\n end: e,\n text: haystack.slice(s, e),\n };\n if (names && names[pattern] !== undefined)\n m.name = names[pattern];\n matches[j] = m;\n }\n return matches;\n}\n\n// -- Regex flag helpers ----------------------------------\n\n/**\n * Replace unescaped `\\b` and `\\B` with their\n * ASCII-only equivalents `(?-u:\\b)` / `(?-u:\\B)`.\n * Skips character classes `[...]` (where `\\b` means\n * backspace) and escaped backslashes `\\\\b`.\n */\nfunction asciiBoundaries(src: string): string {\n let result = \"\";\n let inClass = false;\n let i = 0;\n while (i < src.length) {\n if (src.charAt(i) === \"\\\\\" && i + 1 < src.length) {\n const next = src.charAt(i + 1);\n if (!inClass && (next === \"b\" || next === \"B\")) {\n result += `(?-u:\\\\${next})`;\n i += 2;\n } else {\n // escaped char (including \\\\) -- emit as-is\n result += src.charAt(i) + src.charAt(i + 1);\n i += 2;\n }\n } else {\n if (src.charAt(i) === \"[\") inClass = true;\n if (src.charAt(i) === \"]\") inClass = false;\n result += src.charAt(i);\n i++;\n }\n }\n return result;\n}\n\n/**\n * Convert a RegExp to Rust regex syntax string.\n */\nfunction regexpToRust(re: RegExp): string {\n let flags = \"\";\n if (re.flags.includes(\"i\")) flags += \"i\";\n if (re.flags.includes(\"m\")) flags += \"m\";\n if (re.flags.includes(\"s\")) flags += \"s\";\n\n // JS RegExp objects can't contain inline (?i) in\n // .source -- it's a SyntaxError. No need to run\n // scopeInlineFlags here; it only matters for\n // string patterns (handled in normalizeEntry).\n if (!flags) {\n return re.source;\n }\n\n if (!flags.includes(\"i\")) {\n return `(?${flags})${re.source}`;\n }\n\n let src = re.source;\n let leading = \"\";\n let trailing = \"\";\n\n if (src.startsWith(\"\\\\b\")) {\n leading = \"\\\\b\";\n src = src.slice(2);\n } else if (src.startsWith(\"\\\\B\")) {\n leading = \"\\\\B\";\n src = src.slice(2);\n }\n if (src.length >= 2) {\n const last = src.at(-1);\n if (last === \"b\" || last === \"B\") {\n let bs = 0;\n let k = src.length - 2;\n while (k >= 0 && src[k] === \"\\\\\") {\n bs++;\n k--;\n }\n if (bs > 0 && bs % 2 === 1) {\n trailing = \"\\\\\" + last;\n src = src.slice(0, -2);\n }\n }\n }\n\n const uFlag =\n needsAsciiMode(src) && !hasNonAscii(src) ? \"-u\" : \"\";\n return `${leading}(?${flags}${uFlag}:${src})${trailing}`;\n}\n\n/**\n * Check if content uses character class shortcuts\n * (\\w, \\W, \\d, \\D, \\s, \\S, \\b, \\B) that have\n * Unicode-aware versions. Only these benefit from\n * -u (ASCII-only mode). Literal strings like\n * \"dollars\" produce identical DFAs with or without\n * -u, so skipping -u for them is zero-cost.\n */\nfunction needsAsciiMode(s: string): boolean {\n return /\\\\[wWdDsSbB]/.test(s);\n}\n\n/**\n * Check if a string contains non-ASCII characters.\n * When true, -u MUST NOT be added: regex-automata\n * rejects (?-u) alongside non-ASCII content like\n * [ACDE] or literal zlotych.\n */\nfunction hasNonAscii(s: string): boolean {\n for (let i = 0; i < s.length; i++) {\n if (s.charCodeAt(i) > 127) return true;\n }\n return false;\n}\n\n/**\n * Convert inline (?i) flags to (?i-u) for ASCII\n * case folding. Handles bare and scoped groups.\n *\n * Bare (?i) at the start of a pattern is converted\n * to a scoped group (?i-u:...) with edge \\b pulled\n * outside, matching the RegExp path behaviour. This\n * prevents -u from affecting \\b word boundary\n * semantics (which should remain Unicode when\n * unicodeBoundaries is true).\n *\n * NOTE: -u also disables Unicode character classes\n * (\\w, \\d, \\s become ASCII-only), matching the\n * behaviour of regexpToRust() for /i RegExps.\n */\nfunction scopeInlineFlags(src: string): string {\n // Handle bare (?i...) at the start: convert to\n // scoped (?i-u:...) with edge \\b/\\B outside.\n const leadingBare = src.match(\n /^\\(\\?([ims]+)(?:-([imsu]+))?\\)/,\n );\n const enableGroup = leadingBare?.[1];\n if (leadingBare && enableGroup?.includes(\"i\")) {\n const enable = enableGroup;\n const disable = leadingBare[2] ?? \"\";\n let rest = src.slice(leadingBare[0].length);\n\n // Strip edge \\b/\\B\n let leading = \"\";\n let trailing = \"\";\n if (rest.startsWith(\"\\\\b\")) {\n leading = \"\\\\b\";\n rest = rest.slice(2);\n } else if (rest.startsWith(\"\\\\B\")) {\n leading = \"\\\\B\";\n rest = rest.slice(2);\n }\n if (rest.length >= 2) {\n const last = rest.at(-1);\n if (last === \"b\" || last === \"B\") {\n let bs = 0;\n let k = rest.length - 2;\n while (k >= 0 && rest[k] === \"\\\\\") {\n bs++;\n k--;\n }\n if (bs > 0 && bs % 2 === 1) {\n trailing = \"\\\\\" + last;\n rest = rest.slice(0, -2);\n }\n }\n }\n\n // Scope the flags and recurse for any nested\n // inline flags in the content.\n const inner = scopeInnerFlags(rest);\n // Only add -u when content uses char class\n // shortcuts (\\w, \\d, \\s) that benefit from it.\n const addU =\n needsAsciiMode(rest) &&\n !hasNonAscii(rest) &&\n !disable.includes(\"u\");\n const merged = addU ? disable + \"u\" : disable;\n const disablePart = merged ? `-${merged}` : \"\";\n return `${leading}(?${enable}${disablePart}:${inner})${trailing}`;\n }\n\n return scopeInnerFlags(src);\n}\n\n/**\n * Replace inline (?i) / (?i:...) groups with -u\n * variants. Does not handle leading bare flags\n * (that's done by scopeInlineFlags above).\n */\nfunction scopeInnerFlags(src: string): string {\n let result = \"\";\n let inClass = false;\n let i = 0;\n while (i < src.length) {\n if (src[i] === \"\\\\\" && i + 1 < src.length) {\n result += src.charAt(i) + src.charAt(i + 1);\n i += 2;\n continue;\n }\n if (src.charAt(i) === \"[\") inClass = true;\n if (src.charAt(i) === \"]\") inClass = false;\n if (\n !inClass &&\n src.charAt(i) === \"(\" &&\n src.charAt(i + 1) === \"?\"\n ) {\n let j = i + 2;\n let enable = \"\";\n while (\n j < src.length &&\n \"ims\".includes(src.charAt(j))\n ) {\n enable += src.charAt(j);\n j++;\n }\n // Handle disable part: (?i-s) or (?i-s:...)\n let disable = \"\";\n if (j < src.length && src.charAt(j) === \"-\") {\n j++; // skip -\n while (\n j < src.length &&\n \"imsu\".includes(src.charAt(j))\n ) {\n disable += src.charAt(j);\n j++;\n }\n }\n if (\n enable.length > 0 &&\n (src.charAt(j) === \")\" || src.charAt(j) === \":\")\n ) {\n if (enable.includes(\"i\")) {\n // For scoped groups (?i:content), don't add\n // -u: literal strings produce identical DFAs\n // with or without -u, and -u breaks when\n // the overall pattern has non-ASCII chars.\n // For bare flags (?i), the -u would apply to\n // the rest of the pattern which might have\n // \\w/\\d -- but bare flags are handled by\n // scopeInlineFlags, not here.\n if (disable.length > 0) {\n result += `(?${enable}-${disable}${src.charAt(j)}`;\n } else {\n result += `(?${enable}${src.charAt(j)}`;\n }\n } else if (disable.length > 0) {\n result += `(?${enable}-${disable}${src.charAt(j)}`;\n } else {\n result += `(?${enable}${src.charAt(j)}`;\n }\n i = j + 1;\n continue;\n }\n }\n result += src.charAt(i);\n i++;\n }\n return result;\n}\n\n// -- Pattern normalization -------------------------------\n\ntype NormalizedEntry = {\n pattern: string;\n name: string | undefined;\n};\n\n/**\n * Normalize a pattern entry to { pattern, name }.\n */\nfunction normalizeEntry(\n p: unknown,\n i: number,\n): NormalizedEntry {\n if (typeof p === \"string\") {\n return {\n pattern: scopeInlineFlags(p),\n name: undefined,\n };\n }\n if (p instanceof RegExp) {\n return {\n pattern: regexpToRust(p),\n name: undefined,\n };\n }\n if (\n typeof p !== \"object\" ||\n p === null ||\n !(\"pattern\" in p)\n ) {\n throw new TypeError(\n `Pattern at index ${i} must be a string, ` +\n \"RegExp, or { pattern, name }\",\n );\n }\n\n const pattern = p.pattern;\n if (\n typeof pattern !== \"string\" &&\n !(pattern instanceof RegExp)\n ) {\n throw new TypeError(\n `Pattern at index ${i}: \"pattern\" ` +\n \"field must be a string or RegExp\",\n );\n }\n\n const name = \"name\" in p ? p.name : undefined;\n if (name !== undefined && typeof name !== \"string\") {\n throw new TypeError(\n `Pattern at index ${i}: \"name\" ` +\n \"field must be a string\",\n );\n }\n\n return {\n pattern:\n pattern instanceof RegExp\n ? regexpToRust(pattern)\n : scopeInlineFlags(pattern),\n name,\n };\n}\n\nfunction expandLargeAlternation(pattern: string): string[] {\n const group = findLargestChunkableAlternation(pattern);\n if (!group) return [pattern];\n if (group.branches.length < ALTERNATION_CHUNK_MIN_BRANCHES) {\n return [pattern];\n }\n\n const expanded: string[] = [];\n for (\n let i = 0;\n i < group.branches.length;\n i += ALTERNATION_CHUNK_SIZE\n ) {\n expanded.push(\n pattern.slice(0, group.bodyStart) +\n group.branches\n .slice(i, i + ALTERNATION_CHUNK_SIZE)\n .join(\"|\") +\n pattern.slice(group.bodyEnd),\n );\n }\n return expanded;\n}\n\nfunction findLargestChunkableAlternation(\n pattern: string,\n): AlternationGroup | undefined {\n let best: AlternationGroup | undefined;\n let inClass = false;\n\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern.charAt(i);\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (\n inClass ||\n ch !== \"(\" ||\n pattern.charAt(i + 1) !== \"?\" ||\n pattern.charAt(i + 2) !== \":\"\n ) {\n continue;\n }\n\n const bodyStart = i + 3;\n const bodyEnd = findGroupEnd(pattern, bodyStart);\n if (bodyEnd === undefined) continue;\n\n const branches = splitTopLevelAlternatives(\n pattern.slice(bodyStart, bodyEnd),\n );\n const shouldChunk =\n bodyStart <= ALTERNATION_CHUNK_MAX_BODY_START &&\n branches.length >= ALTERNATION_CHUNK_MIN_BRANCHES &&\n pattern.slice(bodyStart, bodyEnd).includes(\"(?i:\");\n\n if (shouldChunk && (!best || branches.length > best.branches.length)) {\n best = { bodyStart, bodyEnd, branches };\n }\n }\n\n return best;\n}\n\nfunction findGroupEnd(\n pattern: string,\n bodyStart: number,\n): number | undefined {\n let depth = 0;\n let inClass = false;\n\n for (let i = bodyStart; i < pattern.length; i++) {\n const ch = pattern.charAt(i);\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (inClass) continue;\n if (ch === \"(\") {\n depth++;\n continue;\n }\n if (ch !== \")\") continue;\n if (depth === 0) return i;\n depth--;\n }\n\n return undefined;\n}\n\nfunction splitTopLevelAlternatives(body: string): string[] {\n const branches: string[] = [];\n let depth = 0;\n let inClass = false;\n let start = 0;\n\n for (let i = 0; i < body.length; i++) {\n const ch = body.charAt(i);\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (inClass) continue;\n if (ch === \"(\") {\n depth++;\n continue;\n }\n if (ch === \")\") {\n depth--;\n continue;\n }\n if (ch === \"|\" && depth === 0) {\n branches.push(body.slice(start, i));\n start = i + 1;\n }\n }\n\n branches.push(body.slice(start));\n return branches;\n}\n\n// -- RegexSet class --------------------------------------\n\n/**\n * Multi-pattern regex matcher.\n *\n * Compiles multiple regex patterns into a single\n * automaton for the main matching path. Standard\n * scans use Rust's DFA engine without catastrophic\n * backtracking. Some lookaround cases may use a\n * targeted fallback verifier to preserve\n * correctness. Uses Rust regex syntax for string\n * patterns (no lookaheads/backreferences).\n *\n * @example\n * ```ts\n * // Simple\n * new RegexSet([/\\d{8}/, \"\\\\+?\\\\d{9,12}\"]);\n *\n * // Named\n * new RegexSet([\n * { pattern: /\\d{8}/, name: \"ico\" },\n * { pattern: /\\d{2}\\.\\d{2}\\.\\d{4}/, name: \"date\" },\n * ]);\n * // match.name === \"date\"\n * ```\n */\nexport class RegexSet {\n private _inner: NativeRegexSetInstance;\n private _names: (string | undefined)[];\n private _hasNames: boolean;\n private _patternCount: number;\n private _nativeIndexMap: number[];\n private _jsFallbacks: JsFallback[];\n private _nativeSingles: NativeSingle[];\n private _boundaryOptions: BoundaryOptions;\n\n constructor(patterns: PatternEntry[], options?: Options) {\n const entries = patterns.map(normalizeEntry);\n this._names = entries.map((e) => e.name);\n this._hasNames = entries.some(\n (e) => e.name !== undefined,\n );\n this._patternCount = entries.length;\n\n const unicode = options?.unicodeBoundaries ?? true;\n const wholeWords = options?.wholeWords ?? false;\n const ci = options?.caseInsensitive ?? false;\n this._boundaryOptions = {\n wholeWords,\n unicodeBoundaries: unicode,\n };\n\n let processed = entries.map((e) => e.pattern);\n\n // Wrap with (?i-u:...) for case-insensitive\n // matching. Edge \\b/\\B are extracted first so\n // they stay outside the -u scope (preserving\n // Unicode word boundary semantics).\n if (ci) {\n processed = processed.map((p) => {\n // Skip patterns already wrapped by\n // regexpToRust or scopeInlineFlags.\n if (\n /^(?:\\\\[bB]|\\(\\?[ims]+(?:-[imsu]+)?\\))*\\(\\?[ims]*i[ims]*(?:-[imsu]+)?[:(]/.test(\n p,\n )\n )\n return p;\n // Strip leading bare-flag prefix (e.g. (?m),\n // (?ms)) before extracting edge \\b.\n let src = p;\n let flagPrefix = \"\";\n const bareFlagMatch = src.match(\n /^\\(\\?[ims]+(?:-[imsu]+)?\\)/,\n );\n if (bareFlagMatch) {\n flagPrefix = bareFlagMatch[0];\n src = src.slice(flagPrefix.length);\n }\n // Extract edge \\b/\\B\n let leading = \"\";\n let trailing = \"\";\n if (src.startsWith(\"\\\\b\")) {\n leading = \"\\\\b\";\n src = src.slice(2);\n } else if (src.startsWith(\"\\\\B\")) {\n leading = \"\\\\B\";\n src = src.slice(2);\n }\n if (src.length >= 2) {\n const last = src.at(-1);\n if (last === \"b\" || last === \"B\") {\n let bs = 0;\n let k = src.length - 2;\n while (k >= 0 && src[k] === \"\\\\\") {\n bs++;\n k--;\n }\n if (bs > 0 && bs % 2 === 1) {\n trailing = \"\\\\\" + last;\n src = src.slice(0, -2);\n }\n }\n }\n const uFlag =\n needsAsciiMode(src) && !hasNonAscii(src)\n ? \"-u\"\n : \"\";\n return `${flagPrefix}${leading}(?i${uFlag}:${src})${trailing}`;\n });\n }\n\n if (!unicode) {\n processed = processed.map(asciiBoundaries);\n }\n\n // Strip JS-only options before passing to native\n const nativeOpts: NativeOptions | undefined = options\n ? {\n ...(options.wholeWords !== undefined\n ? { wholeWords: options.wholeWords }\n : {}),\n ...(options.unicodeBoundaries !== undefined\n ? {\n unicodeBoundaries:\n options.unicodeBoundaries,\n }\n : {}),\n }\n : undefined;\n\n const nativePatterns: string[] = [];\n this._nativeIndexMap = [];\n this._jsFallbacks = [];\n this._nativeSingles = [];\n\n for (let i = 0; i < processed.length; i++) {\n const pattern = processed[i];\n if (pattern === undefined) {\n throw new Error(`Missing processed pattern ${i}`);\n }\n const expanded = expandLargeAlternation(pattern);\n for (const expandedPattern of expanded) {\n const jsFallback = jsFallbackRegExp(\n expandedPattern,\n unicode,\n );\n if (jsFallback) {\n this._jsFallbacks.push({\n pattern: i,\n re: jsFallback,\n });\n } else {\n this._nativeIndexMap.push(i);\n nativePatterns.push(expandedPattern);\n }\n }\n }\n\n this._inner = new binding.RegexSet(\n nativePatterns,\n nativeOpts,\n );\n if (this._jsFallbacks.length > 0) {\n this._nativeSingles = nativePatterns.map(\n (pattern, i) => {\n const original = this._nativeIndexMap[i];\n if (original === undefined) {\n throw new Error(\n `Missing native index map ${i}`,\n );\n }\n return {\n pattern: original,\n inner: new binding.RegexSet(\n [pattern],\n nativeOpts,\n ),\n };\n },\n );\n }\n }\n\n /** Number of patterns. */\n get patternCount(): number {\n return this._patternCount;\n }\n\n /** Returns `true` if any pattern matches. */\n isMatch(haystack: string): boolean {\n if (this._inner._isMatchBuf(encoder.encode(haystack))) {\n return true;\n }\n for (const fb of this._jsFallbacks) {\n if (this.findFirstJsFallback(haystack, fb))\n return true;\n }\n return false;\n }\n\n /** Find all non-overlapping matches. */\n findIter(haystack: string): Match[] {\n if (this._jsFallbacks.length > 0) {\n const all = this.findNativeSingles(haystack).concat(\n this.findJsFallbacks(haystack),\n );\n return selectNonOverlapping(all);\n }\n\n const native = unpack(\n this._inner._findIterPackedBuf(\n encoder.encode(haystack),\n ),\n haystack,\n this._hasNames ? this._names : null,\n this._nativeIndexMap,\n );\n return native;\n }\n\n /** Which pattern indices matched (not where). */\n whichMatch(haystack: string): number[] {\n const seen = new Set<number>();\n for (const pattern of this._inner.whichMatch(\n haystack,\n )) {\n const original = this._nativeIndexMap[pattern];\n if (original === undefined) {\n throw new Error(\n `Missing native index map ${pattern}`,\n );\n }\n seen.add(original);\n }\n for (const fb of this._jsFallbacks) {\n if (this.findFirstJsFallback(haystack, fb)) {\n seen.add(fb.pattern);\n }\n }\n return [...seen];\n }\n\n /**\n * Replace all non-overlapping matches.\n * `replacements[i]` replaces pattern `i`.\n */\n replaceAll(\n haystack: string,\n replacements: string[],\n ): string {\n if (\n this._jsFallbacks.length === 0 &&\n this._nativeIndexMap.length === this._patternCount &&\n this._nativeIndexMap.every((idx, i) => idx === i)\n ) {\n return this._inner.replaceAll(haystack, replacements);\n }\n if (replacements.length !== this._patternCount) {\n throw new Error(\n `Expected ${this._patternCount} ` +\n `replacements, got ${replacements.length}`,\n );\n }\n\n const matches = this.findIter(haystack);\n let result = \"\";\n let last = 0;\n\n for (const m of matches) {\n result += haystack.slice(last, m.start);\n const replacement = replacements[m.pattern];\n if (replacement === undefined) {\n throw new Error(\n `Missing replacement for pattern ${m.pattern}`,\n );\n }\n result += replacement;\n last = m.end;\n }\n\n result += haystack.slice(last);\n return result;\n }\n\n private findJsFallbacks(haystack: string): Match[] {\n const matches: Match[] = [];\n for (const fb of this._jsFallbacks) {\n fb.re.lastIndex = 0;\n for (;;) {\n const m = fb.re.exec(haystack);\n if (!m) break;\n const text = m[0];\n const start = m.index;\n const end = start + text.length;\n if (\n this.acceptJsFallbackMatch(haystack, start, end)\n ) {\n const match: Match = {\n pattern: fb.pattern,\n start,\n end,\n text,\n };\n const name = this._names[fb.pattern];\n if (name !== undefined) match.name = name;\n matches.push(match);\n if (text.length === 0) {\n fb.re.lastIndex = nextRegexStart(\n haystack,\n start,\n );\n }\n } else {\n fb.re.lastIndex = nextRegexStart(haystack, start);\n }\n }\n }\n return matches;\n }\n\n private findNativeSingles(haystack: string): Match[] {\n const encoded = encoder.encode(haystack);\n const matches: Match[] = [];\n for (const single of this._nativeSingles) {\n matches.push(\n ...unpack(\n single.inner._findIterPackedBuf(encoded),\n haystack,\n this._hasNames ? this._names : null,\n [single.pattern],\n ),\n );\n }\n return matches;\n }\n\n private findFirstJsFallback(\n haystack: string,\n fb: JsFallback,\n ): boolean {\n fb.re.lastIndex = 0;\n for (;;) {\n const m = fb.re.exec(haystack);\n if (!m) return false;\n const text = m[0];\n const start = m.index;\n const end = start + text.length;\n if (\n this.acceptJsFallbackMatch(haystack, start, end)\n ) {\n return true;\n }\n fb.re.lastIndex = nextRegexStart(haystack, start);\n }\n }\n\n private acceptJsFallbackMatch(\n haystack: string,\n start: number,\n end: number,\n ): boolean {\n if (!this._boundaryOptions.wholeWords) return true;\n return (\n isWordBoundary(\n haystack,\n start,\n this._boundaryOptions.unicodeBoundaries,\n ) &&\n isWordBoundary(\n haystack,\n end,\n this._boundaryOptions.unicodeBoundaries,\n )\n );\n }\n}\n\nfunction jsFallbackRegExp(\n pattern: string,\n unicodeBoundaries: boolean,\n): RegExp | undefined {\n if (\n !hasLookaround(pattern) ||\n (unicodeBoundaries && hasRegexWordBoundary(pattern)) ||\n hasRustUnicodeShorthand(pattern) ||\n hasRustClassSetOperation(pattern) ||\n countAlternations(pattern) < 128\n ) {\n return undefined;\n }\n try {\n return new RegExp(pattern, \"gu\");\n } catch {\n return undefined;\n }\n}\n\nfunction hasLookaround(pattern: string): boolean {\n return (\n pattern.includes(\"(?=\") ||\n pattern.includes(\"(?!\") ||\n pattern.includes(\"(?<=\") ||\n pattern.includes(\"(?<!\")\n );\n}\n\nfunction countAlternations(pattern: string): number {\n let count = 0;\n let inClass = false;\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") inClass = true;\n else if (ch === \"]\") inClass = false;\n else if (ch === \"|\" && !inClass) count++;\n }\n return count;\n}\n\nfunction hasRegexWordBoundary(pattern: string): boolean {\n let inClass = false;\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === \"\\\\\") {\n const next = pattern[i + 1];\n if (!inClass && (next === \"b\" || next === \"B\")) {\n return true;\n }\n i++;\n continue;\n }\n if (ch === \"[\") inClass = true;\n else if (ch === \"]\") inClass = false;\n }\n return false;\n}\n\nfunction hasRustUnicodeShorthand(pattern: string): boolean {\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch !== \"\\\\\") continue;\n const next = pattern[i + 1];\n if (\n next === \"d\" ||\n next === \"D\" ||\n next === \"w\" ||\n next === \"W\" ||\n next === \"s\" ||\n next === \"S\"\n ) {\n return true;\n }\n i++;\n }\n return false;\n}\n\nfunction hasRustClassSetOperation(\n pattern: string,\n): boolean {\n let inClass = false;\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (\n inClass &&\n i + 1 < pattern.length &&\n ((ch === \"&\" && pattern[i + 1] === \"&\") ||\n (ch === \"-\" && pattern[i + 1] === \"-\") ||\n (ch === \"~\" && pattern[i + 1] === \"~\"))\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction nextRegexStart(\n text: string,\n index: number,\n): number {\n if (index >= text.length) return index + 1;\n const first = text.charCodeAt(index);\n if (\n first >= 0xd800 &&\n first <= 0xdbff &&\n index + 1 < text.length\n ) {\n const second = text.charCodeAt(index + 1);\n if (second >= 0xdc00 && second <= 0xdfff) {\n return index + 2;\n }\n }\n return index + 1;\n}\n\nfunction selectNonOverlapping(matches: Match[]): Match[] {\n if (matches.length <= 1) return matches;\n\n matches.sort((a, b) => {\n if (a.start !== b.start) return a.start - b.start;\n const lengthOrder = b.end - b.start - (a.end - a.start);\n if (lengthOrder !== 0) return lengthOrder;\n return a.pattern - b.pattern;\n });\n\n const selected: Match[] = [];\n let lastEnd = 0;\n for (const m of matches) {\n if (m.start >= lastEnd) {\n selected.push(m);\n lastEnd = m.end;\n }\n }\n return selected;\n}\n\nfunction isWordBoundary(\n text: string,\n pos: number,\n unicode: boolean,\n): boolean {\n const before = previousCodePoint(text, pos);\n const after = nextCodePoint(text, pos);\n return (\n isWordChar(before, unicode) !==\n isWordChar(after, unicode)\n );\n}\n\nfunction previousCodePoint(\n text: string,\n pos: number,\n): string | undefined {\n if (pos <= 0) return undefined;\n return Array.from(text.slice(0, pos)).at(-1);\n}\n\nfunction nextCodePoint(\n text: string,\n pos: number,\n): string | undefined {\n if (pos >= text.length) return undefined;\n const cp = text.codePointAt(pos);\n return cp === undefined\n ? undefined\n : String.fromCodePoint(cp);\n}\n\nfunction isWordChar(\n ch: string | undefined,\n unicode: boolean,\n): boolean {\n if (ch === undefined) return false;\n return unicode\n ? /^[\\p{Alphabetic}\\p{Number}_]$/u.test(ch)\n : /^[A-Za-z0-9_]$/.test(ch);\n}\n","/* Browser/WASM entry point -- loads the WASM binding\n * from the generated browser glue and re-exports the\n * public API through the shared core. */\n\nimport native from \"../regex-set.wasi-browser.js\";\nimport { initBinding, type NativeBinding } from \"./core\";\n\ninitBinding(native as unknown as NativeBinding);\n\nexport { RegexSet } from \"./core\";\n\nexport type {\n Match,\n NamedPattern,\n NativeBinding,\n Options,\n PatternEntry,\n} from \"./core\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wasm.mjs","names":["__WASI","__emnapiCreateContext","__emnapiInstantiateNapiModule","__emnapiAsyncWorkPlugin","__emnapiTSFNPlugin","RegexSet","native"],"sources":["../../src/core.ts","../../src/wasm.ts"],"sourcesContent":["/* Shared core: types, helpers, and the RegexSet\n * class that uses a late-bound native backend\n * (NAPI-RS or WASM).\n * Call initBinding() before constructing classes. */\n\nconst encoder = new TextEncoder();\nconst ALTERNATION_CHUNK_MIN_BRANCHES = 64;\nconst ALTERNATION_CHUNK_SIZE = 20;\nconst ALTERNATION_CHUNK_MAX_BODY_START = 32;\n\n// -- Native binding types --------------------------------\n\nexport type NativeBinding = {\n RegexSet: new (\n patterns: string[],\n options?: NativeOptions | null,\n prepared?: Uint8Array | null,\n ) => NativeRegexSetInstance;\n _prepareRegexSet: (\n patterns: string[],\n options?: NativeOptions | null,\n ) => Uint8Array;\n _uax29Boundaries: (\n haystack: Buffer | Uint8Array,\n ) => number[];\n};\n\ntype NativeOptions = {\n wholeWords?: boolean;\n unicodeBoundaries?: boolean;\n};\n\ntype NativeRegexSetInstance = {\n patternCount: number;\n _enginePathCounts(): Uint32Array;\n isMatch(haystack: string): boolean;\n _isMatchBuf(haystack: Buffer | Uint8Array): boolean;\n _findIterPacked(haystack: string): Uint32Array;\n _findIterPackedBuf(\n haystack: Buffer | Uint8Array,\n ): Uint32Array;\n whichMatch(haystack: string): number[];\n replaceAll(\n haystack: string,\n replacements: string[],\n ): string;\n};\n\ntype JsFallback = {\n pattern: number;\n re: RegExp;\n};\n\ntype NativeSingle = {\n pattern: number;\n inner: NativeRegexSetInstance;\n};\n\ntype BoundaryOptions = {\n wholeWords: boolean;\n unicodeBoundaries: boolean;\n};\n\ntype AlternationGroup = {\n bodyStart: number;\n bodyEnd: number;\n branches: string[];\n};\n\n// -- Late-bound native binding ---------------------------\n\nlet binding: NativeBinding;\n\n/** Set the native backend. Must be called once\n * before any class constructor. */\nexport const initBinding = (b: NativeBinding) => {\n binding = b;\n};\n\n// -- Public types ----------------------------------------\n\n/** Options for constructing a RegexSet. */\nexport type Options = {\n /**\n * Only match whole words. Wraps each pattern\n * with `\\b...\\b`.\n * @default false\n */\n wholeWords?: boolean;\n /**\n * Use Unicode word boundaries. When `true`,\n * `\\b` treats accented letters, CJK, etc. as\n * word characters (correct for non-English text).\n * When `false` (default), `\\b` uses ASCII\n * semantics matching JS `RegExp` behavior.\n *\n * Zero performance overhead in either mode;\n * boundaries are verified inline per match.\n * Automatically uses UAX#29 segmentation for\n * Thai/CJK/Lao/Khmer/Myanmar text.\n * @default true\n */\n unicodeBoundaries?: boolean;\n /**\n * Case-insensitive matching. Wraps each pattern\n * with `(?i-u:...)` for ASCII case folding.\n * Uses `-u` to prevent DFA state explosion from\n * Unicode case tables.\n *\n * Edge `\\b`/`\\B` boundaries and leading bare-flag\n * prefixes (e.g. `(?m)`, `(?m-s)`) are extracted\n * before wrapping so they remain outside the `-u`\n * scope, preserving `unicodeBoundaries` semantics.\n * Patterns already containing any `(?{flags}-u`\n * group (from RegExp `/i`, inline `(?i)`, or\n * `scopeInlineFlags`) are not double-wrapped.\n * @default false\n */\n caseInsensitive?: boolean;\n};\n\n/** A named pattern entry. */\nexport type NamedPattern = {\n /** The regex pattern (string or RegExp). */\n pattern: string | RegExp;\n /** Optional name for this pattern. */\n name?: string;\n};\n\n/** A pattern entry: string, RegExp, or named. */\nexport type PatternEntry = string | RegExp | NamedPattern;\n\n/** A single match result. */\nexport type Match = {\n /** Index of the pattern that matched. */\n pattern: number;\n /** Start UTF-16 code unit offset. */\n start: number;\n /** End offset (exclusive). */\n end: number;\n /** The matched text. */\n text: string;\n /** Pattern name (if provided at construction). */\n name?: string;\n};\n\n// -- Unpack helper ---------------------------------------\n\nfunction unpack(\n packed: Uint32Array,\n haystack: string,\n names: (string | undefined)[] | null,\n indexMap?: number[],\n): Match[] {\n const len = packed.length;\n // eslint-disable-next-line unicorn/no-new-array\n const matches = new Array<Match>(len / 3);\n for (let i = 0, j = 0; i < len; i += 3, j++) {\n const idx = packed[i];\n const s = packed[i + 1];\n const e = packed[i + 2];\n if (\n idx === undefined ||\n s === undefined ||\n e === undefined\n ) {\n throw new Error(\n `Corrupt packed match data at offset ${i}`,\n );\n }\n const pattern = indexMap ? indexMap[idx] : idx;\n if (pattern === undefined) {\n throw new Error(`Missing native index map ${idx}`);\n }\n const m: Match = {\n pattern,\n start: s,\n end: e,\n text: haystack.slice(s, e),\n };\n if (names && names[pattern] !== undefined)\n m.name = names[pattern];\n matches[j] = m;\n }\n return matches;\n}\n\n// -- Regex flag helpers ----------------------------------\n\n/**\n * Replace unescaped `\\b` and `\\B` with their\n * ASCII-only equivalents `(?-u:\\b)` / `(?-u:\\B)`.\n * Skips character classes `[...]` (where `\\b` means\n * backspace) and escaped backslashes `\\\\b`.\n */\nfunction asciiBoundaries(src: string): string {\n let result = \"\";\n let inClass = false;\n let i = 0;\n while (i < src.length) {\n if (src.charAt(i) === \"\\\\\" && i + 1 < src.length) {\n const next = src.charAt(i + 1);\n if (!inClass && (next === \"b\" || next === \"B\")) {\n result += `(?-u:\\\\${next})`;\n } else {\n // escaped char (including \\\\) -- emit as-is\n result += src.charAt(i) + src.charAt(i + 1);\n }\n i += 2;\n } else {\n if (src.charAt(i) === \"[\") inClass = true;\n if (src.charAt(i) === \"]\") inClass = false;\n result += src.charAt(i);\n i++;\n }\n }\n return result;\n}\n\n/**\n * Convert a RegExp to Rust regex syntax string.\n */\nfunction regexpToRust(re: RegExp): string {\n let flags = \"\";\n if (re.flags.includes(\"i\")) flags += \"i\";\n if (re.flags.includes(\"m\")) flags += \"m\";\n if (re.flags.includes(\"s\")) flags += \"s\";\n\n // JS RegExp objects can't contain inline (?i) in\n // .source -- it's a SyntaxError. No need to run\n // scopeInlineFlags here; it only matters for\n // string patterns (handled in normalizeEntry).\n if (!flags) {\n return javascriptCharacterClasses(re);\n }\n\n if (!flags.includes(\"i\")) {\n return `(?${flags})${javascriptCharacterClasses(re)}`;\n }\n\n const unicodeClasses = re.unicode || re.unicodeSets;\n let src = unicodeClasses\n ? javascriptCharacterClasses(re)\n : javascriptLegacyCaseFolding(re);\n let leading = \"\";\n let trailing = \"\";\n\n if (src.startsWith(\"\\\\b\")) {\n leading = \"\\\\b\";\n src = src.slice(2);\n } else if (src.startsWith(\"\\\\B\")) {\n leading = \"\\\\B\";\n src = src.slice(2);\n }\n if (src.length >= 2) {\n const last = src.at(-1);\n if (last === \"b\" || last === \"B\") {\n let bs = 0;\n let k = src.length - 2;\n while (k >= 0 && src[k] === \"\\\\\") {\n bs++;\n k--;\n }\n if (bs > 0 && bs % 2 === 1) {\n trailing = \"\\\\\" + last;\n src = src.slice(0, -2);\n }\n }\n }\n\n return `${leading}(?${flags}:${src})${trailing}`;\n}\n\n// ECMAScript WhiteSpace and LineTerminator, including BOM but not NEL.\nconst JS_WHITESPACE =\n \"\\\\x{0009}-\\\\x{000D}\\\\x{0020}\\\\x{00A0}\\\\x{1680}\" +\n \"\\\\x{2000}-\\\\x{200A}\\\\x{2028}\\\\x{2029}\\\\x{202F}\\\\x{205F}\\\\x{3000}\\\\x{FEFF}\";\n\nfunction javascriptCharacterClasses(re: RegExp): string {\n let result = \"\";\n let classDepth = 0;\n const unicodeCase =\n re.ignoreCase && (re.unicode || re.unicodeSets);\n const word =\n \"a-zA-Z0-9_\" +\n (unicodeCase ? \"\\\\x{017F}\\\\x{212A}\" : \"\");\n for (let i = 0; i < re.source.length; i++) {\n const char = re.source.charAt(i);\n if (char !== \"\\\\\") {\n if (\n char === \"[\" &&\n (classDepth === 0 || re.unicodeSets)\n )\n classDepth++;\n if (char === \"]\" && classDepth > 0) classDepth--;\n result += char;\n continue;\n }\n const escaped = re.source.charAt(++i);\n if (escaped === \"b\" || escaped === \"B\") {\n if (classDepth > 0) {\n result += escaped === \"b\" ? \"\\\\x{0008}\" : \"B\";\n continue;\n }\n if (!unicodeCase) {\n result += `(?-u:\\\\${escaped})`;\n continue;\n }\n const beforeWord = `(?<=[${word}])`;\n const beforeNonword = `(?<![${word}])`;\n const afterWord = `(?=[${word}])`;\n const afterNonword = `(?![${word}])`;\n // JS word membership stays independent of the Rust Unicode boundary mode\n // and of outer ignore-case scopes. /iu additionally folds Kelvin/long s.\n result +=\n escaped === \"b\"\n ? `(?-i:(?:${beforeWord}${afterNonword}|${beforeNonword}${afterWord}))`\n : `(?-i:(?:${beforeWord}${afterWord}|${beforeNonword}${afterNonword}))`;\n continue;\n }\n let members: string;\n switch (escaped.toLowerCase()) {\n case \"s\":\n members = JS_WHITESPACE;\n break;\n case \"d\":\n members = \"0-9\";\n break;\n case \"w\":\n members = word;\n break;\n default:\n result += \"\\\\\" + escaped;\n continue;\n }\n const negation =\n escaped === escaped.toUpperCase() ? \"^\" : \"\";\n result += `[${negation}${members}]`;\n }\n return result;\n}\n\nlet legacyUnicodeFolds: Map<string, string[]> | undefined;\n\n/** Legacy JS folding uses one UTF-16 unit's uppercase, excluding ASCII folds. */\nfunction getLegacyUnicodeFolds(): Map<string, string[]> {\n if (legacyUnicodeFolds) return legacyUnicodeFolds;\n const groups = new Map<string, string[]>();\n for (let code = 0x80; code <= 0xffff; code++) {\n const char = String.fromCharCode(code);\n const canonical = char.toUpperCase();\n if (\n canonical.length !== 1 ||\n canonical === char ||\n canonical.charCodeAt(0) < 0x80\n )\n continue;\n const members = groups.get(canonical);\n if (members) members.push(char);\n else groups.set(canonical, [canonical, char]);\n }\n legacyUnicodeFolds = groups;\n return groups;\n}\n\nfunction legacyLiteralPattern(literal: string): string {\n if (/[a-z]/i.test(literal))\n return `(?-i:[${literal.toLowerCase()}${literal.toUpperCase()}])`;\n const code = literal.codePointAt(0);\n if (code === undefined)\n throw new Error(\"Missing literal\");\n const canonical = literal.toUpperCase();\n const members =\n canonical.length === 1 &&\n canonical.charCodeAt(0) >= 0x80\n ? getLegacyUnicodeFolds().get(canonical)\n : undefined;\n return members\n ? `(?-i:[${members.join(\"\")}])`\n : `(?-i:\\\\x{${code.toString(16)}})`;\n}\n\n/** Keep legacy /i folding local so dots and complements remain Unicode-safe. */\nfunction javascriptLegacyCaseFolding(re: RegExp): string {\n let result = \"\";\n for (let i = 0; i < re.source.length; i++) {\n const char = re.source.charAt(i);\n if (char === \"\\\\\") {\n const escaped = re.source.charAt(++i);\n if (\"sSwWdDbB\".includes(escaped)) {\n const token = new RegExp(\"\\\\\" + escaped, \"i\");\n result += `(?-i:${javascriptCharacterClasses(token)})`;\n continue;\n }\n const hex = re.source\n .slice(i)\n .match(/^(?:x[\\da-f]{2}|u[\\da-f]{4})/i)?.[0];\n if (hex) {\n const literal = String.fromCharCode(\n Number.parseInt(hex.slice(1), 16),\n );\n result += legacyLiteralPattern(literal);\n i += hex.length - 1;\n continue;\n }\n // Preserve named backreferences as one token, including the group name.\n if (\n escaped === \"k\" &&\n re.source.charAt(i + 1) === \"<\"\n ) {\n const end = re.source.indexOf(\">\", i + 2);\n if (end !== -1) {\n result += re.source.slice(i - 1, end + 1);\n i = end;\n continue;\n }\n }\n result += \"\\\\\" + escaped;\n continue;\n }\n // Named capture names are syntax, not case-insensitive literal text.\n if (\n re.source.startsWith(\"(?<\", i) &&\n !\"=!\".includes(re.source.charAt(i + 3))\n ) {\n const end = re.source.indexOf(\">\", i + 3);\n if (end !== -1) {\n result += re.source.slice(i, end + 1);\n i = end;\n continue;\n }\n }\n if (char !== \"[\") {\n const code = re.source.codePointAt(i);\n if (code !== undefined && code >= 0x80) {\n const literal = String.fromCodePoint(code);\n result += legacyLiteralPattern(literal);\n i += literal.length - 1;\n } else {\n result += /[a-z]/i.test(char)\n ? legacyLiteralPattern(char)\n : char;\n }\n continue;\n }\n const start = i;\n while (++i < re.source.length) {\n const member = re.source.charAt(i);\n if (member === \"]\") break;\n if (member !== \"\\\\\") continue;\n i++;\n }\n const original = re.source.slice(start, i + 1);\n // Legacy JS classes permit a literal hyphen next to a shortcut.\n // Rust requires that hyphen to be escaped before expanding the shortcut.\n let normalized = \"\";\n let previousShortcut = false;\n for (let j = 0; j < original.length; j++) {\n const member = original.charAt(j);\n if (member === \"\\\\\") {\n const escaped = original.charAt(++j);\n normalized += \"\\\\\" + escaped;\n previousShortcut = \"sSwWdD\".includes(escaped);\n continue;\n }\n const nextShortcut =\n original.charAt(j + 1) === \"\\\\\" &&\n \"sSwWdD\".includes(original.charAt(j + 2));\n normalized +=\n member === \"-\" && (previousShortcut || nextShortcut)\n ? \"\\\\-\"\n : member;\n previousShortcut = false;\n }\n const classRegexp = new RegExp(normalized, \"i\");\n const escapedNonAscii = [\n ...normalized.matchAll(\n /\\\\(?:x([\\da-f]{2})|u([\\da-f]{4}))/gi,\n ),\n ].some(\n (match) =>\n Number.parseInt(match[1] ?? match[2] ?? \"0\", 16) >=\n 128,\n );\n const body = original.slice(\n original.startsWith(\"[^\") ? 2 : 1,\n -1,\n );\n const positive = new RegExp(`[${body}]`, \"i\");\n let folds = \"\";\n // At most 52 construction-only oracle checks preserve ASCII folding.\n // Fold the positive body before restoring any outer class negation.\n for (const letter of \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\") {\n if (positive.test(letter)) folds += letter;\n }\n if (hasNonAscii(original) || escapedNonAscii) {\n for (const [\n canonical,\n members,\n ] of getLegacyUnicodeFolds()) {\n if (positive.test(canonical))\n folds += members.join(\"\");\n }\n }\n const translated =\n javascriptCharacterClasses(classRegexp);\n result += `(?-i:${translated.slice(0, -1)}${folds}])`;\n }\n return result;\n}\n\n/**\n * Check if content uses character class shortcuts\n * (\\w, \\W, \\d, \\D, \\s, \\S, \\b, \\B) that have\n * Unicode-aware versions. Only these benefit from\n * -u (ASCII-only mode). Literal strings like\n * \"dollars\" produce identical DFAs with or without\n * -u, so skipping -u for them is zero-cost.\n */\nfunction needsAsciiMode(s: string): boolean {\n for (let i = 0; i < s.length; i++) {\n if (s.charAt(i) !== \"\\\\\") continue;\n const escaped = s.charAt(++i);\n if (\"wWdDsSbB\".includes(escaped)) return true;\n }\n return false;\n}\n\n/**\n * Check if a string contains non-ASCII characters.\n * When true, -u MUST NOT be added: regex-automata\n * rejects (?-u) alongside non-ASCII content like\n * [ACDE] or literal zlotych.\n */\nfunction hasNonAscii(s: string): boolean {\n for (let i = 0; i < s.length; i++) {\n if (s.charCodeAt(i) > 127) return true;\n }\n return false;\n}\n\n/**\n * Convert inline (?i) flags to (?i-u) for ASCII\n * case folding. Handles bare and scoped groups.\n *\n * Bare (?i) at the start of a pattern is converted\n * to a scoped group (?i-u:...) with edge \\b pulled\n * outside, matching the RegExp path behaviour. This\n * prevents -u from affecting \\b word boundary\n * semantics (which should remain Unicode when\n * unicodeBoundaries is true).\n *\n * NOTE: -u also disables Unicode character classes\n * (\\w, \\d, \\s become ASCII-only), matching the\n * behaviour of regexpToRust() for non-Unicode /i RegExps.\n */\nfunction scopeInlineFlags(src: string): string {\n // Handle bare (?i...) at the start: convert to\n // scoped (?i-u:...) with edge \\b/\\B outside.\n const leadingBare = src.match(\n /^\\(\\?([ims]+)(?:-([imsu]+))?\\)/,\n );\n const enableGroup = leadingBare?.[1];\n if (leadingBare && enableGroup?.includes(\"i\")) {\n const enable = enableGroup;\n const disable = leadingBare[2] ?? \"\";\n let rest = src.slice(leadingBare[0].length);\n\n // Strip edge \\b/\\B\n let leading = \"\";\n let trailing = \"\";\n if (rest.startsWith(\"\\\\b\")) {\n leading = \"\\\\b\";\n rest = rest.slice(2);\n } else if (rest.startsWith(\"\\\\B\")) {\n leading = \"\\\\B\";\n rest = rest.slice(2);\n }\n if (rest.length >= 2) {\n const last = rest.at(-1);\n if (last === \"b\" || last === \"B\") {\n let bs = 0;\n let k = rest.length - 2;\n while (k >= 0 && rest[k] === \"\\\\\") {\n bs++;\n k--;\n }\n if (bs > 0 && bs % 2 === 1) {\n trailing = \"\\\\\" + last;\n rest = rest.slice(0, -2);\n }\n }\n }\n\n // Scope the flags and recurse for any nested\n // inline flags in the content.\n const inner = scopeInnerFlags(rest);\n // Only add -u when content uses char class\n // shortcuts (\\w, \\d, \\s) that benefit from it.\n const addU =\n needsAsciiMode(rest) &&\n !hasNonAscii(rest) &&\n !disable.includes(\"u\");\n const merged = addU ? disable + \"u\" : disable;\n const disablePart = merged ? `-${merged}` : \"\";\n return `${leading}(?${enable}${disablePart}:${inner})${trailing}`;\n }\n\n return scopeInnerFlags(src);\n}\n\n/**\n * Replace inline (?i) / (?i:...) groups with -u\n * variants. Does not handle leading bare flags\n * (that's done by scopeInlineFlags above).\n */\nfunction scopeInnerFlags(src: string): string {\n let result = \"\";\n let inClass = false;\n let i = 0;\n while (i < src.length) {\n if (src[i] === \"\\\\\" && i + 1 < src.length) {\n result += src.charAt(i) + src.charAt(i + 1);\n i += 2;\n continue;\n }\n if (src.charAt(i) === \"[\") inClass = true;\n if (src.charAt(i) === \"]\") inClass = false;\n if (\n !inClass &&\n src.charAt(i) === \"(\" &&\n src.charAt(i + 1) === \"?\"\n ) {\n let j = i + 2;\n let enable = \"\";\n while (\n j < src.length &&\n \"ims\".includes(src.charAt(j))\n ) {\n enable += src.charAt(j);\n j++;\n }\n // Handle disable part: (?i-s) or (?i-s:...)\n let disable = \"\";\n if (j < src.length && src.charAt(j) === \"-\") {\n j++; // skip -\n while (\n j < src.length &&\n \"imsu\".includes(src.charAt(j))\n ) {\n disable += src.charAt(j);\n j++;\n }\n }\n if (\n enable.length > 0 &&\n (src.charAt(j) === \")\" || src.charAt(j) === \":\")\n ) {\n if (enable.includes(\"i\")) {\n // For scoped groups (?i:content), don't add\n // -u: literal strings produce identical DFAs\n // with or without -u, and -u breaks when\n // the overall pattern has non-ASCII chars.\n // For bare flags (?i), the -u would apply to\n // the rest of the pattern which might have\n // \\w/\\d -- but bare flags are handled by\n // scopeInlineFlags, not here.\n if (disable.length > 0) {\n result += `(?${enable}-${disable}${src.charAt(j)}`;\n } else {\n result += `(?${enable}${src.charAt(j)}`;\n }\n } else if (disable.length > 0) {\n result += `(?${enable}-${disable}${src.charAt(j)}`;\n } else {\n result += `(?${enable}${src.charAt(j)}`;\n }\n i = j + 1;\n continue;\n }\n }\n result += src.charAt(i);\n i++;\n }\n return result;\n}\n\n// -- Pattern normalization -------------------------------\n\ntype NormalizedEntry = {\n pattern: string;\n name: string | undefined;\n};\n\n/**\n * Normalize a pattern entry to { pattern, name }.\n */\nfunction normalizeEntry(\n p: unknown,\n i: number,\n): NormalizedEntry {\n if (typeof p === \"string\") {\n return {\n pattern: scopeInlineFlags(p),\n name: undefined,\n };\n }\n if (p instanceof RegExp) {\n return {\n pattern: regexpToRust(p),\n name: undefined,\n };\n }\n if (\n typeof p !== \"object\" ||\n p === null ||\n !(\"pattern\" in p)\n ) {\n throw new TypeError(\n `Pattern at index ${i} must be a string, ` +\n \"RegExp, or { pattern, name }\",\n );\n }\n\n const pattern = p.pattern;\n if (\n typeof pattern !== \"string\" &&\n !(pattern instanceof RegExp)\n ) {\n throw new TypeError(\n `Pattern at index ${i}: \"pattern\" ` +\n \"field must be a string or RegExp\",\n );\n }\n\n const name = \"name\" in p ? p.name : undefined;\n if (name !== undefined && typeof name !== \"string\") {\n throw new TypeError(\n `Pattern at index ${i}: \"name\" ` +\n \"field must be a string\",\n );\n }\n\n return {\n pattern:\n pattern instanceof RegExp\n ? regexpToRust(pattern)\n : scopeInlineFlags(pattern),\n name,\n };\n}\n\nfunction expandLargeAlternation(pattern: string): string[] {\n const group = findLargestChunkableAlternation(pattern);\n if (!group) return [pattern];\n if (\n group.branches.length < ALTERNATION_CHUNK_MIN_BRANCHES\n ) {\n return [pattern];\n }\n\n const expanded: string[] = [];\n for (\n let i = 0;\n i < group.branches.length;\n i += ALTERNATION_CHUNK_SIZE\n ) {\n expanded.push(\n pattern.slice(0, group.bodyStart) +\n group.branches\n .slice(i, i + ALTERNATION_CHUNK_SIZE)\n .join(\"|\") +\n pattern.slice(group.bodyEnd),\n );\n }\n return expanded;\n}\n\nfunction findLargestChunkableAlternation(\n pattern: string,\n): AlternationGroup | undefined {\n let best: AlternationGroup | undefined;\n let inClass = false;\n\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern.charAt(i);\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (\n inClass ||\n ch !== \"(\" ||\n pattern.charAt(i + 1) !== \"?\" ||\n pattern.charAt(i + 2) !== \":\"\n ) {\n continue;\n }\n\n const bodyStart = i + 3;\n const bodyEnd = findGroupEnd(pattern, bodyStart);\n if (bodyEnd === undefined) continue;\n\n const branches = splitTopLevelAlternatives(\n pattern.slice(bodyStart, bodyEnd),\n );\n const shouldChunk =\n bodyStart <= ALTERNATION_CHUNK_MAX_BODY_START &&\n branches.length >= ALTERNATION_CHUNK_MIN_BRANCHES &&\n pattern.slice(bodyStart, bodyEnd).includes(\"(?i:\");\n\n if (\n shouldChunk &&\n (!best || branches.length > best.branches.length)\n ) {\n best = { bodyStart, bodyEnd, branches };\n }\n }\n\n return best;\n}\n\nfunction findGroupEnd(\n pattern: string,\n bodyStart: number,\n): number | undefined {\n let depth = 0;\n let inClass = false;\n\n for (let i = bodyStart; i < pattern.length; i++) {\n const ch = pattern.charAt(i);\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (inClass) continue;\n if (ch === \"(\") {\n depth++;\n continue;\n }\n if (ch !== \")\") continue;\n if (depth === 0) return i;\n depth--;\n }\n\n return undefined;\n}\n\nfunction splitTopLevelAlternatives(body: string): string[] {\n const branches: string[] = [];\n let depth = 0;\n let inClass = false;\n let start = 0;\n\n for (let i = 0; i < body.length; i++) {\n const ch = body.charAt(i);\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (inClass) continue;\n if (ch === \"(\") {\n depth++;\n continue;\n }\n if (ch === \")\") {\n depth--;\n continue;\n }\n if (ch === \"|\" && depth === 0) {\n branches.push(body.slice(start, i));\n start = i + 1;\n }\n }\n\n branches.push(body.slice(start));\n return branches;\n}\n\ntype NativeInput = {\n names: (string | undefined)[];\n hasNames: boolean;\n patternCount: number;\n nativePatterns: string[];\n nativeOpts: NativeOptions | undefined;\n nativeIndexMap: number[];\n jsFallbacks: JsFallback[];\n boundaryOptions: BoundaryOptions;\n};\n\nfunction buildNativeInput(\n patterns: PatternEntry[],\n options?: Options,\n): NativeInput {\n const entries = patterns.map(normalizeEntry);\n const names = entries.map((e) => e.name);\n const unicode = options?.unicodeBoundaries ?? true;\n const wholeWords = options?.wholeWords ?? false;\n const ci = options?.caseInsensitive ?? false;\n let processed = entries.map((e) => e.pattern);\n\n // Wrap with (?i-u:...) for case-insensitive\n // matching. Edge \\b/\\B are extracted first so\n // they stay outside the -u scope.\n if (ci) {\n processed = processed.map(caseInsensitivePattern);\n }\n\n if (!unicode) {\n processed = processed.map(asciiBoundaries);\n }\n\n const nativeOpts: NativeOptions | undefined = options\n ? {\n ...(options.wholeWords !== undefined\n ? { wholeWords: options.wholeWords }\n : {}),\n ...(options.unicodeBoundaries !== undefined\n ? { unicodeBoundaries: options.unicodeBoundaries }\n : {}),\n }\n : undefined;\n\n const nativePatterns: string[] = [];\n const nativeIndexMap: number[] = [];\n const jsFallbacks: JsFallback[] = [];\n\n for (let i = 0; i < processed.length; i++) {\n const pattern = processed[i];\n if (pattern === undefined) {\n throw new Error(`Missing processed pattern ${i}`);\n }\n const expanded = expandLargeAlternation(pattern);\n for (const expandedPattern of expanded) {\n const jsFallback = jsFallbackRegExp(\n expandedPattern,\n unicode,\n );\n if (jsFallback) {\n jsFallbacks.push({\n pattern: i,\n re: jsFallback,\n });\n } else {\n nativeIndexMap.push(i);\n nativePatterns.push(expandedPattern);\n }\n }\n }\n\n return {\n names,\n hasNames: entries.some((e) => e.name !== undefined),\n patternCount: entries.length,\n nativePatterns,\n nativeOpts,\n nativeIndexMap,\n jsFallbacks,\n boundaryOptions: {\n wholeWords,\n unicodeBoundaries: unicode,\n },\n };\n}\n\nfunction caseInsensitivePattern(p: string): string {\n // Skip patterns already wrapped by regexpToRust or\n // scopeInlineFlags.\n if (\n /^(?:\\\\[bB]|\\(\\?[ims]+(?:-[imsu]+)?\\))*\\(\\?[ims]*i[ims]*(?:-[imsu]+)?[:(]/.test(\n p,\n )\n )\n return p;\n let src = p;\n let flagPrefix = \"\";\n const bareFlagMatch = src.match(\n /^\\(\\?[ims]+(?:-[imsu]+)?\\)/,\n );\n if (bareFlagMatch) {\n flagPrefix = bareFlagMatch[0];\n src = src.slice(flagPrefix.length);\n }\n let leading = \"\";\n let trailing = \"\";\n if (src.startsWith(\"\\\\b\")) {\n leading = \"\\\\b\";\n src = src.slice(2);\n } else if (src.startsWith(\"\\\\B\")) {\n leading = \"\\\\B\";\n src = src.slice(2);\n }\n if (src.length >= 2) {\n const last = src.at(-1);\n if (last === \"b\" || last === \"B\") {\n let bs = 0;\n let k = src.length - 2;\n while (k >= 0 && src[k] === \"\\\\\") {\n bs++;\n k--;\n }\n if (bs > 0 && bs % 2 === 1) {\n trailing = \"\\\\\" + last;\n src = src.slice(0, -2);\n }\n }\n }\n const uFlag =\n needsAsciiMode(src) && !hasNonAscii(src) ? \"-u\" : \"\";\n return `${flagPrefix}${leading}(?i${uFlag}:${src})${trailing}`;\n}\n\n// -- RegexSet class --------------------------------------\n\n/**\n * Multi-pattern regex matcher.\n *\n * Compiles multiple regex patterns into a single\n * automaton for the main matching path. Standard\n * scans use Rust's DFA engine without catastrophic\n * backtracking. Some lookaround cases may use a\n * targeted fallback verifier to preserve\n * correctness. Uses Rust regex syntax for string\n * patterns (no lookaheads/backreferences).\n *\n * @example\n * ```ts\n * // Simple\n * new RegexSet([/\\d{8}/, \"\\\\+?\\\\d{9,12}\"]);\n *\n * // Named\n * new RegexSet([\n * { pattern: /\\d{8}/, name: \"ico\" },\n * { pattern: /\\d{2}\\.\\d{2}\\.\\d{4}/, name: \"date\" },\n * ]);\n * // match.name === \"date\"\n * ```\n */\nexport class RegexSet {\n private _inner: NativeRegexSetInstance;\n private _names: (string | undefined)[];\n private _hasNames: boolean;\n private _patternCount: number;\n private _nativeIndexMap: number[];\n private _jsFallbacks: JsFallback[];\n private _nativeSingles: NativeSingle[];\n private _boundaryOptions: BoundaryOptions;\n\n constructor(\n patterns: PatternEntry[],\n options?: Options,\n prepared?: Uint8Array,\n ) {\n const nativeInput = buildNativeInput(patterns, options);\n this._names = nativeInput.names;\n this._hasNames = nativeInput.hasNames;\n this._patternCount = nativeInput.patternCount;\n this._boundaryOptions = nativeInput.boundaryOptions;\n this._nativeIndexMap = nativeInput.nativeIndexMap;\n this._jsFallbacks = nativeInput.jsFallbacks;\n this._nativeSingles = [];\n this._inner = new binding.RegexSet(\n nativeInput.nativePatterns,\n nativeInput.nativeOpts,\n prepared,\n );\n if (this._jsFallbacks.length > 0) {\n this._nativeSingles = nativeInput.nativePatterns.map(\n (pattern, i) => {\n const original = this._nativeIndexMap[i];\n if (original === undefined) {\n throw new Error(\n `Missing native index map ${i}`,\n );\n }\n return {\n pattern: original,\n inner: new binding.RegexSet(\n [pattern],\n nativeInput.nativeOpts,\n ),\n };\n },\n );\n }\n }\n\n static prepare(\n patterns: PatternEntry[],\n options?: Options,\n ): Uint8Array {\n const nativeInput = buildNativeInput(patterns, options);\n return binding._prepareRegexSet(\n nativeInput.nativePatterns,\n nativeInput.nativeOpts,\n );\n }\n\n /** Number of patterns. */\n get patternCount(): number {\n return this._patternCount;\n }\n\n /** Internal diagnostics: fast DFA, verified DFA, and fallback pattern counts. */\n _enginePathCounts(): number[] {\n return [...this._inner._enginePathCounts()];\n }\n\n /** Returns `true` if any pattern matches. */\n isMatch(haystack: string): boolean {\n if (this._inner._isMatchBuf(encoder.encode(haystack))) {\n return true;\n }\n for (const fb of this._jsFallbacks) {\n if (this.findFirstJsFallback(haystack, fb))\n return true;\n }\n return false;\n }\n\n /** Find all non-overlapping matches. */\n findIter(haystack: string): Match[] {\n if (this._jsFallbacks.length > 0) {\n const all = this.findNativeSingles(haystack).concat(\n this.findJsFallbacks(haystack),\n );\n return selectNonOverlapping(all);\n }\n\n const native = unpack(\n this._inner._findIterPackedBuf(\n encoder.encode(haystack),\n ),\n haystack,\n this._hasNames ? this._names : null,\n this._nativeIndexMap,\n );\n return native;\n }\n\n /** Which pattern indices matched (not where). */\n whichMatch(haystack: string): number[] {\n const seen = new Set<number>();\n for (const pattern of this._inner.whichMatch(\n haystack,\n )) {\n const original = this._nativeIndexMap[pattern];\n if (original === undefined) {\n throw new Error(\n `Missing native index map ${pattern}`,\n );\n }\n seen.add(original);\n }\n for (const fb of this._jsFallbacks) {\n if (this.findFirstJsFallback(haystack, fb)) {\n seen.add(fb.pattern);\n }\n }\n return [...seen];\n }\n\n /**\n * Replace all non-overlapping matches.\n * `replacements[i]` replaces pattern `i`.\n */\n replaceAll(\n haystack: string,\n replacements: string[],\n ): string {\n if (\n this._jsFallbacks.length === 0 &&\n this._nativeIndexMap.length === this._patternCount &&\n this._nativeIndexMap.every((idx, i) => idx === i)\n ) {\n return this._inner.replaceAll(haystack, replacements);\n }\n if (replacements.length !== this._patternCount) {\n throw new Error(\n `Expected ${this._patternCount} ` +\n `replacements, got ${replacements.length}`,\n );\n }\n\n const matches = this.findIter(haystack);\n let result = \"\";\n let last = 0;\n\n for (const m of matches) {\n result += haystack.slice(last, m.start);\n const replacement = replacements[m.pattern];\n if (replacement === undefined) {\n throw new Error(\n `Missing replacement for pattern ${m.pattern}`,\n );\n }\n result += replacement;\n last = m.end;\n }\n\n result += haystack.slice(last);\n return result;\n }\n\n private findJsFallbacks(haystack: string): Match[] {\n const matches: Match[] = [];\n for (const fb of this._jsFallbacks) {\n fb.re.lastIndex = 0;\n for (;;) {\n const m = fb.re.exec(haystack);\n if (!m) break;\n const text = m[0];\n const start = m.index;\n const end = start + text.length;\n if (\n this.acceptJsFallbackMatch(haystack, start, end)\n ) {\n const match: Match = {\n pattern: fb.pattern,\n start,\n end,\n text,\n };\n const name = this._names[fb.pattern];\n if (name !== undefined) match.name = name;\n matches.push(match);\n if (text.length === 0) {\n fb.re.lastIndex = nextRegexStart(\n haystack,\n start,\n );\n }\n } else {\n fb.re.lastIndex = nextRegexStart(haystack, start);\n }\n }\n }\n return matches;\n }\n\n private findNativeSingles(haystack: string): Match[] {\n const encoded = encoder.encode(haystack);\n const matches: Match[] = [];\n for (const single of this._nativeSingles) {\n matches.push(\n ...unpack(\n single.inner._findIterPackedBuf(encoded),\n haystack,\n this._hasNames ? this._names : null,\n [single.pattern],\n ),\n );\n }\n return matches;\n }\n\n private findFirstJsFallback(\n haystack: string,\n fb: JsFallback,\n ): boolean {\n fb.re.lastIndex = 0;\n for (;;) {\n const m = fb.re.exec(haystack);\n if (!m) return false;\n const text = m[0];\n const start = m.index;\n const end = start + text.length;\n if (\n this.acceptJsFallbackMatch(haystack, start, end)\n ) {\n return true;\n }\n fb.re.lastIndex = nextRegexStart(haystack, start);\n }\n }\n\n private acceptJsFallbackMatch(\n haystack: string,\n start: number,\n end: number,\n ): boolean {\n if (!this._boundaryOptions.wholeWords) return true;\n return (\n isWordBoundary(\n haystack,\n start,\n this._boundaryOptions.unicodeBoundaries,\n ) &&\n isWordBoundary(\n haystack,\n end,\n this._boundaryOptions.unicodeBoundaries,\n )\n );\n }\n}\n\nfunction jsFallbackRegExp(\n pattern: string,\n unicodeBoundaries: boolean,\n): RegExp | undefined {\n if (\n !hasLookaround(pattern) ||\n (unicodeBoundaries && hasRegexWordBoundary(pattern)) ||\n hasRustUnicodeShorthand(pattern) ||\n hasRustClassSetOperation(pattern) ||\n countAlternations(pattern) < 128\n ) {\n return undefined;\n }\n try {\n return new RegExp(pattern, \"gu\");\n } catch {\n return undefined;\n }\n}\n\nfunction hasLookaround(pattern: string): boolean {\n return (\n pattern.includes(\"(?=\") ||\n pattern.includes(\"(?!\") ||\n pattern.includes(\"(?<=\") ||\n pattern.includes(\"(?<!\")\n );\n}\n\nfunction countAlternations(pattern: string): number {\n let count = 0;\n let inClass = false;\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") inClass = true;\n else if (ch === \"]\") inClass = false;\n else if (ch === \"|\" && !inClass) count++;\n }\n return count;\n}\n\nfunction hasRegexWordBoundary(pattern: string): boolean {\n let inClass = false;\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === \"\\\\\") {\n const next = pattern[i + 1];\n if (!inClass && (next === \"b\" || next === \"B\")) {\n return true;\n }\n i++;\n continue;\n }\n if (ch === \"[\") inClass = true;\n else if (ch === \"]\") inClass = false;\n }\n return false;\n}\n\nfunction hasRustUnicodeShorthand(pattern: string): boolean {\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch !== \"\\\\\") continue;\n const next = pattern[i + 1];\n if (\n next === \"d\" ||\n next === \"D\" ||\n next === \"w\" ||\n next === \"W\" ||\n next === \"s\" ||\n next === \"S\"\n ) {\n return true;\n }\n i++;\n }\n return false;\n}\n\nfunction hasRustClassSetOperation(\n pattern: string,\n): boolean {\n let inClass = false;\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (\n inClass &&\n i + 1 < pattern.length &&\n ((ch === \"&\" && pattern[i + 1] === \"&\") ||\n (ch === \"-\" && pattern[i + 1] === \"-\") ||\n (ch === \"~\" && pattern[i + 1] === \"~\"))\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction nextRegexStart(\n text: string,\n index: number,\n): number {\n if (index >= text.length) return index + 1;\n const first = text.charCodeAt(index);\n if (\n first >= 0xd800 &&\n first <= 0xdbff &&\n index + 1 < text.length\n ) {\n const second = text.charCodeAt(index + 1);\n if (second >= 0xdc00 && second <= 0xdfff) {\n return index + 2;\n }\n }\n return index + 1;\n}\n\nfunction selectNonOverlapping(matches: Match[]): Match[] {\n if (matches.length <= 1) return matches;\n\n matches.sort((a, b) => {\n if (a.start !== b.start) return a.start - b.start;\n const lengthOrder = b.end - b.start - (a.end - a.start);\n if (lengthOrder !== 0) return lengthOrder;\n return a.pattern - b.pattern;\n });\n\n const selected: Match[] = [];\n let lastEnd = 0;\n for (const m of matches) {\n if (m.start >= lastEnd) {\n selected.push(m);\n lastEnd = m.end;\n }\n }\n return selected;\n}\n\nfunction isWordBoundary(\n text: string,\n pos: number,\n unicode: boolean,\n): boolean {\n const before = previousCodePoint(text, pos);\n const after = nextCodePoint(text, pos);\n return (\n isWordChar(before, unicode) !==\n isWordChar(after, unicode)\n );\n}\n\nfunction previousCodePoint(\n text: string,\n pos: number,\n): string | undefined {\n if (pos <= 0) return undefined;\n return Array.from(text.slice(0, pos)).at(-1);\n}\n\nfunction nextCodePoint(\n text: string,\n pos: number,\n): string | undefined {\n if (pos >= text.length) return undefined;\n const cp = text.codePointAt(pos);\n return cp === undefined\n ? undefined\n : String.fromCodePoint(cp);\n}\n\nfunction isWordChar(\n ch: string | undefined,\n unicode: boolean,\n): boolean {\n if (ch === undefined) return false;\n return unicode\n ? /^[\\p{Alphabetic}\\p{Number}_]$/u.test(ch)\n : /^[A-Za-z0-9_]$/.test(ch);\n}\n","/* Browser/WASM entry point -- loads the WASM binding\n * from the generated browser glue and re-exports the\n * public API through the shared core. */\n\nimport native from \"../regex-set.wasi-browser.js\";\nimport { initBinding, type NativeBinding } from \"./core\";\n\ninitBinding(native as unknown as NativeBinding);\n\nexport { RegexSet } from \"./core\";\n\nexport type {\n Match,\n NamedPattern,\n NativeBinding,\n Options,\n PatternEntry,\n} from \"./core\";\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stll/regex-set-wasm",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Multi-pattern regex for browsers via WebAssembly. Same API as @stll/regex-set.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"multi-pattern",
|
|
@@ -14,12 +14,13 @@
|
|
|
14
14
|
"bugs": {
|
|
15
15
|
"url": "https://github.com/stella/regex-set/issues"
|
|
16
16
|
},
|
|
17
|
-
"license": "
|
|
17
|
+
"license": "Apache-2.0",
|
|
18
18
|
"repository": {
|
|
19
19
|
"type": "git",
|
|
20
20
|
"url": "git+https://github.com/stella/regex-set.git"
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
23
|
+
"NOTICE",
|
|
23
24
|
"dist"
|
|
24
25
|
],
|
|
25
26
|
"type": "module",
|
|
@@ -39,7 +40,9 @@
|
|
|
39
40
|
"access": "public"
|
|
40
41
|
},
|
|
41
42
|
"dependencies": {
|
|
42
|
-
"@
|
|
43
|
+
"@emnapi/core": "2.0.0-alpha.3",
|
|
44
|
+
"@emnapi/runtime": "2.0.0-alpha.3",
|
|
45
|
+
"@napi-rs/wasm-runtime": "1.2.2"
|
|
43
46
|
},
|
|
44
47
|
"peerDependencies": {
|
|
45
48
|
"vite": ">=5 <10"
|