@girardelli/architect 1.1.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 (66) hide show
  1. package/CONTRIBUTING.md +140 -0
  2. package/LICENSE +21 -0
  3. package/PROJECT_STRUCTURE.txt +168 -0
  4. package/README.md +269 -0
  5. package/dist/analyzer.d.ts +17 -0
  6. package/dist/analyzer.d.ts.map +1 -0
  7. package/dist/analyzer.js +254 -0
  8. package/dist/analyzer.js.map +1 -0
  9. package/dist/anti-patterns.d.ts +17 -0
  10. package/dist/anti-patterns.d.ts.map +1 -0
  11. package/dist/anti-patterns.js +211 -0
  12. package/dist/anti-patterns.js.map +1 -0
  13. package/dist/cli.d.ts +15 -0
  14. package/dist/cli.d.ts.map +1 -0
  15. package/dist/cli.js +164 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/config.d.ts +6 -0
  18. package/dist/config.d.ts.map +1 -0
  19. package/dist/config.js +73 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/diagram.d.ts +9 -0
  22. package/dist/diagram.d.ts.map +1 -0
  23. package/dist/diagram.js +116 -0
  24. package/dist/diagram.js.map +1 -0
  25. package/dist/html-reporter.d.ts +23 -0
  26. package/dist/html-reporter.d.ts.map +1 -0
  27. package/dist/html-reporter.js +454 -0
  28. package/dist/html-reporter.js.map +1 -0
  29. package/dist/index.d.ts +48 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +151 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/reporter.d.ts +13 -0
  34. package/dist/reporter.d.ts.map +1 -0
  35. package/dist/reporter.js +135 -0
  36. package/dist/reporter.js.map +1 -0
  37. package/dist/scanner.d.ts +25 -0
  38. package/dist/scanner.d.ts.map +1 -0
  39. package/dist/scanner.js +288 -0
  40. package/dist/scanner.js.map +1 -0
  41. package/dist/scorer.d.ts +15 -0
  42. package/dist/scorer.d.ts.map +1 -0
  43. package/dist/scorer.js +172 -0
  44. package/dist/scorer.js.map +1 -0
  45. package/dist/types.d.ts +106 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +2 -0
  48. package/dist/types.js.map +1 -0
  49. package/examples/sample-report.md +207 -0
  50. package/jest.config.js +18 -0
  51. package/package.json +70 -0
  52. package/src/analyzer.ts +310 -0
  53. package/src/anti-patterns.ts +264 -0
  54. package/src/cli.ts +183 -0
  55. package/src/config.ts +82 -0
  56. package/src/diagram.ts +144 -0
  57. package/src/html-reporter.ts +485 -0
  58. package/src/index.ts +212 -0
  59. package/src/reporter.ts +166 -0
  60. package/src/scanner.ts +298 -0
  61. package/src/scorer.ts +193 -0
  62. package/src/types.ts +114 -0
  63. package/tests/anti-patterns.test.ts +94 -0
  64. package/tests/scanner.test.ts +55 -0
  65. package/tests/scorer.test.ts +80 -0
  66. package/tsconfig.json +24 -0
package/dist/cli.js ADDED
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Architect CLI
4
+ * Executa análise arquitetural e gera relatórios em múltiplos formatos
5
+ *
6
+ * Uso:
7
+ * npx architect analyze ./src
8
+ * npx architect analyze ./src --format html --output report.html
9
+ * npx architect diagram ./src
10
+ * npx architect score ./src
11
+ * npx architect anti-patterns ./src
12
+ * npx architect layers ./src
13
+ */
14
+ import { architect } from './index.js';
15
+ import { ReportGenerator } from './reporter.js';
16
+ import { HtmlReportGenerator } from './html-reporter.js';
17
+ import { writeFileSync } from 'fs';
18
+ import { resolve, basename } from 'path';
19
+ function parseArgs(args) {
20
+ const command = args[0] || 'analyze';
21
+ const pathArg = args.find((a) => !a.startsWith('--') && a !== command) || '.';
22
+ const formatIdx = args.indexOf('--format');
23
+ const format = (formatIdx >= 0 ? args[formatIdx + 1] : 'html');
24
+ const outputIdx = args.indexOf('--output');
25
+ const output = outputIdx >= 0 ? args[outputIdx + 1] : undefined;
26
+ return { command, path: resolve(pathArg), format, output };
27
+ }
28
+ function printUsage() {
29
+ console.log(`
30
+ 🏗️ Architect — AI-powered architecture analysis
31
+
32
+ Usage:
33
+ architect <command> [path] [options]
34
+
35
+ Commands:
36
+ analyze Full architecture analysis (default)
37
+ diagram Generate architecture diagram only
38
+ score Calculate quality score only
39
+ anti-patterns Detect anti-patterns only
40
+ layers Analyze layer structure only
41
+
42
+ Options:
43
+ --format <type> Output format: html, json, markdown (default: html)
44
+ --output <file> Output file path (default: architect-report.<ext>)
45
+ --help Show this help message
46
+
47
+ Examples:
48
+ architect analyze ./src
49
+ architect analyze ./src --format html --output report.html
50
+ architect score ./src --format json
51
+ architect anti-patterns ./backend/src
52
+ `);
53
+ }
54
+ async function main() {
55
+ const args = process.argv.slice(2);
56
+ if (args.includes('--help') || args.includes('-h') || args.length === 0) {
57
+ printUsage();
58
+ process.exit(0);
59
+ }
60
+ const options = parseArgs(args);
61
+ console.log('🏗️ Architect — Architecture Analysis');
62
+ console.log(`📂 Path: ${options.path}`);
63
+ console.log(`📋 Command: ${options.command}`);
64
+ console.log(`📄 Format: ${options.format}\n`);
65
+ try {
66
+ switch (options.command) {
67
+ case 'analyze': {
68
+ const report = await architect.analyze(options.path);
69
+ const projectName = report.projectInfo.name || basename(options.path);
70
+ if (options.format === 'html') {
71
+ const htmlGenerator = new HtmlReportGenerator();
72
+ const html = htmlGenerator.generateHtml(report);
73
+ const outputPath = options.output || `architect-report-${projectName}.html`;
74
+ writeFileSync(outputPath, html);
75
+ console.log(`✅ HTML report saved to: ${outputPath}`);
76
+ console.log(`📊 Score: ${report.score.overall}/100`);
77
+ console.log(`⚠️ Anti-patterns: ${report.antiPatterns.length}`);
78
+ }
79
+ else if (options.format === 'markdown') {
80
+ const mdGenerator = new ReportGenerator();
81
+ const markdown = mdGenerator.generateMarkdownReport(report);
82
+ const outputPath = options.output || `architect-report-${projectName}.md`;
83
+ writeFileSync(outputPath, markdown);
84
+ console.log(`✅ Markdown report saved to: ${outputPath}`);
85
+ }
86
+ else {
87
+ const outputPath = options.output || `architect-report-${projectName}.json`;
88
+ writeFileSync(outputPath, JSON.stringify(report, null, 2));
89
+ console.log(`✅ JSON report saved to: ${outputPath}`);
90
+ }
91
+ // Print summary to console
92
+ console.log(`\n═══════════════════════════════════════`);
93
+ console.log(` SCORE: ${report.score.overall}/100`);
94
+ console.log(`═══════════════════════════════════════`);
95
+ console.log(`├─ Modularity: ${report.score.breakdown.modularity}`);
96
+ console.log(`├─ Coupling: ${report.score.breakdown.coupling}`);
97
+ console.log(`├─ Cohesion: ${report.score.breakdown.cohesion}`);
98
+ console.log(`└─ Layering: ${report.score.breakdown.layering}`);
99
+ console.log(`\n📁 Files: ${report.projectInfo.totalFiles} | 📝 Lines: ${report.projectInfo.totalLines.toLocaleString()}`);
100
+ console.log(`⚠️ Anti-patterns: ${report.antiPatterns.length}`);
101
+ break;
102
+ }
103
+ case 'diagram': {
104
+ const diagram = await architect.diagram(options.path);
105
+ if (options.output) {
106
+ writeFileSync(options.output, diagram);
107
+ console.log(`✅ Diagram saved to: ${options.output}`);
108
+ }
109
+ else {
110
+ console.log(diagram);
111
+ }
112
+ break;
113
+ }
114
+ case 'score': {
115
+ const score = await architect.score(options.path);
116
+ if (options.format === 'json') {
117
+ console.log(JSON.stringify(score, null, 2));
118
+ }
119
+ else {
120
+ console.log(`Score: ${score.overall}/100`);
121
+ for (const [name, value] of Object.entries(score.breakdown)) {
122
+ console.log(` ${name}: ${value}/100`);
123
+ }
124
+ }
125
+ break;
126
+ }
127
+ case 'anti-patterns': {
128
+ const patterns = await architect.antiPatterns(options.path);
129
+ if (options.format === 'json') {
130
+ console.log(JSON.stringify(patterns, null, 2));
131
+ }
132
+ else {
133
+ console.log(`Found ${patterns.length} anti-pattern(s):\n`);
134
+ for (const p of patterns) {
135
+ console.log(` [${p.severity}] ${p.name}: ${p.description}`);
136
+ }
137
+ }
138
+ break;
139
+ }
140
+ case 'layers': {
141
+ const layers = await architect.layers(options.path);
142
+ if (options.format === 'json') {
143
+ console.log(JSON.stringify(layers, null, 2));
144
+ }
145
+ else {
146
+ for (const l of layers) {
147
+ console.log(`${l.name}: ${l.files.length} files`);
148
+ }
149
+ }
150
+ break;
151
+ }
152
+ default:
153
+ console.error(`❌ Unknown command: ${options.command}`);
154
+ printUsage();
155
+ process.exit(1);
156
+ }
157
+ }
158
+ catch (error) {
159
+ console.error('❌ Error:', error instanceof Error ? error.message : error);
160
+ process.exit(1);
161
+ }
162
+ }
163
+ main();
164
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ArchitectConfig } from './types.js';
2
+ export declare class ConfigLoader {
3
+ static loadConfig(projectPath: string): ArchitectConfig;
4
+ private static mergeConfigs;
5
+ }
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAkC7C,qBAAa,YAAY;IACvB,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe;IAYvD,OAAO,CAAC,MAAM,CAAC,YAAY;CAgC5B"}
package/dist/config.js ADDED
@@ -0,0 +1,73 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ const DEFAULT_CONFIG = {
4
+ ignore: [
5
+ 'node_modules',
6
+ 'dist',
7
+ 'build',
8
+ 'coverage',
9
+ '.git',
10
+ '.next',
11
+ 'venv',
12
+ '__pycache__',
13
+ 'target',
14
+ ],
15
+ frameworks: {
16
+ detect: true,
17
+ },
18
+ antiPatterns: {
19
+ godClass: {
20
+ linesThreshold: 500,
21
+ methodsThreshold: 10,
22
+ },
23
+ shotgunSurgery: {
24
+ changePropagationThreshold: 5,
25
+ },
26
+ },
27
+ score: {
28
+ modularity: 0.4,
29
+ coupling: 0.25,
30
+ cohesion: 0.2,
31
+ layering: 0.15,
32
+ },
33
+ };
34
+ export class ConfigLoader {
35
+ static loadConfig(projectPath) {
36
+ const configPath = join(projectPath, '.architect.json');
37
+ try {
38
+ const content = readFileSync(configPath, 'utf-8');
39
+ const userConfig = JSON.parse(content);
40
+ return this.mergeConfigs(DEFAULT_CONFIG, userConfig);
41
+ }
42
+ catch {
43
+ return DEFAULT_CONFIG;
44
+ }
45
+ }
46
+ static mergeConfigs(defaults, user) {
47
+ return {
48
+ ignore: user.ignore ?? defaults.ignore,
49
+ frameworks: {
50
+ detect: user.frameworks?.detect ?? defaults.frameworks?.detect,
51
+ },
52
+ antiPatterns: {
53
+ godClass: {
54
+ linesThreshold: user.antiPatterns?.godClass?.linesThreshold ??
55
+ defaults.antiPatterns?.godClass?.linesThreshold,
56
+ methodsThreshold: user.antiPatterns?.godClass?.methodsThreshold ??
57
+ defaults.antiPatterns?.godClass?.methodsThreshold,
58
+ },
59
+ shotgunSurgery: {
60
+ changePropagationThreshold: user.antiPatterns?.shotgunSurgery?.changePropagationThreshold ??
61
+ defaults.antiPatterns?.shotgunSurgery?.changePropagationThreshold,
62
+ },
63
+ },
64
+ score: {
65
+ modularity: user.score?.modularity ?? defaults.score?.modularity,
66
+ coupling: user.score?.coupling ?? defaults.score?.coupling,
67
+ cohesion: user.score?.cohesion ?? defaults.score?.cohesion,
68
+ layering: user.score?.layering ?? defaults.score?.layering,
69
+ },
70
+ };
71
+ }
72
+ }
73
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,cAAc,GAAoB;IACtC,MAAM,EAAE;QACN,cAAc;QACd,MAAM;QACN,OAAO;QACP,UAAU;QACV,MAAM;QACN,OAAO;QACP,MAAM;QACN,aAAa;QACb,QAAQ;KACT;IACD,UAAU,EAAE;QACV,MAAM,EAAE,IAAI;KACb;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE;YACR,cAAc,EAAE,GAAG;YACnB,gBAAgB,EAAE,EAAE;SACrB;QACD,cAAc,EAAE;YACd,0BAA0B,EAAE,CAAC;SAC9B;KACF;IACD,KAAK,EAAE;QACL,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,GAAG;QACb,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,UAAU,CAAC,WAAmB;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;YAC1D,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,YAAY,CACzB,QAAyB,EACzB,IAAqB;QAErB,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;YACtC,UAAU,EAAE;gBACV,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,MAAM;aAC/D;YACD,YAAY,EAAE;gBACZ,QAAQ,EAAE;oBACR,cAAc,EACZ,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,cAAc;wBAC3C,QAAQ,CAAC,YAAY,EAAE,QAAQ,EAAE,cAAc;oBACjD,gBAAgB,EACd,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,gBAAgB;wBAC7C,QAAQ,CAAC,YAAY,EAAE,QAAQ,EAAE,gBAAgB;iBACpD;gBACD,cAAc,EAAE;oBACd,0BAA0B,EACxB,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,0BAA0B;wBAC7D,QAAQ,CAAC,YAAY,EAAE,cAAc,EAAE,0BAA0B;iBACpE;aACF;YACD,KAAK,EAAE;gBACL,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,QAAQ,CAAC,KAAK,EAAE,UAAU;gBAChE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ;gBAC1D,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ;gBAC1D,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ;aAC3D;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { DependencyEdge, Layer } from './types.js';
2
+ export declare class DiagramGenerator {
3
+ generateComponentDiagram(edges: DependencyEdge[], layers: Layer[]): string;
4
+ generateLayerDiagram(layers: Layer[]): string;
5
+ generateDependencyFlowDiagram(edges: DependencyEdge[]): string;
6
+ private sanitizeNodeName;
7
+ private getStyleClass;
8
+ }
9
+ //# sourceMappingURL=diagram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram.d.ts","sourceRoot":"","sources":["../src/diagram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnD,qBAAa,gBAAgB;IAC3B,wBAAwB,CACtB,KAAK,EAAE,cAAc,EAAE,EACvB,MAAM,EAAE,KAAK,EAAE,GACd,MAAM;IA8CT,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM;IAqC7C,6BAA6B,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM;IAqC9D,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,aAAa;CAUtB"}
@@ -0,0 +1,116 @@
1
+ export class DiagramGenerator {
2
+ generateComponentDiagram(edges, layers) {
3
+ const nodes = new Set();
4
+ edges.forEach((e) => {
5
+ nodes.add(e.from);
6
+ nodes.add(e.to);
7
+ });
8
+ const nodeColors = {};
9
+ for (const layer of layers) {
10
+ for (const file of layer.files) {
11
+ const moduleName = file.split('/').pop() || file;
12
+ const colorMap = {
13
+ API: '#FFB6C1',
14
+ Service: '#87CEEB',
15
+ Data: '#90EE90',
16
+ UI: '#FFD700',
17
+ Infrastructure: '#D3D3D3',
18
+ };
19
+ nodeColors[moduleName] = colorMap[layer.name] || '#FFFFFF';
20
+ }
21
+ }
22
+ let mermaid = 'graph TB\n';
23
+ for (const node of Array.from(nodes).slice(0, 20)) {
24
+ const moduleName = node.split('/').pop() || node;
25
+ const color = nodeColors[moduleName] || '#FFFFFF';
26
+ mermaid += ` ${this.sanitizeNodeName(node)}["${moduleName}"]:::${this.getStyleClass(color)}\n`;
27
+ }
28
+ mermaid += '\n';
29
+ for (const edge of edges.slice(0, 30)) {
30
+ mermaid += ` ${this.sanitizeNodeName(edge.from)} --> ${this.sanitizeNodeName(edge.to)}\n`;
31
+ }
32
+ mermaid += '\n';
33
+ mermaid += ' classDef apiStyle fill:#FFB6C1,stroke:#333,color:#000\n';
34
+ mermaid += ' classDef serviceStyle fill:#87CEEB,stroke:#333,color:#000\n';
35
+ mermaid += ' classDef dataStyle fill:#90EE90,stroke:#333,color:#000\n';
36
+ mermaid += ' classDef uiStyle fill:#FFD700,stroke:#333,color:#000\n';
37
+ mermaid += ' classDef infraStyle fill:#D3D3D3,stroke:#333,color:#000\n';
38
+ return mermaid;
39
+ }
40
+ generateLayerDiagram(layers) {
41
+ let mermaid = 'graph LR\n';
42
+ const layerOrder = ['UI', 'API', 'Service', 'Data', 'Infrastructure'];
43
+ const colorMap = {
44
+ UI: 'uiStyle',
45
+ API: 'apiStyle',
46
+ Service: 'serviceStyle',
47
+ Data: 'dataStyle',
48
+ Infrastructure: 'infraStyle',
49
+ };
50
+ for (const layerName of layerOrder) {
51
+ const layer = layers.find((l) => l.name === layerName);
52
+ if (layer && layer.files.length > 0) {
53
+ const nodeId = layerName.replace(/\s+/g, '_');
54
+ const fileCount = layer.files.length;
55
+ mermaid += ` ${nodeId}["${layerName}<br/>(${fileCount} files)"]:::${colorMap[layerName]}\n`;
56
+ }
57
+ }
58
+ for (let i = 0; i < layerOrder.length - 1; i++) {
59
+ const from = layerOrder[i].replace(/\s+/g, '_');
60
+ const to = layerOrder[i + 1].replace(/\s+/g, '_');
61
+ mermaid += ` ${from} --> ${to}\n`;
62
+ }
63
+ mermaid += '\n';
64
+ mermaid += ' classDef apiStyle fill:#FFB6C1,stroke:#333,color:#000\n';
65
+ mermaid += ' classDef serviceStyle fill:#87CEEB,stroke:#333,color:#000\n';
66
+ mermaid += ' classDef dataStyle fill:#90EE90,stroke:#333,color:#000\n';
67
+ mermaid += ' classDef uiStyle fill:#FFD700,stroke:#333,color:#000\n';
68
+ mermaid += ' classDef infraStyle fill:#D3D3D3,stroke:#333,color:#000\n';
69
+ return mermaid;
70
+ }
71
+ generateDependencyFlowDiagram(edges) {
72
+ const flowMap = {};
73
+ for (const edge of edges) {
74
+ const flowKey = `${edge.from} -> ${edge.to}`;
75
+ flowMap[flowKey] = (flowMap[flowKey] || 0) + edge.weight;
76
+ }
77
+ const topFlows = Object.entries(flowMap)
78
+ .sort((a, b) => b[1] - a[1])
79
+ .slice(0, 15);
80
+ let mermaid = 'graph LR\n';
81
+ const nodes = new Set();
82
+ for (const [flow] of topFlows) {
83
+ const [from, _, to] = flow.split(' ');
84
+ nodes.add(from);
85
+ nodes.add(to);
86
+ }
87
+ for (const node of nodes) {
88
+ const moduleName = node.split('/').pop() || node;
89
+ mermaid += ` ${this.sanitizeNodeName(node)}["${moduleName}"]\n`;
90
+ }
91
+ mermaid += '\n';
92
+ for (const [flow, weight] of topFlows) {
93
+ const [from, _, to] = flow.split(' ');
94
+ const label = weight > 1 ? ` | ${weight}` : '';
95
+ mermaid += ` ${this.sanitizeNodeName(from)} -->|${label}| ${this.sanitizeNodeName(to)}\n`;
96
+ }
97
+ return mermaid;
98
+ }
99
+ sanitizeNodeName(path) {
100
+ return path
101
+ .replace(/[^a-zA-Z0-9]/g, '_')
102
+ .replace(/_+/g, '_')
103
+ .toLowerCase();
104
+ }
105
+ getStyleClass(color) {
106
+ const classMap = {
107
+ '#FFB6C1': 'apiStyle',
108
+ '#87CEEB': 'serviceStyle',
109
+ '#90EE90': 'dataStyle',
110
+ '#FFD700': 'uiStyle',
111
+ '#D3D3D3': 'infraStyle',
112
+ };
113
+ return classMap[color] || 'defaultStyle';
114
+ }
115
+ }
116
+ //# sourceMappingURL=diagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram.js","sourceRoot":"","sources":["../src/diagram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { AnalysisReport } from './types.js';
2
+ /**
3
+ * Gera relatórios HTML visuais premium a partir de AnalysisReport
4
+ */
5
+ export declare class HtmlReportGenerator {
6
+ generateHtml(report: AnalysisReport): string;
7
+ private scoreColor;
8
+ private scoreEmoji;
9
+ private scoreLabel;
10
+ private escapeHtml;
11
+ private groupAntiPatterns;
12
+ private groupSuggestions;
13
+ private renderHeader;
14
+ private renderScoreHero;
15
+ private renderStats;
16
+ private renderLayers;
17
+ private renderAntiPatterns;
18
+ private renderDiagram;
19
+ private renderSuggestions;
20
+ private renderFooter;
21
+ private getStyles;
22
+ }
23
+ //# sourceMappingURL=html-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-reporter.d.ts","sourceRoot":"","sources":["../src/html-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAEzD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IA+B5C,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,kBAAkB;IA+C1B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,iBAAiB;IAsCzB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,SAAS;CA6KlB"}