@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.
- package/README.md +268 -58
- package/bin/Dockerfile +158 -16
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +22 -2
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/command.types.d.ts +216 -0
- package/dist/cli/commands/command.types.d.ts.map +1 -0
- package/dist/cli/commands/command.types.js +64 -0
- package/dist/cli/commands/command.types.js.map +1 -0
- package/dist/cli/commands/history.command.d.ts +91 -0
- package/dist/cli/commands/history.command.d.ts.map +1 -0
- package/dist/cli/commands/history.command.js +336 -0
- package/dist/cli/commands/history.command.js.map +1 -0
- package/dist/cli/commands/index.d.ts +14 -3
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +7 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/optimize.command.d.ts +110 -0
- package/dist/cli/commands/optimize.command.d.ts.map +1 -0
- package/dist/cli/commands/optimize.command.js +497 -0
- package/dist/cli/commands/optimize.command.js.map +1 -0
- package/dist/cli/commands/report.command.d.ts +110 -0
- package/dist/cli/commands/report.command.d.ts.map +1 -0
- package/dist/cli/commands/report.command.js +532 -0
- package/dist/cli/commands/report.command.js.map +1 -0
- package/dist/cli/commands/review.command.d.ts +110 -0
- package/dist/cli/commands/review.command.d.ts.map +1 -0
- package/dist/cli/commands/review.command.js +520 -0
- package/dist/cli/commands/review.command.js.map +1 -0
- package/dist/cli/commands/score.command.d.ts +47 -0
- package/dist/cli/commands/score.command.d.ts.map +1 -0
- package/dist/cli/commands/score.command.js +261 -0
- package/dist/cli/commands/score.command.js.map +1 -0
- package/dist/cli/utils/index.d.ts +10 -0
- package/dist/cli/utils/index.d.ts.map +1 -0
- package/dist/cli/utils/index.js +10 -0
- package/dist/cli/utils/index.js.map +1 -0
- package/dist/cli/utils/output.d.ts +192 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +411 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/progress.d.ts +204 -0
- package/dist/cli/utils/progress.d.ts.map +1 -0
- package/dist/cli/utils/progress.js +396 -0
- package/dist/cli/utils/progress.js.map +1 -0
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/project.types.d.ts +3 -3
- package/dist/core/types/project.types.d.ts.map +1 -1
- package/dist/core/types/scoring.types.d.ts +301 -0
- package/dist/core/types/scoring.types.d.ts.map +1 -0
- package/dist/core/types/scoring.types.js +8 -0
- package/dist/core/types/scoring.types.js.map +1 -0
- package/dist/services/detection/framework-detector.d.ts.map +1 -1
- package/dist/services/detection/framework-detector.js +74 -5
- package/dist/services/detection/framework-detector.js.map +1 -1
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +14 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/optimization/detectors/bug-detector.d.ts +82 -0
- package/dist/services/optimization/detectors/bug-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/bug-detector.js +443 -0
- package/dist/services/optimization/detectors/bug-detector.js.map +1 -0
- package/dist/services/optimization/detectors/code-smell-detector.d.ts +108 -0
- package/dist/services/optimization/detectors/code-smell-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/code-smell-detector.js +569 -0
- package/dist/services/optimization/detectors/code-smell-detector.js.map +1 -0
- package/dist/services/optimization/detectors/index.d.ts +7 -0
- package/dist/services/optimization/detectors/index.d.ts.map +1 -0
- package/dist/services/optimization/detectors/index.js +7 -0
- package/dist/services/optimization/detectors/index.js.map +1 -0
- package/dist/services/optimization/detectors/perf-detector.d.ts +80 -0
- package/dist/services/optimization/detectors/perf-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/perf-detector.js +451 -0
- package/dist/services/optimization/detectors/perf-detector.js.map +1 -0
- package/dist/services/optimization/index.d.ts +61 -0
- package/dist/services/optimization/index.d.ts.map +1 -0
- package/dist/services/optimization/index.js +69 -0
- package/dist/services/optimization/index.js.map +1 -0
- package/dist/services/optimization/optimization.service.d.ts +65 -0
- package/dist/services/optimization/optimization.service.d.ts.map +1 -0
- package/dist/services/optimization/optimization.service.js +511 -0
- package/dist/services/optimization/optimization.service.js.map +1 -0
- package/dist/services/optimization/optimization.types.d.ts +343 -0
- package/dist/services/optimization/optimization.types.d.ts.map +1 -0
- package/dist/services/optimization/optimization.types.js +8 -0
- package/dist/services/optimization/optimization.types.js.map +1 -0
- package/dist/services/optimization/optimizers/code-optimizer.d.ts +87 -0
- package/dist/services/optimization/optimizers/code-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/code-optimizer.js +436 -0
- package/dist/services/optimization/optimizers/code-optimizer.js.map +1 -0
- package/dist/services/optimization/optimizers/index.d.ts +7 -0
- package/dist/services/optimization/optimizers/index.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/index.js +7 -0
- package/dist/services/optimization/optimizers/index.js.map +1 -0
- package/dist/services/optimization/optimizers/perf-optimizer.d.ts +64 -0
- package/dist/services/optimization/optimizers/perf-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/perf-optimizer.js +330 -0
- package/dist/services/optimization/optimizers/perf-optimizer.js.map +1 -0
- package/dist/services/optimization/optimizers/refact-optimizer.d.ts +82 -0
- package/dist/services/optimization/optimizers/refact-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/refact-optimizer.js +354 -0
- package/dist/services/optimization/optimizers/refact-optimizer.js.map +1 -0
- package/dist/services/optimization/patterns/anti-patterns.d.ts +31 -0
- package/dist/services/optimization/patterns/anti-patterns.d.ts.map +1 -0
- package/dist/services/optimization/patterns/anti-patterns.js +501 -0
- package/dist/services/optimization/patterns/anti-patterns.js.map +1 -0
- package/dist/services/optimization/patterns/index.d.ts +5 -0
- package/dist/services/optimization/patterns/index.d.ts.map +1 -0
- package/dist/services/optimization/patterns/index.js +5 -0
- package/dist/services/optimization/patterns/index.js.map +1 -0
- package/dist/services/reporting/export/chart.exporter.d.ts +59 -0
- package/dist/services/reporting/export/chart.exporter.d.ts.map +1 -0
- package/dist/services/reporting/export/chart.exporter.js +350 -0
- package/dist/services/reporting/export/chart.exporter.js.map +1 -0
- package/dist/services/reporting/export/index.d.ts +9 -0
- package/dist/services/reporting/export/index.d.ts.map +1 -0
- package/dist/services/reporting/export/index.js +10 -0
- package/dist/services/reporting/export/index.js.map +1 -0
- package/dist/services/reporting/export/pdf.exporter.d.ts +133 -0
- package/dist/services/reporting/export/pdf.exporter.d.ts.map +1 -0
- package/dist/services/reporting/export/pdf.exporter.js +270 -0
- package/dist/services/reporting/export/pdf.exporter.js.map +1 -0
- package/dist/services/reporting/history.service.d.ts +93 -0
- package/dist/services/reporting/history.service.d.ts.map +1 -0
- package/dist/services/reporting/history.service.js +285 -0
- package/dist/services/reporting/history.service.js.map +1 -0
- package/dist/services/reporting/index.d.ts +15 -0
- package/dist/services/reporting/index.d.ts.map +1 -0
- package/dist/services/reporting/index.js +16 -0
- package/dist/services/reporting/index.js.map +1 -0
- package/dist/services/reporting/report.service.d.ts +102 -0
- package/dist/services/reporting/report.service.d.ts.map +1 -0
- package/dist/services/reporting/report.service.js +240 -0
- package/dist/services/reporting/report.service.js.map +1 -0
- package/dist/services/reporting/reporting.types.d.ts +329 -0
- package/dist/services/reporting/reporting.types.d.ts.map +1 -0
- package/dist/services/reporting/reporting.types.js +8 -0
- package/dist/services/reporting/reporting.types.js.map +1 -0
- package/dist/services/reporting/templates/html.template.d.ts +81 -0
- package/dist/services/reporting/templates/html.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/html.template.js +741 -0
- package/dist/services/reporting/templates/html.template.js.map +1 -0
- package/dist/services/reporting/templates/json.template.d.ts +85 -0
- package/dist/services/reporting/templates/json.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/json.template.js +308 -0
- package/dist/services/reporting/templates/json.template.js.map +1 -0
- package/dist/services/reporting/templates/markdown.template.d.ts +69 -0
- package/dist/services/reporting/templates/markdown.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/markdown.template.js +311 -0
- package/dist/services/reporting/templates/markdown.template.js.map +1 -0
- package/dist/services/reporting/trend-analyzer.d.ts +73 -0
- package/dist/services/reporting/trend-analyzer.d.ts.map +1 -0
- package/dist/services/reporting/trend-analyzer.js +291 -0
- package/dist/services/reporting/trend-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/dependency-analyzer.d.ts +87 -0
- package/dist/services/review/analyzers/dependency-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/dependency-analyzer.js +458 -0
- package/dist/services/review/analyzers/dependency-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/index.d.ts +13 -0
- package/dist/services/review/analyzers/index.d.ts.map +1 -0
- package/dist/services/review/analyzers/index.js +13 -0
- package/dist/services/review/analyzers/index.js.map +1 -0
- package/dist/services/review/analyzers/nestjs-analyzer.d.ts +210 -0
- package/dist/services/review/analyzers/nestjs-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/nestjs-analyzer.js +571 -0
- package/dist/services/review/analyzers/nestjs-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/performance-analyzer.d.ts +91 -0
- package/dist/services/review/analyzers/performance-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/performance-analyzer.js +589 -0
- package/dist/services/review/analyzers/performance-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/security-analyzer.d.ts +96 -0
- package/dist/services/review/analyzers/security-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/security-analyzer.js +512 -0
- package/dist/services/review/analyzers/security-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/static-analyzer.d.ts +90 -0
- package/dist/services/review/analyzers/static-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/static-analyzer.js +423 -0
- package/dist/services/review/analyzers/static-analyzer.js.map +1 -0
- package/dist/services/review/fixers/auto-fixer.d.ts +94 -0
- package/dist/services/review/fixers/auto-fixer.d.ts.map +1 -0
- package/dist/services/review/fixers/auto-fixer.js +404 -0
- package/dist/services/review/fixers/auto-fixer.js.map +1 -0
- package/dist/services/review/fixers/index.d.ts +11 -0
- package/dist/services/review/fixers/index.d.ts.map +1 -0
- package/dist/services/review/fixers/index.js +11 -0
- package/dist/services/review/fixers/index.js.map +1 -0
- package/dist/services/review/fixers/refactor-suggester.d.ts +100 -0
- package/dist/services/review/fixers/refactor-suggester.d.ts.map +1 -0
- package/dist/services/review/fixers/refactor-suggester.js +555 -0
- package/dist/services/review/fixers/refactor-suggester.js.map +1 -0
- package/dist/services/review/fixers/test-generator.d.ts +99 -0
- package/dist/services/review/fixers/test-generator.d.ts.map +1 -0
- package/dist/services/review/fixers/test-generator.js +458 -0
- package/dist/services/review/fixers/test-generator.js.map +1 -0
- package/dist/services/review/index.d.ts +14 -0
- package/dist/services/review/index.d.ts.map +1 -0
- package/dist/services/review/index.js +14 -0
- package/dist/services/review/index.js.map +1 -0
- package/dist/services/review/reporters/fix-reporter.d.ts +67 -0
- package/dist/services/review/reporters/fix-reporter.d.ts.map +1 -0
- package/dist/services/review/reporters/fix-reporter.js +437 -0
- package/dist/services/review/reporters/fix-reporter.js.map +1 -0
- package/dist/services/review/reporters/index.d.ts +10 -0
- package/dist/services/review/reporters/index.d.ts.map +1 -0
- package/dist/services/review/reporters/index.js +10 -0
- package/dist/services/review/reporters/index.js.map +1 -0
- package/dist/services/review/reporters/score-reporter.d.ts +84 -0
- package/dist/services/review/reporters/score-reporter.d.ts.map +1 -0
- package/dist/services/review/reporters/score-reporter.js +560 -0
- package/dist/services/review/reporters/score-reporter.js.map +1 -0
- package/dist/services/review/review.service.d.ts +129 -0
- package/dist/services/review/review.service.d.ts.map +1 -0
- package/dist/services/review/review.service.js +396 -0
- package/dist/services/review/review.service.js.map +1 -0
- package/dist/services/review/review.types.d.ts +443 -0
- package/dist/services/review/review.types.d.ts.map +1 -0
- package/dist/services/review/review.types.js +11 -0
- package/dist/services/review/review.types.js.map +1 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts +53 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.js +260 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts +138 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.js +713 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts +142 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.js +747 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts +142 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.js +685 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/index.d.ts +18 -0
- package/dist/services/scoring/dimensions/index.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/index.js +27 -0
- package/dist/services/scoring/dimensions/index.js.map +1 -0
- package/dist/services/scoring/dimensions/performance.analyzer.d.ts +125 -0
- package/dist/services/scoring/dimensions/performance.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/performance.analyzer.js +615 -0
- package/dist/services/scoring/dimensions/performance.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/security.analyzer.d.ts +53 -0
- package/dist/services/scoring/dimensions/security.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/security.analyzer.js +327 -0
- package/dist/services/scoring/dimensions/security.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/seo.analyzer.d.ts +77 -0
- package/dist/services/scoring/dimensions/seo.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/seo.analyzer.js +502 -0
- package/dist/services/scoring/dimensions/seo.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts +106 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.js +496 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts +126 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.js +665 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.js.map +1 -0
- package/dist/services/scoring/index.d.ts +10 -0
- package/dist/services/scoring/index.d.ts.map +1 -0
- package/dist/services/scoring/index.js +10 -0
- package/dist/services/scoring/index.js.map +1 -0
- package/dist/services/scoring/scoring-service.d.ts +222 -0
- package/dist/services/scoring/scoring-service.d.ts.map +1 -0
- package/dist/services/scoring/scoring-service.js +636 -0
- package/dist/services/scoring/scoring-service.js.map +1 -0
- package/package.json +11 -3
- package/templates/README.md +183 -0
- package/templates/nestjs/controller.spec.ts +203 -0
- package/templates/nestjs/e2e/api.e2e-spec.ts +451 -0
- package/templates/nestjs/e2e/auth.e2e-spec.ts +533 -0
- package/templates/nestjs/fixtures/test-module.ts +311 -0
- package/templates/nestjs/guard.spec.ts +314 -0
- package/templates/nestjs/interceptor.spec.ts +458 -0
- package/templates/nestjs/module.spec.ts +173 -0
- package/templates/nestjs/pipe.spec.ts +474 -0
- package/templates/nestjs/service.spec.ts +296 -0
- package/templates/rust/Cargo.toml +72 -0
- package/templates/rust/actix-controller.test.rs +114 -0
- package/templates/rust/axum-handler.test.rs +117 -0
- package/templates/rust/integration.test.rs +63 -0
- package/templates/rust/rocket-route.test.rs +106 -0
- 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":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAe,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C;;GAEG;AACH,MAAM,gBAAgB,GAAG;IACvB,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE,EAAE;IACZ,GAAG,EAAE,CAAC;CACP,CAAC;AAEF;;GAEG;AACH,MAAM,mBAAmB,GAAG;IAC1B;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,iBAAiB;QAC1B,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,6DAA6D;KAC3E;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,uDAAuD;KACrE;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,mCAAmC;KACjD;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,uCAAuC;QAChD,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,+CAA+C;KAC7D;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,4CAA4C;QACrD,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,qCAAqC;KACnD;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,wCAAwC;QACjD,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,sCAAsC;KACpD;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAC3B,6BAA6B;IACpB,MAAM,GAA4B;QACzC,SAAS,EAAE,UAA2B;QACtC,aAAa,EAAE,IAAI;QACnB,iBAAiB,EAAE,KAAK;QACxB,mBAAmB,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC;KACtK,CAAC;IAEe,MAAM,CAAS;IACxB,QAAQ,CAAkB;IAElC;QACE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,UAAsB,EAAE,QAAyB;QAClF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAkB,EAAE,CAAC;QAEvC,IAAI,KAAK,GAAG,GAAG,CAAC;QAEhB,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,8BAA8B,CAAC,WAAW,CAAC,CAAC;QACxE,KAAK,IAAI,QAAQ,CAAC,YAAY,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEhC,wCAAwC;QACxC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QACrE,KAAK,IAAI,YAAY,CAAC,YAAY,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEpC,gCAAgC;QAChC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAClE,KAAK,IAAI,YAAY,CAAC,YAAY,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEpC,oCAAoC;QACpC,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC,CAAC;QAEhE,OAAO;YACL,SAAS,EAAE,UAA2B;YACtC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;YACzB,MAAM,EAAE,IAAI;YACZ,MAAM;YACN,YAAY;SACb,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,8BAA8B,CAAC,WAAmB;QAC9D,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAErG,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7C,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;gBAEpD,KAAK,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;oBAClE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBAC9C,MAAM,IAAI,GAAG,IAAW,CAAC;wBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACvD,MAAM,QAAQ,GAAG,WAA4C,CAAC;4BAC9D,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;4BAC/C,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;4BAE3C,MAAM,CAAC,IAAI,CAAC;gCACV,QAAQ,EAAE,CAAC,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAkB;gCAC/F,QAAQ,EAAE,UAA2B;gCACrC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,QAAQ,kCAAkC;gCAC/E,QAAQ,EAAE,cAAc;gCACxB,OAAO,EAAE,IAAI;6BACd,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB,CAAC,WAAmB;QACvD,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAEzC,oCAAoC;YACpC,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAEV,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACxC,CAAC;YAED,4CAA4C;YAC5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAyC,CAAC,IAAI,CAAC,CAAC;gBACtF,YAAY,IAAI,MAAM,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,MAAe;QAC1D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACrD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,iDAAiD;gBACjD,IAAI,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtF,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnE,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,MAAe;QACtD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAEzD,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;gBAC1C,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,OAAO,CAAC,QAAyB;wBAC3C,QAAQ,EAAE,UAA2B;wBACrC,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,QAAQ,EAAE,YAAY;wBACtB,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAAC,WAAmB;QACpD,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,4BAA4B;QAC5B,MAAM,eAAe,GAAG;YACtB,yBAAyB;YACzB,iBAAiB;YACjB,wBAAwB;YACxB,2BAA2B;YAC3B,iBAAiB;SAClB,CAAC;QAEF,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;YACvD,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;YAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;YAEzD,IAAI,kBAAkB,GAAG,KAAK,CAAC;YAE/B,KAAK,MAAM,UAAU,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC;gBACnE,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBACpD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CACjC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC;wBAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CACpC,EAAE,CAAC;wBACF,kBAAkB,GAAG,IAAI,CAAC;wBAC1B,MAAM;oBACR,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;YAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,YAAY,IAAI,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,QAAQ;oBAClB,QAAQ,EAAE,UAAU;oBACpB,WAAW,EAAE,uDAAuD;oBACpE,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,4BAA4B,CAAC,MAAe;QAClD,MAAM,YAAY,GAAkB,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QACtG,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5G,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAE7G,IAAI,MAAM,EAAE,CAAC;YACX,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,UAA6B;gBACnC,WAAW,EAAE,sDAAsD;gBACnE,MAAM,EAAE,UAAoB;gBAC5B,MAAM,EAAE,MAAgB;aACzB,CAAC,CAAC;YACH,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,UAA6B;gBACnC,WAAW,EAAE,iDAAiD;gBAC9D,MAAM,EAAE,UAAoB;gBAC5B,MAAM,EAAE,MAAgB;aACzB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,UAA6B;gBACnC,WAAW,EAAE,uDAAuD;gBACpE,MAAM,EAAE,aAAuB;gBAC/B,MAAM,EAAE,UAAoB;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,UAA6B;gBACnC,WAAW,EAAE,uCAAuC;gBACpD,MAAM,EAAE,OAAiB;gBACzB,MAAM,EAAE,UAAoB;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,UAA6B;YACnC,WAAW,EAAE,oDAAoD;YACjE,MAAM,EAAE,OAAiB;YACzB,MAAM,EAAE,MAAgB;SACzB,CAAC,CAAC;QAEH,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,UAA6B;YACnC,WAAW,EAAE,6CAA6C;YAC1D,MAAM,EAAE,UAAoB;YAC5B,MAAM,EAAE,MAAgB;SACzB,CAAC,CAAC;QAEH,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
|
|
@@ -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"}
|