diff --git a/packages/tui/src/fuzzy.ts b/packages/tui/src/fuzzy.ts index 09410238..35df468a 100644 --- a/packages/tui/src/fuzzy.ts +++ b/packages/tui/src/fuzzy.ts @@ -60,6 +60,10 @@ export function fuzzyMatch(query: string, text: string): FuzzyMatch { return { matches: false, score: 0 }; } + if (normalizedQuery === textLower) { + score -= 100; + } + return { matches: true, score }; }; diff --git a/packages/tui/test/fuzzy.test.ts b/packages/tui/test/fuzzy.test.ts index e3e7d1e8..e784e49c 100644 --- a/packages/tui/test/fuzzy.test.ts +++ b/packages/tui/test/fuzzy.test.ts @@ -83,6 +83,13 @@ describe("fuzzyFilter", () => { assert.strictEqual(result[0], "app"); }); + it("prioritizes exact matches over longer prefix matches", () => { + const items = ["clone", "cl"]; + const result = fuzzyFilter(items, "cl", (x: string) => x); + + assert.deepStrictEqual(result, ["cl", "clone"]); + }); + it("works with custom getText function", () => { const items = [ { name: "foo", id: 1 },