#!/usr/bin/env node
const fs = require('fs');
const program = require('commander');
const { version, description } = require('../package.json');
let escodegen = require('escodegen');
let esprima = require('espree');
const espree = require('espree/lib/espree');
let estraverse = require('estraverse');
/**
* Changes the initial code into other code with extra lines
* @param {String} code Code from which more code will be generated
* @param {String} patternName Specified pattern name to be compared with the function in
* case it has an id
* @returns {String} generated code with modifications
*/
let addLogging = function(code, patternName = '') {
let ast = esprima.parse(code, { ecmaVersion: 6, loc: true});
estraverse.traverse(ast, {
enter: function(node, parent) {
if (node.type === 'FunctionDeclaration' ||
node.type === 'FunctionExpression' ||
node.type === 'ArrowFunctionExpression') {
if (!patternName || node.id && node.id.name.match(patternName) ||
(node.id === null && parent.id.name.match(patternName))) {
addBeforeCode(node);
}
}
}
});
return escodegen.generate(ast);
}
/**
* Receives a node with associated code, for it to be verified and add an
* additional line straightaway once entered into the function
* @param {} node
*/
let addBeforeCode = function(node) {
const functionName = node.id ? node.id.name : '<anonymous function>';
const parameters = node.params.map(param => `\$\{${param.name}\}`);
let beforeCode = `console.log(\`Entering ${functionName} (${parameters})) at line ${node.loc.start.line}\`);`;
let beforeNodes = esprima.parse(beforeCode, { ecmaVersion: 6}).body; // Is an Array of ASTs
node.body.body = beforeNodes.concat(node.body.body);
}
module.exports.addLogging = addLogging;