@google/gemini-cli-core 0.1.17 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/google-gemini-cli-core-0.1.17.tgz +0 -0
- package/dist/src/config/config.d.ts +5 -4
- package/dist/src/config/config.js +25 -8
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +0 -2
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +0 -4
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +2 -0
- package/dist/src/core/coreToolScheduler.js +3 -1
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +4 -0
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +8 -11
- package/dist/src/ide/ide-client.js +55 -58
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +1 -0
- package/dist/src/mcp/oauth-provider.js +14 -1
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +87 -6
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/prompts/prompt-registry.d.ts +8 -0
- package/dist/src/prompts/prompt-registry.js +16 -0
- package/dist/src/prompts/prompt-registry.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +11 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +5 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +1 -0
- package/dist/src/telemetry/constants.js +1 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +2 -1
- package/dist/src/telemetry/loggers.js +17 -1
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/telemetry.test.js +0 -2
- package/dist/src/telemetry/telemetry.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +11 -1
- package/dist/src/telemetry/types.js +15 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/tools/mcp-client.js +3 -0
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +35 -9
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.js +104 -45
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +280 -2
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/modifiable-tool.d.ts +1 -1
- package/dist/src/tools/modifiable-tool.js +2 -2
- package/dist/src/tools/modifiable-tool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +9 -9
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +78 -34
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +96 -0
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +1 -0
- package/dist/src/tools/tool-registry.js +12 -10
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +6 -4
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/utils/editor.d.ts +1 -1
- package/dist/src/utils/editor.js +13 -5
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +38 -6
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/fileUtils.js +1 -1
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +13 -0
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/filesearch/crawlCache.d.ts +25 -0
- package/dist/src/utils/filesearch/crawlCache.js +54 -0
- package/dist/src/utils/filesearch/crawlCache.js.map +1 -0
- package/dist/src/utils/filesearch/crawlCache.test.d.ts +6 -0
- package/dist/src/utils/filesearch/crawlCache.test.js +93 -0
- package/dist/src/utils/filesearch/crawlCache.test.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.d.ts +79 -0
- package/dist/src/utils/filesearch/fileSearch.js +216 -0
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.test.d.ts +6 -0
- package/dist/src/utils/filesearch/fileSearch.test.js +515 -0
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -0
- package/dist/src/utils/filesearch/ignore.d.ts +35 -0
- package/dist/src/utils/filesearch/ignore.js +81 -0
- package/dist/src/utils/filesearch/ignore.js.map +1 -0
- package/dist/src/utils/filesearch/ignore.test.d.ts +6 -0
- package/dist/src/utils/filesearch/ignore.test.js +57 -0
- package/dist/src/utils/filesearch/ignore.test.js.map +1 -0
- package/dist/src/utils/filesearch/result-cache.d.ts +34 -0
- package/dist/src/utils/filesearch/result-cache.js +61 -0
- package/dist/src/utils/filesearch/result-cache.js.map +1 -0
- package/dist/src/utils/filesearch/result-cache.test.d.ts +6 -0
- package/dist/src/utils/filesearch/result-cache.test.js +47 -0
- package/dist/src/utils/filesearch/result-cache.test.js.map +1 -0
- package/dist/src/utils/flashFallback.integration.test.js +0 -2
- package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +1 -1
- package/dist/src/utils/memoryDiscovery.js +18 -6
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +30 -71
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.d.ts +4 -0
- package/dist/src/utils/workspaceContext.js +33 -0
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -1
- package/dist/google-gemini-cli-core-0.1.16.tgz +0 -0
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as cache from './crawlCache.js';
|
|
10
|
+
import { FileSearch, AbortError, filter } from './fileSearch.js';
|
|
11
|
+
import { createTmpDir, cleanupTmpDir } from '@google/gemini-cli-test-utils';
|
|
12
|
+
describe('FileSearch', () => {
|
|
13
|
+
let tmpDir;
|
|
14
|
+
afterEach(async () => {
|
|
15
|
+
if (tmpDir) {
|
|
16
|
+
await cleanupTmpDir(tmpDir);
|
|
17
|
+
}
|
|
18
|
+
vi.restoreAllMocks();
|
|
19
|
+
});
|
|
20
|
+
it('should use .geminiignore rules', async () => {
|
|
21
|
+
tmpDir = await createTmpDir({
|
|
22
|
+
'.geminiignore': 'dist/',
|
|
23
|
+
dist: ['ignored.js'],
|
|
24
|
+
src: ['not-ignored.js'],
|
|
25
|
+
});
|
|
26
|
+
const fileSearch = new FileSearch({
|
|
27
|
+
projectRoot: tmpDir,
|
|
28
|
+
useGitignore: false,
|
|
29
|
+
useGeminiignore: true,
|
|
30
|
+
ignoreDirs: [],
|
|
31
|
+
cache: false,
|
|
32
|
+
cacheTtl: 0,
|
|
33
|
+
});
|
|
34
|
+
await fileSearch.initialize();
|
|
35
|
+
const results = await fileSearch.search('');
|
|
36
|
+
expect(results).toEqual(['src/', '.geminiignore', 'src/not-ignored.js']);
|
|
37
|
+
});
|
|
38
|
+
it('should combine .gitignore and .geminiignore rules', async () => {
|
|
39
|
+
tmpDir = await createTmpDir({
|
|
40
|
+
'.gitignore': 'dist/',
|
|
41
|
+
'.geminiignore': 'build/',
|
|
42
|
+
dist: ['ignored-by-git.js'],
|
|
43
|
+
build: ['ignored-by-gemini.js'],
|
|
44
|
+
src: ['not-ignored.js'],
|
|
45
|
+
});
|
|
46
|
+
const fileSearch = new FileSearch({
|
|
47
|
+
projectRoot: tmpDir,
|
|
48
|
+
useGitignore: true,
|
|
49
|
+
useGeminiignore: true,
|
|
50
|
+
ignoreDirs: [],
|
|
51
|
+
cache: false,
|
|
52
|
+
cacheTtl: 0,
|
|
53
|
+
});
|
|
54
|
+
await fileSearch.initialize();
|
|
55
|
+
const results = await fileSearch.search('');
|
|
56
|
+
expect(results).toEqual([
|
|
57
|
+
'src/',
|
|
58
|
+
'.geminiignore',
|
|
59
|
+
'.gitignore',
|
|
60
|
+
'src/not-ignored.js',
|
|
61
|
+
]);
|
|
62
|
+
});
|
|
63
|
+
it('should use ignoreDirs option', async () => {
|
|
64
|
+
tmpDir = await createTmpDir({
|
|
65
|
+
logs: ['some.log'],
|
|
66
|
+
src: ['main.js'],
|
|
67
|
+
});
|
|
68
|
+
const fileSearch = new FileSearch({
|
|
69
|
+
projectRoot: tmpDir,
|
|
70
|
+
useGitignore: false,
|
|
71
|
+
useGeminiignore: false,
|
|
72
|
+
ignoreDirs: ['logs'],
|
|
73
|
+
cache: false,
|
|
74
|
+
cacheTtl: 0,
|
|
75
|
+
});
|
|
76
|
+
await fileSearch.initialize();
|
|
77
|
+
const results = await fileSearch.search('');
|
|
78
|
+
expect(results).toEqual(['src/', 'src/main.js']);
|
|
79
|
+
});
|
|
80
|
+
it('should handle negated directories', async () => {
|
|
81
|
+
tmpDir = await createTmpDir({
|
|
82
|
+
'.gitignore': ['build/**', '!build/public', '!build/public/**'].join('\n'),
|
|
83
|
+
build: {
|
|
84
|
+
'private.js': '',
|
|
85
|
+
public: ['index.html'],
|
|
86
|
+
},
|
|
87
|
+
src: ['main.js'],
|
|
88
|
+
});
|
|
89
|
+
const fileSearch = new FileSearch({
|
|
90
|
+
projectRoot: tmpDir,
|
|
91
|
+
useGitignore: true,
|
|
92
|
+
useGeminiignore: false,
|
|
93
|
+
ignoreDirs: [],
|
|
94
|
+
cache: false,
|
|
95
|
+
cacheTtl: 0,
|
|
96
|
+
});
|
|
97
|
+
await fileSearch.initialize();
|
|
98
|
+
const results = await fileSearch.search('');
|
|
99
|
+
expect(results).toEqual([
|
|
100
|
+
'build/',
|
|
101
|
+
'build/public/',
|
|
102
|
+
'src/',
|
|
103
|
+
'.gitignore',
|
|
104
|
+
'build/public/index.html',
|
|
105
|
+
'src/main.js',
|
|
106
|
+
]);
|
|
107
|
+
});
|
|
108
|
+
it('should filter results with a search pattern', async () => {
|
|
109
|
+
tmpDir = await createTmpDir({
|
|
110
|
+
src: {
|
|
111
|
+
'main.js': '',
|
|
112
|
+
'util.ts': '',
|
|
113
|
+
'style.css': '',
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
const fileSearch = new FileSearch({
|
|
117
|
+
projectRoot: tmpDir,
|
|
118
|
+
useGitignore: false,
|
|
119
|
+
useGeminiignore: false,
|
|
120
|
+
ignoreDirs: [],
|
|
121
|
+
cache: false,
|
|
122
|
+
cacheTtl: 0,
|
|
123
|
+
});
|
|
124
|
+
await fileSearch.initialize();
|
|
125
|
+
const results = await fileSearch.search('**/*.js');
|
|
126
|
+
expect(results).toEqual(['src/main.js']);
|
|
127
|
+
});
|
|
128
|
+
it('should handle root-level file negation', async () => {
|
|
129
|
+
tmpDir = await createTmpDir({
|
|
130
|
+
'.gitignore': ['*.mk', '!Foo.mk'].join('\n'),
|
|
131
|
+
'bar.mk': '',
|
|
132
|
+
'Foo.mk': '',
|
|
133
|
+
});
|
|
134
|
+
const fileSearch = new FileSearch({
|
|
135
|
+
projectRoot: tmpDir,
|
|
136
|
+
useGitignore: true,
|
|
137
|
+
useGeminiignore: false,
|
|
138
|
+
ignoreDirs: [],
|
|
139
|
+
cache: false,
|
|
140
|
+
cacheTtl: 0,
|
|
141
|
+
});
|
|
142
|
+
await fileSearch.initialize();
|
|
143
|
+
const results = await fileSearch.search('');
|
|
144
|
+
expect(results).toEqual(['.gitignore', 'Foo.mk']);
|
|
145
|
+
});
|
|
146
|
+
it('should handle directory negation with glob', async () => {
|
|
147
|
+
tmpDir = await createTmpDir({
|
|
148
|
+
'.gitignore': [
|
|
149
|
+
'third_party/**',
|
|
150
|
+
'!third_party/foo',
|
|
151
|
+
'!third_party/foo/bar',
|
|
152
|
+
'!third_party/foo/bar/baz_buffer',
|
|
153
|
+
].join('\n'),
|
|
154
|
+
third_party: {
|
|
155
|
+
foo: {
|
|
156
|
+
bar: {
|
|
157
|
+
baz_buffer: '',
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
ignore_this: '',
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
const fileSearch = new FileSearch({
|
|
164
|
+
projectRoot: tmpDir,
|
|
165
|
+
useGitignore: true,
|
|
166
|
+
useGeminiignore: false,
|
|
167
|
+
ignoreDirs: [],
|
|
168
|
+
cache: false,
|
|
169
|
+
cacheTtl: 0,
|
|
170
|
+
});
|
|
171
|
+
await fileSearch.initialize();
|
|
172
|
+
const results = await fileSearch.search('');
|
|
173
|
+
expect(results).toEqual([
|
|
174
|
+
'third_party/',
|
|
175
|
+
'third_party/foo/',
|
|
176
|
+
'third_party/foo/bar/',
|
|
177
|
+
'.gitignore',
|
|
178
|
+
'third_party/foo/bar/baz_buffer',
|
|
179
|
+
]);
|
|
180
|
+
});
|
|
181
|
+
it('should correctly handle negated patterns in .gitignore', async () => {
|
|
182
|
+
tmpDir = await createTmpDir({
|
|
183
|
+
'.gitignore': ['dist/**', '!dist/keep.js'].join('\n'),
|
|
184
|
+
dist: ['ignore.js', 'keep.js'],
|
|
185
|
+
src: ['main.js'],
|
|
186
|
+
});
|
|
187
|
+
const fileSearch = new FileSearch({
|
|
188
|
+
projectRoot: tmpDir,
|
|
189
|
+
useGitignore: true,
|
|
190
|
+
useGeminiignore: false,
|
|
191
|
+
ignoreDirs: [],
|
|
192
|
+
cache: false,
|
|
193
|
+
cacheTtl: 0,
|
|
194
|
+
});
|
|
195
|
+
await fileSearch.initialize();
|
|
196
|
+
const results = await fileSearch.search('');
|
|
197
|
+
expect(results).toEqual([
|
|
198
|
+
'dist/',
|
|
199
|
+
'src/',
|
|
200
|
+
'.gitignore',
|
|
201
|
+
'dist/keep.js',
|
|
202
|
+
'src/main.js',
|
|
203
|
+
]);
|
|
204
|
+
});
|
|
205
|
+
// New test cases start here
|
|
206
|
+
it('should initialize correctly when ignore files are missing', async () => {
|
|
207
|
+
tmpDir = await createTmpDir({
|
|
208
|
+
src: ['file1.js'],
|
|
209
|
+
});
|
|
210
|
+
const fileSearch = new FileSearch({
|
|
211
|
+
projectRoot: tmpDir,
|
|
212
|
+
useGitignore: true,
|
|
213
|
+
useGeminiignore: true,
|
|
214
|
+
ignoreDirs: [],
|
|
215
|
+
cache: false,
|
|
216
|
+
cacheTtl: 0,
|
|
217
|
+
});
|
|
218
|
+
// Expect no errors to be thrown during initialization
|
|
219
|
+
await expect(fileSearch.initialize()).resolves.toBeUndefined();
|
|
220
|
+
const results = await fileSearch.search('');
|
|
221
|
+
expect(results).toEqual(['src/', 'src/file1.js']);
|
|
222
|
+
});
|
|
223
|
+
it('should respect maxResults option in search', async () => {
|
|
224
|
+
tmpDir = await createTmpDir({
|
|
225
|
+
src: {
|
|
226
|
+
'file1.js': '',
|
|
227
|
+
'file2.js': '',
|
|
228
|
+
'file3.js': '',
|
|
229
|
+
'file4.js': '',
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
const fileSearch = new FileSearch({
|
|
233
|
+
projectRoot: tmpDir,
|
|
234
|
+
useGitignore: false,
|
|
235
|
+
useGeminiignore: false,
|
|
236
|
+
ignoreDirs: [],
|
|
237
|
+
cache: false,
|
|
238
|
+
cacheTtl: 0,
|
|
239
|
+
});
|
|
240
|
+
await fileSearch.initialize();
|
|
241
|
+
const results = await fileSearch.search('**/*.js', { maxResults: 2 });
|
|
242
|
+
expect(results).toEqual(['src/file1.js', 'src/file2.js']); // Assuming alphabetical sort
|
|
243
|
+
});
|
|
244
|
+
it('should return empty array when no matches are found', async () => {
|
|
245
|
+
tmpDir = await createTmpDir({
|
|
246
|
+
src: ['file1.js'],
|
|
247
|
+
});
|
|
248
|
+
const fileSearch = new FileSearch({
|
|
249
|
+
projectRoot: tmpDir,
|
|
250
|
+
useGitignore: false,
|
|
251
|
+
useGeminiignore: false,
|
|
252
|
+
ignoreDirs: [],
|
|
253
|
+
cache: false,
|
|
254
|
+
cacheTtl: 0,
|
|
255
|
+
});
|
|
256
|
+
await fileSearch.initialize();
|
|
257
|
+
const results = await fileSearch.search('nonexistent-file.xyz');
|
|
258
|
+
expect(results).toEqual([]);
|
|
259
|
+
});
|
|
260
|
+
it('should throw AbortError when filter is aborted', async () => {
|
|
261
|
+
const controller = new AbortController();
|
|
262
|
+
const dummyPaths = Array.from({ length: 5000 }, (_, i) => `file${i}.js`); // Large array to ensure yielding
|
|
263
|
+
const filterPromise = filter(dummyPaths, '*.js', controller.signal);
|
|
264
|
+
// Abort after a short delay to ensure filter has started
|
|
265
|
+
setTimeout(() => controller.abort(), 1);
|
|
266
|
+
await expect(filterPromise).rejects.toThrow(AbortError);
|
|
267
|
+
});
|
|
268
|
+
describe('with in-memory cache', () => {
|
|
269
|
+
beforeEach(() => {
|
|
270
|
+
cache.clear();
|
|
271
|
+
});
|
|
272
|
+
afterEach(() => {
|
|
273
|
+
vi.useRealTimers();
|
|
274
|
+
});
|
|
275
|
+
it('should throw an error if search is called before initialization', async () => {
|
|
276
|
+
tmpDir = await createTmpDir({});
|
|
277
|
+
const fileSearch = new FileSearch({
|
|
278
|
+
projectRoot: tmpDir,
|
|
279
|
+
useGitignore: false,
|
|
280
|
+
useGeminiignore: false,
|
|
281
|
+
ignoreDirs: [],
|
|
282
|
+
cache: false,
|
|
283
|
+
cacheTtl: 0,
|
|
284
|
+
});
|
|
285
|
+
await expect(fileSearch.search('')).rejects.toThrow('Engine not initialized. Call initialize() first.');
|
|
286
|
+
});
|
|
287
|
+
it('should hit the cache for subsequent searches', async () => {
|
|
288
|
+
tmpDir = await createTmpDir({ 'file1.js': '' });
|
|
289
|
+
const getOptions = () => ({
|
|
290
|
+
projectRoot: tmpDir,
|
|
291
|
+
useGitignore: false,
|
|
292
|
+
useGeminiignore: false,
|
|
293
|
+
ignoreDirs: [],
|
|
294
|
+
cache: true,
|
|
295
|
+
cacheTtl: 10,
|
|
296
|
+
});
|
|
297
|
+
const fs1 = new FileSearch(getOptions());
|
|
298
|
+
const crawlSpy1 = vi.spyOn(fs1, 'performCrawl');
|
|
299
|
+
await fs1.initialize();
|
|
300
|
+
expect(crawlSpy1).toHaveBeenCalledTimes(1);
|
|
301
|
+
// Second search should hit the cache because the options are identical
|
|
302
|
+
const fs2 = new FileSearch(getOptions());
|
|
303
|
+
const crawlSpy2 = vi.spyOn(fs2, 'performCrawl');
|
|
304
|
+
await fs2.initialize();
|
|
305
|
+
expect(crawlSpy2).not.toHaveBeenCalled();
|
|
306
|
+
});
|
|
307
|
+
it('should miss the cache when ignore rules change', async () => {
|
|
308
|
+
tmpDir = await createTmpDir({
|
|
309
|
+
'.gitignore': 'a.txt',
|
|
310
|
+
'a.txt': '',
|
|
311
|
+
'b.txt': '',
|
|
312
|
+
});
|
|
313
|
+
const options = {
|
|
314
|
+
projectRoot: tmpDir,
|
|
315
|
+
useGitignore: true,
|
|
316
|
+
useGeminiignore: false,
|
|
317
|
+
ignoreDirs: [],
|
|
318
|
+
cache: true,
|
|
319
|
+
cacheTtl: 10000,
|
|
320
|
+
};
|
|
321
|
+
// Initial search to populate the cache
|
|
322
|
+
const fs1 = new FileSearch(options);
|
|
323
|
+
const crawlSpy1 = vi.spyOn(fs1, 'performCrawl');
|
|
324
|
+
await fs1.initialize();
|
|
325
|
+
const results1 = await fs1.search('');
|
|
326
|
+
expect(crawlSpy1).toHaveBeenCalledTimes(1);
|
|
327
|
+
expect(results1).toEqual(['.gitignore', 'b.txt']);
|
|
328
|
+
// Modify the ignore file
|
|
329
|
+
await fs.writeFile(path.join(tmpDir, '.gitignore'), 'b.txt');
|
|
330
|
+
// Second search should miss the cache and trigger a recrawl
|
|
331
|
+
const fs2 = new FileSearch(options);
|
|
332
|
+
const crawlSpy2 = vi.spyOn(fs2, 'performCrawl');
|
|
333
|
+
await fs2.initialize();
|
|
334
|
+
const results2 = await fs2.search('');
|
|
335
|
+
expect(crawlSpy2).toHaveBeenCalledTimes(1);
|
|
336
|
+
expect(results2).toEqual(['.gitignore', 'a.txt']);
|
|
337
|
+
});
|
|
338
|
+
it('should miss the cache after TTL expires', async () => {
|
|
339
|
+
vi.useFakeTimers();
|
|
340
|
+
tmpDir = await createTmpDir({ 'file1.js': '' });
|
|
341
|
+
const options = {
|
|
342
|
+
projectRoot: tmpDir,
|
|
343
|
+
useGitignore: false,
|
|
344
|
+
useGeminiignore: false,
|
|
345
|
+
ignoreDirs: [],
|
|
346
|
+
cache: true,
|
|
347
|
+
cacheTtl: 10, // 10 seconds
|
|
348
|
+
};
|
|
349
|
+
// Initial search to populate the cache
|
|
350
|
+
const fs1 = new FileSearch(options);
|
|
351
|
+
await fs1.initialize();
|
|
352
|
+
// Advance time past the TTL
|
|
353
|
+
await vi.advanceTimersByTimeAsync(11000);
|
|
354
|
+
// Second search should miss the cache and trigger a recrawl
|
|
355
|
+
const fs2 = new FileSearch(options);
|
|
356
|
+
const crawlSpy = vi.spyOn(fs2, 'performCrawl');
|
|
357
|
+
await fs2.initialize();
|
|
358
|
+
expect(crawlSpy).toHaveBeenCalledTimes(1);
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
it('should handle empty or commented-only ignore files', async () => {
|
|
362
|
+
tmpDir = await createTmpDir({
|
|
363
|
+
'.gitignore': '# This is a comment\n\n \n',
|
|
364
|
+
src: ['main.js'],
|
|
365
|
+
});
|
|
366
|
+
const fileSearch = new FileSearch({
|
|
367
|
+
projectRoot: tmpDir,
|
|
368
|
+
useGitignore: true,
|
|
369
|
+
useGeminiignore: false,
|
|
370
|
+
ignoreDirs: [],
|
|
371
|
+
cache: false,
|
|
372
|
+
cacheTtl: 0,
|
|
373
|
+
});
|
|
374
|
+
await fileSearch.initialize();
|
|
375
|
+
const results = await fileSearch.search('');
|
|
376
|
+
expect(results).toEqual(['src/', '.gitignore', 'src/main.js']);
|
|
377
|
+
});
|
|
378
|
+
it('should always ignore the .git directory', async () => {
|
|
379
|
+
tmpDir = await createTmpDir({
|
|
380
|
+
'.git': ['config', 'HEAD'],
|
|
381
|
+
src: ['main.js'],
|
|
382
|
+
});
|
|
383
|
+
const fileSearch = new FileSearch({
|
|
384
|
+
projectRoot: tmpDir,
|
|
385
|
+
useGitignore: false, // Explicitly disable .gitignore to isolate this rule
|
|
386
|
+
useGeminiignore: false,
|
|
387
|
+
ignoreDirs: [],
|
|
388
|
+
cache: false,
|
|
389
|
+
cacheTtl: 0,
|
|
390
|
+
});
|
|
391
|
+
await fileSearch.initialize();
|
|
392
|
+
const results = await fileSearch.search('');
|
|
393
|
+
expect(results).toEqual(['src/', 'src/main.js']);
|
|
394
|
+
});
|
|
395
|
+
it('should be cancellable via AbortSignal', async () => {
|
|
396
|
+
const largeDir = {};
|
|
397
|
+
for (let i = 0; i < 100; i++) {
|
|
398
|
+
largeDir[`file${i}.js`] = '';
|
|
399
|
+
}
|
|
400
|
+
tmpDir = await createTmpDir(largeDir);
|
|
401
|
+
const fileSearch = new FileSearch({
|
|
402
|
+
projectRoot: tmpDir,
|
|
403
|
+
useGitignore: false,
|
|
404
|
+
useGeminiignore: false,
|
|
405
|
+
ignoreDirs: [],
|
|
406
|
+
cache: false,
|
|
407
|
+
cacheTtl: 0,
|
|
408
|
+
});
|
|
409
|
+
await fileSearch.initialize();
|
|
410
|
+
const controller = new AbortController();
|
|
411
|
+
const searchPromise = fileSearch.search('**/*.js', {
|
|
412
|
+
signal: controller.signal,
|
|
413
|
+
});
|
|
414
|
+
// Yield to allow the search to start before aborting.
|
|
415
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
416
|
+
controller.abort();
|
|
417
|
+
await expect(searchPromise).rejects.toThrow(AbortError);
|
|
418
|
+
});
|
|
419
|
+
it('should leverage ResultCache for bestBaseQuery optimization', async () => {
|
|
420
|
+
tmpDir = await createTmpDir({
|
|
421
|
+
src: {
|
|
422
|
+
'foo.js': '',
|
|
423
|
+
'bar.ts': '',
|
|
424
|
+
nested: {
|
|
425
|
+
'baz.js': '',
|
|
426
|
+
},
|
|
427
|
+
},
|
|
428
|
+
});
|
|
429
|
+
const fileSearch = new FileSearch({
|
|
430
|
+
projectRoot: tmpDir,
|
|
431
|
+
useGitignore: false,
|
|
432
|
+
useGeminiignore: false,
|
|
433
|
+
ignoreDirs: [],
|
|
434
|
+
cache: true, // Enable caching for this test
|
|
435
|
+
cacheTtl: 0,
|
|
436
|
+
});
|
|
437
|
+
await fileSearch.initialize();
|
|
438
|
+
// Perform a broad search to prime the cache
|
|
439
|
+
const broadResults = await fileSearch.search('src/**');
|
|
440
|
+
expect(broadResults).toEqual([
|
|
441
|
+
'src/',
|
|
442
|
+
'src/nested/',
|
|
443
|
+
'src/bar.ts',
|
|
444
|
+
'src/foo.js',
|
|
445
|
+
'src/nested/baz.js',
|
|
446
|
+
]);
|
|
447
|
+
// Perform a more specific search that should leverage the broad search's cached results
|
|
448
|
+
const specificResults = await fileSearch.search('src/**/*.js');
|
|
449
|
+
expect(specificResults).toEqual(['src/foo.js', 'src/nested/baz.js']);
|
|
450
|
+
// Although we can't directly inspect ResultCache.hits/misses from here,
|
|
451
|
+
// the correctness of specificResults after a broad search implicitly
|
|
452
|
+
// verifies that the caching mechanism, including bestBaseQuery, is working.
|
|
453
|
+
});
|
|
454
|
+
it('should be case-insensitive by default', async () => {
|
|
455
|
+
tmpDir = await createTmpDir({
|
|
456
|
+
'File1.Js': '',
|
|
457
|
+
'file2.js': '',
|
|
458
|
+
'FILE3.JS': '',
|
|
459
|
+
'other.txt': '',
|
|
460
|
+
});
|
|
461
|
+
const fileSearch = new FileSearch({
|
|
462
|
+
projectRoot: tmpDir,
|
|
463
|
+
useGitignore: false,
|
|
464
|
+
useGeminiignore: false,
|
|
465
|
+
ignoreDirs: [],
|
|
466
|
+
cache: false,
|
|
467
|
+
cacheTtl: 0,
|
|
468
|
+
});
|
|
469
|
+
await fileSearch.initialize();
|
|
470
|
+
// Search with a lowercase pattern
|
|
471
|
+
let results = await fileSearch.search('file*.js');
|
|
472
|
+
expect(results).toHaveLength(3);
|
|
473
|
+
expect(results).toEqual(expect.arrayContaining(['File1.Js', 'file2.js', 'FILE3.JS']));
|
|
474
|
+
// Search with an uppercase pattern
|
|
475
|
+
results = await fileSearch.search('FILE*.JS');
|
|
476
|
+
expect(results).toHaveLength(3);
|
|
477
|
+
expect(results).toEqual(expect.arrayContaining(['File1.Js', 'file2.js', 'FILE3.JS']));
|
|
478
|
+
// Search with a mixed-case pattern
|
|
479
|
+
results = await fileSearch.search('FiLe*.Js');
|
|
480
|
+
expect(results).toHaveLength(3);
|
|
481
|
+
expect(results).toEqual(expect.arrayContaining(['File1.Js', 'file2.js', 'FILE3.JS']));
|
|
482
|
+
});
|
|
483
|
+
it('should respect maxResults even when the cache returns an exact match', async () => {
|
|
484
|
+
tmpDir = await createTmpDir({
|
|
485
|
+
'file1.js': '',
|
|
486
|
+
'file2.js': '',
|
|
487
|
+
'file3.js': '',
|
|
488
|
+
'file4.js': '',
|
|
489
|
+
'file5.js': '',
|
|
490
|
+
});
|
|
491
|
+
const fileSearch = new FileSearch({
|
|
492
|
+
projectRoot: tmpDir,
|
|
493
|
+
useGitignore: false,
|
|
494
|
+
useGeminiignore: false,
|
|
495
|
+
ignoreDirs: [],
|
|
496
|
+
cache: true, // Ensure caching is enabled
|
|
497
|
+
cacheTtl: 10000,
|
|
498
|
+
});
|
|
499
|
+
await fileSearch.initialize();
|
|
500
|
+
// 1. Perform a broad search to populate the cache with an exact match.
|
|
501
|
+
const initialResults = await fileSearch.search('*.js');
|
|
502
|
+
expect(initialResults).toEqual([
|
|
503
|
+
'file1.js',
|
|
504
|
+
'file2.js',
|
|
505
|
+
'file3.js',
|
|
506
|
+
'file4.js',
|
|
507
|
+
'file5.js',
|
|
508
|
+
]);
|
|
509
|
+
// 2. Perform the same search again, but this time with a maxResults limit.
|
|
510
|
+
const limitedResults = await fileSearch.search('*.js', { maxResults: 2 });
|
|
511
|
+
// 3. Assert that the maxResults limit was respected, even with a cache hit.
|
|
512
|
+
expect(limitedResults).toEqual(['file1.js', 'file2.js']);
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
//# sourceMappingURL=fileSearch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileSearch.test.js","sourceRoot":"","sources":["../../../../src/utils/filesearch/fileSearch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export declare class Ignore {
|
|
7
|
+
private readonly allPatterns;
|
|
8
|
+
private dirIgnorer;
|
|
9
|
+
private fileIgnorer;
|
|
10
|
+
/**
|
|
11
|
+
* Adds one or more ignore patterns.
|
|
12
|
+
* @param patterns A single pattern string or an array of pattern strings.
|
|
13
|
+
* Each pattern can be a glob-like string similar to .gitignore rules.
|
|
14
|
+
* @returns The `Ignore` instance for chaining.
|
|
15
|
+
*/
|
|
16
|
+
add(patterns: string | string[]): this;
|
|
17
|
+
/**
|
|
18
|
+
* Returns a predicate that matches explicit directory ignore patterns (patterns ending with '/').
|
|
19
|
+
* @returns {(dirPath: string) => boolean}
|
|
20
|
+
*/
|
|
21
|
+
getDirectoryFilter(): (dirPath: string) => boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Returns a predicate that matches file ignore patterns (all patterns not ending with '/').
|
|
24
|
+
* Note: This may also match directories if a file pattern matches a directory name, but all explicit directory patterns are handled by getDirectoryFilter.
|
|
25
|
+
* @returns {(filePath: string) => boolean}
|
|
26
|
+
*/
|
|
27
|
+
getFileFilter(): (filePath: string) => boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Returns a string representing the current set of ignore patterns.
|
|
30
|
+
* This can be used to generate a unique identifier for the ignore configuration,
|
|
31
|
+
* useful for caching purposes.
|
|
32
|
+
* @returns A string fingerprint of the ignore patterns.
|
|
33
|
+
*/
|
|
34
|
+
getFingerprint(): string;
|
|
35
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import ignore from 'ignore';
|
|
7
|
+
import picomatch from 'picomatch';
|
|
8
|
+
const hasFileExtension = picomatch('**/*[*.]*');
|
|
9
|
+
export class Ignore {
|
|
10
|
+
allPatterns = [];
|
|
11
|
+
dirIgnorer = ignore();
|
|
12
|
+
fileIgnorer = ignore();
|
|
13
|
+
/**
|
|
14
|
+
* Adds one or more ignore patterns.
|
|
15
|
+
* @param patterns A single pattern string or an array of pattern strings.
|
|
16
|
+
* Each pattern can be a glob-like string similar to .gitignore rules.
|
|
17
|
+
* @returns The `Ignore` instance for chaining.
|
|
18
|
+
*/
|
|
19
|
+
add(patterns) {
|
|
20
|
+
if (typeof patterns === 'string') {
|
|
21
|
+
patterns = patterns.split(/\r?\n/);
|
|
22
|
+
}
|
|
23
|
+
for (const p of patterns) {
|
|
24
|
+
const pattern = p.trim();
|
|
25
|
+
if (pattern === '' || pattern.startsWith('#')) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
this.allPatterns.push(pattern);
|
|
29
|
+
const isPositiveDirPattern = pattern.endsWith('/') && !pattern.startsWith('!');
|
|
30
|
+
if (isPositiveDirPattern) {
|
|
31
|
+
this.dirIgnorer.add(pattern);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// An ambiguous pattern (e.g., "build") could match a file or a
|
|
35
|
+
// directory. To optimize the file system crawl, we use a heuristic:
|
|
36
|
+
// patterns without a dot in the last segment are included in the
|
|
37
|
+
// directory exclusion check.
|
|
38
|
+
//
|
|
39
|
+
// This heuristic can fail. For example, an ignore pattern of "my.assets"
|
|
40
|
+
// intended to exclude a directory will not be treated as a directory
|
|
41
|
+
// pattern because it contains a ".". This results in crawling a
|
|
42
|
+
// directory that should have been excluded, reducing efficiency.
|
|
43
|
+
// Correctness is still maintained. The incorrectly crawled directory
|
|
44
|
+
// will be filtered out by the final ignore check.
|
|
45
|
+
//
|
|
46
|
+
// For maximum crawl efficiency, users should explicitly mark directory
|
|
47
|
+
// patterns with a trailing slash (e.g., "my.assets/").
|
|
48
|
+
this.fileIgnorer.add(pattern);
|
|
49
|
+
if (!hasFileExtension(pattern)) {
|
|
50
|
+
this.dirIgnorer.add(pattern);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Returns a predicate that matches explicit directory ignore patterns (patterns ending with '/').
|
|
58
|
+
* @returns {(dirPath: string) => boolean}
|
|
59
|
+
*/
|
|
60
|
+
getDirectoryFilter() {
|
|
61
|
+
return (dirPath) => this.dirIgnorer.ignores(dirPath);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns a predicate that matches file ignore patterns (all patterns not ending with '/').
|
|
65
|
+
* Note: This may also match directories if a file pattern matches a directory name, but all explicit directory patterns are handled by getDirectoryFilter.
|
|
66
|
+
* @returns {(filePath: string) => boolean}
|
|
67
|
+
*/
|
|
68
|
+
getFileFilter() {
|
|
69
|
+
return (filePath) => this.fileIgnorer.ignores(filePath);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Returns a string representing the current set of ignore patterns.
|
|
73
|
+
* This can be used to generate a unique identifier for the ignore configuration,
|
|
74
|
+
* useful for caching purposes.
|
|
75
|
+
* @returns A string fingerprint of the ignore patterns.
|
|
76
|
+
*/
|
|
77
|
+
getFingerprint() {
|
|
78
|
+
return this.allPatterns.join('\n');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=ignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../../../src/utils/filesearch/ignore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,SAAS,MAAM,WAAW,CAAC;AAElC,MAAM,gBAAgB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;AAEhD,MAAM,OAAO,MAAM;IACA,WAAW,GAAa,EAAE,CAAC;IACpC,UAAU,GAAG,MAAM,EAAE,CAAC;IACtB,WAAW,GAAG,MAAM,EAAE,CAAC;IAE/B;;;;;OAKG;IACH,GAAG,CAAC,QAA2B;QAC7B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAEzB,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE/B,MAAM,oBAAoB,GACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAEpD,IAAI,oBAAoB,EAAE,CAAC;gBACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,oEAAoE;gBACpE,iEAAiE;gBACjE,6BAA6B;gBAC7B,EAAE;gBACF,yEAAyE;gBACzE,qEAAqE;gBACrE,gEAAgE;gBAChE,iEAAiE;gBACjE,qEAAqE;gBACrE,kDAAkD;gBAClD,EAAE;gBACF,uEAAuE;gBACvE,uDAAuD;gBACvD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC9B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,OAAO,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,OAAO,CAAC,QAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED;;;;;OAKG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;CACF"}
|