mcp-code-context 3.0.6 → 3.4.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/CHANGELOG.md +84 -1
- package/CHANGELOG_v3.2.0.md +196 -0
- package/CHANGELOG_v3.3.0.md +266 -0
- package/README.md +1 -1
- package/SECURITY.md +177 -0
- package/dist/src/core/engine.d.ts +2 -2
- package/dist/src/core/engine.js +14 -8
- package/dist/src/core/engine.js.map +1 -1
- package/dist/src/core/validator.d.ts +2 -2
- package/dist/src/core/validator.js +8 -7
- package/dist/src/core/validator.js.map +1 -1
- package/dist/src/index.d.ts +6 -6
- package/dist/src/index.js +499 -158
- package/dist/src/index.js.map +1 -1
- package/dist/src/operations/compress.d.ts +18 -0
- package/dist/src/operations/compress.js +89 -0
- package/dist/src/operations/compress.js.map +1 -0
- package/dist/src/operations/confirmationStore.d.ts +53 -0
- package/dist/src/operations/confirmationStore.js +91 -0
- package/dist/src/operations/confirmationStore.js.map +1 -0
- package/dist/src/operations/read.d.ts +50 -0
- package/dist/src/operations/read.js +228 -0
- package/dist/src/operations/read.js.map +1 -0
- package/dist/src/operations/write.d.ts +16 -4
- package/dist/src/operations/write.js +142 -48
- package/dist/src/operations/write.js.map +1 -1
- package/dist/src/parsers/base.d.ts +7 -2
- package/dist/src/parsers/base.js +18 -1
- package/dist/src/parsers/base.js.map +1 -1
- package/dist/src/parsers/dartTreeSitter.d.ts +3 -3
- package/dist/src/parsers/dartTreeSitter.js +6 -11
- package/dist/src/parsers/dartTreeSitter.js.map +1 -1
- package/dist/src/parsers/php.d.ts +2 -2
- package/dist/src/parsers/php.js +5 -10
- package/dist/src/parsers/php.js.map +1 -1
- package/dist/src/parsers/python.d.ts +2 -2
- package/dist/src/parsers/python.js +5 -10
- package/dist/src/parsers/python.js.map +1 -1
- package/dist/src/parsers/registry.d.ts +1 -1
- package/dist/src/parsers/registry.js +2 -2
- package/dist/src/parsers/registry.js.map +1 -1
- package/dist/src/parsers/typescript.d.ts +2 -2
- package/dist/src/parsers/typescript.js +8 -13
- package/dist/src/parsers/typescript.js.map +1 -1
- package/dist/src/utils/auditLogger.d.ts +90 -0
- package/dist/src/utils/auditLogger.js +271 -0
- package/dist/src/utils/auditLogger.js.map +1 -0
- package/dist/src/utils/backupManager.d.ts +33 -0
- package/dist/src/utils/backupManager.js +130 -0
- package/dist/src/utils/backupManager.js.map +1 -0
- package/dist/src/utils/constants.d.ts +12 -0
- package/dist/src/utils/constants.js +33 -0
- package/dist/src/utils/constants.js.map +1 -0
- package/dist/src/utils/diff.d.ts +13 -0
- package/dist/src/utils/diff.js +124 -0
- package/dist/src/utils/diff.js.map +1 -0
- package/dist/src/utils/fileLock.d.ts +63 -0
- package/dist/src/utils/fileLock.js +123 -0
- package/dist/src/utils/fileLock.js.map +1 -0
- package/dist/src/utils/rateLimiter.d.ts +61 -0
- package/dist/src/utils/rateLimiter.js +114 -0
- package/dist/src/utils/rateLimiter.js.map +1 -0
- package/dist/src/utils/safeRegex.d.ts +41 -0
- package/dist/src/utils/safeRegex.js +137 -0
- package/dist/src/utils/safeRegex.js.map +1 -0
- package/dist/src/utils/streaming.d.ts +43 -0
- package/dist/src/utils/streaming.js +175 -0
- package/dist/src/utils/streaming.js.map +1 -0
- package/dist/src/utils/telemetry.d.ts +91 -0
- package/dist/src/utils/telemetry.js +185 -0
- package/dist/src/utils/telemetry.js.map +1 -0
- package/llms.txt +46 -28
- package/package.json +5 -5
- package/mcp-code-context-3.0.2.tgz +0 -0
- package/tsconfig.tests.json +0 -27
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Write Operations - v3.
|
|
3
|
-
*
|
|
2
|
+
* Write Operations - v3.4.0
|
|
3
|
+
* FIXES: SecurityValidator in renameSymbol, atomic writes, AST-based positioning
|
|
4
4
|
*/
|
|
5
5
|
import { BaseParser } from "../parsers/base.js";
|
|
6
6
|
export interface WriteResult {
|
|
@@ -38,7 +38,7 @@ export interface RemoveOptions {
|
|
|
38
38
|
*/
|
|
39
39
|
export declare function replaceSymbol(options: ReplaceOptions): Promise<WriteResult>;
|
|
40
40
|
/**
|
|
41
|
-
* Insert code at a specific location
|
|
41
|
+
* Insert code at a specific location using AST positioning
|
|
42
42
|
*/
|
|
43
43
|
export declare function insertCode(options: InsertOptions): Promise<WriteResult>;
|
|
44
44
|
/**
|
|
@@ -46,6 +46,18 @@ export declare function insertCode(options: InsertOptions): Promise<WriteResult>
|
|
|
46
46
|
*/
|
|
47
47
|
export declare function removeSymbol(options: RemoveOptions): Promise<WriteResult>;
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
49
|
+
* Rename symbol using AST-aware replacement
|
|
50
|
+
* v3.4.0 - SECURITY FIX: Validates all paths + uses atomic writes
|
|
51
|
+
*/
|
|
52
|
+
export declare function renameSymbol(params: {
|
|
53
|
+
filePath: string;
|
|
54
|
+
projectRoot: string;
|
|
55
|
+
oldName: string;
|
|
56
|
+
newName: string;
|
|
57
|
+
rootDir: string;
|
|
58
|
+
parser: BaseParser;
|
|
59
|
+
}): Promise<WriteResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Atomic file write: write to .tmp then rename
|
|
50
62
|
*/
|
|
51
63
|
export declare function writeFile(filePath: string, content: string): Promise<void>;
|
|
@@ -1,28 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Write Operations - v3.
|
|
3
|
-
*
|
|
2
|
+
* Write Operations - v3.4.0
|
|
3
|
+
* FIXES: SecurityValidator in renameSymbol, atomic writes, AST-based positioning
|
|
4
4
|
*/
|
|
5
5
|
import * as fs from "node:fs/promises";
|
|
6
|
+
import * as path from "node:path";
|
|
6
7
|
import { SecurityValidator } from "../core/validator.js";
|
|
8
|
+
import { EXCLUDE_DIRS, SUPPORTED_EXTENSIONS } from "../utils/constants.js";
|
|
9
|
+
import { generateUnifiedDiff } from "../utils/diff.js";
|
|
10
|
+
import { sanitizeRegexPattern } from "../utils/safeRegex.js";
|
|
11
|
+
/**
|
|
12
|
+
* Validate syntax of generated code
|
|
13
|
+
*/
|
|
14
|
+
function validateSyntax(content, parser) {
|
|
15
|
+
try {
|
|
16
|
+
const tree = parser.parse(content);
|
|
17
|
+
if (tree.rootNode.hasError) {
|
|
18
|
+
return { valid: false, error: "Generated code has syntax errors" };
|
|
19
|
+
}
|
|
20
|
+
return { valid: true };
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return { valid: false, error: `Syntax validation failed: ${error}` };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
7
26
|
/**
|
|
8
27
|
* Replace a symbol with new content
|
|
9
28
|
*/
|
|
10
29
|
export async function replaceSymbol(options) {
|
|
11
30
|
const { filePath, projectRoot, symbolName, newContent, className, parser } = options;
|
|
12
|
-
// Validate
|
|
31
|
+
// Validate path boundary
|
|
13
32
|
const validator = new SecurityValidator(projectRoot);
|
|
14
33
|
const validation = await validator.validateFilePath(filePath);
|
|
15
34
|
if (!validation.valid) {
|
|
16
35
|
return { success: false, error: validation.error };
|
|
17
36
|
}
|
|
18
37
|
try {
|
|
19
|
-
// Read file
|
|
20
38
|
const content = await fs.readFile(validation.resolvedPath, "utf-8");
|
|
21
|
-
// Parse
|
|
22
39
|
const tree = parser.parse(content);
|
|
23
|
-
//
|
|
40
|
+
// Use AST-based replacement
|
|
24
41
|
const result = parser.replaceSymbol(content, tree, symbolName, newContent, className);
|
|
25
|
-
//
|
|
42
|
+
// Validate syntax of generated code
|
|
43
|
+
const syntaxCheck = validateSyntax(result, parser);
|
|
44
|
+
if (!syntaxCheck.valid) {
|
|
45
|
+
return { success: false, error: syntaxCheck.error };
|
|
46
|
+
}
|
|
26
47
|
const diff = generateDiff(content, result);
|
|
27
48
|
return {
|
|
28
49
|
success: true,
|
|
@@ -38,7 +59,7 @@ export async function replaceSymbol(options) {
|
|
|
38
59
|
}
|
|
39
60
|
}
|
|
40
61
|
/**
|
|
41
|
-
* Insert code at a specific location
|
|
62
|
+
* Insert code at a specific location using AST positioning
|
|
42
63
|
*/
|
|
43
64
|
export async function insertCode(options) {
|
|
44
65
|
const { filePath, projectRoot, code, anchorSymbol, position = "after", className, parser } = options;
|
|
@@ -56,35 +77,36 @@ export async function insertCode(options) {
|
|
|
56
77
|
insertIndex = content.length;
|
|
57
78
|
}
|
|
58
79
|
else {
|
|
59
|
-
// Find anchor
|
|
60
|
-
const
|
|
61
|
-
|
|
80
|
+
// Find anchor using AST
|
|
81
|
+
const symbols = parser.findSymbols(tree);
|
|
82
|
+
const anchorNode = symbols.find(s => s.name === anchorSymbol && (!className || s.className === className));
|
|
83
|
+
if (!anchorNode) {
|
|
62
84
|
return { success: false, error: `Anchor symbol "${anchorSymbol}" not found` };
|
|
63
85
|
}
|
|
64
|
-
|
|
65
|
-
if (anchorIndex === -1) {
|
|
66
|
-
return { success: false, error: "Could not locate anchor in content" };
|
|
67
|
-
}
|
|
86
|
+
// Use AST indices for positioning
|
|
68
87
|
switch (position) {
|
|
69
88
|
case "before":
|
|
70
|
-
insertIndex =
|
|
89
|
+
insertIndex = anchorNode.startIndex;
|
|
71
90
|
break;
|
|
72
91
|
case "after":
|
|
73
|
-
insertIndex =
|
|
92
|
+
insertIndex = anchorNode.endIndex;
|
|
74
93
|
break;
|
|
75
94
|
case "inside_start":
|
|
76
|
-
|
|
77
|
-
insertIndex = content.indexOf("{", anchorIndex) + 1;
|
|
95
|
+
insertIndex = content.indexOf("{", anchorNode.startIndex) + 1;
|
|
78
96
|
break;
|
|
79
97
|
case "inside_end":
|
|
80
|
-
|
|
81
|
-
insertIndex = anchorIndex + extracted.lastIndexOf("}");
|
|
98
|
+
insertIndex = content.lastIndexOf("}", anchorNode.endIndex);
|
|
82
99
|
break;
|
|
83
100
|
default:
|
|
84
|
-
insertIndex =
|
|
101
|
+
insertIndex = anchorNode.endIndex;
|
|
85
102
|
}
|
|
86
103
|
}
|
|
87
104
|
const result = content.substring(0, insertIndex) + "\n" + code + "\n" + content.substring(insertIndex);
|
|
105
|
+
// Validate syntax
|
|
106
|
+
const syntaxCheck = validateSyntax(result, parser);
|
|
107
|
+
if (!syntaxCheck.valid) {
|
|
108
|
+
return { success: false, error: syntaxCheck.error };
|
|
109
|
+
}
|
|
88
110
|
const diff = generateDiff(content, result);
|
|
89
111
|
return {
|
|
90
112
|
success: true,
|
|
@@ -112,15 +134,19 @@ export async function removeSymbol(options) {
|
|
|
112
134
|
try {
|
|
113
135
|
const content = await fs.readFile(validation.resolvedPath, "utf-8");
|
|
114
136
|
const tree = parser.parse(content);
|
|
115
|
-
|
|
116
|
-
|
|
137
|
+
// Use findSymbols for AST-based location
|
|
138
|
+
const symbols = parser.findSymbols(tree);
|
|
139
|
+
const target = symbols.find(s => s.name === symbolName && (!className || s.className === className));
|
|
140
|
+
if (!target) {
|
|
117
141
|
return { success: false, error: `Symbol "${symbolName}" not found` };
|
|
118
142
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
143
|
+
// Use AST startIndex/endIndex instead of indexOf
|
|
144
|
+
const result = content.substring(0, target.startIndex) + content.substring(target.endIndex);
|
|
145
|
+
// Validate syntax
|
|
146
|
+
const syntaxCheck = validateSyntax(result, parser);
|
|
147
|
+
if (!syntaxCheck.valid) {
|
|
148
|
+
return { success: false, error: syntaxCheck.error };
|
|
122
149
|
}
|
|
123
|
-
const result = content.substring(0, index) + content.substring(index + extracted.length);
|
|
124
150
|
const diff = generateDiff(content, result);
|
|
125
151
|
return {
|
|
126
152
|
success: true,
|
|
@@ -136,7 +162,92 @@ export async function removeSymbol(options) {
|
|
|
136
162
|
}
|
|
137
163
|
}
|
|
138
164
|
/**
|
|
139
|
-
*
|
|
165
|
+
* Rename symbol using AST-aware replacement
|
|
166
|
+
* v3.4.0 - SECURITY FIX: Validates all paths + uses atomic writes
|
|
167
|
+
*/
|
|
168
|
+
export async function renameSymbol(params) {
|
|
169
|
+
try {
|
|
170
|
+
const validator = new SecurityValidator(params.projectRoot);
|
|
171
|
+
// Validate definition file path
|
|
172
|
+
const defValidation = await validator.validateFilePath(params.filePath);
|
|
173
|
+
if (!defValidation.valid) {
|
|
174
|
+
return { success: false, error: defValidation.error };
|
|
175
|
+
}
|
|
176
|
+
// Sanitize to prevent regex injection
|
|
177
|
+
const sanitizedOld = sanitizeRegexPattern(params.oldName);
|
|
178
|
+
// Step 1: Rename in definition file using AST
|
|
179
|
+
const content = await fs.readFile(defValidation.resolvedPath, "utf-8");
|
|
180
|
+
const tree = params.parser.parse(content);
|
|
181
|
+
const symbols = params.parser.findSymbols(tree);
|
|
182
|
+
const targetSymbol = symbols.find(s => s.name === params.oldName);
|
|
183
|
+
if (!targetSymbol) {
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
error: `Symbol "${params.oldName}" not found in ${params.filePath}`,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// Replace only in symbol definition (AST-based)
|
|
190
|
+
let newContent = content.substring(0, targetSymbol.startIndex) +
|
|
191
|
+
content.substring(targetSymbol.startIndex, targetSymbol.endIndex)
|
|
192
|
+
.replace(new RegExp(`\\b${sanitizedOld}\\b`, "g"), params.newName) +
|
|
193
|
+
content.substring(targetSymbol.endIndex);
|
|
194
|
+
// Step 2: Find dependent files (within project boundary)
|
|
195
|
+
const dependents = [];
|
|
196
|
+
async function walkDir(dir) {
|
|
197
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
198
|
+
for (const entry of entries) {
|
|
199
|
+
const fullPath = path.join(dir, entry.name);
|
|
200
|
+
if (entry.isDirectory()) {
|
|
201
|
+
if (!EXCLUDE_DIRS.includes(entry.name)) {
|
|
202
|
+
await walkDir(fullPath);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else if (entry.isFile()) {
|
|
206
|
+
const ext = path.extname(entry.name);
|
|
207
|
+
if (SUPPORTED_EXTENSIONS.includes(ext)) {
|
|
208
|
+
// SECURITY FIX: Validate each dependent file path
|
|
209
|
+
const depValidation = await validator.validateFilePath(fullPath);
|
|
210
|
+
if (!depValidation.valid)
|
|
211
|
+
continue;
|
|
212
|
+
const fileContent = await fs.readFile(fullPath, "utf-8");
|
|
213
|
+
const importPatterns = [
|
|
214
|
+
new RegExp(`import.*\\b${sanitizedOld}\\b`, "g"),
|
|
215
|
+
new RegExp(`from.*\\b${sanitizedOld}\\b`, "g"),
|
|
216
|
+
new RegExp(`require.*\\b${sanitizedOld}\\b`, "g"),
|
|
217
|
+
new RegExp(`use.*\\b${sanitizedOld}\\b`, "g"),
|
|
218
|
+
];
|
|
219
|
+
if (importPatterns.some(p => p.test(fileContent))) {
|
|
220
|
+
dependents.push(fullPath);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
await walkDir(params.rootDir);
|
|
227
|
+
// Step 3: Rename in dependent files using atomic writes
|
|
228
|
+
for (const depFile of dependents) {
|
|
229
|
+
const depContent = await fs.readFile(depFile, "utf-8");
|
|
230
|
+
const depNewContent = depContent.replace(new RegExp(`\\b${sanitizedOld}\\b`, "g"), params.newName);
|
|
231
|
+
// SECURITY FIX: Use atomic write
|
|
232
|
+
await writeFile(depFile, depNewContent);
|
|
233
|
+
}
|
|
234
|
+
// Step 4: Write definition file atomically
|
|
235
|
+
await writeFile(defValidation.resolvedPath, newContent);
|
|
236
|
+
return {
|
|
237
|
+
success: true,
|
|
238
|
+
newContent,
|
|
239
|
+
diff: `Renamed "${params.oldName}" → "${params.newName}" in ${dependents.length + 1} files`,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
return {
|
|
244
|
+
success: false,
|
|
245
|
+
error: error instanceof Error ? error.message : String(error),
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Atomic file write: write to .tmp then rename
|
|
140
251
|
*/
|
|
141
252
|
export async function writeFile(filePath, content) {
|
|
142
253
|
const tmpPath = filePath + ".tmp";
|
|
@@ -144,26 +255,9 @@ export async function writeFile(filePath, content) {
|
|
|
144
255
|
await fs.rename(tmpPath, filePath);
|
|
145
256
|
}
|
|
146
257
|
/**
|
|
147
|
-
* Generate unified diff
|
|
258
|
+
* Generate unified diff
|
|
148
259
|
*/
|
|
149
260
|
function generateDiff(oldContent, newContent) {
|
|
150
|
-
|
|
151
|
-
const newLines = newContent.split("\n");
|
|
152
|
-
const diff = [];
|
|
153
|
-
const maxLen = Math.max(oldLines.length, newLines.length);
|
|
154
|
-
for (let i = 0; i < maxLen; i++) {
|
|
155
|
-
const oldLine = oldLines[i];
|
|
156
|
-
const newLine = newLines[i];
|
|
157
|
-
if (oldLine === newLine) {
|
|
158
|
-
diff.push(` ${oldLine || ""}`);
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
if (oldLine !== undefined)
|
|
162
|
-
diff.push(`- ${oldLine}`);
|
|
163
|
-
if (newLine !== undefined)
|
|
164
|
-
diff.push(`+ ${newLine}`);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return diff.join("\n");
|
|
261
|
+
return generateUnifiedDiff(oldContent, newContent, 3);
|
|
168
262
|
}
|
|
169
263
|
//# sourceMappingURL=write.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/operations/write.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/operations/write.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Base Parser - v3.
|
|
2
|
+
* Base Parser - v3.4.0
|
|
3
3
|
* Abstract base for all language parsers
|
|
4
|
+
* IMPROVEMENT: replaceSymbol moved here using AST indices (eliminates indexOf fragility)
|
|
4
5
|
*/
|
|
5
6
|
import { Parser, Tree, Language } from "web-tree-sitter";
|
|
6
7
|
export interface ParseResult {
|
|
@@ -22,7 +23,11 @@ export declare abstract class BaseParser {
|
|
|
22
23
|
init(parser: Parser, language: Language): Promise<void>;
|
|
23
24
|
parse(content: string, oldTree?: Tree): Tree;
|
|
24
25
|
abstract extractSymbol(tree: Tree, symbolName: string, className?: string): string | null;
|
|
25
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Replace a symbol using AST startIndex/endIndex (no indexOf fragility)
|
|
28
|
+
* Concrete implementation — subclasses inherit this.
|
|
29
|
+
*/
|
|
30
|
+
replaceSymbol(content: string, tree: Tree, symbolName: string, newContent: string, className?: string): string;
|
|
26
31
|
abstract findSymbols(tree: Tree): SymbolInfo[];
|
|
27
32
|
getName(): string;
|
|
28
33
|
}
|
package/dist/src/parsers/base.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Base Parser - v3.
|
|
2
|
+
* Base Parser - v3.4.0
|
|
3
3
|
* Abstract base for all language parsers
|
|
4
|
+
* IMPROVEMENT: replaceSymbol moved here using AST indices (eliminates indexOf fragility)
|
|
4
5
|
*/
|
|
5
6
|
export class BaseParser {
|
|
6
7
|
parser;
|
|
@@ -20,6 +21,22 @@ export class BaseParser {
|
|
|
20
21
|
throw new Error(`${this.languageName} parsing failed`);
|
|
21
22
|
return tree;
|
|
22
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Replace a symbol using AST startIndex/endIndex (no indexOf fragility)
|
|
26
|
+
* Concrete implementation — subclasses inherit this.
|
|
27
|
+
*/
|
|
28
|
+
replaceSymbol(content, tree, symbolName, newContent, className) {
|
|
29
|
+
// Find symbol via AST
|
|
30
|
+
const symbols = this.findSymbols(tree);
|
|
31
|
+
const target = symbols.find(s => s.name === symbolName && (!className || s.className === className));
|
|
32
|
+
if (!target) {
|
|
33
|
+
throw new Error(`Symbol "${symbolName}" not found`);
|
|
34
|
+
}
|
|
35
|
+
// Use AST indices for precise replacement (no indexOf false-match)
|
|
36
|
+
return content.substring(0, target.startIndex) +
|
|
37
|
+
newContent +
|
|
38
|
+
content.substring(target.endIndex);
|
|
39
|
+
}
|
|
23
40
|
getName() {
|
|
24
41
|
return this.languageName;
|
|
25
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/parsers/base.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/parsers/base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,MAAM,OAAgB,UAAU;IACpB,MAAM,CAAU;IAChB,QAAQ,CAAY;IACpB,YAAY,CAAS;IAE/B,YAAY,YAAoB;QAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,QAAkB;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,OAAc;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,iBAAiB,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAQD;;;OAGG;IACH,aAAa,CACX,OAAe,EACf,IAAU,EACV,UAAkB,EAClB,UAAkB,EAClB,SAAkB;QAElB,sBAAsB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC9B,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CACnE,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,aAAa,CAAC,CAAC;QACtD,CAAC;QAED,mEAAmE;QACnE,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;YAC5C,UAAU;YACV,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAID,OAAO;QACL,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dart Tree-sitter Parser - v3.
|
|
3
|
-
* 100% AST accuracy
|
|
2
|
+
* Dart Tree-sitter Parser - v3.4.0
|
|
3
|
+
* 100% AST accuracy via WASM
|
|
4
|
+
* CLEANUP: replaceSymbol removed (inherited from BaseParser)
|
|
4
5
|
*/
|
|
5
6
|
import { Tree } from "web-tree-sitter";
|
|
6
7
|
import { BaseParser, SymbolInfo } from "./base.js";
|
|
7
8
|
export declare class DartTreeSitterParser extends BaseParser {
|
|
8
9
|
constructor();
|
|
9
10
|
extractSymbol(tree: Tree, symbolName: string, className?: string): string | null;
|
|
10
|
-
replaceSymbol(content: string, tree: Tree, symbolName: string, newContent: string, className?: string): string;
|
|
11
11
|
findSymbols(tree: Tree): SymbolInfo[];
|
|
12
12
|
private findParentClass;
|
|
13
13
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dart Tree-sitter Parser - v3.
|
|
3
|
-
* 100% AST accuracy
|
|
2
|
+
* Dart Tree-sitter Parser - v3.4.0
|
|
3
|
+
* 100% AST accuracy via WASM
|
|
4
|
+
* CLEANUP: replaceSymbol removed (inherited from BaseParser)
|
|
4
5
|
*/
|
|
5
6
|
import { BaseParser } from "./base.js";
|
|
6
7
|
export class DartTreeSitterParser extends BaseParser {
|
|
@@ -19,6 +20,7 @@ export class DartTreeSitterParser extends BaseParser {
|
|
|
19
20
|
if (className) {
|
|
20
21
|
const classNode = this.findParentClass(node);
|
|
21
22
|
if (!classNode || classNode.childForFieldName("name")?.text !== className) {
|
|
23
|
+
// Continue searching
|
|
22
24
|
}
|
|
23
25
|
else {
|
|
24
26
|
return tree.rootNode.text.substring(node.startIndex, node.endIndex);
|
|
@@ -41,15 +43,6 @@ export class DartTreeSitterParser extends BaseParser {
|
|
|
41
43
|
};
|
|
42
44
|
return search();
|
|
43
45
|
}
|
|
44
|
-
replaceSymbol(content, tree, symbolName, newContent, className) {
|
|
45
|
-
const extracted = this.extractSymbol(tree, symbolName, className);
|
|
46
|
-
if (!extracted)
|
|
47
|
-
throw new Error(`Symbol "${symbolName}" not found`);
|
|
48
|
-
const index = content.indexOf(extracted);
|
|
49
|
-
if (index === -1)
|
|
50
|
-
throw new Error("Could not locate symbol in content");
|
|
51
|
-
return content.substring(0, index) + newContent + content.substring(index + extracted.length);
|
|
52
|
-
}
|
|
53
46
|
findSymbols(tree) {
|
|
54
47
|
const symbols = [];
|
|
55
48
|
const cursor = tree.walk();
|
|
@@ -60,11 +53,13 @@ export class DartTreeSitterParser extends BaseParser {
|
|
|
60
53
|
node.type === "method_signature") {
|
|
61
54
|
const nameNode = node.childForFieldName("name");
|
|
62
55
|
if (nameNode) {
|
|
56
|
+
const parentClass = this.findParentClass(node);
|
|
63
57
|
symbols.push({
|
|
64
58
|
name: nameNode.text,
|
|
65
59
|
type: node.type,
|
|
66
60
|
startIndex: node.startIndex,
|
|
67
61
|
endIndex: node.endIndex,
|
|
62
|
+
className: parentClass?.childForFieldName("name")?.text,
|
|
68
63
|
});
|
|
69
64
|
}
|
|
70
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dartTreeSitter.js","sourceRoot":"","sources":["../../../src/parsers/dartTreeSitter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dartTreeSitter.js","sourceRoot":"","sources":["../../../src/parsers/dartTreeSitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* PHP Parser - v3.
|
|
2
|
+
* PHP Parser - v3.4.0
|
|
3
|
+
* CLEANUP: replaceSymbol removed (inherited from BaseParser)
|
|
3
4
|
*/
|
|
4
5
|
import { Tree } from "web-tree-sitter";
|
|
5
6
|
import { BaseParser, SymbolInfo } from "./base.js";
|
|
6
7
|
export declare class PHPParser extends BaseParser {
|
|
7
8
|
constructor();
|
|
8
9
|
extractSymbol(tree: Tree, symbolName: string, className?: string): string | null;
|
|
9
|
-
replaceSymbol(content: string, tree: Tree, symbolName: string, newContent: string, className?: string): string;
|
|
10
10
|
findSymbols(tree: Tree): SymbolInfo[];
|
|
11
11
|
private findParentClass;
|
|
12
12
|
}
|
package/dist/src/parsers/php.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* PHP Parser - v3.
|
|
2
|
+
* PHP Parser - v3.4.0
|
|
3
|
+
* CLEANUP: replaceSymbol removed (inherited from BaseParser)
|
|
3
4
|
*/
|
|
4
5
|
import { BaseParser } from "./base.js";
|
|
5
6
|
export class PHPParser extends BaseParser {
|
|
@@ -16,6 +17,7 @@ export class PHPParser extends BaseParser {
|
|
|
16
17
|
if (className) {
|
|
17
18
|
const classNode = this.findParentClass(node);
|
|
18
19
|
if (!classNode || classNode.childForFieldName("name")?.text !== className) {
|
|
20
|
+
// Continue searching
|
|
19
21
|
}
|
|
20
22
|
else {
|
|
21
23
|
return tree.rootNode.text.substring(node.startIndex, node.endIndex);
|
|
@@ -38,15 +40,6 @@ export class PHPParser extends BaseParser {
|
|
|
38
40
|
};
|
|
39
41
|
return search();
|
|
40
42
|
}
|
|
41
|
-
replaceSymbol(content, tree, symbolName, newContent, className) {
|
|
42
|
-
const extracted = this.extractSymbol(tree, symbolName, className);
|
|
43
|
-
if (!extracted)
|
|
44
|
-
throw new Error(`Symbol "${symbolName}" not found`);
|
|
45
|
-
const index = content.indexOf(extracted);
|
|
46
|
-
if (index === -1)
|
|
47
|
-
throw new Error("Could not locate symbol in content");
|
|
48
|
-
return content.substring(0, index) + newContent + content.substring(index + extracted.length);
|
|
49
|
-
}
|
|
50
43
|
findSymbols(tree) {
|
|
51
44
|
const symbols = [];
|
|
52
45
|
const cursor = tree.walk();
|
|
@@ -55,11 +48,13 @@ export class PHPParser extends BaseParser {
|
|
|
55
48
|
if (node.type === "function_definition" || node.type === "class_declaration" || node.type === "method_declaration") {
|
|
56
49
|
const nameNode = node.childForFieldName("name");
|
|
57
50
|
if (nameNode) {
|
|
51
|
+
const parentClass = this.findParentClass(node);
|
|
58
52
|
symbols.push({
|
|
59
53
|
name: nameNode.text,
|
|
60
54
|
type: node.type,
|
|
61
55
|
startIndex: node.startIndex,
|
|
62
56
|
endIndex: node.endIndex,
|
|
57
|
+
className: parentClass?.childForFieldName("name")?.text,
|
|
63
58
|
});
|
|
64
59
|
}
|
|
65
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"php.js","sourceRoot":"","sources":["../../../src/parsers/php.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"php.js","sourceRoot":"","sources":["../../../src/parsers/php.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Python Parser - v3.
|
|
2
|
+
* Python Parser - v3.4.0
|
|
3
|
+
* CLEANUP: replaceSymbol removed (inherited from BaseParser)
|
|
3
4
|
*/
|
|
4
5
|
import { Tree } from "web-tree-sitter";
|
|
5
6
|
import { BaseParser, SymbolInfo } from "./base.js";
|
|
6
7
|
export declare class PythonParser extends BaseParser {
|
|
7
8
|
constructor();
|
|
8
9
|
extractSymbol(tree: Tree, symbolName: string, className?: string): string | null;
|
|
9
|
-
replaceSymbol(content: string, tree: Tree, symbolName: string, newContent: string, className?: string): string;
|
|
10
10
|
findSymbols(tree: Tree): SymbolInfo[];
|
|
11
11
|
private findParentClass;
|
|
12
12
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Python Parser - v3.
|
|
2
|
+
* Python Parser - v3.4.0
|
|
3
|
+
* CLEANUP: replaceSymbol removed (inherited from BaseParser)
|
|
3
4
|
*/
|
|
4
5
|
import { BaseParser } from "./base.js";
|
|
5
6
|
export class PythonParser extends BaseParser {
|
|
@@ -16,6 +17,7 @@ export class PythonParser extends BaseParser {
|
|
|
16
17
|
if (className) {
|
|
17
18
|
const classNode = this.findParentClass(node);
|
|
18
19
|
if (!classNode || classNode.childForFieldName("name")?.text !== className) {
|
|
20
|
+
// Continue searching
|
|
19
21
|
}
|
|
20
22
|
else {
|
|
21
23
|
return tree.rootNode.text.substring(node.startIndex, node.endIndex);
|
|
@@ -38,15 +40,6 @@ export class PythonParser extends BaseParser {
|
|
|
38
40
|
};
|
|
39
41
|
return search();
|
|
40
42
|
}
|
|
41
|
-
replaceSymbol(content, tree, symbolName, newContent, className) {
|
|
42
|
-
const extracted = this.extractSymbol(tree, symbolName, className);
|
|
43
|
-
if (!extracted)
|
|
44
|
-
throw new Error(`Symbol "${symbolName}" not found`);
|
|
45
|
-
const index = content.indexOf(extracted);
|
|
46
|
-
if (index === -1)
|
|
47
|
-
throw new Error("Could not locate symbol in content");
|
|
48
|
-
return content.substring(0, index) + newContent + content.substring(index + extracted.length);
|
|
49
|
-
}
|
|
50
43
|
findSymbols(tree) {
|
|
51
44
|
const symbols = [];
|
|
52
45
|
const cursor = tree.walk();
|
|
@@ -55,11 +48,13 @@ export class PythonParser extends BaseParser {
|
|
|
55
48
|
if (node.type === "function_definition" || node.type === "class_definition") {
|
|
56
49
|
const nameNode = node.childForFieldName("name");
|
|
57
50
|
if (nameNode) {
|
|
51
|
+
const parentClass = this.findParentClass(node);
|
|
58
52
|
symbols.push({
|
|
59
53
|
name: nameNode.text,
|
|
60
54
|
type: node.type,
|
|
61
55
|
startIndex: node.startIndex,
|
|
62
56
|
endIndex: node.endIndex,
|
|
57
|
+
className: parentClass?.childForFieldName("name")?.text,
|
|
63
58
|
});
|
|
64
59
|
}
|
|
65
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/parsers/python.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/parsers/python.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAc,MAAM,WAAW,CAAC;AAEnD,MAAM,OAAO,YAAa,SAAQ,UAAU;IAC1C;QACE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;IAED,aAAa,CAAC,IAAU,EAAE,UAAkB,EAAE,SAAkB;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,GAAkB,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;YAEhC,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAChD,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC7C,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;wBAC7C,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;4BAC1E,qBAAqB;wBACvB,CAAC;6BAAM,CAAC;4BACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;wBACtE,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACtE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC5B,GAAG,CAAC;oBACF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;oBACxB,IAAI,MAAM;wBAAE,OAAO,MAAM,CAAC;gBAC5B,CAAC,QAAQ,MAAM,CAAC,eAAe,EAAE,EAAE;gBACnC,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,WAAW,CAAC,IAAU;QACpB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE3B,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;YAEhC,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAChD,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;oBAC/C,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,SAAS,EAAE,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,IAAI;qBACxD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC5B,GAAG,CAAC;oBACF,KAAK,EAAE,CAAC;gBACV,CAAC,QAAQ,MAAM,CAAC,eAAe,EAAE,EAAE;gBACnC,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,EAAE,CAAC;QACR,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,eAAe,CAAC,IAAU;QAChC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,OAAO,OAAO,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB;gBAAE,OAAO,OAAO,CAAC;YACxD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|