Je développe un outil de développement qui me fournirait des métriques de code.Babel plugin - obtenir des informations structurées en sortie après analyse de code statique
Je voudrais l'outil de passer par les fichiers source et compter les usages (#loc) par valeur importée et par bibliothèque.
I.e. pour lodash, je voudrais savoir les usages de isEqual
, cloneDeep
. Je voudrais avoir en sortie:
+------------+------------+---------+
| Library | Imported | #LOC |
+------------+------------+---------+
| Lodash | isEqual | 20|
| Lodash | cloneDeep | 4|
+------------+------------+---------+
fichier Exemple de ce qui doit être trouvé par l'outil
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 // ^^^^^^^^^
J'ai commencé la mise en œuvre en tant que plugin babel que je savais que ce serait me laisser facilement
- Parse le code dans un format lisible (AST)
- visite d'un ll le importDeclaration
- obtenir les références pertinentes
- calculer les usages
implémentation actuelle
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);
}
}
});
}
}
}
};
};
Pour cet outil, je ne puis lu opérations sur le code (Transform pas/produire).
Ma question: Comment puis-je partager l'information produite dans le plugin babel (lib/import/# loc) au résultat de la commande babel-cli
ou tout autre API?
J'ai pensé à enregistrer le résultat (avec un ID spécifique) avec console.log
mais cela me semble être une solution de contournement. Je me demandais s'il y avait une API claire sur l'exposition d'informations sur un plugin babel.
Cela a du sens, merci! C'est aussi ce que j'ai reçu de @thejameskyle. Je vais essayer dès que possible et mettre à jour cette réponse en conséquence. –