autocorector
Version:
autoCOREctor de asignaturas y MOOCs de la ETSIT-UPM
3 lines (2 loc) • 25.8 kB
JavaScript
()=>{var e=[,e=>{"use strict";e.exports=require("fs")},e=>{"use strict";e.exports=require("path")},e=>{"use strict";e.exports=require("chalk")},(e,o,s)=>{const t=s(1).promises,r=(s(1),s(5)),a=s(6),l=s(2),n=s(3),i=s(7),c=s(8),u=s(9),d=s(10);var{execSync:g}=s(11);const p={},b=n.bgRed,m=n.green,h=n.bgCyan,v=n.yellow.inverse,f=n.bgGreen,w=n.green,y=n.bgBlue,E=n.bgMagenta,x=process.env.MIRIADAX;p.getConfig=async()=>{if(global.devLog("getConfig"),global.debug("Obteniendo la configuración del package.json"),!await p.checkFileExists("package.json"))return Promise.reject(new Error("Esto no parece un repositorio Git, no tiene package.json. No se puede usar el corrector automático. Se ejecutó desde la ruta: "+process.cwd()));try{const e=JSON.parse(await t.readFile(l.resolve(process.cwd(),"package.json")));return Promise.resolve(e)}catch(e){return global.debug("Error procesando el package.json",e),Promise.reject(e)}},p.processArguments=e=>{global.debug("processArguments",e);let o={};e.slice(2);return e.forEach((t,r)=>{if("--help"===t&&(console.log("Usage:"),console.log("autocorector [--help] [--debug] [--jest] [--jestnative] [--upload] [--saveLog <filename>] [--version] [--upload]"),console.log(""),console.log("Options:"),console.log("--help Muestra este mensaje de ayuda y cierra (no admite más parámetros si --help está presente)"),console.log("--debug Muestra información de depuración"),console.log("--jest Ejecuta los tests de Jest"),console.log("--jestnative Ejecuta los tests de Jest con React Native"),console.log("--upload Subir los resultados a Moodle"),console.log("--saveLog <filename> Guarda los resultados en un archivo de nombre filename"),console.log("--version Comprueba la versión del autocorector instalada"),console.log("--path <path> Path to use"),console.log(""),process.exit(0)),"--debug"===t&&(console.log("DEBUG MODE ACTIVATED VIA ARGUMENT --DEBUG"),global.setDebug(!0),o.debug=!0),"--jest"===t&&(o.jest=!0),"--jestnative"===t&&(o.jestnative=!0),"--port"===t&&(console.log("TODO - USAR PORT"),o.port=e[r+1]),"--path"===t&&(console.log("TODO - USAR PATH"),o.path=e[r+1]),"upload"!==t&&"--upload"!==t&&"-u"!==t||(o.upload=!0),"--saveLog"===t&&(o.saveLog=!0,o.saveLogFilename=e[r+1]),"--version"===t||"-v"===t){var a=s(12).version,l=void 0;try{(l=g("npm show autocorector version").toString().trim())===a?console.log("Tienes la última versión del autoCOREctor ("+a+")\n"):(console.log("No tienes la última versión del autoCOREctor ("+l+"). La versión instalada es la "+a),console.log('\nPara actualizarlo ejecuta "npm update autocorector"'))}catch(e){console.error("No se ha podido comprobar si el autoCOREctor está utilizando la última versión. La versión instalada es la "+a),console.log(e)}process.exit(0)}}),o},p.checkFileExists=async e=>{global.devLog("checkFileExists",e);try{return await t.access(e,t.F_OK),!0}catch(e){return!1}},p.createFolder=async e=>{global.devLog("createFolder",e),await p.checkFileExists(l.resolve(process.cwd(),e))||(global.debug("Data folder does not exist, let's create it"),await t.mkdir(e))},p.getEmailAndToken=async(e,o="autocorector")=>{global.devLog("getEmailAndToken method for userfile and endpoint:",e,o),global.debug("Obteniendo el nombre, el email y el token del usuario.");let s={};const r=o.match(/moocauto/i);if(await p.checkFileExists(l.resolve(process.cwd(),e)))try{return s=JSON.parse(await t.readFile(l.resolve(process.cwd(),e))),Promise.resolve(s)}catch(e){return global.debug("Error procesando el fichero de usuario",e),Promise.reject(new Error("El fichero con la información del usuario contiene información inválida."))}const n=a.createInterface({input:process.stdin,output:process.stdout}),i=r?"Escriba su email con el que accede a MiriadaX: ":"Escriba su email de alumno: ",c=r?"Escriba su token de MiriadaX: ":"Escriba su token de Moodle: ";return new Promise(function(o,r){console.log(m("A continuación se pedirán sus datos (nombre, email y token) para subir sus resultados")),n.question(m("Escriba su nombre y apellidos: "),function(a){s.name=a,n.question(m(i),function(a){s.email=a,n.question(m(c),async a=>{s.token=a;try{await t.writeFile(l.resolve(process.cwd(),e),JSON.stringify(s,null,4)),global.debug("Fichero user.json creado con la información provista por el usuario")}catch(e){console.log(b(e)),r(new Error("NO SE HA PODIDO CREAR EL FICHERO USER.JSON"))}n.close(),o(s)})})})})},p.generateRandomUserId=()=>{global.devLog("generateRandomUserId");const e=(new Date).valueOf().toString(),o=Math.random().toString();return r.createHash("sha1").update(e+o).digest("hex")},p.getHashMultipleFiles=async e=>{global.devLog("getHashMultipleFiles",e);let o="";for(let s=0;s<e.length;s++)o+=await t.readFile(l.resolve(process.cwd(),e[s]),"utf8");o=o.replace(/ |\r\n|\n|\r/gm,"");return r.createHash("md5").update(o).digest("hex")},p.getHashString=e=>{global.devLog("getHashString");let o="";o=e.replace(/ |\r\n|\n|\r/gm,"");return r.createHash("md5").update(o).digest("hex")},p.getSignature=e=>{global.debug("getSignature");return r.createHmac("sha512","new JSON({user_info})").update(JSON.stringify(e)).digest("hex")},p.askForDataCorrect=e=>{global.devLog("askForDataCorrect",e);const o=a.createInterface({input:process.stdin,output:process.stdout});return new Promise(function(s,t){console.log(m(`Los datos con los que se va a firmar la práctica son, email: ${e.email}, token: ${e.token}`)),o.question(h("¿Son correctos? (y/N): "),function(e){s("y"===e||"yes"===e,t),o.close()})})},p.askForConsent=()=>{global.devLog("askForConsent");const e=a.createInterface({input:process.stdin,output:process.stdout});return new Promise(function(o,s){console.log(m("El contenido de la práctica, así como los test que se le pasan van a ser firmados.")),console.log(m("Es importante que sepa que se van a enviar al servidor y en él se validará la firma y la autenticidad, así como se pasará un anticopia.")),e.question(h("¿Confirma que ha realizado usted mismo la práctica y desea enviarla al servidor para registrar la nota? (y/N):\n"),t=>{o("y"===t||"yes"===t,s),e.close()})})},p.checkCaptures=async(e,o)=>{if(global.devLog("checkCaptures",e,o),!await p.checkFileExists(l.resolve(process.cwd(),e)))return global.debug("Directorio para las capturas no existe. Debería ser: "+l.resolve(process.cwd(),e)),!1;return(await t.readdir(l.resolve(process.cwd(),e))).length>=o},p.askForResearchConsent=e=>{global.devLog("askForResearchConsent",e);const o=a.createInterface({input:process.stdin,output:process.stdout});return new Promise(function(e,s){o.question(h("Al hacer uso de esta herramienta se recogerán datos anónimos para uso exclusivo de investigación. Si desea continuar pulse 'Y'. En caso contrario, pulse 'N'\n"),t=>{e("y"===t||"Y"===t||"yes"===t,s),o.close()})})},p.compress=async e=>{global.devLog("compress",e),global.debug("Comprimiendo archivos...");const o=i("zip",{zlib:{level:9}}),s=(await t.open(l.resolve(process.cwd(),e),"w")).createWriteStream();return new Promise((e,t)=>{o.glob("**",{ignore:["node_modules/**","**/node_modules/**","tests/**","bin/**","README.md","LICENSE","*.zip","autocorector/data/*.zip"]}),o.glob("autocorector/data/res.enc"),o.on("error",e=>{global.devLog(e),t(e)}),o.on("warning",function(e){if(global.devLog(e),"ENOENT"!==e.code)throw e}),o.pipe(s),s.on("close",()=>{const s=o.pointer()/1048576;global.debug("El fichero zip creado ocupa "+s+" MB"),e(+s.toFixed(2))}),o.finalize()})},p.checkHash=async(e,o,s)=>{global.devLog("checkHash",e,o,s),global.debug("Comprobando el hash de los ficheros para ver que no se ha modificado ninguno...");let r=[];const a=await t.readdir(o);for(const e of a)global.debug("Test file encontrado: "+e),r.push(l.join(o,e));if(null!=s&&""!==s&&await p.checkFileExists(s)){const e=await t.readdir(s);for(const o of e)global.debug("Utils file encontrado: "+o),r.push(l.join(s,o))}const n=await p.getHashMultipleFiles(r);global.devLog("Local hash",n);let i="";for(const o of r)i+=await p.getGitHubFileAsString(e,o);const c=p.getHashString(i);global.devLog("Github hash de los ficheros",c),global.debug("Hash remoto, hash local:",n,c),n!==c?(console.log(b("WARNING: se ha detectado que el fichero de tests es diferente al oficial, esto dará problemas al subir la nota al servidor. Puede ser que los profesores hayan realizado modificaciones o arreglos de los tests publicados.")),console.log(b(`Si ha utilizado git para descargar la práctica ejecute las ordenes 'git pull' y 'git checkout ${o}*' para volver a obtener la versión oficial de los tests, o si no ha usado git para descargar la práctica vuelva a sustituir ${o}* por una copia recien descargada del repositorio.`))):global.debug("Ficheros de tests sin modificar")},p.rawGitHubUrl=(e,o,s,t)=>`https://raw.githubusercontent.com/${e}/${o}/${t}/${s}`,p.downloadFileFromGitHubSingle=async(e,o,s,t)=>{try{const r=p.rawGitHubUrl(e,o,s,t);global.debug("Download from Github URL: "+r);const a=await c("get",r);if(a.statusCode>=400&&a.statusCode<=500)throw new Error("Error in request "+a.statusCode);return a.body}catch(e){return global.debug("Error in downloadFileFromGitHubSingle",e),"*"}},p.downloadFileFromGitHub=async(e,o,s,t)=>{let r=await p.downloadFileFromGitHubSingle(e,o,s,t);return"*"===r&&(r=await p.downloadFileFromGitHubSingle(e,o,s,"main"),"*"===r&&(r=await p.downloadFileFromGitHubSingle(e,o,s,"master"))),global.devLog("downloadFileFromGitHub terminado"),r},p.checkTestVersion=async(e,o,s="main")=>{global.devLog("checkTestVersion",e,o),global.debug("Comprobando la versión de los tests...");const[t,r]=e.split("/");try{const e=await p.downloadFileFromGitHub(t,r,"package.json",s);if(global.debug(e),"*"===e)throw new Error;return JSON.parse(e).version}catch(e){return"*"}},p.getGitHubFileAsString=async(e,o,s="main")=>{global.devLog("getGitHubFileAsString",e,o,s);const[t,r]=e.split("/");let a=o;a.startsWith("./")&&(a=a.substring(2));try{const e=await p.downloadFileFromGitHub(t,r,a,s);return Buffer.from(e).toString()}catch(e){throw new Error(e)}},p.encryptBufferWithRsaPublicKey=async(e,o)=>{global.devLog("encryptBufferWithRsaPublicKey");const s=await t.readFile(l.resolve(process.cwd(),o),"utf8"),a=Buffer.from(e);return r.publicEncrypt({key:s,padding:r.constants.RSA_NO_PADDING},a).toString("base64")},p.en=(e,o)=>{global.devLog("en");const s=r.createHash("sha256").update(o).digest("base64").substr(0,32),t=r.randomBytes(16),a=r.createCipheriv("aes-256-ctr",s,t),l=Buffer.from(e);return Buffer.concat([t,a.update(l),a.final()]).toString("hex")},p.de=(e,o)=>{global.devLog("de");let s=Buffer.from(e,"hex");const t=s.slice(0,16);s=s.slice(16);const a=r.createHash("sha256").update(o).digest("base64").substr(0,32),l=r.createDecipheriv("aes-256-ctr",a,t);return Buffer.concat([l.update(s),l.final()]).toString()},p.sendFile=async(e,o,s)=>{global.devLog("sendFile",e,o),console.log("Enviando práctica al servidor...");const t={submission:{file:l.resolve(process.cwd(),o),filename:"submission.zip",content_type:"application/zip"}};try{const o={multipart:!0,accept:"application/json"},r=await c("post",e,t,o);200===r.statusCode?(console.log(m(r.body||"Ok")),await p.cleanHistoryRecords(s)):(console.log(b("ERROR")),console.error(r.body||"Error"))}catch(e){console.error(e||"Error")}},p.sendLog=async(e,o,s)=>{global.devLog("sendLog",e,o,s);const r={history:await t.readFile(l.resolve(process.cwd(),s),"utf8")};try{const o={accept:"application/json"},t=await c("post",e,r,o);200===t.statusCode?(global.debug("sendLog",m(t.body||"OK")),await p.cleanHistoryRecords(s)):(global.debug("sendLog",b("ERROR")),global.debug("sendLog",t.body||"Respuesta errónea del servidor"))}catch(e){global.debug("sendLog",e||"Error subiendo a servidor")}},p.execTestsJest=(e,o=!1)=>(global.devLog("execTestsJest",e),new Promise(t=>{const r={score:0,score_total:10};global.debug("Ejecutando nueva test suite de JEST."),global.debug("Ficheros de tests en la ruta: "+e);const{runCLI:a}=s(13),l={testMatch:["**/**/*.[jt]s?(x)"],roots:["<rootDir>"+e],verbose:!0,testTimeout:6e4,setupFilesAfterEnv:["@testing-library/jest-native/extend-expect"],transformIgnorePatterns:["/node_modules/(?!(@react-native|react-native)/).*/","^.+\\.module\\.(css|sass|scss)$"],transform:{"^.+\\.(js|jsx|mjs|cjs|ts|tsx)$":"<rootDir>/node_modules/autocorector/scripts/jest/babelTransform.js","^.+\\.css$":"<rootDir>/node_modules/autocorector/scripts/jest/cssTransform.js","^(?!.*\\.(js|jsx|mjs|cjs|ts|tsx|css|json)$)":"<rootDir>/node_modules/autocorector/scripts/jest/fileTransform.js"},maxWorkers:"1",transformIgnorePatterns:["^.+\\.module\\.(css|sass|scss)$"],modulePaths:[],moduleNameMapper:{"^.+\\.module\\.(css|sass|scss)$":"identity-obj-proxy"},moduleFileExtensions:["js","jsx"],reporters:[["<rootDir>/node_modules/autocorector/scripts/jest/custom-reporter.js",{banana:"yes",pineapple:"no"}]],testSequencer:"<rootDir>/node_modules/autocorector/scripts/jest/test-sequencer.js"};o?(l.setupFilesAfterEnv=["@testing-library/jest-native/extend-expect"],l.preset="jest-expo"):(l.setupFilesAfterEnv=["<rootDir>/node_modules/autocorector/scripts/jest/jest-setup.js"],l.testEnvironment="jsdom"),a({config:JSON.stringify(l)},[process.cwd()]).then(e=>{global.debug("JEST test suite terminada con éxito.");for(let o=0;o<e.results.testResults.length;o++)for(let s=0;s<e.results.testResults[o].testResults.length;s++)if("passed"===e.results.testResults[o].testResults[s].status){let t=JSON.parse(e.results.testResults[o].testResults[s].title);r.score+=t.score}t(r)}).catch(e=>{global.debug("JEST test suite terminada con un error:"),console.error(e),t(r)})})),p.execTests=e=>(global.devLog("execTests",e),new Promise(async o=>{global.should=s(14).should(),global.exec=d.promisify(s(11).exec),global.Browser=s(15);const r={score:0,score_total:0};let a;global.debug("Call new Mocha test suites:");const n=new u({timeout:6e4,reporter:function(){}});try{a=await t.readdir(e);for(const o of a)o.endsWith(".js")||o.endsWith(".jsx")||o.endsWith(".ts")?(global.debug("Añadiendo fichero de test: "+o),n.addFile(l.join(e,o))):global.debug("Fichero de test no añadido, no es fichero de test: "+o)}catch(e){console.error(e)}n.loadFilesAsync().then(()=>{n.run(e=>process.exitCode=e?1:0).on("suite",function(e){console.log(`${v(e.title)}\n`)}).on("test",function(e){console.log(f(`Test: ${e.title}`))}).on("pass",function(e){r.score+=e.ctx.score,r.score_total+=e.ctx.score,console.log(`\t${w("ESTADO: ")}${f("PASSED")}`),console.log(`\t${w("PUNTUACIÓN: ")}${e.ctx.score}/${e.ctx.score}`),console.log(`\t${w("OBSERVACIONES: ")}${e.ctx.msg_ok} \n`),console.log(`${y("--------------------------------------------------------------------------------")} \n`)}).on("fail",function(e,o){try{e.title.indexOf('"after all" hook')<0&&e.title.indexOf('"before all" hook')<0?(r.score_total+=e.ctx.score,console.log(`\t${w("ESTADO: ")}${b("FAILED")}`),console.log(`\t${b("PUNTUACIÓN: ")}0/${e.ctx.score}`),console.log(`\t${b("OBSERVACIONES:")}${e.ctx.msg_err}`)):console.log(b("ERROR TEST MOCHA: ")+o),global.debug(b("Ha fallado el test o se ha producido una excepción.")),global.debug("El error es:",o);const s=new RegExp("\\((.+("+a.join("|")+").+?)\\)","g"),t=o.stack.match(s);if(t){let e=t[0];const o=new RegExp("\\:(\\d*?)\\:"),s=e.match(o),r=e.split(":"+s[1]+":")[0];s.length>=0&&!r.startsWith("node_modules")&&console.log(E(`\tEl test que ha fallado está en el fichero: ${r.substr(1)} en la línea ${s[1]}. Puedes abrir el fichero y ver qué comprobación está fallando.\n`))}console.log(`${y("--------------------------------------------------------------------------------")} \n`)}catch(o){console.log(o)}}).on("end",function(){r.score=parseFloat(r.score.toPrecision(12)),r.score_total=parseFloat(r.score_total.toPrecision(12)),o(r)})}).catch(e=>{console.log("CATCH: ",e)})})),p.initHistory=async()=>{global.devLog("initHistory");const e=[],o={},s=await t.stat("package.json");return o.started=!0,o.datetime=s.mtime,x&&(o.userId=p.generateRandomUserId()),e.push(o),e},p.saveHistoryRecord=async(e,o,s)=>{global.devLog("saveHistoryRecord",e,o);let r=!1;if(await p.checkFileExists(l.resolve(process.cwd(),s)))try{const e=await t.readFile(l.resolve(process.cwd(),s),"utf8"),o=p.de(e,"pubkey.pem");r=JSON.parse(o)}catch(e){console.log("ERROR Recuperable: ",b(e)),global.debug(e),r=await p.initHistory()}else r=await p.initHistory();const a={started:!1,datetime:new Date,score:e.score,score_total:e.score_total,version:o,autoCOREctorVersion:"4.0.1"};r.push(a);const n=p.en(JSON.stringify(r,null,4),"pubkey.pem");try{return await t.writeFile(l.resolve(process.cwd(),s),n,"utf8"),r}catch(e){return console.log(b(e)),e}},p.cleanHistoryRecords=async e=>{if(global.devLog("cleanHistoryRecords"),await p.checkFileExists(l.resolve(process.cwd(),e))){const o=await t.readFile(l.resolve(process.cwd(),e),"utf8"),s=p.de(o,"pubkey.pem"),r=[JSON.parse(s)[0]],a=p.en(JSON.stringify(r,null,4),"pubkey.pem");return t.writeFile(l.resolve(process.cwd(),e),a,"utf8")}},e.exports=p},e=>{"use strict";e.exports=require("crypto")},e=>{"use strict";e.exports=require("readline")},e=>{"use strict";e.exports=require("archiver")},e=>{"use strict";e.exports=require("needle")},e=>{"use strict";e.exports=require("mocha")},e=>{"use strict";e.exports=require("util")},e=>{"use strict";e.exports=require("child_process")},e=>{"use strict";e.exports=JSON.parse('{"name":"autocorector","version":"4.0.1","description":"autoCOREctor de asignaturas y MOOCs de la ETSIT-UPM","main":"scripts/launcher.min.js","disableHashCheck":true,"devLogs":true,"capturesFolder":"miscapturas","capturesNumber":2,"usejest":true,"scripts":{"checks":"node scripts/launcher.js --debug","upload":"node scripts/launcher.js --debug --upload","log":"node scripts/launcher.js --saveLog salida2.log","uglify":"webpack","buildold":"webpack && cd dist && pkg ../scripts/launcher.min.js && mv launcher.min-linux corrector-linux && mv launcher.min-win.exe corrector-windows.exe && mv launcher.min-macos corrector-macos","build:dev":"webpack --mode development && cd dist && pkg ../scripts/launcher.min.js && mv launcher.min-linux corrector-linux && mv launcher.min-win.exe corrector-windows.exe && mv launcher.min-macos corrector-macos","lint":"eslint . ","prepack":"npm run uglify"},"pkg":{"scripts":"scripts/launcher.js","assets":"scripts/jest/*","targets":["node16-win-x64"],"outputPath":"dist"},"bin":{"autocorector":"scripts/launcher.min.js"},"keywords":["MOOCs","self-assessment"],"author":"ging","license":"GNU","info":{"githubURL":"REACT-UPM/P1_eltiempo_2024","serverUrl":"https://aat.dit.upm.es/","courseId":"8249","assignmentId":"73146"},"repository":{"type":"git","url":"https://github.com/ging/autoCOREctor","directory":"client"},"engines":{"node":">=20"},"babel":{"presets":["react-app"]},"peerDependencies":{"react":"^19.1.1","react-dom":"^19.1.1"},"dependencies":{"@babel/core":"^7.28.3","@babel/plugin-transform-runtime":"^7.28.3","@babel/preset-react":"^7.27.1","@babel/register":"^7.28.3","@babel/runtime":"^7.28.3","@testing-library/dom":"^10.4.1","@testing-library/jest-dom":"^6.7.0","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.1","archiver":"5.3.1","babel-jest":"^30.0.5","babel-loader":"^10.0.0","babel-plugin-named-asset-import":"^0.3.8","babel-plugin-transform-vite-meta-env":"^1.0.3","babel-preset-react-app":"^10.1.0","chai":"5.3.1","chalk":"4.1.2","eslint":"^8.18.0","figlet":"1.5.2","global-jsdom":"^26.0.0","jest":"^30.0.5","jest-cli":"^30.0.5","jest-environment-jsdom":"^30.0.5","jsdom":"^26.1.0","mocha":"^11.7.1","needle":"^3.1.0","object-hash":"^3.0.0","react-app-polyfill":"^3.0.0","react-router":"^7.8.1","terser-webpack-plugin":"^5.3.3","uglify-js":"^3.17.4","webpack":"^5.94.0","webpack-cli":"^5.1.4","webpack-node-externals":"^3.0.0","zombie":"^6.1.4"},"devDependencies":{"webpack-shebang-plugin":"^1.1.8"}}')},e=>{"use strict";e.exports=require("@jest/core")},e=>{"use strict";e.exports=require("chai")},e=>{"use strict";e.exports=require("zombie")}],o={};function s(t){var r=o[t];if(void 0!==r)return r.exports;var a=o[t]={exports:{}};return e[t](a,a.exports,s),a.exports}(()=>{const e=s(1).promises,o=s(2),t=s(3),r=s(4),a="./autocorector/tests",l="./autocorector/data",n="./user.json",i=`${l}/res.enc`,c=`${l}/assignment.zip`,u=`${l}/his.enc`,d=(t.blue,t.bgRed),g=t.green,p=t.bgRed,b=t.bgGreen,{MIRIADAX:m}=process.env;process.env.BABEL_ENV="development",global.setDebug=e=>{global.withDebug=e},global.debug=(...e)=>{global.withDebug&&console.log(...e)},global.setDevLogs=e=>{global.withDevLogs=e},global.devLog=(...e)=>{global.withDevLogs&&console.log(...e)},r.getConfig().then(async s=>{let t=+process.version.substring(1,3);console.log("La versión de Node es: "+process.version),(t<18||19===t||21===t)&&(console.log("Tiene una versión de Node inferior a la 16. Este programa solo funciona con Node > 16"),console.log('Actualice su versión de node y reinicie el pc. De tal modo que al ejecutar el comando "node -v" de como resultado una versión superior a la 18'),process.exit(0)),19!==t&&21!==t||(console.log("Tiene una versión de Node 19 o 21. Este programa solo funciona con Node LTS"),console.log('Instale una versión de Node que sea LTS (18 o 20) y reinicie el pc. De tal modo que al ejecutar el comando "node -v" de como resultado una versión 18 o 20'),process.exit(0));let h=r.processArguments(process.argv);if(h.saveLog){const t=(await e.open(o.resolve(process.cwd(),h.saveLogFilename),"w")).createWriteStream();process.stdout.write=process.stderr.write=t.write.bind(t),s.devLogs=!0,s.debug=!0}s.debug&&(console.log("DEBUG MODE ACTIVADO VIA PACKAGE.JSON CONFIG"),global.setDebug(s.debug)),s.devLogs&&(console.log("DEVLOGS MODE ACTIVADO VIA PACKAGE.JSON CONFIG"),global.setDevLogs(s.devLogs)),s.usejest&&(console.log("JEST ACTIVADO VIA PACKAGE.JSON CONFIG"),h.jest=!0),s.usejestnative&&(console.log("JEST NATIVE ACTIVADO VIA PACKAGE.JSON CONFIG"),h.jestnative=!0);try{const t=await r.checkTestVersion(s.info.githubURL,"package.json",s.info.branch);h.upload||"*"!==t?t!==s.version&&(global.debug("Version de los test del repositorio es: "+t+" y tu version es: "+s.version),console.log(d("No tienes la última versión de los TESTs o no tienes conexión de red. Debes tener conexión de red y además tener la última versión de los test, para ello actualiza el repositorio.")),console.log(g(`Si has utilizado git para bajártelo tan solo tendrás que hacer git pull, si no has usado git vuelve a bajarte el repo completo y sustituye la carpeta ${a} y el fichero package.json por la última versión.`))):console.log(g(`No se ha podido comprobar si tienes la última versión de los test, no hay conexión a Internet o el repositorio remoto ha devuelto un error al intentar acceder. Se empleará la versión ${s.version}`)),h.upload&&t!==s.version&&(global.debug("No se puede subir la práctica por no coincidir la versión de los tests"),process.exit(0)),s.localHashCheck?(global.debug("Vamos a comprobar el hash de los ficheros de test"),await r.checkHash(s.info.githubURL,a,"./autocorector/utils")):global.debug("WARNING: DisableHashCheck opción a 'true', saltando hash check");const v=`${s.info.serverUrl}api/${m?"coursesMiriadax":"courses"}/${s.info.courseId}/assignments/${s.info.assignmentId}`;await r.createFolder(l);let f,w=await r.getEmailAndToken(n,s.info.serverUrl);h.jest||h.jestnative?(global.debug("Ejecutando tests con JEST"),f=await r.execTestsJest(a,h.jestnative)):(global.debug("Ejecutando tests con MOCHA"),f=await r.execTests(a));const y=await r.saveHistoryRecord(f,s.version,u);if(f.score===(f.score_total||10)?console.log(b(`Resultado Final: ${f.score}/${f.score_total}\n\n`)):console.log(p(`Resultado Final: ${f.score}/${f.score_total}\n\n`)),h.saveLogs&&(myfilehandle.close(),console.log(b(`Se ha creado el fichero ${h.saveLogFilename} con los logs de la práctica, ya los puedes mandar junto con el zip de la práctica (sin node_modules) al profesor.`)),process.exit(0)),h.upload){await r.askForDataCorrect(w)||(await r.checkFileExists(o.resolve(process.cwd(),n))&&await e.unlink(o.resolve(process.cwd(),n)),w=await r.getEmailAndToken(n,s.info.serverUrl));if(await r.askForConsent()||(console.log(d("Asegurese de haber hecho usted la práctica que va a subir al servidor.")),process.exit(0)),s.capturesNumber&&s.capturesNumber>0){const e=void 0===s.capturesFolder?"capturas":s.capturesFolder;await r.checkCaptures(e,s.capturesNumber)||(console.log(d(`No se han encontrado las capturas de pantalla requeridas. Se necesitan ${s.capturesNumber} capturas en el directorio ${o.resolve(process.cwd(),e)}`)),process.exit(0))}w.score=f.score,w.score_total=f.score_total,w.test_version=s.version,w.history=y;const t=JSON.parse(JSON.stringify(w));w.signature=r.getSignature(t),global.devLog("RESULTS: ",w);const a=r.en(JSON.stringify(w,null,4),"pubkey.pem");await e.writeFile(o.resolve(process.cwd(),i),a);await r.compress(c)>20?console.log(d("ERROR CRITICO. El fichero zip creado para la práctica supera el tamaño máximo permitido de 20MB. El corrector comprime todo lo que está en la carpeta del proyecto excepto el node_modules, asegurese de que no ha puesto archivos adicionales en la carpeta de la práctica, solo los requeridos para solucionarla.")):await r.sendFile(v,c,u),global.debug("¡FIN!")}else console.log(p("Este resultado es informativo. Debe ejecutar el autocorector con la opción -u o --upload para subir su nota y que quede registrada.")),console.log(b("Recuerde que puede subir su nota varias veces, se quedará con la última nota que haya subido cuando se cierre la entrega de la práctica.")),process.exit(0)}catch(e){console.log("ERROR, CERRAMOS TODO"),console.log(d(e)),console.log(e),process.exit(0)}}).catch(e=>{global.debug(e),console.log(d(e)),process.exit(0)})})()})();
(