camouf 0.1.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 +346 -0
- package/dist/cli/commands/analyze.d.ts +8 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +81 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +104 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/report.d.ts +8 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +63 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +9 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +87 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +9 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +93 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +48 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/version.d.ts +16 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +16 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/core/analyzer/architecture-visualizer.d.ts +25 -0
- package/dist/core/analyzer/architecture-visualizer.d.ts.map +1 -0
- package/dist/core/analyzer/architecture-visualizer.js +333 -0
- package/dist/core/analyzer/architecture-visualizer.js.map +1 -0
- package/dist/core/analyzer/dependency-analyzer.d.ts +49 -0
- package/dist/core/analyzer/dependency-analyzer.d.ts.map +1 -0
- package/dist/core/analyzer/dependency-analyzer.js +242 -0
- package/dist/core/analyzer/dependency-analyzer.js.map +1 -0
- package/dist/core/config/config-schema.d.ts +280 -0
- package/dist/core/config/config-schema.d.ts.map +1 -0
- package/dist/core/config/config-schema.js +199 -0
- package/dist/core/config/config-schema.js.map +1 -0
- package/dist/core/config/configuration-manager.d.ts +82 -0
- package/dist/core/config/configuration-manager.d.ts.map +1 -0
- package/dist/core/config/configuration-manager.js +306 -0
- package/dist/core/config/configuration-manager.js.map +1 -0
- package/dist/core/logger.d.ts +27 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +86 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/parsers/go-parser.d.ts +16 -0
- package/dist/core/parsers/go-parser.d.ts.map +1 -0
- package/dist/core/parsers/go-parser.js +117 -0
- package/dist/core/parsers/go-parser.js.map +1 -0
- package/dist/core/parsers/java-parser.d.ts +22 -0
- package/dist/core/parsers/java-parser.d.ts.map +1 -0
- package/dist/core/parsers/java-parser.js +114 -0
- package/dist/core/parsers/java-parser.js.map +1 -0
- package/dist/core/parsers/javascript-parser.d.ts +14 -0
- package/dist/core/parsers/javascript-parser.d.ts.map +1 -0
- package/dist/core/parsers/javascript-parser.js +19 -0
- package/dist/core/parsers/javascript-parser.js.map +1 -0
- package/dist/core/parsers/parser-registry.d.ts +45 -0
- package/dist/core/parsers/parser-registry.d.ts.map +1 -0
- package/dist/core/parsers/parser-registry.js +121 -0
- package/dist/core/parsers/parser-registry.js.map +1 -0
- package/dist/core/parsers/parser.interface.d.ts +49 -0
- package/dist/core/parsers/parser.interface.d.ts.map +1 -0
- package/dist/core/parsers/parser.interface.js +7 -0
- package/dist/core/parsers/parser.interface.js.map +1 -0
- package/dist/core/parsers/python-parser.d.ts +22 -0
- package/dist/core/parsers/python-parser.d.ts.map +1 -0
- package/dist/core/parsers/python-parser.js +136 -0
- package/dist/core/parsers/python-parser.js.map +1 -0
- package/dist/core/parsers/rust-parser.d.ts +16 -0
- package/dist/core/parsers/rust-parser.d.ts.map +1 -0
- package/dist/core/parsers/rust-parser.js +176 -0
- package/dist/core/parsers/rust-parser.js.map +1 -0
- package/dist/core/parsers/typescript-parser.d.ts +29 -0
- package/dist/core/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/core/parsers/typescript-parser.js +251 -0
- package/dist/core/parsers/typescript-parser.js.map +1 -0
- package/dist/core/reporter/report-generator.d.ts +31 -0
- package/dist/core/reporter/report-generator.d.ts.map +1 -0
- package/dist/core/reporter/report-generator.js +417 -0
- package/dist/core/reporter/report-generator.js.map +1 -0
- package/dist/core/reporter/violation-reporter.d.ts +62 -0
- package/dist/core/reporter/violation-reporter.d.ts.map +1 -0
- package/dist/core/reporter/violation-reporter.js +265 -0
- package/dist/core/reporter/violation-reporter.js.map +1 -0
- package/dist/core/rules/builtin/api-versioning.rule.d.ts +28 -0
- package/dist/core/rules/builtin/api-versioning.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/api-versioning.rule.js +103 -0
- package/dist/core/rules/builtin/api-versioning.rule.js.map +1 -0
- package/dist/core/rules/builtin/circular-dependencies.rule.d.ts +26 -0
- package/dist/core/rules/builtin/circular-dependencies.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/circular-dependencies.rule.js +99 -0
- package/dist/core/rules/builtin/circular-dependencies.rule.js.map +1 -0
- package/dist/core/rules/builtin/data-flow-integrity.rule.d.ts +27 -0
- package/dist/core/rules/builtin/data-flow-integrity.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/data-flow-integrity.rule.js +111 -0
- package/dist/core/rules/builtin/data-flow-integrity.rule.js.map +1 -0
- package/dist/core/rules/builtin/ddd-boundaries.rule.d.ts +31 -0
- package/dist/core/rules/builtin/ddd-boundaries.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/ddd-boundaries.rule.js +141 -0
- package/dist/core/rules/builtin/ddd-boundaries.rule.js.map +1 -0
- package/dist/core/rules/builtin/distributed-transactions.rule.d.ts +27 -0
- package/dist/core/rules/builtin/distributed-transactions.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/distributed-transactions.rule.js +134 -0
- package/dist/core/rules/builtin/distributed-transactions.rule.js.map +1 -0
- package/dist/core/rules/builtin/index.d.ts +16 -0
- package/dist/core/rules/builtin/index.d.ts.map +1 -0
- package/dist/core/rules/builtin/index.js +16 -0
- package/dist/core/rules/builtin/index.js.map +1 -0
- package/dist/core/rules/builtin/layer-dependencies.rule.d.ts +30 -0
- package/dist/core/rules/builtin/layer-dependencies.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/layer-dependencies.rule.js +102 -0
- package/dist/core/rules/builtin/layer-dependencies.rule.js.map +1 -0
- package/dist/core/rules/builtin/performance-antipatterns.rule.d.ts +29 -0
- package/dist/core/rules/builtin/performance-antipatterns.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/performance-antipatterns.rule.js +148 -0
- package/dist/core/rules/builtin/performance-antipatterns.rule.js.map +1 -0
- package/dist/core/rules/builtin/resilience-patterns.rule.d.ts +29 -0
- package/dist/core/rules/builtin/resilience-patterns.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/resilience-patterns.rule.js +123 -0
- package/dist/core/rules/builtin/resilience-patterns.rule.js.map +1 -0
- package/dist/core/rules/builtin/security-context.rule.d.ts +32 -0
- package/dist/core/rules/builtin/security-context.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/security-context.rule.js +145 -0
- package/dist/core/rules/builtin/security-context.rule.js.map +1 -0
- package/dist/core/rules/builtin/type-safety.rule.d.ts +32 -0
- package/dist/core/rules/builtin/type-safety.rule.d.ts.map +1 -0
- package/dist/core/rules/builtin/type-safety.rule.js +175 -0
- package/dist/core/rules/builtin/type-safety.rule.js.map +1 -0
- package/dist/core/rules/rule-engine.d.ts +72 -0
- package/dist/core/rules/rule-engine.d.ts.map +1 -0
- package/dist/core/rules/rule-engine.js +225 -0
- package/dist/core/rules/rule-engine.js.map +1 -0
- package/dist/core/rules/rule.interface.d.ts +169 -0
- package/dist/core/rules/rule.interface.d.ts.map +1 -0
- package/dist/core/rules/rule.interface.js +38 -0
- package/dist/core/rules/rule.interface.js.map +1 -0
- package/dist/core/scanner/project-detector.d.ts +51 -0
- package/dist/core/scanner/project-detector.d.ts.map +1 -0
- package/dist/core/scanner/project-detector.js +310 -0
- package/dist/core/scanner/project-detector.js.map +1 -0
- package/dist/core/scanner/project-scanner.d.ts +101 -0
- package/dist/core/scanner/project-scanner.d.ts.map +1 -0
- package/dist/core/scanner/project-scanner.js +321 -0
- package/dist/core/scanner/project-scanner.js.map +1 -0
- package/dist/core/watcher/file-watcher.d.ts +48 -0
- package/dist/core/watcher/file-watcher.d.ts.map +1 -0
- package/dist/core/watcher/file-watcher.js +124 -0
- package/dist/core/watcher/file-watcher.js.map +1 -0
- package/dist/types/config.types.d.ts +163 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +36 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/core.types.d.ts +247 -0
- package/dist/types/core.types.d.ts.map +1 -0
- package/dist/types/core.types.js +7 -0
- package/dist/types/core.types.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Java Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Java files for import/export analysis.
|
|
5
|
+
*/
|
|
6
|
+
export class JavaParser {
|
|
7
|
+
language = 'java';
|
|
8
|
+
extensions = ['.java'];
|
|
9
|
+
options;
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
this.options = options;
|
|
12
|
+
}
|
|
13
|
+
canParse(file) {
|
|
14
|
+
return file.language === 'java' || this.extensions.includes(file.extension);
|
|
15
|
+
}
|
|
16
|
+
async parse(file, content) {
|
|
17
|
+
const dependencies = await this.extractImports(content);
|
|
18
|
+
const exports = await this.extractExports(content);
|
|
19
|
+
return {
|
|
20
|
+
file,
|
|
21
|
+
dependencies,
|
|
22
|
+
exports,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async extractImports(content) {
|
|
26
|
+
const dependencies = [];
|
|
27
|
+
const lines = content.split('\n');
|
|
28
|
+
// Java import pattern
|
|
29
|
+
const importPattern = /^import\s+(static\s+)?([\w.]+)(?:\.\*)?;/;
|
|
30
|
+
for (let i = 0; i < lines.length; i++) {
|
|
31
|
+
const line = lines[i].trim();
|
|
32
|
+
// Skip comments
|
|
33
|
+
if (line.startsWith('//') || line.startsWith('/*') || line.startsWith('*'))
|
|
34
|
+
continue;
|
|
35
|
+
const match = line.match(importPattern);
|
|
36
|
+
if (match) {
|
|
37
|
+
const [, isStatic, importPath] = match;
|
|
38
|
+
dependencies.push({
|
|
39
|
+
source: '',
|
|
40
|
+
target: importPath,
|
|
41
|
+
type: 'java-import',
|
|
42
|
+
line: i + 1,
|
|
43
|
+
imports: [{
|
|
44
|
+
name: importPath.split('.').pop() || importPath,
|
|
45
|
+
}],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return dependencies;
|
|
50
|
+
}
|
|
51
|
+
async extractExports(content) {
|
|
52
|
+
const exports = [];
|
|
53
|
+
const lines = content.split('\n');
|
|
54
|
+
// Patterns for Java declarations
|
|
55
|
+
const classPattern = /^(?:public\s+)?(?:abstract\s+)?(?:final\s+)?class\s+(\w+)/;
|
|
56
|
+
const interfacePattern = /^(?:public\s+)?interface\s+(\w+)/;
|
|
57
|
+
const enumPattern = /^(?:public\s+)?enum\s+(\w+)/;
|
|
58
|
+
const methodPattern = /^(?:public\s+)(?:static\s+)?(?:final\s+)?(?:\w+(?:<[^>]+>)?)\s+(\w+)\s*\(/;
|
|
59
|
+
let inClass = false;
|
|
60
|
+
let braceCount = 0;
|
|
61
|
+
for (let i = 0; i < lines.length; i++) {
|
|
62
|
+
const line = lines[i].trim();
|
|
63
|
+
// Track brace depth
|
|
64
|
+
braceCount += (line.match(/{/g) || []).length;
|
|
65
|
+
braceCount -= (line.match(/}/g) || []).length;
|
|
66
|
+
// Skip if inside class body (except for public methods)
|
|
67
|
+
if (inClass && braceCount > 1) {
|
|
68
|
+
// Check for public methods
|
|
69
|
+
const methodMatch = line.match(methodPattern);
|
|
70
|
+
if (methodMatch) {
|
|
71
|
+
exports.push({
|
|
72
|
+
name: methodMatch[1],
|
|
73
|
+
type: 'function',
|
|
74
|
+
line: i + 1,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
// Class definitions
|
|
80
|
+
const classMatch = line.match(classPattern);
|
|
81
|
+
if (classMatch) {
|
|
82
|
+
exports.push({
|
|
83
|
+
name: classMatch[1],
|
|
84
|
+
type: 'class',
|
|
85
|
+
line: i + 1,
|
|
86
|
+
});
|
|
87
|
+
inClass = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// Interface definitions
|
|
91
|
+
const interfaceMatch = line.match(interfacePattern);
|
|
92
|
+
if (interfaceMatch) {
|
|
93
|
+
exports.push({
|
|
94
|
+
name: interfaceMatch[1],
|
|
95
|
+
type: 'interface',
|
|
96
|
+
line: i + 1,
|
|
97
|
+
});
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
// Enum definitions
|
|
101
|
+
const enumMatch = line.match(enumPattern);
|
|
102
|
+
if (enumMatch) {
|
|
103
|
+
exports.push({
|
|
104
|
+
name: enumMatch[1],
|
|
105
|
+
type: 'enum',
|
|
106
|
+
line: i + 1,
|
|
107
|
+
});
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return exports;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=java-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"java-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/java-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,OAAO,UAAU;IACZ,QAAQ,GAAG,MAAM,CAAC;IAClB,UAAU,GAAG,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,CAAoB;IAEnC,YAAY,UAA6B,EAAE;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,IAAiB;QACxB,OAAO,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAiB,EAAE,OAAe;QAC5C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAEnD,OAAO;YACL,IAAI;YACJ,YAAY;YACZ,OAAO;SACR,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,MAAM,YAAY,GAAiB,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,sBAAsB;QACtB,MAAM,aAAa,GAAG,0CAA0C,CAAC;QAEjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE7B,gBAAgB;YAChB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAErF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;gBAEvC,YAAY,CAAC,IAAI,CAAC;oBAChB,MAAM,EAAE,EAAE;oBACV,MAAM,EAAE,UAAU;oBAClB,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,UAAU;yBAChD,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,iCAAiC;QACjC,MAAM,YAAY,GAAG,2DAA2D,CAAC;QACjF,MAAM,gBAAgB,GAAG,kCAAkC,CAAC;QAC5D,MAAM,WAAW,GAAG,6BAA6B,CAAC;QAClD,MAAM,aAAa,GAAG,2EAA2E,CAAC;QAElG,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE7B,oBAAoB;YACpB,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC9C,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAE9C,wDAAwD;YACxD,IAAI,OAAO,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC9B,2BAA2B;gBAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC9C,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;wBACpB,IAAI,EAAE,UAAU;wBAChB,IAAI,EAAE,CAAC,GAAG,CAAC;qBACZ,CAAC,CAAC;gBACL,CAAC;gBACD,SAAS;YACX,CAAC;YAED,oBAAoB;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC5C,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;oBACnB,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,CAAC,GAAG,CAAC;iBACZ,CAAC,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC;gBACf,SAAS;YACX,CAAC;YAED,wBAAwB;YACxB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACpD,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;oBACvB,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,CAAC,GAAG,CAAC;iBACZ,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,mBAAmB;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1C,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;oBAClB,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,CAAC,GAAG,CAAC;iBACZ,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JavaScript Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses JavaScript files. Extends TypeScript parser since TS can parse JS.
|
|
5
|
+
*/
|
|
6
|
+
import { TypeScriptParser } from './typescript-parser.js';
|
|
7
|
+
import { ProjectFile } from '../../types/core.types.js';
|
|
8
|
+
export declare class JavaScriptParser extends TypeScriptParser {
|
|
9
|
+
readonly language: string;
|
|
10
|
+
readonly extensions: string[];
|
|
11
|
+
constructor();
|
|
12
|
+
canParse(file: ProjectFile): boolean;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=javascript-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript-parser.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/javascript-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,qBAAa,gBAAiB,SAAQ,gBAAgB;IACpD,SAAkB,QAAQ,EAAE,MAAM,CAAgB;IAClD,SAAkB,UAAU,WAAmC;;IAQtD,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;CAG9C"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JavaScript Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses JavaScript files. Extends TypeScript parser since TS can parse JS.
|
|
5
|
+
*/
|
|
6
|
+
import { TypeScriptParser } from './typescript-parser.js';
|
|
7
|
+
export class JavaScriptParser extends TypeScriptParser {
|
|
8
|
+
language = 'javascript';
|
|
9
|
+
extensions = ['.js', '.jsx', '.mjs', '.cjs'];
|
|
10
|
+
constructor() {
|
|
11
|
+
super({
|
|
12
|
+
strict: false,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
canParse(file) {
|
|
16
|
+
return file.language === 'javascript' || this.extensions.includes(file.extension);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=javascript-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/javascript-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,MAAM,OAAO,gBAAiB,SAAQ,gBAAgB;IAClC,QAAQ,GAAW,YAAY,CAAC;IAChC,UAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE/D;QACE,KAAK,CAAC;YACJ,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC;IAEQ,QAAQ,CAAC,IAAiB;QACjC,OAAO,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpF,CAAC;CACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages language parsers and provides access to them.
|
|
5
|
+
*/
|
|
6
|
+
import { CamoufConfig, SupportedLanguage } from '../../types/config.types.js';
|
|
7
|
+
import { IParser } from './parser.interface.js';
|
|
8
|
+
export declare class ParserRegistry {
|
|
9
|
+
private parsers;
|
|
10
|
+
private config;
|
|
11
|
+
constructor(config: CamoufConfig);
|
|
12
|
+
/**
|
|
13
|
+
* Initialize parsers for configured languages
|
|
14
|
+
*/
|
|
15
|
+
private initializeParsers;
|
|
16
|
+
/**
|
|
17
|
+
* Create a parser for a specific language
|
|
18
|
+
*/
|
|
19
|
+
private createParser;
|
|
20
|
+
/**
|
|
21
|
+
* Get parser for a language
|
|
22
|
+
*/
|
|
23
|
+
getParser(language: SupportedLanguage): IParser | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Get parser that can handle a file extension
|
|
26
|
+
*/
|
|
27
|
+
getParserForExtension(extension: string): IParser | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a language is supported
|
|
30
|
+
*/
|
|
31
|
+
isSupported(language: SupportedLanguage): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Get all supported languages
|
|
34
|
+
*/
|
|
35
|
+
getSupportedLanguages(): SupportedLanguage[];
|
|
36
|
+
/**
|
|
37
|
+
* Register a custom parser
|
|
38
|
+
*/
|
|
39
|
+
registerParser(language: SupportedLanguage, parser: IParser): void;
|
|
40
|
+
/**
|
|
41
|
+
* Dispose all parsers
|
|
42
|
+
*/
|
|
43
|
+
dispose(): void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=parser-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-registry.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/parser-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAShD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAKhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACH,OAAO,CAAC,YAAY;IA0CpB;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,GAAG,SAAS;IAI3D;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAS7D;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO;IAIjD;;OAEG;IACH,qBAAqB,IAAI,iBAAiB,EAAE;IAI5C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAKlE;;OAEG;IACH,OAAO,IAAI,IAAI;CAQhB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages language parsers and provides access to them.
|
|
5
|
+
*/
|
|
6
|
+
import { TypeScriptParser } from './typescript-parser.js';
|
|
7
|
+
import { JavaScriptParser } from './javascript-parser.js';
|
|
8
|
+
import { PythonParser } from './python-parser.js';
|
|
9
|
+
import { JavaParser } from './java-parser.js';
|
|
10
|
+
import { GoParser } from './go-parser.js';
|
|
11
|
+
import { RustParser } from './rust-parser.js';
|
|
12
|
+
import { Logger } from '../logger.js';
|
|
13
|
+
export class ParserRegistry {
|
|
14
|
+
parsers = new Map();
|
|
15
|
+
config;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.initializeParsers();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Initialize parsers for configured languages
|
|
22
|
+
*/
|
|
23
|
+
initializeParsers() {
|
|
24
|
+
for (const language of this.config.languages) {
|
|
25
|
+
try {
|
|
26
|
+
const parser = this.createParser(language);
|
|
27
|
+
if (parser) {
|
|
28
|
+
this.parsers.set(language, parser);
|
|
29
|
+
Logger.debug(`Initialized parser for ${language}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
Logger.warn(`Failed to initialize parser for ${language}: ${error.message}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a parser for a specific language
|
|
39
|
+
*/
|
|
40
|
+
createParser(language) {
|
|
41
|
+
const tsOptions = this.config.parsers?.typescript;
|
|
42
|
+
const pyOptions = this.config.parsers?.python;
|
|
43
|
+
const javaOptions = this.config.parsers?.java;
|
|
44
|
+
switch (language) {
|
|
45
|
+
case 'typescript':
|
|
46
|
+
return new TypeScriptParser({
|
|
47
|
+
tsConfigPath: tsOptions?.tsConfigPath,
|
|
48
|
+
strict: tsOptions?.strict,
|
|
49
|
+
});
|
|
50
|
+
case 'javascript':
|
|
51
|
+
return new JavaScriptParser();
|
|
52
|
+
case 'python':
|
|
53
|
+
return new PythonParser({
|
|
54
|
+
version: pyOptions?.version,
|
|
55
|
+
});
|
|
56
|
+
case 'java':
|
|
57
|
+
return new JavaParser({
|
|
58
|
+
sourceVersion: javaOptions?.sourceVersion,
|
|
59
|
+
});
|
|
60
|
+
case 'go':
|
|
61
|
+
return new GoParser();
|
|
62
|
+
case 'rust':
|
|
63
|
+
return new RustParser();
|
|
64
|
+
case 'csharp':
|
|
65
|
+
case 'kotlin':
|
|
66
|
+
// These will be implemented later
|
|
67
|
+
Logger.debug(`Parser for ${language} is not yet implemented`);
|
|
68
|
+
return null;
|
|
69
|
+
default:
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get parser for a language
|
|
75
|
+
*/
|
|
76
|
+
getParser(language) {
|
|
77
|
+
return this.parsers.get(language);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get parser that can handle a file extension
|
|
81
|
+
*/
|
|
82
|
+
getParserForExtension(extension) {
|
|
83
|
+
for (const parser of this.parsers.values()) {
|
|
84
|
+
if (parser.extensions.includes(extension)) {
|
|
85
|
+
return parser;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if a language is supported
|
|
92
|
+
*/
|
|
93
|
+
isSupported(language) {
|
|
94
|
+
return this.parsers.has(language);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get all supported languages
|
|
98
|
+
*/
|
|
99
|
+
getSupportedLanguages() {
|
|
100
|
+
return Array.from(this.parsers.keys());
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Register a custom parser
|
|
104
|
+
*/
|
|
105
|
+
registerParser(language, parser) {
|
|
106
|
+
this.parsers.set(language, parser);
|
|
107
|
+
Logger.debug(`Registered custom parser for ${language}`);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Dispose all parsers
|
|
111
|
+
*/
|
|
112
|
+
dispose() {
|
|
113
|
+
for (const parser of this.parsers.values()) {
|
|
114
|
+
if (parser.dispose) {
|
|
115
|
+
parser.dispose();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
this.parsers.clear();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=parser-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-registry.js","sourceRoot":"","sources":["../../../src/core/parsers/parser-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser Interface
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for language-specific parsers.
|
|
5
|
+
*/
|
|
6
|
+
import { ProjectFile, ParsedFile, Dependency, ExportedSymbol } from '../../types/core.types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Interface for language parsers
|
|
9
|
+
*/
|
|
10
|
+
export interface IParser {
|
|
11
|
+
/** Language this parser handles */
|
|
12
|
+
readonly language: string;
|
|
13
|
+
/** File extensions this parser can handle */
|
|
14
|
+
readonly extensions: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Parse a file and extract dependencies and exports
|
|
17
|
+
*/
|
|
18
|
+
parse(file: ProjectFile, content: string): Promise<ParsedFile>;
|
|
19
|
+
/**
|
|
20
|
+
* Check if this parser can handle a file
|
|
21
|
+
*/
|
|
22
|
+
canParse(file: ProjectFile): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Get import statements from content
|
|
25
|
+
*/
|
|
26
|
+
extractImports(content: string): Promise<Dependency[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Get export statements from content
|
|
29
|
+
*/
|
|
30
|
+
extractExports(content: string): Promise<ExportedSymbol[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Dispose of any resources
|
|
33
|
+
*/
|
|
34
|
+
dispose?(): void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Base parser options
|
|
38
|
+
*/
|
|
39
|
+
export interface ParserOptions {
|
|
40
|
+
/** Enable strict mode */
|
|
41
|
+
strict?: boolean;
|
|
42
|
+
/** Additional options passed to the parser */
|
|
43
|
+
parserOptions?: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parser factory function type
|
|
47
|
+
*/
|
|
48
|
+
export type ParserFactory = (options?: ParserOptions) => IParser;
|
|
49
|
+
//# sourceMappingURL=parser.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.interface.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/parser.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhG;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,6CAA6C;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE/D;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAErC;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvD;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAE3D;;OAEG;IACH,OAAO,CAAC,IAAI,IAAI,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.interface.js","sourceRoot":"","sources":["../../../src/core/parsers/parser.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Python files using tree-sitter for AST analysis.
|
|
5
|
+
*/
|
|
6
|
+
import { IParser, ParserOptions } from './parser.interface.js';
|
|
7
|
+
import { ProjectFile, ParsedFile, Dependency, ExportedSymbol } from '../../types/core.types.js';
|
|
8
|
+
interface PythonParserOptions extends ParserOptions {
|
|
9
|
+
version?: '2' | '3';
|
|
10
|
+
}
|
|
11
|
+
export declare class PythonParser implements IParser {
|
|
12
|
+
readonly language = "python";
|
|
13
|
+
readonly extensions: string[];
|
|
14
|
+
private options;
|
|
15
|
+
constructor(options?: PythonParserOptions);
|
|
16
|
+
canParse(file: ProjectFile): boolean;
|
|
17
|
+
parse(file: ProjectFile, content: string): Promise<ParsedFile>;
|
|
18
|
+
extractImports(content: string): Promise<Dependency[]>;
|
|
19
|
+
extractExports(content: string): Promise<ExportedSymbol[]>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=python-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-parser.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/python-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAkB,MAAM,2BAA2B,CAAC;AAEhH,UAAU,mBAAoB,SAAQ,aAAa;IACjD,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;CACrB;AAED,qBAAa,YAAa,YAAW,OAAO;IAC1C,QAAQ,CAAC,QAAQ,YAAY;IAC7B,QAAQ,CAAC,UAAU,WAAW;IAE9B,OAAO,CAAC,OAAO,CAAsB;gBAEzB,OAAO,GAAE,mBAAwB;IAI7C,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAI9B,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAW9D,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAsDtD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAsEjE"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Python files using tree-sitter for AST analysis.
|
|
5
|
+
*/
|
|
6
|
+
export class PythonParser {
|
|
7
|
+
language = 'python';
|
|
8
|
+
extensions = ['.py'];
|
|
9
|
+
options;
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
this.options = options;
|
|
12
|
+
}
|
|
13
|
+
canParse(file) {
|
|
14
|
+
return file.language === 'python' || this.extensions.includes(file.extension);
|
|
15
|
+
}
|
|
16
|
+
async parse(file, content) {
|
|
17
|
+
const dependencies = await this.extractImports(content);
|
|
18
|
+
const exports = await this.extractExports(content);
|
|
19
|
+
return {
|
|
20
|
+
file,
|
|
21
|
+
dependencies,
|
|
22
|
+
exports,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async extractImports(content) {
|
|
26
|
+
const dependencies = [];
|
|
27
|
+
const lines = content.split('\n');
|
|
28
|
+
// Regex patterns for Python imports
|
|
29
|
+
const importPattern = /^(?:from\s+([\w.]+)\s+)?import\s+(.+)$/;
|
|
30
|
+
for (let i = 0; i < lines.length; i++) {
|
|
31
|
+
const line = lines[i].trim();
|
|
32
|
+
// Skip comments and empty lines
|
|
33
|
+
if (line.startsWith('#') || line === '')
|
|
34
|
+
continue;
|
|
35
|
+
const match = line.match(importPattern);
|
|
36
|
+
if (match) {
|
|
37
|
+
const [, fromModule, imports] = match;
|
|
38
|
+
if (fromModule) {
|
|
39
|
+
// from X import Y, Z
|
|
40
|
+
const importedNames = imports.split(',').map(s => s.trim().split(/\s+as\s+/));
|
|
41
|
+
dependencies.push({
|
|
42
|
+
source: '',
|
|
43
|
+
target: fromModule,
|
|
44
|
+
type: 'python-import',
|
|
45
|
+
line: i + 1,
|
|
46
|
+
imports: importedNames.map(([name, alias]) => ({
|
|
47
|
+
name: name.trim(),
|
|
48
|
+
alias: alias?.trim(),
|
|
49
|
+
})),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// import X, Y, Z
|
|
54
|
+
const modules = imports.split(',').map(s => s.trim().split(/\s+as\s+/));
|
|
55
|
+
for (const [moduleName, alias] of modules) {
|
|
56
|
+
dependencies.push({
|
|
57
|
+
source: '',
|
|
58
|
+
target: moduleName.trim(),
|
|
59
|
+
type: 'python-import',
|
|
60
|
+
line: i + 1,
|
|
61
|
+
imports: [{
|
|
62
|
+
name: moduleName.trim(),
|
|
63
|
+
alias: alias?.trim(),
|
|
64
|
+
}],
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return dependencies;
|
|
71
|
+
}
|
|
72
|
+
async extractExports(content) {
|
|
73
|
+
const exports = [];
|
|
74
|
+
const lines = content.split('\n');
|
|
75
|
+
// Patterns for Python definitions
|
|
76
|
+
const classPattern = /^class\s+(\w+)/;
|
|
77
|
+
const functionPattern = /^def\s+(\w+)/;
|
|
78
|
+
const variablePattern = /^(\w+)\s*=/;
|
|
79
|
+
const allPattern = /__all__\s*=\s*\[([^\]]+)\]/;
|
|
80
|
+
// Check for __all__ definition
|
|
81
|
+
const allMatch = content.match(allPattern);
|
|
82
|
+
const explicitExports = allMatch
|
|
83
|
+
? allMatch[1].split(',').map(s => s.trim().replace(/['"]/g, ''))
|
|
84
|
+
: null;
|
|
85
|
+
for (let i = 0; i < lines.length; i++) {
|
|
86
|
+
const line = lines[i];
|
|
87
|
+
// Skip indented lines (they're inside a class/function)
|
|
88
|
+
if (line.startsWith(' ') || line.startsWith('\t'))
|
|
89
|
+
continue;
|
|
90
|
+
// Class definitions
|
|
91
|
+
const classMatch = line.match(classPattern);
|
|
92
|
+
if (classMatch) {
|
|
93
|
+
const name = classMatch[1];
|
|
94
|
+
if (!name.startsWith('_') || (explicitExports && explicitExports.includes(name))) {
|
|
95
|
+
exports.push({
|
|
96
|
+
name,
|
|
97
|
+
type: 'class',
|
|
98
|
+
line: i + 1,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// Function definitions
|
|
104
|
+
const funcMatch = line.match(functionPattern);
|
|
105
|
+
if (funcMatch) {
|
|
106
|
+
const name = funcMatch[1];
|
|
107
|
+
if (!name.startsWith('_') || (explicitExports && explicitExports.includes(name))) {
|
|
108
|
+
exports.push({
|
|
109
|
+
name,
|
|
110
|
+
type: 'function',
|
|
111
|
+
line: i + 1,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
// Top-level variables (constants)
|
|
117
|
+
const varMatch = line.match(variablePattern);
|
|
118
|
+
if (varMatch) {
|
|
119
|
+
const name = varMatch[1];
|
|
120
|
+
if (!name.startsWith('_') || (explicitExports && explicitExports.includes(name))) {
|
|
121
|
+
// Check if it's uppercase (constant) or in __all__
|
|
122
|
+
const isConstant = name === name.toUpperCase();
|
|
123
|
+
if (isConstant || (explicitExports && explicitExports.includes(name))) {
|
|
124
|
+
exports.push({
|
|
125
|
+
name,
|
|
126
|
+
type: isConstant ? 'constant' : 'variable',
|
|
127
|
+
line: i + 1,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return exports;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=python-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/python-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rust Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Rust files for import/export analysis.
|
|
5
|
+
*/
|
|
6
|
+
import { IParser } from './parser.interface.js';
|
|
7
|
+
import { ProjectFile, ParsedFile, Dependency, ExportedSymbol } from '../../types/core.types.js';
|
|
8
|
+
export declare class RustParser implements IParser {
|
|
9
|
+
readonly language = "rust";
|
|
10
|
+
readonly extensions: string[];
|
|
11
|
+
canParse(file: ProjectFile): boolean;
|
|
12
|
+
parse(file: ProjectFile, content: string): Promise<ParsedFile>;
|
|
13
|
+
extractImports(content: string): Promise<Dependency[]>;
|
|
14
|
+
extractExports(content: string): Promise<ExportedSymbol[]>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=rust-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rust-parser.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/rust-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAiB,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhG,qBAAa,UAAW,YAAW,OAAO;IACxC,QAAQ,CAAC,QAAQ,UAAU;IAC3B,QAAQ,CAAC,UAAU,WAAW;IAE9B,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAI9B,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAW9D,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAwEtD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAmGjE"}
|