@jutge.org/toolkit 4.4.6 → 4.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -683,7 +683,7 @@ Then, it updates the sharing settings in Jutge.org with the requested changes. T
683
683
  --solutions Share solutions
684
684
  --no-solutions Stop sharing solutions
685
685
 
686
- Finally, it updates problem.yml file with the current sharing settings and shows them.`).option("-d, --directory <directory>","problem directory",".").option("--passcode [code]","Set a passcode (prompted if omitted)").option("--no-passcode","Clear the passcode").option("--testcases","Share testcases").option("--no-testcases","Stop sharing testcases").option("--solutions","Share solutions").option("--no-solutions","Stop sharing solutions").action(async function(){let f=this.opts(),v;if(this.getOptionValueSource("passcode")!=="default"){let $=f.passcode;if($===!1)v=!1;else if($===!0||$===void 0||$==="")v=await Uq({message:"Passcode:"});else v=$}let l=this.getOptionValueSource("testcases")!=="default"?f.testcases:void 0,c=this.getOptionValueSource("solutions")!=="default"?f.solutions:void 0;await ci1(f.directory,{passcode:v,testcases:l,solutions:c})});import{exists as Wp2}from"fs/promises";import yI from"process";import Wi1 from"path";import{fileURLToPath as zp2}from"url";import Dp2 from"child_process";import Jp2,{constants as Op2}from"fs/promises";import{promisify as Ur2}from"util";import Qr2 from"child_process";import GI,{constants as Mi1}from"fs/promises";import wi1 from"process";import Lr2 from"os";import or2 from"fs";import pr2 from"fs";import Zi1 from"fs";var iI;function Ir2(){try{return Zi1.statSync("/.dockerenv"),!0}catch{return!1}}function rr2(){try{return Zi1.readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return!1}}function jI(){if(iI===void 0)iI=Ir2()||rr2();return iI}var kI,xr2=()=>{try{return pr2.statSync("/run/.containerenv"),!0}catch{return!1}};function Kh(){if(kI===void 0)kI=xr2()||jI();return kI}var hi1=()=>{if(wi1.platform!=="linux")return!1;if(Lr2.release().toLowerCase().includes("microsoft")){if(Kh())return!1;return!0}try{return or2.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!Kh():!1}catch{return!1}},E9=wi1.env.__IS_WSL_TEST__?hi1:hi1();import qi1 from"process";import{Buffer as tr2}from"buffer";import{promisify as Br2}from"util";import Fr2 from"child_process";var er2=Br2(Fr2.execFile),CI=()=>`${qi1.env.SYSTEMROOT||qi1.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;var N6=async(f,v={})=>{let{powerShellPath:l,...c}=v,$=N6.encodeCommand(f);return er2(l??CI(),[...N6.argumentsPrefix,$],{encoding:"utf8",...c})};N6.argumentsPrefix=["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand"];N6.encodeCommand=(f)=>tr2.from(f,"utf16le").toString("base64");N6.escapeArgument=(f)=>`'${String(f).replaceAll("'","''")}'`;function Ki1(f){for(let v of f.split(`
686
+ Finally, it updates problem.yml file with the current sharing settings and shows them.`).option("-d, --directory <directory>","problem directory",".").option("--passcode [code]","Set a passcode (prompted if omitted)").option("--no-passcode","Clear the passcode").option("--testcases","Share testcases").option("--no-testcases","Stop sharing testcases").option("--solutions","Share solutions").option("--no-solutions","Stop sharing solutions").action(async function(){let f=this.opts(),v;if(this.getOptionValueSource("passcode")===void 0)v=void 0;else if(this.getOptionValueSource("passcode")==="cli")if(f.passcode===!0)v=await Uq({message:"Passcode:"});else v=f.passcode;let l=this.getOptionValueSource("testcases")!=="default"?f.testcases:void 0,c=this.getOptionValueSource("solutions")!=="default"?f.solutions:void 0;await ci1(f.directory,{passcode:v,testcases:l,solutions:c})});import{exists as Wp2}from"fs/promises";import yI from"process";import Wi1 from"path";import{fileURLToPath as zp2}from"url";import Dp2 from"child_process";import Jp2,{constants as Op2}from"fs/promises";import{promisify as Ur2}from"util";import Qr2 from"child_process";import GI,{constants as Mi1}from"fs/promises";import wi1 from"process";import Lr2 from"os";import or2 from"fs";import pr2 from"fs";import Zi1 from"fs";var iI;function Ir2(){try{return Zi1.statSync("/.dockerenv"),!0}catch{return!1}}function rr2(){try{return Zi1.readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return!1}}function jI(){if(iI===void 0)iI=Ir2()||rr2();return iI}var kI,xr2=()=>{try{return pr2.statSync("/run/.containerenv"),!0}catch{return!1}};function Kh(){if(kI===void 0)kI=xr2()||jI();return kI}var hi1=()=>{if(wi1.platform!=="linux")return!1;if(Lr2.release().toLowerCase().includes("microsoft")){if(Kh())return!1;return!0}try{return or2.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!Kh():!1}catch{return!1}},E9=wi1.env.__IS_WSL_TEST__?hi1:hi1();import qi1 from"process";import{Buffer as tr2}from"buffer";import{promisify as Br2}from"util";import Fr2 from"child_process";var er2=Br2(Fr2.execFile),CI=()=>`${qi1.env.SYSTEMROOT||qi1.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;var N6=async(f,v={})=>{let{powerShellPath:l,...c}=v,$=N6.encodeCommand(f);return er2(l??CI(),[...N6.argumentsPrefix,$],{encoding:"utf8",...c})};N6.argumentsPrefix=["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand"];N6.encodeCommand=(f)=>tr2.from(f,"utf16le").toString("base64");N6.escapeArgument=(f)=>`'${String(f).replaceAll("'","''")}'`;function Ki1(f){for(let v of f.split(`
687
687
  `)){if(/^\s*#/.test(v))continue;let l=/^\s*root\s*=\s*(?<mountPoint>"[^"]*"|'[^']*'|[^#]*)/.exec(v);if(!l)continue;return l.groups.mountPoint.trim().replaceAll(/^["']|["']$/g,"")}}var sr2=Ur2(Qr2.execFile),fp2=(()=>{let v;return async function(){if(v)return v;let l="/etc/wsl.conf",c=!1;try{await GI.access(l,Mi1.F_OK),c=!0}catch{}if(!c)return"/mnt/";let $=await GI.readFile(l,{encoding:"utf8"}),Z=Ki1($);if(Z===void 0)return"/mnt/";return v=Z,v=v.endsWith("/")?v:`${v}/`,v}})(),_p2=async()=>{return`${await fp2()}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`},dO=E9?_p2:CI,Pi1,ui1=async()=>{return Pi1??=(async()=>{try{let f=await dO();return await GI.access(f,Mi1.X_OK),!0}catch{return!1}})(),Pi1},Hi1=async()=>{let f=await dO(),v=String.raw`(Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice").ProgId`,{stdout:l}=await N6(v,{powerShellPath:f});return l.trim()},mi1=async(f)=>{if(/^[a-z]+:\/\//i.test(f))return f;try{let{stdout:v}=await sr2("wslpath",["-aw",f],{encoding:"utf8"});return v.trim()}catch{return f}};function Sl(f,v,l){let c=($)=>Object.defineProperty(f,v,{value:$,enumerable:!0,writable:!0});return Object.defineProperty(f,v,{configurable:!0,enumerable:!0,get(){let $=l();return c($),$},set($){c($)}}),f}import{promisify as up2}from"util";import NI from"process";import{execFile as Hp2}from"child_process";import{promisify as vp2}from"util";import lp2 from"process";import{execFile as cp2}from"child_process";var $p2=vp2(cp2);async function VI(){if(lp2.platform!=="darwin")throw Error("macOS only");let{stdout:f}=await $p2("defaults",["read","com.apple.LaunchServices/com.apple.launchservices.secure","LSHandlers"]),l=/LSHandlerRoleAll = "(?!-)(?<id>[^"]+?)";\s+?LSHandlerURLScheme = (?:http|https);/.exec(f)?.groups.id??"com.apple.Safari";if(l==="com.apple.safari")return"com.apple.Safari";return l}import Zp2 from"process";import{promisify as hp2}from"util";import{execFile as wp2,execFileSync as qi3}from"child_process";var qp2=hp2(wp2);async function Yi1(f,{humanReadableOutput:v=!0,signal:l}={}){if(Zp2.platform!=="darwin")throw Error("macOS only");let c=v?[]:["-ss"],$={};if(l)$.signal=l;let{stdout:Z}=await qp2("osascript",["-e",f,c],$);return Z.trim()}async function gI(f){return Yi1(`tell application "Finder" to set app_path to application file id "${f}" as string
688
688
  tell application "System Events" to get value of property list item "CFBundleName" of property list file (app_path & ":Contents:Info.plist")`)}import{promisify as Kp2}from"util";import{execFile as Pp2}from"child_process";var Mp2=Kp2(Pp2),ai1={MSEdgeHTM:{name:"Edge",id:"com.microsoft.edge"},MSEdgeBHTML:{name:"Edge Beta",id:"com.microsoft.edge.beta"},MSEdgeDHTML:{name:"Edge Dev",id:"com.microsoft.edge.dev"},AppXq0fevzme2pys62n3e0fbqa7peapykr8v:{name:"Edge",id:"com.microsoft.edge.old"},ChromeHTML:{name:"Chrome",id:"com.google.chrome"},ChromeBHTML:{name:"Chrome Beta",id:"com.google.chrome.beta"},ChromeDHTML:{name:"Chrome Dev",id:"com.google.chrome.dev"},ChromiumHTM:{name:"Chromium",id:"org.chromium.Chromium"},BraveHTML:{name:"Brave",id:"com.brave.Browser"},BraveBHTML:{name:"Brave Beta",id:"com.brave.Browser.beta"},BraveDHTML:{name:"Brave Dev",id:"com.brave.Browser.dev"},BraveSSHTM:{name:"Brave Nightly",id:"com.brave.Browser.nightly"},FirefoxURL:{name:"Firefox",id:"org.mozilla.firefox"},OperaStable:{name:"Opera",id:"com.operasoftware.Opera"},VivaldiHTM:{name:"Vivaldi",id:"com.vivaldi.Vivaldi"},"IE.HTTP":{name:"Internet Explorer",id:"com.microsoft.ie"}},nO=new Map(Object.entries(ai1));class dI extends Error{}async function nI(f=Mp2){let{stdout:v}=await f("reg",["QUERY"," HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice","/v","ProgId"]),l=/ProgId\s*REG_SZ\s*(?<id>\S+)/.exec(v);if(!l)throw new dI(`Cannot find Windows browser in stdout: ${JSON.stringify(v)}`);let{id:c}=l.groups,$=ai1[c];if(!$)throw new dI(`Unknown browser ID: ${c}`);return $}var mp2=up2(Hp2),Yp2=(f)=>f.toLowerCase().replaceAll(/(?:^|\s|-)\S/g,(v)=>v.toUpperCase());async function EI(){if(NI.platform==="darwin"){let f=await VI();return{name:await gI(f),id:f}}if(NI.platform==="linux"){let{stdout:f}=await mp2("xdg-mime",["query","default","x-scheme-handler/http"]),v=f.trim();return{name:Yp2(v.replace(/.desktop$/,"").replace("-"," ")),id:v}}if(NI.platform==="win32")return nI();throw Error("Only macOS, Linux, and Windows are supported")}import bI from"process";var ap2=Boolean(bI.env.SSH_CONNECTION||bI.env.SSH_CLIENT||bI.env.SSH_TTY),zi1=ap2;var NO=Symbol("fallbackAttempt"),RI=import.meta.url?Wi1.dirname(zp2(import.meta.url)):"",Di1=Wi1.join(RI,"xdg-open"),{platform:Ph,arch:Ji1}=yI,Oi1=async(f,v)=>{if(f.length===0)return;let l=[];for(let c of f)try{return await v(c)}catch($){l.push($)}throw AggregateError(l,"Failed to open in all supported apps")},EO=async(f)=>{f={wait:!1,background:!1,newInstance:!1,allowNonzeroExitCode:!1,...f};let v=f[NO]===!0;if(delete f[NO],Array.isArray(f.app))return Oi1(f.app,(K)=>EO({...f,app:K,[NO]:!0}));let{name:l,arguments:c=[]}=f.app??{};if(c=[...c],Array.isArray(l))return Oi1(l,(K)=>EO({...f,app:{name:K,arguments:c},[NO]:!0}));if(l==="browser"||l==="browserPrivate"){let K={"com.google.chrome":"chrome","google-chrome.desktop":"chrome","com.brave.browser":"brave","org.mozilla.firefox":"firefox","firefox.desktop":"firefox","com.microsoft.msedge":"edge","com.microsoft.edge":"edge","com.microsoft.edgemac":"edge","microsoft-edge.desktop":"edge","com.apple.safari":"safari"},M={chrome:"--incognito",brave:"--incognito",firefox:"--private-window",edge:"--inPrivate"},H;if(E9){let m=await Hi1();H=nO.get(m)??{}}else H=await EI();if(H.id in K){let m=K[H.id.toLowerCase()];if(l==="browserPrivate"){if(m==="safari")throw Error("Safari doesn't support opening in private mode via command line");c.push(M[m])}return EO({...f,app:{name:Mh[m],arguments:c}})}throw Error(`${H.name} is not supported as a default browser`)}let $,Z=[],h={},w=!1;if(E9&&!Kh()&&!zi1&&!l)w=await ui1();if(Ph==="darwin"){if($="open",f.wait)Z.push("--wait-apps");if(f.background)Z.push("--background");if(f.newInstance)Z.push("--new");if(l)Z.push("-a",l)}else if(Ph==="win32"||w){if($=await dO(),Z.push(...N6.argumentsPrefix),!E9)h.windowsVerbatimArguments=!0;if(E9&&f.target)f.target=await mi1(f.target);let K=["$ProgressPreference = 'SilentlyContinue';","Start"];if(f.wait)K.push("-Wait");if(l){if(K.push(N6.escapeArgument(l)),f.target)c.push(f.target)}else if(f.target)K.push(N6.escapeArgument(f.target));if(c.length>0)c=c.map((M)=>N6.escapeArgument(M)),K.push("-ArgumentList",c.join(","));if(f.target=N6.encodeCommand(K.join(" ")),!f.wait)h.stdio="ignore"}else{if(l)$=l;else{let K=!RI||RI==="/",M=!1;try{await Jp2.access(Di1,Op2.X_OK),M=!0}catch{}$=yI.versions.electron??(Ph==="android"||K||!M)?"xdg-open":Di1}if(c.length>0)Z.push(...c);if(!f.wait)h.stdio="ignore",h.detached=!0}if(Ph==="darwin"&&c.length>0)Z.push("--args",...c);if(f.target)Z.push(f.target);let q=Dp2.spawn($,Z,h);if(f.wait)return new Promise((K,M)=>{q.once("error",M),q.once("close",(H)=>{if(!f.allowNonzeroExitCode&&H!==0){M(Error(`Exited with code ${H}`));return}K(q)})});if(v)return new Promise((K,M)=>{q.once("error",M),q.once("spawn",()=>{q.once("close",(H)=>{if(q.off("error",M),H!==0){M(Error(`Exited with code ${H}`));return}q.unref(),K(q)})})});return q.unref(),new Promise((K,M)=>{q.once("error",M),q.once("spawn",()=>{q.off("error",M),K(q)})})},Tp2=(f,v)=>{if(typeof f!=="string")throw TypeError("Expected a `target`");return EO({...v,target:f})};function Ti1(f){if(typeof f==="string"||Array.isArray(f))return f;let{[Ji1]:v}=f;if(!v)throw Error(`${Ji1} is not supported`);return v}function wM({[Ph]:f},{wsl:v}={}){if(v&&E9)return Ti1(v);if(!f)throw Error(`${Ph} is not supported`);return Ti1(f)}var Mh={browser:"browser",browserPrivate:"browserPrivate"};Sl(Mh,"chrome",()=>wM({darwin:"google chrome",win32:"chrome",linux:["google-chrome","google-chrome-stable","chromium","chromium-browser"]},{wsl:{ia32:"/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe",x64:["/mnt/c/Program Files/Google/Chrome/Application/chrome.exe","/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe"]}}));Sl(Mh,"brave",()=>wM({darwin:"brave browser",win32:"brave",linux:["brave-browser","brave"]},{wsl:{ia32:"/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe",x64:["/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe","/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe"]}}));Sl(Mh,"firefox",()=>wM({darwin:"firefox",win32:String.raw`C:\Program Files\Mozilla Firefox\firefox.exe`,linux:"firefox"},{wsl:"/mnt/c/Program Files/Mozilla Firefox/firefox.exe"}));Sl(Mh,"edge",()=>wM({darwin:"microsoft edge",win32:"msedge",linux:["microsoft-edge","microsoft-edge-dev"]},{wsl:"/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe"}));Sl(Mh,"safari",()=>wM({darwin:"Safari"}));var bO=Tp2;f8();import{basename as Ap2,join as Xp2,resolve as Ai1}from"path";function ip2(f){if(f==="Pending")return _2.gray(f);if(f==="AC")return _2.green(f);if(f==="PE")return _2.yellow(f);return _2.red(f)}function jp2(f,v){let l=f[v];if(!l)return v;let c=ip2(v);return`${l.emoji||""} ${c} ${l.name}`}async function kp2(f){let v=Xp2(f,"problem.yml");if(!await Wp2(v))throw Error("No problem.yml in directory. Upload the problem first with: jtk upload -d <directory>");let l=await C5(v);return E7.parse(l)}function Cp2(f){let v=f.split(".").pop();if(!v)throw Error(`File has no extension: ${f}`);return v}function Gp2(f){return f.veredict==="Pending"}async function Vp2(f,v,l,c){await O.section(`Checking for ${v} on Jutge.org`,async()=>{let $=await f.student.profile.get();if($.email!==l.email)throw Error(`The jutge user ${$.email} is not the same as the one in the problem.yml ${l.email}`);O.success("Problem owner verified");try{await f.problems.getProblem(v)}catch{throw Error(`Problem ${v} not found on Jutge.org. Upload it first with: jtk upload -d ${c}`)}O.success(`Problem ${v} found`)})}function gp2(f){return f==="GXX"?"G++17":f}async function dp2(f,v,l,c,$,Z,h){let w=Ai1(v,c),q=$??(()=>{let a=Cp2(Ap2(c)),D=SK(a);return gp2(D.id())})(),K=O.hyperlink(c),M=O.weblink(`https://jutge.org/problems/${l}`,l),H=O.weblink(`https://jutge.org/documentation/compilers/${q}`,q),m;return await O.section(`Submitting ${K} to problem ${M} with compiler ${H} and annotation ${Z}`,async()=>{let a=await Dq(w,"text/plain"),D=await f.student.submissions.submitFull({problem_id:l,compiler_id:q,annotation:Z},a);m={sourceFile:c,submission_id:D.submission_id};let J=`https://jutge.org/problems/${l}/submissions/${D.submission_id}`;if(O.url(J),h)await bO(J)}),m}async function np2(f,v,l,c){await O.section("Waiting for verdicts",async()=>{let $=await f.tables.getVerdicts(),Z=new Map(l.map((w)=>[w.submission_id,w])),h=1000;while(Z.size>0){await IK(1000);for(let[w,q]of Array.from(Z.entries()))try{let K=await f.student.submissions.get({problem_id:v,submission_id:w});if(!Gp2(K)){Z.delete(w);let M=K.veredict??"Pending";O.print(q.sourceFile.padEnd(20)+" "+jp2($,M))}}catch{}}O.success("All submissions judged")})}async function Xi1(f,v,l,c,$,Z="auto",h){let w=Ai1(f),q=await kp2(w);if(!q.problem_nm)throw Error("Problem not uploaded to Jutge.org. Upload it first with jtk upload");let K=await f5(),M=`${q.problem_nm}_${v}`,H=null;if(Z!=="auto"){let a=await K.tables.getCompilers();if(!(Z in a)){let D=Object.keys(a).sort().join(", ");throw Error(`Unknown compiler '${Z}'. Valid compilers from Jutge.org: ${D}`)}H=Z}await Vp2(K,M,q,f);let m=[];if(await O.section("Submitting solutions",async()=>{for(let a of l)m.push(await dp2(K,w,M,a,H,h,$))}),!c&&m.length>0)await np2(K,M,m,h)}var ii1=new y2("submit").summary("Submit solutions to Jutge.org").argument("<programs...>","programs to submit (e.g. solution.cc slow.py buggy.py)").option("-d, --directory <directory>","problem directory",".").option("-c, --compiler <id>","compiler to use (default: auto-detect from file extension)","auto").option("-l, --language <code>","language code (ca, es, en, ...)","en").option("-n, --no-wait","do not wait for submissions to be judged").option("--no-browser","do not open the submission URL in the browser (only print URL and/or wait for verdict in terminal)").option("-a, --annotation <annotation>","annotation for the submission (default: 'jtk-submit-<nanoid16>')").action(async(f,{directory:v,compiler:l,language:c,wait:$,browser:Z,annotation:h})=>{let w=h??`jtk-submit-${Vs()}`;await Xi1(v,c,f,!$,Z,l,w)});import{glob as ji1}from"fs/promises";f8();import{join as SI}from"path";var ki1=new y2("ask").description("Ask questions about jutge-toolkit to JutgeAI").argument("[question]","your question about the toolkit").option("-m, --model <model>","AI model to use",K3.defaultModel).action(async(f,{model:v})=>{let l=await f5(),c=await m4(SI(d3(),"assets","prompts","ask"),"ask.md"),Z=`${await Np2()}
689
689
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jutge.org/toolkit",
3
3
  "description": "Toolkit to prepare problems for Jutge.org",
4
- "version": "4.4.6",
4
+ "version": "4.4.7",
5
5
  "homepage": "https://jutge.org",
6
6
  "author": {
7
7
  "name": "Jutge.org",
package/toolkit/share.ts CHANGED
@@ -31,17 +31,17 @@ Finally, it updates problem.yml file with the current sharing settings and shows
31
31
  .action(async function () {
32
32
  const opts = this.opts()
33
33
 
34
- let passcode: string | false | undefined
35
- if (this.getOptionValueSource('passcode') !== 'default') {
36
- const raw = opts.passcode
37
- if (raw === false) {
38
- passcode = false
39
- } else if (raw === true || raw === undefined || raw === '') {
34
+ let passcode: string | undefined | false
35
+ if (this.getOptionValueSource('passcode') === undefined) {
36
+ passcode = undefined
37
+ } else if (this.getOptionValueSource('passcode') === 'cli') {
38
+ if (opts.passcode === true) {
40
39
  passcode = await password({ message: 'Passcode:' })
41
40
  } else {
42
- passcode = raw
41
+ passcode = opts.passcode
43
42
  }
44
43
  }
44
+
45
45
  const testcases = this.getOptionValueSource('testcases') !== 'default' ? opts.testcases : undefined
46
46
  const solutions = this.getOptionValueSource('solutions') !== 'default' ? opts.solutions : undefined
47
47