npm package: @joseantpul/espree-logging-solution
Description: Adds logs to javascript code
Author: Jose Antonio Antunez Pulido
Latest version: 1.0.1

[![Open in Codespaces](https://classroom.github.com/assets/launch-codespace-f4981d0f882b2a3f0472912d15f9806d57e124e0fc890972558857b51b24a6f9.svg)](https://classroom.github.com/open-in-codespaces?assignment_repo_id=10273587)
# Práctica Espree logging

## Description of the project, how to use

To install use: npm i @joseantpul/espree-logging-solution

Transpiler for JavaScript, adds console.log at the beggining of functions with information such as name of the function we are entering, line of the function and parameters passed.

To use it we just call bin/log.js passing as argument the file with the code.

## Documentation

<!-- Generated by documentation.js. Update this documentation by updating the source code. -->

### Table of Contents

*   [transpile][1]
    *   [Parameters][2]
*   [addLogging][3]
    *   [Parameters][4]
*   [addBeforeCode][5]
    *   [Parameters][6]

### Parameters

*   `inputFile` **File** File with JS code
*   `outputFile` **File**&#x20;

Returns **any** outputFile with the code including console.log in functions, if no
outputFile was specificated it will print the output

## addLogging

Takes code as a string and returns an AST wiht the console.log's added
at the start of functions

### Parameters

*   `code` **[string][7]**&#x20;

Returns **any** AST of the code with the console.log's added

## addBeforeCode

Adds console.log to the node of the function (passed by reference because its an object)

### Parameters

*   `node` **[object][8]** AST node of a function

[1]: #transpile

[2]: #parameters

[3]: #addlogging

[4]: #parameters-1

[5]: #addbeforecode

[6]: #parameters-2

[7]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String

[8]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object

## Resumen de lo aprendido

En esta práctica lo principal ha sido aprender a usar estraverse para recorrer
los nodos de nuestro arbol de análisis sintáctico mediante estraverse.traverse y como
gracias a esto podemos modificarlo y por consiguiente modificar el código que se genera.

Además se ha aprendido a publicar un paquete en npm.

Finalmente se ha dado un repaso a las herramientas de desarrollo que nos ayudan con nuestro trabajo como los test, cubrimiento, integración continua...

## CLI con [Commander.js](https://www.npmjs.com/package/commander)

```javascript
program
  .version(version)
  .argument("<filename>", 'file with the original code')
  .option("-o, --output <filename>", "file in which to write the output")
  .action((filename, options) => {
    transpile(filename, options.output);
  });
program.parse(process.argv);
```

## Indicar los valores de los argumentos, soportar funciones flecha y añadir el número de línea

Se 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, soporte funciones flecha y añada el número de línea. 
Ejemplo:

```javascript
function foo(a, b, c) {
  let x = 'tutu';
  let y = (function (x) { return x*x })(2);
  let z = (e => { return e +1 })(4);
  console.log(x,y,z);
}
```

```javascript
function foo(a, b) {
    console.log(`Entering foo(${ a }, ${ b })`);
    var x = 'blah';
    var y = function (z) {
        console.log(`Entering <anonymous function>(${ z })`);
        return z + 3;
    }(2);
}
foo(1, 'wut', 3);
```

Código:


Para detectar Funciones flecha
```javascript
if (node.type === 'FunctionDeclaration' ||
    node.type === 'ArrowFunctionExpression' ||
    node.type === 'FunctionExpression') {
    addBeforeCode(node);
}
```
Para añadir número de línea y parámetros
```javascript
let parmNames = "";
if (node.params.length) {
    parmNames = "${" + node.params.map(param => param.name).join("}, ${") + "}";
}
const lineN = node.loc.start.line;
const beforeCode = "console.log(" + "`" + "Entering " + name + "(" + parmNames + ")" + " at line " + lineN + "`" + ");";
```

## Tests and Covering

Se realizan los test pertinentes en test.mjs para comprobar que las funcionalidades
cumplen su función correctamente, ademaś se hace un crubimiento de los test para 
comprobar que se testea todo el código.

-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |      96 |     92.3 |     100 |      96 |                   
 logging-espree.js |      96 |     92.3 |     100 |      96 | 17-19             
-------------------|---------|----------|---------|---------|-------------------

## Publicación como paquete npm
 1) Darse de alta en npm
 2) Autenticarse mediante npm adduser
 3) Comprobamos que estamos loggeados npm whoami
 4) Cambiar el name del package.json y ponerle el scope (nuestro nombre de usuario de npm) delante
 5) Publicar con npm publish --access public

## Scripts en package.json

"test": "mocha test/test.mjs",
"cov": "c8 npm run test",
"docgen": "npx documentation build src/logging-espree.js -f md"

## Github Actions

Se realiza integración continua corriendo los test
jobs: 
    steps:
      -  run: npm run test