From 37fd4de4009813b51c3c369cf185a1eacbc27f6b Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Tue, 7 Apr 2026 12:35:18 -0400 Subject: [PATCH 1/2] refactor: smaller synonym algorithm --- packages/geocoder/src/apis/offline/index.ts | 32 ++++++++++++--------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/geocoder/src/apis/offline/index.ts b/packages/geocoder/src/apis/offline/index.ts index 1243f10c0..c4e899ea5 100644 --- a/packages/geocoder/src/apis/offline/index.ts +++ b/packages/geocoder/src/apis/offline/index.ts @@ -29,23 +29,27 @@ async function autocomplete({ }: OfflineQuery): Promise { if (!text) return []; + // TODO: could probably generate these arrays with only 1 pass of list + const itemsWithSynonyms = items.map(item => item.label); + const synonymIndicies = items.map((_, idx) => idx); + + // Add synonyms to full list + // TODO: can this be done in a cleaner way? + items.forEach((item, 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 { From d1ccf5eedefec61717b0f5a13545bfd0c0518021 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 8 Apr 2026 10:52:25 -0400 Subject: [PATCH 2/2] cleaner --- packages/geocoder/src/apis/offline/index.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/geocoder/src/apis/offline/index.ts b/packages/geocoder/src/apis/offline/index.ts index c4e899ea5..973f3c85e 100644 --- a/packages/geocoder/src/apis/offline/index.ts +++ b/packages/geocoder/src/apis/offline/index.ts @@ -29,13 +29,14 @@ async function autocomplete({ }: OfflineQuery): Promise { if (!text) return []; - // TODO: could probably generate these arrays with only 1 pass of list - const itemsWithSynonyms = items.map(item => item.label); - const synonymIndicies = items.map((_, idx) => idx); + 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);