ts-regex-builder
Version:
Maintainable regular expressions for TypeScript and JavaScript.
1 lines • 5.56 kB
Source Map (JSON)
{"version":3,"file":"char-class.mjs","names":["ensureText","charClass","elements","length","Error","chars","map","c","flat","ranges","encode","encodeCharClass","charRange","start","end","anyOf","split","escapeChar","negated","element","call","inverted","text","replace","isNegated","hyphen","includes","caret","otherChars","filter","join","negation","pattern","precedence"],"sources":["../../../src/constructs/char-class.ts"],"sourcesContent":["import type { CharacterClass, CharacterEscape, EncodedRegex } from '../types';\nimport { ensureText } from '../utils';\n\n/**\n * Creates a character class which matches any one of the given characters.\n *\n * @param elements - Member characters or character ranges.\n * @returns Character class.\n */\nexport function charClass(...elements: Array<CharacterClass | CharacterEscape>): CharacterClass {\n if (!elements.length) {\n throw new Error('Expected at least one element');\n }\n\n return {\n chars: elements.map((c) => c.chars).flat(),\n ranges: elements.map((c) => c.ranges ?? []).flat(),\n encode: encodeCharClass,\n };\n}\n\n/**\n * Creates a character class which matches any one of the characters in the range.\n *\n * @param start - Start of the range (single character).\n * @param end - End of the range (single character).\n * @returns Character class.\n */\nexport function charRange(start: string, end: string): CharacterClass {\n if (start.length !== 1 || end.length !== 1) {\n throw new Error(`Expected single characters, but received \"${start}\" & \"${end}\"`);\n }\n\n if (start > end) {\n [start, end] = [end, start];\n }\n\n return {\n chars: [],\n ranges: [{ start, end }],\n encode: encodeCharClass,\n };\n}\n\n/**\n * Creates a character class which matches any one of the given characters.\n *\n * @param chars - Characters to match.\n * @returns Character class.\n */\nexport function anyOf(chars: string): CharacterClass {\n ensureText(chars);\n\n return {\n chars: chars.split('').map(escapeChar),\n encode: encodeCharClass,\n };\n}\n\n/**\n * Creates a negated character class which matches any character that is not in the given character class.\n *\n * @param element - Character class or character escape to negate.\n * @returns Negated character class.\n */\nexport function negated(element: CharacterClass | CharacterEscape): EncodedRegex {\n return encodeCharClass.call(element, true);\n}\n\n/**\n * @deprecated Renamed to `negated`.\n */\nexport const inverted = negated;\n\n/** Escape chars for usage inside char class */\nfunction escapeChar(text: string): string {\n return text.replace(/[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nfunction encodeCharClass(\n this: CharacterClass | CharacterEscape,\n isNegated?: boolean,\n): EncodedRegex {\n // If passed characters includes hyphen (`-`) it need to be moved to\n // first (or last) place in order to treat it as hyphen character and not a range.\n // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions/Character_classes#types\n const hyphen = this.chars.includes('-') ? '-' : '';\n const caret = this.chars.includes('^') ? '^' : '';\n const otherChars = this.chars.filter((c) => c !== '-' && c !== '^').join('');\n const ranges = this.ranges?.map(({ start, end }) => `${start}-${end}`).join('') ?? '';\n const negation = isNegated ? '^' : '';\n\n let pattern = `[${negation}${ranges}${otherChars}${caret}${hyphen}]`;\n if (pattern === '[^-]') pattern = '[\\\\^-]';\n\n return {\n precedence: 'atom',\n pattern,\n };\n}\n"],"mappings":"SACSA,UAAU;AAQnB,OAAO,SAASC,SAASA,CAAC,GAAGC,QAAiD,EAAkB;EAC9F,IAAI,CAACA,QAAQ,CAACC,MAAM,EAAE;IACpB,MAAM,IAAIC,KAAK,CAAC,+BAA+B,CAAC;EAClD;EAEA,OAAO;IACLC,KAAK,EAAEH,QAAQ,CAACI,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACF,KAAK,CAAC,CAACG,IAAI,CAAC,CAAC;IAC1CC,MAAM,EAAEP,QAAQ,CAACI,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACE,MAAM,IAAI,EAAE,CAAC,CAACD,IAAI,CAAC,CAAC;IAClDE,MAAM,EAAEC;EACV,CAAC;AACH;AASA,OAAO,SAASC,SAASA,CAACC,KAAa,EAAEC,GAAW,EAAkB;EACpE,IAAID,KAAK,CAACV,MAAM,KAAK,CAAC,IAAIW,GAAG,CAACX,MAAM,KAAK,CAAC,EAAE;IAC1C,MAAM,IAAIC,KAAK,CAAE,6CAA4CS,KAAM,QAAOC,GAAI,GAAE,CAAC;EACnF;EAEA,IAAID,KAAK,GAAGC,GAAG,EAAE;IACf,CAACD,KAAK,EAAEC,GAAG,CAAC,GAAG,CAACA,GAAG,EAAED,KAAK,CAAC;EAC7B;EAEA,OAAO;IACLR,KAAK,EAAE,EAAE;IACTI,MAAM,EAAE,CAAC;MAAEI,KAAK;MAAEC;IAAI,CAAC,CAAC;IACxBJ,MAAM,EAAEC;EACV,CAAC;AACH;AAQA,OAAO,SAASI,KAAKA,CAACV,KAAa,EAAkB;EACnDL,UAAU,CAACK,KAAK,CAAC;EAEjB,OAAO;IACLA,KAAK,EAAEA,KAAK,CAACW,KAAK,CAAC,EAAE,CAAC,CAACV,GAAG,CAACW,UAAU,CAAC;IACtCP,MAAM,EAAEC;EACV,CAAC;AACH;AAQA,OAAO,SAASO,OAAOA,CAACC,OAAyC,EAAgB;EAC/E,OAAOR,eAAe,CAACS,IAAI,CAACD,OAAO,EAAE,IAAI,CAAC;AAC5C;AAKA,OAAO,MAAME,QAAQ,GAAGH,OAAO;AAG/B,SAASD,UAAUA,CAACK,IAAY,EAAU;EACxC,OAAOA,IAAI,CAACC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;AACxC;AAEA,SAASZ,eAAeA,CAEtBa,SAAmB,EACL;EAId,MAAMC,MAAM,GAAG,IAAI,CAACpB,KAAK,CAACqB,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE;EAClD,MAAMC,KAAK,GAAG,IAAI,CAACtB,KAAK,CAACqB,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE;EACjD,MAAME,UAAU,GAAG,IAAI,CAACvB,KAAK,CAACwB,MAAM,CAAEtB,CAAC,IAAKA,CAAC,KAAK,GAAG,IAAIA,CAAC,KAAK,GAAG,CAAC,CAACuB,IAAI,CAAC,EAAE,CAAC;EAC5E,MAAMrB,MAAM,GAAG,IAAI,CAACA,MAAM,EAAEH,GAAG,CAAC,CAAC;IAAEO,KAAK;IAAEC;EAAI,CAAC,KAAM,GAAED,KAAM,IAAGC,GAAI,EAAC,CAAC,CAACgB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;EACrF,MAAMC,QAAQ,GAAGP,SAAS,GAAG,GAAG,GAAG,EAAE;EAErC,IAAIQ,OAAO,GAAI,IAAGD,QAAS,GAAEtB,MAAO,GAAEmB,UAAW,GAAED,KAAM,GAAEF,MAAO,GAAE;EACpE,IAAIO,OAAO,KAAK,MAAM,EAAEA,OAAO,GAAG,QAAQ;EAE1C,OAAO;IACLC,UAAU,EAAE,MAAM;IAClBD;EACF,CAAC;AACH","ignoreList":[]}