diff --git a/packages/autocomplete/src/create.ts b/packages/autocomplete/src/create.ts index eefb8fb787..2aeafac697 100644 --- a/packages/autocomplete/src/create.ts +++ b/packages/autocomplete/src/create.ts @@ -1,7 +1,7 @@ import type { AutoCompleteExtractorResult, AutoCompleteFunction, AutoCompleteTemplate, SuggestResult, UnoGenerator, Variant } from '@unocss/core' import { escapeRegExp, toArray, uniq } from '@unocss/core' import { LRUCache } from 'lru-cache' -import { Fzf } from 'fzf' +import { Fzf, byLengthAsc, byStartAsc } from 'fzf' import { parseAutocomplete } from './parse' import type { AutocompleteOptions, ParsedAutocompleteTemplate, UnocssAutocomplete } from './types' import { searchAttrKey, searchUsageBoundary } from './utils' @@ -11,7 +11,6 @@ export function createAutocomplete(uno: UnoGenerator, options: AutocompleteOptio const cache = new LRUCache({ max: 5000 }) let staticUtils: string[] = [] - let staticFzf = new Fzf([]) const templates: (AutoCompleteTemplate | AutoCompleteFunction)[] = [] @@ -77,7 +76,7 @@ export function createAutocomplete(uno: UnoGenerator, options: AutocompleteOptio const variantPrefix = input.slice(0, idx) const variantSuffix = input.slice(idx + input.length) - const result = processSuggestions( + let result = processSuggestions( await Promise.all([ suggestSelf(processed), suggestStatic(processed), @@ -89,6 +88,12 @@ export function createAutocomplete(uno: UnoGenerator, options: AutocompleteOptio variantSuffix, ) + if (matchType === 'fuzzy') { + const fzf = new Fzf(result, { + tiebreakers: [byStartAsc, byLengthAsc], + }) + result = fzf.find(input).map(i => i.item) + } cache.set(input, result) return result } @@ -139,7 +144,7 @@ export function createAutocomplete(uno: UnoGenerator, options: AutocompleteOptio async function suggestStatic(input: string) { if (matchType === 'fuzzy') - return staticFzf.find(input).map(i => i.item) + return staticUtils return staticUtils.filter(i => i.startsWith(input)) } @@ -175,7 +180,6 @@ export function createAutocomplete(uno: UnoGenerator, options: AutocompleteOptio ...Object.keys(uno.config.rulesStaticMap), ...uno.config.shortcuts.filter(i => typeof i[0] === 'string').map(i => i[0] as string), ] - staticFzf = new Fzf(staticUtils) templates.length = 0 templates.push( ...uno.config.autocomplete.templates || [], diff --git a/test/autocomplete-fuzzy.test.ts b/test/autocomplete-fuzzy.test.ts index ae8a9e6e9f..0c56c446cc 100644 --- a/test/autocomplete-fuzzy.test.ts +++ b/test/autocomplete-fuzzy.test.ts @@ -43,4 +43,9 @@ describe('autocomplete-fuzzy', () => { expect(await ac.suggest('bmc')) .includes('bg-mode-color') }) + + it('order', async () => { + const suggestions = await ac.suggest('ga') + expect(suggestions.indexOf('gap-0')).toBeLessThan(suggestions.indexOf('gap-1')) + }) })