fz-react-cli
Version:
A CLI tool for build modern web application and libraries
79 lines (75 loc) • 2.15 kB
JavaScript
;
var esprima = require('esprima');
var escodegen = require('escodegen');
var start = {
type: 'ExpressionStatement',
expression: {
type: 'CallExpression',
callee: {
type: 'MemberExpression',
computed: false,
object: {
type: 'MemberExpression',
computed: false,
object: {
type: 'MemberExpression',
computed: false,
object: {
type: 'Identifier',
name: 'window'
},
property: {
type: 'Identifier',
name: 'ClientCoverage'
}
},
property: {
type: 'Identifier',
name: 'JS'
}
},
property: {
type: 'Identifier',
name: 'visitMethod'
}
},
arguments: [{
type: 'Literal',
value: 'filename',
raw: "'filename'"
}, {
type: 'Literal',
value: 'functionName',
raw: "'functionName'"
}]
}
};
function instrument(source) {
var parsed = esprima.parseModule(source, { jsx: true });
for (var i in parsed.body) {
if (parsed.body[i].type === 'FunctionDeclaration' || parsed.body[i].type === 'ExportDefaultDeclaration' || parsed.body[i].type === 'ExportNamedDeclaration') {
if (parsed.body[i].type === 'FunctionDeclaration') {
var ParsedTemp = parsed.body[i];
} else {
var ParsedTemp = parsed.body[i].declaration;
}
if (ParsedTemp) {
if (ParsedTemp.id) {
var funcname = ParsedTemp.id.name;
if (funcname !== 'mapStateToProps') {
if (!funcname.includes('_')) {
var startFunc = JSON.parse(JSON.stringify(start));
startFunc.expression.arguments[0].value = this.resourcePath;
startFunc.expression.arguments[0].raw = this.resourcePath;
startFunc.expression.arguments[1].value = funcname;
startFunc.expression.arguments[1].raw = funcname;
ParsedTemp.body.body.unshift(startFunc);
}
}
}
}
}
}
return escodegen.generate(parsed);
}
module.exports = instrument;