docstodev 1.0.2 → 1.0.3
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/package.json +1 -1
- package/src/ai/analyzer.ts +3 -1
- package/src/analyzers/languageAnalyzer.ts +297 -5
- package/src/commands/generateSummary.ts +129 -39
- package/src/exporters/html.ts +134 -52
- package/.env +0 -1
- package/dist/ai/analyzer.d.ts +0 -3
- package/dist/ai/analyzer.d.ts.map +0 -1
- package/dist/ai/analyzer.js +0 -43
- package/dist/ai/analyzer.js.map +0 -1
- package/dist/analyzers/languageAnalyzer.d.ts +0 -18
- package/dist/analyzers/languageAnalyzer.d.ts.map +0 -1
- package/dist/analyzers/languageAnalyzer.js +0 -251
- package/dist/analyzers/languageAnalyzer.js.map +0 -1
- package/dist/cache/cacheManager.d.ts +0 -38
- package/dist/cache/cacheManager.d.ts.map +0 -1
- package/dist/cache/cacheManager.js +0 -141
- package/dist/cache/cacheManager.js.map +0 -1
- package/dist/cli/index.d.ts +0 -3
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -316
- package/dist/cli/index.js.map +0 -1
- package/dist/commands/classify.d.ts +0 -2
- package/dist/commands/classify.d.ts.map +0 -1
- package/dist/commands/classify.js +0 -37
- package/dist/commands/classify.js.map +0 -1
- package/dist/commands/generateSummary.d.ts +0 -5
- package/dist/commands/generateSummary.d.ts.map +0 -1
- package/dist/commands/generateSummary.js +0 -54
- package/dist/commands/generateSummary.js.map +0 -1
- package/dist/commands/run.d.ts +0 -5
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/run.js +0 -326
- package/dist/commands/run.js.map +0 -1
- package/dist/exporters/html.d.ts +0 -6
- package/dist/exporters/html.d.ts.map +0 -1
- package/dist/exporters/html.js +0 -517
- package/dist/exporters/html.js.map +0 -1
- package/src/commands/classify.ts +0 -40
package/src/exporters/html.ts
CHANGED
|
@@ -55,10 +55,10 @@ export function exportToHTML(
|
|
|
55
55
|
if (
|
|
56
56
|
processed.match(/^[│├└─\s]+/) ||
|
|
57
57
|
processed.includes("/") ||
|
|
58
|
-
processed.match(/\.(ts|js|py|java|cs|go|rs|tsx|jsx)$/)
|
|
58
|
+
processed.match(/\.(ts|js|py|java|cs|go|rs|tsx|jsx|html|css|php|rb|sql)$/)
|
|
59
59
|
) {
|
|
60
|
-
const hasFile = processed.match(/\.(ts|js|py|java|cs|go|rs|tsx|jsx)$/);
|
|
61
|
-
const fileMatch = hasFile ? processed.match(/([\w-]+\.(ts|js|py|java|cs|go|rs|tsx|jsx))/)?.[0] : null;
|
|
60
|
+
const hasFile = processed.match(/\.(ts|js|py|java|cs|go|rs|tsx|jsx|html|css|php|rb|sql)$/);
|
|
61
|
+
const fileMatch = hasFile ? processed.match(/([\w-]+\.(ts|js|py|java|cs|go|rs|tsx|jsx|html|css|php|rb|sql))/)?.[0] : null;
|
|
62
62
|
|
|
63
63
|
let treeLine = line
|
|
64
64
|
.replace(/├─/g, '<span class="branch">├─</span>')
|
|
@@ -104,10 +104,9 @@ export function exportToHTML(
|
|
|
104
104
|
|
|
105
105
|
if (inSection) htmlResult += "</section>";
|
|
106
106
|
|
|
107
|
-
//
|
|
107
|
+
// Nettoyer et valider les graphes Mermaid
|
|
108
|
+
const cleanMermaidGraph = sanitizeMermaidGraph(mermaidGraph || "graph TD\n Root[Projet]");
|
|
108
109
|
const hierarchyGraph = fileTree ? generateHierarchyGraph(fileTree) : getDefaultHierarchyGraph();
|
|
109
|
-
|
|
110
|
-
// Générer le flux de données (peut être personnalisé selon les imports/exports)
|
|
111
110
|
const dataFlowGraph = generateDataFlowGraph();
|
|
112
111
|
|
|
113
112
|
const html = `<!DOCTYPE html>
|
|
@@ -115,10 +114,38 @@ export function exportToHTML(
|
|
|
115
114
|
<head>
|
|
116
115
|
<meta charset="UTF-8">
|
|
117
116
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
118
|
-
<title>DocsToDev – Rapport Technique</title>
|
|
117
|
+
<title>DocsToDev – ${lang === 'fr' ? 'Rapport Technique' : 'Technical Report'}</title>
|
|
119
118
|
|
|
120
119
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400&family=Fira+Code&display=swap" rel="stylesheet">
|
|
121
|
-
<script
|
|
120
|
+
<script type="module">
|
|
121
|
+
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
|
|
122
|
+
|
|
123
|
+
mermaid.initialize({
|
|
124
|
+
startOnLoad: true,
|
|
125
|
+
theme: document.documentElement.dataset.theme === "dark" ? "dark" : "default",
|
|
126
|
+
securityLevel: 'loose',
|
|
127
|
+
logLevel: 'error',
|
|
128
|
+
themeVariables: {
|
|
129
|
+
darkMode: document.documentElement.dataset.theme === "dark",
|
|
130
|
+
background: "transparent",
|
|
131
|
+
primaryColor: "#58a6ff",
|
|
132
|
+
primaryTextColor: "#c9d1d9",
|
|
133
|
+
primaryBorderColor: "#30363d",
|
|
134
|
+
lineColor: "#8b949e",
|
|
135
|
+
secondaryColor: "#161b22",
|
|
136
|
+
tertiaryColor: "#0d1117",
|
|
137
|
+
fontSize: "14px",
|
|
138
|
+
fontFamily: "Inter, sans-serif"
|
|
139
|
+
},
|
|
140
|
+
flowchart: {
|
|
141
|
+
useMaxWidth: true,
|
|
142
|
+
htmlLabels: true,
|
|
143
|
+
curve: 'basis'
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
window.mermaid = mermaid;
|
|
148
|
+
</script>
|
|
122
149
|
|
|
123
150
|
<style>
|
|
124
151
|
:root[data-theme="dark"] {
|
|
@@ -250,6 +277,8 @@ h3 {
|
|
|
250
277
|
border: 1px solid var(--border);
|
|
251
278
|
background: var(--card);
|
|
252
279
|
padding: 1.5rem;
|
|
280
|
+
min-height: 300px;
|
|
281
|
+
position: relative;
|
|
253
282
|
}
|
|
254
283
|
|
|
255
284
|
.graph-title {
|
|
@@ -261,6 +290,12 @@ h3 {
|
|
|
261
290
|
font-size: 0.85rem;
|
|
262
291
|
}
|
|
263
292
|
|
|
293
|
+
.mermaid-wrapper {
|
|
294
|
+
width: 100%;
|
|
295
|
+
overflow-x: auto;
|
|
296
|
+
overflow-y: hidden;
|
|
297
|
+
}
|
|
298
|
+
|
|
264
299
|
.component {
|
|
265
300
|
border: 1px solid var(--border);
|
|
266
301
|
background: var(--card);
|
|
@@ -372,7 +407,25 @@ mark {
|
|
|
372
407
|
|
|
373
408
|
.mermaid {
|
|
374
409
|
background: transparent;
|
|
375
|
-
|
|
410
|
+
display: flex;
|
|
411
|
+
justify-content: center;
|
|
412
|
+
align-items: center;
|
|
413
|
+
min-height: 200px;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.mermaid svg {
|
|
417
|
+
max-width: 100%;
|
|
418
|
+
height: auto;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
.error-message {
|
|
422
|
+
color: #f85149;
|
|
423
|
+
padding: 1rem;
|
|
424
|
+
background: rgba(248, 81, 73, 0.1);
|
|
425
|
+
border: 1px solid rgba(248, 81, 73, 0.3);
|
|
426
|
+
border-radius: 4px;
|
|
427
|
+
font-family: "Fira Code", monospace;
|
|
428
|
+
font-size: 0.9rem;
|
|
376
429
|
}
|
|
377
430
|
|
|
378
431
|
@media print {
|
|
@@ -425,23 +478,29 @@ mark {
|
|
|
425
478
|
<div class="graphs-grid">
|
|
426
479
|
<div class="graph-container">
|
|
427
480
|
<div class="graph-title">${lang === 'fr' ? 'Graphe des dépendances' : 'Dependency Graph'}</div>
|
|
428
|
-
<div class="mermaid">
|
|
429
|
-
|
|
481
|
+
<div class="mermaid-wrapper">
|
|
482
|
+
<pre class="mermaid">
|
|
483
|
+
${cleanMermaidGraph}
|
|
484
|
+
</pre>
|
|
430
485
|
</div>
|
|
431
486
|
</div>
|
|
432
487
|
|
|
433
488
|
<div class="graph-container">
|
|
434
489
|
<div class="graph-title">${lang === 'fr' ? 'Structure du projet' : 'Project Structure'}</div>
|
|
435
|
-
<div class="mermaid">
|
|
490
|
+
<div class="mermaid-wrapper">
|
|
491
|
+
<pre class="mermaid">
|
|
436
492
|
${hierarchyGraph}
|
|
493
|
+
</pre>
|
|
437
494
|
</div>
|
|
438
495
|
</div>
|
|
439
496
|
</div>
|
|
440
497
|
|
|
441
498
|
<div class="graph-container" style="margin-bottom: 3rem;">
|
|
442
499
|
<div class="graph-title">${lang === 'fr' ? 'Flux de données' : 'Data Flow'}</div>
|
|
443
|
-
<div class="mermaid">
|
|
500
|
+
<div class="mermaid-wrapper">
|
|
501
|
+
<pre class="mermaid">
|
|
444
502
|
${dataFlowGraph}
|
|
503
|
+
</pre>
|
|
445
504
|
</div>
|
|
446
505
|
</div>
|
|
447
506
|
|
|
@@ -450,34 +509,12 @@ ${dataFlowGraph}
|
|
|
450
509
|
</div>
|
|
451
510
|
|
|
452
511
|
<script>
|
|
453
|
-
document.addEventListener("DOMContentLoaded", () => {
|
|
454
|
-
if (window.mermaid) {
|
|
455
|
-
mermaid.initialize({
|
|
456
|
-
startOnLoad: true,
|
|
457
|
-
theme: document.documentElement.dataset.theme === "dark" ? "dark" : "default",
|
|
458
|
-
themeVariables: {
|
|
459
|
-
darkMode: document.documentElement.dataset.theme === "dark",
|
|
460
|
-
background: "transparent",
|
|
461
|
-
primaryColor: "#58a6ff",
|
|
462
|
-
primaryTextColor: "#c9d1d9",
|
|
463
|
-
primaryBorderColor: "#30363d",
|
|
464
|
-
lineColor: "#8b949e",
|
|
465
|
-
secondaryColor: "#161b22",
|
|
466
|
-
tertiaryColor: "#0d1117"
|
|
467
|
-
}
|
|
468
|
-
});
|
|
469
|
-
}
|
|
470
|
-
});
|
|
471
|
-
|
|
472
512
|
function toggleTheme() {
|
|
473
513
|
const root = document.documentElement;
|
|
474
514
|
const next = root.dataset.theme === "dark" ? "light" : "dark";
|
|
475
515
|
root.dataset.theme = next;
|
|
476
516
|
localStorage.setItem("theme", next);
|
|
477
|
-
|
|
478
|
-
if (window.mermaid) {
|
|
479
|
-
location.reload();
|
|
480
|
-
}
|
|
517
|
+
location.reload();
|
|
481
518
|
}
|
|
482
519
|
|
|
483
520
|
document.documentElement.dataset.theme = localStorage.getItem("theme") || "dark";
|
|
@@ -493,12 +530,26 @@ document.getElementById("search").addEventListener("input", e => {
|
|
|
493
530
|
return;
|
|
494
531
|
}
|
|
495
532
|
|
|
496
|
-
const regex = new RegExp("(" + term.replace(/[
|
|
533
|
+
const regex = new RegExp("(" + term.replace(/[.*+?^\${}()|[\\]\\\\]/g, "\\\\$&") + ")", "gi");
|
|
497
534
|
container.innerHTML = originalHTML.replace(regex, "<mark>$1</mark>");
|
|
498
535
|
|
|
499
536
|
const first = container.querySelector("mark");
|
|
500
537
|
if (first) first.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
501
538
|
});
|
|
539
|
+
|
|
540
|
+
// Gestion d'erreur Mermaid
|
|
541
|
+
window.addEventListener('load', () => {
|
|
542
|
+
setTimeout(() => {
|
|
543
|
+
document.querySelectorAll('.mermaid').forEach(el => {
|
|
544
|
+
if (!el.querySelector('svg') && !el.querySelector('.error-message')) {
|
|
545
|
+
const errorMsg = document.createElement('div');
|
|
546
|
+
errorMsg.className = 'error-message';
|
|
547
|
+
errorMsg.textContent = '${lang === 'fr' ? 'Erreur de rendu du graphe' : 'Graph rendering error'}';
|
|
548
|
+
el.appendChild(errorMsg);
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
}, 3000);
|
|
552
|
+
});
|
|
502
553
|
</script>
|
|
503
554
|
|
|
504
555
|
</body>
|
|
@@ -507,20 +558,46 @@ document.getElementById("search").addEventListener("input", e => {
|
|
|
507
558
|
writeFileSync(path.join(docsDir, "report.html"), html);
|
|
508
559
|
}
|
|
509
560
|
|
|
561
|
+
function sanitizeMermaidGraph(graph: string): string {
|
|
562
|
+
// Nettoyer les caractères problématiques
|
|
563
|
+
let cleaned = graph
|
|
564
|
+
.replace(/[""]/g, '"')
|
|
565
|
+
.replace(/['']/g, "'")
|
|
566
|
+
.replace(/\u00A0/g, ' ') // Espaces insécables
|
|
567
|
+
.trim();
|
|
568
|
+
|
|
569
|
+
// Vérifier que le graphe a une déclaration valide
|
|
570
|
+
if (!cleaned.match(/^(graph|flowchart|sequenceDiagram|classDiagram|stateDiagram|gantt|pie|erDiagram)/)) {
|
|
571
|
+
cleaned = "graph TD\n " + cleaned;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// Limiter la complexité si trop de nœuds
|
|
575
|
+
const lines = cleaned.split('\n');
|
|
576
|
+
if (lines.length > 50) {
|
|
577
|
+
cleaned = lines.slice(0, 50).join('\n') + '\n More["..."]';
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
return cleaned;
|
|
581
|
+
}
|
|
582
|
+
|
|
510
583
|
function generateHierarchyGraph(tree: TreeStructure, maxDepth = 3): string {
|
|
511
584
|
let graph = "graph TD\n";
|
|
512
585
|
let nodeId = 0;
|
|
513
586
|
const nodeMap = new Map<string, string>();
|
|
514
587
|
|
|
588
|
+
function sanitizeLabel(label: string): string {
|
|
589
|
+
return label.replace(/["\[\]]/g, '');
|
|
590
|
+
}
|
|
591
|
+
|
|
515
592
|
function traverse(obj: TreeStructure, parentId: string | null, depth: number, prefix = ""): void {
|
|
516
593
|
if (depth > maxDepth) return;
|
|
517
594
|
|
|
518
|
-
const entries = Object.entries(obj).slice(0,
|
|
595
|
+
const entries = Object.entries(obj).slice(0, 10); // Limiter pour lisibilité
|
|
519
596
|
|
|
520
597
|
entries.forEach(([key, value]) => {
|
|
521
598
|
const currentId = `node${nodeId++}`;
|
|
522
599
|
const isFolder = value && typeof value === 'object' && Object.keys(value).length > 0;
|
|
523
|
-
const label = isFolder ? `${key}/` : key;
|
|
600
|
+
const label = sanitizeLabel(isFolder ? `${key}/` : key);
|
|
524
601
|
|
|
525
602
|
nodeMap.set(currentId, label);
|
|
526
603
|
graph += ` ${currentId}["${label}"]\n`;
|
|
@@ -529,30 +606,35 @@ function generateHierarchyGraph(tree: TreeStructure, maxDepth = 3): string {
|
|
|
529
606
|
graph += ` ${parentId} --> ${currentId}\n`;
|
|
530
607
|
}
|
|
531
608
|
|
|
532
|
-
if (isFolder && value) {
|
|
609
|
+
if (isFolder && value && depth < maxDepth) {
|
|
533
610
|
traverse(value, currentId, depth + 1, prefix + key + "/");
|
|
534
611
|
}
|
|
535
612
|
});
|
|
536
613
|
}
|
|
537
614
|
|
|
538
|
-
|
|
539
|
-
|
|
615
|
+
try {
|
|
616
|
+
traverse(tree, null, 0);
|
|
617
|
+
return graph || getDefaultHierarchyGraph();
|
|
618
|
+
} catch (e) {
|
|
619
|
+
console.error("Error generating hierarchy graph:", e);
|
|
620
|
+
return getDefaultHierarchyGraph();
|
|
621
|
+
}
|
|
540
622
|
}
|
|
541
623
|
|
|
542
624
|
function getDefaultHierarchyGraph(): string {
|
|
543
625
|
return `graph TD
|
|
544
|
-
A[Root] --> B[src]
|
|
545
|
-
A --> C[config]
|
|
546
|
-
B --> D[components]
|
|
547
|
-
B --> E[utils]
|
|
548
|
-
B --> F[services]`;
|
|
626
|
+
A["Root"] --> B["src"]
|
|
627
|
+
A --> C["config"]
|
|
628
|
+
B --> D["components"]
|
|
629
|
+
B --> E["utils"]
|
|
630
|
+
B --> F["services"]`;
|
|
549
631
|
}
|
|
550
632
|
|
|
551
633
|
function generateDataFlowGraph(): string {
|
|
552
634
|
return `graph LR
|
|
553
|
-
A[Input] --> B[Analyzer]
|
|
554
|
-
B --> C[Parser]
|
|
555
|
-
C --> D[Generator]
|
|
556
|
-
D --> E[Exporter]
|
|
557
|
-
E --> F[Output]`;
|
|
635
|
+
A["Input"] --> B["Analyzer"]
|
|
636
|
+
B --> C["Parser"]
|
|
637
|
+
C --> D["Generator"]
|
|
638
|
+
D --> E["Exporter"]
|
|
639
|
+
E --> F["Output"]`;
|
|
558
640
|
}
|
package/.env
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
GROQ_API_KEY=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
|
package/dist/ai/analyzer.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/ai/analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,CAAC;AAEvB,wBAAsB,KAAK,CAAC,gBAAgB,EAAE,MAAM,gBA2CnD"}
|
package/dist/ai/analyzer.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
// Emplacement absolu : M:\workspace\extensions\docstodev\src\ai\analyzer.ts
|
|
2
|
-
import "dotenv/config"; // Pour lire GROQ_API_KEY dans ton .env
|
|
3
|
-
export async function askAI(technicalContext) {
|
|
4
|
-
// clé par défaut gratuite
|
|
5
|
-
const GROQ_API_KEY = process.env.GROQ_API_KEY || "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";
|
|
6
|
-
if (!GROQ_API_KEY) {
|
|
7
|
-
return "⚠️ Erreur : Clé API Groq manquante dans le fichier .env";
|
|
8
|
-
}
|
|
9
|
-
const systemPrompt = `
|
|
10
|
-
Vous êtes MakazouIA, l'assistant IA de DocsToDev, créé par Chadrack Massamba (EsporDev).
|
|
11
|
-
Votre mission : Transformer des données techniques brutes en descriptions métier claires.
|
|
12
|
-
|
|
13
|
-
Instructions :
|
|
14
|
-
- Vous allez recevoir une liste de fichiers, leurs rôles et leurs exports.
|
|
15
|
-
- Pour chaque fichier, rédigez UNE SEULE phrase concise expliquant sa responsabilité métier.
|
|
16
|
-
- Soyez pro, mais gardez votre touche amicale et votre pointe d'humour du Congo-Brazzaville.
|
|
17
|
-
- Ne mentionnez pas de code technique (pas de "il y a une fonction X"), expliquez le BUT du fichier.
|
|
18
|
-
`;
|
|
19
|
-
try {
|
|
20
|
-
const resp = await fetch("https://api.groq.com/openai/v1/chat/completions", {
|
|
21
|
-
method: "POST",
|
|
22
|
-
headers: {
|
|
23
|
-
Authorization: `Bearer ${GROQ_API_KEY}`,
|
|
24
|
-
"Content-Type": "application/json",
|
|
25
|
-
},
|
|
26
|
-
body: JSON.stringify({
|
|
27
|
-
model: "llama-3.3-70b-versatile",
|
|
28
|
-
messages: [
|
|
29
|
-
{ role: "system", content: systemPrompt },
|
|
30
|
-
{ role: "user", content: `Voici les données techniques du projet : \n${technicalContext}` }
|
|
31
|
-
],
|
|
32
|
-
temperature: 0.7,
|
|
33
|
-
}),
|
|
34
|
-
});
|
|
35
|
-
const data = await resp.json();
|
|
36
|
-
return data.choices?.[0]?.message?.content || "Désolé, je n'ai pas pu analyser ce fichier.";
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
console.error("Erreur IA:", error);
|
|
40
|
-
return "Erreur lors de la connexion à l'intelligence artificielle.";
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=analyzer.js.map
|
package/dist/ai/analyzer.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/ai/analyzer.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,eAAe,CAAC,CAAC,uCAAuC;AAE/D,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,gBAAwB;IAEhD,0BAA0B;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,0DAA0D,CAAC;IAE5G,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,yDAAyD,CAAC;IACrE,CAAC;IAED,MAAM,YAAY,GAAG;;;;;;;;;CASxB,CAAC;IAEE,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,iDAAiD,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,aAAa,EAAE,UAAU,YAAY,EAAE;gBACvC,cAAc,EAAE,kBAAkB;aACrC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACjB,KAAK,EAAE,yBAAyB;gBAChC,QAAQ,EAAE;oBACN,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;oBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,8CAA8C,gBAAgB,EAAE,EAAE;iBAC9F;gBACD,WAAW,EAAE,GAAG;aACnB,CAAC;SACL,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,6CAA6C,CAAC;IAChG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,4DAA4D,CAAC;IACxE,CAAC;AACL,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export interface LanguageAnalyzer {
|
|
2
|
-
extensions: string[];
|
|
3
|
-
analyzeFile(content: string): FileAnalysisResult;
|
|
4
|
-
}
|
|
5
|
-
export interface FileAnalysisResult {
|
|
6
|
-
functions: string[];
|
|
7
|
-
classes: string[];
|
|
8
|
-
types: string[];
|
|
9
|
-
imports: Array<{
|
|
10
|
-
name: string;
|
|
11
|
-
type: string;
|
|
12
|
-
usage?: string | undefined;
|
|
13
|
-
}>;
|
|
14
|
-
exports: string[];
|
|
15
|
-
}
|
|
16
|
-
export declare function getAnalyzer(filePath: string): LanguageAnalyzer | null;
|
|
17
|
-
export declare function getSupportedExtensions(): string[];
|
|
18
|
-
//# sourceMappingURL=languageAnalyzer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"languageAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/languageAnalyzer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAAC;CAClD;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IAC3E,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA2QD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAKrE;AAED,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD"}
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
// Analyseur TypeScript/JavaScript
|
|
2
|
-
class TSJSAnalyzer {
|
|
3
|
-
extensions = [".ts", ".js", ".tsx", ".jsx", ".mjs", ".cjs"];
|
|
4
|
-
analyzeFile(content) {
|
|
5
|
-
const exports = [];
|
|
6
|
-
const exportRegex = /export\s+(?:default\s+)?(?:async\s+)?(?:function|const|let|class|type|interface|enum)\s+([a-zA-Z0-9_]+)/g;
|
|
7
|
-
let match;
|
|
8
|
-
while ((match = exportRegex.exec(content)) !== null) {
|
|
9
|
-
if (match[1])
|
|
10
|
-
exports.push(match[1]);
|
|
11
|
-
}
|
|
12
|
-
const functions = [];
|
|
13
|
-
const funcRegex = /(?:export\s+)?(?:async\s+)?function\s+([a-zA-Z0-9_]+)/g;
|
|
14
|
-
// Resetting regex because of global flag
|
|
15
|
-
funcRegex.lastIndex = 0;
|
|
16
|
-
while ((match = funcRegex.exec(content)) !== null) {
|
|
17
|
-
if (match[1])
|
|
18
|
-
functions.push(match[1]);
|
|
19
|
-
}
|
|
20
|
-
const arrowRegex = /(?:export\s+)?const\s+([a-zA-Z0-9_]+)\s*=\s*(?:async\s*)?\([^)]*\)\s*=>/g;
|
|
21
|
-
while ((match = arrowRegex.exec(content)) !== null) {
|
|
22
|
-
if (match[1])
|
|
23
|
-
functions.push(match[1]);
|
|
24
|
-
}
|
|
25
|
-
const classes = [];
|
|
26
|
-
const classRegex = /(?:export\s+)?(?:abstract\s+)?class\s+([a-zA-Z0-9_]+)/g;
|
|
27
|
-
while ((match = classRegex.exec(content)) !== null) {
|
|
28
|
-
if (match[1])
|
|
29
|
-
classes.push(match[1]);
|
|
30
|
-
}
|
|
31
|
-
const types = [];
|
|
32
|
-
const typeRegex = /(?:export\s+)?(?:type|interface)\s+([a-zA-Z0-9_]+)/g;
|
|
33
|
-
while ((match = typeRegex.exec(content)) !== null) {
|
|
34
|
-
if (match[1])
|
|
35
|
-
types.push(match[1]);
|
|
36
|
-
}
|
|
37
|
-
const imports = [];
|
|
38
|
-
const lines = content.split(/\r?\n/);
|
|
39
|
-
const importLines = lines.filter(l => l.trim().startsWith("import "));
|
|
40
|
-
importLines.forEach(line => {
|
|
41
|
-
const fromMatch = line.match(/from ['"]([^'"]+)['"]/);
|
|
42
|
-
if (fromMatch?.[1]) {
|
|
43
|
-
const name = fromMatch[1];
|
|
44
|
-
const type = name.startsWith('.') ? 'Interne' : (name.startsWith('node:') ? 'Node.js' : 'NPM');
|
|
45
|
-
const importedMatch = line.match(/import\s+(?:\{([^}]+)\}|(\w+))/);
|
|
46
|
-
let usage = undefined;
|
|
47
|
-
if (importedMatch) {
|
|
48
|
-
const items = importedMatch[1] || importedMatch[2];
|
|
49
|
-
usage = items?.trim().split(',').map(s => s.trim()).join(', ');
|
|
50
|
-
}
|
|
51
|
-
imports.push({ name, type, usage });
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
return { functions, classes, types, imports, exports };
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
// Analyseur Python
|
|
58
|
-
class PythonAnalyzer {
|
|
59
|
-
extensions = [".py"];
|
|
60
|
-
analyzeFile(content) {
|
|
61
|
-
const functions = [];
|
|
62
|
-
const funcRegex = /def\s+([a-zA-Z0-9_]+)\s*\(/g;
|
|
63
|
-
let match;
|
|
64
|
-
while ((match = funcRegex.exec(content)) !== null) {
|
|
65
|
-
if (match[1] && !match[1].startsWith('__'))
|
|
66
|
-
functions.push(match[1]);
|
|
67
|
-
}
|
|
68
|
-
const classes = [];
|
|
69
|
-
const classRegex = /class\s+([a-zA-Z0-9_]+)(?:\(|:)/g;
|
|
70
|
-
while ((match = classRegex.exec(content)) !== null) {
|
|
71
|
-
if (match[1])
|
|
72
|
-
classes.push(match[1]);
|
|
73
|
-
}
|
|
74
|
-
const imports = [];
|
|
75
|
-
const lines = content.split(/\r?\n/);
|
|
76
|
-
lines.forEach(line => {
|
|
77
|
-
const importMatch = line.match(/^import\s+([a-zA-Z0-9_., ]+)/);
|
|
78
|
-
const fromMatch = line.match(/^from\s+([a-zA-Z0-9_.]+)\s+import\s+(.+)/);
|
|
79
|
-
if (importMatch?.[1]) {
|
|
80
|
-
const modules = importMatch[1].split(',').map(m => m.trim());
|
|
81
|
-
modules.forEach(mod => {
|
|
82
|
-
const type = mod.startsWith('.') ? 'Interne' : 'PyPI';
|
|
83
|
-
imports.push({ name: mod, type });
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
else if (fromMatch?.[1]) {
|
|
87
|
-
const moduleName = fromMatch[1];
|
|
88
|
-
const imported = fromMatch[2]?.trim();
|
|
89
|
-
const type = moduleName.startsWith('.') ? 'Interne' : 'PyPI';
|
|
90
|
-
imports.push({ name: moduleName, type, usage: imported });
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
return { functions, classes, types: [], imports, exports: [] };
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// Analyseur Java
|
|
97
|
-
class JavaAnalyzer {
|
|
98
|
-
extensions = [".java"];
|
|
99
|
-
analyzeFile(content) {
|
|
100
|
-
const classes = [];
|
|
101
|
-
const classRegex = /(?:public\s+)?(?:abstract\s+)?class\s+([a-zA-Z0-9_]+)/g;
|
|
102
|
-
let match;
|
|
103
|
-
while ((match = classRegex.exec(content)) !== null) {
|
|
104
|
-
if (match[1])
|
|
105
|
-
classes.push(match[1]);
|
|
106
|
-
}
|
|
107
|
-
const interfaceRegex = /(?:public\s+)?interface\s+([a-zA-Z0-9_]+)/g;
|
|
108
|
-
while ((match = interfaceRegex.exec(content)) !== null) {
|
|
109
|
-
if (match[1])
|
|
110
|
-
classes.push(match[1]);
|
|
111
|
-
}
|
|
112
|
-
const functions = [];
|
|
113
|
-
const methodRegex = /(?:public|private|protected)\s+(?:static\s+)?(?:\w+(?:<[^>]+>)?)\s+([a-zA-Z0-9_]+)\s*\(/g;
|
|
114
|
-
while ((match = methodRegex.exec(content)) !== null) {
|
|
115
|
-
if (match[1])
|
|
116
|
-
functions.push(match[1]);
|
|
117
|
-
}
|
|
118
|
-
const imports = [];
|
|
119
|
-
const lines = content.split(/\r?\n/);
|
|
120
|
-
lines.forEach(line => {
|
|
121
|
-
const importMatch = line.match(/^import\s+([a-zA-Z0-9_.]+);/);
|
|
122
|
-
if (importMatch?.[1]) {
|
|
123
|
-
const name = importMatch[1];
|
|
124
|
-
const type = name.startsWith('java.') || name.startsWith('javax.') ? 'JDK' : 'Maven';
|
|
125
|
-
imports.push({ name, type });
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
return { functions, classes, types: [], imports, exports: [] };
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
// Analyseur C#
|
|
132
|
-
class CSharpAnalyzer {
|
|
133
|
-
extensions = [".cs"];
|
|
134
|
-
analyzeFile(content) {
|
|
135
|
-
const classes = [];
|
|
136
|
-
const classRegex = /(?:public\s+)?(?:abstract\s+)?(?:partial\s+)?class\s+([a-zA-Z0-9_]+)/g;
|
|
137
|
-
let match;
|
|
138
|
-
while ((match = classRegex.exec(content)) !== null) {
|
|
139
|
-
if (match[1])
|
|
140
|
-
classes.push(match[1]);
|
|
141
|
-
}
|
|
142
|
-
const interfaceRegex = /(?:public\s+)?interface\s+([a-zA-Z0-9_]+)/g;
|
|
143
|
-
while ((match = interfaceRegex.exec(content)) !== null) {
|
|
144
|
-
if (match[1])
|
|
145
|
-
classes.push(match[1]);
|
|
146
|
-
}
|
|
147
|
-
const functions = [];
|
|
148
|
-
const methodRegex = /(?:public|private|protected|internal)\s+(?:static\s+)?(?:async\s+)?(?:\w+(?:<[^>]+>)?)\s+([a-zA-Z0-9_]+)\s*\(/g;
|
|
149
|
-
while ((match = methodRegex.exec(content)) !== null) {
|
|
150
|
-
if (match[1])
|
|
151
|
-
functions.push(match[1]);
|
|
152
|
-
}
|
|
153
|
-
const imports = [];
|
|
154
|
-
const lines = content.split(/\r?\n/);
|
|
155
|
-
lines.forEach(line => {
|
|
156
|
-
const usingMatch = line.match(/^using\s+([a-zA-Z0-9_.]+);/);
|
|
157
|
-
if (usingMatch?.[1]) {
|
|
158
|
-
const name = usingMatch[1];
|
|
159
|
-
const type = name.startsWith('System.') ? '.NET' : 'NuGet';
|
|
160
|
-
imports.push({ name, type });
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
return { functions, classes, types: [], imports, exports: [] };
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
// Analyseur Go
|
|
167
|
-
class GoAnalyzer {
|
|
168
|
-
extensions = [".go"];
|
|
169
|
-
analyzeFile(content) {
|
|
170
|
-
const functions = [];
|
|
171
|
-
const funcRegex = /func\s+(?:\([^)]+\)\s+)?([a-zA-Z0-9_]+)\s*\(/g;
|
|
172
|
-
let match;
|
|
173
|
-
while ((match = funcRegex.exec(content)) !== null) {
|
|
174
|
-
if (match[1])
|
|
175
|
-
functions.push(match[1]);
|
|
176
|
-
}
|
|
177
|
-
const types = [];
|
|
178
|
-
const typeRegex = /type\s+([a-zA-Z0-9_]+)\s+(?:struct|interface)/g;
|
|
179
|
-
while ((match = typeRegex.exec(content)) !== null) {
|
|
180
|
-
if (match[1])
|
|
181
|
-
types.push(match[1]);
|
|
182
|
-
}
|
|
183
|
-
const imports = [];
|
|
184
|
-
const lines = content.split(/\r?\n/);
|
|
185
|
-
lines.forEach(line => {
|
|
186
|
-
const importMatch = line.match(/^\s*"([^"]+)"/);
|
|
187
|
-
if (importMatch?.[1]) {
|
|
188
|
-
const name = importMatch[1];
|
|
189
|
-
const type = name.includes('.') ? 'External' : 'Standard';
|
|
190
|
-
imports.push({ name, type });
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
return { functions, classes: [], types, imports, exports: [] };
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
// Analyseur Rust
|
|
197
|
-
class RustAnalyzer {
|
|
198
|
-
extensions = [".rs"];
|
|
199
|
-
analyzeFile(content) {
|
|
200
|
-
const functions = [];
|
|
201
|
-
const funcRegex = /(?:pub\s+)?fn\s+([a-zA-Z0-9_]+)/g;
|
|
202
|
-
let match;
|
|
203
|
-
while ((match = funcRegex.exec(content)) !== null) {
|
|
204
|
-
if (match[1])
|
|
205
|
-
functions.push(match[1]);
|
|
206
|
-
}
|
|
207
|
-
const types = [];
|
|
208
|
-
const structRegex = /(?:pub\s+)?struct\s+([a-zA-Z0-9_]+)/g;
|
|
209
|
-
while ((match = structRegex.exec(content)) !== null) {
|
|
210
|
-
if (match[1])
|
|
211
|
-
types.push(match[1]);
|
|
212
|
-
}
|
|
213
|
-
const enumRegex = /(?:pub\s+)?enum\s+([a-zA-Z0-9_]+)/g;
|
|
214
|
-
while ((match = enumRegex.exec(content)) !== null) {
|
|
215
|
-
if (match[1])
|
|
216
|
-
types.push(match[1]);
|
|
217
|
-
}
|
|
218
|
-
const imports = [];
|
|
219
|
-
const lines = content.split(/\r?\n/);
|
|
220
|
-
lines.forEach(line => {
|
|
221
|
-
const useMatch = line.match(/^use\s+([a-zA-Z0-9_:]+)(?:::\{([^}]+)\})?/);
|
|
222
|
-
if (useMatch?.[1]) {
|
|
223
|
-
const name = useMatch[1];
|
|
224
|
-
const type = name.startsWith('std::') || name.startsWith('core::') ? 'Standard' : 'Crate';
|
|
225
|
-
const usage = useMatch[2];
|
|
226
|
-
imports.push({ name, type, usage });
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
return { functions, classes: [], types, imports, exports: [] };
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
// Registry des analyseurs
|
|
233
|
-
const analyzers = [
|
|
234
|
-
new TSJSAnalyzer(),
|
|
235
|
-
new PythonAnalyzer(),
|
|
236
|
-
new JavaAnalyzer(),
|
|
237
|
-
new CSharpAnalyzer(),
|
|
238
|
-
new GoAnalyzer(),
|
|
239
|
-
new RustAnalyzer()
|
|
240
|
-
];
|
|
241
|
-
export function getAnalyzer(filePath) {
|
|
242
|
-
const lastDotIndex = filePath.lastIndexOf('.');
|
|
243
|
-
if (lastDotIndex === -1)
|
|
244
|
-
return null;
|
|
245
|
-
const ext = filePath.substring(lastDotIndex).toLowerCase();
|
|
246
|
-
return analyzers.find(a => a.extensions.includes(ext)) || null;
|
|
247
|
-
}
|
|
248
|
-
export function getSupportedExtensions() {
|
|
249
|
-
return analyzers.flatMap(a => a.extensions);
|
|
250
|
-
}
|
|
251
|
-
//# sourceMappingURL=languageAnalyzer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"languageAnalyzer.js","sourceRoot":"","sources":["../../src/analyzers/languageAnalyzer.ts"],"names":[],"mappings":"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"}
|