{"_id":"@alu0101056944/espree-logging","name":"@alu0101056944/espree-logging","dist-tags":{"latest":"1.5.2"},"versions":{"1.5.2":{"name":"@alu0101056944/espree-logging","author":{"name":"Casiano Rodriguez Leon","email":"crguezl@ull.edu.es","url":"https://crguezl.github.io/"},"description":"Adds logs to javascript code","type":"module","bin":{"funlog":"bin/log.js"},"scripts":{"test1":"node bin/log.js test/data/test1.js -o ./output.js","test2":"node bin/log.js test/data/test2.js -o ./output.js","test3":"node bin/log.js test/data/test3.js -o ./output.js","test4":"node bin/log.js test/data/test4.js -o ./output.js","test":"mocha test/test.mjs","cov":"nyc npm test","cov2":"nyc --reporter=html --reporter=text --report-dir docs mocha","doc":"documentation readme ./src/** --section=API","doc2":"documentation build ./src/** -f html -o docs"},"dependencies":{"acorn":"^8.8.2","commander":"^10.0.0","escodegen":"^2.0.0","espree":"^9.4.1","estraverse":"^5.2.0","underscore":"^1.12.0"},"version":"1.5.2","devDependencies":{"mocha":"^10.2.0","nyc":"*","documentation":"*"},"main":"src/logging-espree.js","gitHead":"6e9e23fdc6214a196377c794fe5a211ed360e08b","_id":"@alu0101056944/espree-logging@1.5.2","_nodeVersion":"19.6.0","_npmVersion":"9.4.0","dist":{"integrity":"sha512-U72WxHaEDDiEf2hbr37BNpn70pXS685m9Ie3rfzYNePe556yYyWwkGW5Ug9DsVW+4KTudiXLqKCJtVQ5H5M2zA==","shasum":"4f2b6fdc0d1531469abd39d67a04c6315f227632","tarball":"https://registry.npmjs.org/@alu0101056944/espree-logging/-/espree-logging-1.5.2.tgz","fileCount":53,"unpackedSize":1624471,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5NOUSJvkFUxnNej9w+8nnfnBHisuAMRu7Kwm0+I7XcwIhAJdrCrXWxqd+OF1KcRNZCMlP0V4P/Evd9LVXmOLdJ6Aw"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj/9nBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmooIA/+JcPrIMXxvdjBcgRbLXNDTSXb2tL24fmHpaHe+ZgSm5T+75uu\r\nO/p4+NwivCPfvbOv8hNcaGsuvXu//HWNbwSgGcCKuIQppSZPm08PYrd5zVs0\r\nKhokcYY96N1NtK4yiWFdRFBp2r7Sd/McarQq4zL90V7VV3vyV9wp/YSn3RhE\r\n5W239CRtWYfFS6jcZjG0VnyAVC5hmW9l2U4bg9tywgSD3NfKDRMp6JIRCoWn\r\n0ciXUy+BVnZUge0R6M4WF5/isNFCe3jawUzT7pYqN9uMv/qrF1v78Ra5aczX\r\nbqU8NpD9etFljSawyE6XfBICWdZYKxA00ZHiEHXyCkKdDjDq4d2NzDxud1cb\r\ndPo6HsUwuPNxyaehovbh6Ev44zOlZXN+Su6ZuQsY1BaOqW5e6MDEAnpftudQ\r\nMHxQcn3KzLyTN7tcsztlaK/8aImURbESvJy+JY6Aj4OdVMMzSJ1cFQ2iZEYr\r\nI7fLnDfc38M4EuyYG+UeUxJUEsqqfZ5AyKYUkOwOc0OzuxivDs03YMhlxRyH\r\nzOT8KlOW23ytb4iCrRfwd7JHn71xZ0yZ28GVYk2DwWiEX9olWKjXFSaY0DBS\r\n8dKdj0jgc/Uh9WJikEhgOOvN+GoYSIsGcvWipSWiOiBfGrknTrI9t/rJDyAv\r\n1c28GYkY+w4jBBOPENxV9h3+6zW/+aw9Zbs=\r\n=10+C\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"alu0101056944","email":"alu0101056944@ull.edu.es"},"directories":{},"maintainers":[{"name":"alu0101056944","email":"alu0101056944@ull.edu.es"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/espree-logging_1.5.2_1677711808750_0.6300895527537542"},"_hasShrinkwrap":false}},"time":{"created":"2023-03-01T23:03:28.617Z","1.5.2":"2023-03-01T23:03:28.995Z","modified":"2023-03-01T23:03:29.160Z"},"maintainers":[{"name":"alu0101056944","email":"alu0101056944@ull.edu.es"}],"description":"Adds logs to javascript code","author":{"name":"Casiano Rodriguez Leon","email":"crguezl@ull.edu.es","url":"https://crguezl.github.io/"},"readme":"[![Open in Codespaces](https://classroom.github.com/assets/launch-codespace-f4981d0f882b2a3f0472912d15f9806d57e124e0fc890972558857b51b24a6f9.svg)](https://classroom.github.com/open-in-codespaces?assignment_repo_id=10326843)\n\n# Práctica Espree logging\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n#### Table of Contents\n\n*   [transpile](#transpile)\n    *   [Parameters](#parameters)\n*   [addLogging](#addlogging)\n    *   [Parameters](#parameters-1)\n*   [addBeforeCode](#addbeforecode)\n    *   [Parameters](#parameters-2)\n\n### transpile\n\n#### Parameters\n\n*   `inputFile` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** path to input file\n*   `outputFile` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** path to output file\n\n### addLogging\n\n#### Parameters\n\n*   `code` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** to log\n\nReturns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** logged code\n\n### addBeforeCode\n\n#### Parameters\n\n*   `node` **[object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** of the AST\n\n## Ejecutable\n\nEl ejecutable <code>bin/log.js</code> puede ser utilizado de la siguiente forma:\n\n```bash\nArguments:\n  filename                 file with the original code\n\nOptions:\n  -V, --version            output the version number\n  -o, --output <filename>  file in which to write the output\n  -h, --help               display help for command\n```\n\nEjemplo de ejecución:\n\n```bash\nnpx funlog test/data/test1.js -o output.txt\n```\n\n## Instalación\n\nPara instalar utilizar el siguiente comando:\n\n```bash\nnpm i\n```\n\n## Resumen de lo aprendido\n\n### Estructura de el arbol AST\n\nUn nodo <code>FunctionDeclaration</code> tiene un una propiedad *body*, una propiedad *params* y una propiedad *args* y el *body* suele ser un <code>BlockStatement</code> cuyo *body* es un array. Dentro de ese array podemos meter otros nodos que queramos, capacidad que aplicamos para incluir un nodo <code>CallStatement</code> equivalente a <code>console.log(...)</code>\n\n## Indicar los valores de los argumentos\n\nSe ha modificado el código de `logging-espree.js` para que el log también indique los valores de los argumentos que se pasaron a la función.\nEjemplo:\n\n```javascript\nfunction foo(a, b) {\n  var x = 'blah';\n  var y = (function (z) {\n    return z+3;\n  })(2);\n}\nfoo(1, 'wut', 3);\n```\n\n```javascript\nfunction foo(a, b) {\n    console.log(`Entering foo(${ a }, ${ b })`);\n    var x = 'blah';\n    var y = function (z) {\n        console.log(`Entering <anonymous function>(${ z })`);\n        return z + 3;\n    }(2);\n}\nfoo(1, 'wut', 3);\n```\n\nPara ello se modificó la función <code>addBeforeCode()</code> para que incluya un binding *params* en el string de salida del <code>console.log()</code>. Dicho binding es un array de elementos <code>String</code> construido a partir de la propiedad *params* del nodo <code>FunctionDeclaration</code>.\n\n## CLI con [Commander.js](https://www.npmjs.com/package/commander)\n\nSe importa <code>commander</code> y se obtiene el objeto <code>program</code> del mismo. Se invoca sobre ese objeto la configuración que queremos que tenga el ejecutable CLI. Luego invocamos su método <code>program.parse(process.argv)</code> para que procese la entrada de CLI y haga lo que lo hemos configurado para hacer.\n\n*   <code>.option()</code> para poder utilizar la opción *-o*\n*   <code>.argument()</code> para tener un argumento obligatorio.\n*   <code>.version()</code> recibe la versión del *package.json*\n*   <code>.action()</code> recibe un callback que tendrá tantos parámetros como argumento, salvo el último, que es un objeto options con los valores de cada opción.\n\n## Reto 1: Soportar funciones flecha\n\nLo que hacemos es utilizar <code>estraverse.traverse(ast, {enter:(node, parents) => {...}})</code> para recorrer el árbol de sintaxis abstracto (AST) nodo por nodo. Si se detecta que el corresponde a una declaración de función se le agrega una nueva sentencia a la misma. Es ahí donde entra <code>addBeforeCode()</code> para agregar dicho nodo.\n\n```js\n    (...)\n    estraverse.traverse(ast, {\n        enter: function(node, parent) {\n            if (/* si nodo declaración de función */) {\n                addBeforeCode(node);\n            }\n        }\n    });\n    (...)\n```\n\nEl problema está en que las funciones flecha son de tipo <code>ArrowFunctionDeclaration</code>, y ese nodo no está originalmente en la función, por lo que se le agrega.\n\n## Reto 2: Añadir el número de línea\n\nEspree permite obtener un objeto *loc* que contiene como propiedades *start* y *end*, los cuales tienen a su vez la propiedad *line* y *column*. Basta con utilizar *loc.start.line* en la función <code>addBeforeCode()</code>:\n\n```js\n(...)\nvar beforeCode = \"console.log(`Entering \" + name + `(${params})` +\n      ` at line ${node.loc.start.line}\\`);`;\n(...)\n```\n\nTras haber activado el objeto en la configuración de <code>espree.parse()</code>:\n\n```js\nconst ast = espree.parse(code, {ecmaVersion: 6, loc: true /* activamos el objeto loc */});\n```\n\n## Tests and Covering\n\n### Test results with mocha\n\n![sucessful test](docs/successful_test.PNG)\n\n### Code coverage using <code>nyc</code>\n\n![nyc result](docs/nyc.PNG)\n","readmeFilename":"README.md"}