@nahisaho/musubix-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/musubix.js +18 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +27 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/auth/auth-manager.d.ts +320 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +580 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/cli/base.d.ts +58 -0
- package/dist/cli/base.d.ts.map +1 -0
- package/dist/cli/base.js +93 -0
- package/dist/cli/base.js.map +1 -0
- package/dist/cli/commands/help.d.ts +17 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +228 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/index.d.ts +14 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +25 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +38 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +258 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/codegen/coding-standards.d.ts +250 -0
- package/dist/codegen/coding-standards.d.ts.map +1 -0
- package/dist/codegen/coding-standards.js +976 -0
- package/dist/codegen/coding-standards.js.map +1 -0
- package/dist/codegen/coverage-reporter.d.ts +264 -0
- package/dist/codegen/coverage-reporter.d.ts.map +1 -0
- package/dist/codegen/coverage-reporter.js +697 -0
- package/dist/codegen/coverage-reporter.js.map +1 -0
- package/dist/codegen/dependency-analyzer.d.ts +271 -0
- package/dist/codegen/dependency-analyzer.d.ts.map +1 -0
- package/dist/codegen/dependency-analyzer.js +661 -0
- package/dist/codegen/dependency-analyzer.js.map +1 -0
- package/dist/codegen/generator.d.ts +275 -0
- package/dist/codegen/generator.d.ts.map +1 -0
- package/dist/codegen/generator.js +781 -0
- package/dist/codegen/generator.js.map +1 -0
- package/dist/codegen/index.d.ts +18 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +27 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/integration-test-generator.d.ts +312 -0
- package/dist/codegen/integration-test-generator.d.ts.map +1 -0
- package/dist/codegen/integration-test-generator.js +765 -0
- package/dist/codegen/integration-test-generator.js.map +1 -0
- package/dist/codegen/pattern-conformance.d.ts +309 -0
- package/dist/codegen/pattern-conformance.d.ts.map +1 -0
- package/dist/codegen/pattern-conformance.js +590 -0
- package/dist/codegen/pattern-conformance.js.map +1 -0
- package/dist/codegen/quality-metrics.d.ts +235 -0
- package/dist/codegen/quality-metrics.d.ts.map +1 -0
- package/dist/codegen/quality-metrics.js +439 -0
- package/dist/codegen/quality-metrics.js.map +1 -0
- package/dist/codegen/security-scanner.d.ts +179 -0
- package/dist/codegen/security-scanner.d.ts.map +1 -0
- package/dist/codegen/security-scanner.js +495 -0
- package/dist/codegen/security-scanner.js.map +1 -0
- package/dist/codegen/static-analyzer.d.ts +188 -0
- package/dist/codegen/static-analyzer.d.ts.map +1 -0
- package/dist/codegen/static-analyzer.js +490 -0
- package/dist/codegen/static-analyzer.js.map +1 -0
- package/dist/codegen/unit-test-generator.d.ts +289 -0
- package/dist/codegen/unit-test-generator.d.ts.map +1 -0
- package/dist/codegen/unit-test-generator.js +634 -0
- package/dist/codegen/unit-test-generator.js.map +1 -0
- package/dist/design/adr-generator.d.ts +227 -0
- package/dist/design/adr-generator.d.ts.map +1 -0
- package/dist/design/adr-generator.js +423 -0
- package/dist/design/adr-generator.js.map +1 -0
- package/dist/design/c4-generator.d.ts +267 -0
- package/dist/design/c4-generator.d.ts.map +1 -0
- package/dist/design/c4-generator.js +453 -0
- package/dist/design/c4-generator.js.map +1 -0
- package/dist/design/framework-optimizer.d.ts +190 -0
- package/dist/design/framework-optimizer.d.ts.map +1 -0
- package/dist/design/framework-optimizer.js +589 -0
- package/dist/design/framework-optimizer.js.map +1 -0
- package/dist/design/index.d.ts +12 -0
- package/dist/design/index.d.ts.map +1 -0
- package/dist/design/index.js +13 -0
- package/dist/design/index.js.map +1 -0
- package/dist/design/pattern-detector.d.ts +270 -0
- package/dist/design/pattern-detector.d.ts.map +1 -0
- package/dist/design/pattern-detector.js +621 -0
- package/dist/design/pattern-detector.js.map +1 -0
- package/dist/design/solid-validator.d.ts +188 -0
- package/dist/design/solid-validator.d.ts.map +1 -0
- package/dist/design/solid-validator.js +579 -0
- package/dist/design/solid-validator.js.map +1 -0
- package/dist/error/data-persistence.d.ts +311 -0
- package/dist/error/data-persistence.d.ts.map +1 -0
- package/dist/error/data-persistence.js +586 -0
- package/dist/error/data-persistence.js.map +1 -0
- package/dist/error/graceful-degradation.d.ts +309 -0
- package/dist/error/graceful-degradation.d.ts.map +1 -0
- package/dist/error/graceful-degradation.js +510 -0
- package/dist/error/graceful-degradation.js.map +1 -0
- package/dist/error/index.d.ts +11 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +19 -0
- package/dist/error/index.js.map +1 -0
- package/dist/explanation/explanation-generator.d.ts +228 -0
- package/dist/explanation/explanation-generator.d.ts.map +1 -0
- package/dist/explanation/explanation-generator.js +662 -0
- package/dist/explanation/explanation-generator.js.map +1 -0
- package/dist/explanation/index.d.ts +11 -0
- package/dist/explanation/index.d.ts.map +1 -0
- package/dist/explanation/index.js +19 -0
- package/dist/explanation/index.js.map +1 -0
- package/dist/explanation/reasoning-chain.d.ts +314 -0
- package/dist/explanation/reasoning-chain.d.ts.map +1 -0
- package/dist/explanation/reasoning-chain.js +414 -0
- package/dist/explanation/reasoning-chain.js.map +1 -0
- package/dist/explanation/visual-explanation.d.ts +315 -0
- package/dist/explanation/visual-explanation.d.ts.map +1 -0
- package/dist/explanation/visual-explanation.js +667 -0
- package/dist/explanation/visual-explanation.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/requirements/decomposer.d.ts +235 -0
- package/dist/requirements/decomposer.d.ts.map +1 -0
- package/dist/requirements/decomposer.js +587 -0
- package/dist/requirements/decomposer.js.map +1 -0
- package/dist/requirements/related-finder.d.ts +261 -0
- package/dist/requirements/related-finder.d.ts.map +1 -0
- package/dist/requirements/related-finder.js +629 -0
- package/dist/requirements/related-finder.js.map +1 -0
- package/dist/traceability/impact.d.ts +196 -0
- package/dist/traceability/impact.d.ts.map +1 -0
- package/dist/traceability/impact.js +438 -0
- package/dist/traceability/impact.js.map +1 -0
- package/dist/traceability/index.d.ts +9 -0
- package/dist/traceability/index.d.ts.map +1 -0
- package/dist/traceability/index.js +10 -0
- package/dist/traceability/index.js.map +1 -0
- package/dist/traceability/manager.d.ts +266 -0
- package/dist/traceability/manager.d.ts.map +1 -0
- package/dist/traceability/manager.js +412 -0
- package/dist/traceability/manager.js.map +1 -0
- package/dist/types/common.d.ts +294 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +15 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/ears.d.ts +158 -0
- package/dist/types/ears.d.ts.map +1 -0
- package/dist/types/ears.js +33 -0
- package/dist/types/ears.js.map +1 -0
- package/dist/types/errors.d.ts +176 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +55 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/data-protector.d.ts +122 -0
- package/dist/utils/data-protector.d.ts.map +1 -0
- package/dist/utils/data-protector.js +275 -0
- package/dist/utils/data-protector.js.map +1 -0
- package/dist/utils/error-handler.d.ts +101 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +324 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/i18n-manager.d.ts +259 -0
- package/dist/utils/i18n-manager.d.ts.map +1 -0
- package/dist/utils/i18n-manager.js +554 -0
- package/dist/utils/i18n-manager.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +120 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +237 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/performance-profiler.d.ts +251 -0
- package/dist/utils/performance-profiler.d.ts.map +1 -0
- package/dist/utils/performance-profiler.js +458 -0
- package/dist/utils/performance-profiler.js.map +1 -0
- package/dist/utils/scalability-optimizer.d.ts +294 -0
- package/dist/utils/scalability-optimizer.d.ts.map +1 -0
- package/dist/utils/scalability-optimizer.js +606 -0
- package/dist/utils/scalability-optimizer.js.map +1 -0
- package/dist/utils/structured-logger.d.ts +294 -0
- package/dist/utils/structured-logger.d.ts.map +1 -0
- package/dist/utils/structured-logger.js +630 -0
- package/dist/utils/structured-logger.js.map +1 -0
- package/dist/utils/version-compatibility.d.ts +217 -0
- package/dist/utils/version-compatibility.d.ts.map +1 -0
- package/dist/utils/version-compatibility.js +443 -0
- package/dist/utils/version-compatibility.js.map +1 -0
- package/dist/validators/ears-validator.d.ts +182 -0
- package/dist/validators/ears-validator.d.ts.map +1 -0
- package/dist/validators/ears-validator.js +357 -0
- package/dist/validators/ears-validator.js.map +1 -0
- package/dist/validators/index.d.ts +8 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +9 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOLID Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates code against SOLID principles
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module design/solid-validator
|
|
8
|
+
*
|
|
9
|
+
* @see REQ-DES-003 - SOLID Principles Validation
|
|
10
|
+
* @see Article III - Design Validation
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* SOLID principles information
|
|
14
|
+
*/
|
|
15
|
+
export const SOLID_PRINCIPLES = {
|
|
16
|
+
S: {
|
|
17
|
+
code: 'S',
|
|
18
|
+
name: 'Single Responsibility Principle',
|
|
19
|
+
description: 'A class should have only one reason to change',
|
|
20
|
+
violationIndicators: [
|
|
21
|
+
'Too many methods',
|
|
22
|
+
'Methods with unrelated purposes',
|
|
23
|
+
'Multiple domains handled',
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
O: {
|
|
27
|
+
code: 'O',
|
|
28
|
+
name: 'Open/Closed Principle',
|
|
29
|
+
description: 'Open for extension, closed for modification',
|
|
30
|
+
violationIndicators: [
|
|
31
|
+
'Switch statements on type',
|
|
32
|
+
'If-else chains for types',
|
|
33
|
+
'Concrete class dependencies',
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
L: {
|
|
37
|
+
code: 'L',
|
|
38
|
+
name: 'Liskov Substitution Principle',
|
|
39
|
+
description: 'Subtypes must be substitutable for base types',
|
|
40
|
+
violationIndicators: [
|
|
41
|
+
'Override that changes behavior',
|
|
42
|
+
'Throwing unexpected exceptions',
|
|
43
|
+
'Empty implementations',
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
I: {
|
|
47
|
+
code: 'I',
|
|
48
|
+
name: 'Interface Segregation Principle',
|
|
49
|
+
description: 'Clients should not depend on unused methods',
|
|
50
|
+
violationIndicators: [
|
|
51
|
+
'Large interfaces',
|
|
52
|
+
'Partial implementations',
|
|
53
|
+
'Unused method implementations',
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
D: {
|
|
57
|
+
code: 'D',
|
|
58
|
+
name: 'Dependency Inversion Principle',
|
|
59
|
+
description: 'Depend on abstractions, not concretions',
|
|
60
|
+
violationIndicators: [
|
|
61
|
+
'Direct concrete instantiation',
|
|
62
|
+
'Importing concrete classes',
|
|
63
|
+
'No interface/abstract usage',
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Default configuration
|
|
69
|
+
*/
|
|
70
|
+
export const DEFAULT_SOLID_CONFIG = {
|
|
71
|
+
srpMethodThreshold: 10,
|
|
72
|
+
ispMethodThreshold: 5,
|
|
73
|
+
strictMode: false,
|
|
74
|
+
enabledPrinciples: ['S', 'O', 'L', 'I', 'D'],
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* SOLID Validator
|
|
78
|
+
*/
|
|
79
|
+
export class SOLIDValidator {
|
|
80
|
+
config;
|
|
81
|
+
constructor(config) {
|
|
82
|
+
this.config = { ...DEFAULT_SOLID_CONFIG, ...config };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Validate code structure against SOLID
|
|
86
|
+
*/
|
|
87
|
+
validate(structure) {
|
|
88
|
+
const violations = [];
|
|
89
|
+
const principleScores = {
|
|
90
|
+
S: 100, O: 100, L: 100, I: 100, D: 100,
|
|
91
|
+
};
|
|
92
|
+
// Validate each enabled principle
|
|
93
|
+
if (this.config.enabledPrinciples.includes('S')) {
|
|
94
|
+
const srpViolations = this.validateSRP(structure);
|
|
95
|
+
violations.push(...srpViolations);
|
|
96
|
+
principleScores.S = this.calculateScore(srpViolations, structure.classes.length);
|
|
97
|
+
}
|
|
98
|
+
if (this.config.enabledPrinciples.includes('O')) {
|
|
99
|
+
const ocpViolations = this.validateOCP(structure);
|
|
100
|
+
violations.push(...ocpViolations);
|
|
101
|
+
principleScores.O = this.calculateScore(ocpViolations, structure.classes.length);
|
|
102
|
+
}
|
|
103
|
+
if (this.config.enabledPrinciples.includes('L')) {
|
|
104
|
+
const lspViolations = this.validateLSP(structure);
|
|
105
|
+
violations.push(...lspViolations);
|
|
106
|
+
principleScores.L = this.calculateScore(lspViolations, structure.classes.length);
|
|
107
|
+
}
|
|
108
|
+
if (this.config.enabledPrinciples.includes('I')) {
|
|
109
|
+
const ispViolations = this.validateISP(structure);
|
|
110
|
+
violations.push(...ispViolations);
|
|
111
|
+
principleScores.I = this.calculateScore(ispViolations, structure.classes.length);
|
|
112
|
+
}
|
|
113
|
+
if (this.config.enabledPrinciples.includes('D')) {
|
|
114
|
+
const dipViolations = this.validateDIP(structure);
|
|
115
|
+
violations.push(...dipViolations);
|
|
116
|
+
principleScores.D = this.calculateScore(dipViolations, structure.classes.length);
|
|
117
|
+
}
|
|
118
|
+
// Calculate overall score
|
|
119
|
+
const enabledCount = this.config.enabledPrinciples.length;
|
|
120
|
+
const overallScore = enabledCount > 0
|
|
121
|
+
? this.config.enabledPrinciples.reduce((sum, p) => sum + principleScores[p], 0) / enabledCount
|
|
122
|
+
: 100;
|
|
123
|
+
// Generate recommendations
|
|
124
|
+
const recommendations = this.generateRecommendations(violations, principleScores);
|
|
125
|
+
// Generate summary
|
|
126
|
+
const summary = this.generateSummary(structure, violations);
|
|
127
|
+
return {
|
|
128
|
+
score: Math.round(overallScore),
|
|
129
|
+
principleScores,
|
|
130
|
+
violations,
|
|
131
|
+
recommendations,
|
|
132
|
+
summary,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Validate source code string
|
|
137
|
+
*/
|
|
138
|
+
validateCode(code) {
|
|
139
|
+
const structure = this.parseCodeStructure(code);
|
|
140
|
+
return this.validate(structure);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Validate Single Responsibility Principle
|
|
144
|
+
*/
|
|
145
|
+
validateSRP(structure) {
|
|
146
|
+
const violations = [];
|
|
147
|
+
for (const cls of structure.classes) {
|
|
148
|
+
if (cls.isInterface)
|
|
149
|
+
continue;
|
|
150
|
+
// Check method count
|
|
151
|
+
if (cls.methods.length > this.config.srpMethodThreshold) {
|
|
152
|
+
violations.push({
|
|
153
|
+
principle: 'S',
|
|
154
|
+
severity: 'high',
|
|
155
|
+
element: cls.name,
|
|
156
|
+
description: `Class has ${cls.methods.length} methods (threshold: ${this.config.srpMethodThreshold})`,
|
|
157
|
+
suggestion: 'Consider extracting related methods into separate classes',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// Check for god class indicators
|
|
161
|
+
const godClassIndicators = this.detectGodClassIndicators(cls);
|
|
162
|
+
if (godClassIndicators.length > 2) {
|
|
163
|
+
violations.push({
|
|
164
|
+
principle: 'S',
|
|
165
|
+
severity: 'medium',
|
|
166
|
+
element: cls.name,
|
|
167
|
+
description: `Class appears to handle multiple responsibilities: ${godClassIndicators.join(', ')}`,
|
|
168
|
+
suggestion: 'Split into smaller, focused classes',
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return violations;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Validate Open/Closed Principle
|
|
176
|
+
*/
|
|
177
|
+
validateOCP(structure) {
|
|
178
|
+
const violations = [];
|
|
179
|
+
for (const cls of structure.classes) {
|
|
180
|
+
if (cls.isInterface || cls.isAbstract)
|
|
181
|
+
continue;
|
|
182
|
+
// Check for type-checking patterns (suggests OCP violation)
|
|
183
|
+
for (const method of cls.methods) {
|
|
184
|
+
if (this.suggestsTypeChecking(method)) {
|
|
185
|
+
violations.push({
|
|
186
|
+
principle: 'O',
|
|
187
|
+
severity: 'medium',
|
|
188
|
+
element: `${cls.name}.${method}`,
|
|
189
|
+
description: 'Method name suggests type-checking logic',
|
|
190
|
+
suggestion: 'Consider using polymorphism instead of type checks',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Check if class could benefit from abstraction
|
|
195
|
+
if (!cls.isAbstract && !cls.implements.length && cls.methods.length > 3) {
|
|
196
|
+
const hasVariantMethods = cls.methods.some((m) => m.includes('type') || m.includes('kind') || m.includes('mode'));
|
|
197
|
+
if (hasVariantMethods) {
|
|
198
|
+
violations.push({
|
|
199
|
+
principle: 'O',
|
|
200
|
+
severity: 'low',
|
|
201
|
+
element: cls.name,
|
|
202
|
+
description: 'Class might benefit from strategy pattern',
|
|
203
|
+
suggestion: 'Extract variant behavior into strategy classes',
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return violations;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Validate Liskov Substitution Principle
|
|
212
|
+
*/
|
|
213
|
+
validateLSP(structure) {
|
|
214
|
+
const violations = [];
|
|
215
|
+
// Build inheritance hierarchy
|
|
216
|
+
const hierarchy = this.buildHierarchy(structure);
|
|
217
|
+
for (const [child, parent] of hierarchy) {
|
|
218
|
+
const childClass = structure.classes.find((c) => c.name === child);
|
|
219
|
+
const parentClass = structure.classes.find((c) => c.name === parent);
|
|
220
|
+
if (!childClass || !parentClass)
|
|
221
|
+
continue;
|
|
222
|
+
// Check for empty/noop implementations
|
|
223
|
+
const parentMethods = new Set(parentClass.methods);
|
|
224
|
+
for (const method of childClass.methods) {
|
|
225
|
+
if (parentMethods.has(method)) {
|
|
226
|
+
// Check for potential violation indicators in method names
|
|
227
|
+
if (method.startsWith('throw') || method.includes('NotSupported')) {
|
|
228
|
+
violations.push({
|
|
229
|
+
principle: 'L',
|
|
230
|
+
severity: 'high',
|
|
231
|
+
element: `${child}.${method}`,
|
|
232
|
+
description: 'Method might throw or be unsupported, violating substitutability',
|
|
233
|
+
suggestion: 'Ensure subclass can fully substitute parent class',
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Check if child removes parent functionality
|
|
239
|
+
if (childClass.methods.length < parentClass.methods.length / 2) {
|
|
240
|
+
violations.push({
|
|
241
|
+
principle: 'L',
|
|
242
|
+
severity: 'medium',
|
|
243
|
+
element: child,
|
|
244
|
+
description: 'Subclass has significantly fewer methods than parent',
|
|
245
|
+
suggestion: 'Verify that inheritance is appropriate here',
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return violations;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Validate Interface Segregation Principle
|
|
253
|
+
*/
|
|
254
|
+
validateISP(structure) {
|
|
255
|
+
const violations = [];
|
|
256
|
+
for (const cls of structure.classes) {
|
|
257
|
+
if (!cls.isInterface)
|
|
258
|
+
continue;
|
|
259
|
+
// Check interface size
|
|
260
|
+
if (cls.methods.length > this.config.ispMethodThreshold) {
|
|
261
|
+
violations.push({
|
|
262
|
+
principle: 'I',
|
|
263
|
+
severity: 'medium',
|
|
264
|
+
element: cls.name,
|
|
265
|
+
description: `Interface has ${cls.methods.length} methods (threshold: ${this.config.ispMethodThreshold})`,
|
|
266
|
+
suggestion: 'Consider splitting into smaller, focused interfaces',
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
// Check for unrelated method groups
|
|
270
|
+
const methodGroups = this.groupMethodsByPurpose(cls.methods);
|
|
271
|
+
if (methodGroups.size > 2) {
|
|
272
|
+
violations.push({
|
|
273
|
+
principle: 'I',
|
|
274
|
+
severity: 'low',
|
|
275
|
+
element: cls.name,
|
|
276
|
+
description: `Interface appears to have ${methodGroups.size} distinct method groups`,
|
|
277
|
+
suggestion: 'Split into multiple focused interfaces',
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Check for fat interface implementations
|
|
282
|
+
for (const cls of structure.classes) {
|
|
283
|
+
if (cls.isInterface)
|
|
284
|
+
continue;
|
|
285
|
+
for (const impl of cls.implements) {
|
|
286
|
+
const iface = structure.classes.find((c) => c.name === impl && c.isInterface);
|
|
287
|
+
if (iface && iface.methods.length > this.config.ispMethodThreshold * 2) {
|
|
288
|
+
violations.push({
|
|
289
|
+
principle: 'I',
|
|
290
|
+
severity: 'medium',
|
|
291
|
+
element: cls.name,
|
|
292
|
+
description: `Implements large interface ${impl} (${iface.methods.length} methods)`,
|
|
293
|
+
suggestion: 'Verify all interface methods are needed',
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return violations;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Validate Dependency Inversion Principle
|
|
302
|
+
*/
|
|
303
|
+
validateDIP(structure) {
|
|
304
|
+
const violations = [];
|
|
305
|
+
// Get all interfaces/abstracts
|
|
306
|
+
const abstractions = new Set(structure.classes
|
|
307
|
+
.filter((c) => c.isInterface || c.isAbstract)
|
|
308
|
+
.map((c) => c.name));
|
|
309
|
+
for (const cls of structure.classes) {
|
|
310
|
+
if (cls.isInterface || cls.isAbstract)
|
|
311
|
+
continue;
|
|
312
|
+
// Check if high-level class depends on concretions
|
|
313
|
+
const isHighLevel = cls.name.includes('Manager') ||
|
|
314
|
+
cls.name.includes('Service') ||
|
|
315
|
+
cls.name.includes('Controller') ||
|
|
316
|
+
cls.name.includes('Handler');
|
|
317
|
+
if (isHighLevel) {
|
|
318
|
+
// Check relationships for concrete dependencies
|
|
319
|
+
const dependencies = structure.relationships
|
|
320
|
+
.filter((r) => r.source === cls.name && r.type === 'dependency');
|
|
321
|
+
for (const dep of dependencies) {
|
|
322
|
+
if (!abstractions.has(dep.target)) {
|
|
323
|
+
// Might be depending on concrete class
|
|
324
|
+
const targetClass = structure.classes.find((c) => c.name === dep.target);
|
|
325
|
+
if (targetClass && !targetClass.isInterface && !targetClass.isAbstract) {
|
|
326
|
+
violations.push({
|
|
327
|
+
principle: 'D',
|
|
328
|
+
severity: 'medium',
|
|
329
|
+
element: cls.name,
|
|
330
|
+
description: `High-level class depends on concrete ${dep.target}`,
|
|
331
|
+
suggestion: `Depend on an abstraction (interface) instead of ${dep.target}`,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// Check if using constructor injection
|
|
337
|
+
const usesInjection = cls.methods.some((m) => m.includes('inject') || m === 'constructor') && cls.implements.length > 0;
|
|
338
|
+
if (!usesInjection && dependencies.length > 0) {
|
|
339
|
+
violations.push({
|
|
340
|
+
principle: 'D',
|
|
341
|
+
severity: 'low',
|
|
342
|
+
element: cls.name,
|
|
343
|
+
description: 'Consider using dependency injection',
|
|
344
|
+
suggestion: 'Inject dependencies through constructor',
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return violations;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Detect god class indicators
|
|
353
|
+
*/
|
|
354
|
+
detectGodClassIndicators(cls) {
|
|
355
|
+
const indicators = [];
|
|
356
|
+
const methodPrefixes = new Map();
|
|
357
|
+
for (const method of cls.methods) {
|
|
358
|
+
// Extract prefix (e.g., "get", "set", "handle", "process")
|
|
359
|
+
const match = method.match(/^([a-z]+)/i);
|
|
360
|
+
if (match) {
|
|
361
|
+
const prefix = match[1].toLowerCase();
|
|
362
|
+
methodPrefixes.set(prefix, (methodPrefixes.get(prefix) ?? 0) + 1);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Different responsibility indicators
|
|
366
|
+
const responsibilityPrefixes = ['handle', 'process', 'calculate', 'validate', 'render', 'save', 'load', 'send'];
|
|
367
|
+
for (const prefix of responsibilityPrefixes) {
|
|
368
|
+
if ((methodPrefixes.get(prefix) ?? 0) >= 2) {
|
|
369
|
+
indicators.push(`${prefix}*`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return indicators;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Check if method name suggests type checking
|
|
376
|
+
*/
|
|
377
|
+
suggestsTypeChecking(methodName) {
|
|
378
|
+
const patterns = [
|
|
379
|
+
/^handle\w+Type$/i,
|
|
380
|
+
/^process\w+Kind$/i,
|
|
381
|
+
/^by(Type|Kind|Mode)$/i,
|
|
382
|
+
];
|
|
383
|
+
return patterns.some((p) => p.test(methodName));
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Build inheritance hierarchy
|
|
387
|
+
*/
|
|
388
|
+
buildHierarchy(structure) {
|
|
389
|
+
const hierarchy = new Map();
|
|
390
|
+
for (const cls of structure.classes) {
|
|
391
|
+
if (cls.extends) {
|
|
392
|
+
hierarchy.set(cls.name, cls.extends);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return hierarchy;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Group methods by purpose
|
|
399
|
+
*/
|
|
400
|
+
groupMethodsByPurpose(methods) {
|
|
401
|
+
const groups = new Map();
|
|
402
|
+
for (const method of methods) {
|
|
403
|
+
// Simple grouping by prefix
|
|
404
|
+
const match = method.match(/^([a-z]+)/i);
|
|
405
|
+
const prefix = match ? match[1].toLowerCase() : 'other';
|
|
406
|
+
if (!groups.has(prefix)) {
|
|
407
|
+
groups.set(prefix, []);
|
|
408
|
+
}
|
|
409
|
+
groups.get(prefix).push(method);
|
|
410
|
+
}
|
|
411
|
+
return groups;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Calculate score from violations
|
|
415
|
+
*/
|
|
416
|
+
calculateScore(violations, classCount) {
|
|
417
|
+
if (classCount === 0)
|
|
418
|
+
return 100;
|
|
419
|
+
const penaltyMap = { high: 20, medium: 10, low: 5 };
|
|
420
|
+
const totalPenalty = violations.reduce((sum, v) => sum + penaltyMap[v.severity], 0);
|
|
421
|
+
const maxPenalty = classCount * 30;
|
|
422
|
+
const penalty = Math.min(totalPenalty, maxPenalty);
|
|
423
|
+
return Math.max(0, Math.round(100 - (penalty / maxPenalty) * 100));
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Generate recommendations
|
|
427
|
+
*/
|
|
428
|
+
generateRecommendations(violations, scores) {
|
|
429
|
+
const recommendations = [];
|
|
430
|
+
// Prioritize lowest scores
|
|
431
|
+
const sortedPrinciples = Object.keys(scores)
|
|
432
|
+
.sort((a, b) => scores[a] - scores[b]);
|
|
433
|
+
for (const principle of sortedPrinciples.slice(0, 2)) {
|
|
434
|
+
if (scores[principle] < 70) {
|
|
435
|
+
const info = SOLID_PRINCIPLES[principle];
|
|
436
|
+
recommendations.push(`Focus on ${info.name} (${principle}): ${info.description}`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
// Add specific recommendations for high-severity violations
|
|
440
|
+
const highViolations = violations.filter((v) => v.severity === 'high');
|
|
441
|
+
for (const v of highViolations.slice(0, 3)) {
|
|
442
|
+
recommendations.push(`Fix ${v.element}: ${v.suggestion}`);
|
|
443
|
+
}
|
|
444
|
+
if (recommendations.length === 0) {
|
|
445
|
+
recommendations.push('Good SOLID compliance! Continue following best practices.');
|
|
446
|
+
}
|
|
447
|
+
return recommendations;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Generate summary
|
|
451
|
+
*/
|
|
452
|
+
generateSummary(structure, violations) {
|
|
453
|
+
const classesAnalyzed = structure.classes.filter((c) => !c.isInterface).length;
|
|
454
|
+
const classesWithViolations = new Set(violations.map((v) => v.element.split('.')[0])).size;
|
|
455
|
+
const violationsByPrinciple = {
|
|
456
|
+
S: 0, O: 0, L: 0, I: 0, D: 0,
|
|
457
|
+
};
|
|
458
|
+
for (const v of violations) {
|
|
459
|
+
violationsByPrinciple[v.principle]++;
|
|
460
|
+
}
|
|
461
|
+
const violationRatio = classesAnalyzed > 0
|
|
462
|
+
? classesWithViolations / classesAnalyzed
|
|
463
|
+
: 0;
|
|
464
|
+
let complianceLevel;
|
|
465
|
+
if (violationRatio < 0.1)
|
|
466
|
+
complianceLevel = 'excellent';
|
|
467
|
+
else if (violationRatio < 0.3)
|
|
468
|
+
complianceLevel = 'good';
|
|
469
|
+
else if (violationRatio < 0.5)
|
|
470
|
+
complianceLevel = 'moderate';
|
|
471
|
+
else
|
|
472
|
+
complianceLevel = 'poor';
|
|
473
|
+
return {
|
|
474
|
+
classesAnalyzed,
|
|
475
|
+
classesWithViolations,
|
|
476
|
+
totalViolations: violations.length,
|
|
477
|
+
violationsByPrinciple,
|
|
478
|
+
complianceLevel,
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Parse code into structure (simplified)
|
|
483
|
+
*/
|
|
484
|
+
parseCodeStructure(code) {
|
|
485
|
+
const classes = [];
|
|
486
|
+
const relationships = [];
|
|
487
|
+
// Simple regex-based parsing
|
|
488
|
+
const classRegex = /(?:export\s+)?(?:abstract\s+)?(class|interface)\s+(\w+)(?:\s+extends\s+(\w+))?(?:\s+implements\s+([^{]+))?/g;
|
|
489
|
+
let match;
|
|
490
|
+
while ((match = classRegex.exec(code)) !== null) {
|
|
491
|
+
const isInterface = match[1] === 'interface';
|
|
492
|
+
const isAbstract = code.substring(Math.max(0, match.index - 20), match.index).includes('abstract');
|
|
493
|
+
const methods = this.extractMethods(code, match[2]);
|
|
494
|
+
const properties = this.extractProperties(code, match[2]);
|
|
495
|
+
classes.push({
|
|
496
|
+
name: match[2],
|
|
497
|
+
isInterface,
|
|
498
|
+
isAbstract,
|
|
499
|
+
methods,
|
|
500
|
+
properties,
|
|
501
|
+
extends: match[3],
|
|
502
|
+
implements: match[4] ? match[4].split(',').map((s) => s.trim()) : [],
|
|
503
|
+
});
|
|
504
|
+
if (match[3]) {
|
|
505
|
+
relationships.push({
|
|
506
|
+
source: match[2],
|
|
507
|
+
target: match[3],
|
|
508
|
+
type: 'inheritance',
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
return { classes, functions: [], relationships };
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Extract methods
|
|
516
|
+
*/
|
|
517
|
+
extractMethods(code, className) {
|
|
518
|
+
const methods = [];
|
|
519
|
+
const classStart = code.indexOf(`class ${className}`) || code.indexOf(`interface ${className}`);
|
|
520
|
+
if (classStart === -1)
|
|
521
|
+
return methods;
|
|
522
|
+
let braceCount = 0;
|
|
523
|
+
let classEnd = classStart;
|
|
524
|
+
for (let i = classStart; i < code.length; i++) {
|
|
525
|
+
if (code[i] === '{')
|
|
526
|
+
braceCount++;
|
|
527
|
+
if (code[i] === '}')
|
|
528
|
+
braceCount--;
|
|
529
|
+
if (braceCount === 0 && code[i] === '}') {
|
|
530
|
+
classEnd = i;
|
|
531
|
+
break;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
const classBody = code.substring(classStart, classEnd);
|
|
535
|
+
const methodRegex = /(?:public|private|protected|static|async)?\s*(\w+)\s*\([^)]*\)/g;
|
|
536
|
+
let match;
|
|
537
|
+
while ((match = methodRegex.exec(classBody)) !== null) {
|
|
538
|
+
if (!['constructor', 'if', 'for', 'while', 'switch'].includes(match[1])) {
|
|
539
|
+
methods.push(match[1]);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
return methods;
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Extract properties
|
|
546
|
+
*/
|
|
547
|
+
extractProperties(code, className) {
|
|
548
|
+
const properties = [];
|
|
549
|
+
const classStart = code.indexOf(`class ${className}`);
|
|
550
|
+
if (classStart === -1)
|
|
551
|
+
return properties;
|
|
552
|
+
const classBody = code.substring(classStart, classStart + 1000);
|
|
553
|
+
const propRegex = /(?:public|private|protected|static|readonly)?\s+(\w+)\s*[;:=]/g;
|
|
554
|
+
let match;
|
|
555
|
+
while ((match = propRegex.exec(classBody)) !== null) {
|
|
556
|
+
properties.push(match[1]);
|
|
557
|
+
}
|
|
558
|
+
return properties;
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Get principle information
|
|
562
|
+
*/
|
|
563
|
+
static getPrincipleInfo(principle) {
|
|
564
|
+
return SOLID_PRINCIPLES[principle];
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Get all principles
|
|
568
|
+
*/
|
|
569
|
+
static getAllPrinciples() {
|
|
570
|
+
return Object.values(SOLID_PRINCIPLES);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Create SOLID validator instance
|
|
575
|
+
*/
|
|
576
|
+
export function createSOLIDValidator(config) {
|
|
577
|
+
return new SOLIDValidator(config);
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=solid-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solid-validator.js","sourceRoot":"","sources":["../../src/design/solid-validator.ts"],"names":[],"mappings":"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"}
|