UNPKG

@alu0101140469/addlogging

Version:
58 lines (51 loc) 1.7 kB
#!/usr/bin/env node const esprima = require('espree'); const estraverse = require('estraverse'); let escodegen = require('escodegen'); /** * Function that recive a code like a string and then create a code * @param {string} code * @param {string} pattern * @returns {string} */ let addLogging = function (code, pattern = '') { let ast = esprima.parse(code, { ecmaVersion: esprima.latestEcmaVersion, loc: true }); estraverse.traverse(ast, { enter: function(node) { if (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression') { if (pattern) { const actualFunctionName = node.id ? node.id.name : undefined; if ((actualFunctionName !== undefined) && (actualFunctionName.indexOf(pattern) !== -1)) { addBeforeCode(node); } } else { addBeforeCode(node); } } } }); return escodegen.generate(ast); } /** * Function that recive a node add one line of code before code * @param {object} node * @returns {void} */ function addBeforeCode(node) { let name = node.id ? node.id.name : '<anonymous function>'; let params = "" for (let i = 0; i < node.params.length; i++) { if (node.params.length - 1 !== i) { params += "${" + ` ${node.params[i].name}` + "},"; }else { params += "${" + ` ${node.params[i].name}` + "}"; } } let beforeCode = `console.log(\`Entering ${name}(${params}) 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 };