diff --git a/packages/geocoder/src/apis/offline/index.ts b/packages/geocoder/src/apis/offline/index.ts index 1243f10c0..973f3c85e 100644 --- a/packages/geocoder/src/apis/offline/index.ts +++ b/packages/geocoder/src/apis/offline/index.ts @@ -29,23 +29,28 @@ async function autocomplete({ }: OfflineQuery): Promise { if (!text) return []; + const itemsWithSynonyms = []; + const synonymIndicies = []; + + // Add synonyms to full list + // TODO: can this be done in a cleaner way? + items.forEach((item, idx) => { + itemsWithSynonyms.push(item.label); + synonymIndicies.push(idx); + if (item?.synonyms) { + item.synonyms.forEach(synonym => { + itemsWithSynonyms.push(synonym); + synonymIndicies.push(idx); + }); + } + }); + // eslint-disable-next-line new-cap const u = new uFuzzy(); - const haystackMap = items.flatMap<[string, number]>((item, idx) => { - const allTerms = [item.label, ...(item.synonyms ?? [])] - // old eslint doesn't support satisfies syntax - // eslint-disable-next-line prettier/prettier - return allTerms.map(term => [term, idx] satisfies [string, number]) - }) - - const matchedIdxs = u.filter(haystackMap.map(i => i[0]), text); - if (!matchedIdxs) return []; - const resultIdxs = matchedIdxs.reduce((results, matchIdx) => { - const itemIdx = haystackMap[matchIdx][1] - return results.add(itemIdx) - }, new Set()) - return [...resultIdxs].map(i => items[i]) + const idxs = u.filter(itemsWithSynonyms, text); + + return Array.from(new Set(idxs.map(index => items[synonymIndicies[index]]))); } function search(args: OfflineQuery): Promise {