0

Ich entwickle ein Entwicklungstool, das mir einige Code-Metriken liefern würde.Babel-Plugin - Erhalten strukturierter Informationen als Ausgabe nach statischer Code-Analyse

würde ich das Tool wie durch die Quelldateien zu gehen und die Nutzungen (#loc) pro importiert Wert und pro Bibliothek zählen.

I.e. für lodash, würde ich gerne die Verwendungen von , cloneDeep kennen. Ich möchte als Ausgang haben:

+------------+------------+---------+ 
| Library | Imported | #LOC | 
+------------+------------+---------+ 
| Lodash  | isEqual |  20| 
| Lodash  | cloneDeep |  4| 
+------------+------------+---------+ 

Beispieldatei von dem, was sollte durch das Werkzeug

1 // aFile.js 
2 import {isEqual, cloneDeep} from 'lodash' 
3 // some code .. 
4 if (isEqual(variableA, variableB)) { 
5 // ^^^^^^^ 
6 } 
7 let myClonedObject = cloneDeep(myObject); 
8 //     ^^^^^^^^^ 

Ich begann die Umsetzung als babel-Plugin gefunden werden, wie ich es kannte mich lassen würde leicht

  • den Code in einem lesbaren Format parsen (AST)
  • Besuch ein ll die importDeclaration
  • erhält die entsprechenden Referenzen
  • die Verbräuche

    export default function({ types: t }) { 
        return { 
        visitor: { 
         ImportDeclaration(path, state) { 
         if(path.get('source').node.value === 'lodash') { 
          path.get('specifiers').forEach(function(specifier) { 
          if(specifier.node.imported) { 
           const importedIdentifierName = specifier.node.imported.name; 
           if(importedIdentifierName === 'isEqual') { 
           const isEqualLoc = new Set(); 
           const {referencePaths} = path.scope.getBinding(importedIdentifierName); 
           referencePaths.forEach(function(referencePath) { 
            isEqualLOC.add(referencePath.node.loc.start.line); 
           }); 
           console.log(isEqualLOC.size); 
           } 
          } 
          }); 
         } 
         } 
        } 
        }; 
    }; 
    

    , ich las auf dem Code Operationen nur noch für dieses Werkzeug

aktuelle Implementierung berechnen (keine Transformation/generieren).

Meine Frage: Wie kann ich die erzeugten Informationen im babel Plugin (lib/import/# loc) mit dem Ergebnis des Befehls babel-cli oder einer anderen API teilen?

Ich dachte über das Protokollieren des Ergebnisses (mit einer bestimmten ID) mit console.log, aber es scheint mir wie ein Workaround. Ich habe mich gefragt, ob es eine klare API zum Aussetzen von Informationen aus einem Babel-Plugin gibt.

Antwort

1

Dies scheint etwas zu sein, das besser mit Babel-Dienstprogrammen erstellt werden könnte, aber auf Ihrer eigenen Basis implementiert. Babel bietet momentan keine Möglichkeit, Statistiken oder ähnliches auszugeben. Sie könnten zum Beispiel Ihr Plugin zu einem Skript wie

const fs = require('fs'); 
const babylon = require('bablylon'); 
const traverse = require('babel-traverse'); 

const data = fs.readFileSync('./thing.js'); 
traverse(babylon.parse(data), { 
    ImportDeclaration(path) { 
    // ... 
    }, 
}); 

// Do whatever output you want here 
+0

ändern Es macht Sinn, danke! Das ist das Feedback, das ich auch von @thejameskyle bekommen habe. Ich werde dies so schnell wie möglich versuchen und diese Antwort entsprechend aktualisieren. –

Verwandte Themen