@gulibs/safe-coder 0.0.4 → 0.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/README.md +112 -1
- package/dist/documentation/github-client.d.ts +3 -1
- package/dist/documentation/github-client.d.ts.map +1 -1
- package/dist/documentation/github-client.js +7 -5
- package/dist/documentation/github-client.js.map +1 -1
- package/dist/documentation/http-fetcher.d.ts +3 -0
- package/dist/documentation/http-fetcher.d.ts.map +1 -1
- package/dist/documentation/http-fetcher.js +6 -2
- package/dist/documentation/http-fetcher.js.map +1 -1
- package/dist/documentation/index.d.ts +5 -3
- package/dist/documentation/index.d.ts.map +1 -1
- package/dist/documentation/index.js +98 -14
- package/dist/documentation/index.js.map +1 -1
- package/dist/documentation/npm-client.d.ts +12 -0
- package/dist/documentation/npm-client.d.ts.map +1 -1
- package/dist/documentation/npm-client.js +150 -17
- package/dist/documentation/npm-client.js.map +1 -1
- package/dist/errors/api-validator.d.ts +9 -0
- package/dist/errors/api-validator.d.ts.map +1 -0
- package/dist/errors/api-validator.js +57 -0
- package/dist/errors/api-validator.js.map +1 -0
- package/dist/errors/contextual-analysis.d.ts +3 -0
- package/dist/errors/contextual-analysis.d.ts.map +1 -1
- package/dist/errors/contextual-analysis.js +102 -4
- package/dist/errors/contextual-analysis.js.map +1 -1
- package/dist/errors/cross-file-analyzer.d.ts +16 -0
- package/dist/errors/cross-file-analyzer.d.ts.map +1 -0
- package/dist/errors/cross-file-analyzer.js +172 -0
- package/dist/errors/cross-file-analyzer.js.map +1 -0
- package/dist/errors/eslint-integration.d.ts +1 -0
- package/dist/errors/eslint-integration.d.ts.map +1 -1
- package/dist/errors/eslint-integration.js +101 -22
- package/dist/errors/eslint-integration.js.map +1 -1
- package/dist/errors/framework-detector.d.ts +10 -0
- package/dist/errors/framework-detector.d.ts.map +1 -0
- package/dist/errors/framework-detector.js +126 -0
- package/dist/errors/framework-detector.js.map +1 -0
- package/dist/errors/index.d.ts +9 -2
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +78 -2
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/patterns.d.ts.map +1 -1
- package/dist/errors/patterns.js +314 -0
- package/dist/errors/patterns.js.map +1 -1
- package/dist/errors/performance-detector.d.ts +11 -0
- package/dist/errors/performance-detector.d.ts.map +1 -0
- package/dist/errors/performance-detector.js +119 -0
- package/dist/errors/performance-detector.js.map +1 -0
- package/dist/errors/runtime-detector.d.ts +7 -0
- package/dist/errors/runtime-detector.d.ts.map +1 -0
- package/dist/errors/runtime-detector.js +86 -0
- package/dist/errors/runtime-detector.js.map +1 -0
- package/dist/errors/security-detector.d.ts +6 -0
- package/dist/errors/security-detector.d.ts.map +1 -0
- package/dist/errors/security-detector.js +75 -0
- package/dist/errors/security-detector.js.map +1 -0
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +155 -61
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/utils/config.d.ts +12 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +24 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/http-client.d.ts +17 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +62 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +128 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +5 -4
|
@@ -1,49 +1,182 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { HttpClient } from '../utils/http-client.js';
|
|
2
2
|
export class NpmRegistryClient {
|
|
3
3
|
registryUrl = 'https://registry.npmjs.org';
|
|
4
|
+
httpClient;
|
|
5
|
+
constructor(httpClient) {
|
|
6
|
+
this.httpClient = httpClient || new HttpClient();
|
|
7
|
+
}
|
|
8
|
+
// Expose method to get package metadata for fallback strategies
|
|
9
|
+
async getPackageMetadata(packageName) {
|
|
10
|
+
try {
|
|
11
|
+
const packageUrl = `${this.registryUrl}/${packageName}`;
|
|
12
|
+
const packageResponse = await this.httpClient.get(packageUrl);
|
|
13
|
+
const packageData = packageResponse.data;
|
|
14
|
+
const latestVersion = packageData['dist-tags']?.latest;
|
|
15
|
+
const versionData = packageData.versions[latestVersion];
|
|
16
|
+
if (!versionData) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
repository: versionData.repository,
|
|
21
|
+
homepage: versionData.homepage,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
4
28
|
async fetch(packageName, version) {
|
|
5
29
|
try {
|
|
6
30
|
// Fetch package metadata
|
|
7
31
|
const packageUrl = `${this.registryUrl}/${packageName}`;
|
|
8
|
-
const packageResponse = await
|
|
32
|
+
const packageResponse = await this.httpClient.get(packageUrl);
|
|
9
33
|
const packageData = packageResponse.data;
|
|
10
|
-
|
|
11
|
-
const
|
|
34
|
+
// Get latest version from dist-tags (always up-to-date from registry)
|
|
35
|
+
const latestVersion = packageData['dist-tags']?.latest;
|
|
36
|
+
const targetVersion = version || latestVersion || 'latest';
|
|
37
|
+
const versionData = packageData.versions[targetVersion] || packageData.versions[latestVersion];
|
|
12
38
|
if (!versionData) {
|
|
13
39
|
throw new Error(`Version ${targetVersion} not found for package ${packageName}`);
|
|
14
40
|
}
|
|
41
|
+
// Get package publish time from npm registry's time field
|
|
42
|
+
// This helps determine if package was updated
|
|
43
|
+
const packagePublishTime = packageData.time?.[targetVersion]
|
|
44
|
+
? new Date(packageData.time[targetVersion])
|
|
45
|
+
: new Date();
|
|
15
46
|
// Try to get README from package data
|
|
16
47
|
let content = versionData.readme || '';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
48
|
+
const repository = versionData.repository;
|
|
49
|
+
const homepage = versionData.homepage;
|
|
50
|
+
let sourceUrl = repository?.url || homepage;
|
|
51
|
+
// Fallback strategy: If no README in package, try multiple sources
|
|
52
|
+
if (!content || content.trim().length < 100) {
|
|
53
|
+
// Strategy 1: Try fetching from GitHub repository
|
|
54
|
+
if (repository) {
|
|
55
|
+
const repoContent = await this.fetchFromRepository(repository, version);
|
|
56
|
+
if (repoContent) {
|
|
57
|
+
content = repoContent;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Strategy 2: If still no content, try homepage
|
|
61
|
+
if ((!content || content.trim().length < 100) && homepage) {
|
|
62
|
+
const homepageContent = await this.fetchFromHomepage(homepage);
|
|
63
|
+
if (homepageContent) {
|
|
64
|
+
content = homepageContent;
|
|
65
|
+
sourceUrl = homepage;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// If still no content, provide helpful error message with available links
|
|
70
|
+
if (!content || content.trim().length < 100) {
|
|
71
|
+
const fallbackMessage = this.generateFallbackMessage(packageName, targetVersion, repository, homepage);
|
|
72
|
+
content = fallbackMessage;
|
|
21
73
|
}
|
|
22
74
|
return {
|
|
23
75
|
name: packageName,
|
|
24
76
|
version: targetVersion,
|
|
25
|
-
content: content
|
|
77
|
+
content: content,
|
|
26
78
|
source: 'npm',
|
|
27
79
|
url: sourceUrl,
|
|
28
|
-
lastUpdated:
|
|
80
|
+
lastUpdated: packagePublishTime, // Use actual publish time instead of current time
|
|
29
81
|
};
|
|
30
82
|
}
|
|
31
83
|
catch (error) {
|
|
32
84
|
throw new Error(`Failed to fetch npm documentation for ${packageName}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
33
85
|
}
|
|
34
86
|
}
|
|
35
|
-
async fetchFromRepository(repo) {
|
|
87
|
+
async fetchFromRepository(repo, version) {
|
|
36
88
|
if (!repo.url || repo.type !== 'git') {
|
|
37
89
|
return '';
|
|
38
90
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
91
|
+
try {
|
|
92
|
+
// Extract GitHub URL
|
|
93
|
+
const githubMatch = repo.url.match(/github\.com[\/:]([^\/]+)\/([^\/]+?)(?:\.git)?$/);
|
|
94
|
+
if (githubMatch) {
|
|
95
|
+
const [, owner, repoName] = githubMatch;
|
|
96
|
+
// Try to fetch README from GitHub API
|
|
97
|
+
const ref = version ? `?ref=${version}` : '';
|
|
98
|
+
const url = `https://api.github.com/repos/${owner}/${repoName}/readme${ref}`;
|
|
99
|
+
try {
|
|
100
|
+
const response = await this.httpClient.get(url, {
|
|
101
|
+
headers: {
|
|
102
|
+
'Accept': 'application/vnd.github.v3.raw',
|
|
103
|
+
},
|
|
104
|
+
timeout: 5000,
|
|
105
|
+
});
|
|
106
|
+
return response.data || '';
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
// GitHub fetch failed, return empty to try next strategy
|
|
110
|
+
return '';
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Try other git hosting services (GitLab, Bitbucket, etc.)
|
|
114
|
+
// For now, return empty and let other strategies handle it
|
|
115
|
+
return '';
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
return '';
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async fetchFromHomepage(homepage) {
|
|
122
|
+
if (!homepage || !homepage.startsWith('http')) {
|
|
123
|
+
return '';
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const response = await this.httpClient.get(homepage, {
|
|
127
|
+
timeout: 5000,
|
|
128
|
+
headers: {
|
|
129
|
+
'User-Agent': 'Safe-Coder-MCP/1.0.0',
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
// Try to extract meaningful content from HTML
|
|
133
|
+
const html = response.data;
|
|
134
|
+
if (typeof html === 'string') {
|
|
135
|
+
// Simple extraction: try to get text content
|
|
136
|
+
// Remove scripts and styles
|
|
137
|
+
let text = html
|
|
138
|
+
.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
|
|
139
|
+
.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
|
|
140
|
+
.replace(/<[^>]+>/g, ' ')
|
|
141
|
+
.replace(/\s+/g, ' ')
|
|
142
|
+
.trim();
|
|
143
|
+
// If we got reasonable content, return it
|
|
144
|
+
if (text.length > 200) {
|
|
145
|
+
return `# Documentation from Homepage\n\n${text.substring(0, 5000)}...`;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return '';
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
// Homepage fetch failed
|
|
44
152
|
return '';
|
|
45
153
|
}
|
|
46
|
-
|
|
154
|
+
}
|
|
155
|
+
generateFallbackMessage(packageName, version, repository, homepage) {
|
|
156
|
+
const lines = [
|
|
157
|
+
`# ${packageName}@${version}`,
|
|
158
|
+
'',
|
|
159
|
+
'⚠️ No documentation found in npm package.',
|
|
160
|
+
'',
|
|
161
|
+
'**Available resources:**',
|
|
162
|
+
];
|
|
163
|
+
if (repository?.url) {
|
|
164
|
+
const repoUrl = repository.url.replace(/\.git$/, '');
|
|
165
|
+
lines.push(`- 📦 Repository: ${repoUrl}`);
|
|
166
|
+
if (repoUrl.includes('github.com')) {
|
|
167
|
+
lines.push(` - Try: \`get_documentation("${repoUrl.replace('https://github.com/', '')}", source="github")\``);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (homepage) {
|
|
171
|
+
lines.push(`- 🌐 Homepage: ${homepage}`);
|
|
172
|
+
lines.push(` - Try: \`get_documentation("${homepage}", source="http")\``);
|
|
173
|
+
}
|
|
174
|
+
lines.push('');
|
|
175
|
+
lines.push('**Suggestions:**');
|
|
176
|
+
lines.push('1. Check the package repository for README.md');
|
|
177
|
+
lines.push('2. Visit the package homepage');
|
|
178
|
+
lines.push('3. Check npm package page: https://www.npmjs.com/package/' + packageName);
|
|
179
|
+
return lines.join('\n');
|
|
47
180
|
}
|
|
48
181
|
}
|
|
49
182
|
//# sourceMappingURL=npm-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm-client.js","sourceRoot":"","sources":["../../src/documentation/npm-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"npm-client.js","sourceRoot":"","sources":["../../src/documentation/npm-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DetectedError } from './pattern-matcher.js';
|
|
2
|
+
export declare class ApiValidator {
|
|
3
|
+
detectErrors(code: string, filename?: string): DetectedError[];
|
|
4
|
+
private visitNode;
|
|
5
|
+
private looksLikeAsyncFunction;
|
|
6
|
+
private getLineAndChar;
|
|
7
|
+
private prioritize;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=api-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-validator.d.ts","sourceRoot":"","sources":["../../src/errors/api-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,YAAY;IACvB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,aAAa,EAAE;IAqBzE,OAAO,CAAC,SAAS;IA8BjB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;CAGnB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as ts from 'typescript';
|
|
2
|
+
export class ApiValidator {
|
|
3
|
+
detectErrors(code, filename = 'code.ts') {
|
|
4
|
+
const errors = [];
|
|
5
|
+
try {
|
|
6
|
+
// Use TypeScript compiler to analyze API calls
|
|
7
|
+
const sourceFile = ts.createSourceFile(filename, code, ts.ScriptTarget.ES2022, true);
|
|
8
|
+
// Basic API validation using AST
|
|
9
|
+
this.visitNode(sourceFile, errors, code);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
// TypeScript parsing failed, continue without API validation
|
|
13
|
+
}
|
|
14
|
+
return this.prioritize(errors);
|
|
15
|
+
}
|
|
16
|
+
visitNode(node, errors, code) {
|
|
17
|
+
// Detect async function calls without await
|
|
18
|
+
if (ts.isCallExpression(node)) {
|
|
19
|
+
const expression = node.expression;
|
|
20
|
+
if (ts.isIdentifier(expression)) {
|
|
21
|
+
const funcName = expression.text;
|
|
22
|
+
const isAsyncFunction = this.looksLikeAsyncFunction(funcName);
|
|
23
|
+
if (isAsyncFunction) {
|
|
24
|
+
const parent = node.parent;
|
|
25
|
+
// Check if not awaited
|
|
26
|
+
if (!ts.isAwaitExpression(parent)) {
|
|
27
|
+
const { line, character } = this.getLineAndChar(node, code);
|
|
28
|
+
errors.push({
|
|
29
|
+
type: 'api',
|
|
30
|
+
message: `Async function '${funcName}' called without await`,
|
|
31
|
+
line: line + 1,
|
|
32
|
+
column: character + 1,
|
|
33
|
+
priority: 2,
|
|
34
|
+
fix: 'Add await keyword before async function call',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Recursively visit child nodes
|
|
41
|
+
ts.forEachChild(node, (child) => this.visitNode(child, errors, code));
|
|
42
|
+
}
|
|
43
|
+
looksLikeAsyncFunction(name) {
|
|
44
|
+
const asyncPatterns = ['fetch', 'request', 'get', 'post', 'put', 'delete', 'query', 'execute'];
|
|
45
|
+
return asyncPatterns.some(pattern => name.toLowerCase().includes(pattern));
|
|
46
|
+
}
|
|
47
|
+
getLineAndChar(node, code) {
|
|
48
|
+
const sourceFile = node.getSourceFile();
|
|
49
|
+
const pos = node.getStart(sourceFile);
|
|
50
|
+
const { line, character } = sourceFile.getLineAndCharacterOfPosition(pos);
|
|
51
|
+
return { line, character };
|
|
52
|
+
}
|
|
53
|
+
prioritize(errors) {
|
|
54
|
+
return errors.sort((a, b) => a.priority - b.priority);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=api-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-validator.js","sourceRoot":"","sources":["../../src/errors/api-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { DetectedError } from './pattern-matcher.js';
|
|
2
2
|
export declare class ContextualAnalysis {
|
|
3
3
|
detectErrors(code: string): DetectedError[];
|
|
4
|
+
private detectUnreachableCode;
|
|
5
|
+
private detectFunctionCallIssues;
|
|
6
|
+
private extractDefinedFunctions;
|
|
4
7
|
private extractDefinedVariables;
|
|
5
8
|
private extractUsedVariables;
|
|
6
9
|
private isKeyword;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextual-analysis.d.ts","sourceRoot":"","sources":["../../src/errors/contextual-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,kBAAkB;IAC7B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;
|
|
1
|
+
{"version":3,"file":"contextual-analysis.d.ts","sourceRoot":"","sources":["../../src/errors/contextual-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,kBAAkB;IAC7B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAgC3C,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,wBAAwB;IAkChC,OAAO,CAAC,uBAAuB;IA2B/B,OAAO,CAAC,uBAAuB;IA0C/B,OAAO,CAAC,oBAAoB;IAwB5B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;CAGnB"}
|
|
@@ -17,23 +17,121 @@ export class ContextualAnalysis {
|
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
+
// Detect unreachable code
|
|
21
|
+
const unreachableErrors = this.detectUnreachableCode(code);
|
|
22
|
+
errors.push(...unreachableErrors);
|
|
23
|
+
// Detect function call issues
|
|
24
|
+
const functionCallErrors = this.detectFunctionCallIssues(code);
|
|
25
|
+
errors.push(...functionCallErrors);
|
|
20
26
|
return this.prioritize(errors);
|
|
21
27
|
}
|
|
28
|
+
detectUnreachableCode(code) {
|
|
29
|
+
const errors = [];
|
|
30
|
+
const lines = code.split('\n');
|
|
31
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
32
|
+
const line = lines[i];
|
|
33
|
+
// Check for return/throw/break/continue followed by code
|
|
34
|
+
if (/^\s*(return|throw|break|continue)\s*[;}]?\s*$/.test(line.trim())) {
|
|
35
|
+
const nextLine = lines[i + 1];
|
|
36
|
+
// If next line is not a closing brace or comment, it's unreachable
|
|
37
|
+
if (nextLine && !/^\s*[}\]]/.test(nextLine) && !/^\s*\/\//.test(nextLine) && nextLine.trim()) {
|
|
38
|
+
errors.push({
|
|
39
|
+
type: 'contextual',
|
|
40
|
+
message: 'Unreachable code after return/throw/break',
|
|
41
|
+
line: i + 2,
|
|
42
|
+
column: 1,
|
|
43
|
+
priority: 3,
|
|
44
|
+
fix: 'Remove unreachable code or move it before the return statement',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return errors;
|
|
50
|
+
}
|
|
51
|
+
detectFunctionCallIssues(code) {
|
|
52
|
+
const errors = [];
|
|
53
|
+
const lines = code.split('\n');
|
|
54
|
+
const definedFunctions = this.extractDefinedFunctions(code);
|
|
55
|
+
for (let i = 0; i < lines.length; i++) {
|
|
56
|
+
const line = lines[i];
|
|
57
|
+
// Match function calls
|
|
58
|
+
const funcCallMatch = line.match(/\b(\w+)\s*\(/g);
|
|
59
|
+
if (funcCallMatch) {
|
|
60
|
+
for (const match of funcCallMatch) {
|
|
61
|
+
const funcName = match.replace(/\s*\(/, '');
|
|
62
|
+
if (!this.isKeyword(funcName) &&
|
|
63
|
+
!this.isBuiltIn(funcName) &&
|
|
64
|
+
!definedFunctions.has(funcName) &&
|
|
65
|
+
!line.includes('import') &&
|
|
66
|
+
!line.includes('export')) {
|
|
67
|
+
errors.push({
|
|
68
|
+
type: 'contextual',
|
|
69
|
+
message: `Function '${funcName}' is called but not defined`,
|
|
70
|
+
line: i + 1,
|
|
71
|
+
column: line.indexOf(match) + 1,
|
|
72
|
+
priority: 3,
|
|
73
|
+
fix: `Define '${funcName}' function or import it`,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return errors;
|
|
80
|
+
}
|
|
81
|
+
extractDefinedFunctions(code) {
|
|
82
|
+
const functions = new Set();
|
|
83
|
+
const lines = code.split('\n');
|
|
84
|
+
for (const line of lines) {
|
|
85
|
+
// Match function declarations
|
|
86
|
+
const funcDeclMatch = line.match(/(?:function|async\s+function)\s+(\w+)/);
|
|
87
|
+
if (funcDeclMatch) {
|
|
88
|
+
functions.add(funcDeclMatch[1]);
|
|
89
|
+
}
|
|
90
|
+
// Match arrow function assignments
|
|
91
|
+
const arrowMatch = line.match(/(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s*)?\([^)]*\)\s*=>/);
|
|
92
|
+
if (arrowMatch) {
|
|
93
|
+
functions.add(arrowMatch[1]);
|
|
94
|
+
}
|
|
95
|
+
// Match method definitions
|
|
96
|
+
const methodMatch = line.match(/(\w+)\s*\([^)]*\)\s*\{/);
|
|
97
|
+
if (methodMatch && !line.includes('function') && !line.includes('=>')) {
|
|
98
|
+
functions.add(methodMatch[1]);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return functions;
|
|
102
|
+
}
|
|
22
103
|
extractDefinedVariables(code) {
|
|
23
104
|
const defined = new Set();
|
|
24
105
|
const lines = code.split('\n');
|
|
25
106
|
for (const line of lines) {
|
|
26
|
-
// Match variable declarations
|
|
107
|
+
// Match variable declarations (const, let, var)
|
|
27
108
|
const constMatch = line.match(/\b(const|let|var)\s+(\w+)/);
|
|
28
109
|
if (constMatch) {
|
|
29
110
|
defined.add(constMatch[2]);
|
|
30
111
|
}
|
|
31
|
-
// Match
|
|
32
|
-
const
|
|
112
|
+
// Match destructuring assignments
|
|
113
|
+
const destructureMatch = line.match(/\b(const|let|var)\s*\{([^}]+)\}/);
|
|
114
|
+
if (destructureMatch) {
|
|
115
|
+
const vars = destructureMatch[2].split(',').map(v => v.trim().split(':')[0].trim());
|
|
116
|
+
vars.forEach(v => defined.add(v));
|
|
117
|
+
}
|
|
118
|
+
// Match function parameters (regular functions)
|
|
119
|
+
const funcMatch = line.match(/(?:function\s+\w+|function)\s*\(([^)]*)\)/);
|
|
33
120
|
if (funcMatch) {
|
|
34
|
-
const params = funcMatch[1].split(',').map(p => p.trim().split(':')[0].trim());
|
|
121
|
+
const params = funcMatch[1].split(',').map(p => p.trim().split(':')[0].split('=')[0].trim());
|
|
35
122
|
params.forEach(p => defined.add(p));
|
|
36
123
|
}
|
|
124
|
+
// Match arrow function parameters
|
|
125
|
+
const arrowMatch = line.match(/(?:const|let|var)\s+\w+\s*=\s*\(([^)]*)\)\s*=>/);
|
|
126
|
+
if (arrowMatch) {
|
|
127
|
+
const params = arrowMatch[1].split(',').map(p => p.trim().split(':')[0].split('=')[0].trim());
|
|
128
|
+
params.forEach(p => defined.add(p));
|
|
129
|
+
}
|
|
130
|
+
// Match class properties
|
|
131
|
+
const classPropMatch = line.match(/\b(public|private|protected)?\s*(readonly)?\s*(\w+)\s*[:=]/);
|
|
132
|
+
if (classPropMatch) {
|
|
133
|
+
defined.add(classPropMatch[3]);
|
|
134
|
+
}
|
|
37
135
|
}
|
|
38
136
|
return defined;
|
|
39
137
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextual-analysis.js","sourceRoot":"","sources":["../../src/errors/contextual-analysis.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IAC7B,YAAY,CAAC,IAAY;QACvB,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/B,6BAA6B;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAEjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnE,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,aAAa,OAAO,CAAC,IAAI,2BAA2B;oBAC7D,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,QAAQ,EAAE,CAAC;oBACX,GAAG,EAAE,WAAW,OAAO,CAAC,IAAI,2BAA2B;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAEO,uBAAuB,CAAC,IAAY;QAC1C,MAAM,
|
|
1
|
+
{"version":3,"file":"contextual-analysis.js","sourceRoot":"","sources":["../../src/errors/contextual-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DetectedError } from './pattern-matcher.js';
|
|
2
|
+
export interface FileContext {
|
|
3
|
+
path: string;
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class CrossFileAnalyzer {
|
|
7
|
+
private enabled;
|
|
8
|
+
constructor(enabled?: boolean);
|
|
9
|
+
detectErrors(code: string, filename?: string, files?: FileContext[]): DetectedError[];
|
|
10
|
+
private extractImports;
|
|
11
|
+
private extractExports;
|
|
12
|
+
private detectCircularDependencies;
|
|
13
|
+
private findCycle;
|
|
14
|
+
private prioritize;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=cross-file-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-file-analyzer.d.ts","sourceRoot":"","sources":["../../src/errors/cross-file-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,GAAE,OAAe;IAIpC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE;IAwDhG,OAAO,CAAC,cAAc;IAkDtB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,0BAA0B;IA0ClC,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,UAAU;CAGnB"}
|