0

Я разрабатываю инструмент dev, который предоставил бы мне некоторые показатели кода.Babel plugin - получить структурированную информацию как результат после статического анализа кода

Я хотел бы инструмент, чтобы пройти через исходные файлы и сосчитать использований (#loc) на импортируемого значения и в библиотеке.

I.e. для lodash, я хотел бы знать об использовании isEqual, cloneDeep. Я хотел бы иметь выход:

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

Пример файла, что должно быть найдено с помощью инструмента

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 //     ^^^^^^^^^ 

Я начал реализацию как Бабель плагин, как я знал, что это позволит мне легко

  • разобрать код в читаемом формате (AST)
  • Посетите не Л.Л. importDeclaration
  • получить соответствующие ссылки
  • вычислить использования

реализация тока

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); 
       } 
      } 
      }); 
     } 
     } 
    } 
    }; 
}; 

Для этого инструмента, я только не чтения операций по коде (без преобразования/generate).

Моего вопрос: Как я могу поделиться произведенной информацией в Вавилонском плагине (Библиотека/импорт/# LOC) в результате babel-cli команды или любой другой API?

Я думал о регистрации результата (с определенным идентификатором) с помощью console.log, но мне кажется, что это обходное решение. Мне было интересно, есть ли какой-то ясный API для раскрытия информации из плагина babel.

ответ

1

Это похоже на то, что может быть лучше построено с использованием утилит Babel, но реализовано на вашей собственной базе. Вавилон в данный момент не предоставляет никакого способа вывода статистики или чего-либо еще. Вы могли бы, например, изменить свой плагин на сценарий, например

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

Это имеет смысл, спасибо! Вот что я получил от @thejameskyle. Я попробую это как можно скорее и соответствующим образом обновить этот ответ. –

Смежные вопросы