@dinyangetoh/codeplug-cli 0.1.3 → 0.1.5

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 (163) hide show
  1. package/README.md +149 -187
  2. package/dist/cli/commands/convention.d.ts +1 -1
  3. package/dist/cli/commands/convention.d.ts.map +1 -1
  4. package/dist/cli/commands/convention.js +174 -31
  5. package/dist/cli/commands/convention.js.map +1 -1
  6. package/dist/cli/commands/docs.d.ts.map +1 -1
  7. package/dist/cli/commands/docs.js +9 -2
  8. package/dist/cli/commands/docs.js.map +1 -1
  9. package/dist/cli/commands/export.d.ts.map +1 -1
  10. package/dist/cli/commands/export.js +6 -1
  11. package/dist/cli/commands/export.js.map +1 -1
  12. package/dist/cli/commands/start.d.ts +2 -0
  13. package/dist/cli/commands/start.d.ts.map +1 -0
  14. package/dist/cli/commands/start.js +172 -0
  15. package/dist/cli/commands/start.js.map +1 -0
  16. package/dist/cli/index.js +9 -2
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/config/ConfigManager.d.ts +18 -0
  19. package/dist/config/ConfigManager.d.ts.map +1 -1
  20. package/dist/config/ConfigManager.js +55 -2
  21. package/dist/config/ConfigManager.js.map +1 -1
  22. package/dist/config/ConventionSchema.d.ts +59 -0
  23. package/dist/config/ConventionSchema.d.ts.map +1 -1
  24. package/dist/config/ConventionSchema.js +11 -0
  25. package/dist/config/ConventionSchema.js.map +1 -1
  26. package/dist/config/defaults.d.ts +60 -2
  27. package/dist/config/defaults.d.ts.map +1 -1
  28. package/dist/config/defaults.js +136 -20
  29. package/dist/config/defaults.js.map +1 -1
  30. package/dist/config/types.d.ts +71 -0
  31. package/dist/config/types.d.ts.map +1 -1
  32. package/dist/core/analyzer/AstAnalyzer.d.ts +11 -2
  33. package/dist/core/analyzer/AstAnalyzer.d.ts.map +1 -1
  34. package/dist/core/analyzer/AstAnalyzer.js +21 -5
  35. package/dist/core/analyzer/AstAnalyzer.js.map +1 -1
  36. package/dist/core/analyzer/ConventionDetector.d.ts +12 -1
  37. package/dist/core/analyzer/ConventionDetector.d.ts.map +1 -1
  38. package/dist/core/analyzer/ConventionDetector.js +120 -20
  39. package/dist/core/analyzer/ConventionDetector.js.map +1 -1
  40. package/dist/core/analyzer/ConventionMlResolver.d.ts +4 -0
  41. package/dist/core/analyzer/ConventionMlResolver.d.ts.map +1 -0
  42. package/dist/core/analyzer/ConventionMlResolver.js +17 -0
  43. package/dist/core/analyzer/ConventionMlResolver.js.map +1 -0
  44. package/dist/core/analyzer/PatternAggregator.d.ts +11 -2
  45. package/dist/core/analyzer/PatternAggregator.d.ts.map +1 -1
  46. package/dist/core/analyzer/PatternAggregator.js +87 -15
  47. package/dist/core/analyzer/PatternAggregator.js.map +1 -1
  48. package/dist/core/analyzer/SemanticCoherencePhase.d.ts +10 -0
  49. package/dist/core/analyzer/SemanticCoherencePhase.d.ts.map +1 -0
  50. package/dist/core/analyzer/SemanticCoherencePhase.js +191 -0
  51. package/dist/core/analyzer/SemanticCoherencePhase.js.map +1 -0
  52. package/dist/core/analyzer/SemanticCoherenceService.d.ts +11 -0
  53. package/dist/core/analyzer/SemanticCoherenceService.d.ts.map +1 -0
  54. package/dist/core/analyzer/SemanticCoherenceService.js +56 -0
  55. package/dist/core/analyzer/SemanticCoherenceService.js.map +1 -0
  56. package/dist/core/analyzer/visitors/ComponentVisitor.d.ts.map +1 -1
  57. package/dist/core/analyzer/visitors/ComponentVisitor.js +2 -2
  58. package/dist/core/analyzer/visitors/ComponentVisitor.js.map +1 -1
  59. package/dist/core/analyzer/visitors/ErrorHandlingVisitor.d.ts.map +1 -1
  60. package/dist/core/analyzer/visitors/ErrorHandlingVisitor.js +2 -2
  61. package/dist/core/analyzer/visitors/ErrorHandlingVisitor.js.map +1 -1
  62. package/dist/core/analyzer/visitors/ImportVisitor.d.ts +5 -0
  63. package/dist/core/analyzer/visitors/ImportVisitor.d.ts.map +1 -1
  64. package/dist/core/analyzer/visitors/ImportVisitor.js +8 -3
  65. package/dist/core/analyzer/visitors/ImportVisitor.js.map +1 -1
  66. package/dist/core/analyzer/visitors/NamingVisitor.d.ts +20 -2
  67. package/dist/core/analyzer/visitors/NamingVisitor.d.ts.map +1 -1
  68. package/dist/core/analyzer/visitors/NamingVisitor.js +464 -25
  69. package/dist/core/analyzer/visitors/NamingVisitor.js.map +1 -1
  70. package/dist/core/analyzer/visitors/SchemaVisitor.d.ts +7 -0
  71. package/dist/core/analyzer/visitors/SchemaVisitor.d.ts.map +1 -0
  72. package/dist/core/analyzer/visitors/SchemaVisitor.js +50 -0
  73. package/dist/core/analyzer/visitors/SchemaVisitor.js.map +1 -0
  74. package/dist/core/analyzer/visitors/StructureVisitor.d.ts +4 -1
  75. package/dist/core/analyzer/visitors/StructureVisitor.d.ts.map +1 -1
  76. package/dist/core/analyzer/visitors/StructureVisitor.js +38 -4
  77. package/dist/core/analyzer/visitors/StructureVisitor.js.map +1 -1
  78. package/dist/core/analyzer/visitors/types.d.ts +4 -0
  79. package/dist/core/analyzer/visitors/types.d.ts.map +1 -1
  80. package/dist/core/classifier/CodeBertEmbedder.d.ts +9 -0
  81. package/dist/core/classifier/CodeBertEmbedder.d.ts.map +1 -0
  82. package/dist/core/classifier/CodeBertEmbedder.js +33 -0
  83. package/dist/core/classifier/CodeBertEmbedder.js.map +1 -0
  84. package/dist/core/classifier/ConfidenceGate.d.ts +2 -0
  85. package/dist/core/classifier/ConfidenceGate.d.ts.map +1 -1
  86. package/dist/core/classifier/ConfidenceGate.js +6 -2
  87. package/dist/core/classifier/ConfidenceGate.js.map +1 -1
  88. package/dist/core/exporter/FreshnessChecker.d.ts +5 -1
  89. package/dist/core/exporter/FreshnessChecker.d.ts.map +1 -1
  90. package/dist/core/exporter/FreshnessChecker.js +5 -10
  91. package/dist/core/exporter/FreshnessChecker.js.map +1 -1
  92. package/dist/core/generator/DocGenerator.d.ts +6 -1
  93. package/dist/core/generator/DocGenerator.d.ts.map +1 -1
  94. package/dist/core/generator/DocGenerator.js +34 -7
  95. package/dist/core/generator/DocGenerator.js.map +1 -1
  96. package/dist/core/generator/StalenessTracker.d.ts +7 -1
  97. package/dist/core/generator/StalenessTracker.d.ts.map +1 -1
  98. package/dist/core/generator/StalenessTracker.js +12 -12
  99. package/dist/core/generator/StalenessTracker.js.map +1 -1
  100. package/dist/core/generator/documents/ArchitectureGenerator.d.ts +1 -0
  101. package/dist/core/generator/documents/ArchitectureGenerator.d.ts.map +1 -1
  102. package/dist/core/generator/documents/ArchitectureGenerator.js +34 -16
  103. package/dist/core/generator/documents/ArchitectureGenerator.js.map +1 -1
  104. package/dist/core/generator/documents/ContributingGenerator.d.ts.map +1 -1
  105. package/dist/core/generator/documents/ContributingGenerator.js +10 -9
  106. package/dist/core/generator/documents/ContributingGenerator.js.map +1 -1
  107. package/dist/core/generator/documents/ConventionsGenerator.d.ts.map +1 -1
  108. package/dist/core/generator/documents/ConventionsGenerator.js +22 -8
  109. package/dist/core/generator/documents/ConventionsGenerator.js.map +1 -1
  110. package/dist/core/generator/documents/OnboardingGenerator.d.ts.map +1 -1
  111. package/dist/core/generator/documents/OnboardingGenerator.js +25 -27
  112. package/dist/core/generator/documents/OnboardingGenerator.js.map +1 -1
  113. package/dist/core/generator/documents/ReadmeGenerator.d.ts +4 -3
  114. package/dist/core/generator/documents/ReadmeGenerator.d.ts.map +1 -1
  115. package/dist/core/generator/documents/ReadmeGenerator.js +149 -140
  116. package/dist/core/generator/documents/ReadmeGenerator.js.map +1 -1
  117. package/dist/core/generator/documents/promptHelpers.d.ts +1 -1
  118. package/dist/core/generator/documents/promptHelpers.d.ts.map +1 -1
  119. package/dist/core/generator/documents/promptHelpers.js +1 -1
  120. package/dist/core/generator/documents/promptHelpers.js.map +1 -1
  121. package/dist/core/generator/documents/types.d.ts +4 -1
  122. package/dist/core/generator/documents/types.d.ts.map +1 -1
  123. package/dist/core/generator/facts/FactExtractor.d.ts +5 -0
  124. package/dist/core/generator/facts/FactExtractor.d.ts.map +1 -0
  125. package/dist/core/generator/facts/FactExtractor.js +90 -0
  126. package/dist/core/generator/facts/FactExtractor.js.map +1 -0
  127. package/dist/core/generator/facts/types.d.ts +18 -0
  128. package/dist/core/generator/facts/types.d.ts.map +1 -0
  129. package/dist/core/generator/facts/types.js +2 -0
  130. package/dist/core/generator/facts/types.js.map +1 -0
  131. package/dist/core/generator/mlPipelineBuilder.d.ts +8 -0
  132. package/dist/core/generator/mlPipelineBuilder.d.ts.map +1 -0
  133. package/dist/core/generator/mlPipelineBuilder.js +117 -0
  134. package/dist/core/generator/mlPipelineBuilder.js.map +1 -0
  135. package/dist/core/scorer/ComplianceScorer.d.ts +5 -1
  136. package/dist/core/scorer/ComplianceScorer.d.ts.map +1 -1
  137. package/dist/core/scorer/ComplianceScorer.js +47 -23
  138. package/dist/core/scorer/ComplianceScorer.js.map +1 -1
  139. package/dist/core/scorer/ViolationDetector.d.ts +19 -2
  140. package/dist/core/scorer/ViolationDetector.d.ts.map +1 -1
  141. package/dist/core/scorer/ViolationDetector.js +169 -53
  142. package/dist/core/scorer/ViolationDetector.js.map +1 -1
  143. package/dist/models/ModelManager.d.ts +5 -1
  144. package/dist/models/ModelManager.d.ts.map +1 -1
  145. package/dist/models/ModelManager.js +19 -5
  146. package/dist/models/ModelManager.js.map +1 -1
  147. package/dist/models/ModelRegistry.d.ts +1 -1
  148. package/dist/models/ModelRegistry.d.ts.map +1 -1
  149. package/dist/models/ModelRegistry.js +28 -0
  150. package/dist/models/ModelRegistry.js.map +1 -1
  151. package/dist/storage/CustomRuleStore.d.ts +9 -0
  152. package/dist/storage/CustomRuleStore.d.ts.map +1 -0
  153. package/dist/storage/CustomRuleStore.js +22 -0
  154. package/dist/storage/CustomRuleStore.js.map +1 -0
  155. package/dist/storage/ScoreStore.d.ts +2 -5
  156. package/dist/storage/ScoreStore.d.ts.map +1 -1
  157. package/dist/storage/ScoreStore.js +23 -71
  158. package/dist/storage/ScoreStore.js.map +1 -1
  159. package/package.json +4 -3
  160. package/dist/core/classifier/DriftClassifier.d.ts +0 -17
  161. package/dist/core/classifier/DriftClassifier.d.ts.map +0 -1
  162. package/dist/core/classifier/DriftClassifier.js +0 -293
  163. package/dist/core/classifier/DriftClassifier.js.map +0 -1
@@ -1,28 +1,63 @@
1
- import traverse from '@babel/traverse';
2
- import { basename, extname } from 'node:path';
1
+ import _traverse from "@babel/traverse";
2
+ import { basename, extname } from "node:path";
3
+ import { DEFAULT_NAMING } from "../../../config/defaults.js";
4
+ const traverse = typeof _traverse === "function"
5
+ ? _traverse
6
+ : (_traverse?.default ?? _traverse);
3
7
  const PASCAL_CASE = /^[A-Z][a-zA-Z0-9]*$/;
4
8
  const CAMEL_CASE = /^[a-z][a-zA-Z0-9]*$/;
5
9
  const SCREAMING_SNAKE = /^[A-Z][A-Z0-9_]*$/;
6
10
  const HOOK_PREFIX = /^use[A-Z]/;
11
+ function isKebabCase(fileName) {
12
+ return fileName.includes("-");
13
+ }
14
+ const RESERVED_STEMS = ["types", "constants", "defaults", "index"];
7
15
  export class NamingVisitor {
16
+ stemStopwords;
17
+ reservedStems;
18
+ constructor(options) {
19
+ const cfg = options?.namingConfig;
20
+ const stopwords = cfg?.stemStopwords ?? DEFAULT_NAMING.stemStopwords ?? [];
21
+ this.stemStopwords = new Set(stopwords.map((w) => w.toLowerCase()));
22
+ const reserved = cfg?.reservedFileStems ??
23
+ DEFAULT_NAMING.reservedFileStems ??
24
+ RESERVED_STEMS;
25
+ this.reservedStems = new Set(reserved.map((w) => w.toLowerCase()));
26
+ }
8
27
  visit(file) {
9
28
  const findings = [];
10
29
  const fileName = basename(file.filePath, extname(file.filePath));
11
30
  const ext = extname(file.filePath);
12
- const isComponent = ext === '.tsx' || ext === '.jsx';
31
+ const isComponent = ext === ".tsx" || ext === ".jsx";
32
+ if (ext === ".ts" || ext === ".tsx" || ext === ".js" || ext === ".jsx") {
33
+ findings.push({
34
+ dimension: "naming",
35
+ pattern: "Filenames use PascalCase or camelCase (no kebab-case)",
36
+ count: isKebabCase(fileName) ? 0 : 1,
37
+ total: 1,
38
+ example: file.filePath,
39
+ });
40
+ }
13
41
  if (isComponent) {
42
+ const exportInfo = this.getPrimaryExport(file);
43
+ const expectedName = exportInfo?.name;
44
+ const matches = expectedName
45
+ ? basename(fileName) === expectedName
46
+ : PASCAL_CASE.test(fileName);
14
47
  findings.push({
15
- dimension: 'naming',
16
- pattern: 'React components use PascalCase file names',
17
- count: PASCAL_CASE.test(fileName) ? 1 : 0,
48
+ dimension: "naming",
49
+ pattern: "React components use PascalCase file names",
50
+ count: matches ? 1 : 0,
18
51
  total: 1,
19
52
  example: file.filePath,
53
+ exportedName: expectedName ?? undefined,
54
+ exportedKind: "component",
20
55
  });
21
56
  }
22
- else if (ext === '.ts' || ext === '.js') {
57
+ else if (ext === ".ts" || ext === ".js") {
23
58
  if (HOOK_PREFIX.test(fileName)) {
24
59
  findings.push({
25
- dimension: 'naming',
60
+ dimension: "naming",
26
61
  pattern: 'Hooks use "use" prefix with camelCase',
27
62
  count: CAMEL_CASE.test(fileName) ? 1 : 0,
28
63
  total: 1,
@@ -30,50 +65,454 @@ export class NamingVisitor {
30
65
  });
31
66
  }
32
67
  else if (PASCAL_CASE.test(fileName)) {
68
+ const exportInfo = this.getPrimaryExport(file);
69
+ const hasClass = exportInfo?.kind === "class";
70
+ let matches;
71
+ let pattern;
72
+ let exportedName;
73
+ if (hasClass) {
74
+ matches = !exportInfo || basename(fileName) === exportInfo.name;
75
+ pattern = "Class/service files use PascalCase";
76
+ exportedName = exportInfo?.name;
77
+ }
78
+ else {
79
+ matches = false;
80
+ pattern = "Utility files use camelCase";
81
+ exportedName = this.toCamelCase(fileName);
82
+ }
33
83
  findings.push({
34
- dimension: 'naming',
35
- pattern: 'Class/service files use PascalCase',
36
- count: 1,
84
+ dimension: "naming",
85
+ pattern,
86
+ count: matches ? 1 : 0,
37
87
  total: 1,
38
88
  example: file.filePath,
89
+ exportedName,
90
+ exportedKind: exportInfo?.kind,
39
91
  });
40
92
  }
41
93
  else if (CAMEL_CASE.test(fileName)) {
94
+ const exportInfo = this.getPrimaryExport(file);
95
+ const matches = !exportInfo || basename(fileName) === exportInfo.name;
96
+ findings.push({
97
+ dimension: "naming",
98
+ pattern: "Utility files use camelCase",
99
+ count: matches ? 1 : 0,
100
+ total: 1,
101
+ example: file.filePath,
102
+ exportedName: exportInfo?.kind === "instance" ? exportInfo.name : undefined,
103
+ exportedKind: exportInfo?.kind,
104
+ });
105
+ }
106
+ else if (isKebabCase(fileName)) {
107
+ const exportInfo = this.getPrimaryExport(file);
42
108
  findings.push({
43
- dimension: 'naming',
44
- pattern: 'Utility files use camelCase',
45
- count: 1,
109
+ dimension: "naming",
110
+ pattern: "Class/service files use PascalCase",
111
+ count: 0,
46
112
  total: 1,
47
113
  example: file.filePath,
114
+ exportedName: exportInfo?.name,
115
+ exportedKind: exportInfo?.kind,
48
116
  });
49
117
  }
50
118
  }
119
+ this.visitFileResponsibility(file, fileName, findings);
120
+ this.visitClasses(file, findings);
121
+ this.visitInterfaces(file, findings);
122
+ this.visitTypes(file, findings);
123
+ this.visitEnums(file, findings);
124
+ this.visitParameters(file, findings);
125
+ this.visitFactories(file, findings);
51
126
  this.visitConstants(file, findings);
52
127
  return findings;
53
128
  }
129
+ extractWords(s) {
130
+ return s
131
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
132
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
133
+ .split(/[-_.\s]+/)
134
+ .map((w) => w.toLowerCase())
135
+ .filter((w) => w.length >= 2 && !this.stemStopwords.has(w));
136
+ }
137
+ toCamelCase(str) {
138
+ const words = str
139
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
140
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
141
+ .split(/[-_.\s]+/)
142
+ .filter(Boolean);
143
+ if (words.length === 0)
144
+ return str;
145
+ return words
146
+ .map((w, i) => i === 0
147
+ ? w.toLowerCase()
148
+ : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
149
+ .join("");
150
+ }
151
+ shouldCheckFileStemAlign(file) {
152
+ let hasDefaultExport = false;
153
+ let functionExportCount = 0;
154
+ try {
155
+ traverse(file.ast, {
156
+ ExportDefaultDeclaration() {
157
+ hasDefaultExport = true;
158
+ },
159
+ ExportNamedDeclaration(path) {
160
+ if (path.node.declaration?.type === "FunctionDeclaration")
161
+ functionExportCount++;
162
+ },
163
+ noScope: true,
164
+ });
165
+ }
166
+ catch {
167
+ return false;
168
+ }
169
+ return hasDefaultExport || functionExportCount === 1;
170
+ }
171
+ visitFileResponsibility(file, fileName, findings) {
172
+ const stem = fileName.toLowerCase().replace(/\.[^.]+$/, "");
173
+ if (this.reservedStems.has(stem))
174
+ return;
175
+ if (!this.shouldCheckFileStemAlign(file))
176
+ return;
177
+ const exportInfo = this.getPrimaryExport(file);
178
+ if (!exportInfo)
179
+ return;
180
+ const ext = extname(file.filePath);
181
+ if (ext !== ".ts" && ext !== ".tsx")
182
+ return;
183
+ const stemWords = this.extractWords(fileName);
184
+ if (stemWords.length === 0)
185
+ return;
186
+ const exportWords = this.extractWords(exportInfo.name);
187
+ if (exportWords.length === 0)
188
+ return;
189
+ const overlap = stemWords.some((w) => exportWords.includes(w));
190
+ let exportedName = exportInfo.name;
191
+ if (SCREAMING_SNAKE.test(exportInfo.name) &&
192
+ (ext === ".ts" || ext === ".tsx")) {
193
+ exportedName = this.toCamelCase(exportInfo.name);
194
+ }
195
+ findings.push({
196
+ dimension: "naming",
197
+ pattern: "File stem aligns with export responsibility",
198
+ count: overlap ? 1 : 0,
199
+ total: 1,
200
+ example: file.filePath,
201
+ exportedName,
202
+ });
203
+ }
204
+ getPrimaryExport(file) {
205
+ const exports = [];
206
+ try {
207
+ traverse(file.ast, {
208
+ ExportDefaultDeclaration(path) {
209
+ const decl = path.node.declaration;
210
+ if (decl.type === "ClassDeclaration" && decl.id) {
211
+ exports.push({ name: decl.id.name, kind: "class" });
212
+ }
213
+ else if (decl.type === "FunctionDeclaration" && decl.id) {
214
+ exports.push({ name: decl.id.name, kind: "function" });
215
+ }
216
+ else if (decl.type === "Identifier" && decl.name) {
217
+ exports.push({ name: decl.name, kind: "instance" });
218
+ }
219
+ },
220
+ ExportNamedDeclaration(path) {
221
+ const { node } = path;
222
+ if (node.declaration) {
223
+ const d = node.declaration;
224
+ if (d.type === "ClassDeclaration" && d.id) {
225
+ exports.push({ name: d.id.name, kind: "class" });
226
+ }
227
+ else if (d.type === "TSTypeAliasDeclaration" && d.id) {
228
+ exports.push({ name: d.id.name, kind: "instance" });
229
+ }
230
+ else if (d.type === "TSInterfaceDeclaration" && d.id) {
231
+ exports.push({ name: d.id.name, kind: "instance" });
232
+ }
233
+ else if (d.type === "VariableDeclaration" &&
234
+ d.declarations?.[0]?.id) {
235
+ const id = d.declarations[0].id;
236
+ const name = id.type === "Identifier" ? id.name : undefined;
237
+ if (name)
238
+ exports.push({
239
+ name,
240
+ kind: HOOK_PREFIX.test(name) ? "hook" : "instance",
241
+ });
242
+ }
243
+ else if (d.type === "FunctionDeclaration" && d.id) {
244
+ exports.push({ name: d.id.name, kind: "function" });
245
+ }
246
+ }
247
+ else if (node.specifiers?.[0]?.exported?.name) {
248
+ exports.push({
249
+ name: node.specifiers[0].exported.name,
250
+ kind: "instance",
251
+ });
252
+ }
253
+ },
254
+ noScope: true,
255
+ });
256
+ }
257
+ catch {
258
+ // ignore
259
+ }
260
+ const classExport = exports.find((e) => e.kind === "class");
261
+ if (classExport)
262
+ return classExport;
263
+ const fnExport = exports.find((e) => e.kind === "function");
264
+ if (fnExport)
265
+ return fnExport;
266
+ return exports[0] ?? null;
267
+ }
268
+ hasClass(file) {
269
+ return this.getPrimaryExport(file)?.kind === "class";
270
+ }
271
+ visitClasses(file, findings) {
272
+ try {
273
+ let pascalCount = 0;
274
+ let total = 0;
275
+ const violationRef = {};
276
+ traverse(file.ast, {
277
+ ClassDeclaration(path) {
278
+ const name = path.node.id?.name;
279
+ if (!name)
280
+ return;
281
+ total++;
282
+ if (PASCAL_CASE.test(name)) {
283
+ pascalCount++;
284
+ }
285
+ else {
286
+ const words = name.split(/[-_.\s]+/).filter(Boolean);
287
+ const expected = words
288
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
289
+ .join("");
290
+ if (!violationRef.found) {
291
+ violationRef.found = name;
292
+ violationRef.expected = expected;
293
+ }
294
+ }
295
+ },
296
+ noScope: true,
297
+ });
298
+ if (total > 0) {
299
+ findings.push({
300
+ dimension: "naming",
301
+ pattern: "Class names use PascalCase",
302
+ count: pascalCount,
303
+ total,
304
+ example: file.filePath,
305
+ exportedName: violationRef.expected,
306
+ foundValue: violationRef.found,
307
+ });
308
+ }
309
+ }
310
+ catch {
311
+ // ignore
312
+ }
313
+ }
314
+ visitInterfaces(file, findings) {
315
+ try {
316
+ let pascalCount = 0;
317
+ let total = 0;
318
+ traverse(file.ast, {
319
+ TSInterfaceDeclaration(path) {
320
+ const name = path.node.id?.name;
321
+ if (!name)
322
+ return;
323
+ total++;
324
+ if (PASCAL_CASE.test(name))
325
+ pascalCount++;
326
+ },
327
+ noScope: true,
328
+ });
329
+ if (total > 0) {
330
+ findings.push({
331
+ dimension: "naming",
332
+ pattern: "Interface names use PascalCase",
333
+ count: pascalCount,
334
+ total,
335
+ example: file.filePath,
336
+ });
337
+ }
338
+ }
339
+ catch {
340
+ // ignore
341
+ }
342
+ }
343
+ visitTypes(file, findings) {
344
+ try {
345
+ let pascalCount = 0;
346
+ let total = 0;
347
+ traverse(file.ast, {
348
+ TSTypeAliasDeclaration(path) {
349
+ const name = path.node.id?.name;
350
+ if (!name)
351
+ return;
352
+ total++;
353
+ if (PASCAL_CASE.test(name))
354
+ pascalCount++;
355
+ },
356
+ noScope: true,
357
+ });
358
+ if (total > 0) {
359
+ findings.push({
360
+ dimension: "naming",
361
+ pattern: "Type alias names use PascalCase",
362
+ count: pascalCount,
363
+ total,
364
+ example: file.filePath,
365
+ });
366
+ }
367
+ }
368
+ catch {
369
+ // ignore
370
+ }
371
+ }
372
+ visitEnums(file, findings) {
373
+ try {
374
+ let namePascalCount = 0;
375
+ let nameTotal = 0;
376
+ let memberCorrectCount = 0;
377
+ let memberTotal = 0;
378
+ traverse(file.ast, {
379
+ TSEnumDeclaration(path) {
380
+ const node = path.node;
381
+ const enumName = node.id?.name;
382
+ if (enumName) {
383
+ nameTotal++;
384
+ if (PASCAL_CASE.test(enumName))
385
+ namePascalCount++;
386
+ }
387
+ const members = node.body?.members ?? node.members ?? [];
388
+ for (const m of members) {
389
+ if (m.id?.type === "Identifier" && m.id.name) {
390
+ memberTotal++;
391
+ if (PASCAL_CASE.test(m.id.name) ||
392
+ SCREAMING_SNAKE.test(m.id.name)) {
393
+ memberCorrectCount++;
394
+ }
395
+ }
396
+ }
397
+ },
398
+ noScope: true,
399
+ });
400
+ if (nameTotal > 0) {
401
+ findings.push({
402
+ dimension: "naming",
403
+ pattern: "Enum names use PascalCase",
404
+ count: namePascalCount,
405
+ total: nameTotal,
406
+ example: file.filePath,
407
+ });
408
+ }
409
+ if (memberTotal > 0) {
410
+ findings.push({
411
+ dimension: "naming",
412
+ pattern: "Enum members use PascalCase or SCREAMING_SNAKE_CASE",
413
+ count: memberCorrectCount,
414
+ total: memberTotal,
415
+ example: file.filePath,
416
+ });
417
+ }
418
+ }
419
+ catch {
420
+ // ignore
421
+ }
422
+ }
423
+ visitParameters(file, findings) {
424
+ try {
425
+ let camelCount = 0;
426
+ let total = 0;
427
+ traverse(file.ast, {
428
+ Identifier(path) {
429
+ const parentKey = path.parentPath?.parentKey;
430
+ const parent = path.parentPath?.node;
431
+ if (parentKey !== "params" || !parent)
432
+ return;
433
+ if (parent.type !== "FunctionDeclaration" &&
434
+ parent.type !== "ArrowFunctionExpression")
435
+ return;
436
+ const name = path.node.name;
437
+ if (name === "this" || name.startsWith("_"))
438
+ return;
439
+ total++;
440
+ if (CAMEL_CASE.test(name))
441
+ camelCount++;
442
+ },
443
+ noScope: true,
444
+ });
445
+ if (total > 0) {
446
+ findings.push({
447
+ dimension: "naming",
448
+ pattern: "Function parameters use camelCase",
449
+ count: camelCount,
450
+ total,
451
+ example: file.filePath,
452
+ });
453
+ }
454
+ }
455
+ catch {
456
+ // ignore
457
+ }
458
+ }
459
+ visitFactories(file, findings) {
460
+ try {
461
+ const FACTORY_PREFIX = /^(create|build|make)[A-Z]/;
462
+ let camelCount = 0;
463
+ let total = 0;
464
+ traverse(file.ast, {
465
+ FunctionDeclaration(path) {
466
+ const id = path.node.id;
467
+ if (!id || !FACTORY_PREFIX.test(id.name))
468
+ return;
469
+ total++;
470
+ if (CAMEL_CASE.test(id.name))
471
+ camelCount++;
472
+ },
473
+ noScope: true,
474
+ });
475
+ if (total > 0) {
476
+ findings.push({
477
+ dimension: "naming",
478
+ pattern: "Factory functions use camelCase",
479
+ count: camelCount,
480
+ total,
481
+ example: file.filePath,
482
+ });
483
+ }
484
+ }
485
+ catch {
486
+ // ignore
487
+ }
488
+ }
54
489
  visitConstants(file, findings) {
55
490
  try {
56
491
  let screamingCount = 0;
57
492
  let constCount = 0;
58
- // @ts-expect-error -- @babel/traverse CJS default export not resolved under NodeNext
59
493
  traverse(file.ast, {
60
494
  VariableDeclarator(path) {
61
495
  const { node } = path;
62
- if (node.id.type === 'Identifier' &&
63
- node.init &&
64
- (node.init.type === 'StringLiteral' || node.init.type === 'NumericLiteral')) {
65
- constCount++;
66
- if (SCREAMING_SNAKE.test(node.id.name)) {
67
- screamingCount++;
68
- }
496
+ if (node.id.type !== "Identifier" || !node.init)
497
+ return;
498
+ const initType = node.init.type;
499
+ const isConstLike = initType === "StringLiteral" ||
500
+ initType === "NumericLiteral" ||
501
+ initType === "MemberExpression" ||
502
+ initType === "CallExpression";
503
+ if (!isConstLike)
504
+ return;
505
+ constCount++;
506
+ if (SCREAMING_SNAKE.test(node.id.name)) {
507
+ screamingCount++;
69
508
  }
70
509
  },
71
510
  noScope: true,
72
511
  });
73
512
  if (constCount > 0) {
74
513
  findings.push({
75
- dimension: 'naming',
76
- pattern: 'Constants use SCREAMING_SNAKE_CASE',
514
+ dimension: "naming",
515
+ pattern: "Constants use SCREAMING_SNAKE_CASE",
77
516
  count: screamingCount,
78
517
  total: constCount,
79
518
  example: file.filePath,
@@ -81,7 +520,7 @@ export class NamingVisitor {
81
520
  }
82
521
  }
83
522
  catch {
84
- // traverse may fail on some files
523
+ // ignore
85
524
  }
86
525
  }
87
526
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NamingVisitor.js","sourceRoot":"","sources":["../../../../src/core/analyzer/visitors/NamingVisitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NamingVisitor.js","sourceRoot":"","sources":["../../../../src/core/analyzer/visitors/NamingVisitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AstVisitor, VisitorFinding } from './types.js';
2
+ import type { ParsedFile } from '../AstAnalyzer.js';
3
+ export declare class SchemaVisitor implements AstVisitor {
4
+ visit(file: ParsedFile): VisitorFinding[];
5
+ private visitTypeORM;
6
+ }
7
+ //# sourceMappingURL=SchemaVisitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaVisitor.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/visitors/SchemaVisitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAOpD,qBAAa,aAAc,YAAW,UAAU;IAC9C,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,EAAE;IASzC,OAAO,CAAC,YAAY;CAqCrB"}
@@ -0,0 +1,50 @@
1
+ import _traverse from '@babel/traverse';
2
+ const traverse = typeof _traverse === 'function' ? _traverse : (_traverse?.default ?? _traverse);
3
+ import { extname } from 'node:path';
4
+ const PASCAL_CASE = /^[A-Z][a-zA-Z0-9]*$/;
5
+ export class SchemaVisitor {
6
+ visit(file) {
7
+ const ext = extname(file.filePath);
8
+ if (ext !== '.ts' && ext !== '.tsx')
9
+ return [];
10
+ const findings = [];
11
+ this.visitTypeORM(file, findings);
12
+ return findings;
13
+ }
14
+ visitTypeORM(file, findings) {
15
+ try {
16
+ let entityPascalCount = 0;
17
+ let entityTotal = 0;
18
+ traverse(file.ast, {
19
+ ClassDeclaration(path) {
20
+ const decorators = path.node.decorators ?? path.node.decorators;
21
+ if (!Array.isArray(decorators))
22
+ return;
23
+ const hasEntity = decorators.some((d) => d?.expression?.callee?.name === 'Entity');
24
+ if (!hasEntity)
25
+ return;
26
+ const name = path.node.id?.name;
27
+ if (!name)
28
+ return;
29
+ entityTotal++;
30
+ if (PASCAL_CASE.test(name))
31
+ entityPascalCount++;
32
+ },
33
+ noScope: true,
34
+ });
35
+ if (entityTotal > 0) {
36
+ findings.push({
37
+ dimension: 'naming',
38
+ pattern: 'TypeORM entity names use PascalCase',
39
+ count: entityPascalCount,
40
+ total: entityTotal,
41
+ example: file.filePath,
42
+ });
43
+ }
44
+ }
45
+ catch {
46
+ // ignore
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=SchemaVisitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaVisitor.js","sourceRoot":"","sources":["../../../../src/core/analyzer/visitors/SchemaVisitor.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,MAAM,QAAQ,GAAG,OAAO,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAE1C,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,IAAgB;QACpB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO,EAAE,CAAC;QAE/C,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,YAAY,CAAC,IAAgB,EAAE,QAA0B;QAC/D,IAAI,CAAC;YACH,IAAI,iBAAiB,GAAG,CAAC,CAAC;YAC1B,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjB,gBAAgB,CAAC,IAKhB;oBACC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAK,IAAI,CAAC,IAAmC,CAAC,UAAU,CAAC;oBAChG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;wBAAE,OAAO;oBACvC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAE,CAAoD,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,KAAK,QAAQ,CACpG,CAAC;oBACF,IAAI,CAAC,SAAS;wBAAE,OAAO;oBACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;oBAChC,IAAI,CAAC,IAAI;wBAAE,OAAO;oBAClB,WAAW,EAAE,CAAC;oBACd,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,iBAAiB,EAAE,CAAC;gBAClD,CAAC;gBACD,OAAO,EAAE,IAAI;aACoB,CAAC,CAAC;YACrC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC;oBACZ,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,qCAAqC;oBAC9C,KAAK,EAAE,iBAAiB;oBACxB,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,IAAI,CAAC,QAAQ;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;CACF"}
@@ -1,6 +1,9 @@
1
1
  import type { AstVisitor, VisitorFinding } from './types.js';
2
2
  import type { ParsedFile } from '../AstAnalyzer.js';
3
+ import type { StructureConfig } from '../../../config/types.js';
3
4
  export declare class StructureVisitor implements AstVisitor {
4
- visit(_file: ParsedFile): VisitorFinding[];
5
+ private rules;
6
+ constructor(filePaths?: string[], structureConfig?: StructureConfig);
7
+ visit(file: ParsedFile): VisitorFinding[];
5
8
  }
6
9
  //# sourceMappingURL=StructureVisitor.d.ts.map