{"version":3,"sources":["../../../../src/vanilla/getScore/getScore.ts"],"sourcesContent":["import { isValidWordBoundary } from \"../helpers/isValidBoundary\";\nimport { sortRangeTuple } from \"../helpers/sorters\";\nimport { findFuzzyMatches } from \"../algorithm/findFuzzyMatches\";\nimport type { HighlightRanges, Range } from \"../types\";\n\nexport function getFuzzyMatchScore(\n\titem: string,\n\tnormalizedItem: string,\n\titemWords: Set<string>,\n\tquery: string,\n\tnormalizedQuery: string,\n\tqueryWords: string[],\n): [number, HighlightRanges] | null {\n\t// quick matches\n\tif (item === query) {\n\t\treturn [0, [[0, item.length - 1]]];\n\t}\n\n\tconst queryLen = query.length;\n\tconst normalizedItemLen = normalizedItem.length;\n\tconst normalizedQueryLen = normalizedQuery.length;\n\n\tif (normalizedItem === normalizedQuery) {\n\t\treturn [0.1, [[0, normalizedItemLen - 1]]];\n\t}\n\tif (normalizedItem.startsWith(normalizedQuery)) {\n\t\treturn [0.5, [[0, normalizedQueryLen - 1]]];\n\t}\n\n\t// contains query (starting at word boundary)\n\tconst exactContainsIdx = item.indexOf(query);\n\tif (\n\t\texactContainsIdx > -1 &&\n\t\tisValidWordBoundary(item[exactContainsIdx - 1])\n\t) {\n\t\treturn [0.9, [[exactContainsIdx, exactContainsIdx + queryLen - 1]]];\n\t}\n\n\t/**\n\t * Finds the starting index of the first occurrence of the normalized query string\n\t * within the normalized item string. If the query is not found, it returns -1.\n\t *\n\t * @type {number}\n\t */\n\tconst containsIdx: number = normalizedItem.indexOf(normalizedQuery);\n\n\t// Match by words included\n\t// Score: 1.5 + 0.2*words (so that it's better than two non-word chunks)\n\tconst queryWordCount = queryWords.length;\n\tif (queryWordCount > 1) {\n\t\tif (queryWords.every((word) => itemWords.has(word))) {\n\t\t\tconst score = 1.5 + queryWordCount * 0.2;\n\t\t\treturn [\n\t\t\t\tscore,\n\t\t\t\tqueryWords\n\t\t\t\t\t.map((word) => {\n\t\t\t\t\t\tconst wordIndex = normalizedItem.indexOf(word);\n\t\t\t\t\t\treturn [wordIndex, wordIndex + word.length - 1] as Range;\n\t\t\t\t\t})\n\t\t\t\t\t.sort(sortRangeTuple),\n\t\t\t];\n\t\t}\n\t}\n\n\t// Contains query (at any position)\n\tif (containsIdx > -1) {\n\t\treturn [2, [[containsIdx, containsIdx + queryLen - 1]]];\n\t}\n\n\treturn findFuzzyMatches(normalizedItem, normalizedQuery);\n}\n"],"mappings":";AAAA,SAAS,2BAA2B;AACpC,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AAG1B,SAAS,mBACf,MACA,gBACA,WACA,OACA,iBACA,YACmC;AAEnC,MAAI,SAAS,OAAO;AACnB,WAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,EAClC;AAEA,QAAM,WAAW,MAAM;AACvB,QAAM,oBAAoB,eAAe;AACzC,QAAM,qBAAqB,gBAAgB;AAE3C,MAAI,mBAAmB,iBAAiB;AACvC,WAAO,CAAC,KAAK,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC;AAAA,EAC1C;AACA,MAAI,eAAe,WAAW,eAAe,GAAG;AAC/C,WAAO,CAAC,KAAK,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;AAAA,EAC3C;AAGA,QAAM,mBAAmB,KAAK,QAAQ,KAAK;AAC3C,MACC,mBAAmB,MACnB,oBAAoB,KAAK,mBAAmB,CAAC,CAAC,GAC7C;AACD,WAAO,CAAC,KAAK,CAAC,CAAC,kBAAkB,mBAAmB,WAAW,CAAC,CAAC,CAAC;AAAA,EACnE;AAQA,QAAM,cAAsB,eAAe,QAAQ,eAAe;AAIlE,QAAM,iBAAiB,WAAW;AAClC,MAAI,iBAAiB,GAAG;AACvB,QAAI,WAAW,MAAM,CAAC,SAAS,UAAU,IAAI,IAAI,CAAC,GAAG;AACpD,YAAM,QAAQ,MAAM,iBAAiB;AACrC,aAAO;AAAA,QACN;AAAA,QACA,WACE,IAAI,CAAC,SAAS;AACd,gBAAM,YAAY,eAAe,QAAQ,IAAI;AAC7C,iBAAO,CAAC,WAAW,YAAY,KAAK,SAAS,CAAC;AAAA,QAC/C,CAAC,EACA,KAAK,cAAc;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AAGA,MAAI,cAAc,IAAI;AACrB,WAAO,CAAC,GAAG,CAAC,CAAC,aAAa,cAAc,WAAW,CAAC,CAAC,CAAC;AAAA,EACvD;AAEA,SAAO,iBAAiB,gBAAgB,eAAe;AACxD;","names":[]}