@oalacea/daemon 0.6.4 → 0.7.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.
Files changed (285) hide show
  1. package/README.md +268 -58
  2. package/bin/Dockerfile +158 -16
  3. package/dist/cli/cli.d.ts.map +1 -1
  4. package/dist/cli/cli.js +22 -2
  5. package/dist/cli/cli.js.map +1 -1
  6. package/dist/cli/commands/command.types.d.ts +216 -0
  7. package/dist/cli/commands/command.types.d.ts.map +1 -0
  8. package/dist/cli/commands/command.types.js +64 -0
  9. package/dist/cli/commands/command.types.js.map +1 -0
  10. package/dist/cli/commands/history.command.d.ts +91 -0
  11. package/dist/cli/commands/history.command.d.ts.map +1 -0
  12. package/dist/cli/commands/history.command.js +336 -0
  13. package/dist/cli/commands/history.command.js.map +1 -0
  14. package/dist/cli/commands/index.d.ts +14 -3
  15. package/dist/cli/commands/index.d.ts.map +1 -1
  16. package/dist/cli/commands/index.js +7 -0
  17. package/dist/cli/commands/index.js.map +1 -1
  18. package/dist/cli/commands/optimize.command.d.ts +110 -0
  19. package/dist/cli/commands/optimize.command.d.ts.map +1 -0
  20. package/dist/cli/commands/optimize.command.js +497 -0
  21. package/dist/cli/commands/optimize.command.js.map +1 -0
  22. package/dist/cli/commands/report.command.d.ts +110 -0
  23. package/dist/cli/commands/report.command.d.ts.map +1 -0
  24. package/dist/cli/commands/report.command.js +532 -0
  25. package/dist/cli/commands/report.command.js.map +1 -0
  26. package/dist/cli/commands/review.command.d.ts +110 -0
  27. package/dist/cli/commands/review.command.d.ts.map +1 -0
  28. package/dist/cli/commands/review.command.js +520 -0
  29. package/dist/cli/commands/review.command.js.map +1 -0
  30. package/dist/cli/commands/score.command.d.ts +47 -0
  31. package/dist/cli/commands/score.command.d.ts.map +1 -0
  32. package/dist/cli/commands/score.command.js +261 -0
  33. package/dist/cli/commands/score.command.js.map +1 -0
  34. package/dist/cli/utils/index.d.ts +10 -0
  35. package/dist/cli/utils/index.d.ts.map +1 -0
  36. package/dist/cli/utils/index.js +10 -0
  37. package/dist/cli/utils/index.js.map +1 -0
  38. package/dist/cli/utils/output.d.ts +192 -0
  39. package/dist/cli/utils/output.d.ts.map +1 -0
  40. package/dist/cli/utils/output.js +411 -0
  41. package/dist/cli/utils/output.js.map +1 -0
  42. package/dist/cli/utils/progress.d.ts +204 -0
  43. package/dist/cli/utils/progress.d.ts.map +1 -0
  44. package/dist/cli/utils/progress.js +396 -0
  45. package/dist/cli/utils/progress.js.map +1 -0
  46. package/dist/core/types/index.d.ts +1 -0
  47. package/dist/core/types/index.d.ts.map +1 -1
  48. package/dist/core/types/project.types.d.ts +3 -3
  49. package/dist/core/types/project.types.d.ts.map +1 -1
  50. package/dist/core/types/scoring.types.d.ts +301 -0
  51. package/dist/core/types/scoring.types.d.ts.map +1 -0
  52. package/dist/core/types/scoring.types.js +8 -0
  53. package/dist/core/types/scoring.types.js.map +1 -0
  54. package/dist/services/detection/framework-detector.d.ts.map +1 -1
  55. package/dist/services/detection/framework-detector.js +74 -5
  56. package/dist/services/detection/framework-detector.js.map +1 -1
  57. package/dist/services/index.d.ts +12 -0
  58. package/dist/services/index.d.ts.map +1 -1
  59. package/dist/services/index.js +14 -0
  60. package/dist/services/index.js.map +1 -1
  61. package/dist/services/optimization/detectors/bug-detector.d.ts +82 -0
  62. package/dist/services/optimization/detectors/bug-detector.d.ts.map +1 -0
  63. package/dist/services/optimization/detectors/bug-detector.js +443 -0
  64. package/dist/services/optimization/detectors/bug-detector.js.map +1 -0
  65. package/dist/services/optimization/detectors/code-smell-detector.d.ts +108 -0
  66. package/dist/services/optimization/detectors/code-smell-detector.d.ts.map +1 -0
  67. package/dist/services/optimization/detectors/code-smell-detector.js +569 -0
  68. package/dist/services/optimization/detectors/code-smell-detector.js.map +1 -0
  69. package/dist/services/optimization/detectors/index.d.ts +7 -0
  70. package/dist/services/optimization/detectors/index.d.ts.map +1 -0
  71. package/dist/services/optimization/detectors/index.js +7 -0
  72. package/dist/services/optimization/detectors/index.js.map +1 -0
  73. package/dist/services/optimization/detectors/perf-detector.d.ts +80 -0
  74. package/dist/services/optimization/detectors/perf-detector.d.ts.map +1 -0
  75. package/dist/services/optimization/detectors/perf-detector.js +451 -0
  76. package/dist/services/optimization/detectors/perf-detector.js.map +1 -0
  77. package/dist/services/optimization/index.d.ts +61 -0
  78. package/dist/services/optimization/index.d.ts.map +1 -0
  79. package/dist/services/optimization/index.js +69 -0
  80. package/dist/services/optimization/index.js.map +1 -0
  81. package/dist/services/optimization/optimization.service.d.ts +65 -0
  82. package/dist/services/optimization/optimization.service.d.ts.map +1 -0
  83. package/dist/services/optimization/optimization.service.js +511 -0
  84. package/dist/services/optimization/optimization.service.js.map +1 -0
  85. package/dist/services/optimization/optimization.types.d.ts +343 -0
  86. package/dist/services/optimization/optimization.types.d.ts.map +1 -0
  87. package/dist/services/optimization/optimization.types.js +8 -0
  88. package/dist/services/optimization/optimization.types.js.map +1 -0
  89. package/dist/services/optimization/optimizers/code-optimizer.d.ts +87 -0
  90. package/dist/services/optimization/optimizers/code-optimizer.d.ts.map +1 -0
  91. package/dist/services/optimization/optimizers/code-optimizer.js +436 -0
  92. package/dist/services/optimization/optimizers/code-optimizer.js.map +1 -0
  93. package/dist/services/optimization/optimizers/index.d.ts +7 -0
  94. package/dist/services/optimization/optimizers/index.d.ts.map +1 -0
  95. package/dist/services/optimization/optimizers/index.js +7 -0
  96. package/dist/services/optimization/optimizers/index.js.map +1 -0
  97. package/dist/services/optimization/optimizers/perf-optimizer.d.ts +64 -0
  98. package/dist/services/optimization/optimizers/perf-optimizer.d.ts.map +1 -0
  99. package/dist/services/optimization/optimizers/perf-optimizer.js +330 -0
  100. package/dist/services/optimization/optimizers/perf-optimizer.js.map +1 -0
  101. package/dist/services/optimization/optimizers/refact-optimizer.d.ts +82 -0
  102. package/dist/services/optimization/optimizers/refact-optimizer.d.ts.map +1 -0
  103. package/dist/services/optimization/optimizers/refact-optimizer.js +354 -0
  104. package/dist/services/optimization/optimizers/refact-optimizer.js.map +1 -0
  105. package/dist/services/optimization/patterns/anti-patterns.d.ts +31 -0
  106. package/dist/services/optimization/patterns/anti-patterns.d.ts.map +1 -0
  107. package/dist/services/optimization/patterns/anti-patterns.js +501 -0
  108. package/dist/services/optimization/patterns/anti-patterns.js.map +1 -0
  109. package/dist/services/optimization/patterns/index.d.ts +5 -0
  110. package/dist/services/optimization/patterns/index.d.ts.map +1 -0
  111. package/dist/services/optimization/patterns/index.js +5 -0
  112. package/dist/services/optimization/patterns/index.js.map +1 -0
  113. package/dist/services/reporting/export/chart.exporter.d.ts +59 -0
  114. package/dist/services/reporting/export/chart.exporter.d.ts.map +1 -0
  115. package/dist/services/reporting/export/chart.exporter.js +350 -0
  116. package/dist/services/reporting/export/chart.exporter.js.map +1 -0
  117. package/dist/services/reporting/export/index.d.ts +9 -0
  118. package/dist/services/reporting/export/index.d.ts.map +1 -0
  119. package/dist/services/reporting/export/index.js +10 -0
  120. package/dist/services/reporting/export/index.js.map +1 -0
  121. package/dist/services/reporting/export/pdf.exporter.d.ts +133 -0
  122. package/dist/services/reporting/export/pdf.exporter.d.ts.map +1 -0
  123. package/dist/services/reporting/export/pdf.exporter.js +270 -0
  124. package/dist/services/reporting/export/pdf.exporter.js.map +1 -0
  125. package/dist/services/reporting/history.service.d.ts +93 -0
  126. package/dist/services/reporting/history.service.d.ts.map +1 -0
  127. package/dist/services/reporting/history.service.js +285 -0
  128. package/dist/services/reporting/history.service.js.map +1 -0
  129. package/dist/services/reporting/index.d.ts +15 -0
  130. package/dist/services/reporting/index.d.ts.map +1 -0
  131. package/dist/services/reporting/index.js +16 -0
  132. package/dist/services/reporting/index.js.map +1 -0
  133. package/dist/services/reporting/report.service.d.ts +102 -0
  134. package/dist/services/reporting/report.service.d.ts.map +1 -0
  135. package/dist/services/reporting/report.service.js +240 -0
  136. package/dist/services/reporting/report.service.js.map +1 -0
  137. package/dist/services/reporting/reporting.types.d.ts +329 -0
  138. package/dist/services/reporting/reporting.types.d.ts.map +1 -0
  139. package/dist/services/reporting/reporting.types.js +8 -0
  140. package/dist/services/reporting/reporting.types.js.map +1 -0
  141. package/dist/services/reporting/templates/html.template.d.ts +81 -0
  142. package/dist/services/reporting/templates/html.template.d.ts.map +1 -0
  143. package/dist/services/reporting/templates/html.template.js +741 -0
  144. package/dist/services/reporting/templates/html.template.js.map +1 -0
  145. package/dist/services/reporting/templates/json.template.d.ts +85 -0
  146. package/dist/services/reporting/templates/json.template.d.ts.map +1 -0
  147. package/dist/services/reporting/templates/json.template.js +308 -0
  148. package/dist/services/reporting/templates/json.template.js.map +1 -0
  149. package/dist/services/reporting/templates/markdown.template.d.ts +69 -0
  150. package/dist/services/reporting/templates/markdown.template.d.ts.map +1 -0
  151. package/dist/services/reporting/templates/markdown.template.js +311 -0
  152. package/dist/services/reporting/templates/markdown.template.js.map +1 -0
  153. package/dist/services/reporting/trend-analyzer.d.ts +73 -0
  154. package/dist/services/reporting/trend-analyzer.d.ts.map +1 -0
  155. package/dist/services/reporting/trend-analyzer.js +291 -0
  156. package/dist/services/reporting/trend-analyzer.js.map +1 -0
  157. package/dist/services/review/analyzers/dependency-analyzer.d.ts +87 -0
  158. package/dist/services/review/analyzers/dependency-analyzer.d.ts.map +1 -0
  159. package/dist/services/review/analyzers/dependency-analyzer.js +458 -0
  160. package/dist/services/review/analyzers/dependency-analyzer.js.map +1 -0
  161. package/dist/services/review/analyzers/index.d.ts +13 -0
  162. package/dist/services/review/analyzers/index.d.ts.map +1 -0
  163. package/dist/services/review/analyzers/index.js +13 -0
  164. package/dist/services/review/analyzers/index.js.map +1 -0
  165. package/dist/services/review/analyzers/nestjs-analyzer.d.ts +210 -0
  166. package/dist/services/review/analyzers/nestjs-analyzer.d.ts.map +1 -0
  167. package/dist/services/review/analyzers/nestjs-analyzer.js +571 -0
  168. package/dist/services/review/analyzers/nestjs-analyzer.js.map +1 -0
  169. package/dist/services/review/analyzers/performance-analyzer.d.ts +91 -0
  170. package/dist/services/review/analyzers/performance-analyzer.d.ts.map +1 -0
  171. package/dist/services/review/analyzers/performance-analyzer.js +589 -0
  172. package/dist/services/review/analyzers/performance-analyzer.js.map +1 -0
  173. package/dist/services/review/analyzers/security-analyzer.d.ts +96 -0
  174. package/dist/services/review/analyzers/security-analyzer.d.ts.map +1 -0
  175. package/dist/services/review/analyzers/security-analyzer.js +512 -0
  176. package/dist/services/review/analyzers/security-analyzer.js.map +1 -0
  177. package/dist/services/review/analyzers/static-analyzer.d.ts +90 -0
  178. package/dist/services/review/analyzers/static-analyzer.d.ts.map +1 -0
  179. package/dist/services/review/analyzers/static-analyzer.js +423 -0
  180. package/dist/services/review/analyzers/static-analyzer.js.map +1 -0
  181. package/dist/services/review/fixers/auto-fixer.d.ts +94 -0
  182. package/dist/services/review/fixers/auto-fixer.d.ts.map +1 -0
  183. package/dist/services/review/fixers/auto-fixer.js +404 -0
  184. package/dist/services/review/fixers/auto-fixer.js.map +1 -0
  185. package/dist/services/review/fixers/index.d.ts +11 -0
  186. package/dist/services/review/fixers/index.d.ts.map +1 -0
  187. package/dist/services/review/fixers/index.js +11 -0
  188. package/dist/services/review/fixers/index.js.map +1 -0
  189. package/dist/services/review/fixers/refactor-suggester.d.ts +100 -0
  190. package/dist/services/review/fixers/refactor-suggester.d.ts.map +1 -0
  191. package/dist/services/review/fixers/refactor-suggester.js +555 -0
  192. package/dist/services/review/fixers/refactor-suggester.js.map +1 -0
  193. package/dist/services/review/fixers/test-generator.d.ts +99 -0
  194. package/dist/services/review/fixers/test-generator.d.ts.map +1 -0
  195. package/dist/services/review/fixers/test-generator.js +458 -0
  196. package/dist/services/review/fixers/test-generator.js.map +1 -0
  197. package/dist/services/review/index.d.ts +14 -0
  198. package/dist/services/review/index.d.ts.map +1 -0
  199. package/dist/services/review/index.js +14 -0
  200. package/dist/services/review/index.js.map +1 -0
  201. package/dist/services/review/reporters/fix-reporter.d.ts +67 -0
  202. package/dist/services/review/reporters/fix-reporter.d.ts.map +1 -0
  203. package/dist/services/review/reporters/fix-reporter.js +437 -0
  204. package/dist/services/review/reporters/fix-reporter.js.map +1 -0
  205. package/dist/services/review/reporters/index.d.ts +10 -0
  206. package/dist/services/review/reporters/index.d.ts.map +1 -0
  207. package/dist/services/review/reporters/index.js +10 -0
  208. package/dist/services/review/reporters/index.js.map +1 -0
  209. package/dist/services/review/reporters/score-reporter.d.ts +84 -0
  210. package/dist/services/review/reporters/score-reporter.d.ts.map +1 -0
  211. package/dist/services/review/reporters/score-reporter.js +560 -0
  212. package/dist/services/review/reporters/score-reporter.js.map +1 -0
  213. package/dist/services/review/review.service.d.ts +129 -0
  214. package/dist/services/review/review.service.d.ts.map +1 -0
  215. package/dist/services/review/review.service.js +396 -0
  216. package/dist/services/review/review.service.js.map +1 -0
  217. package/dist/services/review/review.types.d.ts +443 -0
  218. package/dist/services/review/review.types.d.ts.map +1 -0
  219. package/dist/services/review/review.types.js +11 -0
  220. package/dist/services/review/review.types.js.map +1 -0
  221. package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts +53 -0
  222. package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts.map +1 -0
  223. package/dist/services/scoring/dimensions/accessibility.analyzer.js +260 -0
  224. package/dist/services/scoring/dimensions/accessibility.analyzer.js.map +1 -0
  225. package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts +138 -0
  226. package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts.map +1 -0
  227. package/dist/services/scoring/dimensions/backend-logic.analyzer.js +713 -0
  228. package/dist/services/scoring/dimensions/backend-logic.analyzer.js.map +1 -0
  229. package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts +142 -0
  230. package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts.map +1 -0
  231. package/dist/services/scoring/dimensions/business-logic.analyzer.js +747 -0
  232. package/dist/services/scoring/dimensions/business-logic.analyzer.js.map +1 -0
  233. package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts +142 -0
  234. package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts.map +1 -0
  235. package/dist/services/scoring/dimensions/code-quality.analyzer.js +685 -0
  236. package/dist/services/scoring/dimensions/code-quality.analyzer.js.map +1 -0
  237. package/dist/services/scoring/dimensions/index.d.ts +18 -0
  238. package/dist/services/scoring/dimensions/index.d.ts.map +1 -0
  239. package/dist/services/scoring/dimensions/index.js +27 -0
  240. package/dist/services/scoring/dimensions/index.js.map +1 -0
  241. package/dist/services/scoring/dimensions/performance.analyzer.d.ts +125 -0
  242. package/dist/services/scoring/dimensions/performance.analyzer.d.ts.map +1 -0
  243. package/dist/services/scoring/dimensions/performance.analyzer.js +615 -0
  244. package/dist/services/scoring/dimensions/performance.analyzer.js.map +1 -0
  245. package/dist/services/scoring/dimensions/security.analyzer.d.ts +53 -0
  246. package/dist/services/scoring/dimensions/security.analyzer.d.ts.map +1 -0
  247. package/dist/services/scoring/dimensions/security.analyzer.js +327 -0
  248. package/dist/services/scoring/dimensions/security.analyzer.js.map +1 -0
  249. package/dist/services/scoring/dimensions/seo.analyzer.d.ts +77 -0
  250. package/dist/services/scoring/dimensions/seo.analyzer.d.ts.map +1 -0
  251. package/dist/services/scoring/dimensions/seo.analyzer.js +502 -0
  252. package/dist/services/scoring/dimensions/seo.analyzer.js.map +1 -0
  253. package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts +106 -0
  254. package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts.map +1 -0
  255. package/dist/services/scoring/dimensions/test-coverage.analyzer.js +496 -0
  256. package/dist/services/scoring/dimensions/test-coverage.analyzer.js.map +1 -0
  257. package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts +126 -0
  258. package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts.map +1 -0
  259. package/dist/services/scoring/dimensions/ui-ux.analyzer.js +665 -0
  260. package/dist/services/scoring/dimensions/ui-ux.analyzer.js.map +1 -0
  261. package/dist/services/scoring/index.d.ts +10 -0
  262. package/dist/services/scoring/index.d.ts.map +1 -0
  263. package/dist/services/scoring/index.js +10 -0
  264. package/dist/services/scoring/index.js.map +1 -0
  265. package/dist/services/scoring/scoring-service.d.ts +222 -0
  266. package/dist/services/scoring/scoring-service.d.ts.map +1 -0
  267. package/dist/services/scoring/scoring-service.js +636 -0
  268. package/dist/services/scoring/scoring-service.js.map +1 -0
  269. package/package.json +11 -3
  270. package/templates/README.md +183 -0
  271. package/templates/nestjs/controller.spec.ts +203 -0
  272. package/templates/nestjs/e2e/api.e2e-spec.ts +451 -0
  273. package/templates/nestjs/e2e/auth.e2e-spec.ts +533 -0
  274. package/templates/nestjs/fixtures/test-module.ts +311 -0
  275. package/templates/nestjs/guard.spec.ts +314 -0
  276. package/templates/nestjs/interceptor.spec.ts +458 -0
  277. package/templates/nestjs/module.spec.ts +173 -0
  278. package/templates/nestjs/pipe.spec.ts +474 -0
  279. package/templates/nestjs/service.spec.ts +296 -0
  280. package/templates/rust/Cargo.toml +72 -0
  281. package/templates/rust/actix-controller.test.rs +114 -0
  282. package/templates/rust/axum-handler.test.rs +117 -0
  283. package/templates/rust/integration.test.rs +63 -0
  284. package/templates/rust/rocket-route.test.rs +106 -0
  285. package/templates/rust/unit.test.rs +38 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Security Dimension Analyzer
3
+ *
4
+ * Analyzes security vulnerabilities using npm audit, Snyk, and pattern matching.
5
+ *
6
+ * @module services/scoring/dimensions/security-analyzer
7
+ */
8
+ import type { DimensionScore, DimensionAnalyzerConfig } from '../../../core/types/scoring.types.js';
9
+ import type { Framework } from '../../../core/types/project.types.js';
10
+ import type { ScoringOptions } from '../../../core/types/scoring.types.js';
11
+ /**
12
+ * Security Dimension Analyzer
13
+ */
14
+ export declare class SecurityAnalyzer {
15
+ /** Analyzer configuration */
16
+ readonly config: DimensionAnalyzerConfig;
17
+ private readonly logger;
18
+ private executor;
19
+ constructor();
20
+ /**
21
+ * Analyze security of the project
22
+ */
23
+ analyze(projectPath: string, _framework?: Framework, _options?: ScoringOptions): Promise<DimensionScore>;
24
+ /**
25
+ * Check for dependency vulnerabilities using npm audit
26
+ */
27
+ private checkDependencyVulnerabilities;
28
+ /**
29
+ * Check for vulnerable code patterns in source files
30
+ */
31
+ private checkVulnerablePatterns;
32
+ /**
33
+ * Recursively scan directory for vulnerable patterns
34
+ */
35
+ private scanDirectory;
36
+ /**
37
+ * Scan file for vulnerable patterns
38
+ */
39
+ private scanFile;
40
+ /**
41
+ * Check for security headers in Next.js/Express apps
42
+ */
43
+ private checkSecurityHeaders;
44
+ /**
45
+ * Generate security improvement suggestions
46
+ */
47
+ private generateSecurityImprovements;
48
+ }
49
+ /**
50
+ * Default security analyzer instance
51
+ */
52
+ export declare const securityAnalyzer: SecurityAnalyzer;
53
+ //# sourceMappingURL=security.analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.analyzer.d.ts","sourceRoot":"","sources":["../../../../src/services/scoring/dimensions/security.analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAiB,uBAAuB,EAAqF,MAAM,sCAAsC,CAAC;AACtM,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AA2D3E;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAKtC;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAkB;;IAOlC;;OAEG;IACG,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAmC9G;;OAEG;YACW,8BAA8B;IAqC5C;;OAEG;YACW,uBAAuB;IAmCrC;;OAEG;YACW,aAAa;IAoB3B;;OAEG;YACW,QAAQ;IAqBtB;;OAEG;YACW,oBAAoB;IAmDlC;;OAEG;IACH,OAAO,CAAC,4BAA4B;CAuDrC;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
@@ -0,0 +1,327 @@
1
+ /**
2
+ * Security Dimension Analyzer
3
+ *
4
+ * Analyzes security vulnerabilities using npm audit, Snyk, and pattern matching.
5
+ *
6
+ * @module services/scoring/dimensions/security-analyzer
7
+ */
8
+ import { CommandExecutor } from '../../../shared/utils/command-executor.js';
9
+ import { createLogger } from '../../../shared/utils/logger.js';
10
+ import { readFile } from 'node:fs/promises';
11
+ import { join } from 'node:path';
12
+ import { readdir } from 'node:fs/promises';
13
+ /**
14
+ * Vulnerability severity weights
15
+ */
16
+ const SEVERITY_WEIGHTS = {
17
+ critical: 50,
18
+ high: 25,
19
+ moderate: 10,
20
+ low: 5,
21
+ };
22
+ /**
23
+ * Known vulnerable patterns
24
+ */
25
+ const VULNERABLE_PATTERNS = [
26
+ {
27
+ name: 'innerHTML usage',
28
+ pattern: /\.innerHTML\s*=/,
29
+ severity: 'high',
30
+ description: 'Direct innerHTML assignment can lead to XSS vulnerabilities',
31
+ },
32
+ {
33
+ name: 'dangerouslySetInnerHTML',
34
+ pattern: /dangerouslySetInnerHTML/,
35
+ severity: 'medium',
36
+ description: 'dangerouslySetInnerHTML bypasses React XSS protection',
37
+ },
38
+ {
39
+ name: 'eval() usage',
40
+ pattern: /\beval\s*\(/,
41
+ severity: 'critical',
42
+ description: 'eval() can execute arbitrary code',
43
+ },
44
+ {
45
+ name: 'SQL concatenation',
46
+ pattern: /(SELECT|INSERT|UPDATE|DELETE).*"\s*\+/,
47
+ severity: 'critical',
48
+ description: 'SQL query concatenation can lead to injection',
49
+ },
50
+ {
51
+ name: 'hardcoded API key',
52
+ pattern: /api[_-]?key\s*[:=]\s*['"`][^'"`]{20,}['"`]/,
53
+ severity: 'high',
54
+ description: 'Possible hardcoded API key detected',
55
+ },
56
+ {
57
+ name: 'hardcoded password',
58
+ pattern: /password\s*[:=]\s*['"`][^'"`]{8,}['"`]/,
59
+ severity: 'critical',
60
+ description: 'Possible hardcoded password detected',
61
+ },
62
+ ];
63
+ /**
64
+ * Security Dimension Analyzer
65
+ */
66
+ export class SecurityAnalyzer {
67
+ /** Analyzer configuration */
68
+ config = {
69
+ dimension: 'security',
70
+ defaultWeight: 0.15,
71
+ estimatedDuration: 25000,
72
+ supportedFrameworks: ['Next.js', 'React', 'Vue', 'Nuxt', 'Svelte', 'NestJS', 'Angular', 'Remix', 'SvelteKit', 'Astro', 'Gatsby', 'Express', 'Fastify', 'Hono', 'Koa'],
73
+ };
74
+ logger;
75
+ executor;
76
+ constructor() {
77
+ this.logger = createLogger('SecurityAnalyzer');
78
+ this.executor = new CommandExecutor();
79
+ }
80
+ /**
81
+ * Analyze security of the project
82
+ */
83
+ async analyze(projectPath, _framework, _options) {
84
+ this.logger.info(`Analyzing security for ${projectPath}`);
85
+ const issues = [];
86
+ const improvements = [];
87
+ let score = 100;
88
+ // 1. Check for dependency vulnerabilities
89
+ const depVulns = await this.checkDependencyVulnerabilities(projectPath);
90
+ score -= depVulns.scorePenalty;
91
+ issues.push(...depVulns.issues);
92
+ // 2. Check for vulnerable code patterns
93
+ const patternVulns = await this.checkVulnerablePatterns(projectPath);
94
+ score -= patternVulns.scorePenalty;
95
+ issues.push(...patternVulns.issues);
96
+ // 3. Check for security headers
97
+ const headerIssues = await this.checkSecurityHeaders(projectPath);
98
+ score -= headerIssues.scorePenalty;
99
+ issues.push(...headerIssues.issues);
100
+ // 4. Generate security improvements
101
+ improvements.push(...this.generateSecurityImprovements(issues));
102
+ return {
103
+ dimension: 'security',
104
+ score: Math.max(0, score),
105
+ weight: 0.15,
106
+ issues,
107
+ improvements,
108
+ };
109
+ }
110
+ /**
111
+ * Check for dependency vulnerabilities using npm audit
112
+ */
113
+ async checkDependencyVulnerabilities(projectPath) {
114
+ const issues = [];
115
+ let scorePenalty = 0;
116
+ try {
117
+ const result = await this.executor.execute('npm audit --json', { cwd: projectPath, timeout: 30000 });
118
+ if (result.success && result.data.stdout) {
119
+ const audit = JSON.parse(result.data.stdout);
120
+ const vulnerabilities = audit.vulnerabilities || {};
121
+ for (const [severityKey, data] of Object.entries(vulnerabilities)) {
122
+ if (typeof data === 'object' && data !== null) {
123
+ const vuln = data;
124
+ if (Array.isArray(vuln.nodes) && vuln.nodes.length > 0) {
125
+ const severity = severityKey;
126
+ const weight = SEVERITY_WEIGHTS[severity] || 5;
127
+ scorePenalty += weight * vuln.nodes.length;
128
+ issues.push({
129
+ severity: (severity === 'critical' || severity === 'high' ? 'high' : 'medium'),
130
+ category: 'security',
131
+ description: `${vuln.nodes.length} ${severity} vulnerabilities in dependencies`,
132
+ location: 'package.json',
133
+ fixable: true,
134
+ });
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
+ catch (error) {
141
+ this.logger.warn('npm audit failed', error);
142
+ }
143
+ return { scorePenalty, issues };
144
+ }
145
+ /**
146
+ * Check for vulnerable code patterns in source files
147
+ */
148
+ async checkVulnerablePatterns(projectPath) {
149
+ const issues = [];
150
+ let scorePenalty = 0;
151
+ try {
152
+ const srcPath = join(projectPath, 'src');
153
+ const appPath = join(projectPath, 'app');
154
+ // Scan both src and app directories
155
+ const dirsToScan = [];
156
+ try {
157
+ await readdir(srcPath);
158
+ dirsToScan.push(srcPath);
159
+ }
160
+ catch { }
161
+ try {
162
+ await readdir(appPath);
163
+ dirsToScan.push(appPath);
164
+ }
165
+ catch { }
166
+ for (const dir of dirsToScan) {
167
+ await this.scanDirectory(dir, issues);
168
+ }
169
+ // Calculate score penalty based on severity
170
+ for (const issue of issues) {
171
+ const weight = SEVERITY_WEIGHTS[issue.severity] || 5;
172
+ scorePenalty += weight;
173
+ }
174
+ }
175
+ catch (error) {
176
+ this.logger.warn('Pattern scanning failed', error);
177
+ }
178
+ return { scorePenalty, issues };
179
+ }
180
+ /**
181
+ * Recursively scan directory for vulnerable patterns
182
+ */
183
+ async scanDirectory(dirPath, issues) {
184
+ const { readdir } = await import('node:fs/promises');
185
+ const { join } = await import('node:path');
186
+ const entries = await readdir(dirPath, { withFileTypes: true });
187
+ for (const entry of entries) {
188
+ const fullPath = join(dirPath, entry.name);
189
+ if (entry.isDirectory()) {
190
+ // Skip node_modules and common build directories
191
+ if (!['node_modules', '.git', 'dist', 'build', '.next', '.nuxt'].includes(entry.name)) {
192
+ await this.scanDirectory(fullPath, issues);
193
+ }
194
+ }
195
+ else if (entry.isFile() && /\.(ts|tsx|js|jsx)$/.test(entry.name)) {
196
+ await this.scanFile(fullPath, issues);
197
+ }
198
+ }
199
+ }
200
+ /**
201
+ * Scan file for vulnerable patterns
202
+ */
203
+ async scanFile(filePath, issues) {
204
+ try {
205
+ const content = await readFile(filePath, 'utf-8');
206
+ const relativePath = filePath.replace(process.cwd(), '');
207
+ for (const pattern of VULNERABLE_PATTERNS) {
208
+ if (pattern.pattern.test(content)) {
209
+ issues.push({
210
+ severity: pattern.severity,
211
+ category: 'security',
212
+ description: pattern.description,
213
+ location: relativePath,
214
+ fixable: true,
215
+ });
216
+ }
217
+ }
218
+ }
219
+ catch {
220
+ // Skip files that can't be read
221
+ }
222
+ }
223
+ /**
224
+ * Check for security headers in Next.js/Express apps
225
+ */
226
+ async checkSecurityHeaders(projectPath) {
227
+ const issues = [];
228
+ let scorePenalty = 0;
229
+ // Required security headers
230
+ const requiredHeaders = [
231
+ 'Content-Security-Policy',
232
+ 'X-Frame-Options',
233
+ 'X-Content-Type-Options',
234
+ 'Strict-Transport-Security',
235
+ 'Referrer-Policy',
236
+ ];
237
+ try {
238
+ // Check Next.js config
239
+ const nextConfig = join(projectPath, 'next.config.js');
240
+ const nextConfigMjs = join(projectPath, 'next.config.mjs');
241
+ const nextConfigTs = join(projectPath, 'next.config.ts');
242
+ let hasSecurityHeaders = false;
243
+ for (const configPath of [nextConfig, nextConfigMjs, nextConfigTs]) {
244
+ try {
245
+ const content = await readFile(configPath, 'utf-8');
246
+ if (content.includes('headers') && (content.includes('Content-Security-Policy') ||
247
+ content.includes('X-Frame-Options'))) {
248
+ hasSecurityHeaders = true;
249
+ break;
250
+ }
251
+ }
252
+ catch { }
253
+ }
254
+ if (!hasSecurityHeaders) {
255
+ scorePenalty += 10;
256
+ issues.push({
257
+ severity: 'medium',
258
+ category: 'security',
259
+ description: 'Missing security headers (CSP, X-Frame-Options, etc.)',
260
+ location: 'config',
261
+ fixable: true,
262
+ });
263
+ }
264
+ }
265
+ catch {
266
+ // Skip if config not found
267
+ }
268
+ return { scorePenalty, issues };
269
+ }
270
+ /**
271
+ * Generate security improvement suggestions
272
+ */
273
+ generateSecurityImprovements(issues) {
274
+ const improvements = [];
275
+ const hasXSS = issues.some(i => i.description.includes('XSS') || i.description.includes('innerHTML'));
276
+ const hasInjection = issues.some(i => i.description.includes('injection') || i.description.includes('SQL'));
277
+ const hasSecrets = issues.some(i => i.description.includes('API key') || i.description.includes('password'));
278
+ if (hasXSS) {
279
+ improvements.push({
280
+ type: 'security',
281
+ description: 'Use React/Vue built-in escaping instead of innerHTML',
282
+ effort: 'moderate',
283
+ impact: 'high',
284
+ });
285
+ improvements.push({
286
+ type: 'security',
287
+ description: 'Implement Content Security Policy (CSP) headers',
288
+ effort: 'moderate',
289
+ impact: 'high',
290
+ });
291
+ }
292
+ if (hasInjection) {
293
+ improvements.push({
294
+ type: 'security',
295
+ description: 'Use parameterized queries or ORM to prevent injection',
296
+ effort: 'significant',
297
+ impact: 'critical',
298
+ });
299
+ }
300
+ if (hasSecrets) {
301
+ improvements.push({
302
+ type: 'security',
303
+ description: 'Move secrets to environment variables',
304
+ effort: 'quick',
305
+ impact: 'critical',
306
+ });
307
+ }
308
+ improvements.push({
309
+ type: 'security',
310
+ description: 'Run `npm audit fix` to fix vulnerable dependencies',
311
+ effort: 'quick',
312
+ impact: 'high',
313
+ });
314
+ improvements.push({
315
+ type: 'security',
316
+ description: 'Set up automated security scanning in CI/CD',
317
+ effort: 'moderate',
318
+ impact: 'high',
319
+ });
320
+ return improvements;
321
+ }
322
+ }
323
+ /**
324
+ * Default security analyzer instance
325
+ */
326
+ export const securityAnalyzer = new SecurityAnalyzer();
327
+ //# sourceMappingURL=security.analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.analyzer.js","sourceRoot":"","sources":["../../../../src/services/scoring/dimensions/security.analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * SEO Dimension Analyzer
3
+ *
4
+ * Analyzes Search Engine Optimization factors for web applications.
5
+ * Checks meta tags, structured data, sitemap, robots.txt, and more.
6
+ *
7
+ * @module services/scoring/dimensions/seo-analyzer
8
+ */
9
+ import type { DimensionScore, DimensionAnalyzerConfig } from '../../../core/types/scoring.types.js';
10
+ import type { Framework } from '../../../core/types/project.types.js';
11
+ import type { ScoringOptions } from '../../../core/types/scoring.types.js';
12
+ /**
13
+ * SEO Dimension Analyzer
14
+ *
15
+ * Evaluates SEO quality across multiple dimensions:
16
+ * - Meta tags (title, description, Open Graph, Twitter Cards)
17
+ * - Structured data (JSON-LD, Microdata)
18
+ * - Sitemap.xml
19
+ * - Robots.txt
20
+ * - Heading structure
21
+ * - Image alt attributes
22
+ * - Semantic HTML
23
+ * - Core Web Vitals (indirect SEO factor)
24
+ */
25
+ export declare class SeoAnalyzer {
26
+ /** Analyzer configuration */
27
+ readonly config: DimensionAnalyzerConfig;
28
+ private readonly logger;
29
+ constructor();
30
+ /**
31
+ * Analyze SEO for a project
32
+ */
33
+ analyze(projectPath: string, _framework?: Framework, _options?: ScoringOptions): Promise<DimensionScore>;
34
+ /**
35
+ * Run all SEO checks
36
+ */
37
+ private runAllSeoChecks;
38
+ /**
39
+ * Calculate SEO score from check results
40
+ */
41
+ private calculateScore;
42
+ /**
43
+ * Generate issues from failed checks
44
+ */
45
+ private generateIssues;
46
+ /**
47
+ * Get fix suggestion for an issue
48
+ */
49
+ private getFixSuggestion;
50
+ /**
51
+ * Generate SEO improvements
52
+ */
53
+ private generateImprovements;
54
+ /**
55
+ * Analyze SEO metadata
56
+ */
57
+ private analyzeSeoMetadata;
58
+ private checkHtmlFile;
59
+ private checkMetaTags;
60
+ private checkTitleTag;
61
+ private checkMetaDescription;
62
+ private checkHeadingStructure;
63
+ private checkSitemap;
64
+ private checkRobotsTxt;
65
+ private checkStructuredData;
66
+ private checkOpenGraph;
67
+ private checkSemanticHtml;
68
+ /**
69
+ * Get HTML content from the project
70
+ */
71
+ private getHtmlContent;
72
+ }
73
+ /**
74
+ * Default SEO analyzer instance
75
+ */
76
+ export declare const seoAnalyzer: SeoAnalyzer;
77
+ //# sourceMappingURL=seo.analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.analyzer.d.ts","sourceRoot":"","sources":["../../../../src/services/scoring/dimensions/seo.analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAqC,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AACvI,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AA6C3E;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAW;IACtB,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAKtC;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;IAMhC;;OAEG;IACG,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IA2C9G;;OAEG;YACW,eAAe;IAkG7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,cAAc;IAqDtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsE5B;;OAEG;YACW,kBAAkB;YAqClB,aAAa;YAgBb,aAAa;YAkBb,aAAa;YAYb,oBAAoB;YAYpB,qBAAqB;YAuBrB,YAAY;YAgBZ,cAAc;YAcd,mBAAmB;YAQnB,cAAc;YAgBd,iBAAiB;IAsB/B;;OAEG;YACW,cAAc;CAe7B;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,aAAoB,CAAC"}