@google/gemini-cli-core 0.1.12 → 0.1.13-nightly.250727.3e81359c
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 +30 -3
- package/dist/google-gemini-cli-core-0.1.13.tgz +0 -0
- package/dist/src/code_assist/codeAssist.js +2 -2
- package/dist/src/code_assist/codeAssist.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +46 -5
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +107 -10
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +4 -6
- package/dist/src/code_assist/server.js +4 -69
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +10 -2
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/setup.d.ts +6 -1
- package/dist/src/code_assist/setup.js +4 -1
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +4 -1
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +2 -2
- package/dist/src/config/config.d.ts +55 -11
- package/dist/src/config/config.js +85 -33
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +29 -26
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +1 -1
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/core/client.d.ts +8 -3
- package/dist/src/core/client.js +62 -3
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +145 -37
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +3 -2
- package/dist/src/core/contentGenerator.js +5 -4
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +12 -5
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +14 -1
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +84 -2
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +4 -3
- package/dist/src/core/geminiChat.js +8 -11
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiRequest.js +2 -37
- package/dist/src/core/geminiRequest.js.map +1 -1
- package/dist/src/core/logger.js +6 -0
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +1 -1
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/modelCheck.d.ts +1 -1
- package/dist/src/core/modelCheck.js +10 -3
- package/dist/src/core/modelCheck.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +8 -5
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +42 -18
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +121 -4
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +12 -3
- package/dist/src/core/turn.js +10 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +129 -0
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +28 -0
- package/dist/src/ide/ide-client.js +88 -0
- package/dist/src/ide/ide-client.js.map +1 -0
- package/dist/src/ide/ideContext.d.ts +174 -0
- package/dist/src/ide/ideContext.js +101 -0
- package/dist/src/ide/ideContext.js.map +1 -0
- package/dist/src/ide/ideContext.test.js +111 -0
- package/dist/src/ide/ideContext.test.js.map +1 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.d.ts +23 -0
- package/dist/src/mcp/google-auth-provider.js +63 -0
- package/dist/src/mcp/google-auth-provider.js.map +1 -0
- package/dist/src/mcp/google-auth-provider.test.d.ts +6 -0
- package/dist/src/mcp/google-auth-provider.test.js +54 -0
- package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
- package/dist/src/mcp/oauth-provider.d.ts +142 -0
- package/dist/src/mcp/oauth-provider.js +446 -0
- package/dist/src/mcp/oauth-provider.js.map +1 -0
- package/dist/src/mcp/oauth-provider.test.d.ts +6 -0
- package/dist/src/mcp/oauth-provider.test.js +520 -0
- package/dist/src/mcp/oauth-provider.test.js.map +1 -0
- package/dist/src/mcp/oauth-token-storage.d.ts +81 -0
- package/dist/src/mcp/oauth-token-storage.js +149 -0
- package/dist/src/mcp/oauth-token-storage.js.map +1 -0
- package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
- package/dist/src/mcp/oauth-token-storage.test.js +205 -0
- package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
- package/dist/src/mcp/oauth-utils.d.ts +109 -0
- package/dist/src/mcp/oauth-utils.js +183 -0
- package/dist/src/mcp/oauth-utils.js.map +1 -0
- package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
- package/dist/src/mcp/oauth-utils.test.js +144 -0
- package/dist/src/mcp/oauth-utils.test.js.map +1 -0
- package/dist/src/prompts/mcp-prompts.d.ts +8 -0
- package/dist/src/prompts/mcp-prompts.js +13 -0
- package/dist/src/prompts/mcp-prompts.js.map +1 -0
- package/dist/src/prompts/prompt-registry.d.ts +26 -0
- package/dist/src/prompts/prompt-registry.js +47 -0
- package/dist/src/prompts/prompt-registry.js.map +1 -0
- package/dist/src/services/fileDiscoveryService.test.js +101 -60
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
- package/dist/src/services/gitService.js +1 -5
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +68 -92
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.d.ts +94 -0
- package/dist/src/services/loopDetectionService.js +318 -0
- package/dist/src/services/loopDetectionService.js.map +1 -0
- package/dist/src/services/loopDetectionService.test.d.ts +6 -0
- package/dist/src/services/loopDetectionService.test.js +266 -0
- package/dist/src/services/loopDetectionService.test.js.map +1 -0
- package/dist/src/services/shellExecutionService.d.ts +70 -0
- package/dist/src/services/shellExecutionService.js +152 -0
- package/dist/src/services/shellExecutionService.js.map +1 -0
- package/dist/src/services/shellExecutionService.test.d.ts +6 -0
- package/dist/src/services/shellExecutionService.test.js +258 -0
- package/dist/src/services/shellExecutionService.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +5 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +69 -4
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +4 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +9 -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/file-exporters.d.ts +28 -0
- package/dist/src/telemetry/file-exporters.js +62 -0
- package/dist/src/telemetry/file-exporters.js.map +1 -0
- package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
- package/dist/src/telemetry/integration.test.circular.js +53 -0
- package/dist/src/telemetry/integration.test.circular.js.map +1 -0
- package/dist/src/telemetry/loggers.d.ts +3 -1
- package/dist/src/telemetry/loggers.js +34 -2
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
- package/dist/src/telemetry/loggers.test.circular.js +100 -0
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
- package/dist/src/telemetry/sdk.js +17 -6
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +19 -1
- package/dist/src/telemetry/types.js +28 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
- package/dist/src/telemetry/uiTelemetry.js +7 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +92 -0
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/tools/edit.d.ts +7 -12
- package/dist/src/tools/edit.js +34 -32
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +12 -0
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.d.ts +1 -14
- package/dist/src/tools/glob.js +13 -36
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +11 -7
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +3 -6
- package/dist/src/tools/grep.js +12 -18
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +9 -6
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.d.ts +6 -14
- package/dist/src/tools/ls.js +47 -40
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +83 -1
- package/dist/src/tools/mcp-client.js +613 -148
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +211 -616
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +11 -5
- package/dist/src/tools/mcp-tool.js +34 -10
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +74 -24
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.js +2 -2
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +51 -62
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +3 -3
- package/dist/src/tools/read-file.js +10 -10
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +100 -70
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +6 -10
- package/dist/src/tools/read-many-files.js +74 -43
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +7 -3
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +3 -23
- package/dist/src/tools/shell.js +169 -293
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +255 -333
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +13 -2
- package/dist/src/tools/tool-registry.js +57 -10
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +112 -41
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +37 -2
- package/dist/src/tools/tools.js +25 -2
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.js +7 -2
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +1 -0
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.js +2 -2
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +0 -8
- package/dist/src/tools/write-file.js +14 -23
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.d.ts +2 -0
- package/dist/src/utils/bfsFileSearch.js +4 -1
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.test.js +108 -105
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
- package/dist/src/utils/browser.d.ts +13 -0
- package/dist/src/utils/browser.js +49 -0
- package/dist/src/utils/browser.js.map +1 -0
- package/dist/src/utils/editCorrector.js +4 -4
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +1 -1
- package/dist/src/utils/editor.js +16 -10
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +128 -28
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/errorReporting.d.ts +1 -1
- package/dist/src/utils/errorReporting.js +2 -2
- package/dist/src/utils/errorReporting.js.map +1 -1
- package/dist/src/utils/errorReporting.test.js +44 -38
- package/dist/src/utils/errorReporting.test.js.map +1 -1
- package/dist/src/utils/errors.js +4 -4
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +4 -4
- package/dist/src/utils/fileUtils.js +33 -17
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +37 -37
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/formatters.d.ts +6 -0
- package/dist/src/utils/formatters.js +16 -0
- package/dist/src/utils/formatters.js.map +1 -0
- package/dist/src/utils/getFolderStructure.d.ts +3 -2
- package/dist/src/utils/getFolderStructure.js +27 -28
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/getFolderStructure.test.js +169 -187
- package/dist/src/utils/getFolderStructure.test.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.js +4 -7
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.test.js +70 -61
- package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +2 -1
- package/dist/src/utils/memoryDiscovery.js +11 -5
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +160 -371
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/partUtils.d.ts +14 -0
- package/dist/src/utils/partUtils.js +65 -0
- package/dist/src/utils/partUtils.js.map +1 -0
- package/dist/src/utils/partUtils.test.d.ts +6 -0
- package/dist/src/utils/partUtils.test.js +130 -0
- package/dist/src/utils/partUtils.test.js.map +1 -0
- package/dist/src/utils/paths.d.ts +11 -0
- package/dist/src/utils/paths.js +17 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.js +2 -11
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/retry.d.ts +6 -0
- package/dist/src/utils/retry.js +2 -2
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/safeJsonStringify.d.ts +13 -0
- package/dist/src/utils/safeJsonStringify.js +25 -0
- package/dist/src/utils/safeJsonStringify.js.map +1 -0
- package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
- package/dist/src/utils/safeJsonStringify.test.js +61 -0
- package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
- package/dist/src/utils/schemaValidator.d.ts +1 -1
- package/dist/src/utils/schemaValidator.js +6 -3
- package/dist/src/utils/schemaValidator.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +44 -0
- package/dist/src/utils/shell-utils.js +243 -0
- package/dist/src/utils/shell-utils.js.map +1 -0
- package/dist/src/utils/shell-utils.test.d.ts +6 -0
- package/dist/src/utils/shell-utils.test.js +450 -0
- package/dist/src/utils/shell-utils.test.js.map +1 -0
- package/dist/src/utils/summarizer.d.ts +1 -1
- package/dist/src/utils/summarizer.js +11 -39
- package/dist/src/utils/summarizer.js.map +1 -1
- package/dist/src/utils/summarizer.test.js +1 -1
- package/dist/src/utils/systemEncoding.d.ts +40 -0
- package/dist/src/utils/systemEncoding.js +149 -0
- package/dist/src/utils/systemEncoding.js.map +1 -0
- package/dist/src/utils/systemEncoding.test.d.ts +6 -0
- package/dist/src/utils/systemEncoding.test.js +368 -0
- package/dist/src/utils/systemEncoding.test.js.map +1 -0
- package/dist/src/utils/textUtils.d.ts +13 -0
- package/dist/src/utils/textUtils.js +28 -0
- package/dist/src/utils/textUtils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
- package/dist/google-gemini-cli-core-0.1.11.tgz +0 -0
- package/dist/src/core/geminiRequest.test.js +0 -72
- package/dist/src/core/geminiRequest.test.js.map +0 -1
- /package/dist/src/{core/geminiRequest.test.d.ts → ide/ideContext.test.d.ts} +0 -0
|
@@ -3,298 +3,280 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
6
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
8
7
|
import fsPromises from 'fs/promises';
|
|
9
|
-
import * as
|
|
8
|
+
import * as nodePath from 'path';
|
|
9
|
+
import * as os from 'os';
|
|
10
10
|
import { getFolderStructure } from './getFolderStructure.js';
|
|
11
|
-
import * as gitUtils from './gitUtils.js';
|
|
12
11
|
import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
|
|
13
|
-
vi.mock('path', async (importOriginal) => {
|
|
14
|
-
const original = (await importOriginal());
|
|
15
|
-
return {
|
|
16
|
-
...original,
|
|
17
|
-
resolve: vi.fn((str) => str),
|
|
18
|
-
// Other path functions (basename, join, normalize, etc.) will use original implementation
|
|
19
|
-
};
|
|
20
|
-
});
|
|
21
|
-
vi.mock('fs/promises');
|
|
22
|
-
vi.mock('fs');
|
|
23
|
-
vi.mock('./gitUtils.js');
|
|
24
|
-
// Import 'path' again here, it will be the mocked version
|
|
25
12
|
import * as path from 'path';
|
|
26
|
-
// Helper to create Dirent-like objects for mocking fs.readdir
|
|
27
|
-
const createDirent = (name, type) => ({
|
|
28
|
-
name,
|
|
29
|
-
isFile: () => type === 'file',
|
|
30
|
-
isDirectory: () => type === 'dir',
|
|
31
|
-
isBlockDevice: () => false,
|
|
32
|
-
isCharacterDevice: () => false,
|
|
33
|
-
isSymbolicLink: () => false,
|
|
34
|
-
isFIFO: () => false,
|
|
35
|
-
isSocket: () => false,
|
|
36
|
-
path: '',
|
|
37
|
-
parentPath: '',
|
|
38
|
-
});
|
|
39
13
|
describe('getFolderStructure', () => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
path.
|
|
47
|
-
|
|
48
|
-
fsPromises.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return mockFsStructure[normalizedPath];
|
|
54
|
-
}
|
|
55
|
-
throw Object.assign(new Error(`ENOENT: no such file or directory, scandir '${normalizedPath}'`), { code: 'ENOENT' });
|
|
56
|
-
});
|
|
14
|
+
let testRootDir;
|
|
15
|
+
async function createEmptyDir(...pathSegments) {
|
|
16
|
+
const fullPath = path.join(testRootDir, ...pathSegments);
|
|
17
|
+
await fsPromises.mkdir(fullPath, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
async function createTestFile(...pathSegments) {
|
|
20
|
+
const fullPath = path.join(testRootDir, ...pathSegments);
|
|
21
|
+
await fsPromises.mkdir(path.dirname(fullPath), { recursive: true });
|
|
22
|
+
await fsPromises.writeFile(fullPath, '');
|
|
23
|
+
return fullPath;
|
|
24
|
+
}
|
|
25
|
+
beforeEach(async () => {
|
|
26
|
+
testRootDir = await fsPromises.mkdtemp(path.join(os.tmpdir(), 'folder-structure-test-'));
|
|
57
27
|
});
|
|
58
|
-
afterEach(() => {
|
|
59
|
-
|
|
28
|
+
afterEach(async () => {
|
|
29
|
+
await fsPromises.rm(testRootDir, { recursive: true, force: true });
|
|
60
30
|
});
|
|
61
|
-
const mockFsStructure = {
|
|
62
|
-
'/testroot': [
|
|
63
|
-
createDirent('file1.txt', 'file'),
|
|
64
|
-
createDirent('subfolderA', 'dir'),
|
|
65
|
-
createDirent('emptyFolder', 'dir'),
|
|
66
|
-
createDirent('.hiddenfile', 'file'),
|
|
67
|
-
createDirent('node_modules', 'dir'),
|
|
68
|
-
],
|
|
69
|
-
'/testroot/subfolderA': [
|
|
70
|
-
createDirent('fileA1.ts', 'file'),
|
|
71
|
-
createDirent('fileA2.js', 'file'),
|
|
72
|
-
createDirent('subfolderB', 'dir'),
|
|
73
|
-
],
|
|
74
|
-
'/testroot/subfolderA/subfolderB': [createDirent('fileB1.md', 'file')],
|
|
75
|
-
'/testroot/emptyFolder': [],
|
|
76
|
-
'/testroot/node_modules': [createDirent('somepackage', 'dir')],
|
|
77
|
-
'/testroot/manyFilesFolder': Array.from({ length: 10 }, (_, i) => createDirent(`file-${i}.txt`, 'file')),
|
|
78
|
-
'/testroot/manyFolders': Array.from({ length: 5 }, (_, i) => createDirent(`folder-${i}`, 'dir')),
|
|
79
|
-
...Array.from({ length: 5 }, (_, i) => ({
|
|
80
|
-
[`/testroot/manyFolders/folder-${i}`]: [
|
|
81
|
-
createDirent('child.txt', 'file'),
|
|
82
|
-
],
|
|
83
|
-
})).reduce((acc, val) => ({ ...acc, ...val }), {}),
|
|
84
|
-
'/testroot/deepFolders': [createDirent('level1', 'dir')],
|
|
85
|
-
'/testroot/deepFolders/level1': [createDirent('level2', 'dir')],
|
|
86
|
-
'/testroot/deepFolders/level1/level2': [createDirent('level3', 'dir')],
|
|
87
|
-
'/testroot/deepFolders/level1/level2/level3': [
|
|
88
|
-
createDirent('file.txt', 'file'),
|
|
89
|
-
],
|
|
90
|
-
};
|
|
91
31
|
it('should return basic folder structure', async () => {
|
|
92
|
-
|
|
93
|
-
|
|
32
|
+
await createTestFile('fileA1.ts');
|
|
33
|
+
await createTestFile('fileA2.js');
|
|
34
|
+
await createTestFile('subfolderB', 'fileB1.md');
|
|
35
|
+
const structure = await getFolderStructure(testRootDir);
|
|
36
|
+
expect(structure.trim()).toBe(`
|
|
94
37
|
Showing up to 200 items (files + folders).
|
|
95
38
|
|
|
96
|
-
|
|
39
|
+
${testRootDir}${path.sep}
|
|
97
40
|
├───fileA1.ts
|
|
98
41
|
├───fileA2.js
|
|
99
|
-
└───subfolderB
|
|
42
|
+
└───subfolderB${path.sep}
|
|
100
43
|
└───fileB1.md
|
|
101
|
-
`.trim();
|
|
102
|
-
expect(structure.trim()).toBe(expected);
|
|
44
|
+
`.trim());
|
|
103
45
|
});
|
|
104
46
|
it('should handle an empty folder', async () => {
|
|
105
|
-
const structure = await getFolderStructure(
|
|
106
|
-
|
|
47
|
+
const structure = await getFolderStructure(testRootDir);
|
|
48
|
+
expect(structure.trim()).toBe(`
|
|
107
49
|
Showing up to 200 items (files + folders).
|
|
108
50
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
51
|
+
${testRootDir}${path.sep}
|
|
52
|
+
`
|
|
53
|
+
.trim()
|
|
54
|
+
.trim());
|
|
112
55
|
});
|
|
113
56
|
it('should ignore folders specified in ignoredFolders (default)', async () => {
|
|
114
|
-
|
|
115
|
-
|
|
57
|
+
await createTestFile('.hiddenfile');
|
|
58
|
+
await createTestFile('file1.txt');
|
|
59
|
+
await createEmptyDir('emptyFolder');
|
|
60
|
+
await createTestFile('node_modules', 'somepackage', 'index.js');
|
|
61
|
+
await createTestFile('subfolderA', 'fileA1.ts');
|
|
62
|
+
await createTestFile('subfolderA', 'fileA2.js');
|
|
63
|
+
await createTestFile('subfolderA', 'subfolderB', 'fileB1.md');
|
|
64
|
+
const structure = await getFolderStructure(testRootDir);
|
|
65
|
+
expect(structure.trim()).toBe(`
|
|
116
66
|
Showing up to 200 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (200 items) was reached.
|
|
117
67
|
|
|
118
|
-
|
|
68
|
+
${testRootDir}${path.sep}
|
|
119
69
|
├───.hiddenfile
|
|
120
70
|
├───file1.txt
|
|
121
|
-
├───emptyFolder
|
|
122
|
-
├───node_modules
|
|
123
|
-
└───subfolderA
|
|
71
|
+
├───emptyFolder${path.sep}
|
|
72
|
+
├───node_modules${path.sep}...
|
|
73
|
+
└───subfolderA${path.sep}
|
|
124
74
|
├───fileA1.ts
|
|
125
75
|
├───fileA2.js
|
|
126
|
-
└───subfolderB
|
|
76
|
+
└───subfolderB${path.sep}
|
|
127
77
|
└───fileB1.md
|
|
128
|
-
`.trim();
|
|
129
|
-
expect(structure.trim()).toBe(expected);
|
|
78
|
+
`.trim());
|
|
130
79
|
});
|
|
131
80
|
it('should ignore folders specified in custom ignoredFolders', async () => {
|
|
132
|
-
|
|
81
|
+
await createTestFile('.hiddenfile');
|
|
82
|
+
await createTestFile('file1.txt');
|
|
83
|
+
await createEmptyDir('emptyFolder');
|
|
84
|
+
await createTestFile('node_modules', 'somepackage', 'index.js');
|
|
85
|
+
await createTestFile('subfolderA', 'fileA1.ts');
|
|
86
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
133
87
|
ignoredFolders: new Set(['subfolderA', 'node_modules']),
|
|
134
88
|
});
|
|
135
89
|
const expected = `
|
|
136
90
|
Showing up to 200 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (200 items) was reached.
|
|
137
91
|
|
|
138
|
-
|
|
92
|
+
${testRootDir}${path.sep}
|
|
139
93
|
├───.hiddenfile
|
|
140
94
|
├───file1.txt
|
|
141
|
-
├───emptyFolder
|
|
142
|
-
├───node_modules
|
|
143
|
-
└───subfolderA
|
|
95
|
+
├───emptyFolder${path.sep}
|
|
96
|
+
├───node_modules${path.sep}...
|
|
97
|
+
└───subfolderA${path.sep}...
|
|
144
98
|
`.trim();
|
|
145
99
|
expect(structure.trim()).toBe(expected);
|
|
146
100
|
});
|
|
147
101
|
it('should filter files by fileIncludePattern', async () => {
|
|
148
|
-
|
|
102
|
+
await createTestFile('fileA1.ts');
|
|
103
|
+
await createTestFile('fileA2.js');
|
|
104
|
+
await createTestFile('subfolderB', 'fileB1.md');
|
|
105
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
149
106
|
fileIncludePattern: /\.ts$/,
|
|
150
107
|
});
|
|
151
108
|
const expected = `
|
|
152
109
|
Showing up to 200 items (files + folders).
|
|
153
110
|
|
|
154
|
-
|
|
111
|
+
${testRootDir}${path.sep}
|
|
155
112
|
├───fileA1.ts
|
|
156
|
-
└───subfolderB
|
|
113
|
+
└───subfolderB${path.sep}
|
|
157
114
|
`.trim();
|
|
158
115
|
expect(structure.trim()).toBe(expected);
|
|
159
116
|
});
|
|
160
117
|
it('should handle maxItems truncation for files within a folder', async () => {
|
|
161
|
-
|
|
118
|
+
await createTestFile('fileA1.ts');
|
|
119
|
+
await createTestFile('fileA2.js');
|
|
120
|
+
await createTestFile('subfolderB', 'fileB1.md');
|
|
121
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
162
122
|
maxItems: 3,
|
|
163
123
|
});
|
|
164
124
|
const expected = `
|
|
165
125
|
Showing up to 3 items (files + folders).
|
|
166
126
|
|
|
167
|
-
|
|
127
|
+
${testRootDir}${path.sep}
|
|
168
128
|
├───fileA1.ts
|
|
169
129
|
├───fileA2.js
|
|
170
|
-
└───subfolderB
|
|
130
|
+
└───subfolderB${path.sep}
|
|
171
131
|
`.trim();
|
|
172
132
|
expect(structure.trim()).toBe(expected);
|
|
173
133
|
});
|
|
174
134
|
it('should handle maxItems truncation for subfolders', async () => {
|
|
175
|
-
|
|
135
|
+
for (let i = 0; i < 5; i++) {
|
|
136
|
+
await createTestFile(`folder-${i}`, 'child.txt');
|
|
137
|
+
}
|
|
138
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
176
139
|
maxItems: 4,
|
|
177
140
|
});
|
|
178
141
|
const expectedRevised = `
|
|
179
142
|
Showing up to 4 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (4 items) was reached.
|
|
180
143
|
|
|
181
|
-
|
|
182
|
-
├───folder-0
|
|
183
|
-
├───folder-1
|
|
184
|
-
├───folder-2
|
|
185
|
-
├───folder-3
|
|
144
|
+
${testRootDir}${path.sep}
|
|
145
|
+
├───folder-0${path.sep}
|
|
146
|
+
├───folder-1${path.sep}
|
|
147
|
+
├───folder-2${path.sep}
|
|
148
|
+
├───folder-3${path.sep}
|
|
186
149
|
└───...
|
|
187
150
|
`.trim();
|
|
188
151
|
expect(structure.trim()).toBe(expectedRevised);
|
|
189
152
|
});
|
|
190
153
|
it('should handle maxItems that only allows the root folder itself', async () => {
|
|
191
|
-
|
|
154
|
+
await createTestFile('fileA1.ts');
|
|
155
|
+
await createTestFile('fileA2.ts');
|
|
156
|
+
await createTestFile('subfolderB', 'fileB1.ts');
|
|
157
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
192
158
|
maxItems: 1,
|
|
193
159
|
});
|
|
194
|
-
const
|
|
160
|
+
const expected = `
|
|
195
161
|
Showing up to 1 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (1 items) was reached.
|
|
196
162
|
|
|
197
|
-
|
|
163
|
+
${testRootDir}${path.sep}
|
|
198
164
|
├───fileA1.ts
|
|
199
165
|
├───...
|
|
200
166
|
└───...
|
|
201
167
|
`.trim();
|
|
202
|
-
expect(structure.trim()).toBe(
|
|
168
|
+
expect(structure.trim()).toBe(expected);
|
|
203
169
|
});
|
|
204
170
|
it('should handle non-existent directory', async () => {
|
|
205
|
-
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
if (p === '/nonexistent') {
|
|
209
|
-
throw Object.assign(new Error('ENOENT'), { code: 'ENOENT' });
|
|
210
|
-
}
|
|
211
|
-
return originalReaddir(p);
|
|
212
|
-
});
|
|
213
|
-
const structure = await getFolderStructure('/nonexistent');
|
|
214
|
-
expect(structure).toContain('Error: Could not read directory "/nonexistent"');
|
|
171
|
+
const nonExistentPath = path.join(testRootDir, 'non-existent');
|
|
172
|
+
const structure = await getFolderStructure(nonExistentPath);
|
|
173
|
+
expect(structure).toContain(`Error: Could not read directory "${nonExistentPath}". Check path and permissions.`);
|
|
215
174
|
});
|
|
216
175
|
it('should handle deep folder structure within limits', async () => {
|
|
217
|
-
|
|
176
|
+
await createTestFile('level1', 'level2', 'level3', 'file.txt');
|
|
177
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
218
178
|
maxItems: 10,
|
|
219
179
|
});
|
|
220
180
|
const expected = `
|
|
221
181
|
Showing up to 10 items (files + folders).
|
|
222
182
|
|
|
223
|
-
|
|
224
|
-
└───level1
|
|
225
|
-
└───level2
|
|
226
|
-
└───level3
|
|
183
|
+
${testRootDir}${path.sep}
|
|
184
|
+
└───level1${path.sep}
|
|
185
|
+
└───level2${path.sep}
|
|
186
|
+
└───level3${path.sep}
|
|
227
187
|
└───file.txt
|
|
228
188
|
`.trim();
|
|
229
189
|
expect(structure.trim()).toBe(expected);
|
|
230
190
|
});
|
|
231
191
|
it('should truncate deep folder structure if maxItems is small', async () => {
|
|
232
|
-
|
|
192
|
+
await createTestFile('level1', 'level2', 'level3', 'file.txt');
|
|
193
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
233
194
|
maxItems: 3,
|
|
234
195
|
});
|
|
235
196
|
const expected = `
|
|
236
197
|
Showing up to 3 items (files + folders).
|
|
237
198
|
|
|
238
|
-
|
|
239
|
-
└───level1
|
|
240
|
-
└───level2
|
|
241
|
-
└───level3
|
|
199
|
+
${testRootDir}${path.sep}
|
|
200
|
+
└───level1${path.sep}
|
|
201
|
+
└───level2${path.sep}
|
|
202
|
+
└───level3${path.sep}
|
|
242
203
|
`.trim();
|
|
243
204
|
expect(structure.trim()).toBe(expected);
|
|
244
205
|
});
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
fsPromises.readdir.mockImplementation(async (p) => {
|
|
251
|
-
const path = p.toString();
|
|
252
|
-
if (path === '/test/project') {
|
|
253
|
-
return [
|
|
254
|
-
createDirent('file1.txt', 'file'),
|
|
255
|
-
createDirent('node_modules', 'dir'),
|
|
256
|
-
createDirent('ignored.txt', 'file'),
|
|
257
|
-
createDirent('.gemini', 'dir'),
|
|
258
|
-
];
|
|
259
|
-
}
|
|
260
|
-
if (path === '/test/project/node_modules') {
|
|
261
|
-
return [createDirent('some-package', 'dir')];
|
|
262
|
-
}
|
|
263
|
-
if (path === '/test/project/.gemini') {
|
|
264
|
-
return [
|
|
265
|
-
createDirent('config.yaml', 'file'),
|
|
266
|
-
createDirent('logs.json', 'file'),
|
|
267
|
-
];
|
|
268
|
-
}
|
|
269
|
-
return [];
|
|
206
|
+
describe('with gitignore', () => {
|
|
207
|
+
beforeEach(async () => {
|
|
208
|
+
await fsPromises.mkdir(path.join(testRootDir, '.git'), {
|
|
209
|
+
recursive: true,
|
|
210
|
+
});
|
|
270
211
|
});
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
212
|
+
it('should ignore files and folders specified in .gitignore', async () => {
|
|
213
|
+
await fsPromises.writeFile(nodePath.join(testRootDir, '.gitignore'), 'ignored.txt\nnode_modules/\n.gemini/*\n!/.gemini/config.yaml');
|
|
214
|
+
await createTestFile('file1.txt');
|
|
215
|
+
await createTestFile('node_modules', 'some-package', 'index.js');
|
|
216
|
+
await createTestFile('ignored.txt');
|
|
217
|
+
await createTestFile('.gemini', 'config.yaml');
|
|
218
|
+
await createTestFile('.gemini', 'logs.json');
|
|
219
|
+
const fileService = new FileDiscoveryService(testRootDir);
|
|
220
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
221
|
+
fileService,
|
|
222
|
+
});
|
|
223
|
+
expect(structure).not.toContain('ignored.txt');
|
|
224
|
+
expect(structure).toContain(`node_modules${path.sep}...`);
|
|
225
|
+
expect(structure).not.toContain('logs.json');
|
|
226
|
+
expect(structure).toContain('config.yaml');
|
|
227
|
+
expect(structure).toContain('file1.txt');
|
|
277
228
|
});
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
229
|
+
it('should not ignore files if respectGitIgnore is false', async () => {
|
|
230
|
+
await fsPromises.writeFile(nodePath.join(testRootDir, '.gitignore'), 'ignored.txt');
|
|
231
|
+
await createTestFile('file1.txt');
|
|
232
|
+
await createTestFile('ignored.txt');
|
|
233
|
+
const fileService = new FileDiscoveryService(testRootDir);
|
|
234
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
235
|
+
fileService,
|
|
236
|
+
fileFilteringOptions: {
|
|
237
|
+
respectGeminiIgnore: false,
|
|
238
|
+
respectGitIgnore: false,
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
expect(structure).toContain('ignored.txt');
|
|
242
|
+
expect(structure).toContain('file1.txt');
|
|
284
243
|
});
|
|
285
|
-
expect(structure).not.toContain('ignored.txt');
|
|
286
|
-
expect(structure).toContain('node_modules/...');
|
|
287
|
-
expect(structure).not.toContain('logs.json');
|
|
288
244
|
});
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
245
|
+
describe('with geminiignore', () => {
|
|
246
|
+
it('should ignore geminiignore files by default', async () => {
|
|
247
|
+
await fsPromises.writeFile(nodePath.join(testRootDir, '.geminiignore'), 'ignored.txt\nnode_modules/\n.gemini/\n!/.gemini/config.yaml');
|
|
248
|
+
await createTestFile('file1.txt');
|
|
249
|
+
await createTestFile('node_modules', 'some-package', 'index.js');
|
|
250
|
+
await createTestFile('ignored.txt');
|
|
251
|
+
await createTestFile('.gemini', 'config.yaml');
|
|
252
|
+
await createTestFile('.gemini', 'logs.json');
|
|
253
|
+
const fileService = new FileDiscoveryService(testRootDir);
|
|
254
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
255
|
+
fileService,
|
|
256
|
+
});
|
|
257
|
+
expect(structure).not.toContain('ignored.txt');
|
|
258
|
+
expect(structure).toContain(`node_modules${path.sep}...`);
|
|
259
|
+
expect(structure).not.toContain('logs.json');
|
|
260
|
+
});
|
|
261
|
+
it('should not ignore files if respectGeminiIgnore is false', async () => {
|
|
262
|
+
await fsPromises.writeFile(nodePath.join(testRootDir, '.geminiignore'), 'ignored.txt\nnode_modules/\n.gemini/\n!/.gemini/config.yaml');
|
|
263
|
+
await createTestFile('file1.txt');
|
|
264
|
+
await createTestFile('node_modules', 'some-package', 'index.js');
|
|
265
|
+
await createTestFile('ignored.txt');
|
|
266
|
+
await createTestFile('.gemini', 'config.yaml');
|
|
267
|
+
await createTestFile('.gemini', 'logs.json');
|
|
268
|
+
const fileService = new FileDiscoveryService(testRootDir);
|
|
269
|
+
const structure = await getFolderStructure(testRootDir, {
|
|
270
|
+
fileService,
|
|
271
|
+
fileFilteringOptions: {
|
|
272
|
+
respectGeminiIgnore: false,
|
|
273
|
+
respectGitIgnore: true, // Explicitly disable gemini ignore only
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
expect(structure).toContain('ignored.txt');
|
|
277
|
+
// node_modules is still ignored by default
|
|
278
|
+
expect(structure).toContain(`node_modules${path.sep}...`);
|
|
294
279
|
});
|
|
295
|
-
expect(structure).toContain('ignored.txt');
|
|
296
|
-
// node_modules is still ignored by default
|
|
297
|
-
expect(structure).toContain('node_modules/...');
|
|
298
280
|
});
|
|
299
281
|
});
|
|
300
282
|
//# sourceMappingURL=getFolderStructure.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFolderStructure.test.js","sourceRoot":"","sources":["../../../src/utils/getFolderStructure.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,
|
|
1
|
+
{"version":3,"file":"getFolderStructure.test.js","sourceRoot":"","sources":["../../../src/utils/getFolderStructure.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,16 +45,13 @@ export class GitIgnoreParser {
|
|
|
45
45
|
this.patterns.push(...patterns);
|
|
46
46
|
}
|
|
47
47
|
isIgnored(filePath) {
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
: filePath;
|
|
48
|
+
const resolved = path.resolve(this.projectRoot, filePath);
|
|
49
|
+
const relativePath = path.relative(this.projectRoot, resolved);
|
|
51
50
|
if (relativePath === '' || relativePath.startsWith('..')) {
|
|
52
51
|
return false;
|
|
53
52
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
normalizedPath = normalizedPath.substring(2);
|
|
57
|
-
}
|
|
53
|
+
// Even in windows, Ignore expects forward slashes.
|
|
54
|
+
const normalizedPath = relativePath.replace(/\\/g, '/');
|
|
58
55
|
return this.ig.ignores(normalizedPath);
|
|
59
56
|
}
|
|
60
57
|
getPatterns() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitIgnoreParser.js","sourceRoot":"","sources":["../../../src/utils/gitIgnoreParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,MAAuB,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,OAAO,eAAe;IAClB,WAAW,CAAS;IACpB,EAAE,GAAW,MAAM,EAAE,CAAC;IACtB,QAAQ,GAAa,EAAE,CAAC;IAEhC,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO;QAE/C,gEAAgE;QAChE,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE3B,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,YAAY,CAAC,gBAAwB;QACnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACvE,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,wBAAwB;YACxB,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aAC7B,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAEO,WAAW,CAAC,QAAkB;QACpC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,MAAM,
|
|
1
|
+
{"version":3,"file":"gitIgnoreParser.js","sourceRoot":"","sources":["../../../src/utils/gitIgnoreParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,MAAuB,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,OAAO,eAAe;IAClB,WAAW,CAAS;IACpB,EAAE,GAAW,MAAM,EAAE,CAAC;IACtB,QAAQ,GAAa,EAAE,CAAC;IAEhC,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO;QAE/C,gEAAgE;QAChE,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE3B,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,YAAY,CAAC,gBAAwB;QACnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACvE,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,wBAAwB;YACxB,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aAC7B,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAEO,WAAW,CAAC,QAAkB;QACpC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE/D,IAAI,YAAY,KAAK,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mDAAmD;QACnD,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
|