{"_id":"@alu0101204512/addlogging","_rev":"1-6e714d649e9ae5d7b37e02f6cbc46ccb","name":"@alu0101204512/addlogging","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@alu0101204512/addlogging","author":{"name":"Cristo García González","email":"alu0101204512@ull.edu.es"},"scripts":{"sh":"node --inspect-brk syntax-highlight.js","grep":"node --inspect-brk idgrep.js","log":"node --inspect-brk logging.js","publish":"git ci -am modified && git push origin master","test":"npm run-script test-1 && npm run-script test-2 && npm run-script test-3 && npm run-script test-4 && npm run-script test-5","test-1":"node src/logging.js -o test/output1.js test/input1.js","test-2":"src/logging.js -o test/output1.js test/input1.js","test-3":"node src/logging.js -o test/output2.js test/input2.js","test-4":"src/logging.js -o test/output2.js test/input2.js","test-5":"src/logging.js -o test/output2.js"},"dependencies":{"acorn":"^6.4.2","commander":"^7.1.0","escodegen":"^1.14.3","escope":"^3.6.0","espree":"^7.3.1","esprima":"^4.0.1","estraverse":"^5.2.0","pegjs":"^0.10.0","readline":"^1.3.0","underscore":"^1.12.0"},"version":"0.1.0","gitHead":"cfe4379f683080dd53f5d8abe45b8041c6ccf11d","description":"Este programa recibe otro programa en forma de string, el cual modifica añadiendole sentencias ```console.log``` cada vez que se aparece una función.","_id":"@alu0101204512/addlogging@0.1.0","_nodeVersion":"15.8.0","_npmVersion":"7.5.1","dist":{"integrity":"sha512-Rv4f+yOjZ7Db4Lb7HH7I0BSkGooNF1bMpiwgMNaQuElvb/2yqDR4o3ZsQbNOH6Bia+K4cNGJXSV/h77VNEYsgg==","shasum":"a158ac11fd793a9ae8e99e9f0485a5cedc35874e","tarball":"https://registry.npmjs.org/@alu0101204512/addlogging/-/addlogging-0.1.0.tgz","fileCount":34,"unpackedSize":6230617,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQOsNCRA9TVsSAnZWagAAfNsP/07fSGBA/R4yzSVGGHiL\nQlaVMzfzOQq/RO7oMFUrxROI00+IWU8jJcUM9WNVkkbG8HC8cCfc4rEhFUSF\nW34Yr+YMCWloa5fh/ZI20EfboWCOw26idHaFwabYIejPTfm/DLL2MGacV9NR\nd2TIyKQLQoDnMYifGe/nIFAZy3H/UIub+lSyMoGG31Pn1d4EpzuYeQiOo+VG\no8bvvP3oYj7PTA6GPfCh0eqIMsqEjWBbx2nrJhtbft6YxqLzhpFMOdfB+XVB\nwjUmphYKVOGjOrL7vSuoCXwdX6pbWvWa+L6IzTVWHpuc42MxYno506EZtWI+\nahZXBB95p93HXEVEdyMgTMcZG+Ci5DBXZlPs/bWcpA9pIwIgBdUkBUTymOB+\ng8IOmtR3KWDg+eHPkAtyo2Ags66sZG14RQAC1BVuT7S4YHmPKF5sWaY1TvgL\n6ag5CyzMEgf+3gudfB7k5qrkYPTyqHtimQQeo/dSGg3A5jMD/hdRrWvhTLs/\nchK0qmOVEOxa/Uwx5KWI/oU6lHvxD7if8bAbXqDxEDOSiMnj87HQR+JkIFgA\nGVcFyL6etprlQKi77fr6HIgsT7x7ioYxqrMcArjmaYDre0JtlgxaSBci+zXD\nUfjSf3DW0JWOf47725SG0xPb5lH1FcRWEW58Wqj/fcCY60s1jGd1UPUVtqdW\nmukT\r\n=rWW/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHJJLKhHkmFyKAsSavFQFsD/XvSFZx9EwNw0gSy+Gl8wAiEAvstHYIIcW5wsGCO5jVKzUe6e6P7whNtMjo/D5FbgxQ8="}]},"_npmUser":{"name":"alu0101204512","email":"alu0101204512@ull.edu.es"},"directories":{},"maintainers":[{"name":"alu0101204512","email":"alu0101204512@ull.edu.es"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/addlogging_0.1.0_1614867212663_0.45578430340626563"},"_hasShrinkwrap":false}},"time":{"created":"2021-03-04T14:13:32.629Z","0.1.0":"2021-03-04T14:13:32.947Z","modified":"2022-04-04T13:41:05.780Z"},"maintainers":[{"name":"alu0101204512","email":"alu0101204512@ull.edu.es"}],"description":"Este programa recibe otro programa en forma de string, el cual modifica añadiendole sentencias ```console.log``` cada vez que se aparece una función.","author":{"name":"Cristo García González","email":"alu0101204512@ull.edu.es"},"readme":"# Práctica-2:  Espree Logging\nEste programa recibe otro programa en forma de string, el cual modifica añadiendole sentencias ```console.log``` cada vez que se aparece una función.\n\nPasamos el código original a la función \"addLoging\" la cúal lo primero que hace es invocar al método \"parse\" con el mismo. Con el trozo de código en forma de string se creara un AST (Abstract syntax tree) como el que podemos encontrar en (https://astexplorer.net/), con la función \"traverse\" recorremos el árbol. Por lo que estoy viendo en la variable \"node\" se guarda el nodo que estamos evaluando en el momento y en la variable \"parent\" el nodo de la iteración anterior, tal y como dice la [documentacion](https://github.com/estools/estraverse/wiki/Usage) hay que tener en cuenta que a veces este nodo es null, Si el nodo que estamos evaluando tiene como tipo \"FunctionDeclaration\" o \"FunctionExpresion\" se invoca a la función \"addBeforeCode\" pasandole ese nodo en especifico. \\\nEn este código: \n~~~js\nfunction  foo(a, b) {\n  var x = 'blah';\n  var y = (function () {\n    return 3;\n  })();\n}\n~~~ \ntiene el tipo \"FunctionDeclaration\" y a su vez internamente ```function () {return 3;}``` es \"FunctionExpression\".\n\nUna vez dentro de la función \"addBeforeCode\" miramos con un condicional ternario si tiene algun identificador (id), guardamos el indentificardor en caso de que tenga alguno y si no guardamos el string literal `<anonymous function>`. El primer nodo tiene como identificador \"foo\", mientras que el segundo no tiene, específicamente tiene el valor null, despúes simplemente incrustamos ese valor en un string, guardamos este string y lo convertimos en arbol AST, aunque solo nos quedamos con la parte \"body\" más exterior obviando campos como \"type\", \"start\" y \"end\", seguidamente concatenamos la estructura que acabamos de obtener al cuerpo del cuerpo, esto se hace así ya que con el primer body nos quitamos el nombre y los párametros de la función, lo que podríamos considerar la cabecera, y con el segundo nos deshacemos de las llevamos dejandonos con el código interior de la función. Atualizamos el nodo.\\\n__Nota:__ [concat](https://www.w3schools.com/jsref/jsref_concat_array.asp) es invocado por \"beforeNodes\" es por esto que aparece antes del valor \"node.body.body\".\n\nUna vez terminado con todos los nodos convertimos el AST en código javascript en forma de string.\n\n## Tarea:\n\nPara mostrar los párametros pasadas a la función, utilizo el siguiente código:\n~~~js\nlet param_name = [];\n  node.params.forEach(function(i) {param_name.push(\"${ \" + i.name + \" }\")});\n  param_name = param_name.join(', ');\n~~~\nAprovecho que estoy en \"addBeforeCode()\" para suponer que ya estamos tratando un nodo de algun tipo función y cada ``params`` del nodo cojo el el valor del campo ``name``, despúes simplemente le añado una ',' entre cada dos pares.\n\nLa función fleca (Arrow Function) esta identificada en el árbol como ``ArrowFunctionExpression`` por lo que simplemente añadimos lo propio en la condición:\n~~~js\nif (node.type === 'FunctionDeclaration' ||\n            node.type === 'FunctionExpression' ||\n            node.type === 'ArrowFunctionExpression') {\n            addBeforeCode(node);\n          }\n~~~\n\nPara mostrar la líne de la función podemos usar ``node.loc``, si lo mostramos por pantalla veremos algo como:\n~~~js\nSourceLocation {\n  start: Position { line: 3, column: 11 },\n  end: Position { line: 5, column: 3 }\n}\n~~~\nAquí podemos ver donde empieza y acaba la función. Al final nos queda:\n~~~js\nlet beforeCode = `console.log(\\`Entering ${name}(${param_name}) at line ${node.loc.start.line}\\`);`;\n~~~","readmeFilename":"README.md"}