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.
Files changed (39) hide show
  1. package/package.json +1 -1
  2. package/src/ai/analyzer.ts +3 -1
  3. package/src/analyzers/languageAnalyzer.ts +297 -5
  4. package/src/commands/generateSummary.ts +129 -39
  5. package/src/exporters/html.ts +134 -52
  6. package/.env +0 -1
  7. package/dist/ai/analyzer.d.ts +0 -3
  8. package/dist/ai/analyzer.d.ts.map +0 -1
  9. package/dist/ai/analyzer.js +0 -43
  10. package/dist/ai/analyzer.js.map +0 -1
  11. package/dist/analyzers/languageAnalyzer.d.ts +0 -18
  12. package/dist/analyzers/languageAnalyzer.d.ts.map +0 -1
  13. package/dist/analyzers/languageAnalyzer.js +0 -251
  14. package/dist/analyzers/languageAnalyzer.js.map +0 -1
  15. package/dist/cache/cacheManager.d.ts +0 -38
  16. package/dist/cache/cacheManager.d.ts.map +0 -1
  17. package/dist/cache/cacheManager.js +0 -141
  18. package/dist/cache/cacheManager.js.map +0 -1
  19. package/dist/cli/index.d.ts +0 -3
  20. package/dist/cli/index.d.ts.map +0 -1
  21. package/dist/cli/index.js +0 -316
  22. package/dist/cli/index.js.map +0 -1
  23. package/dist/commands/classify.d.ts +0 -2
  24. package/dist/commands/classify.d.ts.map +0 -1
  25. package/dist/commands/classify.js +0 -37
  26. package/dist/commands/classify.js.map +0 -1
  27. package/dist/commands/generateSummary.d.ts +0 -5
  28. package/dist/commands/generateSummary.d.ts.map +0 -1
  29. package/dist/commands/generateSummary.js +0 -54
  30. package/dist/commands/generateSummary.js.map +0 -1
  31. package/dist/commands/run.d.ts +0 -5
  32. package/dist/commands/run.d.ts.map +0 -1
  33. package/dist/commands/run.js +0 -326
  34. package/dist/commands/run.js.map +0 -1
  35. package/dist/exporters/html.d.ts +0 -6
  36. package/dist/exporters/html.d.ts.map +0 -1
  37. package/dist/exporters/html.js +0 -517
  38. package/dist/exporters/html.js.map +0 -1
  39. package/src/commands/classify.ts +0 -40
@@ -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
- // Générer la vue hiérarchique dynamiquement
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 defer src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></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
- overflow: auto;
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
- ${mermaidGraph || "graph TD\n Root[Projet]"}
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(/[.*+?^\\\${}()|[\\]\\\\]/g, "\\\\$&") + ")", "gi");
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, 8); // Limiter pour lisibilité
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
- traverse(tree, null, 0);
539
- return graph || getDefaultHierarchyGraph();
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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
@@ -1,3 +0,0 @@
1
- import "dotenv/config";
2
- export declare function askAI(technicalContext: string): Promise<any>;
3
- //# sourceMappingURL=analyzer.d.ts.map
@@ -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"}
@@ -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
@@ -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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"}