节点 - 遍历 JS 文件的文件夹并提取某些位
Node - go through folder of JS files and extract certain bits
我目前正在维护一个测试文档作为电子表格 - 所以我有 3 列:
- 文件名
- 来自
it
块的文本 - 这是一个 mocha 测试 it('does this thing', function(){ ... })
- 描述 - 我正在写。
但是我不喜欢这个想法,因为维护起来很费时间。
是否可以自动执行此操作,我认为存在一些 npm 包。所以这将 运行 通过一个文件夹,获取文件名并查看每个 JS 以在一些定义的字符串正则表达式之后收集信息。例如,在 //DESCRIPTION
和 it(
之后查找任何文本 - 如下所示:
//DESCRIPTION: Some text here
it('does this thing', function(){ ... })
使用esprima得到AST,过滤出你想要的测试块,通过escodegen生成源码
代码如下:
const fs = require('fs')
const path = require('path')
const esprima = require('esprima')
const escodegen = require('escodegen')
function walkSync (dir) {
return fs.statSync(dir).isDirectory()
? Array.prototype.concat(...fs.readdirSync(dir).map(f => walkSync(path.join(dir, f))))
: dir
}
const result = walkSync('./test').map(path => {
const ast = esprima.parse(fs.readFileSync(path, 'utf8'))
ast.body = ast.body.filter(elem => {
return elem.type === 'ExpressionStatement'
&& elem.expression && elem.expression.callee
&& elem.expression.callee.name === 'it'
})
const code = escodegen.generate(ast)
return {
path,
code
}
})
console.log(result)
测试文件夹结构如下:
测试用例是什么样的:
执行结果是什么样的:
我目前正在维护一个测试文档作为电子表格 - 所以我有 3 列:
- 文件名
- 来自
it
块的文本 - 这是一个 mocha 测试it('does this thing', function(){ ... })
- 描述 - 我正在写。
但是我不喜欢这个想法,因为维护起来很费时间。
是否可以自动执行此操作,我认为存在一些 npm 包。所以这将 运行 通过一个文件夹,获取文件名并查看每个 JS 以在一些定义的字符串正则表达式之后收集信息。例如,在 //DESCRIPTION
和 it(
之后查找任何文本 - 如下所示:
//DESCRIPTION: Some text here
it('does this thing', function(){ ... })
使用esprima得到AST,过滤出你想要的测试块,通过escodegen生成源码
代码如下:
const fs = require('fs')
const path = require('path')
const esprima = require('esprima')
const escodegen = require('escodegen')
function walkSync (dir) {
return fs.statSync(dir).isDirectory()
? Array.prototype.concat(...fs.readdirSync(dir).map(f => walkSync(path.join(dir, f))))
: dir
}
const result = walkSync('./test').map(path => {
const ast = esprima.parse(fs.readFileSync(path, 'utf8'))
ast.body = ast.body.filter(elem => {
return elem.type === 'ExpressionStatement'
&& elem.expression && elem.expression.callee
&& elem.expression.callee.name === 'it'
})
const code = escodegen.generate(ast)
return {
path,
code
}
})
console.log(result)
测试文件夹结构如下:
测试用例是什么样的:
执行结果是什么样的: