@defai.digital/ax-cli 3.15.21 → 3.15.24
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 +22 -2
- package/dist/agent/agent-executor.d.ts +1 -1
- package/dist/agent/agent-executor.js +15 -17
- package/dist/agent/agent-executor.js.map +1 -1
- package/dist/agent/execution/tool-executor.d.ts +6 -0
- package/dist/agent/execution/tool-executor.js +16 -1
- package/dist/agent/execution/tool-executor.js.map +1 -1
- package/dist/agent/llm-agent.js +91 -22
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/agent/parallel-tools.d.ts +65 -0
- package/dist/agent/parallel-tools.js +146 -0
- package/dist/agent/parallel-tools.js.map +1 -0
- package/dist/llm/tools.js +1 -1
- package/dist/llm/tools.js.map +1 -1
- package/dist/ui/components/chat-interface.js +14 -0
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/hooks/use-input-handler.js +2 -2
- package/dist/ui/hooks/use-input-handler.js.map +1 -1
- package/dist/ui/utils/image-handler.js +8 -5
- package/dist/ui/utils/image-handler.js.map +1 -1
- package/package.json +1 -1
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.d.ts +0 -29
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js +0 -103
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js.map +0 -1
- package/dist/analyzers/architecture/architecture-analyzer.d.ts +0 -58
- package/dist/analyzers/architecture/architecture-analyzer.js +0 -276
- package/dist/analyzers/architecture/architecture-analyzer.js.map +0 -1
- package/dist/analyzers/architecture/index.d.ts +0 -12
- package/dist/analyzers/architecture/index.js +0 -14
- package/dist/analyzers/architecture/index.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/base-detector.d.ts +0 -27
- package/dist/analyzers/architecture/pattern-detectors/base-detector.js +0 -31
- package/dist/analyzers/architecture/pattern-detectors/base-detector.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.d.ts +0 -11
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js +0 -57
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.d.ts +0 -11
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js +0 -43
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js.map +0 -1
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.d.ts +0 -11
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.js +0 -49
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.js.map +0 -1
- package/dist/analyzers/architecture/project-structure-scanner.d.ts +0 -54
- package/dist/analyzers/architecture/project-structure-scanner.js +0 -204
- package/dist/analyzers/architecture/project-structure-scanner.js.map +0 -1
- package/dist/analyzers/ast/index.d.ts +0 -13
- package/dist/analyzers/ast/index.js +0 -16
- package/dist/analyzers/ast/index.js.map +0 -1
- package/dist/analyzers/ast/language-parser.d.ts +0 -59
- package/dist/analyzers/ast/language-parser.js +0 -107
- package/dist/analyzers/ast/language-parser.js.map +0 -1
- package/dist/analyzers/ast/multi-language-parser.d.ts +0 -79
- package/dist/analyzers/ast/multi-language-parser.js +0 -157
- package/dist/analyzers/ast/multi-language-parser.js.map +0 -1
- package/dist/analyzers/ast/node-helpers.d.ts +0 -81
- package/dist/analyzers/ast/node-helpers.js +0 -128
- package/dist/analyzers/ast/node-helpers.js.map +0 -1
- package/dist/analyzers/ast/parser.d.ts +0 -60
- package/dist/analyzers/ast/parser.js +0 -305
- package/dist/analyzers/ast/parser.js.map +0 -1
- package/dist/analyzers/ast/traverser.d.ts +0 -67
- package/dist/analyzers/ast/traverser.js +0 -156
- package/dist/analyzers/ast/traverser.js.map +0 -1
- package/dist/analyzers/ast/types.d.ts +0 -107
- package/dist/analyzers/ast/types.js +0 -7
- package/dist/analyzers/ast/types.js.map +0 -1
- package/dist/analyzers/best-practices/base-rule.d.ts +0 -45
- package/dist/analyzers/best-practices/base-rule.js +0 -45
- package/dist/analyzers/best-practices/base-rule.js.map +0 -1
- package/dist/analyzers/best-practices/best-practice-validator.d.ts +0 -35
- package/dist/analyzers/best-practices/best-practice-validator.js +0 -181
- package/dist/analyzers/best-practices/best-practice-validator.js.map +0 -1
- package/dist/analyzers/best-practices/index.d.ts +0 -10
- package/dist/analyzers/best-practices/index.js +0 -11
- package/dist/analyzers/best-practices/index.js.map +0 -1
- package/dist/analyzers/best-practices/rules/index.d.ts +0 -7
- package/dist/analyzers/best-practices/rules/index.js +0 -56
- package/dist/analyzers/best-practices/rules/index.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js +0 -41
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.d.ts +0 -27
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.js +0 -76
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/index.d.ts +0 -15
- package/dist/analyzers/best-practices/rules/typescript/index.js +0 -16
- package/dist/analyzers/best-practices/rules/typescript/index.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.d.ts +0 -18
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.js +0 -25
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.js +0 -27
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.d.ts +0 -18
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js +0 -39
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +0 -38
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +0 -38
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +0 -35
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +0 -36
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +0 -1
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.d.ts +0 -17
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js +0 -27
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js.map +0 -1
- package/dist/analyzers/best-practices/types.d.ts +0 -86
- package/dist/analyzers/best-practices/types.js +0 -7
- package/dist/analyzers/best-practices/types.js.map +0 -1
- package/dist/analyzers/cache/analysis-cache.d.ts +0 -41
- package/dist/analyzers/cache/analysis-cache.js +0 -84
- package/dist/analyzers/cache/analysis-cache.js.map +0 -1
- package/dist/analyzers/code-smells/base-smell-detector.d.ts +0 -30
- package/dist/analyzers/code-smells/base-smell-detector.js +0 -44
- package/dist/analyzers/code-smells/base-smell-detector.js.map +0 -1
- package/dist/analyzers/code-smells/code-smell-analyzer.d.ts +0 -30
- package/dist/analyzers/code-smells/code-smell-analyzer.js +0 -167
- package/dist/analyzers/code-smells/code-smell-analyzer.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +0 -64
- package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/dead-code-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/dead-code-detector.js +0 -58
- package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +0 -69
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +0 -70
- package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.d.ts +0 -11
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +0 -59
- package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/large-class-detector.d.ts +0 -13
- package/dist/analyzers/code-smells/detectors/large-class-detector.js +0 -61
- package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/long-method-detector.d.ts +0 -12
- package/dist/analyzers/code-smells/detectors/long-method-detector.js +0 -55
- package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.d.ts +0 -12
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +0 -53
- package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.d.ts +0 -12
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +0 -56
- package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +0 -1
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.d.ts +0 -13
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +0 -77
- package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +0 -1
- package/dist/analyzers/code-smells/index.d.ts +0 -16
- package/dist/analyzers/code-smells/index.js +0 -19
- package/dist/analyzers/code-smells/index.js.map +0 -1
- package/dist/analyzers/code-smells/types.d.ts +0 -82
- package/dist/analyzers/code-smells/types.js +0 -30
- package/dist/analyzers/code-smells/types.js.map +0 -1
- package/dist/analyzers/dependency/circular-detector.d.ts +0 -17
- package/dist/analyzers/dependency/circular-detector.js +0 -73
- package/dist/analyzers/dependency/circular-detector.js.map +0 -1
- package/dist/analyzers/dependency/coupling-calculator.d.ts +0 -24
- package/dist/analyzers/dependency/coupling-calculator.js +0 -86
- package/dist/analyzers/dependency/coupling-calculator.js.map +0 -1
- package/dist/analyzers/dependency/dependency-analyzer.d.ts +0 -44
- package/dist/analyzers/dependency/dependency-analyzer.js +0 -218
- package/dist/analyzers/dependency/dependency-analyzer.js.map +0 -1
- package/dist/analyzers/dependency/dependency-graph.d.ts +0 -57
- package/dist/analyzers/dependency/dependency-graph.js +0 -198
- package/dist/analyzers/dependency/dependency-graph.js.map +0 -1
- package/dist/analyzers/dependency/index.d.ts +0 -8
- package/dist/analyzers/dependency/index.js +0 -8
- package/dist/analyzers/dependency/index.js.map +0 -1
- package/dist/analyzers/dependency/types.d.ts +0 -105
- package/dist/analyzers/dependency/types.js +0 -5
- package/dist/analyzers/dependency/types.js.map +0 -1
- package/dist/analyzers/errors.d.ts +0 -51
- package/dist/analyzers/errors.js +0 -79
- package/dist/analyzers/errors.js.map +0 -1
- package/dist/analyzers/git/churn-calculator.d.ts +0 -36
- package/dist/analyzers/git/churn-calculator.js +0 -257
- package/dist/analyzers/git/churn-calculator.js.map +0 -1
- package/dist/analyzers/git/git-analyzer.d.ts +0 -19
- package/dist/analyzers/git/git-analyzer.js +0 -79
- package/dist/analyzers/git/git-analyzer.js.map +0 -1
- package/dist/analyzers/git/hotspot-detector.d.ts +0 -34
- package/dist/analyzers/git/hotspot-detector.js +0 -173
- package/dist/analyzers/git/hotspot-detector.js.map +0 -1
- package/dist/analyzers/git/index.d.ts +0 -7
- package/dist/analyzers/git/index.js +0 -7
- package/dist/analyzers/git/index.js.map +0 -1
- package/dist/analyzers/git/types.d.ts +0 -88
- package/dist/analyzers/git/types.js +0 -5
- package/dist/analyzers/git/types.js.map +0 -1
- package/dist/analyzers/metrics/halstead-calculator.d.ts +0 -30
- package/dist/analyzers/metrics/halstead-calculator.js +0 -150
- package/dist/analyzers/metrics/halstead-calculator.js.map +0 -1
- package/dist/analyzers/metrics/index.d.ts +0 -9
- package/dist/analyzers/metrics/index.js +0 -9
- package/dist/analyzers/metrics/index.js.map +0 -1
- package/dist/analyzers/metrics/maintainability-calculator.d.ts +0 -17
- package/dist/analyzers/metrics/maintainability-calculator.js +0 -46
- package/dist/analyzers/metrics/maintainability-calculator.js.map +0 -1
- package/dist/analyzers/metrics/metrics-analyzer.d.ts +0 -32
- package/dist/analyzers/metrics/metrics-analyzer.js +0 -144
- package/dist/analyzers/metrics/metrics-analyzer.js.map +0 -1
- package/dist/analyzers/metrics/types.d.ts +0 -67
- package/dist/analyzers/metrics/types.js +0 -5
- package/dist/analyzers/metrics/types.js.map +0 -1
- package/dist/analyzers/security/base-detector.d.ts +0 -58
- package/dist/analyzers/security/base-detector.js +0 -104
- package/dist/analyzers/security/base-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/command-injection-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/command-injection-detector.js +0 -84
- package/dist/analyzers/security/detectors/command-injection-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.d.ts +0 -16
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js +0 -140
- package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.js +0 -109
- package/dist/analyzers/security/detectors/insecure-deserialization-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/insecure-random-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/insecure-random-detector.js +0 -61
- package/dist/analyzers/security/detectors/insecure-random-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/path-traversal-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/path-traversal-detector.js +0 -82
- package/dist/analyzers/security/detectors/path-traversal-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/sql-injection-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/sql-injection-detector.js +0 -88
- package/dist/analyzers/security/detectors/sql-injection-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/weak-crypto-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/weak-crypto-detector.js +0 -104
- package/dist/analyzers/security/detectors/weak-crypto-detector.js.map +0 -1
- package/dist/analyzers/security/detectors/xss-detector.d.ts +0 -12
- package/dist/analyzers/security/detectors/xss-detector.js +0 -90
- package/dist/analyzers/security/detectors/xss-detector.js.map +0 -1
- package/dist/analyzers/security/index.d.ts +0 -16
- package/dist/analyzers/security/index.js +0 -18
- package/dist/analyzers/security/index.js.map +0 -1
- package/dist/analyzers/security/security-analyzer.d.ts +0 -38
- package/dist/analyzers/security/security-analyzer.js +0 -215
- package/dist/analyzers/security/security-analyzer.js.map +0 -1
- package/dist/analyzers/security/types.d.ts +0 -95
- package/dist/analyzers/security/types.js +0 -7
- package/dist/analyzers/security/types.js.map +0 -1
- package/dist/tools/analysis-tools/architecture-tool.d.ts +0 -46
- package/dist/tools/analysis-tools/architecture-tool.js +0 -124
- package/dist/tools/analysis-tools/architecture-tool.js.map +0 -1
- package/dist/tools/analysis-tools/validation-tool.d.ts +0 -51
- package/dist/tools/analysis-tools/validation-tool.js +0 -121
- package/dist/tools/analysis-tools/validation-tool.js.map +0 -1
- package/dist/tools/analysis-tools.d.ts +0 -73
- package/dist/tools/analysis-tools.js +0 -422
- package/dist/tools/analysis-tools.js.map +0 -1
- package/dist/types/analysis.d.ts +0 -177
- package/dist/types/analysis.js +0 -8
- package/dist/types/analysis.js.map +0 -1
- package/dist/utils/analysis-logger.d.ts +0 -50
- package/dist/utils/analysis-logger.js +0 -73
- package/dist/utils/analysis-logger.js.map +0 -1
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base Validation Rule
|
|
3
|
-
*
|
|
4
|
-
* Abstract base class for all validation rules
|
|
5
|
-
* Provides common functionality and helpers
|
|
6
|
-
*/
|
|
7
|
-
import type { ValidationRule, ViolationFix } from './types.js';
|
|
8
|
-
import type { Violation, Severity } from '../../types/analysis.js';
|
|
9
|
-
import type { RuleCategory } from './types.js';
|
|
10
|
-
/**
|
|
11
|
-
* Abstract base class for validation rules
|
|
12
|
-
* Provides common functionality for all rules
|
|
13
|
-
*/
|
|
14
|
-
export declare abstract class BaseValidationRule implements ValidationRule {
|
|
15
|
-
abstract readonly id: string;
|
|
16
|
-
abstract readonly name: string;
|
|
17
|
-
abstract readonly description: string;
|
|
18
|
-
abstract readonly severity: Severity;
|
|
19
|
-
abstract readonly category: RuleCategory;
|
|
20
|
-
abstract readonly autoFixable: boolean;
|
|
21
|
-
/**
|
|
22
|
-
* Check file for violations
|
|
23
|
-
* Must be implemented by subclasses
|
|
24
|
-
*/
|
|
25
|
-
abstract check(filePath: string, content: string): Promise<Violation[]>;
|
|
26
|
-
/**
|
|
27
|
-
* Generate fix for violation (optional)
|
|
28
|
-
*/
|
|
29
|
-
fix?(violation: Violation, content: string): Promise<ViolationFix | null>;
|
|
30
|
-
/**
|
|
31
|
-
* Helper: Create a violation object
|
|
32
|
-
*/
|
|
33
|
-
protected createViolation(file: string, line: number, column: number, message: string, suggestion?: string, metadata?: Record<string, unknown>): Violation;
|
|
34
|
-
/**
|
|
35
|
-
* Helper: Find line and column from character index
|
|
36
|
-
*/
|
|
37
|
-
protected getPosition(content: string, index: number): {
|
|
38
|
-
line: number;
|
|
39
|
-
column: number;
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Helper: Count matches in content
|
|
43
|
-
*/
|
|
44
|
-
protected countMatches(content: string, pattern: RegExp): number;
|
|
45
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base Validation Rule
|
|
3
|
-
*
|
|
4
|
-
* Abstract base class for all validation rules
|
|
5
|
-
* Provides common functionality and helpers
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Abstract base class for validation rules
|
|
9
|
-
* Provides common functionality for all rules
|
|
10
|
-
*/
|
|
11
|
-
export class BaseValidationRule {
|
|
12
|
-
/**
|
|
13
|
-
* Helper: Create a violation object
|
|
14
|
-
*/
|
|
15
|
-
createViolation(file, line, column, message, suggestion, metadata) {
|
|
16
|
-
return Object.freeze({
|
|
17
|
-
ruleId: this.id,
|
|
18
|
-
severity: this.severity,
|
|
19
|
-
file,
|
|
20
|
-
line,
|
|
21
|
-
column,
|
|
22
|
-
message,
|
|
23
|
-
suggestion,
|
|
24
|
-
metadata: metadata ? Object.freeze(metadata) : undefined,
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Helper: Find line and column from character index
|
|
29
|
-
*/
|
|
30
|
-
getPosition(content, index) {
|
|
31
|
-
const lines = content.substring(0, index).split('\n');
|
|
32
|
-
return {
|
|
33
|
-
line: lines.length,
|
|
34
|
-
column: lines[lines.length - 1].length + 1,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Helper: Count matches in content
|
|
39
|
-
*/
|
|
40
|
-
countMatches(content, pattern) {
|
|
41
|
-
const matches = content.match(pattern);
|
|
42
|
-
return matches ? matches.length : 0;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=base-rule.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base-rule.js","sourceRoot":"","sources":["../../../src/analyzers/best-practices/base-rule.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;GAGG;AACH,MAAM,OAAgB,kBAAkB;IAmBtC;;OAEG;IACO,eAAe,CACvB,IAAY,EACZ,IAAY,EACZ,MAAc,EACd,OAAe,EACf,UAAmB,EACnB,QAAkC;QAElC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI;YACJ,IAAI;YACJ,MAAM;YACN,OAAO;YACP,UAAU;YACV,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;SACzD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACO,WAAW,CACnB,OAAe,EACf,KAAa;QAEb,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,MAAM;YAClB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED;;OAEG;IACO,YAAY,CAAC,OAAe,EAAE,OAAe;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Best Practice Validator
|
|
3
|
-
*
|
|
4
|
-
* Main orchestrator for validation operations
|
|
5
|
-
*/
|
|
6
|
-
import type { ValidationResult, BatchValidationResult, ValidationOptions } from '../../types/analysis.js';
|
|
7
|
-
import type { Logger } from '../../utils/analysis-logger.js';
|
|
8
|
-
export declare class BestPracticeValidator {
|
|
9
|
-
private readonly logger;
|
|
10
|
-
constructor(logger?: Logger);
|
|
11
|
-
/**
|
|
12
|
-
* Validate a single file
|
|
13
|
-
*/
|
|
14
|
-
validateFile(filePath: string, options?: ValidationOptions): Promise<ValidationResult>;
|
|
15
|
-
/**
|
|
16
|
-
* Validate multiple files in batch
|
|
17
|
-
*/
|
|
18
|
-
validateBatch(filePaths: string[], options?: ValidationOptions): Promise<BatchValidationResult>;
|
|
19
|
-
/**
|
|
20
|
-
* Detect language from file extension
|
|
21
|
-
*/
|
|
22
|
-
private detectLanguage;
|
|
23
|
-
/**
|
|
24
|
-
* Calculate quality score (0-100)
|
|
25
|
-
*/
|
|
26
|
-
private calculateScore;
|
|
27
|
-
/**
|
|
28
|
-
* Generate summary text
|
|
29
|
-
*/
|
|
30
|
-
private generateSummary;
|
|
31
|
-
/**
|
|
32
|
-
* Generate batch summary
|
|
33
|
-
*/
|
|
34
|
-
private generateBatchSummary;
|
|
35
|
-
}
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Best Practice Validator
|
|
3
|
-
*
|
|
4
|
-
* Main orchestrator for validation operations
|
|
5
|
-
*/
|
|
6
|
-
import { getRuleRegistry } from './rules/index.js';
|
|
7
|
-
import { createLogger } from '../../utils/analysis-logger.js';
|
|
8
|
-
import { promises as fs } from 'fs';
|
|
9
|
-
import path from 'path';
|
|
10
|
-
export class BestPracticeValidator {
|
|
11
|
-
logger;
|
|
12
|
-
constructor(logger) {
|
|
13
|
-
this.logger = logger || createLogger();
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Validate a single file
|
|
17
|
-
*/
|
|
18
|
-
async validateFile(filePath, options) {
|
|
19
|
-
const startTime = Date.now();
|
|
20
|
-
try {
|
|
21
|
-
// Read file
|
|
22
|
-
const content = await fs.readFile(filePath, 'utf-8');
|
|
23
|
-
// Detect language from extension
|
|
24
|
-
const language = this.detectLanguage(filePath);
|
|
25
|
-
// Get applicable rules
|
|
26
|
-
const registry = getRuleRegistry();
|
|
27
|
-
const allRules = registry.getAll();
|
|
28
|
-
const enabledRules = allRules.filter(rule => {
|
|
29
|
-
const config = options?.rules?.[rule.id];
|
|
30
|
-
return config?.enabled !== false; // Enabled by default
|
|
31
|
-
});
|
|
32
|
-
this.logger.debug('Validating file', {
|
|
33
|
-
file: filePath,
|
|
34
|
-
language,
|
|
35
|
-
ruleCount: enabledRules.length,
|
|
36
|
-
});
|
|
37
|
-
// Run all rules in parallel
|
|
38
|
-
const violationArrays = await Promise.all(enabledRules.map(async (rule) => {
|
|
39
|
-
try {
|
|
40
|
-
const violations = await rule.check(filePath, content);
|
|
41
|
-
return violations;
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
this.logger.warn(`Rule ${rule.id} failed`, {
|
|
45
|
-
error: error.message,
|
|
46
|
-
});
|
|
47
|
-
return [];
|
|
48
|
-
}
|
|
49
|
-
}));
|
|
50
|
-
// Flatten violations
|
|
51
|
-
const violations = violationArrays.flat();
|
|
52
|
-
// Calculate score (0-100)
|
|
53
|
-
const score = this.calculateScore(violations);
|
|
54
|
-
const result = Object.freeze({
|
|
55
|
-
timestamp: Date.now(),
|
|
56
|
-
durationMs: Date.now() - startTime,
|
|
57
|
-
projectPath: path.dirname(filePath),
|
|
58
|
-
file: filePath,
|
|
59
|
-
language,
|
|
60
|
-
violations: Object.freeze(violations),
|
|
61
|
-
score,
|
|
62
|
-
summary: this.generateSummary(violations, score),
|
|
63
|
-
});
|
|
64
|
-
return result;
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
throw new Error(`Failed to validate file ${filePath}: ${error.message}`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Validate multiple files in batch
|
|
72
|
-
*/
|
|
73
|
-
async validateBatch(filePaths, options) {
|
|
74
|
-
const startTime = Date.now();
|
|
75
|
-
this.logger.info('Starting batch validation', { fileCount: filePaths.length });
|
|
76
|
-
// Validate all files in parallel (with concurrency limit)
|
|
77
|
-
const CONCURRENCY = 5;
|
|
78
|
-
const results = [];
|
|
79
|
-
for (let i = 0; i < filePaths.length; i += CONCURRENCY) {
|
|
80
|
-
const batch = filePaths.slice(i, i + CONCURRENCY);
|
|
81
|
-
const batchResults = await Promise.all(batch.map(async (filePath) => {
|
|
82
|
-
try {
|
|
83
|
-
return await this.validateFile(filePath, options);
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
this.logger.warn(`Failed to validate ${filePath}`, {
|
|
87
|
-
error: error.message,
|
|
88
|
-
});
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
}));
|
|
92
|
-
results.push(...batchResults.filter((r) => r !== null));
|
|
93
|
-
}
|
|
94
|
-
// Calculate aggregate metrics
|
|
95
|
-
const allViolations = results.flatMap(r => Array.from(r.violations));
|
|
96
|
-
const criticalCount = allViolations.filter(v => v.severity === 'critical').length;
|
|
97
|
-
const highCount = allViolations.filter(v => v.severity === 'high').length;
|
|
98
|
-
const averageScore = results.reduce((sum, r) => sum + r.score, 0) / (results.length || 1);
|
|
99
|
-
const result = Object.freeze({
|
|
100
|
-
timestamp: Date.now(),
|
|
101
|
-
durationMs: Date.now() - startTime,
|
|
102
|
-
projectPath: path.dirname(filePaths[0] || process.cwd()),
|
|
103
|
-
files: Object.freeze(results),
|
|
104
|
-
totalViolations: allViolations.length,
|
|
105
|
-
criticalCount,
|
|
106
|
-
highCount,
|
|
107
|
-
averageScore: Math.round(averageScore),
|
|
108
|
-
summary: this.generateBatchSummary(results, allViolations.length),
|
|
109
|
-
});
|
|
110
|
-
this.logger.info('Batch validation completed', {
|
|
111
|
-
fileCount: results.length,
|
|
112
|
-
violations: allViolations.length,
|
|
113
|
-
averageScore: result.averageScore,
|
|
114
|
-
});
|
|
115
|
-
return result;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Detect language from file extension
|
|
119
|
-
*/
|
|
120
|
-
detectLanguage(filePath) {
|
|
121
|
-
const ext = path.extname(filePath).toLowerCase();
|
|
122
|
-
if (ext === '.ts' || ext === '.tsx') {
|
|
123
|
-
return 'typescript';
|
|
124
|
-
}
|
|
125
|
-
return 'javascript';
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Calculate quality score (0-100)
|
|
129
|
-
*/
|
|
130
|
-
calculateScore(violations) {
|
|
131
|
-
let score = 100;
|
|
132
|
-
const severityPenalty = {
|
|
133
|
-
critical: 10,
|
|
134
|
-
high: 5,
|
|
135
|
-
medium: 2,
|
|
136
|
-
low: 1,
|
|
137
|
-
info: 0,
|
|
138
|
-
};
|
|
139
|
-
for (const violation of violations) {
|
|
140
|
-
score -= severityPenalty[violation.severity] || 0;
|
|
141
|
-
}
|
|
142
|
-
// Bonus for clean code
|
|
143
|
-
if (violations.length === 0) {
|
|
144
|
-
score = 100;
|
|
145
|
-
}
|
|
146
|
-
return Math.max(0, Math.min(100, score));
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Generate summary text
|
|
150
|
-
*/
|
|
151
|
-
generateSummary(violations, score) {
|
|
152
|
-
if (violations.length === 0) {
|
|
153
|
-
return `Perfect score! No violations found. (Score: ${score}/100)`;
|
|
154
|
-
}
|
|
155
|
-
const bySeverity = {
|
|
156
|
-
critical: violations.filter(v => v.severity === 'critical').length,
|
|
157
|
-
high: violations.filter(v => v.severity === 'high').length,
|
|
158
|
-
medium: violations.filter(v => v.severity === 'medium').length,
|
|
159
|
-
low: violations.filter(v => v.severity === 'low').length,
|
|
160
|
-
};
|
|
161
|
-
const parts = [`Found ${violations.length} violation(s)`];
|
|
162
|
-
if (bySeverity.critical > 0)
|
|
163
|
-
parts.push(`${bySeverity.critical} critical`);
|
|
164
|
-
if (bySeverity.high > 0)
|
|
165
|
-
parts.push(`${bySeverity.high} high`);
|
|
166
|
-
if (bySeverity.medium > 0)
|
|
167
|
-
parts.push(`${bySeverity.medium} medium`);
|
|
168
|
-
if (bySeverity.low > 0)
|
|
169
|
-
parts.push(`${bySeverity.low} low`);
|
|
170
|
-
parts.push(`Score: ${score}/100`);
|
|
171
|
-
return parts.join(', ');
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Generate batch summary
|
|
175
|
-
*/
|
|
176
|
-
generateBatchSummary(results, totalViolations) {
|
|
177
|
-
const avgScore = results.reduce((sum, r) => sum + r.score, 0) / (results.length || 1);
|
|
178
|
-
return `Validated ${results.length} file(s). Found ${totalViolations} violation(s). Average score: ${Math.round(avgScore)}/100`;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
//# sourceMappingURL=best-practice-validator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"best-practice-validator.js","sourceRoot":"","sources":["../../../src/analyzers/best-practices/best-practice-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Best Practice Analyzer Module
|
|
3
|
-
*
|
|
4
|
-
* Exports all best practice validation components
|
|
5
|
-
*/
|
|
6
|
-
export { BestPracticeValidator } from './best-practice-validator.js';
|
|
7
|
-
export { BaseValidationRule } from './base-rule.js';
|
|
8
|
-
export { getRuleRegistry } from './rules/index.js';
|
|
9
|
-
export * from './rules/typescript/index.js';
|
|
10
|
-
export type { ValidationRule, RuleCategory, RuleConfig, ValidationOptions, RuleRegistry, ViolationFix, TextEdit, TextRange, Position, } from './types.js';
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Best Practice Analyzer Module
|
|
3
|
-
*
|
|
4
|
-
* Exports all best practice validation components
|
|
5
|
-
*/
|
|
6
|
-
export { BestPracticeValidator } from './best-practice-validator.js';
|
|
7
|
-
export { BaseValidationRule } from './base-rule.js';
|
|
8
|
-
export { getRuleRegistry } from './rules/index.js';
|
|
9
|
-
// Export all TypeScript rules
|
|
10
|
-
export * from './rules/typescript/index.js';
|
|
11
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/best-practices/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,8BAA8B;AAC9B,cAAc,6BAA6B,CAAC"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Validation Rule Registry
|
|
3
|
-
*
|
|
4
|
-
* Singleton registry managing all validation rules
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Singleton rule registry
|
|
8
|
-
* Manages all validation rules
|
|
9
|
-
*/
|
|
10
|
-
class ValidationRuleRegistry {
|
|
11
|
-
static instance;
|
|
12
|
-
rules = new Map();
|
|
13
|
-
constructor() { }
|
|
14
|
-
static getInstance() {
|
|
15
|
-
if (!ValidationRuleRegistry.instance) {
|
|
16
|
-
ValidationRuleRegistry.instance = new ValidationRuleRegistry();
|
|
17
|
-
}
|
|
18
|
-
return ValidationRuleRegistry.instance;
|
|
19
|
-
}
|
|
20
|
-
register(rule) {
|
|
21
|
-
if (this.rules.has(rule.id)) {
|
|
22
|
-
console.warn(`Rule ${rule.id} is already registered, overwriting`);
|
|
23
|
-
}
|
|
24
|
-
this.rules.set(rule.id, rule);
|
|
25
|
-
}
|
|
26
|
-
get(id) {
|
|
27
|
-
return this.rules.get(id);
|
|
28
|
-
}
|
|
29
|
-
getAll() {
|
|
30
|
-
return Object.freeze(Array.from(this.rules.values()));
|
|
31
|
-
}
|
|
32
|
-
getByCategory(category) {
|
|
33
|
-
return Object.freeze(Array.from(this.rules.values()).filter(r => r.category === category));
|
|
34
|
-
}
|
|
35
|
-
clear() {
|
|
36
|
-
this.rules.clear();
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
export function getRuleRegistry() {
|
|
40
|
-
return ValidationRuleRegistry.getInstance();
|
|
41
|
-
}
|
|
42
|
-
// Auto-register all TypeScript rules
|
|
43
|
-
import { NoAnyTypeRule, PreferConstRule, NoImplicitAnyRule, ProperErrorHandlingRule, ConsistentNamingRule, NoUnusedVarsRule, FunctionComplexityRule, MaxFileLengthRule, NoMagicNumbersRule, PreferReadonlyRule, } from './typescript/index.js';
|
|
44
|
-
// Register TypeScript rules on module load
|
|
45
|
-
const registry = getRuleRegistry();
|
|
46
|
-
registry.register(new NoAnyTypeRule());
|
|
47
|
-
registry.register(new PreferConstRule());
|
|
48
|
-
registry.register(new NoImplicitAnyRule());
|
|
49
|
-
registry.register(new ProperErrorHandlingRule());
|
|
50
|
-
registry.register(new ConsistentNamingRule());
|
|
51
|
-
registry.register(new NoUnusedVarsRule());
|
|
52
|
-
registry.register(new FunctionComplexityRule());
|
|
53
|
-
registry.register(new MaxFileLengthRule());
|
|
54
|
-
registry.register(new NoMagicNumbersRule());
|
|
55
|
-
registry.register(new PreferReadonlyRule());
|
|
56
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/analyzers/best-practices/rules/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,MAAM,sBAAsB;IAClB,MAAM,CAAC,QAAQ,CAAyB;IACxC,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAElD,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YACrC,sBAAsB,CAAC,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,sBAAsB,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED,QAAQ,CAAC,IAAoB;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,qCAAqC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM;QACJ,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,aAAa,CAAC,QAAsB;QAClC,OAAO,MAAM,CAAC,MAAM,CAClB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CACrE,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,sBAAsB,CAAC,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,qCAAqC;AACrC,OAAO,EACL,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B,2CAA2C;AAC3C,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;AACnC,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;AACvC,QAAQ,CAAC,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;AACzC,QAAQ,CAAC,QAAQ,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;AAC3C,QAAQ,CAAC,QAAQ,CAAC,IAAI,uBAAuB,EAAE,CAAC,CAAC;AACjD,QAAQ,CAAC,QAAQ,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;AAC9C,QAAQ,CAAC,QAAQ,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;AAC1C,QAAQ,CAAC,QAAQ,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;AAChD,QAAQ,CAAC,QAAQ,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;AAC3C,QAAQ,CAAC,QAAQ,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;AAC5C,QAAQ,CAAC,QAAQ,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Consistent Naming Rule
|
|
3
|
-
*
|
|
4
|
-
* Use consistent naming conventions: camelCase for variables/functions, PascalCase for classes/interfaces
|
|
5
|
-
*/
|
|
6
|
-
import { BaseValidationRule } from '../../base-rule.js';
|
|
7
|
-
import type { Violation, Severity } from '../../../../types/analysis.js';
|
|
8
|
-
import type { RuleCategory } from '../../types.js';
|
|
9
|
-
export declare class ConsistentNamingRule extends BaseValidationRule {
|
|
10
|
-
readonly id = "consistent-naming";
|
|
11
|
-
readonly name = "Consistent Naming";
|
|
12
|
-
readonly description = "Use consistent naming conventions: camelCase for variables/functions, PascalCase for classes/interfaces";
|
|
13
|
-
readonly severity: Severity;
|
|
14
|
-
readonly category: RuleCategory;
|
|
15
|
-
readonly autoFixable = false;
|
|
16
|
-
check(filePath: string, content: string): Promise<Violation[]>;
|
|
17
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Consistent Naming Rule
|
|
3
|
-
*
|
|
4
|
-
* Use consistent naming conventions: camelCase for variables/functions, PascalCase for classes/interfaces
|
|
5
|
-
*/
|
|
6
|
-
import { BaseValidationRule } from '../../base-rule.js';
|
|
7
|
-
export class ConsistentNamingRule extends BaseValidationRule {
|
|
8
|
-
id = 'consistent-naming';
|
|
9
|
-
name = 'Consistent Naming';
|
|
10
|
-
description = 'Use consistent naming conventions: camelCase for variables/functions, PascalCase for classes/interfaces';
|
|
11
|
-
severity = 'low';
|
|
12
|
-
category = 'best-practices';
|
|
13
|
-
autoFixable = false;
|
|
14
|
-
async check(filePath, content) {
|
|
15
|
-
const violations = [];
|
|
16
|
-
// Check class names (should be PascalCase)
|
|
17
|
-
const classPattern = /class\s+([a-z][a-zA-Z0-9]*)/g;
|
|
18
|
-
let match;
|
|
19
|
-
while ((match = classPattern.exec(content)) !== null) {
|
|
20
|
-
const className = match[1];
|
|
21
|
-
const pos = this.getPosition(content, match.index);
|
|
22
|
-
violations.push(this.createViolation(filePath, pos.line, pos.column, `Class name "${className}" should be in PascalCase (start with uppercase).`, `Rename to "${className.charAt(0).toUpperCase() + className.slice(1)}"`));
|
|
23
|
-
}
|
|
24
|
-
// Check interface names (should be PascalCase)
|
|
25
|
-
const interfacePattern = /interface\s+([a-z][a-zA-Z0-9]*)/g;
|
|
26
|
-
while ((match = interfacePattern.exec(content)) !== null) {
|
|
27
|
-
const interfaceName = match[1];
|
|
28
|
-
const pos = this.getPosition(content, match.index);
|
|
29
|
-
violations.push(this.createViolation(filePath, pos.line, pos.column, `Interface name "${interfaceName}" should be in PascalCase (start with uppercase).`, `Rename to "${interfaceName.charAt(0).toUpperCase() + interfaceName.slice(1)}"`));
|
|
30
|
-
}
|
|
31
|
-
// Check function names (should be camelCase, not PascalCase)
|
|
32
|
-
const functionPattern = /function\s+([A-Z][a-zA-Z0-9]*)/g;
|
|
33
|
-
while ((match = functionPattern.exec(content)) !== null) {
|
|
34
|
-
const functionName = match[1];
|
|
35
|
-
const pos = this.getPosition(content, match.index);
|
|
36
|
-
violations.push(this.createViolation(filePath, pos.line, pos.column, `Function name "${functionName}" should be in camelCase (start with lowercase).`, `Rename to "${functionName.charAt(0).toLowerCase() + functionName.slice(1)}"`));
|
|
37
|
-
}
|
|
38
|
-
return violations;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=consistent-naming.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"consistent-naming.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/consistent-naming.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,OAAO,oBAAqB,SAAQ,kBAAkB;IACjD,EAAE,GAAG,mBAAmB,CAAC;IACzB,IAAI,GAAG,mBAAmB,CAAC;IAC3B,WAAW,GAClB,yGAAyG,CAAC;IACnG,QAAQ,GAAa,KAAK,CAAC;IAC3B,QAAQ,GAAiB,gBAAgB,CAAC;IAC1C,WAAW,GAAG,KAAK,CAAC;IAE7B,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAe;QAC3C,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,2CAA2C;QAC3C,MAAM,YAAY,GAAG,8BAA8B,CAAC;QACpD,IAAI,KAA6B,CAAC;QAElC,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,eAAe,SAAS,mDAAmD,EAC3E,cAAc,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CACxE,CACF,CAAC;QACJ,CAAC;QAED,+CAA+C;QAC/C,MAAM,gBAAgB,GAAG,kCAAkC,CAAC;QAE5D,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACzD,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,mBAAmB,aAAa,mDAAmD,EACnF,cAAc,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAChF,CACF,CAAC;QACJ,CAAC;QAED,6DAA6D;QAC7D,MAAM,eAAe,GAAG,iCAAiC,CAAC;QAE1D,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,kBAAkB,YAAY,kDAAkD,EAChF,cAAc,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAC9E,CACF,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Function Complexity Rule
|
|
3
|
-
*
|
|
4
|
-
* Functions should have low cyclomatic complexity (max 10)
|
|
5
|
-
*/
|
|
6
|
-
import { BaseValidationRule } from '../../base-rule.js';
|
|
7
|
-
import type { Violation, Severity } from '../../../../types/analysis.js';
|
|
8
|
-
import type { RuleCategory } from '../../types.js';
|
|
9
|
-
export declare class FunctionComplexityRule extends BaseValidationRule {
|
|
10
|
-
readonly id = "function-complexity";
|
|
11
|
-
readonly name = "Function Complexity";
|
|
12
|
-
readonly description = "Functions should have low cyclomatic complexity (max 10)";
|
|
13
|
-
readonly severity: Severity;
|
|
14
|
-
readonly category: RuleCategory;
|
|
15
|
-
readonly autoFixable = false;
|
|
16
|
-
private readonly MAX_COMPLEXITY;
|
|
17
|
-
check(filePath: string, content: string): Promise<Violation[]>;
|
|
18
|
-
/**
|
|
19
|
-
* Extract function body (simplified version)
|
|
20
|
-
*/
|
|
21
|
-
private extractFunctionBody;
|
|
22
|
-
/**
|
|
23
|
-
* Calculate cyclomatic complexity
|
|
24
|
-
* Complexity = 1 + number of decision points (if, for, while, case, &&, ||, ?, catch)
|
|
25
|
-
*/
|
|
26
|
-
private calculateComplexity;
|
|
27
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Function Complexity Rule
|
|
3
|
-
*
|
|
4
|
-
* Functions should have low cyclomatic complexity (max 10)
|
|
5
|
-
*/
|
|
6
|
-
import { BaseValidationRule } from '../../base-rule.js';
|
|
7
|
-
export class FunctionComplexityRule extends BaseValidationRule {
|
|
8
|
-
id = 'function-complexity';
|
|
9
|
-
name = 'Function Complexity';
|
|
10
|
-
description = 'Functions should have low cyclomatic complexity (max 10)';
|
|
11
|
-
severity = 'medium';
|
|
12
|
-
category = 'maintainability';
|
|
13
|
-
autoFixable = false;
|
|
14
|
-
MAX_COMPLEXITY = 10;
|
|
15
|
-
async check(filePath, content) {
|
|
16
|
-
const violations = [];
|
|
17
|
-
// Find all function definitions
|
|
18
|
-
const functionPattern = /function\s+(\w+)\s*\([^)]*\)\s*\{/g;
|
|
19
|
-
let match;
|
|
20
|
-
while ((match = functionPattern.exec(content)) !== null) {
|
|
21
|
-
const functionName = match[1];
|
|
22
|
-
// Extract function body (simplified - finds next closing brace)
|
|
23
|
-
const startIndex = match.index + match[0].length;
|
|
24
|
-
const functionBody = this.extractFunctionBody(content, startIndex);
|
|
25
|
-
// Calculate cyclomatic complexity
|
|
26
|
-
const complexity = this.calculateComplexity(functionBody);
|
|
27
|
-
if (complexity > this.MAX_COMPLEXITY) {
|
|
28
|
-
const pos = this.getPosition(content, match.index);
|
|
29
|
-
violations.push(this.createViolation(filePath, pos.line, pos.column, `Function "${functionName}" has complexity of ${complexity}, exceeds maximum of ${this.MAX_COMPLEXITY}.`, 'Break down the function into smaller, focused functions', { complexity, limit: this.MAX_COMPLEXITY }));
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return violations;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Extract function body (simplified version)
|
|
36
|
-
*/
|
|
37
|
-
extractFunctionBody(content, startIndex) {
|
|
38
|
-
let braceCount = 1;
|
|
39
|
-
let endIndex = startIndex;
|
|
40
|
-
for (let i = startIndex; i < content.length && braceCount > 0; i++) {
|
|
41
|
-
if (content[i] === '{')
|
|
42
|
-
braceCount++;
|
|
43
|
-
if (content[i] === '}')
|
|
44
|
-
braceCount--;
|
|
45
|
-
endIndex = i;
|
|
46
|
-
}
|
|
47
|
-
return content.substring(startIndex, endIndex);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Calculate cyclomatic complexity
|
|
51
|
-
* Complexity = 1 + number of decision points (if, for, while, case, &&, ||, ?, catch)
|
|
52
|
-
*/
|
|
53
|
-
calculateComplexity(code) {
|
|
54
|
-
let complexity = 1;
|
|
55
|
-
// Count decision points
|
|
56
|
-
const decisionKeywords = [
|
|
57
|
-
/\bif\b/g,
|
|
58
|
-
/\belse\s+if\b/g,
|
|
59
|
-
/\bfor\b/g,
|
|
60
|
-
/\bwhile\b/g,
|
|
61
|
-
/\bcase\b/g,
|
|
62
|
-
/\bcatch\b/g,
|
|
63
|
-
/&&/g,
|
|
64
|
-
/\|\|/g,
|
|
65
|
-
/\?/g,
|
|
66
|
-
];
|
|
67
|
-
for (const pattern of decisionKeywords) {
|
|
68
|
-
const matches = code.match(pattern);
|
|
69
|
-
if (matches) {
|
|
70
|
-
complexity += matches.length;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return complexity;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=function-complexity.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"function-complexity.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/function-complexity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TypeScript Validation Rules
|
|
3
|
-
*
|
|
4
|
-
* Exports all TypeScript-specific validation rules
|
|
5
|
-
*/
|
|
6
|
-
export { NoAnyTypeRule } from './no-any-type.js';
|
|
7
|
-
export { PreferConstRule } from './prefer-const.js';
|
|
8
|
-
export { NoImplicitAnyRule } from './no-implicit-any.js';
|
|
9
|
-
export { ProperErrorHandlingRule } from './proper-error-handling.js';
|
|
10
|
-
export { ConsistentNamingRule } from './consistent-naming.js';
|
|
11
|
-
export { NoUnusedVarsRule } from './no-unused-vars.js';
|
|
12
|
-
export { FunctionComplexityRule } from './function-complexity.js';
|
|
13
|
-
export { MaxFileLengthRule } from './max-file-length.js';
|
|
14
|
-
export { NoMagicNumbersRule } from './no-magic-numbers.js';
|
|
15
|
-
export { PreferReadonlyRule } from './prefer-readonly.js';
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TypeScript Validation Rules
|
|
3
|
-
*
|
|
4
|
-
* Exports all TypeScript-specific validation rules
|
|
5
|
-
*/
|
|
6
|
-
export { NoAnyTypeRule } from './no-any-type.js';
|
|
7
|
-
export { PreferConstRule } from './prefer-const.js';
|
|
8
|
-
export { NoImplicitAnyRule } from './no-implicit-any.js';
|
|
9
|
-
export { ProperErrorHandlingRule } from './proper-error-handling.js';
|
|
10
|
-
export { ConsistentNamingRule } from './consistent-naming.js';
|
|
11
|
-
export { NoUnusedVarsRule } from './no-unused-vars.js';
|
|
12
|
-
export { FunctionComplexityRule } from './function-complexity.js';
|
|
13
|
-
export { MaxFileLengthRule } from './max-file-length.js';
|
|
14
|
-
export { NoMagicNumbersRule } from './no-magic-numbers.js';
|
|
15
|
-
export { PreferReadonlyRule } from './prefer-readonly.js';
|
|
16
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|