@exercode/problem-utils 1.9.6 → 1.10.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 (38) hide show
  1. package/dist/helpers/findModelAnswerDirs.cjs +2 -0
  2. package/dist/helpers/findModelAnswerDirs.cjs.map +1 -0
  3. package/dist/helpers/findModelAnswerDirs.d.ts +5 -0
  4. package/dist/helpers/findModelAnswerDirs.js +2 -0
  5. package/dist/helpers/findModelAnswerDirs.js.map +1 -0
  6. package/dist/helpers/parseArgs.cjs +1 -1
  7. package/dist/helpers/parseArgs.cjs.map +1 -1
  8. package/dist/helpers/parseArgs.d.ts +4 -1
  9. package/dist/helpers/parseArgs.js +1 -1
  10. package/dist/helpers/parseArgs.js.map +1 -1
  11. package/dist/helpers/printDebugBanner.cjs +2 -0
  12. package/dist/helpers/printDebugBanner.cjs.map +1 -0
  13. package/dist/helpers/printDebugBanner.d.ts +7 -0
  14. package/dist/helpers/printDebugBanner.js +2 -0
  15. package/dist/helpers/printDebugBanner.js.map +1 -0
  16. package/dist/helpers/resolveCwds.cjs +2 -0
  17. package/dist/helpers/resolveCwds.cjs.map +1 -0
  18. package/dist/helpers/resolveCwds.d.ts +19 -0
  19. package/dist/helpers/resolveCwds.js +2 -0
  20. package/dist/helpers/resolveCwds.js.map +1 -0
  21. package/dist/presets/command.cjs +1 -1
  22. package/dist/presets/command.cjs.map +1 -1
  23. package/dist/presets/command.d.ts +6 -0
  24. package/dist/presets/command.js +1 -1
  25. package/dist/presets/command.js.map +1 -1
  26. package/dist/presets/guiCommand.cjs +1 -1
  27. package/dist/presets/guiCommand.cjs.map +1 -1
  28. package/dist/presets/guiCommand.js +1 -1
  29. package/dist/presets/guiCommand.js.map +1 -1
  30. package/dist/presets/llm.cjs +1 -1
  31. package/dist/presets/llm.cjs.map +1 -1
  32. package/dist/presets/llm.js +1 -1
  33. package/dist/presets/llm.js.map +1 -1
  34. package/dist/presets/stdio.cjs +1 -1
  35. package/dist/presets/stdio.cjs.map +1 -1
  36. package/dist/presets/stdio.js +1 -1
  37. package/dist/presets/stdio.js.map +1 -1
  38. package/package.json +5 -5
@@ -0,0 +1,2 @@
1
+ "use strict";var r=require("../_virtual/_rollupPluginBabelHelpers.cjs"),e=require("node:fs/promises"),n=require("node:path");function t(){return(t=r.asyncToGenerator(r.regenerator().m(function t(i){var o,a,s;return r.regenerator().w(function(r){for(;;)switch(r.p=r.n){case 0:return o=n.join(i,"model_answers"),r.p=1,r.n=2,e.readdir(o,{withFileTypes:!0});case 2:a=r.v,r.n=5;break;case 3:if(r.p=3,"ENOENT"!==(s=r.v).code){r.n=4;break}return r.a(2,[]);case 4:throw s;case 5:return r.a(2,a.filter(function(r){return r.isDirectory()}).map(function(r){return n.join(o,r.name)}).toSorted())}},t,null,[[1,3]])}))).apply(this,arguments)}exports.findModelAnswerDirs=function(r){return t.apply(this,arguments)};
2
+ //# sourceMappingURL=findModelAnswerDirs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findModelAnswerDirs.cjs","sources":["../../src/helpers/findModelAnswerDirs.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst MODEL_ANSWERS_DIRNAME = 'model_answers';\n\n/**\n * Find model answer directories under `<problemDir>/model_answers/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findModelAnswerDirs(problemDir: string): Promise<string[]> {\n const modelAnswersDir = path.join(problemDir, MODEL_ANSWERS_DIRNAME);\n let entries;\n try {\n entries = await fs.readdir(modelAnswersDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw error;\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(modelAnswersDir, entry.name))\n .toSorted();\n}\n"],"names":["_findModelAnswerDirs","_asyncToGenerator","_regenerator","m","_callee","problemDir","modelAnswersDir","entries","_t","w","_context","p","n","path","join","fs","readdir","withFileTypes","v","code","a","filter","entry","isDirectory","map","name","toSorted","apply","this","arguments","_x"],"mappings":"6HAsBC,SAAAA,IAAA,OAAAA,EAAAC,EAAAA,iBAAAC,EAAAA,cAAAC,EAbM,SAAAC,EAAmCC,GAAkB,IAAAC,EAAAC,EAAAC,EAAA,OAAAN,gBAAAO,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EACU,OAA9DN,EAAkBO,EAAKC,KAAKT,EAPN,iBAOwCK,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAGlDG,EAAGC,QAAQV,EAAiB,CAAEW,eAAe,IAAO,KAAA,EAApEV,EAAOG,EAAAQ,EAAAR,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAA,GAAAF,EAAAC,EAAA,EAEuC,YAFvCH,EAAAE,EAAAQ,GAE8BC,KAAiB,CAAAT,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAU,EAAA,EAAS,IAAE,KAAA,EAAA,MAAAZ,EAAA,KAAA,EAAA,OAAAE,EAAAU,EAAA,EAG5Db,EACJc,OAAO,SAACC,GAAK,OAAKA,EAAMC,aAAa,GACrCC,IAAI,SAACF,GAAK,OAAKT,EAAKC,KAAKR,EAAiBgB,EAAMG,KAAK,GACrDC,YAAU,EAAAtB,EAAA,KAAA,CAAA,CAAA,EAAA,IAAA,KACduB,MAAAC,KAAAC,UAAA,6BAbD,SAAyCC,GAAA,OAAA9B,EAAA2B,MAAAC,KAAAC,UAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Find model answer directories under `<problemDir>/model_answers/`.
3
+ * Returns absolute paths sorted lexicographically.
4
+ */
5
+ export declare function findModelAnswerDirs(problemDir: string): Promise<string[]>;
@@ -0,0 +1,2 @@
1
+ import{asyncToGenerator as r,regenerator as e}from"../_virtual/_rollupPluginBabelHelpers.js";import n from"node:fs/promises";import t from"node:path";function o(r){return a.apply(this,arguments)}function a(){return(a=r(e().m(function r(o){var a,i,s;return e().w(function(r){for(;;)switch(r.p=r.n){case 0:return a=t.join(o,"model_answers"),r.p=1,r.n=2,n.readdir(a,{withFileTypes:!0});case 2:i=r.v,r.n=5;break;case 3:if(r.p=3,"ENOENT"!==(s=r.v).code){r.n=4;break}return r.a(2,[]);case 4:throw s;case 5:return r.a(2,i.filter(function(r){return r.isDirectory()}).map(function(r){return t.join(a,r.name)}).toSorted())}},r,null,[[1,3]])}))).apply(this,arguments)}export{o as findModelAnswerDirs};
2
+ //# sourceMappingURL=findModelAnswerDirs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findModelAnswerDirs.js","sources":["../../src/helpers/findModelAnswerDirs.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst MODEL_ANSWERS_DIRNAME = 'model_answers';\n\n/**\n * Find model answer directories under `<problemDir>/model_answers/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findModelAnswerDirs(problemDir: string): Promise<string[]> {\n const modelAnswersDir = path.join(problemDir, MODEL_ANSWERS_DIRNAME);\n let entries;\n try {\n entries = await fs.readdir(modelAnswersDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw error;\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(modelAnswersDir, entry.name))\n .toSorted();\n}\n"],"names":["findModelAnswerDirs","_x","_findModelAnswerDirs","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","modelAnswersDir","entries","_t","w","_context","p","n","path","join","fs","readdir","withFileTypes","v","code","a","filter","entry","isDirectory","map","name","toSorted"],"mappings":"sJASA,SAAsBA,EAAmBC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAaxC,SAAAH,IAAA,OAAAA,EAAAI,EAAAC,IAAAC,EAbM,SAAAC,EAAmCC,GAAkB,IAAAC,EAAAC,EAAAC,EAAA,OAAAN,IAAAO,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EACU,OAA9DN,EAAkBO,EAAKC,KAAKT,EAPN,iBAOwCK,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAGlDG,EAAGC,QAAQV,EAAiB,CAAEW,eAAe,IAAO,KAAA,EAApEV,EAAOG,EAAAQ,EAAAR,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAA,GAAAF,EAAAC,EAAA,EAEuC,YAFvCH,EAAAE,EAAAQ,GAE8BC,KAAiB,CAAAT,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAU,EAAA,EAAS,IAAE,KAAA,EAAA,MAAAZ,EAAA,KAAA,EAAA,OAAAE,EAAAU,EAAA,EAG5Db,EACJc,OAAO,SAACC,GAAK,OAAKA,EAAMC,aAAa,GACrCC,IAAI,SAACF,GAAK,OAAKT,EAAKC,KAAKR,EAAiBgB,EAAMG,KAAK,GACrDC,YAAU,EAAAtB,EAAA,KAAA,CAAA,CAAA,EAAA,IAAA,KACdN,MAAAC,KAAAC,UAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";exports.parseArgs=function(r){var a=r[2];if(!a)throw new Error("cwd argument required");var e=r[3];try{return{cwd:a,params:e?JSON.parse(e):{}}}catch(r){throw new Error("bad params argument",{cause:r})}};
1
+ "use strict";exports.parseArgs=function(r){var a=r[2]||void 0,s=r[3];try{return{cwd:a,params:s?JSON.parse(s):{}}}catch(r){throw new Error("bad params argument",{cause:r})}};
2
2
  //# sourceMappingURL=parseArgs.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseArgs.cjs","sources":["../../src/helpers/parseArgs.ts"],"sourcesContent":["/**\n * Parse command line arguments in `judge.ts` or `debug.ts`.\n */\nexport function parseArgs(argv: readonly string[]): { cwd: string; params: unknown } {\n const cwd = argv[2];\n if (!cwd) throw new Error('cwd argument required');\n\n const paramsJson = argv[3];\n\n try {\n return { cwd, params: paramsJson ? JSON.parse(paramsJson) : {} };\n } catch (error) {\n throw new Error('bad params argument', { cause: error });\n }\n}\n"],"names":["argv","cwd","Error","paramsJson","params","JSON","parse","error","cause"],"mappings":"+BAGO,SAAmBA,GACxB,IAAMC,EAAMD,EAAK,GACjB,IAAKC,EAAK,MAAM,IAAIC,MAAM,yBAE1B,IAAMC,EAAaH,EAAK,GAExB,IACE,MAAO,CAAEC,IAAAA,EAAKG,OAAQD,EAAaE,KAAKC,MAAMH,GAAc,CAAA,EAC9D,CAAE,MAAOI,GACP,MAAM,IAAIL,MAAM,sBAAuB,CAAEM,MAAOD,GAClD,CACF"}
1
+ {"version":3,"file":"parseArgs.cjs","sources":["../../src/helpers/parseArgs.ts"],"sourcesContent":["/**\n * Parse command line arguments in `judge.ts` or `debug.ts`.\n *\n * `cwd` is optional: when omitted, presets that support it may fall back to\n * judging against model answers under `<problemDir>/model_answers/*`.\n */\nexport function parseArgs(argv: readonly string[]): { cwd: string | undefined; params: unknown } {\n const cwd = argv[2] || undefined;\n const paramsJson = argv[3];\n\n try {\n return { cwd, params: paramsJson ? JSON.parse(paramsJson) : {} };\n } catch (error) {\n throw new Error('bad params argument', { cause: error });\n }\n}\n"],"names":["argv","cwd","undefined","paramsJson","params","JSON","parse","error","Error","cause"],"mappings":"+BAMO,SAAmBA,GACxB,IAAMC,EAAMD,EAAK,SAAME,EACjBC,EAAaH,EAAK,GAExB,IACE,MAAO,CAAEC,IAAAA,EAAKG,OAAQD,EAAaE,KAAKC,MAAMH,GAAc,CAAA,EAC9D,CAAE,MAAOI,GACP,MAAM,IAAIC,MAAM,sBAAuB,CAAEC,MAAOF,GAClD,CACF"}
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * Parse command line arguments in `judge.ts` or `debug.ts`.
3
+ *
4
+ * `cwd` is optional: when omitted, presets that support it may fall back to
5
+ * judging against model answers under `<problemDir>/model_answers/*`.
3
6
  */
4
7
  export declare function parseArgs(argv: readonly string[]): {
5
- cwd: string;
8
+ cwd: string | undefined;
6
9
  params: unknown;
7
10
  };
@@ -1,2 +1,2 @@
1
- function r(r){var a=r[2];if(!a)throw new Error("cwd argument required");var e=r[3];try{return{cwd:a,params:e?JSON.parse(e):{}}}catch(r){throw new Error("bad params argument",{cause:r})}}export{r as parseArgs};
1
+ function r(r){var a=r[2]||void 0,t=r[3];try{return{cwd:a,params:t?JSON.parse(t):{}}}catch(r){throw new Error("bad params argument",{cause:r})}}export{r as parseArgs};
2
2
  //# sourceMappingURL=parseArgs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseArgs.js","sources":["../../src/helpers/parseArgs.ts"],"sourcesContent":["/**\n * Parse command line arguments in `judge.ts` or `debug.ts`.\n */\nexport function parseArgs(argv: readonly string[]): { cwd: string; params: unknown } {\n const cwd = argv[2];\n if (!cwd) throw new Error('cwd argument required');\n\n const paramsJson = argv[3];\n\n try {\n return { cwd, params: paramsJson ? JSON.parse(paramsJson) : {} };\n } catch (error) {\n throw new Error('bad params argument', { cause: error });\n }\n}\n"],"names":["parseArgs","argv","cwd","Error","paramsJson","params","JSON","parse","error","cause"],"mappings":"AAGO,SAASA,EAAUC,GACxB,IAAMC,EAAMD,EAAK,GACjB,IAAKC,EAAK,MAAM,IAAIC,MAAM,yBAE1B,IAAMC,EAAaH,EAAK,GAExB,IACE,MAAO,CAAEC,IAAAA,EAAKG,OAAQD,EAAaE,KAAKC,MAAMH,GAAc,CAAA,EAC9D,CAAE,MAAOI,GACP,MAAM,IAAIL,MAAM,sBAAuB,CAAEM,MAAOD,GAClD,CACF"}
1
+ {"version":3,"file":"parseArgs.js","sources":["../../src/helpers/parseArgs.ts"],"sourcesContent":["/**\n * Parse command line arguments in `judge.ts` or `debug.ts`.\n *\n * `cwd` is optional: when omitted, presets that support it may fall back to\n * judging against model answers under `<problemDir>/model_answers/*`.\n */\nexport function parseArgs(argv: readonly string[]): { cwd: string | undefined; params: unknown } {\n const cwd = argv[2] || undefined;\n const paramsJson = argv[3];\n\n try {\n return { cwd, params: paramsJson ? JSON.parse(paramsJson) : {} };\n } catch (error) {\n throw new Error('bad params argument', { cause: error });\n }\n}\n"],"names":["parseArgs","argv","cwd","undefined","paramsJson","params","JSON","parse","error","Error","cause"],"mappings":"AAMO,SAASA,EAAUC,GACxB,IAAMC,EAAMD,EAAK,SAAME,EACjBC,EAAaH,EAAK,GAExB,IACE,MAAO,CAAEC,IAAAA,EAAKG,OAAQD,EAAaE,KAAKC,MAAMH,GAAc,CAAA,EAC9D,CAAE,MAAOI,GACP,MAAM,IAAIC,MAAM,sBAAuB,CAAEC,MAAOF,GAClD,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";var n="=".repeat(72);exports.printDebugBanner=function(c){var r=c.map(function(n){return" ".concat(n)}).join("\n");console.error("\n".concat(n,"\n").concat(r,"\n").concat(n))};
2
+ //# sourceMappingURL=printDebugBanner.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printDebugBanner.cjs","sources":["../../src/helpers/printDebugBanner.ts"],"sourcesContent":["const BANNER_LINE = '='.repeat(72);\n\n/**\n * Print a prominent, multi-line banner to stderr so that debug-mode runs\n * (e.g., judging against model answers without an explicit cwd) are obvious.\n *\n * Written to stderr to avoid interfering with `printTestCaseResult` output on stdout.\n */\nexport function printDebugBanner(lines: readonly string[]): void {\n const body = lines.map((line) => ` ${line}`).join('\\n');\n console.error(`\\n${BANNER_LINE}\\n${body}\\n${BANNER_LINE}`);\n}\n"],"names":["BANNER_LINE","repeat","lines","body","map","line","concat","join","console","error"],"mappings":"aAAA,IAAMA,EAAc,IAAIC,OAAO,6BAQxB,SAA0BC,GAC/B,IAAMC,EAAOD,EAAME,IAAI,SAACC,GAAI,MAAA,KAAAC,OAAUD,EAAI,GAAIE,KAAK,MACnDC,QAAQC,MAAK,KAAAH,OAAMN,EAAW,MAAAM,OAAKH,EAAI,MAAAG,OAAKN,GAC9C"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Print a prominent, multi-line banner to stderr so that debug-mode runs
3
+ * (e.g., judging against model answers without an explicit cwd) are obvious.
4
+ *
5
+ * Written to stderr to avoid interfering with `printTestCaseResult` output on stdout.
6
+ */
7
+ export declare function printDebugBanner(lines: readonly string[]): void;
@@ -0,0 +1,2 @@
1
+ var n="=".repeat(72);function c(c){var o=c.map(function(n){return" ".concat(n)}).join("\n");console.error("\n".concat(n,"\n").concat(o,"\n").concat(n))}export{c as printDebugBanner};
2
+ //# sourceMappingURL=printDebugBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printDebugBanner.js","sources":["../../src/helpers/printDebugBanner.ts"],"sourcesContent":["const BANNER_LINE = '='.repeat(72);\n\n/**\n * Print a prominent, multi-line banner to stderr so that debug-mode runs\n * (e.g., judging against model answers without an explicit cwd) are obvious.\n *\n * Written to stderr to avoid interfering with `printTestCaseResult` output on stdout.\n */\nexport function printDebugBanner(lines: readonly string[]): void {\n const body = lines.map((line) => ` ${line}`).join('\\n');\n console.error(`\\n${BANNER_LINE}\\n${body}\\n${BANNER_LINE}`);\n}\n"],"names":["BANNER_LINE","repeat","printDebugBanner","lines","body","map","line","concat","join","console","error"],"mappings":"AAAA,IAAMA,EAAc,IAAIC,OAAO,IAQxB,SAASC,EAAiBC,GAC/B,IAAMC,EAAOD,EAAME,IAAI,SAACC,GAAI,MAAA,KAAAC,OAAUD,EAAI,GAAIE,KAAK,MACnDC,QAAQC,MAAK,KAAAH,OAAMP,EAAW,MAAAO,OAAKH,EAAI,MAAAG,OAAKP,GAC9C"}
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),n=require("node:path"),r=require("./findModelAnswerDirs.cjs"),a=require("./printDebugBanner.cjs");function t(){return(t=e.asyncToGenerator(e.regenerator().m(function t(s,c){var i,u,d,l;return e.regenerator().w(function(t){for(;;)switch(t.n){case 0:if(!c){t.n=1;break}return t.a(2,{cwds:[c],isDebugMode:!1});case 1:return t.n=2,r.findModelAnswerDirs(s);case 2:if(0!==(u=t.v).length){t.n=3;break}throw new Error("cwd argument required (no model answer directories found in ".concat(n.join(s,"model_answers"),")"));case 3:return d=o(),l=n.relative(s,null!=(i=u[0])?i:"")||"<model_answer>",a.printDebugBanner(["[DEBUG MODE] cwd not provided -- judging against all model answers","","Problem dir : ".concat(s),"Model answers (".concat(u.length,"):")].concat(e.toConsumableArray(u.map(function(e){return" - ".concat(n.relative(s,e))})),["","To judge a single cwd (e.g., a user submission), pass it as the first argument:"," bun ".concat(d," <cwd> [params-json]"),"For example:"," bun ".concat(d," ").concat(l)," bun ".concat(d," ").concat(l,' \'{"language":"python"}\'')])),t.a(2,{cwds:u,isDebugMode:!0})}},t)}))).apply(this,arguments)}function o(){var e=process.argv[1];return e?n.basename(e):"judge.ts"}exports.printDebugCwdBanner=function(e,r){var t=n.relative(e,r)||r,s=o();a.printDebugBanner(["[DEBUG MODE] judging: ".concat(t),"","To re-run only this cwd:"," bun ".concat(s," ").concat(t)])},exports.resolveCwds=function(e,n){return t.apply(this,arguments)};
2
+ //# sourceMappingURL=resolveCwds.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveCwds.cjs","sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { findModelAnswerDirs } from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport interface ResolvedCwds {\n cwds: readonly string[];\n isDebugMode: boolean;\n}\n\n/**\n * Resolve which working directories to judge.\n *\n * - If `cwdArg` is provided, use it as the single cwd.\n * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and judge each.\n * A prominent banner is printed so users can tell at a glance that this is a debug run.\n *\n * @throws if `cwdArg` is missing and no model answer directories are found.\n */\nexport async function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds> {\n if (cwdArg) return { cwds: [cwdArg], isDebugMode: false };\n\n const modelAnswerDirs = await findModelAnswerDirs(problemDir);\n if (modelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, 'model_answers')})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer = path.relative(problemDir, modelAnswerDirs[0] ?? '') || '<model_answer>';\n printDebugBanner([\n '[DEBUG MODE] cwd not provided -- judging against all model answers',\n '',\n `Problem dir : ${problemDir}`,\n `Model answers (${modelAnswerDirs.length}):`,\n ...modelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n '',\n 'To judge a single cwd (e.g., a user submission), pass it as the first argument:',\n ` bun ${scriptName} <cwd> [params-json]`,\n 'For example:',\n ` bun ${scriptName} ${exampleAnswer}`,\n ` bun ${scriptName} ${exampleAnswer} '{\"language\":\"python\"}'`,\n ]);\n\n return { cwds: modelAnswerDirs, isDebugMode: true };\n}\n\n/**\n * Print a per-cwd banner shown before judging each model answer in debug mode.\n * Includes the command for re-running this single cwd.\n */\nexport function printDebugCwdBanner(problemDir: string, cwd: string): void {\n const relativeCwd = path.relative(problemDir, cwd) || cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n '',\n 'To re-run only this cwd:',\n ` bun ${scriptName} ${relativeCwd}`,\n ]);\n}\n\nfunction getInvokedScriptName(): string {\n const scriptPath = process.argv[1];\n return scriptPath ? path.basename(scriptPath) : 'judge.ts';\n}\n"],"names":["_resolveCwds","_asyncToGenerator","_regenerator","m","_callee","problemDir","cwdArg","_modelAnswerDirs$","modelAnswerDirs","scriptName","exampleAnswer","w","_context","n","a","cwds","isDebugMode","findModelAnswerDirs","v","length","Error","concat","path","join","getInvokedScriptName","relative","printDebugBanner","_toConsumableArray","map","dir","apply","this","arguments","scriptPath","process","argv","basename","cwd","relativeCwd","_x","_x2"],"mappings":"0KAgDA,SAAAA,IAFC,OAEDA,EAAAC,EAAAA,iBAAAC,gBAAAC,EA7BO,SAAAC,EAA2BC,EAAoBC,GAA0B,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAR,gBAAAS,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,IAC1EP,EAAM,CAAAM,EAAAC,EAAA,EAAA,KAAA,CAAA,OAAAD,EAAAE,EAAA,EAAS,CAAEC,KAAM,CAACT,GAASU,aAAa,IAAO,KAAA,EAAA,OAAAJ,EAAAC,EAAA,EAE3BI,EAAAA,oBAAoBZ,GAAW,KAAA,EAAxC,GACU,KADzBG,EAAeI,EAAAM,GACDC,OAAY,CAAAP,EAAAC,EAAA,EAAA,KAAA,CAAA,MACxB,IAAIO,MAAK,+DAAAC,OACkDC,EAAKC,KAAKlB,EAAY,uBACtF,KAAA,EAiBA,OAdGI,EAAae,IACbd,EAAgBY,EAAKG,SAASpB,EAA8B,OAApBE,EAAEC,EAAgB,IAAED,EAAI,KAAO,iBAC7EmB,mBAAgB,CACd,qEACA,GAAE,iBAAAL,OACehB,GAAU,kBAAAgB,OACTb,EAAgBW,OAAM,OAAAE,OAAAM,EAAAA,kBACrCnB,EAAgBoB,IAAI,SAACC,GAAG,MAAA,OAAAR,OAAYC,EAAKG,SAASpB,EAAYwB,GAAI,IAAG,CACxE,GACA,kFAAiF,SAAAR,OACxEZ,EAAU,wBACnB,eAAc,SAAAY,OACLZ,EAAU,KAAAY,OAAIX,GAAa,SAAAW,OAC3BZ,EAAU,KAAAY,OAAIX,EAAa,iCACnCE,EAAAE,EAAA,EAEI,CAAEC,KAAMP,EAAiBQ,aAAa,IAAM,EAAAZ,EAAA,KACpD0B,MAAAC,KAAAC,UAAA,CAiBD,SAASR,IACP,IAAMS,EAAaC,QAAQC,KAAK,GAChC,OAAOF,EAAaX,EAAKc,SAASH,GAAc,UAClD,6BAdO,SAA6B5B,EAAoBgC,GACtD,IAAMC,EAAchB,EAAKG,SAASpB,EAAYgC,IAAQA,EAChD5B,EAAae,IACnBE,EAAAA,iBAAiB,CAAA,yBAAAL,OACUiB,GACzB,GACA,2BAA0B,SAAAjB,OACjBZ,EAAU,KAAAY,OAAIiB,IAE3B,sBA1CA,SAAiCC,EAAAC,GAAA,OAAAxC,EAAA8B,MAAAC,KAAAC,UAAA"}
@@ -0,0 +1,19 @@
1
+ export interface ResolvedCwds {
2
+ cwds: readonly string[];
3
+ isDebugMode: boolean;
4
+ }
5
+ /**
6
+ * Resolve which working directories to judge.
7
+ *
8
+ * - If `cwdArg` is provided, use it as the single cwd.
9
+ * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and judge each.
10
+ * A prominent banner is printed so users can tell at a glance that this is a debug run.
11
+ *
12
+ * @throws if `cwdArg` is missing and no model answer directories are found.
13
+ */
14
+ export declare function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds>;
15
+ /**
16
+ * Print a per-cwd banner shown before judging each model answer in debug mode.
17
+ * Includes the command for re-running this single cwd.
18
+ */
19
+ export declare function printDebugCwdBanner(problemDir: string, cwd: string): void;
@@ -0,0 +1,2 @@
1
+ import{asyncToGenerator as n,regenerator as r,toConsumableArray as e}from"../_virtual/_rollupPluginBabelHelpers.js";import a from"node:path";import{findModelAnswerDirs as o}from"./findModelAnswerDirs.js";import{printDebugBanner as t}from"./printDebugBanner.js";function c(n,r){return s.apply(this,arguments)}function s(){return(s=n(r().m(function n(c,s){var i,l,d,m;return r().w(function(n){for(;;)switch(n.n){case 0:if(!s){n.n=1;break}return n.a(2,{cwds:[s],isDebugMode:!1});case 1:return n.n=2,o(c);case 2:if(0!==(l=n.v).length){n.n=3;break}throw new Error("cwd argument required (no model answer directories found in ".concat(a.join(c,"model_answers"),")"));case 3:return d=u(),m=a.relative(c,null!=(i=l[0])?i:"")||"<model_answer>",t(["[DEBUG MODE] cwd not provided -- judging against all model answers","","Problem dir : ".concat(c),"Model answers (".concat(l.length,"):")].concat(e(l.map(function(n){return" - ".concat(a.relative(c,n))})),["","To judge a single cwd (e.g., a user submission), pass it as the first argument:"," bun ".concat(d," <cwd> [params-json]"),"For example:"," bun ".concat(d," ").concat(m)," bun ".concat(d," ").concat(m,' \'{"language":"python"}\'')])),n.a(2,{cwds:l,isDebugMode:!0})}},n)}))).apply(this,arguments)}function i(n,r){var e=a.relative(n,r)||r,o=u();t(["[DEBUG MODE] judging: ".concat(e),"","To re-run only this cwd:"," bun ".concat(o," ").concat(e)])}function u(){var n=process.argv[1];return n?a.basename(n):"judge.ts"}export{i as printDebugCwdBanner,c as resolveCwds};
2
+ //# sourceMappingURL=resolveCwds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveCwds.js","sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { findModelAnswerDirs } from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport interface ResolvedCwds {\n cwds: readonly string[];\n isDebugMode: boolean;\n}\n\n/**\n * Resolve which working directories to judge.\n *\n * - If `cwdArg` is provided, use it as the single cwd.\n * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and judge each.\n * A prominent banner is printed so users can tell at a glance that this is a debug run.\n *\n * @throws if `cwdArg` is missing and no model answer directories are found.\n */\nexport async function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds> {\n if (cwdArg) return { cwds: [cwdArg], isDebugMode: false };\n\n const modelAnswerDirs = await findModelAnswerDirs(problemDir);\n if (modelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, 'model_answers')})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer = path.relative(problemDir, modelAnswerDirs[0] ?? '') || '<model_answer>';\n printDebugBanner([\n '[DEBUG MODE] cwd not provided -- judging against all model answers',\n '',\n `Problem dir : ${problemDir}`,\n `Model answers (${modelAnswerDirs.length}):`,\n ...modelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n '',\n 'To judge a single cwd (e.g., a user submission), pass it as the first argument:',\n ` bun ${scriptName} <cwd> [params-json]`,\n 'For example:',\n ` bun ${scriptName} ${exampleAnswer}`,\n ` bun ${scriptName} ${exampleAnswer} '{\"language\":\"python\"}'`,\n ]);\n\n return { cwds: modelAnswerDirs, isDebugMode: true };\n}\n\n/**\n * Print a per-cwd banner shown before judging each model answer in debug mode.\n * Includes the command for re-running this single cwd.\n */\nexport function printDebugCwdBanner(problemDir: string, cwd: string): void {\n const relativeCwd = path.relative(problemDir, cwd) || cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n '',\n 'To re-run only this cwd:',\n ` bun ${scriptName} ${relativeCwd}`,\n ]);\n}\n\nfunction getInvokedScriptName(): string {\n const scriptPath = process.argv[1];\n return scriptPath ? path.basename(scriptPath) : 'judge.ts';\n}\n"],"names":["resolveCwds","_x","_x2","_resolveCwds","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","cwdArg","_modelAnswerDirs$","modelAnswerDirs","scriptName","exampleAnswer","w","_context","n","a","cwds","isDebugMode","findModelAnswerDirs","v","length","Error","concat","path","join","getInvokedScriptName","relative","printDebugBanner","_toConsumableArray","map","dir","printDebugCwdBanner","cwd","relativeCwd","scriptPath","process","argv","basename"],"mappings":"qQAmBA,SAAsBA,EAAWC,EAAAC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CA6BjC,SAAAH,IAFC,OAEDA,EAAAI,EAAAC,IAAAC,EA7BO,SAAAC,EAA2BC,EAAoBC,GAA0B,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAR,IAAAS,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,IAC1EP,EAAM,CAAAM,EAAAC,EAAA,EAAA,KAAA,CAAA,OAAAD,EAAAE,EAAA,EAAS,CAAEC,KAAM,CAACT,GAASU,aAAa,IAAO,KAAA,EAAA,OAAAJ,EAAAC,EAAA,EAE3BI,EAAoBZ,GAAW,KAAA,EAAxC,GACU,KADzBG,EAAeI,EAAAM,GACDC,OAAY,CAAAP,EAAAC,EAAA,EAAA,KAAA,CAAA,MACxB,IAAIO,MAAK,+DAAAC,OACkDC,EAAKC,KAAKlB,EAAY,uBACtF,KAAA,EAiBA,OAdGI,EAAae,IACbd,EAAgBY,EAAKG,SAASpB,EAA8B,OAApBE,EAAEC,EAAgB,IAAED,EAAI,KAAO,iBAC7EmB,EAAgB,CACd,qEACA,GAAE,iBAAAL,OACehB,GAAU,kBAAAgB,OACTb,EAAgBW,OAAM,OAAAE,OAAAM,EACrCnB,EAAgBoB,IAAI,SAACC,GAAG,MAAA,OAAAR,OAAYC,EAAKG,SAASpB,EAAYwB,GAAI,IAAG,CACxE,GACA,kFAAiF,SAAAR,OACxEZ,EAAU,wBACnB,eAAc,SAAAY,OACLZ,EAAU,KAAAY,OAAIX,GAAa,SAAAW,OAC3BZ,EAAU,KAAAY,OAAIX,EAAa,iCACnCE,EAAAE,EAAA,EAEI,CAAEC,KAAMP,EAAiBQ,aAAa,IAAM,EAAAZ,EAAA,KACpDN,MAAAC,KAAAC,UAAA,CAMM,SAAS8B,EAAoBzB,EAAoB0B,GACtD,IAAMC,EAAcV,EAAKG,SAASpB,EAAY0B,IAAQA,EAChDtB,EAAae,IACnBE,EAAiB,CAAA,yBAAAL,OACUW,GACzB,GACA,2BAA0B,SAAAX,OACjBZ,EAAU,KAAAY,OAAIW,IAE3B,CAEA,SAASR,IACP,IAAMS,EAAaC,QAAQC,KAAK,GAChC,OAAOF,EAAaX,EAAKc,SAASH,GAAc,UAClD"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),t=require("node:path"),s=require("zod"),n=require("../helpers/cleanWorkingDirectory.cjs"),r=require("../helpers/copyTestCaseFileInput.cjs"),i=require("../helpers/findEntryPointFile.cjs"),u=require("../helpers/findLanguageDefinitionByPath.cjs"),o=require("../helpers/judgeByStaticAnalysis.cjs"),a=require("../helpers/parseArgs.cjs"),d=require("../helpers/printTestCaseResult.cjs"),c=require("../helpers/readOutputFiles.cjs"),l=require("../helpers/readProblemMarkdownFrontMatter.cjs"),m=require("../helpers/readTestCases.cjs"),p=require("../helpers/spawnSyncWithTimeout.cjs"),C=require("../types/decisionCode.cjs"),g=s.z.object({language:s.z.union([s.z.string(),s.z.array(s.z.string())]).optional()});function I(){return(I=e.asyncToGenerator(e.regenerator().m(function t(s,m){var p,I,y,S,T,b,D,L,O,w,k,_,M,P,F,x,B,j,q,U,N,A,W,z,G,X,H,Q,Y,Z,J,V,K,$,ee,te,se,ne,re,ie,ue,oe,ae,de,ce,le,me,pe,Ce;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return k=a.parseArgs(process.argv),_=g.parse(k.params),t.n=1,l.readProblemMarkdownFrontMatter(s);case 1:return M=t.v,t.n=2,(null!=(p=m.readTestCases)?p:E)(s);case 2:return P=t.v,F=null!=(I=null==(y=P[0])?void 0:y.id)?I:"prebuild",x={buildTimeoutSeconds:null!=(S=null==(T=m.limits)?void 0:T.buildTimeoutSeconds)?S:10,maxOutputLength:null!=(b=null==(D=m.limits)?void 0:D.maxOutputLength)?b:5e4},B=null!=(L=m.runTimeoutSeconds)?L:2,t.n=3,o.judgeByStaticAnalysis(k.cwd,M);case 3:if(!(j=t.v)){t.n=4;break}return d.printTestCaseResult(e.objectSpread2({testCaseId:F},j)),t.a(2);case 4:return t.n=5,i.findEntryPointFile(k.cwd,_.language);case 5:if(q=t.v){t.n=6;break}return d.printTestCaseResult({testCaseId:F,decisionCode:C.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(_.language?": language: ".concat(_.language):"")}),t.a(2);case 6:if(U=u.findLanguageDefinitionByPath(q)){t.n=7;break}return d.printTestCaseResult({testCaseId:F,decisionCode:C.DecisionCode.WRONG_ANSWER,stderr:"unsupported language"}),t.a(2);case 7:if(N=e.objectSpread2(e.objectSpread2({},process.env),{},{CI:"",FORCE_COLOR:"0"}),A=q,!U.prebuild){t.n=12;break}return t.p=8,t.n=9,U.prebuild(k.cwd);case 9:return t.n=10,i.findEntryPointFile(k.cwd,_.language);case 10:(W=t.v)&&(A=W),t.n=12;break;case 11:return t.p=11,ce=t.v,d.printTestCaseResult({testCaseId:F,decisionCode:C.DecisionCode.BUILD_ERROR,stderr:ce instanceof Error?ce.message:String(ce)}),t.a(2);case 12:if(!(z=null==(O=U.buildCommand)?void 0:O.call(U,A))){t.n=13;break}if(!(G=h(z,{cwd:k.cwd,env:N,testCaseId:F,limits:x}))){t.n=13;break}return d.printTestCaseResult(G),t.a(2);case 13:return t.n=14,n.snapshotWorkingDirectory(k.cwd);case 14:if(X=t.v,0!==P.length){t.n=15;break}return d.printTestCaseResult({testCaseId:"default",decisionCode:C.DecisionCode.ACCEPTED}),t.a(2);case 15:H=null==(w=P.shared)?void 0:w.fileInputPath,Q=e.createForOfIteratorHelper(P),t.p=16,Q.s();case 17:if((Y=Q.n()).done){t.n=36;break}if(K=Y.value,!H){t.n=18;break}return t.n=18,r.copyTestCaseFileInput(H,k.cwd);case 18:if(!K.fileInputPath){t.n=19;break}return t.n=19,r.copyTestCaseFileInput(K.fileInputPath,k.cwd);case 19:if($="number"==typeof M.timeLimitMs?M.timeLimitMs/1e3:B,ee=U.command(A),te=null!=(Z=K.input)?Z:"",se=void 0,t.p=20,!m.resolveInput){t.n=22;break}return t.n=21,m.resolveInput({testCase:K,cwd:k.cwd,env:N});case 21:te=t.v;case 22:if(!m.runCommand){t.n=24;break}return t.n=23,m.runCommand({testCase:K,command:ee,stdin:te,cwd:k.cwd,env:N,timeLimitSeconds:$});case 23:le=t.v,t.n=25;break;case 24:le=R(ee,{stdin:te,cwd:k.cwd,env:N,timeLimitSeconds:$});case 25:se=le,t.n=28;break;case 26:return t.p=26,me=t.v,d.printTestCaseResult({testCaseId:K.id,decisionCode:C.DecisionCode.RUNTIME_ERROR,stdin:te,stderr:f(me)}),t.n=27,n.cleanWorkingDirectory(k.cwd,X);case 27:return t.a(2);case 28:return t.n=29,c.readOutputFiles(k.cwd,null!=(J=M.requiredOutputFilePaths)?J:[]);case 29:if(ne=t.v,re={timeLimitSeconds:$,outputLimitLength:x.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:M.memoryLimitByte,requiredOutputFilePaths:M.requiredOutputFilePaths}},ie=v({runResult:se,outputFiles:ne,context:re}),ue=ie,ie.decisionCode!==C.DecisionCode.ACCEPTED){t.n=33;break}return t.p=30,t.n=31,null==(oe=m.test)?void 0:oe.call(m,{testCase:K,runResult:se,outputFiles:ne,context:re});case 31:(ae=t.v)&&(ue={decisionCode:null!=(de=ae.decisionCode)?de:ie.decisionCode,feedbackMarkdown:ae.feedbackMarkdown,stderr:ae.stderr}),t.n=33;break;case 32:t.p=32,pe=t.v,ue={decisionCode:C.DecisionCode.RUNTIME_ERROR,stderr:f(pe)};case 33:return d.printTestCaseResult(e.objectSpread2(e.objectSpread2({testCaseId:K.id},ue),{},{exitStatus:se.status,stdin:se.stdin,stdout:se.stdout.slice(0,x.maxOutputLength)||void 0,stderr:(null!=(V=ue.stderr)?V:se.stderr).slice(0,x.maxOutputLength)||void 0,timeSeconds:se.timeSeconds,memoryBytes:se.memoryBytes,outputFiles:ne.length>0?ne:void 0})),t.n=34,n.cleanWorkingDirectory(k.cwd,X);case 34:if(ue.decisionCode===C.DecisionCode.ACCEPTED){t.n=35;break}return t.a(2);case 35:t.n=17;break;case 36:t.n=38;break;case 37:t.p=37,Ce=t.v,Q.e(Ce);case 38:return t.p=38,Q.f(),t.f(38);case 39:return t.a(2)}},t,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function h(e,t){var s,n=p.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),r=null!=(s=n.status)?s:void 0;return 0!==n.status?{testCaseId:t.testCaseId,decisionCode:C.DecisionCode.BUILD_ERROR,exitStatus:r,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:C.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:r,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.stdout.length>t.limits.maxOutputLength||n.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:C.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:r,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:void 0}function f(e){return e instanceof Error?e.message:String(e)}function E(e){return y.apply(this,arguments)}function y(){return(y=e.asyncToGenerator(e.regenerator().m(function s(n){var r,i,u;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,m.readTestCases(t.join(n,"test_cases"));case 1:if(i=e.v,u=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(r=i.shared)||!r.fileInputPath){e.n=2;break}return e.a(2,Object.assign(u,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,u)}},s)}))).apply(this,arguments)}function R(e,t){var s,n=p.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:n.stdout,stderr:n.stderr,status:null!=(s=n.status)?s:void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function v(e){var t,s,n;if(0!==e.runResult.status)return{decisionCode:C.DecisionCode.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:C.DecisionCode.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:C.DecisionCode.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:C.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var r=null!=(s=null==(n=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:n.length)?s:0;return e.outputFiles.length<r?{decisionCode:C.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:C.DecisionCode.ACCEPTED}}exports.commandJudgePreset=function(e,t){return I.apply(this,arguments)};
1
+ "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),t=require("node:path"),r=require("zod"),n=require("../helpers/cleanWorkingDirectory.cjs"),s=require("../helpers/copyTestCaseFileInput.cjs"),i=require("../helpers/findEntryPointFile.cjs"),u=require("../helpers/findLanguageDefinitionByPath.cjs"),a=require("../helpers/judgeByStaticAnalysis.cjs"),o=require("../helpers/parseArgs.cjs"),d=require("../helpers/printTestCaseResult.cjs"),c=require("../helpers/readOutputFiles.cjs"),l=require("../helpers/readProblemMarkdownFrontMatter.cjs"),p=require("../helpers/readTestCases.cjs"),m=require("../helpers/resolveCwds.cjs"),C=require("../helpers/spawnSyncWithTimeout.cjs"),f=require("../types/decisionCode.cjs"),g=r.z.object({language:r.z.union([r.z.string(),r.z.array(r.z.string())]).optional()});function h(){return(h=e.asyncToGenerator(e.regenerator().m(function t(r,n){var s,i,u,a,d,c,l,p,C;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return s=o.parseArgs(process.argv),i=g.parse(s.params),t.n=1,m.resolveCwds(r,s.cwd);case 1:u=t.v,a=u.cwds,d=u.isDebugMode,c=e.createForOfIteratorHelper(a),t.p=2,c.s();case 3:if((l=c.n()).done){t.n=5;break}return p=l.value,d&&m.printDebugCwdBanner(r,p),t.n=4,I(r,p,i,n);case 4:t.n=3;break;case 5:t.n=7;break;case 6:t.p=6,C=t.v,c.e(C);case 7:return t.p=7,c.f(),t.f(7);case 8:return t.a(2)}},t,null,[[2,6,7,8]])}))).apply(this,arguments)}function I(e,t,r,n){return y.apply(this,arguments)}function y(){return(y=e.asyncToGenerator(e.regenerator().m(function t(r,o,p,m){var C,g,h,I,y,b,D,L,O,k,_,M,w,P,F,x,B,j,q,U,N,A,W,z,G,X,H,Q,Y,Z,J,V,K,$,ee,te,re,ne,se,ie,ue,ae,oe,de,ce,le,pe;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return t.n=1,l.readProblemMarkdownFrontMatter(r);case 1:return _=t.v,t.n=2,(null!=(C=m.readTestCases)?C:R)(r);case 2:return M=t.v,w=null!=(g=null==(h=M[0])?void 0:h.id)?g:"prebuild",P={buildTimeoutSeconds:null!=(I=null==(y=m.limits)?void 0:y.buildTimeoutSeconds)?I:10,maxOutputLength:null!=(b=null==(D=m.limits)?void 0:D.maxOutputLength)?b:5e4},F=null!=(L=m.runTimeoutSeconds)?L:2,t.n=3,a.judgeByStaticAnalysis(o,_);case 3:if(!(x=t.v)){t.n=4;break}return d.printTestCaseResult(e.objectSpread2({testCaseId:w},x)),t.a(2);case 4:return t.n=5,i.findEntryPointFile(o,p.language);case 5:if(B=t.v){t.n=6;break}return d.printTestCaseResult({testCaseId:w,decisionCode:f.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(p.language?": language: ".concat(p.language):"")}),t.a(2);case 6:if(j=u.findLanguageDefinitionByPath(B)){t.n=7;break}return d.printTestCaseResult({testCaseId:w,decisionCode:f.DecisionCode.WRONG_ANSWER,stderr:"unsupported language"}),t.a(2);case 7:if(q=e.objectSpread2(e.objectSpread2({},process.env),{},{CI:"",FORCE_COLOR:"0"}),U=B,!j.prebuild){t.n=12;break}return t.p=8,t.n=9,j.prebuild(o);case 9:return t.n=10,i.findEntryPointFile(o,p.language);case 10:(N=t.v)&&(U=N),t.n=12;break;case 11:return t.p=11,oe=t.v,d.printTestCaseResult({testCaseId:w,decisionCode:f.DecisionCode.BUILD_ERROR,stderr:oe instanceof Error?oe.message:String(oe)}),t.a(2);case 12:if(!(A=null==(O=j.buildCommand)?void 0:O.call(j,U))){t.n=13;break}if(!(W=v(A,{cwd:o,env:q,testCaseId:w,limits:P}))){t.n=13;break}return d.printTestCaseResult(W),t.a(2);case 13:return t.n=14,n.snapshotWorkingDirectory(o);case 14:if(z=t.v,0!==M.length){t.n=15;break}return d.printTestCaseResult({testCaseId:"default",decisionCode:f.DecisionCode.ACCEPTED}),t.a(2);case 15:G=null==(k=M.shared)?void 0:k.fileInputPath,X=e.createForOfIteratorHelper(M),t.p=16,X.s();case 17:if((H=X.n()).done){t.n=36;break}if(J=H.value,!G){t.n=18;break}return t.n=18,s.copyTestCaseFileInput(G,o);case 18:if(!J.fileInputPath){t.n=19;break}return t.n=19,s.copyTestCaseFileInput(J.fileInputPath,o);case 19:if(V="number"==typeof _.timeLimitMs?_.timeLimitMs/1e3:F,K=j.command(U),$=null!=(Q=J.input)?Q:"",ee=void 0,t.p=20,!m.resolveInput){t.n=22;break}return t.n=21,m.resolveInput({testCase:J,cwd:o,env:q});case 21:$=t.v;case 22:if(!m.runCommand){t.n=24;break}return t.n=23,m.runCommand({testCase:J,command:K,stdin:$,cwd:o,env:q,timeLimitSeconds:V});case 23:de=t.v,t.n=25;break;case 24:de=S(K,{stdin:$,cwd:o,env:q,timeLimitSeconds:V});case 25:ee=de,t.n=28;break;case 26:return t.p=26,ce=t.v,d.printTestCaseResult({testCaseId:J.id,decisionCode:f.DecisionCode.RUNTIME_ERROR,stdin:$,stderr:E(ce)}),t.n=27,n.cleanWorkingDirectory(o,z);case 27:return t.a(2);case 28:return t.n=29,c.readOutputFiles(o,null!=(Y=_.requiredOutputFilePaths)?Y:[]);case 29:if(te=t.v,re={timeLimitSeconds:V,outputLimitLength:P.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:_.memoryLimitByte,requiredOutputFilePaths:_.requiredOutputFilePaths}},ne=T({runResult:ee,outputFiles:te,context:re}),se=ne,ne.decisionCode!==f.DecisionCode.ACCEPTED){t.n=33;break}return t.p=30,t.n=31,null==(ie=m.test)?void 0:ie.call(m,{testCase:J,runResult:ee,outputFiles:te,context:re});case 31:(ue=t.v)&&(se={decisionCode:null!=(ae=ue.decisionCode)?ae:ne.decisionCode,feedbackMarkdown:ue.feedbackMarkdown,stderr:ue.stderr}),t.n=33;break;case 32:t.p=32,le=t.v,se={decisionCode:f.DecisionCode.RUNTIME_ERROR,stderr:E(le)};case 33:return d.printTestCaseResult(e.objectSpread2(e.objectSpread2({testCaseId:J.id},se),{},{exitStatus:ee.status,stdin:ee.stdin,stdout:ee.stdout.slice(0,P.maxOutputLength)||void 0,stderr:(null!=(Z=se.stderr)?Z:ee.stderr).slice(0,P.maxOutputLength)||void 0,timeSeconds:ee.timeSeconds,memoryBytes:ee.memoryBytes,outputFiles:te.length>0?te:void 0})),t.n=34,n.cleanWorkingDirectory(o,z);case 34:if(se.decisionCode===f.DecisionCode.ACCEPTED){t.n=35;break}return t.a(2);case 35:t.n=17;break;case 36:t.n=38;break;case 37:t.p=37,pe=t.v,X.e(pe);case 38:return t.p=38,X.f(),t.f(38);case 39:return t.a(2)}},t,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function v(e,t){var r,n=C.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),s=null!=(r=n.status)?r:void 0;return 0!==n.status?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_ERROR,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.stdout.length>t.limits.maxOutputLength||n.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:void 0}function E(e){return e instanceof Error?e.message:String(e)}function R(e){return b.apply(this,arguments)}function b(){return(b=e.asyncToGenerator(e.regenerator().m(function r(n){var s,i,u;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,p.readTestCases(t.join(n,"test_cases"));case 1:if(i=e.v,u=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(s=i.shared)||!s.fileInputPath){e.n=2;break}return e.a(2,Object.assign(u,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,u)}},r)}))).apply(this,arguments)}function S(e,t){var r,n=C.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:n.stdout,stderr:n.stderr,status:null!=(r=n.status)?r:void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function T(e){var t,r,n;if(0!==e.runResult.status)return{decisionCode:f.DecisionCode.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:f.DecisionCode.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:f.DecisionCode.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:f.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var s=null!=(r=null==(n=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:n.length)?r:0;return e.outputFiles.length<s?{decisionCode:f.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:f.DecisionCode.ACCEPTED}}exports.commandJudgePreset=function(e,t){return h.apply(this,arguments)};
2
2
  //# sourceMappingURL=command.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.cjs","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.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 { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<CommandRunResult> | CommandRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n */\nexport async function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\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: prebuildTestCaseId,\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 mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n const prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd: args.cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\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 return;\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: CommandRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd: args.cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd: args.cwd,\n env,\n timeLimitSeconds,\n })\n : runCommand(command, {\n stdin,\n cwd: args.cwd,\n env,\n timeLimitSeconds,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n return;\n }\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return;\n }\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","_commandJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","args","params","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator","_step","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t","_t2","_t3","_t4","_t5","w","_context","p","n","parseArgs","process","argv","parse","readProblemMarkdownFrontMatter","v","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","cwd","printTestCaseResult","_objectSpread","testCaseId","a","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","_createForOfIteratorHelper","s","done","value","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","e","f","apply","this","arguments","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x3","_readCommandTestCases","_callee2","_fileTestCases$shared","fileTestCases","commandTestCases","_context2","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x","_x2"],"mappings":"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"}
1
+ {"version":3,"file":"command.cjs","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.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 { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport { printDebugCwdBanner, resolveCwds } from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<CommandRunResult> | CommandRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n for (const cwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, cwd);\n await runCommandJudgeForCwd<TTestCase>(problemDir, cwd, params, options);\n }\n}\n\nasync function runCommandJudgeForCwd<TTestCase extends BaseCommandTestCase>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\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: prebuildTestCaseId,\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 mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(cwd);\n const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\n return;\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return;\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: CommandRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n })\n : runCommand(command, {\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n return;\n }\n\n const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return;\n }\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","_commandJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","_yield$resolveCwds","cwds","isDebugMode","_iterator","_step","cwd","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","e","f","a","apply","this","arguments","_x3","_x4","_x5","_x6","_runCommandJudgeForCwd","_callee2","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator2","_step2","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t2","_t3","_t4","_t5","_t6","_context2","readProblemMarkdownFrontMatter","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x7","_readCommandTestCases","_callee3","_fileTestCases$shared","fileTestCases","commandTestCases","_context3","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x","_x2"],"mappings":"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"}
@@ -74,6 +74,12 @@ export interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase
74
74
  * ```bash
75
75
  * bun judge.ts model_answers/python '{ "language": "python" }'
76
76
  * ```
77
+ *
78
+ * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory
79
+ * for debugging. A prominent banner is printed for each run.
80
+ * ```bash
81
+ * bun judge.ts
82
+ * ```
77
83
  */
78
84
  export declare function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(problemDir: string, options: CommandJudgePresetOptions<TTestCase>): Promise<void>;
79
85
  export {};
@@ -1,2 +1,2 @@
1
- import{asyncToGenerator as e,regenerator as t,objectSpread2 as r,createForOfIteratorHelper as s}from"../_virtual/_rollupPluginBabelHelpers.js";import n from"node:path";import{z as i}from"zod";import{cleanWorkingDirectory as u,snapshotWorkingDirectory as o}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as a}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as d}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as c}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as l}from"../helpers/judgeByStaticAnalysis.js";import{parseArgs as m}from"../helpers/parseArgs.js";import{printTestCaseResult as p}from"../helpers/printTestCaseResult.js";import{readOutputFiles as f}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as I}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as C}from"../helpers/readTestCases.js";import{spawnSyncWithTimeout as h}from"../helpers/spawnSyncWithTimeout.js";import{DecisionCode as g}from"../types/decisionCode.js";var E=i.object({language:i.union([i.string(),i.array(i.string())]).optional()});function v(e,t){return R.apply(this,arguments)}function R(){return(R=e(t().m(function e(n,i){var C,h,v,R,b,T,_,k,M,x,P,B,D,F,j,U,N,A,X,q,G,W,H,Q,Y,Z,z,V,J,K,$,ee,te,re,se,ne,ie,ue,oe,ae,de,ce,le,me,pe,fe,Ie,Ce,he;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return P=m(process.argv),B=E.parse(P.params),e.n=1,I(n);case 1:return D=e.v,e.n=2,(null!=(C=i.readTestCases)?C:S)(n);case 2:return F=e.v,j=null!=(h=null==(v=F[0])?void 0:v.id)?h:"prebuild",U={buildTimeoutSeconds:null!=(R=null==(b=i.limits)?void 0:b.buildTimeoutSeconds)?R:10,maxOutputLength:null!=(T=null==(_=i.limits)?void 0:_.maxOutputLength)?T:5e4},N=null!=(k=i.runTimeoutSeconds)?k:2,e.n=3,l(P.cwd,D);case 3:if(!(A=e.v)){e.n=4;break}return p(r({testCaseId:j},A)),e.a(2);case 4:return e.n=5,d(P.cwd,B.language);case 5:if(X=e.v){e.n=6;break}return p({testCaseId:j,decisionCode:g.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(B.language?": language: ".concat(B.language):"")}),e.a(2);case 6:if(q=c(X)){e.n=7;break}return p({testCaseId:j,decisionCode:g.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2);case 7:if(G=r(r({},process.env),{},{CI:"",FORCE_COLOR:"0"}),W=X,!q.prebuild){e.n=12;break}return e.p=8,e.n=9,q.prebuild(P.cwd);case 9:return e.n=10,d(P.cwd,B.language);case 10:(H=e.v)&&(W=H),e.n=12;break;case 11:return e.p=11,pe=e.v,p({testCaseId:j,decisionCode:g.BUILD_ERROR,stderr:pe instanceof Error?pe.message:String(pe)}),e.a(2);case 12:if(!(Q=null==(M=q.buildCommand)?void 0:M.call(q,W))){e.n=13;break}if(!(Y=y(Q,{cwd:P.cwd,env:G,testCaseId:j,limits:U}))){e.n=13;break}return p(Y),e.a(2);case 13:return e.n=14,o(P.cwd);case 14:if(Z=e.v,0!==F.length){e.n=15;break}return p({testCaseId:"default",decisionCode:g.ACCEPTED}),e.a(2);case 15:z=null==(x=F.shared)?void 0:x.fileInputPath,V=s(F),e.p=16,V.s();case 17:if((J=V.n()).done){e.n=36;break}if(te=J.value,!z){e.n=18;break}return e.n=18,a(z,P.cwd);case 18:if(!te.fileInputPath){e.n=19;break}return e.n=19,a(te.fileInputPath,P.cwd);case 19:if(re="number"==typeof D.timeLimitMs?D.timeLimitMs/1e3:N,se=q.command(W),ne=null!=(K=te.input)?K:"",ie=void 0,e.p=20,!i.resolveInput){e.n=22;break}return e.n=21,i.resolveInput({testCase:te,cwd:P.cwd,env:G});case 21:ne=e.v;case 22:if(!i.runCommand){e.n=24;break}return e.n=23,i.runCommand({testCase:te,command:se,stdin:ne,cwd:P.cwd,env:G,timeLimitSeconds:re});case 23:fe=e.v,e.n=25;break;case 24:fe=O(se,{stdin:ne,cwd:P.cwd,env:G,timeLimitSeconds:re});case 25:ie=fe,e.n=28;break;case 26:return e.p=26,Ie=e.v,p({testCaseId:te.id,decisionCode:g.RUNTIME_ERROR,stdin:ne,stderr:L(Ie)}),e.n=27,u(P.cwd,Z);case 27:return e.a(2);case 28:return e.n=29,f(P.cwd,null!=($=D.requiredOutputFilePaths)?$:[]);case 29:if(ue=e.v,oe={timeLimitSeconds:re,outputLimitLength:U.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:D.memoryLimitByte,requiredOutputFilePaths:D.requiredOutputFilePaths}},ae=w({runResult:ie,outputFiles:ue,context:oe}),de=ae,ae.decisionCode!==g.ACCEPTED){e.n=33;break}return e.p=30,e.n=31,null==(ce=i.test)?void 0:ce.call(i,{testCase:te,runResult:ie,outputFiles:ue,context:oe});case 31:(le=e.v)&&(de={decisionCode:null!=(me=le.decisionCode)?me:ae.decisionCode,feedbackMarkdown:le.feedbackMarkdown,stderr:le.stderr}),e.n=33;break;case 32:e.p=32,Ce=e.v,de={decisionCode:g.RUNTIME_ERROR,stderr:L(Ce)};case 33:return p(r(r({testCaseId:te.id},de),{},{exitStatus:ie.status,stdin:ie.stdin,stdout:ie.stdout.slice(0,U.maxOutputLength)||void 0,stderr:(null!=(ee=de.stderr)?ee:ie.stderr).slice(0,U.maxOutputLength)||void 0,timeSeconds:ie.timeSeconds,memoryBytes:ie.memoryBytes,outputFiles:ue.length>0?ue:void 0})),e.n=34,u(P.cwd,Z);case 34:if(de.decisionCode===g.ACCEPTED){e.n=35;break}return e.a(2);case 35:e.n=17;break;case 36:e.n=38;break;case 37:e.p=37,he=e.v,V.e(he);case 38:return e.p=38,V.f(),e.f(38);case 39:return e.a(2)}},e,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function y(e,t){var r,s=h(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),n=null!=(r=s.status)?r:void 0;return 0!==s.status?{testCaseId:t.testCaseId,decisionCode:g.BUILD_ERROR,exitStatus:n,stdout:s.stdout.slice(0,t.limits.maxOutputLength),stderr:s.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}:s.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:g.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:n,stdout:s.stdout.slice(0,t.limits.maxOutputLength),stderr:s.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}:s.stdout.length>t.limits.maxOutputLength||s.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:g.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:n,stdout:s.stdout.slice(0,t.limits.maxOutputLength),stderr:s.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}:void 0}function L(e){return e instanceof Error?e.message:String(e)}function S(e){return b.apply(this,arguments)}function b(){return(b=e(t().m(function e(r){var s,i,u;return t().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,C(n.join(r,"test_cases"));case 1:if(i=e.v,u=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(s=i.shared)||!s.fileInputPath){e.n=2;break}return e.a(2,Object.assign(u,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,u)}},e)}))).apply(this,arguments)}function O(e,t){var r,s=h(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:s.stdout,stderr:s.stderr,status:null!=(r=s.status)?r:void 0,timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}}function w(e){var t,r,s;if(0!==e.runResult.status)return{decisionCode:g.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:g.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:g.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:g.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var n=null!=(r=null==(s=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:s.length)?r:0;return e.outputFiles.length<n?{decisionCode:g.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:g.ACCEPTED}}export{v as commandJudgePreset};
1
+ import{asyncToGenerator as e,regenerator as t,createForOfIteratorHelper as r,objectSpread2 as n}from"../_virtual/_rollupPluginBabelHelpers.js";import s from"node:path";import{z as i}from"zod";import{cleanWorkingDirectory as u,snapshotWorkingDirectory as a}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as o}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as d}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as l}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as c}from"../helpers/judgeByStaticAnalysis.js";import{parseArgs as m}from"../helpers/parseArgs.js";import{printTestCaseResult as p}from"../helpers/printTestCaseResult.js";import{readOutputFiles as f}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as h}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as I}from"../helpers/readTestCases.js";import{resolveCwds as C,printDebugCwdBanner as g}from"../helpers/resolveCwds.js";import{spawnSyncWithTimeout as v}from"../helpers/spawnSyncWithTimeout.js";import{DecisionCode as E}from"../types/decisionCode.js";var b=i.object({language:i.union([i.string(),i.array(i.string())]).optional()});function y(e,t){return R.apply(this,arguments)}function R(){return(R=e(t().m(function e(n,s){var i,u,a,o,d,l,c,p,f;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return i=m(process.argv),u=b.parse(i.params),e.n=1,C(n,i.cwd);case 1:a=e.v,o=a.cwds,d=a.isDebugMode,l=r(o),e.p=2,l.s();case 3:if((c=l.n()).done){e.n=5;break}return p=c.value,d&&g(n,p),e.n=4,L(n,p,u,s);case 4:e.n=3;break;case 5:e.n=7;break;case 6:e.p=6,f=e.v,l.e(f);case 7:return e.p=7,l.f(),e.f(7);case 8:return e.a(2)}},e,null,[[2,6,7,8]])}))).apply(this,arguments)}function L(e,t,r,n){return S.apply(this,arguments)}function S(){return(S=e(t().m(function e(s,i,m,I){var C,g,v,b,y,R,L,S,_,w,P,D,B,F,j,U,N,A,X,q,G,W,H,Q,Y,Z,z,V,J,K,$,ee,te,re,ne,se,ie,ue,ae,oe,de,le,ce,me,pe,fe,he;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.n=1,h(s);case 1:return P=e.v,e.n=2,(null!=(C=I.readTestCases)?C:T)(s);case 2:return D=e.v,B=null!=(g=null==(v=D[0])?void 0:v.id)?g:"prebuild",F={buildTimeoutSeconds:null!=(b=null==(y=I.limits)?void 0:y.buildTimeoutSeconds)?b:10,maxOutputLength:null!=(R=null==(L=I.limits)?void 0:L.maxOutputLength)?R:5e4},j=null!=(S=I.runTimeoutSeconds)?S:2,e.n=3,c(i,P);case 3:if(!(U=e.v)){e.n=4;break}return p(n({testCaseId:B},U)),e.a(2);case 4:return e.n=5,d(i,m.language);case 5:if(N=e.v){e.n=6;break}return p({testCaseId:B,decisionCode:E.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(m.language?": language: ".concat(m.language):"")}),e.a(2);case 6:if(A=l(N)){e.n=7;break}return p({testCaseId:B,decisionCode:E.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2);case 7:if(X=n(n({},process.env),{},{CI:"",FORCE_COLOR:"0"}),q=N,!A.prebuild){e.n=12;break}return e.p=8,e.n=9,A.prebuild(i);case 9:return e.n=10,d(i,m.language);case 10:(G=e.v)&&(q=G),e.n=12;break;case 11:return e.p=11,ce=e.v,p({testCaseId:B,decisionCode:E.BUILD_ERROR,stderr:ce instanceof Error?ce.message:String(ce)}),e.a(2);case 12:if(!(W=null==(_=A.buildCommand)?void 0:_.call(A,q))){e.n=13;break}if(!(H=O(W,{cwd:i,env:X,testCaseId:B,limits:F}))){e.n=13;break}return p(H),e.a(2);case 13:return e.n=14,a(i);case 14:if(Q=e.v,0!==D.length){e.n=15;break}return p({testCaseId:"default",decisionCode:E.ACCEPTED}),e.a(2);case 15:Y=null==(w=D.shared)?void 0:w.fileInputPath,Z=r(D),e.p=16,Z.s();case 17:if((z=Z.n()).done){e.n=36;break}if($=z.value,!Y){e.n=18;break}return e.n=18,o(Y,i);case 18:if(!$.fileInputPath){e.n=19;break}return e.n=19,o($.fileInputPath,i);case 19:if(ee="number"==typeof P.timeLimitMs?P.timeLimitMs/1e3:j,te=A.command(q),re=null!=(V=$.input)?V:"",ne=void 0,e.p=20,!I.resolveInput){e.n=22;break}return e.n=21,I.resolveInput({testCase:$,cwd:i,env:X});case 21:re=e.v;case 22:if(!I.runCommand){e.n=24;break}return e.n=23,I.runCommand({testCase:$,command:te,stdin:re,cwd:i,env:X,timeLimitSeconds:ee});case 23:me=e.v,e.n=25;break;case 24:me=M(te,{stdin:re,cwd:i,env:X,timeLimitSeconds:ee});case 25:ne=me,e.n=28;break;case 26:return e.p=26,pe=e.v,p({testCaseId:$.id,decisionCode:E.RUNTIME_ERROR,stdin:re,stderr:k(pe)}),e.n=27,u(i,Q);case 27:return e.a(2);case 28:return e.n=29,f(i,null!=(J=P.requiredOutputFilePaths)?J:[]);case 29:if(se=e.v,ie={timeLimitSeconds:ee,outputLimitLength:F.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:P.memoryLimitByte,requiredOutputFilePaths:P.requiredOutputFilePaths}},ue=x({runResult:ne,outputFiles:se,context:ie}),ae=ue,ue.decisionCode!==E.ACCEPTED){e.n=33;break}return e.p=30,e.n=31,null==(oe=I.test)?void 0:oe.call(I,{testCase:$,runResult:ne,outputFiles:se,context:ie});case 31:(de=e.v)&&(ae={decisionCode:null!=(le=de.decisionCode)?le:ue.decisionCode,feedbackMarkdown:de.feedbackMarkdown,stderr:de.stderr}),e.n=33;break;case 32:e.p=32,fe=e.v,ae={decisionCode:E.RUNTIME_ERROR,stderr:k(fe)};case 33:return p(n(n({testCaseId:$.id},ae),{},{exitStatus:ne.status,stdin:ne.stdin,stdout:ne.stdout.slice(0,F.maxOutputLength)||void 0,stderr:(null!=(K=ae.stderr)?K:ne.stderr).slice(0,F.maxOutputLength)||void 0,timeSeconds:ne.timeSeconds,memoryBytes:ne.memoryBytes,outputFiles:se.length>0?se:void 0})),e.n=34,u(i,Q);case 34:if(ae.decisionCode===E.ACCEPTED){e.n=35;break}return e.a(2);case 35:e.n=17;break;case 36:e.n=38;break;case 37:e.p=37,he=e.v,Z.e(he);case 38:return e.p=38,Z.f(),e.f(38);case 39:return e.a(2)}},e,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function O(e,t){var r,n=v(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),s=null!=(r=n.status)?r:void 0;return 0!==n.status?{testCaseId:t.testCaseId,decisionCode:E.BUILD_ERROR,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:E.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.stdout.length>t.limits.maxOutputLength||n.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:E.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:void 0}function k(e){return e instanceof Error?e.message:String(e)}function T(e){return _.apply(this,arguments)}function _(){return(_=e(t().m(function e(r){var n,i,u;return t().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,I(s.join(r,"test_cases"));case 1:if(i=e.v,u=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(n=i.shared)||!n.fileInputPath){e.n=2;break}return e.a(2,Object.assign(u,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,u)}},e)}))).apply(this,arguments)}function M(e,t){var r,n=v(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:n.stdout,stderr:n.stderr,status:null!=(r=n.status)?r:void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function x(e){var t,r,n;if(0!==e.runResult.status)return{decisionCode:E.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:E.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:E.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:E.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var s=null!=(r=null==(n=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:n.length)?r:0;return e.outputFiles.length<s?{decisionCode:E.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:E.ACCEPTED}}export{y as commandJudgePreset};
2
2
  //# sourceMappingURL=command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.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 { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<CommandRunResult> | CommandRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n */\nexport async function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\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: prebuildTestCaseId,\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 mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n const prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd: args.cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\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 return;\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: CommandRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd: args.cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd: args.cwd,\n env,\n timeLimitSeconds,\n })\n : runCommand(command, {\n stdin,\n cwd: args.cwd,\n env,\n timeLimitSeconds,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n return;\n }\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return;\n }\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","commandJudgePreset","_x","_x2","_commandJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","args","params","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator","_step","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t","_t2","_t3","_t4","_t5","w","_context","p","n","parseArgs","process","argv","parse","readProblemMarkdownFrontMatter","v","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","cwd","printTestCaseResult","_objectSpread","testCaseId","a","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","_createForOfIteratorHelper","s","done","value","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","e","f","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x3","_readCommandTestCases","_callee2","_fileTestCases$shared","fileTestCases","commandTestCases","_context2","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR"],"mappings":"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"}
1
+ {"version":3,"file":"command.js","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.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 { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport { printDebugCwdBanner, resolveCwds } from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<CommandRunResult> | CommandRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n for (const cwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, cwd);\n await runCommandJudgeForCwd<TTestCase>(problemDir, cwd, params, options);\n }\n}\n\nasync function runCommandJudgeForCwd<TTestCase extends BaseCommandTestCase>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\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: prebuildTestCaseId,\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 mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(cwd);\n const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\n return;\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return;\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: CommandRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n })\n : runCommand(command, {\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n return;\n }\n\n const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return;\n }\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","commandJudgePreset","_x","_x2","_commandJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","_yield$resolveCwds","cwds","isDebugMode","_iterator","_step","cwd","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","e","f","a","_x3","_x4","_x5","_x6","_runCommandJudgeForCwd","_callee2","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator2","_step2","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t2","_t3","_t4","_t5","_t6","_context2","readProblemMarkdownFrontMatter","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x7","_readCommandTestCases","_callee3","_fileTestCases$shared","fileTestCases","commandTestCases","_context3","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR"],"mappings":"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"}