0

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.

Répondre

1

Cela semble être quelque chose qui pourrait être mieux construit en utilisant les utilitaires de Babel, mais mis en œuvre sur votre propre base. Babel pour le moment ne fournit aucun moyen de produire des statistiques ou quoi que ce soit. Vous pourriez par exemple changer votre plugin à un script comme

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

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