summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/hooks
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src/ui/hooks')
-rw-r--r--packages/cli/src/ui/hooks/useCompletion.integration.test.ts30
-rw-r--r--packages/cli/src/ui/hooks/useCompletion.ts8
2 files changed, 37 insertions, 1 deletions
diff --git a/packages/cli/src/ui/hooks/useCompletion.integration.test.ts b/packages/cli/src/ui/hooks/useCompletion.integration.test.ts
index 40af5d4f..237b6aae 100644
--- a/packages/cli/src/ui/hooks/useCompletion.integration.test.ts
+++ b/packages/cli/src/ui/hooks/useCompletion.integration.test.ts
@@ -47,6 +47,7 @@ describe('useCompletion git-aware filtering integration', () => {
mockConfig = {
getFileFilteringRespectGitIgnore: vi.fn(() => true),
getFileService: vi.fn().mockReturnValue(mockFileDiscoveryService),
+ getEnableRecursiveFileSearch: vi.fn(() => true),
};
vi.mocked(FileDiscoveryService).mockImplementation(
@@ -170,6 +171,35 @@ describe('useCompletion git-aware filtering integration', () => {
);
});
+ it('should not perform recursive search when disabled in config', async () => {
+ const globResults = [`${testCwd}/data`, `${testCwd}/dist`];
+ vi.mocked(glob).mockResolvedValue(globResults);
+
+ // Disable recursive search in the mock config
+ const mockConfigNoRecursive = {
+ ...mockConfig,
+ getEnableRecursiveFileSearch: vi.fn(() => false),
+ };
+
+ vi.mocked(fs.readdir).mockResolvedValue([
+ { name: 'data', isDirectory: () => true },
+ { name: 'dist', isDirectory: () => true },
+ ] as Array<{ name: string; isDirectory: () => boolean }>);
+
+ renderHook(() =>
+ useCompletion('@d', testCwd, true, slashCommands, mockConfigNoRecursive),
+ );
+
+ await act(async () => {
+ await new Promise((resolve) => setTimeout(resolve, 150));
+ });
+
+ // `glob` should not be called because recursive search is disabled
+ expect(glob).not.toHaveBeenCalled();
+ // `fs.readdir` should be called for the top-level directory instead
+ expect(fs.readdir).toHaveBeenCalledWith(testCwd, { withFileTypes: true });
+ });
+
it('should work without config (fallback behavior)', async () => {
vi.mocked(fs.readdir).mockResolvedValue([
{ name: 'src', isDirectory: () => true },
diff --git a/packages/cli/src/ui/hooks/useCompletion.ts b/packages/cli/src/ui/hooks/useCompletion.ts
index 7cbe8a7e..eef54fc8 100644
--- a/packages/cli/src/ui/hooks/useCompletion.ts
+++ b/packages/cli/src/ui/hooks/useCompletion.ts
@@ -322,10 +322,16 @@ export function useCompletion(
let fetchedSuggestions: Suggestion[] = [];
const fileDiscoveryService = config ? config.getFileService() : null;
+ const enableRecursiveSearch =
+ config?.getEnableRecursiveFileSearch() ?? true;
try {
// If there's no slash, or it's the root, do a recursive search from cwd
- if (partialPath.indexOf('/') === -1 && prefix) {
+ if (
+ partialPath.indexOf('/') === -1 &&
+ prefix &&
+ enableRecursiveSearch
+ ) {
if (fileDiscoveryService) {
fetchedSuggestions = await findFilesWithGlob(
prefix,