@exercode/problem-utils 1.18.2 → 1.20.0

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.
Files changed (74) hide show
  1. package/README.md +26 -1
  2. package/bin/exercode.mjs +2 -0
  3. package/dist/cli/checkAllProblems.cjs +2 -0
  4. package/dist/cli/checkAllProblems.cjs.map +1 -0
  5. package/dist/cli/checkAllProblems.d.ts +6 -0
  6. package/dist/cli/checkAllProblems.js +2 -0
  7. package/dist/cli/checkAllProblems.js.map +1 -0
  8. package/dist/cli/exercode.cjs +9 -0
  9. package/dist/cli/exercode.cjs.map +1 -0
  10. package/dist/cli/exercode.d.ts +1 -0
  11. package/dist/cli/exercode.js +9 -0
  12. package/dist/cli/exercode.js.map +1 -0
  13. package/dist/cli/runSingleHarness.cjs +5 -0
  14. package/dist/cli/runSingleHarness.cjs.map +1 -0
  15. package/dist/cli/runSingleHarness.d.ts +8 -0
  16. package/dist/cli/runSingleHarness.js +5 -0
  17. package/dist/cli/runSingleHarness.js.map +1 -0
  18. package/dist/helpers/checkProblemDirIsolation.cjs +1 -1
  19. package/dist/helpers/checkProblemDirIsolation.cjs.map +1 -1
  20. package/dist/helpers/checkProblemDirIsolation.d.ts +15 -0
  21. package/dist/helpers/checkProblemDirIsolation.js +1 -1
  22. package/dist/helpers/checkProblemDirIsolation.js.map +1 -1
  23. package/dist/helpers/cleanWorkingDirectory.cjs +1 -1
  24. package/dist/helpers/cleanWorkingDirectory.js +1 -1
  25. package/dist/helpers/defaultStdioHarness.cjs +2 -0
  26. package/dist/helpers/defaultStdioHarness.cjs.map +1 -0
  27. package/dist/helpers/defaultStdioHarness.d.ts +19 -0
  28. package/dist/helpers/defaultStdioHarness.js +2 -0
  29. package/dist/helpers/defaultStdioHarness.js.map +1 -0
  30. package/dist/helpers/judgeByStaticAnalysis.cjs +1 -1
  31. package/dist/helpers/judgeByStaticAnalysis.js +1 -1
  32. package/dist/helpers/readOutputFiles.cjs +1 -1
  33. package/dist/helpers/readOutputFiles.js +1 -1
  34. package/dist/helpers/readProblemMarkdownFrontMatter.cjs +1 -1
  35. package/dist/helpers/readProblemMarkdownFrontMatter.cjs.map +1 -1
  36. package/dist/helpers/readProblemMarkdownFrontMatter.d.ts +5 -0
  37. package/dist/helpers/readProblemMarkdownFrontMatter.js +1 -1
  38. package/dist/helpers/readProblemMarkdownFrontMatter.js.map +1 -1
  39. package/dist/helpers/readTestCases.cjs +1 -1
  40. package/dist/helpers/readTestCases.js +1 -1
  41. package/dist/helpers/removeCommentsInSourceCode.cjs +6 -5
  42. package/dist/helpers/removeCommentsInSourceCode.cjs.map +1 -1
  43. package/dist/helpers/removeCommentsInSourceCode.js +6 -5
  44. package/dist/helpers/removeCommentsInSourceCode.js.map +1 -1
  45. package/dist/helpers/runCommandInTemporaryPackageManagerProject.cjs +1 -1
  46. package/dist/helpers/runCommandInTemporaryPackageManagerProject.js +1 -1
  47. package/dist/helpers/runCommandInTemporaryPackageManagerProject.js.map +1 -1
  48. package/dist/helpers/safeFs.cjs +1 -1
  49. package/dist/helpers/safeFs.js +1 -1
  50. package/dist/helpers/sandboxUser.cjs +1 -1
  51. package/dist/helpers/sandboxUser.js +1 -1
  52. package/dist/helpers/startHttpServer.cjs +1 -1
  53. package/dist/helpers/startHttpServer.js +1 -1
  54. package/dist/index.cjs +1 -1
  55. package/dist/index.d.ts +1 -0
  56. package/dist/index.js +1 -1
  57. package/dist/presets/command.cjs +1 -1
  58. package/dist/presets/command.cjs.map +1 -1
  59. package/dist/presets/command.js +1 -1
  60. package/dist/presets/guiCommand.cjs +3 -3
  61. package/dist/presets/guiCommand.js +3 -3
  62. package/dist/presets/llm.cjs +1 -1
  63. package/dist/presets/llm.js +1 -1
  64. package/dist/presets/stdio.cjs +1 -1
  65. package/dist/presets/stdio.cjs.map +1 -1
  66. package/dist/presets/stdio.d.ts +13 -19
  67. package/dist/presets/stdio.js +1 -1
  68. package/dist/presets/stdio.js.map +1 -1
  69. package/dist/types/language.cjs +2 -2
  70. package/dist/types/language.cjs.map +1 -1
  71. package/dist/types/language.d.ts +1 -0
  72. package/dist/types/language.js +2 -2
  73. package/dist/types/language.js.map +1 -1
  74. package/package.json +8 -4
@@ -1,4 +1,4 @@
1
- import{parseArgs as e}from"../helpers/parseArgs.js";import{printTestCaseResult as t}from"../helpers/printTestCaseResult.js";import{TIMEOUT_COMMAND as n,getSandboxUserEnvOverrides as r,getTrustedHelperEnv as i,killSandboxUserProcesses as a,makeAccessibleToSandboxUser as o,sandboxUserName as s,startSandboxTimeoutWatchdog as c,wrapCommandWithSandboxUser as l}from"../helpers/sandboxUser.js";import{languageIdToDefinition as u}from"../types/language.js";import{DecisionCode as d}from"../types/decisionCode.js";import{cleanWorkingDirectory as f,snapshotWorkingDirectory as p}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as m}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as h}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as g}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as _}from"../helpers/judgeByStaticAnalysis.js";import{readOutputFiles as v}from"../helpers/readOutputFiles.js";import{runCustomRunner as y}from"../helpers/runCustomRunner.js";import{readProblemMarkdownFrontMatter as b}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as x}from"../helpers/readTestCases.js";import{spawnSyncWithTimeout as S}from"../helpers/spawnSyncWithTimeout.js";import{z as C}from"zod";import w from"node:child_process";import T from"node:fs/promises";import E from"node:os";import D from"node:path";import{setTimeout as O}from"node:timers/promises";const k=.3,A=.2,j=[E.platform()===`darwin`?`gtime`:`/usr/bin/time`,`--format`,`%e %M`],M=C.object({language:C.union([C.string(),C.array(C.string())]).optional()});async function N(n,i){let c=e(process.argv);if(!c.cwd)throw Error(`cwd argument required`);let u=M.parse(c.params),x=c.cwd;o(x);let S=await b(n),C=await(i.readTestCases??R)(n),w=C.length>0?C:[{id:`default`}],T=w[0]?.id??`prebuild`,E=await _(c.cwd,S);if(E){t({testCaseId:T,...E});return}let D=i.mainFilePath??await h(c.cwd,u.language);if(!D){t({testCaseId:T,decisionCode:d.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:i.mainFilePath?`required main file not found: ${i.mainFilePath}`:`main file not found${u.language?`: language: ${u.language}`:``}`});return}let O=g(D);if(!O){t({testCaseId:T,decisionCode:d.WRONG_ANSWER,stderr:`unsupported language`});return}let A={...process.env,CI:``,FORCE_COLOR:`0`},j=await P({cwd:c.cwd,language:u.language,configuredMainFilePath:i.mainFilePath});if(O.prebuild)try{await O.prebuild(c.cwd);let e=await P({cwd:c.cwd,language:u.language??F(D),configuredMainFilePath:i.mainFilePath,allowConfiguredPathFallback:!0});e&&(j=e)}catch(e){t({testCaseId:T,decisionCode:d.BUILD_ERROR,stderr:J(e)});return}if(!j){t({testCaseId:T,decisionCode:d.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:i.mainFilePath?`required main file not found: ${i.mainFilePath}`:`main file not found${u.language?`: language: ${u.language}`:``}`});return}let N;if(i.prepare)try{N=await y(()=>i.prepare?.({cwd:x,env:{...A,...r(A)},mainFilePath:j,problemMarkdownFrontMatter:S}))}catch(e){t({testCaseId:T,decisionCode:d.BUILD_ERROR,stderr:J(e)});return}let B=N??I({cwd:c.cwd,env:A,mainFilePath:j,languageDefinition:O});if(B){t({testCaseId:T,decisionCode:B.decisionCode??d.BUILD_ERROR,feedbackMarkdown:B.feedbackMarkdown,stderr:B.stderr,stdout:B.stdout,outputFiles:B.outputFiles});return}let V=await p(c.cwd),H,W=T,G;try{H=i.runCommand?void 0:await U();let e=C.shared?.fileInputPath;for(let n of w){W=n.id,e&&await m(e,c.cwd),n.fileInputPath&&await m(n.fileInputPath,c.cwd);let a=typeof S.timeLimitMs==`number`?S.timeLimitMs/1e3:i.runTimeoutSeconds??5,o=H?{...A,DISPLAY:H.display}:A,s=await i.resolveInput?.({testCase:n,cwd:c.cwd,env:o})??n.input??``;G=s;let u=await i.command?.({testCase:n,cwd:c.cwd,env:o,mainFilePath:j})??O.command(j),p;try{p=i.runCommand?await y(()=>i.runCommand?.({testCase:n,command:l(u),stdin:s,cwd:x,env:{...o,...r(o)},timeLimitSeconds:a,screenshotWaitSeconds:i.screenshotWaitSeconds??k,stopDetectionThreshold:i.stopDetectionThreshold??5})):await z({command:u,stdin:s,cwd:c.cwd,env:o,timeLimitSeconds:a,screenshotWaitSeconds:i.screenshotWaitSeconds??k,stopDetectionThreshold:i.stopDetectionThreshold??5})}catch(e){t({testCaseId:n.id,decisionCode:d.RUNTIME_ERROR,stdin:s,stderr:J(e)}),await f(c.cwd,V);return}let h=await v(c.cwd,S.requiredOutputFilePaths??[]),g={timeLimitSeconds:a,problemMarkdownFrontMatter:{memoryLimitByte:S.memoryLimitByte,requiredOutputFilePaths:S.requiredOutputFilePaths}},_=L({runResult:p,outputFiles:h,context:g}),b=_;if(_.decisionCode===d.ACCEPTED)try{let e=await i.test({testCase:n,runResult:p,outputFiles:h,context:g});b={decisionCode:e.decisionCode??_.decisionCode,feedbackMarkdown:e.feedbackMarkdown,stderr:e.stderr,stdout:e.stdout,outputFiles:e.outputFiles}}catch(e){b={decisionCode:d.RUNTIME_ERROR,stderr:J(e)}}let C=b.decisionCode??d.ACCEPTED,w=b.stdout??p.stdout,T=b.stderr??p.stderr;if(t({testCaseId:n.id,decisionCode:C,exitStatus:p.status,stdin:p.stdin||void 0,stdout:w||void 0,stderr:T||void 0,timeSeconds:p.timeSeconds,memoryBytes:p.memoryBytes,feedbackMarkdown:b.feedbackMarkdown,outputFiles:b.outputFiles??(h.length>0?h:void 0)}),await f(c.cwd,V),C!==d.ACCEPTED)break}}catch(e){t({testCaseId:W,decisionCode:d.RUNTIME_ERROR,stdin:G,stderr:J(e)}),await f(c.cwd,V)}finally{try{s&&a()}finally{await H?.dispose()}}}async function P(e){if(e.configuredMainFilePath){if(await q(D.join(e.cwd,e.configuredMainFilePath)))return e.configuredMainFilePath;if(!e.allowConfiguredPathFallback)return}return await h(e.cwd,e.language)}function F(e){let t=Object.entries(u).filter(([,t])=>t.fileExtensions.some(t=>e.endsWith(t))).map(([e])=>e);return t.length>0?t:void 0}function I(e){let t=e.languageDefinition.buildCommand?.(e.mainFilePath);if(!t)return;let n=S(t[0],t.slice(1),{cwd:e.cwd,encoding:`utf8`,env:e.env},10);if(n.timeSeconds>10)return{decisionCode:d.BUILD_TIME_LIMIT_EXCEEDED,stderr:n.stderr||void 0};if(n.status!==0)return{decisionCode:d.BUILD_ERROR,stderr:n.stderr||n.stdout||void 0}}function L(e){if(e.runResult.stopReason===`timeout`)return{decisionCode:d.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.status!==0)return{decisionCode:d.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(e.context.problemMarkdownFrontMatter.memoryLimitByte??1/0))return{decisionCode:d.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};let t=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length??0;return e.outputFiles.length<t?{decisionCode:d.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:d.ACCEPTED}}async function R(e){return await x(D.join(e,`test_cases`))}async function z(e){let t=l([n,e.timeLimitSeconds.toFixed(3),...j,...e.command]),i=c(e.timeLimitSeconds),a;try{a=w.spawn(t[0],t.slice(1),{cwd:e.cwd,env:{...e.env,...r(e.env)},detached:process.platform!==`win32`,stdio:[`pipe`,`pipe`,`pipe`]})}catch(e){throw i.cancel(),e}a.stdout.setEncoding(`utf8`),a.stderr.setEncoding(`utf8`);let o=``,s=``,u,d,f=`process_exit`,p=!1,m=[],h=[],g=Date.now()/1e3,_=0;a.stdout.on(`data`,e=>{o+=e}),a.stderr.on(`data`,e=>{s+=e}),a.on(`error`,e=>{d=e,u=1}),a.stdin.on(`error`,()=>{}),a.on(`close`,(e,t)=>{if(e===124){f=`timeout`,u=0;return}if(t){u=1,s=s?`${s}\nprocess terminated by signal: ${t}`:`process terminated by signal: ${t}`;return}u=e??1});try{for(e.stdin&&a.stdin.write(e.stdin),a.stdin.end();u===void 0;){if(await O(e.screenshotWaitSeconds*1e3),_=Math.max(_,G(a.pid)),h=B(e.env.DISPLAY).toSorted((e,t)=>e.data.length-t.data.length),h.length>0){let t=h.map(e=>e.data).toSorted();if(m.unshift(t),m.length=Math.min(m.length,e.stopDetectionThreshold),m.length===e.stopDetectionThreshold&&m.every(e=>e.length===t.length&&e.every((e,n)=>e===t[n]))){f=`stable_screenshot`,u=0;break}}if(Date.now()/1e3-g>e.timeLimitSeconds){f=`timeout`,u=0;break}}f!==`process_exit`&&a.exitCode===null&&(a.removeAllListeners(`close`),a.removeAllListeners(`error`));let t=f===`process_exit`&&i.fired();if(await W(a),p=!0,d)throw d;let{memoryBytes:n,stderr:r,timeSeconds:c}=H(s,g,_);return{stdin:e.stdin,stdout:o.trimEnd(),stderr:r,status:t?0:u,timeSeconds:c,memoryBytes:n,screenshots:h,stopReason:t?`timeout`:f}}finally{p&&i.cancel()}}function B(e){let t=i(e?{DISPLAY:e}:{DISPLAY:process.env.DISPLAY}),n=w.spawnSync(`xwininfo`,[`-root`,`-tree`],{encoding:`utf8`,env:t});if(n.error)throw n.error;if(n.status!==0||!n.stdout)return[];let r=[];for(let e of V(n.stdout)){let n=w.spawnSync(`maim`,[`-i`,e],{env:t});if(n.error)throw n.error;if(n.status!==0||n.stdout.length===0)continue;let i=w.spawnSync(`xdotool`,[`getwindowname`,e],{encoding:`utf8`,env:t});if(i.error)throw i.error;let a=i.stdout.trim().replaceAll(/[\s/]/g,`_`);r.push({path:`${a||`window`}_${e}.png`,data:n.stdout.toString(`base64`),encoding:`base64`})}return r}function V(e){let t=[],n=e.split(`
2
- `);for(let e of n){if(e.includes(`Root window id:`)||e.includes(`Parent window id:`)||e.includes(`()`))continue;let n=/^\s{5}(0x[\da-f]+) /.exec(e);n?.[1]&&t.push(Number.parseInt(n[1],16).toString())}return t}function H(e,t,n){let r=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(e),i=r?e.slice(0,r.index).trimEnd():e.trimEnd(),a=Number(r?.[2])*1024||0;return{stderr:i,timeSeconds:Number(r?.[1])||Date.now()/1e3-t,memoryBytes:Math.max(a,n)}}async function U(){if(process.platform!==`linux`)throw Error(`GUI screenshot capture is supported only on Linux.`);for(let e=90;e<100;e++){let t=`:${e}`,n,r=w.spawn(`Xvfb`,[t,`-screen`,`0`,`1280x1024x24`,`-ac`],{stdio:`ignore`,env:i()});if(r.on(`error`,e=>{n=e}),await O(300),n)throw n;if(r.exitCode===null)return{display:t,dispose:async()=>{r.killed||(r.kill(`SIGTERM`),await O(100),r.exitCode===null&&r.kill(`SIGKILL`))}}}throw Error(`Xvfb could not be started.`)}async function W(e){if(e.pid){if(s){a([`TERM`]),await O(A*1e3),a([`KILL`]);return}K(e.pid,`SIGTERM`),await O(A*1e3),e.exitCode===null&&K(e.pid,`SIGKILL`)}}function G(e){if(!e||process.platform!==`linux`)return 0;let t=w.spawnSync(`ps`,[`-o`,`rss=`,`--no-headers`,`--pgroup`,String(e)],{encoding:`utf8`,env:i()});return t.error||t.status!==0||!t.stdout?0:t.stdout.split(`
3
- `).map(e=>Number(e.trim())).filter(e=>Number.isFinite(e)&&e>0).reduce((e,t)=>e+t*1024,0)}function K(e,t){try{if(process.platform!==`win32`){process.kill(-e,t);return}}catch{}try{process.kill(e,t)}catch{}}async function q(e){try{return await T.access(e),!0}catch{return!1}}function J(e){return e instanceof Error?e.message:String(e)}export{N as guiCommandJudgePreset};
1
+ import{parseArgs as e}from"../helpers/parseArgs.js";import{printTestCaseResult as t}from"../helpers/printTestCaseResult.js";import{TIMEOUT_COMMAND as n,getSandboxUserEnvOverrides as r,getTrustedHelperEnv as i,killSandboxUserProcesses as a,makeAccessibleToSandboxUser as o,sandboxUserName as s,startSandboxTimeoutWatchdog as c,wrapCommandWithSandboxUser as l}from"../helpers/sandboxUser.js";import{languageIdToDefinition as u}from"../types/language.js";import{DecisionCode as d}from"../types/decisionCode.js";import{cleanWorkingDirectory as f,snapshotWorkingDirectory as p}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as m}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as h}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as g}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as _}from"../helpers/judgeByStaticAnalysis.js";import{readOutputFiles as v}from"../helpers/readOutputFiles.js";import{runCustomRunner as y}from"../helpers/runCustomRunner.js";import{readProblemMarkdownFrontMatter as b}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as x}from"../helpers/readTestCases.js";import{spawnSyncWithTimeout as S}from"../helpers/spawnSyncWithTimeout.js";import C from"node:fs/promises";import w from"node:path";import{z as T}from"zod";import E from"node:child_process";import D from"node:os";import{setTimeout as O}from"node:timers/promises";const k=.3,A=.2,j=[D.platform()===`darwin`?`gtime`:`/usr/bin/time`,`--format`,`%e %M`],M=T.object({language:T.union([T.string(),T.array(T.string())]).optional()});async function N(n,i){let c=e(process.argv);if(!c.cwd)throw Error(`cwd argument required`);let u=M.parse(c.params),x=c.cwd;o(x);let S=await b(n),C=await(i.readTestCases??R)(n),w=C.length>0?C:[{id:`default`}],T=w[0]?.id??`prebuild`,E=await _(c.cwd,S);if(E){t({testCaseId:T,...E});return}let D=i.mainFilePath??await h(c.cwd,u.language);if(!D){t({testCaseId:T,decisionCode:d.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:i.mainFilePath?`required main file not found: ${i.mainFilePath}`:`main file not found${u.language?`: language: ${u.language}`:``}`});return}let O=g(D);if(!O){t({testCaseId:T,decisionCode:d.WRONG_ANSWER,stderr:`unsupported language`});return}let A={...process.env,CI:``,FORCE_COLOR:`0`},j=await P({cwd:c.cwd,language:u.language,configuredMainFilePath:i.mainFilePath});if(O.prebuild)try{await O.prebuild(c.cwd);let e=await P({cwd:c.cwd,language:u.language??F(D),configuredMainFilePath:i.mainFilePath,allowConfiguredPathFallback:!0});e&&(j=e)}catch(e){t({testCaseId:T,decisionCode:d.BUILD_ERROR,stderr:J(e)});return}if(!j){t({testCaseId:T,decisionCode:d.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:i.mainFilePath?`required main file not found: ${i.mainFilePath}`:`main file not found${u.language?`: language: ${u.language}`:``}`});return}let N;if(i.prepare)try{N=await y(()=>i.prepare?.({cwd:x,env:{...A,...r(A)},mainFilePath:j,problemMarkdownFrontMatter:S}))}catch(e){t({testCaseId:T,decisionCode:d.BUILD_ERROR,stderr:J(e)});return}let B=N??I({cwd:c.cwd,env:A,mainFilePath:j,languageDefinition:O});if(B){t({testCaseId:T,decisionCode:B.decisionCode??d.BUILD_ERROR,feedbackMarkdown:B.feedbackMarkdown,stderr:B.stderr,stdout:B.stdout,outputFiles:B.outputFiles});return}let V=await p(c.cwd),H,W=T,G;try{H=i.runCommand?void 0:await U();let e=C.shared?.fileInputPath;for(let n of w){W=n.id,e&&await m(e,c.cwd),n.fileInputPath&&await m(n.fileInputPath,c.cwd);let a=typeof S.timeLimitMs==`number`?S.timeLimitMs/1e3:i.runTimeoutSeconds??5,o=H?{...A,DISPLAY:H.display}:A,s=await i.resolveInput?.({testCase:n,cwd:c.cwd,env:o})??n.input??``;G=s;let u=await i.command?.({testCase:n,cwd:c.cwd,env:o,mainFilePath:j})??O.command(j),p;try{p=i.runCommand?await y(()=>i.runCommand?.({testCase:n,command:l(u),stdin:s,cwd:x,env:{...o,...r(o)},timeLimitSeconds:a,screenshotWaitSeconds:i.screenshotWaitSeconds??k,stopDetectionThreshold:i.stopDetectionThreshold??5})):await z({command:u,stdin:s,cwd:c.cwd,env:o,timeLimitSeconds:a,screenshotWaitSeconds:i.screenshotWaitSeconds??k,stopDetectionThreshold:i.stopDetectionThreshold??5})}catch(e){t({testCaseId:n.id,decisionCode:d.RUNTIME_ERROR,stdin:s,stderr:J(e)}),await f(c.cwd,V);return}let h=await v(c.cwd,S.requiredOutputFilePaths??[]),g={timeLimitSeconds:a,problemMarkdownFrontMatter:{memoryLimitByte:S.memoryLimitByte,requiredOutputFilePaths:S.requiredOutputFilePaths}},_=L({runResult:p,outputFiles:h,context:g}),b=_;if(_.decisionCode===d.ACCEPTED)try{let e=await i.test({testCase:n,runResult:p,outputFiles:h,context:g});b={decisionCode:e.decisionCode??_.decisionCode,feedbackMarkdown:e.feedbackMarkdown,stderr:e.stderr,stdout:e.stdout,outputFiles:e.outputFiles}}catch(e){b={decisionCode:d.RUNTIME_ERROR,stderr:J(e)}}let C=b.decisionCode??d.ACCEPTED,w=b.stdout??p.stdout,T=b.stderr??p.stderr;if(t({testCaseId:n.id,decisionCode:C,exitStatus:p.status,stdin:p.stdin||void 0,stdout:w||void 0,stderr:T||void 0,timeSeconds:p.timeSeconds,memoryBytes:p.memoryBytes,feedbackMarkdown:b.feedbackMarkdown,outputFiles:b.outputFiles??(h.length>0?h:void 0)}),await f(c.cwd,V),C!==d.ACCEPTED)break}}catch(e){t({testCaseId:W,decisionCode:d.RUNTIME_ERROR,stdin:G,stderr:J(e)}),await f(c.cwd,V)}finally{try{s&&a()}finally{await H?.dispose()}}}async function P(e){if(e.configuredMainFilePath){if(await q(w.join(e.cwd,e.configuredMainFilePath)))return e.configuredMainFilePath;if(!e.allowConfiguredPathFallback)return}return await h(e.cwd,e.language)}function F(e){let t=Object.entries(u).filter(([,t])=>t.fileExtensions.some(t=>e.endsWith(t))).map(([e])=>e);return t.length>0?t:void 0}function I(e){let t=e.languageDefinition.buildCommand?.(e.mainFilePath);if(!t)return;let n=S(t[0],t.slice(1),{cwd:e.cwd,encoding:`utf8`,env:e.env},10);if(n.timeSeconds>10)return{decisionCode:d.BUILD_TIME_LIMIT_EXCEEDED,stderr:n.stderr||void 0};if(n.status!==0)return{decisionCode:d.BUILD_ERROR,stderr:n.stderr||n.stdout||void 0}}function L(e){if(e.runResult.stopReason===`timeout`)return{decisionCode:d.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.status!==0)return{decisionCode:d.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(e.context.problemMarkdownFrontMatter.memoryLimitByte??1/0))return{decisionCode:d.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};let t=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length??0;return e.outputFiles.length<t?{decisionCode:d.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:d.ACCEPTED}}async function R(e){return await x(w.join(e,`test_cases`))}async function z(e){let t=l([n,e.timeLimitSeconds.toFixed(3),...j,...e.command]),i=c(e.timeLimitSeconds),a;try{a=E.spawn(t[0],t.slice(1),{cwd:e.cwd,env:{...e.env,...r(e.env)},detached:process.platform!==`win32`,stdio:[`pipe`,`pipe`,`pipe`]})}catch(e){throw i.cancel(),e}a.stdout.setEncoding(`utf8`),a.stderr.setEncoding(`utf8`);let o=``,s=``,u,d,f=`process_exit`,p=!1,m=[],h=[],g=Date.now()/1e3,_=0;a.stdout.on(`data`,e=>{o+=e}),a.stderr.on(`data`,e=>{s+=e}),a.on(`error`,e=>{d=e,u=1}),a.stdin.on(`error`,()=>{}),a.on(`close`,(e,t)=>{if(e===124){f=`timeout`,u=0;return}if(t){u=1,s=s?`${s}\nprocess terminated by signal: ${t}`:`process terminated by signal: ${t}`;return}u=e??1});try{for(e.stdin&&a.stdin.write(e.stdin),a.stdin.end();u===void 0;){if(await O(e.screenshotWaitSeconds*1e3),_=Math.max(_,G(a.pid)),h=B(e.env.DISPLAY).toSorted((e,t)=>e.data.length-t.data.length),h.length>0){let t=h.map(e=>e.data).toSorted();if(m.unshift(t),m.length=Math.min(m.length,e.stopDetectionThreshold),m.length===e.stopDetectionThreshold&&m.every(e=>e.length===t.length&&e.every((e,n)=>e===t[n]))){f=`stable_screenshot`,u=0;break}}if(Date.now()/1e3-g>e.timeLimitSeconds){f=`timeout`,u=0;break}}f!==`process_exit`&&a.exitCode===null&&(a.removeAllListeners(`close`),a.removeAllListeners(`error`));let t=f===`process_exit`&&i.fired();if(await W(a),p=!0,d)throw d;let{memoryBytes:n,stderr:r,timeSeconds:c}=H(s,g,_);return{stdin:e.stdin,stdout:o.trimEnd(),stderr:r,status:t?0:u,timeSeconds:c,memoryBytes:n,screenshots:h,stopReason:t?`timeout`:f}}finally{p&&i.cancel()}}function B(e){let t=i(e?{DISPLAY:e}:{DISPLAY:process.env.DISPLAY}),n=E.spawnSync(`xwininfo`,[`-root`,`-tree`],{encoding:`utf8`,env:t});if(n.error)throw n.error;if(n.status!==0||!n.stdout)return[];let r=[];for(let e of V(n.stdout)){let n=E.spawnSync(`maim`,[`-i`,e],{env:t});if(n.error)throw n.error;if(n.status!==0||n.stdout.length===0)continue;let i=E.spawnSync(`xdotool`,[`getwindowname`,e],{encoding:`utf8`,env:t});if(i.error)throw i.error;let a=i.stdout.trim().replaceAll(/[\s/]/g,`_`);r.push({path:`${a||`window`}_${e}.png`,data:n.stdout.toString(`base64`),encoding:`base64`})}return r}function V(e){let t=[],n=e.split(`
2
+ `);for(let e of n){if(e.includes(`Root window id:`)||e.includes(`Parent window id:`)||e.includes(`()`))continue;let n=/^\s{5}(0x[\da-f]+) /.exec(e);n?.[1]&&t.push(Number.parseInt(n[1],16).toString())}return t}function H(e,t,n){let r=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(e),i=r?e.slice(0,r.index).trimEnd():e.trimEnd(),a=Number(r?.[2])*1024||0;return{stderr:i,timeSeconds:Number(r?.[1])||Date.now()/1e3-t,memoryBytes:Math.max(a,n)}}async function U(){if(process.platform!==`linux`)throw Error(`GUI screenshot capture is supported only on Linux.`);for(let e=90;e<100;e++){let t=`:${e}`,n,r=E.spawn(`Xvfb`,[t,`-screen`,`0`,`1280x1024x24`,`-ac`],{stdio:`ignore`,env:i()});if(r.on(`error`,e=>{n=e}),await O(300),n)throw n;if(r.exitCode===null)return{display:t,dispose:async()=>{r.killed||(r.kill(`SIGTERM`),await O(100),r.exitCode===null&&r.kill(`SIGKILL`))}}}throw Error(`Xvfb could not be started.`)}async function W(e){if(e.pid){if(s){a([`TERM`]),await O(A*1e3),a([`KILL`]);return}K(e.pid,`SIGTERM`),await O(A*1e3),e.exitCode===null&&K(e.pid,`SIGKILL`)}}function G(e){if(!e||process.platform!==`linux`)return 0;let t=E.spawnSync(`ps`,[`-o`,`rss=`,`--no-headers`,`--pgroup`,String(e)],{encoding:`utf8`,env:i()});return t.error||t.status!==0||!t.stdout?0:t.stdout.split(`
3
+ `).map(e=>Number(e.trim())).filter(e=>Number.isFinite(e)&&e>0).reduce((e,t)=>e+t*1024,0)}function K(e,t){try{if(process.platform!==`win32`){process.kill(-e,t);return}}catch{}try{process.kill(e,t)}catch{}}async function q(e){try{return await C.access(e),!0}catch{return!1}}function J(e){return e instanceof Error?e.message:String(e)}export{N as guiCommandJudgePreset};
4
4
  //# sourceMappingURL=guiCommand.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/parseArgs.cjs"),n=require("../helpers/printTestCaseResult.cjs"),r=require("../types/decisionCode.cjs"),i=require("../helpers/readTestCases.cjs");let a=require("zod"),o=require("node:fs");o=e.__toESM(o,1);let s=require("node:path");s=e.__toESM(s,1);let c=require("@ai-sdk/amazon-bedrock"),l=require("@ai-sdk/google"),u=require("@ai-sdk/openai"),d=require("@ai-sdk/xai"),f=require("ai");const p={bedrock:c.bedrock,google:l.google,openai:u.openai,xai:d.xai},m=a.z.object({model:a.z.string().min(1)});async function h(e,a){let c=t.parseArgs(process.argv);if(!c.cwd)throw Error(`cwd argument required`);let l=m.parse(c.params),u=await i.readTestCases(s.default.join(e,`test_cases`)),d=await o.default.promises.readFile(s.default.join(c.cwd,`prompt.txt`),`utf8`);for(let e of u){let t=Date.now();try{let{text:i}=await(0,f.generateText)({model:g(l.model),prompt:a.buildPrompt?.({prompt:d,testCase:e})??d.replaceAll(`{input}`,e.input??``)}),o=Date.now(),s={testCaseId:e.id,decisionCode:r.DecisionCode.ACCEPTED,stdin:e.input,stdout:i,timeSeconds:(o-t)/1e3,...await a.test({testCase:e,result:{output:i}})};if(n.printTestCaseResult(s),s.decisionCode!==r.DecisionCode.ACCEPTED)break}catch(i){let a=Date.now();n.printTestCaseResult({testCaseId:e.id,decisionCode:r.DecisionCode.RUNTIME_ERROR,stdin:e.input,stderr:i instanceof Error?i.message:String(i),timeSeconds:(a-t)/1e3});break}}}function g(e){let[t,n]=e.split(`/`);if(!t||!n)throw Error(`bad model: ${e}`);let r=p[t]?.(n);if(!r)throw Error(`model not found: ${e}`);return r}exports.llmJudgePreset=h;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/parseArgs.cjs"),n=require("../helpers/printTestCaseResult.cjs"),r=require("../types/decisionCode.cjs"),i=require("../helpers/readTestCases.cjs");let a=require("node:path");a=e.__toESM(a,1);let o=require("zod"),s=require("node:fs");s=e.__toESM(s,1);let c=require("@ai-sdk/amazon-bedrock"),l=require("@ai-sdk/google"),u=require("@ai-sdk/openai"),d=require("@ai-sdk/xai"),f=require("ai");const p={bedrock:c.bedrock,google:l.google,openai:u.openai,xai:d.xai},m=o.z.object({model:o.z.string().min(1)});async function h(e,o){let c=t.parseArgs(process.argv);if(!c.cwd)throw Error(`cwd argument required`);let l=m.parse(c.params),u=await i.readTestCases(a.default.join(e,`test_cases`)),d=await s.default.promises.readFile(a.default.join(c.cwd,`prompt.txt`),`utf8`);for(let e of u){let t=Date.now();try{let{text:i}=await(0,f.generateText)({model:g(l.model),prompt:o.buildPrompt?.({prompt:d,testCase:e})??d.replaceAll(`{input}`,e.input??``)}),a=Date.now(),s={testCaseId:e.id,decisionCode:r.DecisionCode.ACCEPTED,stdin:e.input,stdout:i,timeSeconds:(a-t)/1e3,...await o.test({testCase:e,result:{output:i}})};if(n.printTestCaseResult(s),s.decisionCode!==r.DecisionCode.ACCEPTED)break}catch(i){let a=Date.now();n.printTestCaseResult({testCaseId:e.id,decisionCode:r.DecisionCode.RUNTIME_ERROR,stdin:e.input,stderr:i instanceof Error?i.message:String(i),timeSeconds:(a-t)/1e3});break}}}function g(e){let[t,n]=e.split(`/`);if(!t||!n)throw Error(`bad model: ${e}`);let r=p[t]?.(n);if(!r)throw Error(`model not found: ${e}`);return r}exports.llmJudgePreset=h;
2
2
  //# sourceMappingURL=llm.cjs.map
@@ -1,2 +1,2 @@
1
- import{parseArgs as e}from"../helpers/parseArgs.js";import{printTestCaseResult as t}from"../helpers/printTestCaseResult.js";import{DecisionCode as n}from"../types/decisionCode.js";import{readTestCases as r}from"../helpers/readTestCases.js";import{z as i}from"zod";import a from"node:fs";import o from"node:path";import{bedrock as s}from"@ai-sdk/amazon-bedrock";import{google as c}from"@ai-sdk/google";import{openai as l}from"@ai-sdk/openai";import{xai as u}from"@ai-sdk/xai";import{generateText as d}from"ai";const f={bedrock:s,google:c,openai:l,xai:u},p=i.object({model:i.string().min(1)});async function m(i,s){let c=e(process.argv);if(!c.cwd)throw Error(`cwd argument required`);let l=p.parse(c.params),u=await r(o.join(i,`test_cases`)),f=await a.promises.readFile(o.join(c.cwd,`prompt.txt`),`utf8`);for(let e of u){let r=Date.now();try{let{text:i}=await d({model:h(l.model),prompt:s.buildPrompt?.({prompt:f,testCase:e})??f.replaceAll(`{input}`,e.input??``)}),a=Date.now(),o={testCaseId:e.id,decisionCode:n.ACCEPTED,stdin:e.input,stdout:i,timeSeconds:(a-r)/1e3,...await s.test({testCase:e,result:{output:i}})};if(t(o),o.decisionCode!==n.ACCEPTED)break}catch(i){let a=Date.now();t({testCaseId:e.id,decisionCode:n.RUNTIME_ERROR,stdin:e.input,stderr:i instanceof Error?i.message:String(i),timeSeconds:(a-r)/1e3});break}}}function h(e){let[t,n]=e.split(`/`);if(!t||!n)throw Error(`bad model: ${e}`);let r=f[t]?.(n);if(!r)throw Error(`model not found: ${e}`);return r}export{m as llmJudgePreset};
1
+ import{parseArgs as e}from"../helpers/parseArgs.js";import{printTestCaseResult as t}from"../helpers/printTestCaseResult.js";import{DecisionCode as n}from"../types/decisionCode.js";import{readTestCases as r}from"../helpers/readTestCases.js";import i from"node:path";import{z as a}from"zod";import o from"node:fs";import{bedrock as s}from"@ai-sdk/amazon-bedrock";import{google as c}from"@ai-sdk/google";import{openai as l}from"@ai-sdk/openai";import{xai as u}from"@ai-sdk/xai";import{generateText as d}from"ai";const f={bedrock:s,google:c,openai:l,xai:u},p=a.object({model:a.string().min(1)});async function m(a,s){let c=e(process.argv);if(!c.cwd)throw Error(`cwd argument required`);let l=p.parse(c.params),u=await r(i.join(a,`test_cases`)),f=await o.promises.readFile(i.join(c.cwd,`prompt.txt`),`utf8`);for(let e of u){let r=Date.now();try{let{text:i}=await d({model:h(l.model),prompt:s.buildPrompt?.({prompt:f,testCase:e})??f.replaceAll(`{input}`,e.input??``)}),a=Date.now(),o={testCaseId:e.id,decisionCode:n.ACCEPTED,stdin:e.input,stdout:i,timeSeconds:(a-r)/1e3,...await s.test({testCase:e,result:{output:i}})};if(t(o),o.decisionCode!==n.ACCEPTED)break}catch(i){let a=Date.now();t({testCaseId:e.id,decisionCode:n.RUNTIME_ERROR,stdin:e.input,stderr:i instanceof Error?i.message:String(i),timeSeconds:(a-r)/1e3});break}}}function h(e){let[t,n]=e.split(`/`);if(!t||!n)throw Error(`bad model: ${e}`);let r=f[t]?.(n);if(!r)throw Error(`model not found: ${e}`);return r}export{m as llmJudgePreset};
2
2
  //# sourceMappingURL=llm.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/parseArgs.cjs"),n=require("../helpers/printTestCaseResult.cjs"),r=require("../helpers/sandboxUser.cjs"),i=require("../types/decisionCode.cjs"),a=require("../helpers/cleanWorkingDirectory.cjs"),o=require("../helpers/copyTestCaseFileInput.cjs"),s=require("../helpers/findEntryPointFile.cjs"),c=require("../helpers/findLanguageDefinitionByPath.cjs"),l=require("../helpers/judgeByStaticAnalysis.cjs"),u=require("../helpers/readOutputFiles.cjs"),d=require("../helpers/readProblemMarkdownFrontMatter.cjs"),f=require("../helpers/readTestCases.cjs"),p=require("../helpers/spawnSyncWithTimeout.cjs"),m=require("../helpers/compareStdoutAsSpaceSeparatedTokens.cjs");let h=require("zod"),g=require("node:fs");g=e.__toESM(g,1);let _=require("node:path");_=e.__toESM(_,1);const v=5e4,y=h.z.object({language:h.z.union([h.z.string(),h.z.array(h.z.string())]).optional()}),b=y.extend({stdin:h.z.string().optional()});async function x(e){let h=t.parseArgs(process.argv);if(!h.cwd)throw Error(`cwd argument required`);let b=y.parse(h.params);r.makeAccessibleToSandboxUser(h.cwd);let x=await d.readProblemMarkdownFrontMatter(e),S=await f.readTestCases(_.default.join(e,`test_cases`)),C=await l.judgeByStaticAnalysis(h.cwd,x);if(C){n.printTestCaseResult({testCaseId:S[0]?.id??`prebuild`,...C});return}let w=await s.findEntryPointFile(h.cwd,b.language);if(!w){n.printTestCaseResult({testCaseId:S[0]?.id??`prebuild`,decisionCode:i.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${b.language?`: language: ${b.language}`:``}`});return}let T=c.findLanguageDefinitionByPath(w);if(!T){n.printTestCaseResult({testCaseId:S[0]?.id??`prebuild`,decisionCode:i.DecisionCode.WRONG_ANSWER,stderr:`unsupported language`});return}let E={...process.env,CI:``,FORCE_COLOR:`0`},D;if(T.prebuild)try{await T.prebuild(h.cwd),D=await s.findEntryPointFile(h.cwd,b.language)}catch(e){console.error(`prebuild error`,e),n.printTestCaseResult({testCaseId:S[0]?.id??`prebuild`,decisionCode:i.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let O=D??w;if(T.buildCommand)try{let e=T.buildCommand(O),t=p.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:h.cwd,encoding:`utf8`,env:E},10),r=i.DecisionCode.ACCEPTED;if(t.status===0?t.timeSeconds>10?r=i.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED:(t.stdout.length>v||t.stderr.length>v)&&(r=i.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):r=i.DecisionCode.BUILD_ERROR,r!==i.DecisionCode.ACCEPTED){n.printTestCaseResult({testCaseId:S[0]?.id??`build`,decisionCode:r,exitStatus:t.status??void 0,stdout:t.stdout.slice(0,v)||void 0,stderr:t.stderr.slice(0,v)||void 0,timeSeconds:t.timeSeconds,memoryBytes:t.memoryBytes});return}}catch(e){console.error(`build error`,e),n.printTestCaseResult({testCaseId:S[0]?.id??`build`,decisionCode:i.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let k=await a.snapshotWorkingDirectory(h.cwd);S.length===0&&n.printTestCaseResult({testCaseId:`default`,decisionCode:i.DecisionCode.ACCEPTED});for(let e of S){S.shared?.fileInputPath&&await o.copyTestCaseFileInput(S.shared.fileInputPath,h.cwd),e.fileInputPath&&await o.copyTestCaseFileInput(e.fileInputPath,h.cwd);let t=typeof x.timeLimitMs==`number`?x.timeLimitMs/1e3:2,r=T.command(O),s=p.spawnSyncWithTimeout(r[0],r.slice(1),{cwd:h.cwd,encoding:`utf8`,input:e.input,env:E},t),c=await u.readOutputFiles(h.cwd,x.requiredOutputFilePaths??[]),l=i.DecisionCode.ACCEPTED;if(s.status!==0)l=i.DecisionCode.RUNTIME_ERROR;else if(s.timeSeconds>t)l=i.DecisionCode.TIME_LIMIT_EXCEEDED;else if(s.memoryBytes>(x.memoryLimitByte??1/0))l=i.DecisionCode.MEMORY_LIMIT_EXCEEDED;else if(s.stdout.length>v||s.stderr.length>v)l=i.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;else if(c.length<(x.requiredOutputFilePaths?.length??0))l=i.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;else if(!m.compareStdoutAsSpaceSeparatedTokens(s.stdout,e.output??``))l=i.DecisionCode.WRONG_ANSWER;else if(e.fileOutputPath){let t=await g.default.promises.readdir(e.fileOutputPath,{withFileTypes:!0,recursive:!0});for(let n of t){if(!n.isFile())continue;let t=_.default.relative(e.fileOutputPath,n.parentPath),r=await g.default.promises.readFile(_.default.join(n.parentPath,n.name));try{let e=_.default.join(h.cwd,t,n.name);if(!await u.isSafeSubmissionOutputPath(h.cwd,e))throw Error(`unsafe output path`);(await g.default.promises.readFile(e)).compare(r)!==0&&(l=i.DecisionCode.WRONG_ANSWER)}catch(e){console.error(e),l=i.DecisionCode.WRONG_ANSWER}}}if(n.printTestCaseResult({testCaseId:e.id,decisionCode:l,exitStatus:s.status??void 0,stdin:e.input,stdout:s.stdout.slice(0,v)||void 0,stderr:s.stderr.slice(0,v)||void 0,timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes,outputFiles:c.length>0?c:void 0}),await a.cleanWorkingDirectory(h.cwd,k),l!==i.DecisionCode.ACCEPTED)break}}async function S(e){let a=t.parseArgs(process.argv);if(!a.cwd)throw Error(`cwd argument required`);let o=b.parse(a.params);r.makeAccessibleToSandboxUser(a.cwd);let l=await d.readProblemMarkdownFrontMatter(e),f=await s.findEntryPointFile(a.cwd,o.language);if(!f){n.printTestCaseResult({testCaseId:`prebuild`,decisionCode:i.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${o.language?`: language: ${o.language}`:``}`});return}let m=c.findLanguageDefinitionByPath(f);if(!m){n.printTestCaseResult({testCaseId:`prebuild`,decisionCode:i.DecisionCode.WRONG_ANSWER,stderr:`unsupported language`});return}let h={...process.env,CI:``,FORCE_COLOR:`0`},g;if(m.prebuild)try{await m.prebuild(a.cwd),g=await s.findEntryPointFile(a.cwd,o.language)}catch(e){console.error(`prebuild error`,e),n.printTestCaseResult({testCaseId:`prebuild`,decisionCode:i.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let _=g??f;if(m.buildCommand)try{let e=m.buildCommand(_),t=p.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:a.cwd,encoding:`utf8`,env:h},10),r=i.DecisionCode.ACCEPTED;if(t.status===0?t.timeSeconds>10?r=i.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED:(t.stdout.length>v||t.stderr.length>v)&&(r=i.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):r=i.DecisionCode.BUILD_ERROR,r!==i.DecisionCode.ACCEPTED){n.printTestCaseResult({testCaseId:`build`,decisionCode:r,exitStatus:t.status??void 0,stdout:t.stdout.slice(0,v)||void 0,stderr:t.stderr.slice(0,v)||void 0,timeSeconds:t.timeSeconds,memoryBytes:t.memoryBytes});return}}catch(e){console.error(`build error`,e),n.printTestCaseResult({testCaseId:`build`,decisionCode:i.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}{let e=Math.max(10,(l.timeLimitMs??0)/1e3),t=m.command(_),r=p.spawnSyncWithTimeout(t[0],t.slice(1),{cwd:a.cwd,encoding:`utf8`,input:o.stdin,env:h},e),s=await u.readOutputFiles(a.cwd,l.requiredOutputFilePaths??[]),c=i.DecisionCode.ACCEPTED;r.status===0?r.timeSeconds>e?c=i.DecisionCode.TIME_LIMIT_EXCEEDED:r.memoryBytes>(l.memoryLimitByte??1/0)?c=i.DecisionCode.MEMORY_LIMIT_EXCEEDED:r.stdout.length>v||r.stderr.length>v?c=i.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED:s.length<(l.requiredOutputFilePaths?.length??0)&&(c=i.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR):c=i.DecisionCode.RUNTIME_ERROR,n.printTestCaseResult({testCaseId:`debug`,decisionCode:c,exitStatus:r.status??void 0,stdin:o.stdin,stdout:r.stdout.slice(0,v)||void 0,stderr:r.stderr.slice(0,v)||void 0,timeSeconds:r.timeSeconds,memoryBytes:r.memoryBytes,outputFiles:s.length>0?s:void 0})}}exports.stdioDebugPreset=S,exports.stdioJudgePreset=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/parseArgs.cjs"),n=require("../helpers/printTestCaseResult.cjs"),r=require("../helpers/sandboxUser.cjs"),i=require("../types/decisionCode.cjs"),a=require("../helpers/cleanWorkingDirectory.cjs"),o=require("../helpers/copyTestCaseFileInput.cjs"),s=require("../helpers/findEntryPointFile.cjs"),c=require("../helpers/findLanguageDefinitionByPath.cjs"),l=require("../helpers/judgeByStaticAnalysis.cjs"),u=require("../helpers/readOutputFiles.cjs"),d=require("../helpers/readProblemMarkdownFrontMatter.cjs"),f=require("../helpers/readTestCases.cjs"),p=require("../helpers/spawnSyncWithTimeout.cjs"),m=require("../helpers/compareStdoutAsSpaceSeparatedTokens.cjs");let h=require("node:path");h=e.__toESM(h,1);let g=require("zod"),_=require("node:fs");_=e.__toESM(_,1);const v=5e4,y=g.z.object({language:g.z.union([g.z.string(),g.z.array(g.z.string())]).optional()}),b=y.extend({stdin:g.z.string().optional()});async function x(e){let g=t.parseArgs(process.argv);if(!g.cwd)throw Error(`cwd argument required`);let b=y.parse(g.params);r.makeAccessibleToSandboxUser(g.cwd);let x=await d.readProblemMarkdownFrontMatter(e),S=await f.readTestCases(h.default.join(e,`test_cases`)),C=await l.judgeByStaticAnalysis(g.cwd,x);if(C){n.printTestCaseResult({testCaseId:S[0]?.id??`prebuild`,...C});return}let w=await s.findEntryPointFile(g.cwd,b.language);if(!w){n.printTestCaseResult({testCaseId:S[0]?.id??`prebuild`,decisionCode:i.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${b.language?`: language: ${b.language}`:``}`});return}let T=c.findLanguageDefinitionByPath(w);if(!T){n.printTestCaseResult({testCaseId:S[0]?.id??`prebuild`,decisionCode:i.DecisionCode.WRONG_ANSWER,stderr:`unsupported language`});return}let E={...process.env,CI:``,FORCE_COLOR:`0`},D;if(T.prebuild)try{await T.prebuild(g.cwd),D=await s.findEntryPointFile(g.cwd,b.language)}catch(e){console.error(`prebuild error`,e),n.printTestCaseResult({testCaseId:S[0]?.id??`prebuild`,decisionCode:i.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let O=D??w;if(T.buildCommand)try{let e=T.buildCommand(O),t=p.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:g.cwd,encoding:`utf8`,env:E},10),r=i.DecisionCode.ACCEPTED;if(t.status===0?t.timeSeconds>10?r=i.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED:(t.stdout.length>v||t.stderr.length>v)&&(r=i.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):r=i.DecisionCode.BUILD_ERROR,r!==i.DecisionCode.ACCEPTED){n.printTestCaseResult({testCaseId:S[0]?.id??`build`,decisionCode:r,exitStatus:t.status??void 0,stdout:t.stdout.slice(0,v)||void 0,stderr:t.stderr.slice(0,v)||void 0,timeSeconds:t.timeSeconds,memoryBytes:t.memoryBytes});return}}catch(e){console.error(`build error`,e),n.printTestCaseResult({testCaseId:S[0]?.id??`build`,decisionCode:i.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let k=await a.snapshotWorkingDirectory(g.cwd);S.length===0&&n.printTestCaseResult({testCaseId:`default`,decisionCode:i.DecisionCode.ACCEPTED});for(let e of S){S.shared?.fileInputPath&&await o.copyTestCaseFileInput(S.shared.fileInputPath,g.cwd),e.fileInputPath&&await o.copyTestCaseFileInput(e.fileInputPath,g.cwd);let t=typeof x.timeLimitMs==`number`?x.timeLimitMs/1e3:2,r=T.command(O),s=p.spawnSyncWithTimeout(r[0],r.slice(1),{cwd:g.cwd,encoding:`utf8`,input:e.input,env:E},t),c=await u.readOutputFiles(g.cwd,x.requiredOutputFilePaths??[]),l=i.DecisionCode.ACCEPTED;if(s.status!==0)l=i.DecisionCode.RUNTIME_ERROR;else if(s.timeSeconds>t)l=i.DecisionCode.TIME_LIMIT_EXCEEDED;else if(s.memoryBytes>(x.memoryLimitByte??1/0))l=i.DecisionCode.MEMORY_LIMIT_EXCEEDED;else if(s.stdout.length>v||s.stderr.length>v)l=i.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;else if(c.length<(x.requiredOutputFilePaths?.length??0))l=i.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;else if(!m.compareStdoutAsSpaceSeparatedTokens(s.stdout,e.output??``))l=i.DecisionCode.WRONG_ANSWER;else if(e.fileOutputPath){let t=await _.default.promises.readdir(e.fileOutputPath,{withFileTypes:!0,recursive:!0});for(let n of t){if(!n.isFile())continue;let t=h.default.relative(e.fileOutputPath,n.parentPath),r=await _.default.promises.readFile(h.default.join(n.parentPath,n.name));try{let e=h.default.join(g.cwd,t,n.name);if(!await u.isSafeSubmissionOutputPath(g.cwd,e))throw Error(`unsafe output path`);(await _.default.promises.readFile(e)).compare(r)!==0&&(l=i.DecisionCode.WRONG_ANSWER)}catch(e){console.error(e),l=i.DecisionCode.WRONG_ANSWER}}}if(n.printTestCaseResult({testCaseId:e.id,decisionCode:l,exitStatus:s.status??void 0,stdin:e.input,stdout:s.stdout.slice(0,v)||void 0,stderr:s.stderr.slice(0,v)||void 0,timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes,outputFiles:c.length>0?c:void 0}),await a.cleanWorkingDirectory(g.cwd,k),l!==i.DecisionCode.ACCEPTED)break}}async function S(e){let a=t.parseArgs(process.argv);if(!a.cwd)throw Error(`cwd argument required`);let o=b.parse(a.params);r.makeAccessibleToSandboxUser(a.cwd);let l=await d.readProblemMarkdownFrontMatter(e),f=await s.findEntryPointFile(a.cwd,o.language);if(!f){n.printTestCaseResult({testCaseId:`prebuild`,decisionCode:i.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${o.language?`: language: ${o.language}`:``}`});return}let m=c.findLanguageDefinitionByPath(f);if(!m){n.printTestCaseResult({testCaseId:`prebuild`,decisionCode:i.DecisionCode.WRONG_ANSWER,stderr:`unsupported language`});return}let h={...process.env,CI:``,FORCE_COLOR:`0`},g;if(m.prebuild)try{await m.prebuild(a.cwd),g=await s.findEntryPointFile(a.cwd,o.language)}catch(e){console.error(`prebuild error`,e),n.printTestCaseResult({testCaseId:`prebuild`,decisionCode:i.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let _=g??f;if(m.buildCommand)try{let e=m.buildCommand(_),t=p.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:a.cwd,encoding:`utf8`,env:h},10),r=i.DecisionCode.ACCEPTED;if(t.status===0?t.timeSeconds>10?r=i.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED:(t.stdout.length>v||t.stderr.length>v)&&(r=i.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):r=i.DecisionCode.BUILD_ERROR,r!==i.DecisionCode.ACCEPTED){n.printTestCaseResult({testCaseId:`build`,decisionCode:r,exitStatus:t.status??void 0,stdout:t.stdout.slice(0,v)||void 0,stderr:t.stderr.slice(0,v)||void 0,timeSeconds:t.timeSeconds,memoryBytes:t.memoryBytes});return}}catch(e){console.error(`build error`,e),n.printTestCaseResult({testCaseId:`build`,decisionCode:i.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}{let e=Math.max(10,(l.timeLimitMs??0)/1e3),t=m.command(_),r=p.spawnSyncWithTimeout(t[0],t.slice(1),{cwd:a.cwd,encoding:`utf8`,input:o.stdin,env:h},e),s=await u.readOutputFiles(a.cwd,l.requiredOutputFilePaths??[]),c=i.DecisionCode.ACCEPTED;r.status===0?r.timeSeconds>e?c=i.DecisionCode.TIME_LIMIT_EXCEEDED:r.memoryBytes>(l.memoryLimitByte??1/0)?c=i.DecisionCode.MEMORY_LIMIT_EXCEEDED:r.stdout.length>v||r.stderr.length>v?c=i.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED:s.length<(l.requiredOutputFilePaths?.length??0)&&(c=i.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR):c=i.DecisionCode.RUNTIME_ERROR,n.printTestCaseResult({testCaseId:`debug`,decisionCode:c,exitStatus:r.status??void 0,stdin:o.stdin,stdout:r.stdout.slice(0,v)||void 0,stderr:r.stderr.slice(0,v)||void 0,timeSeconds:r.timeSeconds,memoryBytes:r.memoryBytes,outputFiles:s.length>0?s:void 0})}}exports.stdioDebugPreset=S,exports.stdioJudgePreset=x;
2
2
  //# sourceMappingURL=stdio.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.cjs","names":["z","parseArgs","readProblemMarkdownFrontMatter","readTestCases","path","judgeByStaticAnalysis","findEntryPointFile","DecisionCode","findLanguageDefinitionByPath","spawnSyncWithTimeout","snapshotWorkingDirectory","copyTestCaseFileInput","readOutputFiles","compareStdoutAsSpaceSeparatedTokens","fs","isSafeSubmissionOutputPath","cleanWorkingDirectory"],"sources":["../../src/presets/stdio.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { compareStdoutAsSpaceSeparatedTokens } from '../helpers/compareStdoutAsSpaceSeparatedTokens.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { isSafeSubmissionOutputPath, readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { makeAccessibleToSandboxUser } from '../helpers/sandboxUser.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst DEBUG_DEFAULT_TIMEOUT_SECONDS = 10;\n\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nconst debugParamsSchema = judgeParamsSchema.extend({\n stdin: z.string().optional(),\n});\n\n/**\n * A preset judge function using stdin and stdout as test cases.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { stdioJudgePreset } from 'judge-utils/presets/stdio';\n *\n * await stdioJudgePreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java\n * ```\n *\n * Run with the optional parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"language\": \"javascript\" }'\n * ```\n */\nexport async function stdioJudgePreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n // The sandboxed submission must read its sources and write build/run outputs in its directory.\n makeAccessibleToSandboxUser(args.cwd);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const staticAnalysisTestCaseResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisTestCaseResult) {\n printTestCaseResult({ testCaseId: testCases[0]?.id ?? 'prebuild', ...staticAnalysisTestCaseResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n }\n\n for (const testCase of testCases) {\n // prepare test case\n if (testCases.shared?.fileInputPath) await copyTestCaseFileInput(testCases.shared.fileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n // run\n const timeoutSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: testCase.input, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n // calculate decision\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n } else if (!compareStdoutAsSpaceSeparatedTokens(spawnResult.stdout, testCase.output ?? '')) {\n decisionCode = DecisionCode.WRONG_ANSWER;\n } else if (testCase.fileOutputPath) {\n const dirents = await fs.promises.readdir(testCase.fileOutputPath, { withFileTypes: true, recursive: true });\n for (const dirent of dirents) {\n if (!dirent.isFile()) continue;\n const direntRelativePath = path.relative(testCase.fileOutputPath, dirent.parentPath);\n const expected = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name));\n try {\n const receivedPath = path.join(args.cwd, direntRelativePath, dirent.name);\n // A submission-planted symlink to the expected file itself would otherwise compare equal.\n if (!(await isSafeSubmissionOutputPath(args.cwd, receivedPath))) throw new Error('unsafe output path');\n const received = await fs.promises.readFile(receivedPath);\n if (received.compare(expected) !== 0) decisionCode = DecisionCode.WRONG_ANSWER;\n } catch (error) {\n console.error(error);\n decisionCode = DecisionCode.WRONG_ANSWER;\n }\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: testCase.input,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n // clean up\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n}\n\n/**\n * A preset debug function using stdin and stdout as test cases.\n *\n * @example\n * Create `debug.ts`:\n * ```ts\n * import { stdioDebugPreset } from 'judge-utils/presets/stdio';\n *\n * await stdioDebugPreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun debug.ts model_answers/java '{ \"stdin\": \"1 2\" }'\n * ```\n */\nexport async function stdioDebugPreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = debugParamsSchema.parse(args.params);\n\n // The sandboxed submission must read its sources and write build/run outputs in its directory.\n makeAccessibleToSandboxUser(args.cwd);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n {\n const timeoutSeconds = Math.max(\n DEBUG_DEFAULT_TIMEOUT_SECONDS,\n (problemMarkdownFrontMatter.timeLimitMs ?? 0) / 1000\n );\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: params.stdin, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n }\n\n printTestCaseResult({\n testCaseId: 'debug',\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: params.stdin,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stdio.cjs","names":["z","parseArgs","readProblemMarkdownFrontMatter","readTestCases","path","judgeByStaticAnalysis","findEntryPointFile","DecisionCode","findLanguageDefinitionByPath","spawnSyncWithTimeout","snapshotWorkingDirectory","copyTestCaseFileInput","readOutputFiles","compareStdoutAsSpaceSeparatedTokens","fs","isSafeSubmissionOutputPath","cleanWorkingDirectory"],"sources":["../../src/presets/stdio.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { compareStdoutAsSpaceSeparatedTokens } from '../helpers/compareStdoutAsSpaceSeparatedTokens.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { isSafeSubmissionOutputPath, readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { makeAccessibleToSandboxUser } from '../helpers/sandboxUser.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst DEBUG_DEFAULT_TIMEOUT_SECONDS = 10;\n\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nconst debugParamsSchema = judgeParamsSchema.extend({\n stdin: z.string().optional(),\n});\n\n/**\n * A preset judge function using stdin and stdout as test cases.\n *\n * A standard stdio problem must NOT commit a `judge.ts` that only calls this preset: the Exercode\n * server applies this preset automatically when `judge.ts` is absent, and committed copies would\n * drift from the server's defaults.\n *\n * @example\n * Run in a problem directory without `judge.ts`:\n * ```bash\n * bun x exercode judge model_answers/java\n * ```\n *\n * Run with the optional parameters:\n * ```bash\n * bun x exercode judge model_answers/java '{ \"language\": \"javascript\" }'\n * ```\n */\nexport async function stdioJudgePreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n // The sandboxed submission must read its sources and write build/run outputs in its directory.\n makeAccessibleToSandboxUser(args.cwd);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const staticAnalysisTestCaseResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisTestCaseResult) {\n printTestCaseResult({ testCaseId: testCases[0]?.id ?? 'prebuild', ...staticAnalysisTestCaseResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n }\n\n for (const testCase of testCases) {\n // prepare test case\n if (testCases.shared?.fileInputPath) await copyTestCaseFileInput(testCases.shared.fileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n // run\n const timeoutSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: testCase.input, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n // calculate decision\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n } else if (!compareStdoutAsSpaceSeparatedTokens(spawnResult.stdout, testCase.output ?? '')) {\n decisionCode = DecisionCode.WRONG_ANSWER;\n } else if (testCase.fileOutputPath) {\n const dirents = await fs.promises.readdir(testCase.fileOutputPath, { withFileTypes: true, recursive: true });\n for (const dirent of dirents) {\n if (!dirent.isFile()) continue;\n const direntRelativePath = path.relative(testCase.fileOutputPath, dirent.parentPath);\n const expected = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name));\n try {\n const receivedPath = path.join(args.cwd, direntRelativePath, dirent.name);\n // A submission-planted symlink to the expected file itself would otherwise compare equal.\n if (!(await isSafeSubmissionOutputPath(args.cwd, receivedPath))) throw new Error('unsafe output path');\n const received = await fs.promises.readFile(receivedPath);\n if (received.compare(expected) !== 0) decisionCode = DecisionCode.WRONG_ANSWER;\n } catch (error) {\n console.error(error);\n decisionCode = DecisionCode.WRONG_ANSWER;\n }\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: testCase.input,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n // clean up\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n}\n\n/**\n * A preset debug function using stdin and stdout as test cases.\n *\n * A standard stdio problem must NOT commit a `debug.ts` that only calls this preset: the Exercode\n * server applies this preset automatically when `debug.ts` is absent, and committed copies would\n * drift from the server's defaults.\n *\n * @example\n * Run in a problem directory without `debug.ts`:\n * ```bash\n * bun x exercode debug model_answers/java '{ \"stdin\": \"1 2\" }'\n * ```\n */\nexport async function stdioDebugPreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = debugParamsSchema.parse(args.params);\n\n // The sandboxed submission must read its sources and write build/run outputs in its directory.\n makeAccessibleToSandboxUser(args.cwd);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n {\n const timeoutSeconds = Math.max(\n DEBUG_DEFAULT_TIMEOUT_SECONDS,\n (problemMarkdownFrontMatter.timeLimitMs ?? 0) / 1000\n );\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: params.stdin, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n }\n\n printTestCaseResult({\n testCaseId: 'debug',\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: params.stdin,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n }\n}\n"],"mappings":"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"}
@@ -1,39 +1,33 @@
1
1
  /**
2
2
  * A preset judge function using stdin and stdout as test cases.
3
3
  *
4
- * @example
5
- * Create `judge.ts`:
6
- * ```ts
7
- * import { stdioJudgePreset } from 'judge-utils/presets/stdio';
8
- *
9
- * await stdioJudgePreset(import.meta.dirname);
10
- * ```
4
+ * A standard stdio problem must NOT commit a `judge.ts` that only calls this preset: the Exercode
5
+ * server applies this preset automatically when `judge.ts` is absent, and committed copies would
6
+ * drift from the server's defaults.
11
7
  *
12
- * Run with the required parameters:
8
+ * @example
9
+ * Run in a problem directory without `judge.ts`:
13
10
  * ```bash
14
- * bun judge.ts model_answers/java
11
+ * bun x exercode judge model_answers/java
15
12
  * ```
16
13
  *
17
14
  * Run with the optional parameters:
18
15
  * ```bash
19
- * bun judge.ts model_answers/java '{ "language": "javascript" }'
16
+ * bun x exercode judge model_answers/java '{ "language": "javascript" }'
20
17
  * ```
21
18
  */
22
19
  export declare function stdioJudgePreset(problemDir: string): Promise<void>;
23
20
  /**
24
21
  * A preset debug function using stdin and stdout as test cases.
25
22
  *
26
- * @example
27
- * Create `debug.ts`:
28
- * ```ts
29
- * import { stdioDebugPreset } from 'judge-utils/presets/stdio';
30
- *
31
- * await stdioDebugPreset(import.meta.dirname);
32
- * ```
23
+ * A standard stdio problem must NOT commit a `debug.ts` that only calls this preset: the Exercode
24
+ * server applies this preset automatically when `debug.ts` is absent, and committed copies would
25
+ * drift from the server's defaults.
33
26
  *
34
- * Run with the required parameters:
27
+ * @example
28
+ * Run in a problem directory without `debug.ts`:
35
29
  * ```bash
36
- * bun debug.ts model_answers/java '{ "stdin": "1 2" }'
30
+ * bun x exercode debug model_answers/java '{ "stdin": "1 2" }'
37
31
  * ```
38
32
  */
39
33
  export declare function stdioDebugPreset(problemDir: string): Promise<void>;
@@ -1,2 +1,2 @@
1
- import{parseArgs as e}from"../helpers/parseArgs.js";import{printTestCaseResult as t}from"../helpers/printTestCaseResult.js";import{makeAccessibleToSandboxUser as n}from"../helpers/sandboxUser.js";import{DecisionCode as r}from"../types/decisionCode.js";import{cleanWorkingDirectory as i,snapshotWorkingDirectory as a}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as o}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as s}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as c}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as l}from"../helpers/judgeByStaticAnalysis.js";import{isSafeSubmissionOutputPath as u,readOutputFiles as d}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as f}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as p}from"../helpers/readTestCases.js";import{spawnSyncWithTimeout as m}from"../helpers/spawnSyncWithTimeout.js";import{compareStdoutAsSpaceSeparatedTokens as h}from"../helpers/compareStdoutAsSpaceSeparatedTokens.js";import{z as g}from"zod";import _ from"node:fs";import v from"node:path";const y=5e4,b=g.object({language:g.union([g.string(),g.array(g.string())]).optional()}),x=b.extend({stdin:g.string().optional()});async function S(g){let x=e(process.argv);if(!x.cwd)throw Error(`cwd argument required`);let S=b.parse(x.params);n(x.cwd);let C=await f(g),w=await p(v.join(g,`test_cases`)),T=await l(x.cwd,C);if(T){t({testCaseId:w[0]?.id??`prebuild`,...T});return}let E=await s(x.cwd,S.language);if(!E){t({testCaseId:w[0]?.id??`prebuild`,decisionCode:r.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${S.language?`: language: ${S.language}`:``}`});return}let D=c(E);if(!D){t({testCaseId:w[0]?.id??`prebuild`,decisionCode:r.WRONG_ANSWER,stderr:`unsupported language`});return}let O={...process.env,CI:``,FORCE_COLOR:`0`},k;if(D.prebuild)try{await D.prebuild(x.cwd),k=await s(x.cwd,S.language)}catch(e){console.error(`prebuild error`,e),t({testCaseId:w[0]?.id??`prebuild`,decisionCode:r.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let A=k??E;if(D.buildCommand)try{let e=D.buildCommand(A),n=m(e[0],e.slice(1),{cwd:x.cwd,encoding:`utf8`,env:O},10),i=r.ACCEPTED;if(n.status===0?n.timeSeconds>10?i=r.BUILD_TIME_LIMIT_EXCEEDED:(n.stdout.length>y||n.stderr.length>y)&&(i=r.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):i=r.BUILD_ERROR,i!==r.ACCEPTED){t({testCaseId:w[0]?.id??`build`,decisionCode:i,exitStatus:n.status??void 0,stdout:n.stdout.slice(0,y)||void 0,stderr:n.stderr.slice(0,y)||void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes});return}}catch(e){console.error(`build error`,e),t({testCaseId:w[0]?.id??`build`,decisionCode:r.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let j=await a(x.cwd);w.length===0&&t({testCaseId:`default`,decisionCode:r.ACCEPTED});for(let e of w){w.shared?.fileInputPath&&await o(w.shared.fileInputPath,x.cwd),e.fileInputPath&&await o(e.fileInputPath,x.cwd);let n=typeof C.timeLimitMs==`number`?C.timeLimitMs/1e3:2,a=D.command(A),s=m(a[0],a.slice(1),{cwd:x.cwd,encoding:`utf8`,input:e.input,env:O},n),c=await d(x.cwd,C.requiredOutputFilePaths??[]),l=r.ACCEPTED;if(s.status!==0)l=r.RUNTIME_ERROR;else if(s.timeSeconds>n)l=r.TIME_LIMIT_EXCEEDED;else if(s.memoryBytes>(C.memoryLimitByte??1/0))l=r.MEMORY_LIMIT_EXCEEDED;else if(s.stdout.length>y||s.stderr.length>y)l=r.OUTPUT_SIZE_LIMIT_EXCEEDED;else if(c.length<(C.requiredOutputFilePaths?.length??0))l=r.MISSING_REQUIRED_OUTPUT_FILE_ERROR;else if(!h(s.stdout,e.output??``))l=r.WRONG_ANSWER;else if(e.fileOutputPath){let t=await _.promises.readdir(e.fileOutputPath,{withFileTypes:!0,recursive:!0});for(let n of t){if(!n.isFile())continue;let t=v.relative(e.fileOutputPath,n.parentPath),i=await _.promises.readFile(v.join(n.parentPath,n.name));try{let e=v.join(x.cwd,t,n.name);if(!await u(x.cwd,e))throw Error(`unsafe output path`);(await _.promises.readFile(e)).compare(i)!==0&&(l=r.WRONG_ANSWER)}catch(e){console.error(e),l=r.WRONG_ANSWER}}}if(t({testCaseId:e.id,decisionCode:l,exitStatus:s.status??void 0,stdin:e.input,stdout:s.stdout.slice(0,y)||void 0,stderr:s.stderr.slice(0,y)||void 0,timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes,outputFiles:c.length>0?c:void 0}),await i(x.cwd,j),l!==r.ACCEPTED)break}}async function C(i){let a=e(process.argv);if(!a.cwd)throw Error(`cwd argument required`);let o=x.parse(a.params);n(a.cwd);let l=await f(i),u=await s(a.cwd,o.language);if(!u){t({testCaseId:`prebuild`,decisionCode:r.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${o.language?`: language: ${o.language}`:``}`});return}let p=c(u);if(!p){t({testCaseId:`prebuild`,decisionCode:r.WRONG_ANSWER,stderr:`unsupported language`});return}let h={...process.env,CI:``,FORCE_COLOR:`0`},g;if(p.prebuild)try{await p.prebuild(a.cwd),g=await s(a.cwd,o.language)}catch(e){console.error(`prebuild error`,e),t({testCaseId:`prebuild`,decisionCode:r.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let _=g??u;if(p.buildCommand)try{let e=p.buildCommand(_),n=m(e[0],e.slice(1),{cwd:a.cwd,encoding:`utf8`,env:h},10),i=r.ACCEPTED;if(n.status===0?n.timeSeconds>10?i=r.BUILD_TIME_LIMIT_EXCEEDED:(n.stdout.length>y||n.stderr.length>y)&&(i=r.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):i=r.BUILD_ERROR,i!==r.ACCEPTED){t({testCaseId:`build`,decisionCode:i,exitStatus:n.status??void 0,stdout:n.stdout.slice(0,y)||void 0,stderr:n.stderr.slice(0,y)||void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes});return}}catch(e){console.error(`build error`,e),t({testCaseId:`build`,decisionCode:r.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}{let e=Math.max(10,(l.timeLimitMs??0)/1e3),n=p.command(_),i=m(n[0],n.slice(1),{cwd:a.cwd,encoding:`utf8`,input:o.stdin,env:h},e),s=await d(a.cwd,l.requiredOutputFilePaths??[]),c=r.ACCEPTED;i.status===0?i.timeSeconds>e?c=r.TIME_LIMIT_EXCEEDED:i.memoryBytes>(l.memoryLimitByte??1/0)?c=r.MEMORY_LIMIT_EXCEEDED:i.stdout.length>y||i.stderr.length>y?c=r.OUTPUT_SIZE_LIMIT_EXCEEDED:s.length<(l.requiredOutputFilePaths?.length??0)&&(c=r.MISSING_REQUIRED_OUTPUT_FILE_ERROR):c=r.RUNTIME_ERROR,t({testCaseId:`debug`,decisionCode:c,exitStatus:i.status??void 0,stdin:o.stdin,stdout:i.stdout.slice(0,y)||void 0,stderr:i.stderr.slice(0,y)||void 0,timeSeconds:i.timeSeconds,memoryBytes:i.memoryBytes,outputFiles:s.length>0?s:void 0})}}export{C as stdioDebugPreset,S as stdioJudgePreset};
1
+ import{parseArgs as e}from"../helpers/parseArgs.js";import{printTestCaseResult as t}from"../helpers/printTestCaseResult.js";import{makeAccessibleToSandboxUser as n}from"../helpers/sandboxUser.js";import{DecisionCode as r}from"../types/decisionCode.js";import{cleanWorkingDirectory as i,snapshotWorkingDirectory as a}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as o}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as s}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as c}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as l}from"../helpers/judgeByStaticAnalysis.js";import{isSafeSubmissionOutputPath as u,readOutputFiles as d}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as f}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as p}from"../helpers/readTestCases.js";import{spawnSyncWithTimeout as m}from"../helpers/spawnSyncWithTimeout.js";import{compareStdoutAsSpaceSeparatedTokens as h}from"../helpers/compareStdoutAsSpaceSeparatedTokens.js";import g from"node:path";import{z as _}from"zod";import v from"node:fs";const y=5e4,b=_.object({language:_.union([_.string(),_.array(_.string())]).optional()}),x=b.extend({stdin:_.string().optional()});async function S(_){let x=e(process.argv);if(!x.cwd)throw Error(`cwd argument required`);let S=b.parse(x.params);n(x.cwd);let C=await f(_),w=await p(g.join(_,`test_cases`)),T=await l(x.cwd,C);if(T){t({testCaseId:w[0]?.id??`prebuild`,...T});return}let E=await s(x.cwd,S.language);if(!E){t({testCaseId:w[0]?.id??`prebuild`,decisionCode:r.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${S.language?`: language: ${S.language}`:``}`});return}let D=c(E);if(!D){t({testCaseId:w[0]?.id??`prebuild`,decisionCode:r.WRONG_ANSWER,stderr:`unsupported language`});return}let O={...process.env,CI:``,FORCE_COLOR:`0`},k;if(D.prebuild)try{await D.prebuild(x.cwd),k=await s(x.cwd,S.language)}catch(e){console.error(`prebuild error`,e),t({testCaseId:w[0]?.id??`prebuild`,decisionCode:r.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let A=k??E;if(D.buildCommand)try{let e=D.buildCommand(A),n=m(e[0],e.slice(1),{cwd:x.cwd,encoding:`utf8`,env:O},10),i=r.ACCEPTED;if(n.status===0?n.timeSeconds>10?i=r.BUILD_TIME_LIMIT_EXCEEDED:(n.stdout.length>y||n.stderr.length>y)&&(i=r.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):i=r.BUILD_ERROR,i!==r.ACCEPTED){t({testCaseId:w[0]?.id??`build`,decisionCode:i,exitStatus:n.status??void 0,stdout:n.stdout.slice(0,y)||void 0,stderr:n.stderr.slice(0,y)||void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes});return}}catch(e){console.error(`build error`,e),t({testCaseId:w[0]?.id??`build`,decisionCode:r.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let j=await a(x.cwd);w.length===0&&t({testCaseId:`default`,decisionCode:r.ACCEPTED});for(let e of w){w.shared?.fileInputPath&&await o(w.shared.fileInputPath,x.cwd),e.fileInputPath&&await o(e.fileInputPath,x.cwd);let n=typeof C.timeLimitMs==`number`?C.timeLimitMs/1e3:2,a=D.command(A),s=m(a[0],a.slice(1),{cwd:x.cwd,encoding:`utf8`,input:e.input,env:O},n),c=await d(x.cwd,C.requiredOutputFilePaths??[]),l=r.ACCEPTED;if(s.status!==0)l=r.RUNTIME_ERROR;else if(s.timeSeconds>n)l=r.TIME_LIMIT_EXCEEDED;else if(s.memoryBytes>(C.memoryLimitByte??1/0))l=r.MEMORY_LIMIT_EXCEEDED;else if(s.stdout.length>y||s.stderr.length>y)l=r.OUTPUT_SIZE_LIMIT_EXCEEDED;else if(c.length<(C.requiredOutputFilePaths?.length??0))l=r.MISSING_REQUIRED_OUTPUT_FILE_ERROR;else if(!h(s.stdout,e.output??``))l=r.WRONG_ANSWER;else if(e.fileOutputPath){let t=await v.promises.readdir(e.fileOutputPath,{withFileTypes:!0,recursive:!0});for(let n of t){if(!n.isFile())continue;let t=g.relative(e.fileOutputPath,n.parentPath),i=await v.promises.readFile(g.join(n.parentPath,n.name));try{let e=g.join(x.cwd,t,n.name);if(!await u(x.cwd,e))throw Error(`unsafe output path`);(await v.promises.readFile(e)).compare(i)!==0&&(l=r.WRONG_ANSWER)}catch(e){console.error(e),l=r.WRONG_ANSWER}}}if(t({testCaseId:e.id,decisionCode:l,exitStatus:s.status??void 0,stdin:e.input,stdout:s.stdout.slice(0,y)||void 0,stderr:s.stderr.slice(0,y)||void 0,timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes,outputFiles:c.length>0?c:void 0}),await i(x.cwd,j),l!==r.ACCEPTED)break}}async function C(i){let a=e(process.argv);if(!a.cwd)throw Error(`cwd argument required`);let o=x.parse(a.params);n(a.cwd);let l=await f(i),u=await s(a.cwd,o.language);if(!u){t({testCaseId:`prebuild`,decisionCode:r.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${o.language?`: language: ${o.language}`:``}`});return}let p=c(u);if(!p){t({testCaseId:`prebuild`,decisionCode:r.WRONG_ANSWER,stderr:`unsupported language`});return}let h={...process.env,CI:``,FORCE_COLOR:`0`},g;if(p.prebuild)try{await p.prebuild(a.cwd),g=await s(a.cwd,o.language)}catch(e){console.error(`prebuild error`,e),t({testCaseId:`prebuild`,decisionCode:r.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let _=g??u;if(p.buildCommand)try{let e=p.buildCommand(_),n=m(e[0],e.slice(1),{cwd:a.cwd,encoding:`utf8`,env:h},10),i=r.ACCEPTED;if(n.status===0?n.timeSeconds>10?i=r.BUILD_TIME_LIMIT_EXCEEDED:(n.stdout.length>y||n.stderr.length>y)&&(i=r.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):i=r.BUILD_ERROR,i!==r.ACCEPTED){t({testCaseId:`build`,decisionCode:i,exitStatus:n.status??void 0,stdout:n.stdout.slice(0,y)||void 0,stderr:n.stderr.slice(0,y)||void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes});return}}catch(e){console.error(`build error`,e),t({testCaseId:`build`,decisionCode:r.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}{let e=Math.max(10,(l.timeLimitMs??0)/1e3),n=p.command(_),i=m(n[0],n.slice(1),{cwd:a.cwd,encoding:`utf8`,input:o.stdin,env:h},e),s=await d(a.cwd,l.requiredOutputFilePaths??[]),c=r.ACCEPTED;i.status===0?i.timeSeconds>e?c=r.TIME_LIMIT_EXCEEDED:i.memoryBytes>(l.memoryLimitByte??1/0)?c=r.MEMORY_LIMIT_EXCEEDED:i.stdout.length>y||i.stderr.length>y?c=r.OUTPUT_SIZE_LIMIT_EXCEEDED:s.length<(l.requiredOutputFilePaths?.length??0)&&(c=r.MISSING_REQUIRED_OUTPUT_FILE_ERROR):c=r.RUNTIME_ERROR,t({testCaseId:`debug`,decisionCode:c,exitStatus:i.status??void 0,stdin:o.stdin,stdout:i.stdout.slice(0,y)||void 0,stderr:i.stderr.slice(0,y)||void 0,timeSeconds:i.timeSeconds,memoryBytes:i.memoryBytes,outputFiles:s.length>0?s:void 0})}}export{C as stdioDebugPreset,S as stdioJudgePreset};
2
2
  //# sourceMappingURL=stdio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","names":[],"sources":["../../src/presets/stdio.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { compareStdoutAsSpaceSeparatedTokens } from '../helpers/compareStdoutAsSpaceSeparatedTokens.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { isSafeSubmissionOutputPath, readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { makeAccessibleToSandboxUser } from '../helpers/sandboxUser.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst DEBUG_DEFAULT_TIMEOUT_SECONDS = 10;\n\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nconst debugParamsSchema = judgeParamsSchema.extend({\n stdin: z.string().optional(),\n});\n\n/**\n * A preset judge function using stdin and stdout as test cases.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { stdioJudgePreset } from 'judge-utils/presets/stdio';\n *\n * await stdioJudgePreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java\n * ```\n *\n * Run with the optional parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"language\": \"javascript\" }'\n * ```\n */\nexport async function stdioJudgePreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n // The sandboxed submission must read its sources and write build/run outputs in its directory.\n makeAccessibleToSandboxUser(args.cwd);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const staticAnalysisTestCaseResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisTestCaseResult) {\n printTestCaseResult({ testCaseId: testCases[0]?.id ?? 'prebuild', ...staticAnalysisTestCaseResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n }\n\n for (const testCase of testCases) {\n // prepare test case\n if (testCases.shared?.fileInputPath) await copyTestCaseFileInput(testCases.shared.fileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n // run\n const timeoutSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: testCase.input, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n // calculate decision\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n } else if (!compareStdoutAsSpaceSeparatedTokens(spawnResult.stdout, testCase.output ?? '')) {\n decisionCode = DecisionCode.WRONG_ANSWER;\n } else if (testCase.fileOutputPath) {\n const dirents = await fs.promises.readdir(testCase.fileOutputPath, { withFileTypes: true, recursive: true });\n for (const dirent of dirents) {\n if (!dirent.isFile()) continue;\n const direntRelativePath = path.relative(testCase.fileOutputPath, dirent.parentPath);\n const expected = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name));\n try {\n const receivedPath = path.join(args.cwd, direntRelativePath, dirent.name);\n // A submission-planted symlink to the expected file itself would otherwise compare equal.\n if (!(await isSafeSubmissionOutputPath(args.cwd, receivedPath))) throw new Error('unsafe output path');\n const received = await fs.promises.readFile(receivedPath);\n if (received.compare(expected) !== 0) decisionCode = DecisionCode.WRONG_ANSWER;\n } catch (error) {\n console.error(error);\n decisionCode = DecisionCode.WRONG_ANSWER;\n }\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: testCase.input,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n // clean up\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n}\n\n/**\n * A preset debug function using stdin and stdout as test cases.\n *\n * @example\n * Create `debug.ts`:\n * ```ts\n * import { stdioDebugPreset } from 'judge-utils/presets/stdio';\n *\n * await stdioDebugPreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun debug.ts model_answers/java '{ \"stdin\": \"1 2\" }'\n * ```\n */\nexport async function stdioDebugPreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = debugParamsSchema.parse(args.params);\n\n // The sandboxed submission must read its sources and write build/run outputs in its directory.\n makeAccessibleToSandboxUser(args.cwd);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n {\n const timeoutSeconds = Math.max(\n DEBUG_DEFAULT_TIMEOUT_SECONDS,\n (problemMarkdownFrontMatter.timeLimitMs ?? 0) / 1000\n );\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: params.stdin, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n }\n\n printTestCaseResult({\n testCaseId: 'debug',\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: params.stdin,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n }\n}\n"],"mappings":"kpCAoBA,MAIM,EAAoB,IAEpB,EAAoB,EAAE,OAAO,CACjC,SAAU,EAAE,MAAM,CAAC,EAAE,OAAO,EAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAChE,CAAC,EAEK,EAAoB,EAAkB,OAAO,CACjD,MAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAC7B,CAAC,EAuBD,eAAsB,EAAiB,EAAmC,CACxE,IAAM,EAAO,EAAU,QAAQ,IAAI,EACnC,GAAI,CAAC,EAAK,IAAK,MAAU,MAAM,uBAAuB,EACtD,IAAM,EAAS,EAAkB,MAAM,EAAK,MAAM,EAGlD,EAA4B,EAAK,GAAG,EAEpC,IAAM,EAA6B,MAAM,EAA+B,CAAU,EAC5E,EAAY,MAAM,EAAc,EAAK,KAAK,EAAY,YAAY,CAAC,EAEnE,EAA+B,MAAM,EAAsB,EAAK,IAAK,CAA0B,EACrG,GAAI,EAA8B,CAChC,EAAoB,CAAE,WAAY,EAAU,EAAE,EAAE,IAAM,WAAY,GAAG,CAA6B,CAAC,EACnG,MACF,CAEA,IAAM,EAAuB,MAAM,EAAmB,EAAK,IAAK,EAAO,QAAQ,EAC/E,GAAI,CAAC,EAAsB,CACzB,EAAoB,CAClB,WAAY,EAAU,EAAE,EAAE,IAAM,WAChC,aAAc,EAAa,uCAC3B,OAAQ,sBAAsB,EAAO,SAAW,eAAe,EAAO,WAAa,IACrF,CAAC,EACD,MACF,CAEA,IAAM,EAAqB,EAA6B,CAAoB,EAC5E,GAAI,CAAC,EAAoB,CACvB,EAAoB,CAClB,WAAY,EAAU,EAAE,EAAE,IAAM,WAChC,aAAc,EAAa,aAC3B,OAAQ,sBACV,CAAC,EACD,MACF,CAGA,IAAM,EAAM,CAAE,GAAG,QAAQ,IAAK,GAAI,GAAI,YAAa,GAAI,EAEnD,EAEJ,GAAI,EAAmB,SACrB,GAAI,CACF,MAAM,EAAmB,SAAS,EAAK,GAAG,EAC1C,EAAuB,MAAM,EAAmB,EAAK,IAAK,EAAO,QAAQ,CAC3E,OAAS,EAAO,CACd,QAAQ,MAAM,iBAAkB,CAAK,EAErC,EAAoB,CAClB,WAAY,EAAU,EAAE,EAAE,IAAM,WAChC,aAAc,EAAa,YAC3B,OAAQ,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC/D,CAAC,EACD,MACF,CAGF,IAAM,EAAe,GAAwB,EAE7C,GAAI,EAAmB,aACrB,GAAI,CACF,IAAM,EAAe,EAAmB,aAAa,CAAY,EAE3D,EAAmB,EACvB,EAAa,GACb,EAAa,MAAM,CAAC,EACpB,CAAE,IAAK,EAAK,IAAK,SAAU,OAAQ,KAAI,EACvC,EACF,EAEI,EAA6B,EAAa,SAa9C,GAXI,EAAiB,SAAW,EAErB,EAAiB,YAAc,GACxC,EAAe,EAAa,2BAE5B,EAAiB,OAAO,OAAS,GACjC,EAAiB,OAAO,OAAS,KAEjC,EAAe,EAAa,kCAP5B,EAAe,EAAa,YAU1B,IAAiB,EAAa,SAAU,CAC1C,EAAoB,CAClB,WAAY,EAAU,EAAE,EAAE,IAAM,QAChC,eACA,WAAY,EAAiB,QAAU,IAAA,GACvC,OAAQ,EAAiB,OAAO,MAAM,EAAG,CAAiB,GAAK,IAAA,GAC/D,OAAQ,EAAiB,OAAO,MAAM,EAAG,CAAiB,GAAK,IAAA,GAC/D,YAAa,EAAiB,YAC9B,YAAa,EAAiB,WAChC,CAAC,EACD,MACF,CACF,OAAS,EAAO,CACd,QAAQ,MAAM,cAAe,CAAK,EAElC,EAAoB,CAClB,WAAY,EAAU,EAAE,EAAE,IAAM,QAChC,aAAc,EAAa,YAC3B,OAAQ,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC/D,CAAC,EACD,MACF,CAGF,IAAM,EAAc,MAAM,EAAyB,EAAK,GAAG,EAEvD,EAAU,SAAW,GACvB,EAAoB,CAAE,WAAY,UAAW,aAAc,EAAa,QAAS,CAAC,EAGpF,IAAK,IAAM,KAAY,EAAW,CAE5B,EAAU,QAAQ,eAAe,MAAM,EAAsB,EAAU,OAAO,cAAe,EAAK,GAAG,EACrG,EAAS,eAAe,MAAM,EAAsB,EAAS,cAAe,EAAK,GAAG,EAGxF,IAAM,EACJ,OAAO,EAA2B,aAAgB,SAC9C,EAA2B,YAAc,IACzC,EAEA,EAAU,EAAmB,QAAQ,CAAY,EAEjD,EAAc,EAClB,EAAQ,GACR,EAAQ,MAAM,CAAC,EACf,CAAE,IAAK,EAAK,IAAK,SAAU,OAAQ,MAAO,EAAS,MAAO,KAAI,EAC9D,CACF,EAEM,EAAc,MAAM,EAAgB,EAAK,IAAK,EAA2B,yBAA2B,CAAC,CAAC,EAGxG,EAA6B,EAAa,SAE9C,GAAI,EAAY,SAAW,EACzB,EAAe,EAAa,mBACvB,GAAI,EAAY,YAAc,EACnC,EAAe,EAAa,yBACvB,GAAI,EAAY,aAAe,EAA2B,iBAAmB,KAClF,EAAe,EAAa,2BACvB,GAAI,EAAY,OAAO,OAAS,GAAqB,EAAY,OAAO,OAAS,EACtF,EAAe,EAAa,gCACvB,GAAI,EAAY,QAAU,EAA2B,yBAAyB,QAAU,GAC7F,EAAe,EAAa,wCACvB,GAAI,CAAC,EAAoC,EAAY,OAAQ,EAAS,QAAU,EAAE,EACvF,EAAe,EAAa,kBACvB,GAAI,EAAS,eAAgB,CAClC,IAAM,EAAU,MAAM,EAAG,SAAS,QAAQ,EAAS,eAAgB,CAAE,cAAe,GAAM,UAAW,EAAK,CAAC,EAC3G,IAAK,IAAM,KAAU,EAAS,CAC5B,GAAI,CAAC,EAAO,OAAO,EAAG,SACtB,IAAM,EAAqB,EAAK,SAAS,EAAS,eAAgB,EAAO,UAAU,EAC7E,EAAW,MAAM,EAAG,SAAS,SAAS,EAAK,KAAK,EAAO,WAAY,EAAO,IAAI,CAAC,EACrF,GAAI,CACF,IAAM,EAAe,EAAK,KAAK,EAAK,IAAK,EAAoB,EAAO,IAAI,EAExE,GAAI,CAAE,MAAM,EAA2B,EAAK,IAAK,CAAY,EAAI,MAAU,MAAM,oBAAoB,GAEjG,MADmB,EAAG,SAAS,SAAS,CAAY,EAAA,CAC3C,QAAQ,CAAQ,IAAM,IAAG,EAAe,EAAa,aACpE,OAAS,EAAO,CACd,QAAQ,MAAM,CAAK,EACnB,EAAe,EAAa,YAC9B,CACF,CACF,CAiBA,GAfA,EAAoB,CAClB,WAAY,EAAS,GACrB,eACA,WAAY,EAAY,QAAU,IAAA,GAClC,MAAO,EAAS,MAChB,OAAQ,EAAY,OAAO,MAAM,EAAG,CAAiB,GAAK,IAAA,GAC1D,OAAQ,EAAY,OAAO,MAAM,EAAG,CAAiB,GAAK,IAAA,GAC1D,YAAa,EAAY,YACzB,YAAa,EAAY,YACzB,YAAa,EAAY,OAAS,EAAI,EAAc,IAAA,EACtD,CAAC,EAGD,MAAM,EAAsB,EAAK,IAAK,CAAW,EAE7C,IAAiB,EAAa,SAAU,KAC9C,CACF,CAkBA,eAAsB,EAAiB,EAAmC,CACxE,IAAM,EAAO,EAAU,QAAQ,IAAI,EACnC,GAAI,CAAC,EAAK,IAAK,MAAU,MAAM,uBAAuB,EACtD,IAAM,EAAS,EAAkB,MAAM,EAAK,MAAM,EAGlD,EAA4B,EAAK,GAAG,EAEpC,IAAM,EAA6B,MAAM,EAA+B,CAAU,EAE5E,EAAuB,MAAM,EAAmB,EAAK,IAAK,EAAO,QAAQ,EAC/E,GAAI,CAAC,EAAsB,CACzB,EAAoB,CAClB,WAAY,WACZ,aAAc,EAAa,uCAC3B,OAAQ,sBAAsB,EAAO,SAAW,eAAe,EAAO,WAAa,IACrF,CAAC,EACD,MACF,CAEA,IAAM,EAAqB,EAA6B,CAAoB,EAC5E,GAAI,CAAC,EAAoB,CACvB,EAAoB,CAClB,WAAY,WACZ,aAAc,EAAa,aAC3B,OAAQ,sBACV,CAAC,EACD,MACF,CAGA,IAAM,EAAM,CAAE,GAAG,QAAQ,IAAK,GAAI,GAAI,YAAa,GAAI,EAEnD,EAEJ,GAAI,EAAmB,SACrB,GAAI,CACF,MAAM,EAAmB,SAAS,EAAK,GAAG,EAC1C,EAAuB,MAAM,EAAmB,EAAK,IAAK,EAAO,QAAQ,CAC3E,OAAS,EAAO,CACd,QAAQ,MAAM,iBAAkB,CAAK,EAErC,EAAoB,CAClB,WAAY,WACZ,aAAc,EAAa,YAC3B,OAAQ,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC/D,CAAC,EACD,MACF,CAGF,IAAM,EAAe,GAAwB,EAE7C,GAAI,EAAmB,aACrB,GAAI,CACF,IAAM,EAAe,EAAmB,aAAa,CAAY,EAE3D,EAAmB,EACvB,EAAa,GACb,EAAa,MAAM,CAAC,EACpB,CAAE,IAAK,EAAK,IAAK,SAAU,OAAQ,KAAI,EACvC,EACF,EAEI,EAA6B,EAAa,SAa9C,GAXI,EAAiB,SAAW,EAErB,EAAiB,YAAc,GACxC,EAAe,EAAa,2BAE5B,EAAiB,OAAO,OAAS,GACjC,EAAiB,OAAO,OAAS,KAEjC,EAAe,EAAa,kCAP5B,EAAe,EAAa,YAU1B,IAAiB,EAAa,SAAU,CAC1C,EAAoB,CAClB,WAAY,QACZ,eACA,WAAY,EAAiB,QAAU,IAAA,GACvC,OAAQ,EAAiB,OAAO,MAAM,EAAG,CAAiB,GAAK,IAAA,GAC/D,OAAQ,EAAiB,OAAO,MAAM,EAAG,CAAiB,GAAK,IAAA,GAC/D,YAAa,EAAiB,YAC9B,YAAa,EAAiB,WAChC,CAAC,EACD,MACF,CACF,OAAS,EAAO,CACd,QAAQ,MAAM,cAAe,CAAK,EAElC,EAAoB,CAClB,WAAY,QACZ,aAAc,EAAa,YAC3B,OAAQ,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC/D,CAAC,EACD,MACF,CAGF,CACE,IAAM,EAAiB,KAAK,IAC1B,IACC,EAA2B,aAAe,GAAK,GAClD,EAEM,EAAU,EAAmB,QAAQ,CAAY,EAEjD,EAAc,EAClB,EAAQ,GACR,EAAQ,MAAM,CAAC,EACf,CAAE,IAAK,EAAK,IAAK,SAAU,OAAQ,MAAO,EAAO,MAAO,KAAI,EAC5D,CACF,EAEM,EAAc,MAAM,EAAgB,EAAK,IAAK,EAA2B,yBAA2B,CAAC,CAAC,EAExG,EAA6B,EAAa,SAE1C,EAAY,SAAW,EAEhB,EAAY,YAAc,EACnC,EAAe,EAAa,oBACnB,EAAY,aAAe,EAA2B,iBAAmB,KAClF,EAAe,EAAa,sBACnB,EAAY,OAAO,OAAS,GAAqB,EAAY,OAAO,OAAS,EACtF,EAAe,EAAa,2BACnB,EAAY,QAAU,EAA2B,yBAAyB,QAAU,KAC7F,EAAe,EAAa,oCAR5B,EAAe,EAAa,cAW9B,EAAoB,CAClB,WAAY,QACZ,eACA,WAAY,EAAY,QAAU,IAAA,GAClC,MAAO,EAAO,MACd,OAAQ,EAAY,OAAO,MAAM,EAAG,CAAiB,GAAK,IAAA,GAC1D,OAAQ,EAAY,OAAO,MAAM,EAAG,CAAiB,GAAK,IAAA,GAC1D,YAAa,EAAY,YACzB,YAAa,EAAY,YACzB,YAAa,EAAY,OAAS,EAAI,EAAc,IAAA,EACtD,CAAC,CACH,CACF"}
1
+ {"version":3,"file":"stdio.js","names":[],"sources":["../../src/presets/stdio.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { compareStdoutAsSpaceSeparatedTokens } from '../helpers/compareStdoutAsSpaceSeparatedTokens.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { isSafeSubmissionOutputPath, readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { makeAccessibleToSandboxUser } from '../helpers/sandboxUser.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst DEBUG_DEFAULT_TIMEOUT_SECONDS = 10;\n\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nconst debugParamsSchema = judgeParamsSchema.extend({\n stdin: z.string().optional(),\n});\n\n/**\n * A preset judge function using stdin and stdout as test cases.\n *\n * A standard stdio problem must NOT commit a `judge.ts` that only calls this preset: the Exercode\n * server applies this preset automatically when `judge.ts` is absent, and committed copies would\n * drift from the server's defaults.\n *\n * @example\n * Run in a problem directory without `judge.ts`:\n * ```bash\n * bun x exercode judge model_answers/java\n * ```\n *\n * Run with the optional parameters:\n * ```bash\n * bun x exercode judge model_answers/java '{ \"language\": \"javascript\" }'\n * ```\n */\nexport async function stdioJudgePreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n // The sandboxed submission must read its sources and write build/run outputs in its directory.\n makeAccessibleToSandboxUser(args.cwd);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const staticAnalysisTestCaseResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisTestCaseResult) {\n printTestCaseResult({ testCaseId: testCases[0]?.id ?? 'prebuild', ...staticAnalysisTestCaseResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n }\n\n for (const testCase of testCases) {\n // prepare test case\n if (testCases.shared?.fileInputPath) await copyTestCaseFileInput(testCases.shared.fileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n // run\n const timeoutSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: testCase.input, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n // calculate decision\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n } else if (!compareStdoutAsSpaceSeparatedTokens(spawnResult.stdout, testCase.output ?? '')) {\n decisionCode = DecisionCode.WRONG_ANSWER;\n } else if (testCase.fileOutputPath) {\n const dirents = await fs.promises.readdir(testCase.fileOutputPath, { withFileTypes: true, recursive: true });\n for (const dirent of dirents) {\n if (!dirent.isFile()) continue;\n const direntRelativePath = path.relative(testCase.fileOutputPath, dirent.parentPath);\n const expected = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name));\n try {\n const receivedPath = path.join(args.cwd, direntRelativePath, dirent.name);\n // A submission-planted symlink to the expected file itself would otherwise compare equal.\n if (!(await isSafeSubmissionOutputPath(args.cwd, receivedPath))) throw new Error('unsafe output path');\n const received = await fs.promises.readFile(receivedPath);\n if (received.compare(expected) !== 0) decisionCode = DecisionCode.WRONG_ANSWER;\n } catch (error) {\n console.error(error);\n decisionCode = DecisionCode.WRONG_ANSWER;\n }\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: testCase.input,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n // clean up\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n}\n\n/**\n * A preset debug function using stdin and stdout as test cases.\n *\n * A standard stdio problem must NOT commit a `debug.ts` that only calls this preset: the Exercode\n * server applies this preset automatically when `debug.ts` is absent, and committed copies would\n * drift from the server's defaults.\n *\n * @example\n * Run in a problem directory without `debug.ts`:\n * ```bash\n * bun x exercode debug model_answers/java '{ \"stdin\": \"1 2\" }'\n * ```\n */\nexport async function stdioDebugPreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = debugParamsSchema.parse(args.params);\n\n // The sandboxed submission must read its sources and write build/run outputs in its directory.\n makeAccessibleToSandboxUser(args.cwd);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n {\n const timeoutSeconds = Math.max(\n DEBUG_DEFAULT_TIMEOUT_SECONDS,\n (problemMarkdownFrontMatter.timeLimitMs ?? 0) / 1000\n );\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: params.stdin, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n }\n\n printTestCaseResult({\n testCaseId: 'debug',\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: params.stdin,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- "use strict";const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/removeCommentsInSourceCode.cjs"),n=require("../helpers/safeFs.cjs");let r=require("node:fs");r=e.__toESM(r,1);let i=require("node:path");i=e.__toESM(i,1);const a={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},o={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/},{open:/`/,close:/(?<!\\)(?:\\{2})*`/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},s={c:{fileExtensions:[`.c`],buildCommand:e=>[`gcc`,`--std=c17`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:a},cpp:{fileExtensions:[`.cpp`],buildCommand:e=>[`g++`,`--std=c++20`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:a},csharp:{fileExtensions:[`.cs`],prebuild:async e=>{await n.writeFileWithoutFollowingSymlinks(i.default.join(e,`Main.csproj`),`<Project Sdk="Microsoft.NET.Sdk">
1
+ "use strict";const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/removeCommentsInSourceCode.cjs"),n=require("../helpers/safeFs.cjs");let r=require("node:path");r=e.__toESM(r,1);let i=require("node:fs");i=e.__toESM(i,1);const a={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},o={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/},{open:/`/,close:/(?<!\\)(?:\\{2})*`/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},s={c:{fileExtensions:[`.c`],buildCommand:e=>[`gcc`,`--std=c17`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:a},cpp:{fileExtensions:[`.cpp`],buildCommand:e=>[`g++`,`--std=c++20`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:a},csharp:{fileExtensions:[`.cs`],prebuild:async e=>{await n.writeFileWithoutFollowingSymlinks(r.default.join(e,`Main.csproj`),`<Project Sdk="Microsoft.NET.Sdk">
2
2
  <PropertyGroup>
3
3
  <OutputType>Exe</OutputType>
4
4
  <TargetFramework>net8.0</TargetFramework>
@@ -7,5 +7,5 @@
7
7
  <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
8
8
  <AssemblyName>Main</AssemblyName>
9
9
  </PropertyGroup>
10
- </Project>`)},buildCommand:()=>[`dotnet`,`build`,`Main.csproj`,`--configuration`,`Release`,`--verbosity`,`quiet`],command:()=>[`dotnet`,`bin/Release/net8.0/Main.dll`],grammer:a},css:{fileExtensions:[`.css`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//}]}},dart:{fileExtensions:[`.dart`],buildCommand:e=>[`dart`,`compile`,`exe`,e,`-o`,`main`],command:()=>[`./main`],grammer:a},java:{fileExtensions:[`.java`],prebuild:async e=>{let n=/\bpublic\s+class\s+(\w+)\b/;for(let o of await r.default.promises.readdir(e,{withFileTypes:!0})){if(!o.isFile()||!o.name.endsWith(`.java`))continue;let s=await r.default.promises.readFile(i.default.join(e,o.name),`utf8`),[,c]=n.exec(t.removeCommentsInSourceCode(a,s))??[];c&&await r.default.promises.rename(i.default.join(e,o.name),i.default.join(e,`${c}.java`))}},buildCommand:e=>[`javac`,e],command:e=>[`java`,`-Xmx1024m`,e.replace(/\.java$/,``)],grammer:a},javascript:{fileExtensions:[`.js`,`.cjs`,`.mjs`],command:e=>[`bun`,e],grammer:o},jsp:{fileExtensions:[`.jsp`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/},{open:/\n?[ \t]*<%--/,close:/--%>/},{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]}},haskell:{fileExtensions:[`.hs`],buildCommand:e=>[`ghc`,`-o`,`main`,e],command:()=>[`./main`],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\{-/,close:/-\}/},{open:/\n?[ \t]*--/}]}},html:{fileExtensions:[`.html`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/}]}},php:{fileExtensions:[`.php`],command:e=>[`php`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//},{open:/\n?[ \t]*#/}]}},python:{fileExtensions:[`.py`],command:e=>[`python3`,e],grammer:{strings:[{open:/'''/,close:/(?<!\\)(?:\\{2})*'''/},{open:/"""/,close:/(?<!\\)(?:\\{2})*"""/},{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*'''/,close:/'''/},{open:/\n?[ \t]*"""/,close:/"""/},{open:/\n?[ \t]*#/}]}},ruby:{fileExtensions:[`.rb`],buildCommand:e=>[`ruby`,`-c`,e],command:e=>[`ruby`,`--jit`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*=begin/,close:/=end/},{open:/\n?[ \t]*#/}]}},rust:{fileExtensions:[`.rs`],buildCommand:e=>[`rustc`,e,`-o`,`main`],command:()=>[`./main`],grammer:a},zig:{fileExtensions:[`.zig`],buildCommand:e=>[`zig`,`build-exe`,e],command:e=>[`./`+e.replace(/\.zig$/,``)],grammer:a},typescript:{fileExtensions:[`.ts`,`.cts`,`.mts`],command:e=>[`bun`,e],grammer:o},text:{fileExtensions:[`.txt`],command:e=>[`cat`,e]}};exports.languageIdToDefinition=s;
10
+ </Project>`)},buildCommand:()=>[`dotnet`,`build`,`Main.csproj`,`--configuration`,`Release`,`--verbosity`,`quiet`],command:()=>[`dotnet`,`bin/Release/net8.0/Main.dll`],grammer:a},css:{fileExtensions:[`.css`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//}]}},dart:{fileExtensions:[`.dart`],buildCommand:e=>[`dart`,`compile`,`exe`,e,`-o`,`main`],command:()=>[`./main`],grammer:a},java:{fileExtensions:[`.java`],prebuild:async e=>{let n=/\bpublic\s+class\s+(\w+)\b/;for(let o of await i.default.promises.readdir(e,{withFileTypes:!0})){if(!o.isFile()||!o.name.endsWith(`.java`))continue;let s=await i.default.promises.readFile(r.default.join(e,o.name),`utf8`),[,c]=n.exec(t.removeCommentsInSourceCode(a,s))??[];c&&await i.default.promises.rename(r.default.join(e,o.name),r.default.join(e,`${c}.java`))}},buildCommand:e=>[`javac`,e],command:e=>[`java`,`-Xmx1024m`,e.replace(/\.java$/,``)],grammer:a},kotlin:{fileExtensions:[`.kt`],buildCommand:e=>[`kotlinc`,e,`-include-runtime`,`-d`,`main.jar`],command:()=>[`java`,`-Xmx1024m`,`-jar`,`main.jar`],grammer:{strings:[{open:/"""/,close:/"""/,templateSyntax:`kotlin`},{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/,templateSyntax:`kotlin`}],comments:a.comments}},javascript:{fileExtensions:[`.js`,`.cjs`,`.mjs`],command:e=>[`bun`,e],grammer:o},jsp:{fileExtensions:[`.jsp`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/},{open:/\n?[ \t]*<%--/,close:/--%>/},{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]}},haskell:{fileExtensions:[`.hs`],buildCommand:e=>[`ghc`,`-o`,`main`,e],command:()=>[`./main`],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\{-/,close:/-\}/},{open:/\n?[ \t]*--/}]}},html:{fileExtensions:[`.html`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/}]}},php:{fileExtensions:[`.php`],command:e=>[`php`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//},{open:/\n?[ \t]*#/}]}},python:{fileExtensions:[`.py`],command:e=>[`python3`,e],grammer:{strings:[{open:/'''/,close:/(?<!\\)(?:\\{2})*'''/},{open:/"""/,close:/(?<!\\)(?:\\{2})*"""/},{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*'''/,close:/'''/},{open:/\n?[ \t]*"""/,close:/"""/},{open:/\n?[ \t]*#/}]}},ruby:{fileExtensions:[`.rb`],buildCommand:e=>[`ruby`,`-c`,e],command:e=>[`ruby`,`--jit`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*=begin/,close:/=end/},{open:/\n?[ \t]*#/}]}},rust:{fileExtensions:[`.rs`],buildCommand:e=>[`rustc`,e,`-o`,`main`],command:()=>[`./main`],grammer:a},zig:{fileExtensions:[`.zig`],buildCommand:e=>[`zig`,`build-exe`,e],command:e=>[`./`+e.replace(/\.zig$/,``)],grammer:a},typescript:{fileExtensions:[`.ts`,`.cts`,`.mts`],command:e=>[`bun`,e],grammer:o},text:{fileExtensions:[`.txt`],command:e=>[`cat`,e]}};exports.languageIdToDefinition=s;
11
11
  //# sourceMappingURL=language.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"language.cjs","names":["writeFileWithoutFollowingSymlinks","path","fs","removeCommentsInSourceCode"],"sources":["../../src/types/language.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { removeCommentsInSourceCode } from '../helpers/removeCommentsInSourceCode.js';\nimport { writeFileWithoutFollowingSymlinks } from '../helpers/safeFs.js';\n\nexport interface LanguageDefinition {\n /** File extensions to judge with this config. */\n fileExtensions: readonly string[];\n\n /** Function executed before the build. */\n prebuild?(cwd: string): Promise<void>;\n\n /** Returns the command to build a user program. */\n buildCommand?(filePath: string): [string, ...string[]];\n\n /** Returns the command to run a user program. */\n command(filePath: string): [string, ...string[]];\n\n /** Grammer definition for static analysis. */\n grammer?: {\n strings?: readonly { open: RegExp; close: RegExp }[];\n comments?: readonly { open: RegExp; close?: RegExp }[];\n };\n}\n\nconst cLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nconst javaScriptLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n { open: /`/, close: /(?<!\\\\)(?:\\\\{2})*`/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nexport const languageIdToDefinition: Readonly<Record<string, Readonly<LanguageDefinition>>> = {\n c: {\n fileExtensions: ['.c'],\n buildCommand: (filePath) => ['gcc', '--std=c17', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n cpp: {\n fileExtensions: ['.cpp'],\n buildCommand: (filePath) => ['g++', '--std=c++20', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n csharp: {\n fileExtensions: ['.cs'],\n prebuild: async (cwd) => {\n // No-follow write: the submission owns `cwd` and could point `Main.csproj` at a file only the\n // trusted harness user can write.\n await writeFileWithoutFollowingSymlinks(\n path.join(cwd, 'Main.csproj'),\n `<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>`\n );\n },\n buildCommand: () => ['dotnet', 'build', 'Main.csproj', '--configuration', 'Release', '--verbosity', 'quiet'],\n command: () => ['dotnet', 'bin/Release/net8.0/Main.dll'],\n grammer: cLikeGrammer,\n },\n\n css: {\n fileExtensions: ['.css'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }],\n },\n },\n\n dart: {\n fileExtensions: ['.dart'],\n buildCommand: (filePath) => ['dart', 'compile', 'exe', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n java: {\n fileExtensions: ['.java'],\n prebuild: async (cwd) => {\n const publicClassRegex = /\\bpublic\\s+class\\s+(\\w+)\\b/;\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile() || !dirent.name.endsWith('.java')) continue;\n const data = await fs.promises.readFile(path.join(cwd, dirent.name), 'utf8');\n const [, className] = publicClassRegex.exec(removeCommentsInSourceCode(cLikeGrammer, data)) ?? [];\n if (className) await fs.promises.rename(path.join(cwd, dirent.name), path.join(cwd, `${className}.java`));\n }\n },\n buildCommand: (fileName) => ['javac', fileName],\n // For example, Problem 7-3 in WillBooster's Java lecture uses at least 256MB.\n command: (fileName) => ['java', '-Xmx1024m', fileName.replace(/\\.java$/, '')],\n grammer: cLikeGrammer,\n },\n\n javascript: {\n fileExtensions: ['.js', '.cjs', '.mjs'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n jsp: {\n fileExtensions: ['.jsp'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*<!--/, close: /-->/ },\n { open: /\\n?[ \\t]*<%--/, close: /--%>/ },\n { open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// },\n { open: /\\n?[ \\t]*\\/\\// },\n ],\n },\n },\n\n haskell: {\n fileExtensions: ['.hs'],\n buildCommand: (filePath) => ['ghc', '-o', 'main', filePath],\n command: () => ['./main'],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\{-/, close: /-\\}/ }, { open: /\\n?[ \\t]*--/ }],\n },\n },\n\n html: {\n fileExtensions: ['.html'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*<!--/, close: /-->/ }],\n },\n },\n\n php: {\n fileExtensions: ['.php'],\n command: (fileName) => ['php', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n python: {\n fileExtensions: ['.py'],\n command: (fileName) => ['python3', fileName],\n grammer: {\n strings: [\n { open: /'''/, close: /(?<!\\\\)(?:\\\\{2})*'''/ },\n { open: /\"\"\"/, close: /(?<!\\\\)(?:\\\\{2})*\"\"\"/ },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*'''/, close: /'''/ },\n { open: /\\n?[ \\t]*\"\"\"/, close: /\"\"\"/ },\n { open: /\\n?[ \\t]*#/ },\n ],\n },\n },\n\n ruby: {\n fileExtensions: ['.rb'],\n buildCommand: (fileName) => ['ruby', '-c', fileName],\n command: (fileName) => ['ruby', '--jit', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*=begin/, close: /=end/ }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n rust: {\n fileExtensions: ['.rs'],\n buildCommand: (filePath) => ['rustc', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n zig: {\n fileExtensions: ['.zig'],\n buildCommand: (filePath) => ['zig', 'build-exe', filePath],\n command: (filePath) => ['./' + filePath.replace(/\\.zig$/, '')],\n grammer: cLikeGrammer,\n },\n\n typescript: {\n fileExtensions: ['.ts', '.cts', '.mts'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n text: {\n fileExtensions: ['.txt'],\n command: (fileName) => ['cat', fileName],\n },\n} as const;\n"],"mappings":"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"}
1
+ {"version":3,"file":"language.cjs","names":["writeFileWithoutFollowingSymlinks","path","fs","removeCommentsInSourceCode"],"sources":["../../src/types/language.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { removeCommentsInSourceCode } from '../helpers/removeCommentsInSourceCode.js';\nimport { writeFileWithoutFollowingSymlinks } from '../helpers/safeFs.js';\n\nexport interface LanguageDefinition {\n /** File extensions to judge with this config. */\n fileExtensions: readonly string[];\n\n /** Function executed before the build. */\n prebuild?(cwd: string): Promise<void>;\n\n /** Returns the command to build a user program. */\n buildCommand?(filePath: string): [string, ...string[]];\n\n /** Returns the command to run a user program. */\n command(filePath: string): [string, ...string[]];\n\n /** Grammer definition for static analysis. */\n grammer?: {\n strings?: readonly { open: RegExp; close: RegExp; templateSyntax?: 'kotlin' }[];\n comments?: readonly { open: RegExp; close?: RegExp }[];\n };\n}\n\nconst cLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nconst javaScriptLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n { open: /`/, close: /(?<!\\\\)(?:\\\\{2})*`/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nexport const languageIdToDefinition: Readonly<Record<string, Readonly<LanguageDefinition>>> = {\n c: {\n fileExtensions: ['.c'],\n buildCommand: (filePath) => ['gcc', '--std=c17', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n cpp: {\n fileExtensions: ['.cpp'],\n buildCommand: (filePath) => ['g++', '--std=c++20', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n csharp: {\n fileExtensions: ['.cs'],\n prebuild: async (cwd) => {\n // No-follow write: the submission owns `cwd` and could point `Main.csproj` at a file only the\n // trusted harness user can write.\n await writeFileWithoutFollowingSymlinks(\n path.join(cwd, 'Main.csproj'),\n `<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>`\n );\n },\n buildCommand: () => ['dotnet', 'build', 'Main.csproj', '--configuration', 'Release', '--verbosity', 'quiet'],\n command: () => ['dotnet', 'bin/Release/net8.0/Main.dll'],\n grammer: cLikeGrammer,\n },\n\n css: {\n fileExtensions: ['.css'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }],\n },\n },\n\n dart: {\n fileExtensions: ['.dart'],\n buildCommand: (filePath) => ['dart', 'compile', 'exe', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n java: {\n fileExtensions: ['.java'],\n prebuild: async (cwd) => {\n const publicClassRegex = /\\bpublic\\s+class\\s+(\\w+)\\b/;\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile() || !dirent.name.endsWith('.java')) continue;\n const data = await fs.promises.readFile(path.join(cwd, dirent.name), 'utf8');\n const [, className] = publicClassRegex.exec(removeCommentsInSourceCode(cLikeGrammer, data)) ?? [];\n if (className) await fs.promises.rename(path.join(cwd, dirent.name), path.join(cwd, `${className}.java`));\n }\n },\n buildCommand: (fileName) => ['javac', fileName],\n // For example, Problem 7-3 in WillBooster's Java lecture uses at least 256MB.\n command: (fileName) => ['java', '-Xmx1024m', fileName.replace(/\\.java$/, '')],\n grammer: cLikeGrammer,\n },\n\n kotlin: {\n fileExtensions: ['.kt'],\n buildCommand: (filePath) => ['kotlinc', filePath, '-include-runtime', '-d', 'main.jar'],\n command: () => ['java', '-Xmx1024m', '-jar', 'main.jar'],\n grammer: {\n strings: [\n { open: /\"\"\"/, close: /\"\"\"/, templateSyntax: 'kotlin' },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/, templateSyntax: 'kotlin' },\n ],\n comments: cLikeGrammer.comments,\n },\n },\n\n javascript: {\n fileExtensions: ['.js', '.cjs', '.mjs'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n jsp: {\n fileExtensions: ['.jsp'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*<!--/, close: /-->/ },\n { open: /\\n?[ \\t]*<%--/, close: /--%>/ },\n { open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// },\n { open: /\\n?[ \\t]*\\/\\// },\n ],\n },\n },\n\n haskell: {\n fileExtensions: ['.hs'],\n buildCommand: (filePath) => ['ghc', '-o', 'main', filePath],\n command: () => ['./main'],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\{-/, close: /-\\}/ }, { open: /\\n?[ \\t]*--/ }],\n },\n },\n\n html: {\n fileExtensions: ['.html'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*<!--/, close: /-->/ }],\n },\n },\n\n php: {\n fileExtensions: ['.php'],\n command: (fileName) => ['php', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n python: {\n fileExtensions: ['.py'],\n command: (fileName) => ['python3', fileName],\n grammer: {\n strings: [\n { open: /'''/, close: /(?<!\\\\)(?:\\\\{2})*'''/ },\n { open: /\"\"\"/, close: /(?<!\\\\)(?:\\\\{2})*\"\"\"/ },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*'''/, close: /'''/ },\n { open: /\\n?[ \\t]*\"\"\"/, close: /\"\"\"/ },\n { open: /\\n?[ \\t]*#/ },\n ],\n },\n },\n\n ruby: {\n fileExtensions: ['.rb'],\n buildCommand: (fileName) => ['ruby', '-c', fileName],\n command: (fileName) => ['ruby', '--jit', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*=begin/, close: /=end/ }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n rust: {\n fileExtensions: ['.rs'],\n buildCommand: (filePath) => ['rustc', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n zig: {\n fileExtensions: ['.zig'],\n buildCommand: (filePath) => ['zig', 'build-exe', filePath],\n command: (filePath) => ['./' + filePath.replace(/\\.zig$/, '')],\n grammer: cLikeGrammer,\n },\n\n typescript: {\n fileExtensions: ['.ts', '.cts', '.mts'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n text: {\n fileExtensions: ['.txt'],\n command: (fileName) => ['cat', fileName],\n },\n} as const;\n"],"mappings":"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"}
@@ -12,6 +12,7 @@ export interface LanguageDefinition {
12
12
  strings?: readonly {
13
13
  open: RegExp;
14
14
  close: RegExp;
15
+ templateSyntax?: 'kotlin';
15
16
  }[];
16
17
  comments?: readonly {
17
18
  open: RegExp;
@@ -1,4 +1,4 @@
1
- import{removeCommentsInSourceCode as e}from"../helpers/removeCommentsInSourceCode.js";import{writeFileWithoutFollowingSymlinks as t}from"../helpers/safeFs.js";import n from"node:fs";import r from"node:path";const i={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},a={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/},{open:/`/,close:/(?<!\\)(?:\\{2})*`/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},o={c:{fileExtensions:[`.c`],buildCommand:e=>[`gcc`,`--std=c17`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},cpp:{fileExtensions:[`.cpp`],buildCommand:e=>[`g++`,`--std=c++20`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},csharp:{fileExtensions:[`.cs`],prebuild:async e=>{await t(r.join(e,`Main.csproj`),`<Project Sdk="Microsoft.NET.Sdk">
1
+ import{removeCommentsInSourceCode as e}from"../helpers/removeCommentsInSourceCode.js";import{writeFileWithoutFollowingSymlinks as t}from"../helpers/safeFs.js";import n from"node:path";import r from"node:fs";const i={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},a={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/},{open:/`/,close:/(?<!\\)(?:\\{2})*`/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},o={c:{fileExtensions:[`.c`],buildCommand:e=>[`gcc`,`--std=c17`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},cpp:{fileExtensions:[`.cpp`],buildCommand:e=>[`g++`,`--std=c++20`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},csharp:{fileExtensions:[`.cs`],prebuild:async e=>{await t(n.join(e,`Main.csproj`),`<Project Sdk="Microsoft.NET.Sdk">
2
2
  <PropertyGroup>
3
3
  <OutputType>Exe</OutputType>
4
4
  <TargetFramework>net8.0</TargetFramework>
@@ -7,5 +7,5 @@ import{removeCommentsInSourceCode as e}from"../helpers/removeCommentsInSourceCod
7
7
  <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
8
8
  <AssemblyName>Main</AssemblyName>
9
9
  </PropertyGroup>
10
- </Project>`)},buildCommand:()=>[`dotnet`,`build`,`Main.csproj`,`--configuration`,`Release`,`--verbosity`,`quiet`],command:()=>[`dotnet`,`bin/Release/net8.0/Main.dll`],grammer:i},css:{fileExtensions:[`.css`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//}]}},dart:{fileExtensions:[`.dart`],buildCommand:e=>[`dart`,`compile`,`exe`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},java:{fileExtensions:[`.java`],prebuild:async t=>{let a=/\bpublic\s+class\s+(\w+)\b/;for(let o of await n.promises.readdir(t,{withFileTypes:!0})){if(!o.isFile()||!o.name.endsWith(`.java`))continue;let s=await n.promises.readFile(r.join(t,o.name),`utf8`),[,c]=a.exec(e(i,s))??[];c&&await n.promises.rename(r.join(t,o.name),r.join(t,`${c}.java`))}},buildCommand:e=>[`javac`,e],command:e=>[`java`,`-Xmx1024m`,e.replace(/\.java$/,``)],grammer:i},javascript:{fileExtensions:[`.js`,`.cjs`,`.mjs`],command:e=>[`bun`,e],grammer:a},jsp:{fileExtensions:[`.jsp`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/},{open:/\n?[ \t]*<%--/,close:/--%>/},{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]}},haskell:{fileExtensions:[`.hs`],buildCommand:e=>[`ghc`,`-o`,`main`,e],command:()=>[`./main`],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\{-/,close:/-\}/},{open:/\n?[ \t]*--/}]}},html:{fileExtensions:[`.html`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/}]}},php:{fileExtensions:[`.php`],command:e=>[`php`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//},{open:/\n?[ \t]*#/}]}},python:{fileExtensions:[`.py`],command:e=>[`python3`,e],grammer:{strings:[{open:/'''/,close:/(?<!\\)(?:\\{2})*'''/},{open:/"""/,close:/(?<!\\)(?:\\{2})*"""/},{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*'''/,close:/'''/},{open:/\n?[ \t]*"""/,close:/"""/},{open:/\n?[ \t]*#/}]}},ruby:{fileExtensions:[`.rb`],buildCommand:e=>[`ruby`,`-c`,e],command:e=>[`ruby`,`--jit`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*=begin/,close:/=end/},{open:/\n?[ \t]*#/}]}},rust:{fileExtensions:[`.rs`],buildCommand:e=>[`rustc`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},zig:{fileExtensions:[`.zig`],buildCommand:e=>[`zig`,`build-exe`,e],command:e=>[`./`+e.replace(/\.zig$/,``)],grammer:i},typescript:{fileExtensions:[`.ts`,`.cts`,`.mts`],command:e=>[`bun`,e],grammer:a},text:{fileExtensions:[`.txt`],command:e=>[`cat`,e]}};export{o as languageIdToDefinition};
10
+ </Project>`)},buildCommand:()=>[`dotnet`,`build`,`Main.csproj`,`--configuration`,`Release`,`--verbosity`,`quiet`],command:()=>[`dotnet`,`bin/Release/net8.0/Main.dll`],grammer:i},css:{fileExtensions:[`.css`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//}]}},dart:{fileExtensions:[`.dart`],buildCommand:e=>[`dart`,`compile`,`exe`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},java:{fileExtensions:[`.java`],prebuild:async t=>{let a=/\bpublic\s+class\s+(\w+)\b/;for(let o of await r.promises.readdir(t,{withFileTypes:!0})){if(!o.isFile()||!o.name.endsWith(`.java`))continue;let s=await r.promises.readFile(n.join(t,o.name),`utf8`),[,c]=a.exec(e(i,s))??[];c&&await r.promises.rename(n.join(t,o.name),n.join(t,`${c}.java`))}},buildCommand:e=>[`javac`,e],command:e=>[`java`,`-Xmx1024m`,e.replace(/\.java$/,``)],grammer:i},kotlin:{fileExtensions:[`.kt`],buildCommand:e=>[`kotlinc`,e,`-include-runtime`,`-d`,`main.jar`],command:()=>[`java`,`-Xmx1024m`,`-jar`,`main.jar`],grammer:{strings:[{open:/"""/,close:/"""/,templateSyntax:`kotlin`},{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/,templateSyntax:`kotlin`}],comments:i.comments}},javascript:{fileExtensions:[`.js`,`.cjs`,`.mjs`],command:e=>[`bun`,e],grammer:a},jsp:{fileExtensions:[`.jsp`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/},{open:/\n?[ \t]*<%--/,close:/--%>/},{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]}},haskell:{fileExtensions:[`.hs`],buildCommand:e=>[`ghc`,`-o`,`main`,e],command:()=>[`./main`],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\{-/,close:/-\}/},{open:/\n?[ \t]*--/}]}},html:{fileExtensions:[`.html`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/}]}},php:{fileExtensions:[`.php`],command:e=>[`php`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//},{open:/\n?[ \t]*#/}]}},python:{fileExtensions:[`.py`],command:e=>[`python3`,e],grammer:{strings:[{open:/'''/,close:/(?<!\\)(?:\\{2})*'''/},{open:/"""/,close:/(?<!\\)(?:\\{2})*"""/},{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*'''/,close:/'''/},{open:/\n?[ \t]*"""/,close:/"""/},{open:/\n?[ \t]*#/}]}},ruby:{fileExtensions:[`.rb`],buildCommand:e=>[`ruby`,`-c`,e],command:e=>[`ruby`,`--jit`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*=begin/,close:/=end/},{open:/\n?[ \t]*#/}]}},rust:{fileExtensions:[`.rs`],buildCommand:e=>[`rustc`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},zig:{fileExtensions:[`.zig`],buildCommand:e=>[`zig`,`build-exe`,e],command:e=>[`./`+e.replace(/\.zig$/,``)],grammer:i},typescript:{fileExtensions:[`.ts`,`.cts`,`.mts`],command:e=>[`bun`,e],grammer:a},text:{fileExtensions:[`.txt`],command:e=>[`cat`,e]}};export{o as languageIdToDefinition};
11
11
  //# sourceMappingURL=language.js.map