Babel 插件 - 在静态代码分析后获取结构化信息作为输出

Babel plugin - get structured information as output after static code analysis

我正在开发一个可以为我提供一些代码指标的开发工具。

我希望该工具能够遍历源文件并计算每个 导入值 和每个 使用情况 (#loc) =38=]图书馆.

即对于lodash,我想知道isEqualcloneDeep的用法。 我想要作为输出:

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

我开始将实现作为 babel 插件,因为我知道它会让我轻松

当前实施

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

对于这个工具,我只对代码进行读取操作(没有转换/生成)。

我的问题:如何将 babel 插件 (lib/import/#loc) 中生成的信息共享到 babel-cli 命令的结果或任何其他 API ?

我考虑过使用 console.log 记录结果(具有特定 ID),但在我看来这是一种解决方法。 我想知道是否有关于从 babel 插件中公开信息的明确 API。

这似乎是使用 Babel 的实用程序构建的更好的东西,但要在您自己的基础上实现。 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