diff options
Diffstat (limited to 'packages/core/src')
| -rw-r--r-- | packages/core/src/utils/filesearch/fileSearch.test.ts | 24 | ||||
| -rw-r--r-- | packages/core/src/utils/filesearch/fileSearch.ts | 17 |
2 files changed, 40 insertions, 1 deletions
diff --git a/packages/core/src/utils/filesearch/fileSearch.test.ts b/packages/core/src/utils/filesearch/fileSearch.test.ts index a7f59f91..38657492 100644 --- a/packages/core/src/utils/filesearch/fileSearch.test.ts +++ b/packages/core/src/utils/filesearch/fileSearch.test.ts @@ -290,6 +290,30 @@ describe('FileSearch', () => { expect(results).toEqual(['src/file1.js', 'src/file2.js']); // Assuming alphabetical sort }); + it('should use fzf for fuzzy matching when pattern does not contain wildcards', async () => { + tmpDir = await createTmpDir({ + src: { + 'main.js': '', + 'util.ts': '', + 'style.css': '', + }, + }); + + const fileSearch = new FileSearch({ + projectRoot: tmpDir, + useGitignore: false, + useGeminiignore: false, + ignoreDirs: [], + cache: false, + cacheTtl: 0, + }); + + await fileSearch.initialize(); + const results = await fileSearch.search('sst'); + + expect(results).toEqual(['src/style.css']); + }); + it('should return empty array when no matches are found', async () => { tmpDir = await createTmpDir({ src: ['file1.js'], diff --git a/packages/core/src/utils/filesearch/fileSearch.ts b/packages/core/src/utils/filesearch/fileSearch.ts index db14bc65..76a099f7 100644 --- a/packages/core/src/utils/filesearch/fileSearch.ts +++ b/packages/core/src/utils/filesearch/fileSearch.ts @@ -11,6 +11,7 @@ import picomatch from 'picomatch'; import { Ignore } from './ignore.js'; import { ResultCache } from './result-cache.js'; import * as cache from './crawlCache.js'; +import { Fzf, FzfResultItem } from 'fzf'; export type FileSearchOptions = { projectRoot: string; @@ -77,6 +78,18 @@ export async function filter( return results; } +/** + * Filters a list of paths based on a given pattern using fzf. + * @param allPaths The list of all paths to filter. + * @param pattern The fzf pattern to filter by. + * @returns The filtered and sorted list of paths. + */ +function filterByFzf(allPaths: string[], pattern: string) { + return new Fzf(allPaths) + .find(pattern) + .map((entry: FzfResultItem) => entry.item); +} + export type SearchOptions = { signal?: AbortSignal; maxResults?: number; @@ -137,7 +150,9 @@ export class FileSearch { filteredCandidates = candidates; } else { // Apply the user's picomatch pattern filter - filteredCandidates = await filter(candidates, pattern, options.signal); + filteredCandidates = pattern.includes('*') + ? await filter(candidates, pattern, options.signal) + : filterByFzf(this.allFiles, pattern); this.resultCache!.set(pattern, filteredCandidates); } |
