UNPKG

ts-regex-builder

Version:

Maintainable regular expressions for TypeScript and JavaScript.

1 lines 4.42 kB
{"version":3,"file":"encoder.mjs","names":["ensureElements","ensureText","encode","sequence","elements","encoded","map","n","encodeElement","length","precedence","pattern","encodeAtomic","join","element","encodeText","RegExp","encodeRegExp","Error","JSON","stringify","text","escapeText","regexp","source","isAtomicPattern","test","replace"],"sources":["../../src/encoder.ts"],"sourcesContent":["import type { EncodedRegex, RegexElement, RegexSequence } from './types';\nimport { ensureElements, ensureText } from './utils';\n\nexport function encode(sequence: RegexSequence): EncodedRegex {\n const elements = ensureElements(sequence);\n const encoded = elements.map((n) => encodeElement(n));\n\n if (encoded.length === 1) {\n return encoded[0]!;\n }\n\n return {\n precedence: 'sequence',\n pattern: encoded\n .map((n) => (n.precedence === 'disjunction' ? encodeAtomic(n) : n.pattern))\n .join(''),\n };\n}\n\nexport function encodeAtomic(sequence: RegexSequence): string {\n const encoded = encode(sequence);\n return encoded.precedence === 'atom' ? encoded.pattern : `(?:${encoded.pattern})`;\n}\n\nfunction encodeElement(element: RegexElement): EncodedRegex {\n if (typeof element === 'string') {\n return encodeText(element);\n }\n\n if (element instanceof RegExp) {\n return encodeRegExp(element);\n }\n\n if (typeof element === 'object') {\n // EncodedRegex\n if ('pattern' in element) {\n return element;\n }\n\n // LazyEncodableRegex\n if ('encode' in element) {\n return element.encode();\n }\n }\n\n throw new Error(`Unsupported element. Received: ${JSON.stringify(element, null, 2)}`);\n}\n\nfunction encodeText(text: string): EncodedRegex {\n ensureText(text);\n\n return {\n // Optimize for single character case\n precedence: text.length === 1 ? 'atom' : 'sequence',\n pattern: escapeText(text),\n };\n}\n\nfunction encodeRegExp(regexp: RegExp): EncodedRegex {\n const pattern = regexp.source;\n\n return {\n // Encode at safe precedence\n precedence: isAtomicPattern(pattern) ? 'atom' : 'disjunction',\n pattern,\n };\n}\n\n// This is intended to catch only some popular atomic patterns like char classes and groups.\nfunction isAtomicPattern(pattern: string): boolean {\n // Simple char, char class [...] or group (...)\n return pattern.length === 1 || /^\\[[^[\\]]*\\]$/.test(pattern) || /^\\([^()]*\\)$/.test(pattern);\n}\n\n// Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions#escaping\nfunction escapeText(text: string) {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n"],"mappings":"SACSA,cAAc,EAAEC,UAAU;AAEnC,OAAO,SAASC,MAAMA,CAACC,QAAuB,EAAgB;EAC5D,MAAMC,QAAQ,GAAGJ,cAAc,CAACG,QAAQ,CAAC;EACzC,MAAME,OAAO,GAAGD,QAAQ,CAACE,GAAG,CAAEC,CAAC,IAAKC,aAAa,CAACD,CAAC,CAAC,CAAC;EAErD,IAAIF,OAAO,CAACI,MAAM,KAAK,CAAC,EAAE;IACxB,OAAOJ,OAAO,CAAC,CAAC,CAAC;EACnB;EAEA,OAAO;IACLK,UAAU,EAAE,UAAU;IACtBC,OAAO,EAAEN,OAAO,CACbC,GAAG,CAAEC,CAAC,IAAMA,CAAC,CAACG,UAAU,KAAK,aAAa,GAAGE,YAAY,CAACL,CAAC,CAAC,GAAGA,CAAC,CAACI,OAAQ,CAAC,CAC1EE,IAAI,CAAC,EAAE;EACZ,CAAC;AACH;AAEA,OAAO,SAASD,YAAYA,CAACT,QAAuB,EAAU;EAC5D,MAAME,OAAO,GAAGH,MAAM,CAACC,QAAQ,CAAC;EAChC,OAAOE,OAAO,CAACK,UAAU,KAAK,MAAM,GAAGL,OAAO,CAACM,OAAO,GAAI,MAAKN,OAAO,CAACM,OAAQ,GAAE;AACnF;AAEA,SAASH,aAAaA,CAACM,OAAqB,EAAgB;EAC1D,IAAI,OAAOA,OAAO,KAAK,QAAQ,EAAE;IAC/B,OAAOC,UAAU,CAACD,OAAO,CAAC;EAC5B;EAEA,IAAIA,OAAO,YAAYE,MAAM,EAAE;IAC7B,OAAOC,YAAY,CAACH,OAAO,CAAC;EAC9B;EAEA,IAAI,OAAOA,OAAO,KAAK,QAAQ,EAAE;IAE/B,IAAI,SAAS,IAAIA,OAAO,EAAE;MACxB,OAAOA,OAAO;IAChB;IAGA,IAAI,QAAQ,IAAIA,OAAO,EAAE;MACvB,OAAOA,OAAO,CAACZ,MAAM,CAAC,CAAC;IACzB;EACF;EAEA,MAAM,IAAIgB,KAAK,CAAE,kCAAiCC,IAAI,CAACC,SAAS,CAACN,OAAO,EAAE,IAAI,EAAE,CAAC,CAAE,EAAC,CAAC;AACvF;AAEA,SAASC,UAAUA,CAACM,IAAY,EAAgB;EAC9CpB,UAAU,CAACoB,IAAI,CAAC;EAEhB,OAAO;IAELX,UAAU,EAAEW,IAAI,CAACZ,MAAM,KAAK,CAAC,GAAG,MAAM,GAAG,UAAU;IACnDE,OAAO,EAAEW,UAAU,CAACD,IAAI;EAC1B,CAAC;AACH;AAEA,SAASJ,YAAYA,CAACM,MAAc,EAAgB;EAClD,MAAMZ,OAAO,GAAGY,MAAM,CAACC,MAAM;EAE7B,OAAO;IAELd,UAAU,EAAEe,eAAe,CAACd,OAAO,CAAC,GAAG,MAAM,GAAG,aAAa;IAC7DA;EACF,CAAC;AACH;AAGA,SAASc,eAAeA,CAACd,OAAe,EAAW;EAEjD,OAAOA,OAAO,CAACF,MAAM,KAAK,CAAC,IAAI,eAAe,CAACiB,IAAI,CAACf,OAAO,CAAC,IAAI,cAAc,CAACe,IAAI,CAACf,OAAO,CAAC;AAC9F;AAGA,SAASW,UAAUA,CAACD,IAAY,EAAE;EAChC,OAAOA,IAAI,CAACM,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;AACpD","ignoreList":[]}