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.
ä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. –