{"_id":"@alu0101434025/espree-logging-solution","_rev":"2-8ba7cc4e510a37ae98ce6ca72ec91116","name":"@alu0101434025/espree-logging-solution","dist-tags":{"latest":"0.4.1"},"versions":{"0.3.0":{"name":"@alu0101434025/espree-logging-solution","author":{"name":"Muhammad Campos Preira","email":"alu0101434025@ull.edu.es"},"description":"Adds logs to javascript code","type":"module","bin":{"funlog":"bin/log.js"},"scripts":{"test":"mocha test/test.mjs","cov":"nyc npm run test"},"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":"0.3.0","devDependencies":{"mocha":"^10.2.0","nyc":"^15.1.0"},"gitHead":"a0ec65ebb6e86d8ec51d241a3410ca83f37d31ec","_id":"@alu0101434025/espree-logging-solution@0.3.0","_nodeVersion":"18.14.0","_npmVersion":"9.3.1","dist":{"integrity":"sha512-E/WA04TKIfpuFejaToM3/iM16e8dWtmvqIvICxp6agasowMp9ZfeMYbTKoGqIuZ7mmpA/EzHFpZi6xttBt2IxQ==","shasum":"6145fa0bb8ca088f2eae33690a2ac09dc7476b74","tarball":"https://registry.npmjs.org/@alu0101434025/espree-logging-solution/-/espree-logging-solution-0.3.0.tgz","fileCount":24,"unpackedSize":9085,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHI+U+ZBGQQcC7NRYq/dkavlaDJNPlgVxsC5TnU6Dh0tAiEA/J3izNO3ek0Q0hR5mKfkHcmY1gaoFDbguf4IWx5+dOE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj/6lMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpBZhAAlCKRv8mdgdvu6Sfb3KA8jyabZQO9Hz+hA2bKvsBP7d16Sd6g\r\nWoCtFL0QDWHjKrrHKSl1+WvfhgikDptqcVqMS1pNCv9VNkpBTZIhB1RG4Fs5\r\nAQ9ZggmjlxGfxG1qWcLCQ2GXvu+L0jP0k3FHTrIFgIQW6IkmefD4+agzw5sd\r\nKGbMcF3Y4R4wJm+sf3kBeS0DJfRJ9EV2CYA+2MDg2e8tug6lXcMrWZhdeDEt\r\nT1Npm/bbUV7ADSw5ZjWBfHCMxurOM1G62I+F01RD7HQCs6YA+CV1hC9+1Qd+\r\nA3uJNdN/oXBz0bCOk+9shH5p3b57Uqx5yve58D6X3IKteCudVR6900L3BXTS\r\nlJpT+36x6rxybKkPEFMGGN1z4j8LwqzMCGse6KSEmCe5ii+MDkvLza6aag/o\r\nkxUrdIEo/A2e7weQRosQ/guOfXpDMpLwkRjJzUaKaFvbC9SeZJAHuKPRfF0w\r\nALNh+/qriafTDLrs9x8Kbm7nZKH2TYqAfTu+fpuVKuCSs8FH4XStuj+FORdD\r\nMb7ShUqHW8hGa74xA3xx2/XLMO9hJ3lCMQTxaL5UaFHlapXPrqT1njNd3gF5\r\n2AinE0EfWifW89pnVOt2uYiq0N9eefMSuX8LJ5isnD7cVarjDk03zfOU70pY\r\nmMMvQCu7EHfJ5gsF4tkg/Fr1VrV3TGzVrKY=\r\n=UOz4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"alu0101434025","email":"alu0101434025@ull.edu.es"},"directories":{},"maintainers":[{"name":"alu0101434025","email":"alu0101434025@ull.edu.es"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/espree-logging-solution_0.3.0_1677699404105_0.6324643755139749"},"_hasShrinkwrap":false},"0.4.0":{"name":"@alu0101434025/espree-logging-solution","author":{"name":"Muhammad Campos Preira","email":"alu0101434025@ull.edu.es"},"description":"Adds logs to javascript code","type":"module","bin":{"funlog":"bin/log.js"},"scripts":{"test":"mocha test/test.mjs","cov":"nyc npm run test"},"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":"0.4.0","devDependencies":{"mocha":"^10.2.0","nyc":"^15.1.0"},"gitHead":"a0ec65ebb6e86d8ec51d241a3410ca83f37d31ec","_id":"@alu0101434025/espree-logging-solution@0.4.0","_nodeVersion":"18.14.0","_npmVersion":"9.3.1","dist":{"integrity":"sha512-elKxAGCMjHeyMxB81m9K03o4V1Dv8U+OqsdsJbeW3pdjYOMo2Ny+22XC1GLhX1jpKeErJOnLlraSC+GS/4vCwA==","shasum":"8fe5da6877d4d4134cc7b04f29553d40cd56fdd5","tarball":"https://registry.npmjs.org/@alu0101434025/espree-logging-solution/-/espree-logging-solution-0.4.0.tgz","fileCount":34,"unpackedSize":255298,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBJVNezh9LIcgq6et1QmS9emkwXBzlKNk+zJbZOVEFQCAiA4Qc78BI2AEJKE19t/wJd/SySZ6Unk8cs/qRJupxKnFg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj//LqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoAsQ/+Mia/3P2iknPvMV65WAmI+BZnZTz0biblSZ+b/36KGbRdaqOv\r\nKIbscTdcLb3g47YYYeerGyJ9griIiRsOFb1VIzdhmuy+CIt3ieu1xWgVwtGK\r\nBB+uZfyqbWAlQwd5IKtrFJLP6Ncfc2iXiMqzG302JXPOViwpxf1cFK/T1sFB\r\nUAPjky6M1Gi2TN/sqNXkwCJ2KsHWzF7TLst6KQ34WqeQpNxB18oWHTeuHlU1\r\n1yoGwigZQRCaND5akqNGphjvFVync/DZaa/KCajONnq2cYw7hsmLfnMAmkMq\r\nWX/U/ssS2J46fXlzYf8V8ZbkSK7DkLaBVmscU1CNebA3KgZKVDE9F3S51W1N\r\nuO7ih6n4JcrzNi7GtGr/zew2YVXI71sQ7KtDgdUqL2/QCP5Fc4XHOyI6nHJ7\r\nCcHHidVl0VeRJ7JqazFD5nxtFMSCasAc7X+8YLdP46DVsIrQVcLzvhCCI/bd\r\npjXL4gNecXSXhmZZKqir4m7hQMhelvQ01gEVp3bBe7vlg9WdQs9dOSKtHTBD\r\ns5CbekZ5d+1ekoUHGK0lzHiCJUxsRjFbE/0vvUIJredkrUs55/m3X59rdUXd\r\nWRL57U+bUJ1x7Kyca+W9ttLdNyW0EzGbEQj7lhcye9X5tJIHSQ0CkB/0ZLEm\r\n1jJ+V0ubMBvkG5DD8loKPiEt5dG5eDSO4q4=\r\n=0SJy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"alu0101434025","email":"alu0101434025@ull.edu.es"},"directories":{},"maintainers":[{"name":"alu0101434025","email":"alu0101434025@ull.edu.es"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/espree-logging-solution_0.4.0_1677718249926_0.3597807431106046"},"_hasShrinkwrap":false},"0.4.1":{"name":"@alu0101434025/espree-logging-solution","author":{"name":"Muhammad Campos Preira","email":"alu0101434025@ull.edu.es"},"description":"Adds logs to javascript code","type":"module","bin":{"funlog":"bin/log.js"},"scripts":{"test":"mocha test/test.mjs","cov":"nyc npm run test"},"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":"0.4.1","devDependencies":{"mocha":"^10.2.0","nyc":"^15.1.0"},"gitHead":"a0ec65ebb6e86d8ec51d241a3410ca83f37d31ec","_id":"@alu0101434025/espree-logging-solution@0.4.1","_nodeVersion":"18.14.0","_npmVersion":"9.3.1","dist":{"integrity":"sha512-Wz1J8qzsl4duuu4yREORTT0pIudEdO069omzAANv1Z1Nfei9SaB+yrOGC9KDtzIk8SDgRid+pC9FVF6IHx9cIQ==","shasum":"1206f3f2296ae21715a8b69d8c4d374304a3c0b9","tarball":"https://registry.npmjs.org/@alu0101434025/espree-logging-solution/-/espree-logging-solution-0.4.1.tgz","fileCount":34,"unpackedSize":255297,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDDzwxdrlh3MD4IPU8vnRG55NLKc3yyjX45DahGp/02+AIgcvIRitBSfKHJTSgR8YRhIhPkCmIwJIBTF6QInFUjnRc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj//NUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqbXg/6AkNPgvX5ERzBisgW3XIdWUnHlpxJOPg94agEJp7VczdvEgqE\r\nYzeJuTM8PgPoC/EJcSMKexYcBvPtKijLb5FTu2aD2dAB2nOeF5hLN6SVEtYx\r\nQqS459uR3dJhW5IsiVEqqPy2kQOzs9MgZcisMBaSKx8I0Ru+rPZTGwf/Nv5B\r\nJKeSXk3mvJ8MI5G/k6DIqYwpvfwGmH8zfumbwmWZ/8OA6J7BIHOZnkhZpf0a\r\nzB3i8nh9z/Sw41ZQpnKv2ujQtML9wq8XWha82bQBuwGctpPJefCVWjCJR+yY\r\nka7jNrB+klkkJfEVbsVu46gnpxPV7DI5tGo3HHCJNYe0Dh0clnElskjUsXgn\r\naC7AtqcEpaZbRDTLgqdRuH9nUuoeN7hoT9wrmwiIO66wS0yQRe7ytapzF0VX\r\nXAhoAehIN4kRYXAn5EB0zfWVFd3b8yUAbKf58PQsTLIKCFDci1HGiRBxInZw\r\nIay4/8S+RLLjnEj03Orqb+GsM+YTsD9pZD/0xrwx/mUVp70JNCXunR+VmolA\r\ns1KocP2BmF0DBGEDHlN6KU2LApB7OKkZWZmtXzFMnheykfXmZeh2IMafH1Tv\r\nUMpEjWMJtbXQcXIv2x9P+KkjUV/GM/jzEpNGrHaBtsvfLgIw9rXzBwl+aguA\r\nu6jyxYcciEmNPUfUIVHFFPGp3ewm21Az87M=\r\n=qNOU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"alu0101434025","email":"alu0101434025@ull.edu.es"},"directories":{},"maintainers":[{"name":"alu0101434025","email":"alu0101434025@ull.edu.es"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/espree-logging-solution_0.4.1_1677718356177_0.5339816428939739"},"_hasShrinkwrap":false}},"time":{"created":"2023-03-01T19:36:44.038Z","0.3.0":"2023-03-01T19:36:44.275Z","modified":"2023-03-02T00:52:36.575Z","0.4.0":"2023-03-02T00:50:50.244Z","0.4.1":"2023-03-02T00:52:36.458Z"},"maintainers":[{"name":"alu0101434025","email":"alu0101434025@ull.edu.es"}],"description":"Adds logs to javascript code","author":{"name":"Muhammad Campos Preira","email":"alu0101434025@ull.edu.es"},"readme":"[![Open in Codespaces](https://classroom.github.com/assets/launch-codespace-f4981d0f882b2a3f0472912d15f9806d57e124e0fc890972558857b51b24a6f9.svg)](https://classroom.github.com/open-in-codespaces?assignment_repo_id=10331270)\n# Práctica Espree logging\n\n## Resumen de lo aprendido\n\n...\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\n## CLI con [Commander.js](https://www.npmjs.com/package/commander)\n\nOpciones en línea de comandos (-o, -V, -h, etc.)\n\n![opciones](./img/opciones-comandos.png)\n\n## Reto 1: Soportar funciones flecha\n\nPara poder soportar las funciones flecha 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. Lo que se ha hecho es añadir un nuevo tipo de nodo `ArrowFunctionExpression` al la condición del `if` que comprueba si el nodo es una función. \n\n```javascript\nexport function addLogging(code) {\n  const ast = espree.parse(code, { ecmaVersion: 6, loc: true });\n  estraverse.traverse(ast, {\n    enter: function(node, parent) {\n      if (node.type === 'FunctionDeclaration' ||\n          node.type === 'FunctionExpression' || \n          node.type === 'ArrowFunctionExpression') {\n        addBeforeCode(node);\n      }\n    }\n  });\n  return escodegen.generate(ast);\n}\n ```\n\n## Reto 2: Añadir el número de línea\n\nPara poder añadir el numero de linea se ha modificado el codigo de `logging-espree.js` modificando la función `addBeforeCode` para que añada el numero de linea al log. También se ha modificado la función `addAfterCode` activando el flag `loc` de `espree.parse` para que se añada la información de la linea al nodo y selectccionando la versión 6 de `ecmaVersion` para que se soporte la sintaxis de las las comillas invertidas. \n\n```javascript \nfunction addBeforeCode(node) {\n  const name = node.id ? node.id.name : '<anonymous function>';\n  const params = node.params.map(p => '${ ' +  p.name + ' }').join(', ');\n  const beforeCode = 'console.log(\\`Entering ' + name + '(' + params + ') at line ' + node.loc.start.line + '\\`);';\n  const beforeNodes = espree.parse(beforeCode, { ecmaVersion: 6 }).body;\n  node.body.body = beforeNodes.concat(node.body.body);\n}\n```\n\n\n\n## Tests and Covering\n\n### Tests\n\nContamos con 4 tests para comprobar que el código funciona correctamente.\nEl ultimo de ellos utilizando las funciones desarrolladas para la práctica anterior.\n\n```javascript\nexport default [\n  {\n    input: 'test1.js',\n    output: 'logged1.js',\n    correctLogged: 'correct-logged1.js',\n    correctOut: 'logged-out1.txt'\n  },\n  {\n    input: 'test2.js',\n    output: 'logged2.js',\n    correctLogged: 'correct-logged2.js',\n    correctOut: 'logged-out2.txt'\n  },\n  {\n    input: 'test3.js',\n    output: 'logged3.js',\n    correctLogged: 'correct-logged3.js',\n    correctOut: 'logged-out3.txt'\n  },\n  {\n    input: 'test4.js',\n    output: 'logged4.js',\n    correctLogged: 'correct-logged4.js',\n    correctOut: 'logged-out4.txt'\n  },\n]\n```\nEl contenido del fichero `logged-out4.txt` es el siguiente ya que la función `factorial` es recursiva y se llama a si misma 5 veces.\n\n```\nEntering factorial(5) at line 1\nEntering factorial(4) at line 1\nEntering factorial(3) at line 1\nEntering factorial(2) at line 1\nEntering factorial(1) at line 1\nEntering factorial(0) at line 1\nEntering pow(2, 3) at line 7\n```\nLos tests se ejecutan con el comando `npm run test` y se puede ver el resultado en la siguiente imagen.\n\n![tests](./img/tests.png)\n\nPara poder realizar las proebas se a añadido al fichero `test.mjs` el siguiente código.\n\n```javascript\nfor (let i = 0; i < Test.length; i++) {\n  it ('Test ' + i, async function () {\n    const t = Test[i];\n    await transpile(t.input, t.output);\n    const correctLogged = await fs.readFile(t.correctLogged, 'utf-8');\n    assert.equal(removeSpaces(correctLogged), removeSpaces(await fs.readFile(t.output, 'utf-8')));\n\n    let outputs = [];\n    let oldLog = console.log;\n    console.log =\n        function(...args) {\n      outputs.push(args.join(' '));\n    }\n\n    await import(t.output);\n    console.log = oldLog;\n    const correctOut = await fs.readFile(t.correctOut, 'utf-8');\n    assert.equal(removeSpaces(outputs.join('\\n')), removeSpaces(correctOut));\n  });\n}\n```\nCon el `for` se recorrer los objetos de `Test` y se ejecutan los tests.  En el `it` se ejecutan las pruebas. Primero se transpila el código de entrada y se comprueba que el código transpilado es igual al código correcto. Después se ejecuta se sobreescribe la función `console.log` para que guarde los logs en un array y se ejecuta el código transpilado. Por último se comprueba que los logs son iguales a los logs correctos.\n\n### Covering\n\nPara comprobar el covering se ha utilizado el comando `npm run cov` y se puede ver el resultado en la siguiente imagen.\n\n![covering](./img/covering.png)\n\nExiste una incompatibilidad con `nyc` que causa que no se muestre el covering de los ficheros `test.mjs` y `logging-espree.mjs`.\n\n# Script de ejecución\n\nPara poder ejecutar tanto los tests como el cubrimiento se a añadido al fichero `package.json` el siguiente código.\n\n```json\n    \"scripts\": {\n        \"test\": \"mocha test/test.mjs\",\n        \"cov\": \"nyc npm run test\"\n    },\n```\n# Publicación en npm\n\nPrimero es necesario configurar npm introducioendo los siguientes comandos en la terminal.\n\n```bash\nnpm config set init-author-name \"nombre\"\nnpm config set init-author-email \"correo\"\nnpm config set init-author-url \"url\"\n```\nLuego se crea una cuenta en npm y nos conectamos con el comando `npm login`.\n\nAhora modificamos el `package.json` para que tenga la siguiente estructura.\n\n```json\n  \"name\": \"@aluxxxxxxxxxx/directorio\",\n  \"version\": \"1.0.0\",\n```\nDonde `@aluxxxxxxxxxx` es nuestro nombre de usuario en npm y `directorio` es el nombre del directorio donde se encuentra el código.\n\nPara publicar el paquete en npm se ejecuta el comando `npm publish --access public`.\n\nSiempre que se quiera actualizar el paquete se debe cambiar la versión en el `package.json` y ejecutar el comando `npm publish --access public`.\n\n![npm](./img/npm.png)","readmeFilename":"README.md"}