{"version":3,"file":"xrx.cjs","names":[],"sources":["../../../src/common/data/xrx.ts"],"sourcesContent":["/* eslint-disable no-cond-assign */\n\nconst RX_WHITESPACE = /\\\\\\s|\\s+|#[^\\n]*\\n?/g\nconst RX_REAL_GROUPS = /\\(\\?P?<(\\w{2,})>|\\((?!\\?([:!=]|<=|<!))/g\n// eslint-disable-next-line regexp/no-unused-capturing-group\nconst RX_LOOK_BEHIND = /^((?:\\(\\?[\\w$]+\\))?)\\(\\?<([=!])([\\s\\S]*?)\\)/gm\n\nexport function regExpString(rx: string | RegExp): string {\n  return typeof rx === 'string' ? rx : (rx.source || '')\n}\n\nexport function regExpEscape(str: string): string {\n  return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\nexport class XRX {\n  lookBehind:any\n  namedGroups: Record<string, number> = {}\n  names: string[] = []\n  rx: RegExp\n\n  constructor(pattern: string | RegExp, flags?: string) {\n    let _flags: string = flags ?? ''\n    let _rx: string\n\n    if (pattern instanceof RegExp) {\n      if (flags == null)\n        _flags = pattern.flags\n\n      _rx = pattern.source\n    }\n    else {\n      _rx = pattern\n    }\n\n    // eXtended / Ignore Whitespace\n    const extended = _flags && _flags.includes('x')\n    if (extended) {\n      _flags = _flags.replace('x', '')\n      _rx = _rx.replace(RX_WHITESPACE, (r) => {\n        // log('rp', r)\n        return r[0] === '\\\\' ? r : ''\n      })\n    }\n\n    // Named Groups\n    if (!(pattern instanceof RegExp)) {\n      let index = 0\n      _rx = _rx.replace(RX_REAL_GROUPS, (str, name) => {\n        // log('>>>', name)\n        index += 1\n        if (name) {\n          if (\n            name !== 'index'\n            && name !== 'length'\n            && !this.namedGroups[name]\n          ) {\n            this.namedGroups[name] = index\n          }\n          // else\n          //   log.error(`Unallowed or duplicate group name: ${name}`)\n\n          return '('\n        }\n        return str\n      })\n      this.names = Object.keys(this.namedGroups)\n    }\n\n    // http://www.rexegg.com/regex-best-trick.html\n\n    _rx = regExpString(_rx)\n    RX_LOOK_BEHIND.lastIndex = 0\n    const parts = RX_LOOK_BEHIND.exec(_rx)\n    if (parts) {\n      this.lookBehind = {\n        rx: new RegExp(`${parts[3]}$(?!\\\\s)`),\n        expect: parts ? parts[2] === '=' : !parts,\n      }\n      _rx = _rx.substr(parts[0].length)\n    }\n\n    this.rx = new RegExp(_rx, _flags)\n  }\n\n  // flagsString() {\n  //     let hash = this.rx.toString() + '/'\n  //     if (this.rx.global) {\n  //         hash += 'g'\n  //     }\n  //     if (this.rx.multiline) {\n  //         hash += 'm'\n  //     }\n  //     if (this.rx.ignoreCase) {\n  //         hash += 'i'\n  //     }\n  //     if (this.rx.unicode) {\n  //         hash += 'u'\n  //     }\n  //     if (this.rx.sticky) {\n  //         hash += 'y'\n  //     }\n  // }\n\n  get lastIndex(): number {\n    return this.rx.lastIndex\n  }\n\n  set lastIndex(index: number) {\n    this.rx.lastIndex = index\n  }\n\n  _handleMatch(m: any) {\n    if (this.lookBehind) {\n      const leftContext = m.input.slice(0, m.index)\n      if (this.lookBehind.expect !== this.lookBehind.rx.test(leftContext))\n        return null\n    }\n    for (const name of this.names)\n      m[name] = m[this.namedGroups[name]]\n\n    return m\n  }\n\n  exec(str: string) {\n    let m\n    while ((m = this.rx.exec(str))) {\n      if (this.rx.lastIndex === m.index)\n        this.rx.lastIndex++\n      m = this._handleMatch(m)\n      if (m != null)\n        return m\n    }\n  }\n\n  execAll(str: string) {\n    const matches = []\n    let m\n    this.rx.lastIndex = 0\n    while ((m = this.exec(str)))\n      matches.push(m)\n\n    this.rx.lastIndex = 0\n    // log('execAll:', matches)\n    return matches\n  }\n\n  replace(str: string, replacement: string | ((m: string) => string)) {\n    const fn = typeof replacement === 'function' ? replacement : () => replacement\n    return str.replace(this.rx, (m) => {\n      // m = this._handleMatch(m)\n      return fn(m)\n    })\n  }\n}\n"],"mappings":";;;AAEA,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AAEvB,MAAM,iBAAiB;AAEvB,SAAgB,aAAa,IAA6B;AACxD,QAAO,OAAO,OAAO,WAAW,KAAM,GAAG,UAAU;;AAGrD,SAAgB,aAAa,KAAqB;AAChD,QAAO,IAAI,QAAQ,4BAA4B,OAAO;;AAGxD,IAAa,MAAb,MAAiB;CACf;CACA,cAAsC,EAAE;CACxC,QAAkB,EAAE;CACpB;CAEA,YAAY,SAA0B,OAAgB;EACpD,IAAI,SAAiB,SAAS;EAC9B,IAAI;AAEJ,MAAI,mBAAmB,QAAQ;AAC7B,OAAI,SAAS,KACX,UAAS,QAAQ;AAEnB,SAAM,QAAQ;QAGd,OAAM;AAKR,MADiB,UAAU,OAAO,SAAS,IAAI,EACjC;AACZ,YAAS,OAAO,QAAQ,KAAK,GAAG;AAChC,SAAM,IAAI,QAAQ,gBAAgB,MAAM;AAEtC,WAAO,EAAE,OAAO,OAAO,IAAI;KAC3B;;AAIJ,MAAI,EAAE,mBAAmB,SAAS;GAChC,IAAI,QAAQ;AACZ,SAAM,IAAI,QAAQ,iBAAiB,KAAK,SAAS;AAE/C,aAAS;AACT,QAAI,MAAM;AACR,SACE,SAAS,WACN,SAAS,YACT,CAAC,KAAK,YAAY,MAErB,MAAK,YAAY,QAAQ;AAK3B,YAAO;;AAET,WAAO;KACP;AACF,QAAK,QAAQ,OAAO,KAAK,KAAK,YAAY;;AAK5C,QAAM,aAAa,IAAI;AACvB,iBAAe,YAAY;EAC3B,MAAM,QAAQ,eAAe,KAAK,IAAI;AACtC,MAAI,OAAO;AACT,QAAK,aAAa;IAChB,IAAI,IAAI,OAAO,GAAG,MAAM,GAAG,UAAU;IACrC,QAAQ,QAAQ,MAAM,OAAO,MAAM,CAAC;IACrC;AACD,SAAM,IAAI,OAAO,MAAM,GAAG,OAAO;;AAGnC,OAAK,KAAK,IAAI,OAAO,KAAK,OAAO;;CAsBnC,IAAI,YAAoB;AACtB,SAAO,KAAK,GAAG;;CAGjB,IAAI,UAAU,OAAe;AAC3B,OAAK,GAAG,YAAY;;CAGtB,aAAa,GAAQ;AACnB,MAAI,KAAK,YAAY;GACnB,MAAM,cAAc,EAAE,MAAM,MAAM,GAAG,EAAE,MAAM;AAC7C,OAAI,KAAK,WAAW,WAAW,KAAK,WAAW,GAAG,KAAK,YAAY,CACjE,QAAO;;AAEX,OAAK,MAAM,QAAQ,KAAK,MACtB,GAAE,QAAQ,EAAE,KAAK,YAAY;AAE/B,SAAO;;CAGT,KAAK,KAAa;EAChB,IAAI;AACJ,SAAQ,IAAI,KAAK,GAAG,KAAK,IAAI,EAAG;AAC9B,OAAI,KAAK,GAAG,cAAc,EAAE,MAC1B,MAAK,GAAG;AACV,OAAI,KAAK,aAAa,EAAE;AACxB,OAAI,KAAK,KACP,QAAO;;;CAIb,QAAQ,KAAa;EACnB,MAAM,UAAU,EAAE;EAClB,IAAI;AACJ,OAAK,GAAG,YAAY;AACpB,SAAQ,IAAI,KAAK,KAAK,IAAI,CACxB,SAAQ,KAAK,EAAE;AAEjB,OAAK,GAAG,YAAY;AAEpB,SAAO;;CAGT,QAAQ,KAAa,aAA+C;EAClE,MAAM,KAAK,OAAO,gBAAgB,aAAa,oBAAoB;AACnE,SAAO,IAAI,QAAQ,KAAK,KAAK,MAAM;AAEjC,UAAO,GAAG,EAAE;IACZ"}