mcp-code-context 2.6.0 → 3.0.6
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/CHANGELOG.md +92 -260
- package/README.md +304 -298
- package/dist/src/core/engine.d.ts +21 -0
- package/dist/src/core/engine.js +68 -0
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/core/validator.d.ts +15 -0
- package/dist/src/core/validator.js +44 -0
- package/dist/src/core/validator.js.map +1 -0
- package/dist/src/index.d.ts +7 -11
- package/dist/src/index.js +182 -397
- package/dist/src/index.js.map +1 -1
- package/dist/src/operations/write.d.ts +51 -0
- package/dist/src/operations/write.js +169 -0
- package/dist/src/operations/write.js.map +1 -0
- package/dist/src/parsers/base.d.ts +28 -0
- package/dist/src/parsers/base.js +27 -0
- package/dist/src/parsers/base.js.map +1 -0
- package/dist/src/parsers/dartTreeSitter.d.ts +13 -0
- package/dist/src/parsers/dartTreeSitter.js +91 -0
- package/dist/src/parsers/dartTreeSitter.js.map +1 -0
- package/dist/src/parsers/php.d.ts +12 -0
- package/dist/src/parsers/php.js +86 -0
- package/dist/src/parsers/php.js.map +1 -0
- package/dist/src/parsers/python.d.ts +12 -0
- package/dist/src/parsers/python.js +86 -0
- package/dist/src/parsers/python.js.map +1 -0
- package/dist/src/parsers/registry.d.ts +15 -0
- package/dist/src/parsers/registry.js +70 -0
- package/dist/src/parsers/registry.js.map +1 -0
- package/dist/src/parsers/typescript.d.ts +13 -0
- package/dist/src/parsers/typescript.js +98 -0
- package/dist/src/parsers/typescript.js.map +1 -0
- package/llms.txt +246 -236
- package/mcp-code-context-3.0.2.tgz +0 -0
- package/package.json +59 -57
- package/tsconfig.tests.json +27 -0
- package/.io/RULES.md +0 -12
- package/CONTRIBUTING.md +0 -243
- package/TROUBLESHOOTING.md +0 -38
- package/dist/src/ast/dartCompressor.d.ts +0 -27
- package/dist/src/ast/dartCompressor.js +0 -859
- package/dist/src/ast/dartCompressor.js.map +0 -1
- package/dist/src/ast/phpCompressor.d.ts +0 -24
- package/dist/src/ast/phpCompressor.js +0 -634
- package/dist/src/ast/phpCompressor.js.map +0 -1
- package/dist/src/ast/semanticCompressor.d.ts +0 -22
- package/dist/src/ast/semanticCompressor.js +0 -677
- package/dist/src/ast/semanticCompressor.js.map +0 -1
- package/dist/src/ast/writers/dartWriter.d.ts +0 -37
- package/dist/src/ast/writers/dartWriter.js +0 -544
- package/dist/src/ast/writers/dartWriter.js.map +0 -1
- package/dist/src/ast/writers/phpWriter.d.ts +0 -37
- package/dist/src/ast/writers/phpWriter.js +0 -411
- package/dist/src/ast/writers/phpWriter.js.map +0 -1
- package/dist/src/ast/writers/pyWriter.d.ts +0 -37
- package/dist/src/ast/writers/pyWriter.js +0 -355
- package/dist/src/ast/writers/pyWriter.js.map +0 -1
- package/dist/src/ast/writers/safeRename.d.ts +0 -14
- package/dist/src/ast/writers/safeRename.js +0 -258
- package/dist/src/ast/writers/safeRename.js.map +0 -1
- package/dist/src/ast/writers/symbolWriter.d.ts +0 -64
- package/dist/src/ast/writers/symbolWriter.js +0 -174
- package/dist/src/ast/writers/symbolWriter.js.map +0 -1
- package/dist/src/ast/writers/tsWriter.d.ts +0 -38
- package/dist/src/ast/writers/tsWriter.js +0 -344
- package/dist/src/ast/writers/tsWriter.js.map +0 -1
- package/dist/src/cache/astCache.d.ts +0 -39
- package/dist/src/cache/astCache.js +0 -169
- package/dist/src/cache/astCache.js.map +0 -1
- package/dist/src/handlers/readHandlers.d.ts +0 -70
- package/dist/src/handlers/readHandlers.js +0 -455
- package/dist/src/handlers/readHandlers.js.map +0 -1
- package/dist/src/handlers/utilHandlers.d.ts +0 -31
- package/dist/src/handlers/utilHandlers.js +0 -69
- package/dist/src/handlers/utilHandlers.js.map +0 -1
- package/dist/src/handlers/writeHandlers.d.ts +0 -57
- package/dist/src/handlers/writeHandlers.js +0 -499
- package/dist/src/handlers/writeHandlers.js.map +0 -1
- package/dist/src/tools/readFileLines.d.ts +0 -26
- package/dist/src/tools/readFileLines.js +0 -77
- package/dist/src/tools/readFileLines.js.map +0 -1
- package/dist/src/tools/searchCodePattern.d.ts +0 -37
- package/dist/src/tools/searchCodePattern.js +0 -144
- package/dist/src/tools/searchCodePattern.js.map +0 -1
- package/dist/src/utils/arrayUtils.d.ts +0 -12
- package/dist/src/utils/arrayUtils.js +0 -27
- package/dist/src/utils/arrayUtils.js.map +0 -1
- package/dist/src/utils/backupManager.d.ts +0 -31
- package/dist/src/utils/backupManager.js +0 -124
- package/dist/src/utils/backupManager.js.map +0 -1
- package/dist/src/utils/confirmationCache.d.ts +0 -16
- package/dist/src/utils/confirmationCache.js +0 -40
- package/dist/src/utils/confirmationCache.js.map +0 -1
- package/dist/src/utils/constants.d.ts +0 -46
- package/dist/src/utils/constants.js +0 -112
- package/dist/src/utils/constants.js.map +0 -1
- package/dist/src/utils/dependencyChecker.d.ts +0 -1
- package/dist/src/utils/dependencyChecker.js +0 -55
- package/dist/src/utils/dependencyChecker.js.map +0 -1
- package/dist/src/utils/diffEngine.d.ts +0 -21
- package/dist/src/utils/diffEngine.js +0 -163
- package/dist/src/utils/diffEngine.js.map +0 -1
- package/dist/src/utils/fuzzyMatch.d.ts +0 -8
- package/dist/src/utils/fuzzyMatch.js +0 -70
- package/dist/src/utils/fuzzyMatch.js.map +0 -1
- package/dist/src/utils/ignoreManager.d.ts +0 -29
- package/dist/src/utils/ignoreManager.js +0 -144
- package/dist/src/utils/ignoreManager.js.map +0 -1
- package/dist/src/utils/normalization.d.ts +0 -49
- package/dist/src/utils/normalization.js +0 -173
- package/dist/src/utils/normalization.js.map +0 -1
- package/dist/src/utils/projectRoot.d.ts +0 -17
- package/dist/src/utils/projectRoot.js +0 -42
- package/dist/src/utils/projectRoot.js.map +0 -1
- package/dist/src/utils/secureValidation.d.ts +0 -15
- package/dist/src/utils/secureValidation.js +0 -41
- package/dist/src/utils/secureValidation.js.map +0 -1
- package/dist/src/utils/syntaxValidator.d.ts +0 -15
- package/dist/src/utils/syntaxValidator.js +0 -218
- package/dist/src/utils/syntaxValidator.js.map +0 -1
- package/dist/src/utils/transactionManager.d.ts +0 -46
- package/dist/src/utils/transactionManager.js +0 -123
- package/dist/src/utils/transactionManager.js.map +0 -1
- package/dist/src/utils/validation.d.ts +0 -87
- package/dist/src/utils/validation.js +0 -231
- package/dist/src/utils/validation.js.map +0 -1
- package/docs/ARCHITECTURE.md +0 -300
- package/docs/architecture/ADR-001-modular-handlers.md +0 -119
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Transaction Manager - Atomic Multi-File Operations
|
|
3
|
-
* Ensures all-or-nothing writes with automatic rollback on failure
|
|
4
|
-
* Now includes syntax validation before commit
|
|
5
|
-
*/
|
|
6
|
-
import * as fs from "node:fs";
|
|
7
|
-
import * as path from "node:path";
|
|
8
|
-
import { createBackup, restoreBackup } from "./backupManager.js";
|
|
9
|
-
import { validateSyntax } from "./syntaxValidator.js";
|
|
10
|
-
export class TransactionManager {
|
|
11
|
-
staging = new Map();
|
|
12
|
-
backedUpFiles = new Set();
|
|
13
|
-
/**
|
|
14
|
-
* Stage a file change for commit
|
|
15
|
-
*/
|
|
16
|
-
stage(filePath, newContent) {
|
|
17
|
-
const resolved = path.resolve(filePath);
|
|
18
|
-
this.staging.set(resolved, newContent);
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Stage multiple file changes
|
|
22
|
-
*/
|
|
23
|
-
stageMultiple(changes) {
|
|
24
|
-
for (const change of changes) {
|
|
25
|
-
this.stage(change.filePath, change.newContent);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Commit all staged changes atomically
|
|
30
|
-
* Creates backups first, validates syntax, then writes all files
|
|
31
|
-
* Rolls back automatically on any failure
|
|
32
|
-
*/
|
|
33
|
-
async commit() {
|
|
34
|
-
if (this.staging.size === 0) {
|
|
35
|
-
return { success: true };
|
|
36
|
-
}
|
|
37
|
-
// Phase 1: Create backups
|
|
38
|
-
try {
|
|
39
|
-
for (const [filePath] of this.staging) {
|
|
40
|
-
createBackup(filePath);
|
|
41
|
-
this.backedUpFiles.add(filePath);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
catch (error) {
|
|
45
|
-
await this.rollback();
|
|
46
|
-
return {
|
|
47
|
-
success: false,
|
|
48
|
-
error: `Backup failed: ${error instanceof Error ? error.message : String(error)}`
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
// Phase 2: Validate syntax for all files
|
|
52
|
-
try {
|
|
53
|
-
for (const [filePath, content] of this.staging) {
|
|
54
|
-
const validation = await validateSyntax(filePath, content);
|
|
55
|
-
if (!validation.valid) {
|
|
56
|
-
await this.rollback();
|
|
57
|
-
const diagnostics = validation.diagnostics?.join("\n") || "";
|
|
58
|
-
return {
|
|
59
|
-
success: false,
|
|
60
|
-
error: `Syntax validation failed for ${path.basename(filePath)}:\n${validation.error}${diagnostics ? "\n" + diagnostics : ""}`
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
await this.rollback();
|
|
67
|
-
return {
|
|
68
|
-
success: false,
|
|
69
|
-
error: `Syntax validation error: ${error instanceof Error ? error.message : String(error)}`
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
// Phase 3: Write all files
|
|
73
|
-
try {
|
|
74
|
-
for (const [filePath, content] of this.staging) {
|
|
75
|
-
await fs.promises.writeFile(filePath, content, "utf-8");
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
await this.rollback();
|
|
80
|
-
return {
|
|
81
|
-
success: false,
|
|
82
|
-
error: `Write failed: ${error instanceof Error ? error.message : String(error)}`
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
this.clear();
|
|
86
|
-
return { success: true };
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Rollback all changes by restoring from backups
|
|
90
|
-
*/
|
|
91
|
-
async rollback() {
|
|
92
|
-
for (const filePath of this.backedUpFiles) {
|
|
93
|
-
try {
|
|
94
|
-
restoreBackup(filePath);
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
// Log but continue rolling back other files
|
|
98
|
-
console.error(`Failed to restore ${filePath}:`, error);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
this.clear();
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Clear staging area and backup tracking
|
|
105
|
-
*/
|
|
106
|
-
clear() {
|
|
107
|
-
this.staging.clear();
|
|
108
|
-
this.backedUpFiles.clear();
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Get number of staged changes
|
|
112
|
-
*/
|
|
113
|
-
get stagedCount() {
|
|
114
|
-
return this.staging.size;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Get list of staged file paths
|
|
118
|
-
*/
|
|
119
|
-
getStagedFiles() {
|
|
120
|
-
return Array.from(this.staging.keys());
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=transactionManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transactionManager.js","sourceRoot":"","sources":["../../../src/utils/transactionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* validation.ts — Input Validation & Security
|
|
3
|
-
*
|
|
4
|
-
* Centralized validation logic to prevent security vulnerabilities:
|
|
5
|
-
* - Path traversal attacks
|
|
6
|
-
* - ReDoS (Regular Expression Denial of Service)
|
|
7
|
-
* - Injection attacks
|
|
8
|
-
* - Resource exhaustion
|
|
9
|
-
*/
|
|
10
|
-
export interface PathValidationResult {
|
|
11
|
-
valid: boolean;
|
|
12
|
-
error?: string;
|
|
13
|
-
normalizedPath?: string;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Validate that a file path is safe and within allowed boundaries.
|
|
17
|
-
* Prevents path traversal attacks and access to sensitive system files.
|
|
18
|
-
*
|
|
19
|
-
* @param filePath - The path to validate
|
|
20
|
-
* @param projectRoot - Optional project root to enforce containment
|
|
21
|
-
*/
|
|
22
|
-
export declare function validateFilePath(filePath: string, projectRoot?: string): PathValidationResult;
|
|
23
|
-
/**
|
|
24
|
-
* Validate that a directory path is safe for operations.
|
|
25
|
-
*/
|
|
26
|
-
export declare function validateDirectoryPath(dirPath: string, projectRoot?: string): PathValidationResult;
|
|
27
|
-
export interface SymbolValidationResult {
|
|
28
|
-
valid: boolean;
|
|
29
|
-
error?: string;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Validate a symbol name to prevent ReDoS and injection attacks.
|
|
33
|
-
*
|
|
34
|
-
* @param symbolName - The symbol name to validate
|
|
35
|
-
*/
|
|
36
|
-
export declare function validateSymbolName(symbolName: string): SymbolValidationResult;
|
|
37
|
-
export interface RegexValidationResult {
|
|
38
|
-
valid: boolean;
|
|
39
|
-
error?: string;
|
|
40
|
-
safeRegex?: RegExp;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Validate and sanitize a regex pattern to prevent ReDoS attacks.
|
|
44
|
-
*
|
|
45
|
-
* @param pattern - The regex pattern to validate
|
|
46
|
-
* @param flags - Optional regex flags
|
|
47
|
-
*/
|
|
48
|
-
export declare function validateRegexPattern(pattern: string, flags?: string): RegexValidationResult;
|
|
49
|
-
/**
|
|
50
|
-
* Create a safe regex with timeout protection.
|
|
51
|
-
* Uses a simple timeout mechanism to prevent long-running regex operations.
|
|
52
|
-
*
|
|
53
|
-
* @param pattern - The regex pattern
|
|
54
|
-
* @param flags - Optional regex flags
|
|
55
|
-
* @param timeoutMs - Timeout in milliseconds (default: 1000ms)
|
|
56
|
-
*/
|
|
57
|
-
export declare function createSafeRegex(pattern: string, flags?: string, timeoutMs?: number): RegExp;
|
|
58
|
-
export interface FileSizeValidationResult {
|
|
59
|
-
valid: boolean;
|
|
60
|
-
error?: string;
|
|
61
|
-
size?: number;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Validate that a file is not too large to process safely.
|
|
65
|
-
*
|
|
66
|
-
* @param filePath - Path to the file
|
|
67
|
-
*/
|
|
68
|
-
export declare function validateFileSize(filePath: string): FileSizeValidationResult;
|
|
69
|
-
/**
|
|
70
|
-
* Check if file content contains null bytes (likely binary).
|
|
71
|
-
*/
|
|
72
|
-
export declare function isBinaryContent(content: string): boolean;
|
|
73
|
-
/**
|
|
74
|
-
* Validate that file content is safe to process.
|
|
75
|
-
*/
|
|
76
|
-
export declare function validateFileContent(content: string): SymbolValidationResult;
|
|
77
|
-
/**
|
|
78
|
-
* Validate multiple file paths at once.
|
|
79
|
-
* Returns only valid paths and collects errors.
|
|
80
|
-
*/
|
|
81
|
-
export declare function validateFilePaths(filePaths: string[], projectRoot?: string): {
|
|
82
|
-
validPaths: string[];
|
|
83
|
-
errors: Array<{
|
|
84
|
-
path: string;
|
|
85
|
-
error: string;
|
|
86
|
-
}>;
|
|
87
|
-
};
|
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* validation.ts — Input Validation & Security
|
|
3
|
-
*
|
|
4
|
-
* Centralized validation logic to prevent security vulnerabilities:
|
|
5
|
-
* - Path traversal attacks
|
|
6
|
-
* - ReDoS (Regular Expression Denial of Service)
|
|
7
|
-
* - Injection attacks
|
|
8
|
-
* - Resource exhaustion
|
|
9
|
-
*/
|
|
10
|
-
import * as path from "node:path";
|
|
11
|
-
import * as fs from "node:fs";
|
|
12
|
-
import { MAX_SYMBOL_NAME_LENGTH, MAX_REGEX_PATTERN_LENGTH, MAX_FILE_SIZE_BYTES, DANGEROUS_PATTERN_REGEX, } from "./constants.js";
|
|
13
|
-
/**
|
|
14
|
-
* Validate that a file path is safe and within allowed boundaries.
|
|
15
|
-
* Prevents path traversal attacks and access to sensitive system files.
|
|
16
|
-
*
|
|
17
|
-
* @param filePath - The path to validate
|
|
18
|
-
* @param projectRoot - Optional project root to enforce containment
|
|
19
|
-
*/
|
|
20
|
-
export function validateFilePath(filePath, projectRoot) {
|
|
21
|
-
// Normalize the path to resolve .. and . segments
|
|
22
|
-
const normalized = path.resolve(filePath);
|
|
23
|
-
// Check for dangerous patterns
|
|
24
|
-
if (DANGEROUS_PATTERN_REGEX.test(normalized)) {
|
|
25
|
-
return {
|
|
26
|
-
valid: false,
|
|
27
|
-
error: `Path contains dangerous pattern: ${normalized}`,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
// If project root is provided, ensure path is within it
|
|
31
|
-
if (projectRoot) {
|
|
32
|
-
const normalizedRoot = path.resolve(projectRoot);
|
|
33
|
-
const relative = path.relative(normalizedRoot, normalized);
|
|
34
|
-
// If relative path starts with .., it's outside the project root
|
|
35
|
-
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
36
|
-
return {
|
|
37
|
-
valid: false,
|
|
38
|
-
error: `Path is outside project root: ${normalized}`,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// Check if path exists
|
|
43
|
-
if (!fs.existsSync(normalized)) {
|
|
44
|
-
return {
|
|
45
|
-
valid: false,
|
|
46
|
-
error: `Path does not exist: ${normalized}`,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
return {
|
|
50
|
-
valid: true,
|
|
51
|
-
normalizedPath: normalized,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Validate that a directory path is safe for operations.
|
|
56
|
-
*/
|
|
57
|
-
export function validateDirectoryPath(dirPath, projectRoot) {
|
|
58
|
-
const result = validateFilePath(dirPath, projectRoot);
|
|
59
|
-
if (!result.valid)
|
|
60
|
-
return result;
|
|
61
|
-
// Ensure it's actually a directory
|
|
62
|
-
const stat = fs.statSync(result.normalizedPath);
|
|
63
|
-
if (!stat.isDirectory()) {
|
|
64
|
-
return {
|
|
65
|
-
valid: false,
|
|
66
|
-
error: `Path is not a directory: ${result.normalizedPath}`,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
return result;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Validate a symbol name to prevent ReDoS and injection attacks.
|
|
73
|
-
*
|
|
74
|
-
* @param symbolName - The symbol name to validate
|
|
75
|
-
*/
|
|
76
|
-
export function validateSymbolName(symbolName) {
|
|
77
|
-
// Check length to prevent ReDoS in fuzzy matching
|
|
78
|
-
if (symbolName.length > MAX_SYMBOL_NAME_LENGTH) {
|
|
79
|
-
return {
|
|
80
|
-
valid: false,
|
|
81
|
-
error: `Symbol name too long (max ${MAX_SYMBOL_NAME_LENGTH} characters)`,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
// Check for null bytes (can cause issues in C-based parsers)
|
|
85
|
-
if (symbolName.includes("\0")) {
|
|
86
|
-
return {
|
|
87
|
-
valid: false,
|
|
88
|
-
error: "Symbol name contains null byte",
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
// Ensure it's a valid identifier (basic check)
|
|
92
|
-
// Allows Unicode letters, digits, underscore, dollar sign
|
|
93
|
-
if (!/^[\p{L}\p{N}_$]+$/u.test(symbolName)) {
|
|
94
|
-
return {
|
|
95
|
-
valid: false,
|
|
96
|
-
error: "Symbol name contains invalid characters",
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
return { valid: true };
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Validate and sanitize a regex pattern to prevent ReDoS attacks.
|
|
103
|
-
*
|
|
104
|
-
* @param pattern - The regex pattern to validate
|
|
105
|
-
* @param flags - Optional regex flags
|
|
106
|
-
*/
|
|
107
|
-
export function validateRegexPattern(pattern, flags) {
|
|
108
|
-
// Check length
|
|
109
|
-
if (pattern.length > MAX_REGEX_PATTERN_LENGTH) {
|
|
110
|
-
return {
|
|
111
|
-
valid: false,
|
|
112
|
-
error: `Regex pattern too long (max ${MAX_REGEX_PATTERN_LENGTH} characters)`,
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
// Check for catastrophic backtracking patterns
|
|
116
|
-
// These are common ReDoS patterns
|
|
117
|
-
const dangerousPatterns = [
|
|
118
|
-
/(\w+\*)+/, // Nested quantifiers
|
|
119
|
-
/(\w+)+/, // Repeated groups
|
|
120
|
-
/(\w*)*/, // Nested stars
|
|
121
|
-
/(\w+\|)+/, // Alternation with quantifiers
|
|
122
|
-
];
|
|
123
|
-
for (const dangerous of dangerousPatterns) {
|
|
124
|
-
if (dangerous.test(pattern)) {
|
|
125
|
-
return {
|
|
126
|
-
valid: false,
|
|
127
|
-
error: "Regex pattern may cause catastrophic backtracking (ReDoS)",
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
// Try to compile the regex
|
|
132
|
-
try {
|
|
133
|
-
const regex = new RegExp(pattern, flags);
|
|
134
|
-
return {
|
|
135
|
-
valid: true,
|
|
136
|
-
safeRegex: regex,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
return {
|
|
141
|
-
valid: false,
|
|
142
|
-
error: `Invalid regex pattern: ${error instanceof Error ? error.message : String(error)}`,
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Create a safe regex with timeout protection.
|
|
148
|
-
* Uses a simple timeout mechanism to prevent long-running regex operations.
|
|
149
|
-
*
|
|
150
|
-
* @param pattern - The regex pattern
|
|
151
|
-
* @param flags - Optional regex flags
|
|
152
|
-
* @param timeoutMs - Timeout in milliseconds (default: 1000ms)
|
|
153
|
-
*/
|
|
154
|
-
export function createSafeRegex(pattern, flags, timeoutMs = 1000) {
|
|
155
|
-
const validation = validateRegexPattern(pattern, flags);
|
|
156
|
-
if (!validation.valid) {
|
|
157
|
-
throw new Error(validation.error);
|
|
158
|
-
}
|
|
159
|
-
// Return the validated regex
|
|
160
|
-
// Note: JavaScript doesn't have built-in regex timeout,
|
|
161
|
-
// so we rely on validation to prevent ReDoS
|
|
162
|
-
return validation.safeRegex;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Validate that a file is not too large to process safely.
|
|
166
|
-
*
|
|
167
|
-
* @param filePath - Path to the file
|
|
168
|
-
*/
|
|
169
|
-
export function validateFileSize(filePath) {
|
|
170
|
-
try {
|
|
171
|
-
const stat = fs.statSync(filePath);
|
|
172
|
-
const size = stat.size;
|
|
173
|
-
if (size > MAX_FILE_SIZE_BYTES) {
|
|
174
|
-
return {
|
|
175
|
-
valid: false,
|
|
176
|
-
error: `File too large: ${(size / 1024 / 1024).toFixed(2)}MB (max ${MAX_FILE_SIZE_BYTES / 1024 / 1024}MB)`,
|
|
177
|
-
size,
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
return {
|
|
181
|
-
valid: true,
|
|
182
|
-
size,
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
return {
|
|
187
|
-
valid: false,
|
|
188
|
-
error: `Failed to check file size: ${error instanceof Error ? error.message : String(error)}`,
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
// ─── Content Validation ─────────────────────────────────────────────
|
|
193
|
-
/**
|
|
194
|
-
* Check if file content contains null bytes (likely binary).
|
|
195
|
-
*/
|
|
196
|
-
export function isBinaryContent(content) {
|
|
197
|
-
return content.includes("\0");
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Validate that file content is safe to process.
|
|
201
|
-
*/
|
|
202
|
-
export function validateFileContent(content) {
|
|
203
|
-
// Check for null bytes
|
|
204
|
-
if (isBinaryContent(content)) {
|
|
205
|
-
return {
|
|
206
|
-
valid: false,
|
|
207
|
-
error: "File appears to be binary (contains null bytes)",
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
return { valid: true };
|
|
211
|
-
}
|
|
212
|
-
// ─── Batch Validation ───────────────────────────────────────────────
|
|
213
|
-
/**
|
|
214
|
-
* Validate multiple file paths at once.
|
|
215
|
-
* Returns only valid paths and collects errors.
|
|
216
|
-
*/
|
|
217
|
-
export function validateFilePaths(filePaths, projectRoot) {
|
|
218
|
-
const validPaths = [];
|
|
219
|
-
const errors = [];
|
|
220
|
-
for (const filePath of filePaths) {
|
|
221
|
-
const result = validateFilePath(filePath, projectRoot);
|
|
222
|
-
if (result.valid) {
|
|
223
|
-
validPaths.push(result.normalizedPath);
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
errors.push({ path: filePath, error: result.error });
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return { validPaths, errors };
|
|
230
|
-
}
|
|
231
|
-
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|