{"version":3,"file":"fuzzySearch.cjs","sources":["../../../src/utils/fuzzySearch.ts"],"sourcesContent":["import uFuzzy from '@leeoniya/ufuzzy';\n\nimport { escapeRegex } from '../text/string';\n\n// https://catonmat.net/my-favorite-regex :)\nconst REGEXP_NON_ASCII = /[^ -~]/m;\n// https://www.asciitable.com/\n// matches only these: `~!@#$%^&*()_+-=[]\\{}|;':\",./<>?\nconst REGEXP_ONLY_SYMBOLS = /^[\\x21-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E]+$/m;\n// limit max terms in needle that qualify for re-ordering\nconst outOfOrderLimit = 5;\n// beyond 25 chars fall back to substring search\nconst maxNeedleLength = 25;\n// beyond 5 terms fall back to substring match\nconst maxFuzzyTerms = 5;\n// when number of matches <= 1e4, do ranking + sorting by quality\nconst rankThreshold = 1e4;\n\n// typo tolerance mode\nconst uf = new uFuzzy({ intraMode: 1 });\n\n/**\n * Fuzzy search utility that returns matching indices for a given search term\n * Uses intelligent fallback strategies for different types of input\n * @internal\n */\nexport function fuzzySearch(haystack: string[], needle: string): number[] {\n  if (needle === '') {\n    return haystack.map((_, index) => index);\n  }\n  // fallback to substring matches to avoid badness\n  else if (\n    // contains non-ascii\n    REGEXP_NON_ASCII.test(needle) ||\n    // is only ascii symbols (operators)\n    REGEXP_ONLY_SYMBOLS.test(needle) ||\n    // too long (often copy-paste from somewhere)\n    needle.length > maxNeedleLength ||\n    uf.split(needle).length > maxFuzzyTerms\n  ) {\n    const needleRegex = new RegExp(escapeRegex(needle), 'i');\n    const indices: number[] = [];\n\n    for (let i = 0; i < haystack.length; i++) {\n      let item = haystack[i];\n\n      if (needleRegex.test(item)) {\n        indices.push(i);\n      }\n    }\n    return indices;\n  }\n  // fuzzy search\n  else {\n    const [idxs, info, order] = uf.search(haystack, needle, outOfOrderLimit, rankThreshold);\n\n    if (idxs?.length) {\n      if (info && order) {\n        return order.map((idx) => info.idx[idx]);\n      } else {\n        return idxs;\n      }\n    }\n  }\n\n  return [];\n}\n"],"names":["uFuzzy","escapeRegex"],"mappings":";;;;;;;;;;;;AAKA,MAAM,gBAAA,GAAmB,SAAA;AAGzB,MAAM,mBAAA,GAAsB,4CAAA;AAE5B,MAAM,eAAA,GAAkB,CAAA;AAExB,MAAM,eAAA,GAAkB,EAAA;AAExB,MAAM,aAAA,GAAgB,CAAA;AAEtB,MAAM,aAAA,GAAgB,GAAA;AAGtB,MAAM,KAAK,IAAIA,uBAAA,CAAO,EAAE,SAAA,EAAW,GAAG,CAAA;AAO/B,SAAS,WAAA,CAAY,UAAoB,MAAA,EAA0B;AACxE,EAAA,IAAI,WAAW,EAAA,EAAI;AACjB,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,UAAU,KAAK,CAAA;AAAA,EACzC,CAAA,MAAA;AAAA;AAAA,IAIE,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAAA,IAE5B,mBAAA,CAAoB,KAAK,MAAM,CAAA;AAAA,IAE/B,OAAO,MAAA,GAAS,eAAA,IAChB,GAAG,KAAA,CAAM,MAAM,EAAE,MAAA,GAAS;AAAA,IAC1B;AACA,IAAA,MAAM,cAAc,IAAI,MAAA,CAAOC,kBAAA,CAAY,MAAM,GAAG,GAAG,CAAA;AACvD,IAAA,MAAM,UAAoB,EAAC;AAE3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,IAAI,IAAA,GAAO,SAAS,CAAC,CAAA;AAErB,MAAA,IAAI,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1B,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,MAEK;AACH,IAAA,MAAM,CAAC,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA,GAAI,GAAG,MAAA,CAAO,QAAA,EAAU,MAAA,EAAQ,eAAA,EAAiB,aAAa,CAAA;AAEtF,IAAA,IAAI,6BAAM,MAAA,EAAQ;AAChB,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,OAAO,MAAM,GAAA,CAAI,CAAC,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAC;AACV;;;;"}