Source: index.js

#!/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;