eff-u-code 2.0.0
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/LICENSE +21 -0
- package/README.md +256 -0
- package/bin/fuck-u-code-mcp.js +2 -0
- package/bin/fuck-u-code.js +2 -0
- package/bin/postinstall.js +53 -0
- package/dist/ai/index.d.ts +34 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +227 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts/code-review.d.ts +9 -0
- package/dist/ai/prompts/code-review.d.ts.map +1 -0
- package/dist/ai/prompts/code-review.js +61 -0
- package/dist/ai/prompts/code-review.js.map +1 -0
- package/dist/ai/providers/anthropic.d.ts +11 -0
- package/dist/ai/providers/anthropic.d.ts.map +1 -0
- package/dist/ai/providers/anthropic.js +60 -0
- package/dist/ai/providers/anthropic.js.map +1 -0
- package/dist/ai/providers/fetch.d.ts +10 -0
- package/dist/ai/providers/fetch.d.ts.map +1 -0
- package/dist/ai/providers/fetch.js +50 -0
- package/dist/ai/providers/fetch.js.map +1 -0
- package/dist/ai/providers/gemini.d.ts +12 -0
- package/dist/ai/providers/gemini.d.ts.map +1 -0
- package/dist/ai/providers/gemini.js +66 -0
- package/dist/ai/providers/gemini.js.map +1 -0
- package/dist/ai/providers/ollama.d.ts +11 -0
- package/dist/ai/providers/ollama.d.ts.map +1 -0
- package/dist/ai/providers/ollama.js +54 -0
- package/dist/ai/providers/ollama.js.map +1 -0
- package/dist/ai/providers/openai.d.ts +11 -0
- package/dist/ai/providers/openai.d.ts.map +1 -0
- package/dist/ai/providers/openai.js +52 -0
- package/dist/ai/providers/openai.js.map +1 -0
- package/dist/ai/selector.d.ts +19 -0
- package/dist/ai/selector.d.ts.map +1 -0
- package/dist/ai/selector.js +145 -0
- package/dist/ai/selector.js.map +1 -0
- package/dist/ai/types.d.ts +120 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +6 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/analyzer/concurrent-analyzer.d.ts +11 -0
- package/dist/analyzer/concurrent-analyzer.d.ts.map +1 -0
- package/dist/analyzer/concurrent-analyzer.js +67 -0
- package/dist/analyzer/concurrent-analyzer.js.map +1 -0
- package/dist/analyzer/file-discovery.d.ts +23 -0
- package/dist/analyzer/file-discovery.d.ts.map +1 -0
- package/dist/analyzer/file-discovery.js +64 -0
- package/dist/analyzer/file-discovery.js.map +1 -0
- package/dist/analyzer/index.d.ts +27 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +64 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/cli/commands/ai-review.d.ts +6 -0
- package/dist/cli/commands/ai-review.d.ts.map +1 -0
- package/dist/cli/commands/ai-review.js +213 -0
- package/dist/cli/commands/ai-review.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +6 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +145 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/config.d.ts +6 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +147 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/mcp-install.d.ts +9 -0
- package/dist/cli/commands/mcp-install.d.ts.map +1 -0
- package/dist/cli/commands/mcp-install.js +102 -0
- package/dist/cli/commands/mcp-install.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +69 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output/ai-review-output.d.ts +20 -0
- package/dist/cli/output/ai-review-output.d.ts.map +1 -0
- package/dist/cli/output/ai-review-output.js +324 -0
- package/dist/cli/output/ai-review-output.js.map +1 -0
- package/dist/cli/output/console.d.ts +31 -0
- package/dist/cli/output/console.d.ts.map +1 -0
- package/dist/cli/output/console.js +571 -0
- package/dist/cli/output/console.js.map +1 -0
- package/dist/cli/output/html.d.ts +20 -0
- package/dist/cli/output/html.d.ts.map +1 -0
- package/dist/cli/output/html.js +339 -0
- package/dist/cli/output/html.js.map +1 -0
- package/dist/cli/output/json.d.ts +8 -0
- package/dist/cli/output/json.d.ts.map +1 -0
- package/dist/cli/output/json.js +46 -0
- package/dist/cli/output/json.js.map +1 -0
- package/dist/cli/output/markdown.d.ts +17 -0
- package/dist/cli/output/markdown.d.ts.map +1 -0
- package/dist/cli/output/markdown.js +323 -0
- package/dist/cli/output/markdown.js.map +1 -0
- package/dist/cli/output/stats.d.ts +35 -0
- package/dist/cli/output/stats.d.ts.map +1 -0
- package/dist/cli/output/stats.js +63 -0
- package/dist/cli/output/stats.js.map +1 -0
- package/dist/cli/output/terminal-markdown.d.ts +23 -0
- package/dist/cli/output/terminal-markdown.d.ts.map +1 -0
- package/dist/cli/output/terminal-markdown.js +159 -0
- package/dist/cli/output/terminal-markdown.js.map +1 -0
- package/dist/config/index.d.ts +27 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +266 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +179 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +85 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/gitignore/index.d.ts +5 -0
- package/dist/gitignore/index.d.ts.map +1 -0
- package/dist/gitignore/index.js +5 -0
- package/dist/gitignore/index.js.map +1 -0
- package/dist/gitignore/parser.d.ts +32 -0
- package/dist/gitignore/parser.d.ts.map +1 -0
- package/dist/gitignore/parser.js +110 -0
- package/dist/gitignore/parser.js.map +1 -0
- package/dist/gitignore/parser.test.d.ts +2 -0
- package/dist/gitignore/parser.test.d.ts.map +1 -0
- package/dist/gitignore/parser.test.js +217 -0
- package/dist/gitignore/parser.test.js.map +1 -0
- package/dist/i18n/index.d.ts +19 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +43 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locales/en.json +320 -0
- package/dist/i18n/locales/ru.json +320 -0
- package/dist/i18n/locales/zh.json +320 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +156 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/metrics/complexity/cognitive.d.ts +25 -0
- package/dist/metrics/complexity/cognitive.d.ts.map +1 -0
- package/dist/metrics/complexity/cognitive.js +109 -0
- package/dist/metrics/complexity/cognitive.js.map +1 -0
- package/dist/metrics/complexity/cyclomatic.d.ts +21 -0
- package/dist/metrics/complexity/cyclomatic.d.ts.map +1 -0
- package/dist/metrics/complexity/cyclomatic.js +111 -0
- package/dist/metrics/complexity/cyclomatic.js.map +1 -0
- package/dist/metrics/complexity/nesting-depth.d.ts +19 -0
- package/dist/metrics/complexity/nesting-depth.d.ts.map +1 -0
- package/dist/metrics/complexity/nesting-depth.js +97 -0
- package/dist/metrics/complexity/nesting-depth.js.map +1 -0
- package/dist/metrics/documentation/comment-ratio.d.ts +21 -0
- package/dist/metrics/documentation/comment-ratio.d.ts.map +1 -0
- package/dist/metrics/documentation/comment-ratio.js +91 -0
- package/dist/metrics/documentation/comment-ratio.js.map +1 -0
- package/dist/metrics/duplication/code-duplication.d.ts +24 -0
- package/dist/metrics/duplication/code-duplication.d.ts.map +1 -0
- package/dist/metrics/duplication/code-duplication.js +167 -0
- package/dist/metrics/duplication/code-duplication.js.map +1 -0
- package/dist/metrics/duplication/code-duplication.test.d.ts +2 -0
- package/dist/metrics/duplication/code-duplication.test.d.ts.map +1 -0
- package/dist/metrics/duplication/code-duplication.test.js +612 -0
- package/dist/metrics/duplication/code-duplication.test.js.map +1 -0
- package/dist/metrics/error/error-handling.d.ts +23 -0
- package/dist/metrics/error/error-handling.d.ts.map +1 -0
- package/dist/metrics/error/error-handling.js +164 -0
- package/dist/metrics/error/error-handling.js.map +1 -0
- package/dist/metrics/error/error-handling.test.d.ts +2 -0
- package/dist/metrics/error/error-handling.test.d.ts.map +1 -0
- package/dist/metrics/error/error-handling.test.js +349 -0
- package/dist/metrics/error/error-handling.test.js.map +1 -0
- package/dist/metrics/index.d.ts +21 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +50 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/naming/convention.d.ts +22 -0
- package/dist/metrics/naming/convention.d.ts.map +1 -0
- package/dist/metrics/naming/convention.js +117 -0
- package/dist/metrics/naming/convention.js.map +1 -0
- package/dist/metrics/size/file-length.d.ts +19 -0
- package/dist/metrics/size/file-length.d.ts.map +1 -0
- package/dist/metrics/size/file-length.js +68 -0
- package/dist/metrics/size/file-length.js.map +1 -0
- package/dist/metrics/size/function-length.d.ts +20 -0
- package/dist/metrics/size/function-length.d.ts.map +1 -0
- package/dist/metrics/size/function-length.js +101 -0
- package/dist/metrics/size/function-length.js.map +1 -0
- package/dist/metrics/size/parameter-count.d.ts +19 -0
- package/dist/metrics/size/parameter-count.d.ts.map +1 -0
- package/dist/metrics/size/parameter-count.js +97 -0
- package/dist/metrics/size/parameter-count.js.map +1 -0
- package/dist/metrics/structure/structure-analysis.d.ts +24 -0
- package/dist/metrics/structure/structure-analysis.d.ts.map +1 -0
- package/dist/metrics/structure/structure-analysis.js +223 -0
- package/dist/metrics/structure/structure-analysis.js.map +1 -0
- package/dist/metrics/structure/structure-analysis.test.d.ts +2 -0
- package/dist/metrics/structure/structure-analysis.test.d.ts.map +1 -0
- package/dist/metrics/structure/structure-analysis.test.js +342 -0
- package/dist/metrics/structure/structure-analysis.test.js.map +1 -0
- package/dist/metrics/types.d.ts +71 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +5 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/parser/generic-parser.d.ts +28 -0
- package/dist/parser/generic-parser.d.ts.map +1 -0
- package/dist/parser/generic-parser.js +218 -0
- package/dist/parser/generic-parser.js.map +1 -0
- package/dist/parser/index.d.ts +19 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +52 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/regex-parser.d.ts +46 -0
- package/dist/parser/regex-parser.d.ts.map +1 -0
- package/dist/parser/regex-parser.js +560 -0
- package/dist/parser/regex-parser.js.map +1 -0
- package/dist/parser/tree-sitter-parser.d.ts +50 -0
- package/dist/parser/tree-sitter-parser.d.ts.map +1 -0
- package/dist/parser/tree-sitter-parser.js +707 -0
- package/dist/parser/tree-sitter-parser.js.map +1 -0
- package/dist/parser/types.d.ts +52 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +49 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/scoring/index.d.ts +14 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +80 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/utils/fs.d.ts +24 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +61 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown.d.ts +16 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +303 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/progress.d.ts +24 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +79 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/terminal.d.ts +62 -0
- package/dist/utils/terminal.d.ts.map +1 -0
- package/dist/utils/terminal.js +207 -0
- package/dist/utils/terminal.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gitignore parser
|
|
3
|
+
* Uses the ignore library to parse .gitignore files
|
|
4
|
+
*/
|
|
5
|
+
import ignore from 'ignore';
|
|
6
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
7
|
+
import { join, dirname, sep } from 'node:path';
|
|
8
|
+
import { exists } from '../utils/fs.js';
|
|
9
|
+
/**
|
|
10
|
+
* Load and parse .gitignore file from project root
|
|
11
|
+
*/
|
|
12
|
+
export async function loadGitignore(projectPath) {
|
|
13
|
+
const ig = ignore();
|
|
14
|
+
ig.add('.git');
|
|
15
|
+
const rootGitignore = join(projectPath, '.gitignore');
|
|
16
|
+
if (await exists(rootGitignore)) {
|
|
17
|
+
const content = await readFile(rootGitignore, 'utf-8');
|
|
18
|
+
ig.add(content);
|
|
19
|
+
}
|
|
20
|
+
return ig;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Recursively load all .gitignore files
|
|
24
|
+
* Supports nested .gitignore files
|
|
25
|
+
*/
|
|
26
|
+
export async function loadNestedGitignores(projectPath, relativePath = '', rootIgnore) {
|
|
27
|
+
const gitignores = new Map();
|
|
28
|
+
const currentPath = join(projectPath, relativePath);
|
|
29
|
+
const gitignorePath = join(currentPath, '.gitignore');
|
|
30
|
+
if (await exists(gitignorePath)) {
|
|
31
|
+
const content = await readFile(gitignorePath, 'utf-8');
|
|
32
|
+
const ig = ignore().add(content);
|
|
33
|
+
gitignores.set(relativePath || '.', ig);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const entries = await readdir(currentPath, { withFileTypes: true });
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
if (entry.name === '.git')
|
|
39
|
+
continue;
|
|
40
|
+
if (entry.isDirectory()) {
|
|
41
|
+
const subPath = relativePath ? join(relativePath, entry.name) : entry.name;
|
|
42
|
+
if (rootIgnore?.ignores(subPath)) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const subGitignores = await loadNestedGitignores(projectPath, subPath, rootIgnore);
|
|
46
|
+
for (const [path, ig] of subGitignores) {
|
|
47
|
+
gitignores.set(path, ig);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Skip directories with permission errors or other access issues
|
|
54
|
+
}
|
|
55
|
+
return gitignores;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create a combined gitignore matcher
|
|
59
|
+
*/
|
|
60
|
+
export function createMatcher(rootIgnore, nestedIgnores) {
|
|
61
|
+
return new GitignoreMatcher(rootIgnore, nestedIgnores);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Gitignore matcher that handles both root and nested .gitignore files
|
|
65
|
+
*/
|
|
66
|
+
export class GitignoreMatcher {
|
|
67
|
+
rootIgnore;
|
|
68
|
+
nestedIgnores;
|
|
69
|
+
constructor(rootIgnore, nestedIgnores) {
|
|
70
|
+
this.rootIgnore = rootIgnore;
|
|
71
|
+
this.nestedIgnores = nestedIgnores;
|
|
72
|
+
}
|
|
73
|
+
ignores(relativePath) {
|
|
74
|
+
if (!relativePath || relativePath === '.' || relativePath === '..') {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const normalizedPath = relativePath.split(sep).join('/');
|
|
78
|
+
if (this.rootIgnore.ignores(normalizedPath)) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
const dir = dirname(normalizedPath);
|
|
82
|
+
if (dir === '.')
|
|
83
|
+
return false;
|
|
84
|
+
const parts = dir.split('/');
|
|
85
|
+
for (let i = 0; i <= parts.length; i++) {
|
|
86
|
+
const checkPath = parts.slice(0, i).join('/') || '.';
|
|
87
|
+
const nestedIgnore = this.nestedIgnores.get(checkPath);
|
|
88
|
+
if (nestedIgnore) {
|
|
89
|
+
let relativeToNested;
|
|
90
|
+
if (checkPath === '.') {
|
|
91
|
+
relativeToNested = normalizedPath;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
relativeToNested = normalizedPath.substring(checkPath.length + 1);
|
|
95
|
+
}
|
|
96
|
+
if (nestedIgnore.ignores(relativeToNested)) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Filter a list of file paths
|
|
105
|
+
*/
|
|
106
|
+
filter(paths) {
|
|
107
|
+
return paths.filter((p) => !this.ignores(p));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/gitignore/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../../src/gitignore/parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { loadGitignore, loadNestedGitignores, createMatcher } from './parser.js';
|
|
3
|
+
import { mkdir, writeFile, rm } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
describe('Gitignore Parser', () => {
|
|
7
|
+
let testDir;
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
testDir = join(tmpdir(), `gitignore-test-${Date.now()}`);
|
|
10
|
+
await mkdir(testDir, { recursive: true });
|
|
11
|
+
});
|
|
12
|
+
afterEach(async () => {
|
|
13
|
+
await rm(testDir, { recursive: true, force: true });
|
|
14
|
+
});
|
|
15
|
+
describe('loadGitignore', () => {
|
|
16
|
+
it('should load root .gitignore file', async () => {
|
|
17
|
+
await writeFile(join(testDir, '.gitignore'), 'node_modules/\n*.log\n');
|
|
18
|
+
const ig = await loadGitignore(testDir);
|
|
19
|
+
expect(ig.ignores('node_modules/package.json')).toBe(true);
|
|
20
|
+
expect(ig.ignores('test.log')).toBe(true);
|
|
21
|
+
expect(ig.ignores('src/index.ts')).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
it('should always ignore .git directory', async () => {
|
|
24
|
+
const ig = await loadGitignore(testDir);
|
|
25
|
+
expect(ig.ignores('.git/config')).toBe(true);
|
|
26
|
+
expect(ig.ignores('.git/HEAD')).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
it('should handle missing .gitignore file', async () => {
|
|
29
|
+
const ig = await loadGitignore(testDir);
|
|
30
|
+
expect(ig.ignores('.git/config')).toBe(true);
|
|
31
|
+
expect(ig.ignores('src/index.ts')).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
it('should handle empty .gitignore file', async () => {
|
|
34
|
+
await writeFile(join(testDir, '.gitignore'), '');
|
|
35
|
+
const ig = await loadGitignore(testDir);
|
|
36
|
+
expect(ig.ignores('.git/config')).toBe(true);
|
|
37
|
+
expect(ig.ignores('src/index.ts')).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
it('should handle .gitignore with comments and blank lines', async () => {
|
|
40
|
+
await writeFile(join(testDir, '.gitignore'), '# Comment\n\nnode_modules/\n\n# Another comment\n*.log\n');
|
|
41
|
+
const ig = await loadGitignore(testDir);
|
|
42
|
+
expect(ig.ignores('node_modules/package.json')).toBe(true);
|
|
43
|
+
expect(ig.ignores('test.log')).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
it('should handle negation patterns', async () => {
|
|
46
|
+
await writeFile(join(testDir, '.gitignore'), '*.log\n!important.log\n');
|
|
47
|
+
const ig = await loadGitignore(testDir);
|
|
48
|
+
expect(ig.ignores('test.log')).toBe(true);
|
|
49
|
+
expect(ig.ignores('important.log')).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
it('should handle directory-only patterns', async () => {
|
|
52
|
+
await writeFile(join(testDir, '.gitignore'), 'build/\n');
|
|
53
|
+
const ig = await loadGitignore(testDir);
|
|
54
|
+
expect(ig.ignores('build/index.js')).toBe(true);
|
|
55
|
+
expect(ig.ignores('src/build.ts')).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
it('should handle wildcard patterns', async () => {
|
|
58
|
+
await writeFile(join(testDir, '.gitignore'), '*.min.js\ntest-*.ts\n');
|
|
59
|
+
const ig = await loadGitignore(testDir);
|
|
60
|
+
expect(ig.ignores('bundle.min.js')).toBe(true);
|
|
61
|
+
expect(ig.ignores('test-utils.ts')).toBe(true);
|
|
62
|
+
expect(ig.ignores('index.js')).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
it('should handle double-star patterns', async () => {
|
|
65
|
+
await writeFile(join(testDir, '.gitignore'), '**/node_modules/\n');
|
|
66
|
+
const ig = await loadGitignore(testDir);
|
|
67
|
+
expect(ig.ignores('node_modules/package.json')).toBe(true);
|
|
68
|
+
expect(ig.ignores('packages/app/node_modules/react')).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('loadNestedGitignores', () => {
|
|
72
|
+
it('should load nested .gitignore files', async () => {
|
|
73
|
+
await mkdir(join(testDir, 'src'), { recursive: true });
|
|
74
|
+
await writeFile(join(testDir, '.gitignore'), 'node_modules/\n');
|
|
75
|
+
await writeFile(join(testDir, 'src', '.gitignore'), '*.tmp\n');
|
|
76
|
+
const nested = await loadNestedGitignores(testDir);
|
|
77
|
+
expect(nested.has('.')).toBe(false);
|
|
78
|
+
expect(nested.has('src')).toBe(true);
|
|
79
|
+
const srcIgnore = nested.get('src');
|
|
80
|
+
expect(srcIgnore?.ignores('test.tmp')).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it('should recursively load deeply nested .gitignore files', async () => {
|
|
83
|
+
await mkdir(join(testDir, 'a', 'b', 'c'), { recursive: true });
|
|
84
|
+
await writeFile(join(testDir, 'a', '.gitignore'), '*.a\n');
|
|
85
|
+
await writeFile(join(testDir, 'a', 'b', '.gitignore'), '*.b\n');
|
|
86
|
+
await writeFile(join(testDir, 'a', 'b', 'c', '.gitignore'), '*.c\n');
|
|
87
|
+
const nested = await loadNestedGitignores(testDir);
|
|
88
|
+
expect(nested.has('a')).toBe(true);
|
|
89
|
+
expect(nested.has('a/b')).toBe(true);
|
|
90
|
+
expect(nested.has('a/b/c')).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
it('should skip directories ignored by root .gitignore', async () => {
|
|
93
|
+
await mkdir(join(testDir, 'node_modules', 'pkg'), { recursive: true });
|
|
94
|
+
await writeFile(join(testDir, '.gitignore'), 'node_modules/\n');
|
|
95
|
+
await writeFile(join(testDir, 'node_modules', 'pkg', '.gitignore'), '*.tmp\n');
|
|
96
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
97
|
+
const nested = await loadNestedGitignores(testDir, '', rootIgnore);
|
|
98
|
+
expect(nested.has('node_modules')).toBe(false);
|
|
99
|
+
expect(nested.has('node_modules/pkg')).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
it('should handle permission errors gracefully', async () => {
|
|
102
|
+
await mkdir(join(testDir, 'restricted'), { recursive: true });
|
|
103
|
+
const nested = await loadNestedGitignores(testDir);
|
|
104
|
+
expect(nested).toBeInstanceOf(Map);
|
|
105
|
+
});
|
|
106
|
+
it('should handle empty directory', async () => {
|
|
107
|
+
const nested = await loadNestedGitignores(testDir);
|
|
108
|
+
expect(nested.size).toBe(0);
|
|
109
|
+
});
|
|
110
|
+
it('should skip .git directory', async () => {
|
|
111
|
+
await mkdir(join(testDir, '.git', 'hooks'), { recursive: true });
|
|
112
|
+
await writeFile(join(testDir, '.git', '.gitignore'), '*.tmp\n');
|
|
113
|
+
const nested = await loadNestedGitignores(testDir);
|
|
114
|
+
expect(nested.has('.git')).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('GitignoreMatcher', () => {
|
|
118
|
+
it('should match files against root .gitignore', async () => {
|
|
119
|
+
await writeFile(join(testDir, '.gitignore'), 'node_modules/\n*.log\n');
|
|
120
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
121
|
+
const nested = await loadNestedGitignores(testDir);
|
|
122
|
+
const matcher = createMatcher(rootIgnore, nested);
|
|
123
|
+
expect(matcher.ignores('node_modules/package.json')).toBe(true);
|
|
124
|
+
expect(matcher.ignores('test.log')).toBe(true);
|
|
125
|
+
expect(matcher.ignores('src/index.ts')).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
it('should match files against nested .gitignore', async () => {
|
|
128
|
+
await mkdir(join(testDir, 'src'), { recursive: true });
|
|
129
|
+
await writeFile(join(testDir, '.gitignore'), 'node_modules/\n');
|
|
130
|
+
await writeFile(join(testDir, 'src', '.gitignore'), '*.tmp\n');
|
|
131
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
132
|
+
const nested = await loadNestedGitignores(testDir);
|
|
133
|
+
const matcher = createMatcher(rootIgnore, nested);
|
|
134
|
+
expect(matcher.ignores('src/test.tmp')).toBe(true);
|
|
135
|
+
expect(matcher.ignores('src/index.ts')).toBe(false);
|
|
136
|
+
expect(matcher.ignores('test.tmp')).toBe(false);
|
|
137
|
+
});
|
|
138
|
+
it('should handle Windows path separators', async () => {
|
|
139
|
+
await writeFile(join(testDir, '.gitignore'), 'node_modules/\n');
|
|
140
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
141
|
+
const nested = await loadNestedGitignores(testDir);
|
|
142
|
+
const matcher = createMatcher(rootIgnore, nested);
|
|
143
|
+
expect(matcher.ignores('node_modules\\package.json')).toBe(true);
|
|
144
|
+
expect(matcher.ignores('src\\index.ts')).toBe(false);
|
|
145
|
+
});
|
|
146
|
+
it('should handle paths with multiple levels', async () => {
|
|
147
|
+
await mkdir(join(testDir, 'a', 'b', 'c'), { recursive: true });
|
|
148
|
+
await writeFile(join(testDir, 'a', 'b', '.gitignore'), '*.tmp\n');
|
|
149
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
150
|
+
const nested = await loadNestedGitignores(testDir);
|
|
151
|
+
const matcher = createMatcher(rootIgnore, nested);
|
|
152
|
+
expect(matcher.ignores('a/b/test.tmp')).toBe(true);
|
|
153
|
+
expect(matcher.ignores('a/b/c/test.tmp')).toBe(true);
|
|
154
|
+
expect(matcher.ignores('a/test.tmp')).toBe(false);
|
|
155
|
+
});
|
|
156
|
+
it('should handle root-level files', async () => {
|
|
157
|
+
await writeFile(join(testDir, '.gitignore'), '*.log\n');
|
|
158
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
159
|
+
const nested = await loadNestedGitignores(testDir);
|
|
160
|
+
const matcher = createMatcher(rootIgnore, nested);
|
|
161
|
+
expect(matcher.ignores('test.log')).toBe(true);
|
|
162
|
+
expect(matcher.ignores('index.ts')).toBe(false);
|
|
163
|
+
});
|
|
164
|
+
it('should filter array of paths', async () => {
|
|
165
|
+
await writeFile(join(testDir, '.gitignore'), '*.log\nnode_modules/\n');
|
|
166
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
167
|
+
const nested = await loadNestedGitignores(testDir);
|
|
168
|
+
const matcher = createMatcher(rootIgnore, nested);
|
|
169
|
+
const paths = [
|
|
170
|
+
'src/index.ts',
|
|
171
|
+
'test.log',
|
|
172
|
+
'node_modules/package.json',
|
|
173
|
+
'README.md',
|
|
174
|
+
'debug.log',
|
|
175
|
+
];
|
|
176
|
+
const filtered = matcher.filter(paths);
|
|
177
|
+
expect(filtered).toEqual(['src/index.ts', 'README.md']);
|
|
178
|
+
});
|
|
179
|
+
it('should handle empty path', async () => {
|
|
180
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
181
|
+
const nested = await loadNestedGitignores(testDir);
|
|
182
|
+
const matcher = createMatcher(rootIgnore, nested);
|
|
183
|
+
expect(matcher.ignores('')).toBe(false);
|
|
184
|
+
});
|
|
185
|
+
it('should handle dot files', async () => {
|
|
186
|
+
await writeFile(join(testDir, '.gitignore'), '.env\n');
|
|
187
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
188
|
+
const nested = await loadNestedGitignores(testDir);
|
|
189
|
+
const matcher = createMatcher(rootIgnore, nested);
|
|
190
|
+
expect(matcher.ignores('.env')).toBe(true);
|
|
191
|
+
expect(matcher.ignores('.eslintrc')).toBe(false);
|
|
192
|
+
});
|
|
193
|
+
it('should handle complex nested patterns', async () => {
|
|
194
|
+
await mkdir(join(testDir, 'packages', 'app', 'src'), { recursive: true });
|
|
195
|
+
await writeFile(join(testDir, '.gitignore'), 'node_modules/\n*.log\n');
|
|
196
|
+
await writeFile(join(testDir, 'packages', '.gitignore'), 'dist/\n');
|
|
197
|
+
await writeFile(join(testDir, 'packages', 'app', '.gitignore'), '*.tmp\n');
|
|
198
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
199
|
+
const nested = await loadNestedGitignores(testDir);
|
|
200
|
+
const matcher = createMatcher(rootIgnore, nested);
|
|
201
|
+
expect(matcher.ignores('node_modules/react')).toBe(true);
|
|
202
|
+
expect(matcher.ignores('test.log')).toBe(true);
|
|
203
|
+
expect(matcher.ignores('packages/dist/bundle.js')).toBe(true);
|
|
204
|
+
expect(matcher.ignores('packages/app/test.tmp')).toBe(true);
|
|
205
|
+
expect(matcher.ignores('packages/app/src/index.ts')).toBe(false);
|
|
206
|
+
});
|
|
207
|
+
it('should handle malformed paths', async () => {
|
|
208
|
+
const rootIgnore = await loadGitignore(testDir);
|
|
209
|
+
const nested = await loadNestedGitignores(testDir);
|
|
210
|
+
const matcher = createMatcher(rootIgnore, nested);
|
|
211
|
+
expect(matcher.ignores('//')).toBe(false);
|
|
212
|
+
expect(matcher.ignores('///')).toBe(false);
|
|
213
|
+
expect(matcher.ignores('.')).toBe(false);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
//# sourceMappingURL=parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../../src/gitignore/parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization module
|
|
3
|
+
*/
|
|
4
|
+
export type Locale = 'en' | 'zh' | 'ru';
|
|
5
|
+
/**
|
|
6
|
+
* Set the current locale
|
|
7
|
+
*/
|
|
8
|
+
export declare function setLocale(locale: Locale): void;
|
|
9
|
+
/**
|
|
10
|
+
* Get the current locale
|
|
11
|
+
*/
|
|
12
|
+
export declare function getLocale(): Locale;
|
|
13
|
+
/**
|
|
14
|
+
* Translation function
|
|
15
|
+
* @param key - Translation key
|
|
16
|
+
* @param params - Replacement parameters
|
|
17
|
+
*/
|
|
18
|
+
export declare function t(key: string, params?: Record<string, string | number>): string;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAaxC;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;;GAIG;AACH,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAc/E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization module
|
|
3
|
+
*/
|
|
4
|
+
import en from './locales/en.json' with { type: 'json' };
|
|
5
|
+
import zh from './locales/zh.json' with { type: 'json' };
|
|
6
|
+
import ru from './locales/ru.json' with { type: 'json' };
|
|
7
|
+
const translations = {
|
|
8
|
+
en: en,
|
|
9
|
+
zh: zh,
|
|
10
|
+
ru: ru,
|
|
11
|
+
};
|
|
12
|
+
let currentLocale = 'en';
|
|
13
|
+
/**
|
|
14
|
+
* Set the current locale
|
|
15
|
+
*/
|
|
16
|
+
export function setLocale(locale) {
|
|
17
|
+
currentLocale = locale;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the current locale
|
|
21
|
+
*/
|
|
22
|
+
export function getLocale() {
|
|
23
|
+
return currentLocale;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Translation function
|
|
27
|
+
* @param key - Translation key
|
|
28
|
+
* @param params - Replacement parameters
|
|
29
|
+
*/
|
|
30
|
+
export function t(key, params) {
|
|
31
|
+
const translation = translations[currentLocale][key];
|
|
32
|
+
if (!translation) {
|
|
33
|
+
return key;
|
|
34
|
+
}
|
|
35
|
+
if (!params) {
|
|
36
|
+
return translation;
|
|
37
|
+
}
|
|
38
|
+
return translation.replace(/\{(\w+)\}/g, (_, paramKey) => {
|
|
39
|
+
const value = params[paramKey];
|
|
40
|
+
return value !== undefined ? String(value) : `{${paramKey}}`;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,mBAAmB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACzD,OAAO,EAAE,MAAM,mBAAmB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACzD,OAAO,EAAE,MAAM,mBAAmB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAOzD,MAAM,YAAY,GAAiC;IACjD,EAAE,EAAE,EAAkB;IACtB,EAAE,EAAE,EAAkB;IACtB,EAAE,EAAE,EAAkB;CACvB,CAAC;AAEF,IAAI,aAAa,GAAW,IAAI,CAAC;AAEjC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,CAAC,CAAC,GAAW,EAAE,MAAwC;IACrE,MAAM,WAAW,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,GAAqB,CAAC,CAAC;IACvE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,WAAW,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,QAAgB,EAAE,EAAE;QAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC"}
|