@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.
Files changed (74) hide show
  1. package/README.md +112 -1
  2. package/dist/documentation/github-client.d.ts +3 -1
  3. package/dist/documentation/github-client.d.ts.map +1 -1
  4. package/dist/documentation/github-client.js +7 -5
  5. package/dist/documentation/github-client.js.map +1 -1
  6. package/dist/documentation/http-fetcher.d.ts +3 -0
  7. package/dist/documentation/http-fetcher.d.ts.map +1 -1
  8. package/dist/documentation/http-fetcher.js +6 -2
  9. package/dist/documentation/http-fetcher.js.map +1 -1
  10. package/dist/documentation/index.d.ts +5 -3
  11. package/dist/documentation/index.d.ts.map +1 -1
  12. package/dist/documentation/index.js +98 -14
  13. package/dist/documentation/index.js.map +1 -1
  14. package/dist/documentation/npm-client.d.ts +12 -0
  15. package/dist/documentation/npm-client.d.ts.map +1 -1
  16. package/dist/documentation/npm-client.js +150 -17
  17. package/dist/documentation/npm-client.js.map +1 -1
  18. package/dist/errors/api-validator.d.ts +9 -0
  19. package/dist/errors/api-validator.d.ts.map +1 -0
  20. package/dist/errors/api-validator.js +57 -0
  21. package/dist/errors/api-validator.js.map +1 -0
  22. package/dist/errors/contextual-analysis.d.ts +3 -0
  23. package/dist/errors/contextual-analysis.d.ts.map +1 -1
  24. package/dist/errors/contextual-analysis.js +102 -4
  25. package/dist/errors/contextual-analysis.js.map +1 -1
  26. package/dist/errors/cross-file-analyzer.d.ts +16 -0
  27. package/dist/errors/cross-file-analyzer.d.ts.map +1 -0
  28. package/dist/errors/cross-file-analyzer.js +172 -0
  29. package/dist/errors/cross-file-analyzer.js.map +1 -0
  30. package/dist/errors/eslint-integration.d.ts +1 -0
  31. package/dist/errors/eslint-integration.d.ts.map +1 -1
  32. package/dist/errors/eslint-integration.js +101 -22
  33. package/dist/errors/eslint-integration.js.map +1 -1
  34. package/dist/errors/framework-detector.d.ts +10 -0
  35. package/dist/errors/framework-detector.d.ts.map +1 -0
  36. package/dist/errors/framework-detector.js +126 -0
  37. package/dist/errors/framework-detector.js.map +1 -0
  38. package/dist/errors/index.d.ts +9 -2
  39. package/dist/errors/index.d.ts.map +1 -1
  40. package/dist/errors/index.js +78 -2
  41. package/dist/errors/index.js.map +1 -1
  42. package/dist/errors/patterns.d.ts.map +1 -1
  43. package/dist/errors/patterns.js +314 -0
  44. package/dist/errors/patterns.js.map +1 -1
  45. package/dist/errors/performance-detector.d.ts +11 -0
  46. package/dist/errors/performance-detector.d.ts.map +1 -0
  47. package/dist/errors/performance-detector.js +119 -0
  48. package/dist/errors/performance-detector.js.map +1 -0
  49. package/dist/errors/runtime-detector.d.ts +7 -0
  50. package/dist/errors/runtime-detector.d.ts.map +1 -0
  51. package/dist/errors/runtime-detector.js +86 -0
  52. package/dist/errors/runtime-detector.js.map +1 -0
  53. package/dist/errors/security-detector.d.ts +6 -0
  54. package/dist/errors/security-detector.d.ts.map +1 -0
  55. package/dist/errors/security-detector.js +75 -0
  56. package/dist/errors/security-detector.js.map +1 -0
  57. package/dist/index.js +10 -3
  58. package/dist/index.js.map +1 -1
  59. package/dist/server/mcp-server.d.ts.map +1 -1
  60. package/dist/server/mcp-server.js +155 -61
  61. package/dist/server/mcp-server.js.map +1 -1
  62. package/dist/utils/config.d.ts +12 -0
  63. package/dist/utils/config.d.ts.map +1 -1
  64. package/dist/utils/config.js +24 -0
  65. package/dist/utils/config.js.map +1 -1
  66. package/dist/utils/http-client.d.ts +17 -0
  67. package/dist/utils/http-client.d.ts.map +1 -0
  68. package/dist/utils/http-client.js +62 -0
  69. package/dist/utils/http-client.js.map +1 -0
  70. package/dist/utils/logger.d.ts +36 -0
  71. package/dist/utils/logger.d.ts.map +1 -0
  72. package/dist/utils/logger.js +128 -0
  73. package/dist/utils/logger.js.map +1 -0
  74. package/package.json +5 -4
@@ -1,49 +1,182 @@
1
- import axios from 'axios';
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 axios.get(packageUrl);
32
+ const packageResponse = await this.httpClient.get(packageUrl);
9
33
  const packageData = packageResponse.data;
10
- const targetVersion = version || packageData['dist-tags']?.latest || 'latest';
11
- const versionData = packageData.versions[targetVersion] || packageData.versions[packageData['dist-tags']?.latest];
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
- let sourceUrl = versionData.repository?.url || versionData.homepage;
18
- // If no README in package, try fetching from repository
19
- if (!content && versionData.repository) {
20
- content = await this.fetchFromRepository(versionData.repository);
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 || `No documentation available for ${packageName}@${targetVersion}`,
77
+ content: content,
26
78
  source: 'npm',
27
79
  url: sourceUrl,
28
- lastUpdated: new Date(),
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
- // Extract GitHub URL
40
- const githubMatch = repo.url.match(/github\.com[\/:]([^\/]+)\/([^\/]+?)(?:\.git)?$/);
41
- if (githubMatch) {
42
- const [, owner, repoName] = githubMatch;
43
- // Return empty - GitHub client will handle this
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
- return '';
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,OAAO,iBAAiB;IACX,WAAW,GAAG,4BAA4B,CAAC;IAE5D,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,OAAgB;QAC/C,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,WAAW,EAAE,CAAC;YACxD,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC;YAEzC,MAAM,aAAa,GAAG,OAAO,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,IAAI,QAAQ,CAAC;YAC9E,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;YAElH,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,WAAW,aAAa,0BAA0B,WAAW,EAAE,CAAC,CAAC;YACnF,CAAC;YAED,sCAAsC;YACtC,IAAI,OAAO,GAAG,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC;YACvC,IAAI,SAAS,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC;YAEpE,wDAAwD;YACxD,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;gBACvC,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YACnE,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE,OAAO,IAAI,kCAAkC,WAAW,IAAI,aAAa,EAAE;gBACpF,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,SAAS;gBACd,WAAW,EAAE,IAAI,IAAI,EAAE;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,WAAW,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACvI,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,IAAqC;QACrE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,qBAAqB;QACrB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACrF,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,WAAW,CAAC;YACxC,gDAAgD;YAChD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
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;IAwB3C,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,CAAC,oBAAoB;IAwB5B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;CAGnB"}
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 function parameters
32
- const funcMatch = line.match(/(?:function|=>)\s*\(?([^)]+)\)?/);
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":"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"}
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"}