@exercode/problem-utils 1.10.0 → 1.11.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.
- package/dist/helpers/findModelAnswerDirs.cjs +1 -1
- package/dist/helpers/findModelAnswerDirs.cjs.map +1 -1
- package/dist/helpers/findModelAnswerDirs.d.ts +7 -0
- package/dist/helpers/findModelAnswerDirs.js +1 -1
- package/dist/helpers/findModelAnswerDirs.js.map +1 -1
- package/dist/helpers/printDebugBanner.cjs +1 -1
- package/dist/helpers/printDebugBanner.cjs.map +1 -1
- package/dist/helpers/printDebugBanner.js +1 -1
- package/dist/helpers/printDebugBanner.js.map +1 -1
- package/dist/helpers/resolveCwds.cjs +1 -1
- package/dist/helpers/resolveCwds.cjs.map +1 -1
- package/dist/helpers/resolveCwds.d.ts +10 -3
- package/dist/helpers/resolveCwds.js +1 -1
- package/dist/helpers/resolveCwds.js.map +1 -1
- package/dist/presets/command.cjs +1 -1
- package/dist/presets/command.cjs.map +1 -1
- package/dist/presets/command.js +1 -1
- package/dist/presets/command.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var r=require("../_virtual/_rollupPluginBabelHelpers.cjs"),e=require("node:fs/promises"),n=require("node:path");function t(){return(
|
|
1
|
+
"use strict";var r=require("../_virtual/_rollupPluginBabelHelpers.cjs"),e=require("node:fs/promises"),n=require("node:path"),t="model_answers",o="model_answers.fails";function i(){return(i=r.asyncToGenerator(r.regenerator().m(function e(n){return r.regenerator().w(function(r){for(;;)if(0===r.n)return r.a(2,u(n,t))},e)}))).apply(this,arguments)}function a(){return(a=r.asyncToGenerator(r.regenerator().m(function e(n){return r.regenerator().w(function(r){for(;;)if(0===r.n)return r.a(2,u(n,o))},e)}))).apply(this,arguments)}function u(r,e){return s.apply(this,arguments)}function s(){return(s=r.asyncToGenerator(r.regenerator().m(function t(o,i){var a,u,s;return r.regenerator().w(function(r){for(;;)switch(r.p=r.n){case 0:return a=n.join(o,i),r.p=1,r.n=2,e.readdir(a,{withFileTypes:!0});case 2:u=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,u.filter(function(r){return r.isDirectory()}).map(function(r){return n.join(a,r.name)}).toSorted())}},t,null,[[1,3]])}))).apply(this,arguments)}exports.FAILING_MODEL_ANSWERS_DIRNAME=o,exports.MODEL_ANSWERS_DIRNAME=t,exports.findFailingModelAnswerDirs=function(r){return a.apply(this,arguments)},exports.findModelAnswerDirs=function(r){return i.apply(this,arguments)};
|
|
2
2
|
//# sourceMappingURL=findModelAnswerDirs.cjs.map
|
|
@@ -1 +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\
|
|
1
|
+
{"version":3,"file":"findModelAnswerDirs.cjs","sources":["../../src/helpers/findModelAnswerDirs.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport const MODEL_ANSWERS_DIRNAME = 'model_answers';\nexport const FAILING_MODEL_ANSWERS_DIRNAME = 'model_answers.fails';\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 return findAnswerDirs(problemDir, MODEL_ANSWERS_DIRNAME);\n}\n\n/**\n * Find failing model answer directories under `<problemDir>/model_answers.fails/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findFailingModelAnswerDirs(problemDir: string): Promise<string[]> {\n return findAnswerDirs(problemDir, FAILING_MODEL_ANSWERS_DIRNAME);\n}\n\nasync function findAnswerDirs(problemDir: string, dirname: string): Promise<string[]> {\n const modelAnswersDir = path.join(problemDir, 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":["MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME","_findModelAnswerDirs","_asyncToGenerator","_regenerator","m","_callee","problemDir","w","_context","n","a","findAnswerDirs","apply","this","arguments","_findFailingModelAnswerDirs","_callee2","_context2","_x3","_x4","_findAnswerDirs","_callee3","dirname","modelAnswersDir","entries","_t","_context3","p","path","join","fs","readdir","withFileTypes","v","code","filter","entry","isDirectory","map","name","toSorted","_x2","_x"],"mappings":"6HAGaA,EAAwB,gBACxBC,EAAgC,sBAU7C,SAAAC,IAFC,OAEDA,EAAAC,EAAAA,iBAAAC,EAAAA,cAAAC,EAJO,SAAAC,EAAmCC,GAAkB,OAAAH,gBAAAI,EAAA,SAAAC,GAAA,UAAA,IAAAA,EAAAC,EAAA,OAAAD,EAAAE,EAAA,EACnDC,EAAeL,EAAYP,GAAsB,EAAAM,EAAA,KACzDO,MAAAC,KAAAC,UAAA,CAQA,SAAAC,IAAA,OAAAA,EAAAb,EAAAA,iBAAAC,EAAAA,cAAAC,EAFM,SAAAY,EAA0CV,GAAkB,OAAAH,gBAAAI,EAAA,SAAAU,GAAA,UAAA,IAAAA,EAAAR,EAAA,OAAAQ,EAAAP,EAAA,EAC1DC,EAAeL,EAAYN,GAA8B,EAAAgB,EAAA,KACjEJ,MAAAC,KAAAC,UAAA,CAAA,SAEcH,EAAcO,EAAAC,GAAA,OAAAC,EAAAR,MAAAC,KAAAC,UAAA,CAAA,SAAAM,IAa5B,OAb4BA,EAAAlB,EAAAA,iBAAAC,gBAAAC,EAA7B,SAAAiB,EAA8Bf,EAAoBgB,GAAe,IAAAC,EAAAC,EAAAC,EAAA,OAAAtB,gBAAAI,EAAA,SAAAmB,GAAA,cAAAA,EAAAC,EAAAD,EAAAjB,GAAA,KAAA,EACT,OAAhDc,EAAkBK,EAAKC,KAAKvB,EAAYgB,GAAQI,EAAAC,EAAA,EAAAD,EAAAjB,EAAA,EAGpCqB,EAAGC,QAAQR,EAAiB,CAAES,eAAe,IAAO,KAAA,EAApER,EAAOE,EAAAO,EAAAP,EAAAjB,EAAA,EAAA,MAAA,KAAA,EAAA,GAAAiB,EAAAC,EAAA,EAEuC,YAFvCF,EAAAC,EAAAO,GAE8BC,KAAiB,CAAAR,EAAAjB,EAAA,EAAA,KAAA,CAAA,OAAAiB,EAAAhB,EAAA,EAAS,IAAE,KAAA,EAAA,MAAAe,EAAA,KAAA,EAAA,OAAAC,EAAAhB,EAAA,EAG5Dc,EACJW,OAAO,SAACC,GAAK,OAAKA,EAAMC,aAAa,GACrCC,IAAI,SAACF,GAAK,OAAKR,EAAKC,KAAKN,EAAiBa,EAAMG,KAAK,GACrDC,YAAU,EAAAnB,EAAA,KAAA,CAAA,CAAA,EAAA,IAAA,KACdT,MAAAC,KAAAC,UAAA,4GAjBD,SAAgD2B,GAAA,OAAA1B,EAAAH,MAAAC,KAAAC,UAAA,8BARhD,SAAyC4B,GAAA,OAAAzC,EAAAW,MAAAC,KAAAC,UAAA"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
export declare const MODEL_ANSWERS_DIRNAME = "model_answers";
|
|
2
|
+
export declare const FAILING_MODEL_ANSWERS_DIRNAME = "model_answers.fails";
|
|
1
3
|
/**
|
|
2
4
|
* Find model answer directories under `<problemDir>/model_answers/`.
|
|
3
5
|
* Returns absolute paths sorted lexicographically.
|
|
4
6
|
*/
|
|
5
7
|
export declare function findModelAnswerDirs(problemDir: string): Promise<string[]>;
|
|
8
|
+
/**
|
|
9
|
+
* Find failing model answer directories under `<problemDir>/model_answers.fails/`.
|
|
10
|
+
* Returns absolute paths sorted lexicographically.
|
|
11
|
+
*/
|
|
12
|
+
export declare function findFailingModelAnswerDirs(problemDir: string): Promise<string[]>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asyncToGenerator as r,regenerator as
|
|
1
|
+
import{asyncToGenerator as r,regenerator as n}from"../_virtual/_rollupPluginBabelHelpers.js";import t from"node:fs/promises";import e from"node:path";var o="model_answers",i="model_answers.fails";function u(r){return a.apply(this,arguments)}function a(){return(a=r(n().m(function r(t){return n().w(function(r){for(;;)if(0===r.n)return r.a(2,p(t,o))},r)}))).apply(this,arguments)}function s(r){return f.apply(this,arguments)}function f(){return(f=r(n().m(function r(t){return n().w(function(r){for(;;)if(0===r.n)return r.a(2,p(t,i))},r)}))).apply(this,arguments)}function p(r,n){return c.apply(this,arguments)}function c(){return(c=r(n().m(function r(o,i){var u,a,s;return n().w(function(r){for(;;)switch(r.p=r.n){case 0:return u=e.join(o,i),r.p=1,r.n=2,t.readdir(u,{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 e.join(u,r.name)}).toSorted())}},r,null,[[1,3]])}))).apply(this,arguments)}export{i as FAILING_MODEL_ANSWERS_DIRNAME,o as MODEL_ANSWERS_DIRNAME,s as findFailingModelAnswerDirs,u as findModelAnswerDirs};
|
|
2
2
|
//# sourceMappingURL=findModelAnswerDirs.js.map
|
|
@@ -1 +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\
|
|
1
|
+
{"version":3,"file":"findModelAnswerDirs.js","sources":["../../src/helpers/findModelAnswerDirs.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport const MODEL_ANSWERS_DIRNAME = 'model_answers';\nexport const FAILING_MODEL_ANSWERS_DIRNAME = 'model_answers.fails';\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 return findAnswerDirs(problemDir, MODEL_ANSWERS_DIRNAME);\n}\n\n/**\n * Find failing model answer directories under `<problemDir>/model_answers.fails/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findFailingModelAnswerDirs(problemDir: string): Promise<string[]> {\n return findAnswerDirs(problemDir, FAILING_MODEL_ANSWERS_DIRNAME);\n}\n\nasync function findAnswerDirs(problemDir: string, dirname: string): Promise<string[]> {\n const modelAnswersDir = path.join(problemDir, 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":["MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME","findModelAnswerDirs","_x","_findModelAnswerDirs","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","w","_context","n","a","findAnswerDirs","findFailingModelAnswerDirs","_x2","_findFailingModelAnswerDirs","_callee2","_context2","_x3","_x4","_findAnswerDirs","_callee3","dirname","modelAnswersDir","entries","_t","_context3","p","path","join","fs","readdir","withFileTypes","v","code","filter","entry","isDirectory","map","name","toSorted"],"mappings":"sJAGO,IAAMA,EAAwB,gBACxBC,EAAgC,sBAM7C,SAAsBC,EAAmBC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAIzC,SAAAH,IAFC,OAEDA,EAAAI,EAAAC,IAAAC,EAJO,SAAAC,EAAmCC,GAAkB,OAAAH,IAAAI,EAAA,SAAAC,GAAA,UAAA,IAAAA,EAAAC,EAAA,OAAAD,EAAAE,EAAA,EACnDC,EAAeL,EAAYZ,GAAsB,EAAAW,EAAA,KACzDN,MAAAC,KAAAC,UAAA,CAMD,SAAsBW,EAA0BC,GAAA,OAAAC,EAAAf,MAAAC,KAAAC,UAAA,CAE/C,SAAAa,IAAA,OAAAA,EAAAZ,EAAAC,IAAAC,EAFM,SAAAW,EAA0CT,GAAkB,OAAAH,IAAAI,EAAA,SAAAS,GAAA,UAAA,IAAAA,EAAAP,EAAA,OAAAO,EAAAN,EAAA,EAC1DC,EAAeL,EAAYX,GAA8B,EAAAoB,EAAA,KACjEhB,MAAAC,KAAAC,UAAA,CAAA,SAEcU,EAAcM,EAAAC,GAAA,OAAAC,EAAApB,MAAAC,KAAAC,UAAA,CAAA,SAAAkB,IAa5B,OAb4BA,EAAAjB,EAAAC,IAAAC,EAA7B,SAAAgB,EAA8Bd,EAAoBe,GAAe,IAAAC,EAAAC,EAAAC,EAAA,OAAArB,IAAAI,EAAA,SAAAkB,GAAA,cAAAA,EAAAC,EAAAD,EAAAhB,GAAA,KAAA,EACT,OAAhDa,EAAkBK,EAAKC,KAAKtB,EAAYe,GAAQI,EAAAC,EAAA,EAAAD,EAAAhB,EAAA,EAGpCoB,EAAGC,QAAQR,EAAiB,CAAES,eAAe,IAAO,KAAA,EAApER,EAAOE,EAAAO,EAAAP,EAAAhB,EAAA,EAAA,MAAA,KAAA,EAAA,GAAAgB,EAAAC,EAAA,EAEuC,YAFvCF,EAAAC,EAAAO,GAE8BC,KAAiB,CAAAR,EAAAhB,EAAA,EAAA,KAAA,CAAA,OAAAgB,EAAAf,EAAA,EAAS,IAAE,KAAA,EAAA,MAAAc,EAAA,KAAA,EAAA,OAAAC,EAAAf,EAAA,EAG5Da,EACJW,OAAO,SAACC,GAAK,OAAKA,EAAMC,aAAa,GACrCC,IAAI,SAACF,GAAK,OAAKR,EAAKC,KAAKN,EAAiBa,EAAMG,KAAK,GACrDC,YAAU,EAAAnB,EAAA,KAAA,CAAA,CAAA,EAAA,IAAA,KACdrB,MAAAC,KAAAC,UAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var n="=".repeat(72);exports.printDebugBanner=function(c){var
|
|
1
|
+
"use strict";var n="=".repeat(72);exports.printDebugBanner=function(c){var t=c.map(function(n){return" ".concat(n)}).join("\n");console.warn("\n".concat(n,"\n").concat(t,"\n").concat(n))};
|
|
2
2
|
//# sourceMappingURL=printDebugBanner.cjs.map
|
|
@@ -1 +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.
|
|
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.warn(`\\n${BANNER_LINE}\\n${body}\\n${BANNER_LINE}`);\n}\n"],"names":["BANNER_LINE","repeat","lines","body","map","line","concat","join","console","warn"],"mappings":"aAAA,IAAMA,EAAc,IAAIC,OAAO,6BAQxB,SAA0BC,GAC/B,IAAMC,EAAOD,EAAME,IAAI,SAACC,GAAI,MAAA,KAAAC,OAAUD,EAAI,GAAIE,KAAK,MACnDC,QAAQC,KAAI,KAAAH,OAAMN,EAAW,MAAAM,OAAKH,EAAI,MAAAG,OAAKN,GAC7C"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var n="=".repeat(72);function c(c){var o=c.map(function(n){return" ".concat(n)}).join("\n");console.
|
|
1
|
+
var n="=".repeat(72);function c(c){var o=c.map(function(n){return" ".concat(n)}).join("\n");console.warn("\n".concat(n,"\n").concat(o,"\n").concat(n))}export{c as printDebugBanner};
|
|
2
2
|
//# sourceMappingURL=printDebugBanner.js.map
|
|
@@ -1 +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.
|
|
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.warn(`\\n${BANNER_LINE}\\n${body}\\n${BANNER_LINE}`);\n}\n"],"names":["BANNER_LINE","repeat","printDebugBanner","lines","body","map","line","concat","join","console","warn"],"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,KAAI,KAAAH,OAAMP,EAAW,MAAAO,OAAKH,EAAI,MAAAG,OAAKP,GAC7C"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),n=require("node:path"),r=require("./findModelAnswerDirs.cjs"),
|
|
1
|
+
"use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),n=require("node:path"),r=require("./findModelAnswerDirs.cjs"),t=require("./printDebugBanner.cjs");function a(){return(a=e.asyncToGenerator(e.regenerator().m(function a(o,s){var i,u,d,l,p,g,w,b;return e.regenerator().w(function(a){for(;;)switch(a.n){case 0:if(!s){a.n=1;break}return a.a(2,{cwds:[{cwd:s,expectedResult:"accepted"}],isDebugMode:!1});case 1:return a.n=2,Promise.all([r.findModelAnswerDirs(o),r.findFailingModelAnswerDirs(o)]);case 2:if(d=a.v,l=e.slicedToArray(d,2),p=l[0],g=l[1],0!==p.length||0!==g.length){a.n=3;break}throw new Error("cwd argument required (no model answer directories found in ".concat(n.join(o,r.MODEL_ANSWERS_DIRNAME)," or ").concat(n.join(o,r.FAILING_MODEL_ANSWERS_DIRNAME),")"));case 3:return w=c(),b=n.relative(o,null!=(i=null!=(u=p[0])?u:g[0])?i:"")||"<model_answer>",t.printDebugBanner(["[DEBUG MODE] cwd not provided -- judging against all model answers","","Problem dir : ".concat(o),"Model answers (".concat(p.length,"):")].concat(e.toConsumableArray(p.map(function(e){return" - ".concat(n.relative(o,e))})),["Failing model answers (".concat(g.length,"):")],e.toConsumableArray(g.map(function(e){return" - ".concat(n.relative(o,e))})),["","To judge a single cwd (e.g., a user submission), pass it as the first argument:"," bun ".concat(w," <cwd> [params-json]"),"For example:"," bun ".concat(w," ").concat(b)," bun ".concat(w," ").concat(b,' \'{"language":"python"}\'')])),a.a(2,{cwds:[].concat(e.toConsumableArray(p.map(function(e){return{cwd:e,expectedResult:"accepted"}})),e.toConsumableArray(g.map(function(e){return{cwd:e,expectedResult:"rejected"}}))),isDebugMode:!0})}},a)}))).apply(this,arguments)}function c(){var e=process.argv[1];return e?n.basename(e):"judge.ts"}exports.printDebugCwdBanner=function(e,r){var a=n.relative(e,r.cwd)||r.cwd,o=c();t.printDebugBanner(["[DEBUG MODE] judging: ".concat(a),"Expected result: ".concat(r.expectedResult),"","To judge only this cwd as a normal submission:"," bun ".concat(o," ").concat(a),"Run without a cwd to check debug-mode expectations."])},exports.printDebugExpectationFailureBanner=function(e,r){var a=n.relative(e,r.cwd)||r.cwd;t.printDebugBanner(["[DEBUG MODE] expectation failed: ".concat(a),"Expected result: ".concat(r.expectedResult),"accepted"===r.expectedResult?"The model answer was rejected by the judge.":"The failing model answer was accepted by the judge."])},exports.resolveCwds=function(e,n){return a.apply(this,arguments)};
|
|
2
2
|
//# sourceMappingURL=resolveCwds.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveCwds.cjs","sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {
|
|
1
|
+
{"version":3,"file":"resolveCwds.cjs","sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n FAILING_MODEL_ANSWERS_DIRNAME,\n MODEL_ANSWERS_DIRNAME,\n findFailingModelAnswerDirs,\n findModelAnswerDirs,\n} from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport type ExpectedJudgeResult = 'accepted' | 'rejected';\n\nexport interface ResolvedCwd {\n cwd: string;\n expectedResult: ExpectedJudgeResult;\n}\n\nexport interface ResolvedCwds {\n cwds: readonly ResolvedCwd[];\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\n * `<problemDir>/model_answers.fails/*` 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: [{ cwd: cwdArg, expectedResult: 'accepted' }], isDebugMode: false };\n\n const [modelAnswerDirs, failingModelAnswerDirs] = await Promise.all([\n findModelAnswerDirs(problemDir),\n findFailingModelAnswerDirs(problemDir),\n ]);\n if (modelAnswerDirs.length === 0 && failingModelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, MODEL_ANSWERS_DIRNAME)} or ${path.join(problemDir, FAILING_MODEL_ANSWERS_DIRNAME)})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer =\n path.relative(problemDir, modelAnswerDirs[0] ?? failingModelAnswerDirs[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 `Failing model answers (${failingModelAnswerDirs.length}):`,\n ...failingModelAnswerDirs.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 {\n cwds: [\n ...modelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'accepted' as const })),\n ...failingModelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'rejected' as const })),\n ],\n isDebugMode: true,\n };\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, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n '',\n 'To judge only this cwd as a normal submission:',\n ` bun ${scriptName} ${relativeCwd}`,\n 'Run without a cwd to check debug-mode expectations.',\n ]);\n}\n\nexport function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n printDebugBanner([\n `[DEBUG MODE] expectation failed: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n resolvedCwd.expectedResult === 'accepted'\n ? 'The model answer was rejected by the judge.'\n : 'The failing model answer was accepted by the judge.',\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","_ref","_modelAnswerDirs$","_yield$Promise$all","_yield$Promise$all2","modelAnswerDirs","failingModelAnswerDirs","scriptName","exampleAnswer","w","_context","n","a","cwds","cwd","expectedResult","isDebugMode","Promise","all","findModelAnswerDirs","findFailingModelAnswerDirs","v","_slicedToArray","length","Error","concat","path","join","MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME","getInvokedScriptName","relative","printDebugBanner","_toConsumableArray","map","dir","apply","this","arguments","scriptPath","process","argv","basename","resolvedCwd","relativeCwd","_x","_x2"],"mappings":"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"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
+
export type ExpectedJudgeResult = 'accepted' | 'rejected';
|
|
2
|
+
export interface ResolvedCwd {
|
|
3
|
+
cwd: string;
|
|
4
|
+
expectedResult: ExpectedJudgeResult;
|
|
5
|
+
}
|
|
1
6
|
export interface ResolvedCwds {
|
|
2
|
-
cwds: readonly
|
|
7
|
+
cwds: readonly ResolvedCwd[];
|
|
3
8
|
isDebugMode: boolean;
|
|
4
9
|
}
|
|
5
10
|
/**
|
|
6
11
|
* Resolve which working directories to judge.
|
|
7
12
|
*
|
|
8
13
|
* - If `cwdArg` is provided, use it as the single cwd.
|
|
9
|
-
* - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and
|
|
14
|
+
* - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and
|
|
15
|
+
* `<problemDir>/model_answers.fails/*` and judge each.
|
|
10
16
|
* A prominent banner is printed so users can tell at a glance that this is a debug run.
|
|
11
17
|
*
|
|
12
18
|
* @throws if `cwdArg` is missing and no model answer directories are found.
|
|
@@ -16,4 +22,5 @@ export declare function resolveCwds(problemDir: string, cwdArg: string | undefin
|
|
|
16
22
|
* Print a per-cwd banner shown before judging each model answer in debug mode.
|
|
17
23
|
* Includes the command for re-running this single cwd.
|
|
18
24
|
*/
|
|
19
|
-
export declare function printDebugCwdBanner(problemDir: string,
|
|
25
|
+
export declare function printDebugCwdBanner(problemDir: string, resolvedCwd: ResolvedCwd): void;
|
|
26
|
+
export declare function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asyncToGenerator as
|
|
1
|
+
import{asyncToGenerator as e,regenerator as n,toConsumableArray as t,slicedToArray as a}from"../_virtual/_rollupPluginBabelHelpers.js";import c from"node:path";import{MODEL_ANSWERS_DIRNAME as r,FAILING_MODEL_ANSWERS_DIRNAME as o,findModelAnswerDirs as s,findFailingModelAnswerDirs as i}from"./findModelAnswerDirs.js";import{printDebugBanner as u}from"./printDebugBanner.js";function d(e,n){return l.apply(this,arguments)}function l(){return(l=e(n().m(function e(d,l){var p,m,g,f,b,h,j,v;return n().w(function(e){for(;;)switch(e.n){case 0:if(!l){e.n=1;break}return e.a(2,{cwds:[{cwd:l,expectedResult:"accepted"}],isDebugMode:!1});case 1:return e.n=2,Promise.all([s(d),i(d)]);case 2:if(g=e.v,f=a(g,2),b=f[0],h=f[1],0!==b.length||0!==h.length){e.n=3;break}throw new Error("cwd argument required (no model answer directories found in ".concat(c.join(d,r)," or ").concat(c.join(d,o),")"));case 3:return j=w(),v=c.relative(d,null!=(p=null!=(m=b[0])?m:h[0])?p:"")||"<model_answer>",u(["[DEBUG MODE] cwd not provided -- judging against all model answers","","Problem dir : ".concat(d),"Model answers (".concat(b.length,"):")].concat(t(b.map(function(e){return" - ".concat(c.relative(d,e))})),["Failing model answers (".concat(h.length,"):")],t(h.map(function(e){return" - ".concat(c.relative(d,e))})),["","To judge a single cwd (e.g., a user submission), pass it as the first argument:"," bun ".concat(j," <cwd> [params-json]"),"For example:"," bun ".concat(j," ").concat(v)," bun ".concat(j," ").concat(v,' \'{"language":"python"}\'')])),e.a(2,{cwds:[].concat(t(b.map(function(e){return{cwd:e,expectedResult:"accepted"}})),t(h.map(function(e){return{cwd:e,expectedResult:"rejected"}}))),isDebugMode:!0})}},e)}))).apply(this,arguments)}function p(e,n){var t=c.relative(e,n.cwd)||n.cwd,a=w();u(["[DEBUG MODE] judging: ".concat(t),"Expected result: ".concat(n.expectedResult),"","To judge only this cwd as a normal submission:"," bun ".concat(a," ").concat(t),"Run without a cwd to check debug-mode expectations."])}function m(e,n){var t=c.relative(e,n.cwd)||n.cwd;u(["[DEBUG MODE] expectation failed: ".concat(t),"Expected result: ".concat(n.expectedResult),"accepted"===n.expectedResult?"The model answer was rejected by the judge.":"The failing model answer was accepted by the judge."])}function w(){var e=process.argv[1];return e?c.basename(e):"judge.ts"}export{p as printDebugCwdBanner,m as printDebugExpectationFailureBanner,d as resolveCwds};
|
|
2
2
|
//# sourceMappingURL=resolveCwds.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveCwds.js","sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {
|
|
1
|
+
{"version":3,"file":"resolveCwds.js","sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n FAILING_MODEL_ANSWERS_DIRNAME,\n MODEL_ANSWERS_DIRNAME,\n findFailingModelAnswerDirs,\n findModelAnswerDirs,\n} from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport type ExpectedJudgeResult = 'accepted' | 'rejected';\n\nexport interface ResolvedCwd {\n cwd: string;\n expectedResult: ExpectedJudgeResult;\n}\n\nexport interface ResolvedCwds {\n cwds: readonly ResolvedCwd[];\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\n * `<problemDir>/model_answers.fails/*` 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: [{ cwd: cwdArg, expectedResult: 'accepted' }], isDebugMode: false };\n\n const [modelAnswerDirs, failingModelAnswerDirs] = await Promise.all([\n findModelAnswerDirs(problemDir),\n findFailingModelAnswerDirs(problemDir),\n ]);\n if (modelAnswerDirs.length === 0 && failingModelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, MODEL_ANSWERS_DIRNAME)} or ${path.join(problemDir, FAILING_MODEL_ANSWERS_DIRNAME)})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer =\n path.relative(problemDir, modelAnswerDirs[0] ?? failingModelAnswerDirs[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 `Failing model answers (${failingModelAnswerDirs.length}):`,\n ...failingModelAnswerDirs.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 {\n cwds: [\n ...modelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'accepted' as const })),\n ...failingModelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'rejected' as const })),\n ],\n isDebugMode: true,\n };\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, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n '',\n 'To judge only this cwd as a normal submission:',\n ` bun ${scriptName} ${relativeCwd}`,\n 'Run without a cwd to check debug-mode expectations.',\n ]);\n}\n\nexport function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n printDebugBanner([\n `[DEBUG MODE] expectation failed: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n resolvedCwd.expectedResult === 'accepted'\n ? 'The model answer was rejected by the judge.'\n : 'The failing model answer was accepted by the judge.',\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","_ref","_modelAnswerDirs$","_yield$Promise$all","_yield$Promise$all2","modelAnswerDirs","failingModelAnswerDirs","scriptName","exampleAnswer","w","_context","n","a","cwds","cwd","expectedResult","isDebugMode","Promise","all","findModelAnswerDirs","findFailingModelAnswerDirs","v","_slicedToArray","length","Error","concat","path","join","MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME","getInvokedScriptName","relative","printDebugBanner","_toConsumableArray","map","dir","printDebugCwdBanner","resolvedCwd","relativeCwd","printDebugExpectationFailureBanner","scriptPath","process","argv","basename"],"mappings":"sXAgCA,SAAsBA,EAAWC,EAAAC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAyCjC,SAAAH,IAFC,OAEDA,EAAAI,EAAAC,IAAAC,EAzCO,SAAAC,EAA2BC,EAAoBC,GAA0B,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAZ,IAAAa,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,IAC1EX,EAAM,CAAAU,EAAAC,EAAA,EAAA,KAAA,CAAA,OAAAD,EAAAE,EAAA,EAAS,CAAEC,KAAM,CAAC,CAAEC,IAAKd,EAAQe,eAAgB,aAAeC,aAAa,IAAO,KAAA,EAAA,OAAAN,EAAAC,EAAA,EAEtCM,QAAQC,IAAI,CAClEC,EAAoBpB,GACpBqB,EAA2BrB,KAC3B,KAAA,EAH4C,GAG5CI,EAAAO,EAAAW,EAAAjB,EAAAkB,EAAAnB,EAAA,GAHKE,EAAeD,EAAA,GAAEE,EAAsBF,EAAA,GAIf,IAA3BC,EAAgBkB,QAAkD,IAAlCjB,EAAuBiB,OAAY,CAAAb,EAAAC,EAAA,EAAA,KAAA,CAAA,MAC/D,IAAIa,MAAK,+DAAAC,OACkDC,EAAKC,KAAK5B,EAAY6B,GAAsB,QAAAH,OAAOC,EAAKC,KAAK5B,EAAY8B,GAA8B,MACvK,KAAA,EAoBA,OAjBGtB,EAAauB,IACbtB,EACJkB,EAAKK,SAAShC,EAA2D,OAAjDE,EAAoB,OAApBC,EAAEG,EAAgB,IAAEH,EAAII,EAAuB,IAAEL,EAAI,KAAO,iBACtF+B,EAAgB,CACd,qEACA,GAAE,iBAAAP,OACe1B,GAAU,kBAAA0B,OACTpB,EAAgBkB,OAAM,OAAAE,OAAAQ,EACrC5B,EAAgB6B,IAAI,SAACC,GAAG,MAAA,OAAAV,OAAYC,EAAKK,SAAShC,EAAYoC,GAAI,IAAG,CAAA,0BAAAV,OAC9CnB,EAAuBiB,OAAM,OAAAU,EACpD3B,EAAuB4B,IAAI,SAACC,GAAG,MAAA,OAAAV,OAAYC,EAAKK,SAAShC,EAAYoC,GAAI,IAAG,CAC/E,GACA,kFAAiF,SAAAV,OACxElB,EAAU,wBACnB,eAAc,SAAAkB,OACLlB,EAAU,KAAAkB,OAAIjB,GAAa,SAAAiB,OAC3BlB,EAAU,KAAAkB,OAAIjB,EAAa,iCACnCE,EAAAE,EAAA,EAEI,CACLC,KAAI,GAAAY,OAAAQ,EACC5B,EAAgB6B,IAAI,SAACpB,GAAG,MAAM,CAAEA,IAAAA,EAAKC,eAAgB,WAAqB,IAAEkB,EAC5E3B,EAAuB4B,IAAI,SAACpB,GAAG,MAAM,CAAEA,IAAAA,EAAKC,eAAgB,WAAqB,KAEtFC,aAAa,IACd,EAAAlB,EAAA,KACFN,MAAAC,KAAAC,UAAA,CAMM,SAAS0C,EAAoBrC,EAAoBsC,GACtD,IAAMC,EAAcZ,EAAKK,SAAShC,EAAYsC,EAAYvB,MAAQuB,EAAYvB,IACxEP,EAAauB,IACnBE,EAAiB,CAAA,yBAAAP,OACUa,GAAW,oBAAAb,OAChBY,EAAYtB,gBAChC,GACA,iDAAgD,SAAAU,OACvClB,EAAU,KAAAkB,OAAIa,GACvB,uDAEJ,CAEO,SAASC,EAAmCxC,EAAoBsC,GACrE,IAAMC,EAAcZ,EAAKK,SAAShC,EAAYsC,EAAYvB,MAAQuB,EAAYvB,IAC9EkB,EAAiB,qCAAAP,OACqBa,GAAW,oBAAAb,OAC3BY,EAAYtB,gBACD,aAA/BsB,EAAYtB,eACR,8CACA,uDAER,CAEA,SAASe,IACP,IAAMU,EAAaC,QAAQC,KAAK,GAChC,OAAOF,EAAad,EAAKiB,SAASH,GAAc,UAClD"}
|
package/dist/presets/command.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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"),
|
|
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"),a=require("../helpers/findLanguageDefinitionByPath.cjs"),u=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,a,u,d,c,l,p,C,f;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:a=t.v,u=a.cwds,d=a.isDebugMode,c=e.createForOfIteratorHelper(u),t.p=2,c.s();case 3:if((l=c.n()).done){t.n=6;break}return p=l.value,d&&m.printDebugCwdBanner(r,p),t.n=4,I(r,p.cwd,i,n);case 4:C=t.v,d&&!v(p,C)&&(process.exitCode=1,m.printDebugExpectationFailureBanner(r,p));case 5:t.n=3;break;case 6:t.n=8;break;case 7:t.p=7,f=t.v,c.e(f);case 8:return t.p=8,c.f(),t.f(8);case 9:return t.a(2)}},t,null,[[2,7,8,9]])}))).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,v,S,L,O,k,_,w,M,P,x,F,B,j,q,A,U,N,W,z,G,X,H,Q,Y,Z,J,V,K,$,ee,te,re,ne,se,ie,ae,ue,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:b)(r);case 2:return w=t.v,M=null!=(g=null==(h=w[0])?void 0:h.id)?g:"prebuild",P={buildTimeoutSeconds:null!=(I=null==(y=m.limits)?void 0:y.buildTimeoutSeconds)?I:10,maxOutputLength:null!=(v=null==(S=m.limits)?void 0:S.maxOutputLength)?v:5e4},x=null!=(L=m.runTimeoutSeconds)?L:2,t.n=3,u.judgeByStaticAnalysis(o,_);case 3:if(!(F=t.v)){t.n=4;break}return d.printTestCaseResult(e.objectSpread2({testCaseId:M},F)),t.a(2,{allAccepted:!1});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:M,decisionCode:f.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(p.language?": language: ".concat(p.language):"")}),t.a(2,{allAccepted:!1});case 6:if(j=a.findLanguageDefinitionByPath(B)){t.n=7;break}return d.printTestCaseResult({testCaseId:M,decisionCode:f.DecisionCode.WRONG_ANSWER,stderr:"unsupported language"}),t.a(2,{allAccepted:!1});case 7:if(q=e.objectSpread2(e.objectSpread2({},process.env),{},{CI:"",FORCE_COLOR:"0"}),A=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:(U=t.v)&&(A=U),t.n=12;break;case 11:return t.p=11,oe=t.v,d.printTestCaseResult({testCaseId:M,decisionCode:f.DecisionCode.BUILD_ERROR,stderr:oe instanceof Error?oe.message:String(oe)}),t.a(2,{allAccepted:!1});case 12:if(!(N=null==(O=j.buildCommand)?void 0:O.call(j,A))){t.n=13;break}if(!(W=E(N,{cwd:o,env:q,testCaseId:M,limits:P}))){t.n=13;break}return d.printTestCaseResult(W),t.a(2,{allAccepted:!1});case 13:return t.n=14,n.snapshotWorkingDirectory(o);case 14:if(z=t.v,0!==w.length){t.n=15;break}return d.printTestCaseResult({testCaseId:"default",decisionCode:f.DecisionCode.ACCEPTED}),t.a(2,{allAccepted:!0});case 15:G=null==(k=w.shared)?void 0:k.fileInputPath,X=e.createForOfIteratorHelper(w),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:x,K=j.command(A),$=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=T(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:R(ce)}),t.n=27,n.cleanWorkingDirectory(o,z);case 27:return t.a(2,{allAccepted:!1});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=D({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:(ae=t.v)&&(se={decisionCode:null!=(ue=ae.decisionCode)?ue:ne.decisionCode,feedbackMarkdown:ae.feedbackMarkdown,stderr:ae.stderr}),t.n=33;break;case 32:t.p=32,le=t.v,se={decisionCode:f.DecisionCode.RUNTIME_ERROR,stderr:R(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,{allAccepted:!1});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,{allAccepted:!0})}},t,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function v(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function E(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 R(e){return e instanceof Error?e.message:String(e)}function b(e){return S.apply(this,arguments)}function S(){return(S=e.asyncToGenerator(e.regenerator().m(function r(n){var s,i,a;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,a=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(a,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,a)}},r)}))).apply(this,arguments)}function T(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 D(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 { 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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"}
|
|
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 {\n printDebugCwdBanner,\n printDebugExpectationFailureBanner,\n resolveCwds,\n type ResolvedCwd,\n} 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 resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase>(problemDir, resolvedCwd.cwd, params, options);\n if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n process.exitCode = 1;\n printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n }\n }\n}\n\nasync function runCommandJudgeForCwd<TTestCase extends BaseCommandTestCase>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<{ allAccepted: boolean }> {\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 { allAccepted: false };\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 { allAccepted: false };\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 { allAccepted: false };\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 { allAccepted: false };\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 { allAccepted: false };\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return { allAccepted: true };\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 { allAccepted: false };\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 { allAccepted: false };\n }\n\n return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\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","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","exitCode","printDebugExpectationFailureBanner","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","allAccepted","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","expectedResult","_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":"qtBA6BMA,EAAoBC,EAAAA,EAAEC,OAAO,CACjCC,SAAUF,EAAAA,EAAEG,MAAM,CAACH,EAAAA,EAAEI,SAAUJ,IAAEK,MAAML,EAAAA,EAAEI,YAAYE,aAyGtD,SAAAC,IAAA,OAAAA,EAAAC,EAAAA,iBAAAC,gBAAAC,EAjBM,SAAAC,EACLC,EACAC,GAA6C,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAd,gBAAAe,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAGM,OAD7Cb,EAAOc,EAAAA,UAAUC,QAAQC,MACzBf,EAAShB,EAAkBgC,MAAMjB,EAAKC,QAAOU,EAAAE,EAAA,EAEfK,cAAYpB,EAAYE,EAAKmB,KAAI,KAAA,EAAAjB,EAAAS,EAAAS,EAA7DjB,EAAID,EAAJC,KAAMC,EAAWF,EAAXE,YAAWC,EAAAgB,EAAAA,0BAEClB,GAAIQ,EAAAC,EAAA,EAAAP,EAAAiB,IAAA,KAAA,EAAA,IAAAhB,EAAAD,EAAAQ,KAAAU,KAAA,CAAAZ,EAAAE,EAAA,EAAA,KAAA,CACkC,OADrDN,EAAWD,EAAAkB,MAChBpB,GAAaqB,EAAAA,oBAAoB3B,EAAYS,GAAaI,EAAAE,EAAA,EACzCa,EAAiC5B,EAAYS,EAAYY,IAAKlB,EAAQF,GAAQ,KAAA,EAA7FS,EAAMG,EAAAS,EACRhB,IAAgBuB,EAAsBpB,EAAaC,KACrDO,QAAQa,SAAW,EACnBC,EAAAA,mCAAmC/B,EAAYS,IAChD,KAAA,EAAAI,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAC,EAAA,EAAAH,EAAAE,EAAAS,EAAAf,EAAAyB,EAAArB,GAAA,KAAA,EAAA,OAAAE,EAAAC,EAAA,EAAAP,EAAA0B,IAAApB,EAAAoB,EAAA,GAAA,KAAA,EAAA,OAAApB,EAAAqB,EAAA,GAAA,EAAAnC,EAAA,KAAA,CAAA,CAAA,EAAA,EAAA,EAAA,IAAA,KAEJoC,MAAAC,KAAAC,UAAA,CAAA,SAEcT,EAAqBU,EAAAC,EAAAC,EAAAC,GAAA,OAAAC,EAAAP,MAAAC,KAAAC,UAAA,CAAA,SAAAK,IA4KnC,OA5KmCA,EAAA9C,EAAAA,iBAAAC,EAAAA,cAAAC,EAApC,SAAA6C,EACE3C,EACAqB,EACAlB,EACAF,GAA6C,IAAA2C,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAA,OAAA7F,gBAAAe,EAAA,SAAA+E,GAAA,cAAAA,EAAA7E,EAAA6E,EAAA5E,GAAA,KAAA,EAAA,OAAA4E,EAAA5E,EAAA,EAEJ6E,EAAAA,+BAA+B5F,GAAW,KAAA,EAAnD,OAA1BsD,EAA0BqC,EAAArE,EAAAqE,EAAA5E,EAAA,GACc,OAAtB6B,EAAC3C,EAAQ4F,eAAajD,EAAIkD,GAAsB9F,GAAW,KAAA,EAMC,OAN9EuD,EAASoC,EAAArE,EACTkC,EAAqC,OAAnBX,EAAe,OAAfC,EAAGS,EAAU,SAAE,EAAZT,EAAciD,IAAElD,EAAI,WACzCY,EAAS,CACbuC,oBAAwD,OAArCjD,EAAgB,OAAhBC,EAAE/C,EAAQwD,aAAM,EAAdT,EAAgBgD,qBAAmBjD,EA1H9B,GA2H1BkD,gBAAgD,OAAjChD,EAAgB,OAAhBC,EAAEjD,EAAQwD,aAAM,EAAdP,EAAgB+C,iBAAehD,EAzH1B,KA2HlBS,EAA6C,OAA5BP,EAAGlD,EAAQyD,mBAAiBP,EA5Hf,EA4HgDwC,EAAA5E,EAAA,EAEjDmF,EAAAA,sBAAsB7E,EAAKiC,GAA2B,KAAA,EAA/D,KAApBK,EAAoBgC,EAAArE,GACF,CAAAqE,EAAA5E,EAAA,EAAA,KAAA,CAC2D,OAAjFoF,EAAAA,oBAAmBC,EAAAA,cAAA,CAAGC,WAAY7C,GAAuBG,IAAwBgC,EAAAzD,EAAA,EAC1E,CAAEoE,aAAa,IAAO,KAAA,EAAA,OAAAX,EAAA5E,EAAA,EAGIwF,qBAAmBlF,EAAKlB,EAAOb,UAAS,KAAA,EAAjD,GAApBsE,EAAoB+B,EAAArE,EACD,CAAAqE,EAAA5E,EAAA,EAAA,KAAA,CAKpB,OAJHoF,sBAAoB,CAClBE,WAAY7C,EACZgD,aAAcC,EAAAA,aAAaC,uCAC3BC,OAAM,sBAAAC,OAAwBzG,EAAOb,SAAQ,eAAAsH,OAAkBzG,EAAOb,UAAa,MAClFqG,EAAAzD,EAAA,EACI,CAAEoE,aAAa,IAAO,KAAA,EAG8C,GAAvEzC,EAAqBgD,EAAAA,6BAA6BjD,GACjC,CAAA+B,EAAA5E,EAAA,EAAA,KAAA,CAKlB,OAJHoF,sBAAoB,CAClBE,WAAY7C,EACZgD,aAAcC,EAAAA,aAAaK,aAC3BH,OAAQ,yBACPhB,EAAAzD,EAAA,EACI,CAAEoE,aAAa,IAAO,KAAA,EAMQ,GAFjCxC,EAAGsC,EAAAA,cAAAA,gBAAA,CAAA,EAAQnF,QAAQ6C,KAAG,GAAA,CAAEiD,GAAI,GAAIC,YAAa,MAE/CjD,EAAeH,GACfC,EAAmBoD,SAAQ,CAAAtB,EAAA5E,EAAA,GAAA,KAAA,CAAA,OAAA4E,EAAA7E,EAAA,EAAA6E,EAAA5E,EAAA,EAErB8C,EAAmBoD,SAAS5F,GAAI,KAAA,EAAA,OAAAsE,EAAA5E,EAAA,GACHwF,qBAAmBlF,EAAKlB,EAAOb,UAAS,KAAA,IAArE0E,EAAoB2B,EAAArE,KACAyC,EAAeC,GAAqB2B,EAAA5E,EAAA,GAAA,MAAA,KAAA,GAM3D,OAN2D4E,EAAA7E,EAAA,GAAAwE,GAAAK,EAAArE,EAE9D6E,sBAAoB,CAClBE,WAAY7C,EACZgD,aAAcC,EAAAA,aAAaS,YAC3BP,OAAQrB,cAAiB6B,MAAQ7B,GAAM8B,QAAUC,OAAM/B,MACtDK,EAAAzD,EAAA,EACI,CAAEoE,aAAa,IAAO,KAAA,GAImC,KAA9DrC,EAA8C,OAAlCb,EAAGS,EAAmBI,mBAAY,EAA/Bb,EAAAkE,KAAAzD,EAAkCE,IACvC,CAAA4B,EAAA5E,EAAA,GAAA,KAAA,CAMZ,KALImD,EAAcqD,EAAStD,EAAc,CACzC5C,IAAAA,EACAyC,IAAAA,EACAuC,WAAY7C,EACZC,OAAAA,KAEa,CAAAkC,EAAA5E,EAAA,GAAA,KAAA,CACoB,OAAjCoF,EAAAA,oBAAoBjC,GAAayB,EAAAzD,EAAA,EAC1B,CAAEoE,aAAa,IAAO,KAAA,GAAA,OAAAX,EAAA5E,EAAA,GAIPyG,EAAAA,yBAAyBnG,GAAI,KAAA,GAAtC,GAAX8C,EAAWwB,EAAArE,EAEQ,IAArBiC,EAAUkE,OAAY,CAAA9B,EAAA5E,EAAA,GAAA,KAAA,CAC4D,OAApFoF,sBAAoB,CAAEE,WAAY,UAAWG,aAAcC,EAAAA,aAAaiB,WAAY/B,EAAAzD,EAAA,EAC7E,CAAEoE,aAAa,IAAM,KAAA,GAGxBlC,EAAmF,OAAhEf,EAAIE,EAAsDoE,aAAM,EAA7DtE,EAA+DuE,cAAavD,EAAA9C,EAAAA,0BAEjFgC,GAASoC,EAAA7E,EAAA,GAAAuD,EAAA7C,IAAA,KAAA,GAAA,IAAA8C,EAAAD,EAAAtD,KAAAU,KAAA,CAAAkE,EAAA5E,EAAA,GAAA,KAAA,CAAb,GAAR2D,EAAQJ,EAAA5C,OACb0C,EAAmB,CAAAuB,EAAA5E,EAAA,GAAA,KAAA,CAAA,OAAA4E,EAAA5E,EAAA,GAAQ8G,EAAAA,sBAAsBzD,EAAqB/C,GAAI,KAAA,GAAA,IAC1EqD,EAASkD,cAAa,CAAAjC,EAAA5E,EAAA,GAAA,KAAA,CAAA,OAAA4E,EAAA5E,EAAA,GAAQ8G,wBAAsBnD,EAASkD,cAAevG,GAAI,KAAA,GASrD,GAPzBsD,EAC8C,iBAA3CrB,EAA2BwE,YAC9BxE,EAA2BwE,YAAc,IACzCpE,EAEAkB,EAAUf,EAAmBe,QAAQb,GACvCc,EAAsB,OAAjBN,EAAGG,EAASqD,OAAKxD,EAAI,GAC1BO,QAA2B,EAAAa,EAAA7E,EAAA,IAEzBb,EAAQ+H,aAAY,CAAArC,EAAA5E,EAAA,GAAA,KAAA,CAAA,OAAA4E,EAAA5E,EAAA,GACRd,EAAQ+H,aAAa,CAAEtD,SAAAA,EAAUrD,IAAAA,EAAKyC,IAAAA,IAAM,KAAA,GAA1De,EAAKc,EAAArE,EAAA,KAAA,GAAA,IAGKrB,EAAQgI,WAAU,CAAAtC,EAAA5E,EAAA,GAAA,KAAA,CAAA,OAAA4E,EAAA5E,EAAA,GACpBd,EAAQgI,WAAW,CACvBvD,SAAAA,EACAE,QAAAA,EACAC,MAAAA,EACAxD,IAAAA,EACAyC,IAAAA,EACAa,iBAAAA,IACA,KAAA,GAAAY,GAAAI,EAAArE,EAAAqE,EAAA5E,EAAA,GAAA,MAAA,KAAA,GAAAwE,GACF0C,EAAWrD,EAAS,CAClBC,MAAAA,EACAxD,IAAAA,EACAyC,IAAAA,EACAa,iBAAAA,IACA,KAAA,GAdNG,GAASS,GAAAI,EAAA5E,EAAA,GAAA,MAAA,KAAA,GAqBN,OArBM4E,EAAA7E,EAAA,GAAA0E,GAAAG,EAAArE,EAgBT6E,sBAAoB,CAClBE,WAAY3B,EAASqB,GACrBS,aAAcC,EAAAA,aAAayB,cAC3BrD,MAAAA,EACA8B,OAAQwB,EAAc3C,MACrBG,EAAA5E,EAAA,GACGqH,EAAAA,sBAAsB/G,EAAK8C,GAAY,KAAA,GAAA,OAAAwB,EAAAzD,EAAA,EACtC,CAAEoE,aAAa,IAAO,KAAA,GAAA,OAAAX,EAAA5E,EAAA,GAGLsH,EAAAA,gBAAgBhH,EAAuD,OAApDmD,EAAElB,EAA2BgF,yBAAuB9D,EAAI,IAAG,KAAA,GAUvE,GAV3BO,GAAWY,EAAArE,EACX0D,GAAoC,CACxCL,iBAAAA,EACA4D,kBAAmB9E,EAAOwC,gBAC1B3C,2BAA4B,CAC1BkF,gBAAiBlF,EAA2BkF,gBAC5CF,wBAAyBhF,EAA2BgF,0BAGlDrD,GAAkBwD,EAAiB,CAAE3D,UAAAA,GAAWC,YAAAA,GAAa2D,QAAS1D,KACxEE,GAAcD,GACdA,GAAgBuB,eAAiBC,EAAAA,aAAaiB,SAAQ,CAAA/B,EAAA5E,EAAA,GAAA,KAAA,CAAA,OAAA4E,EAAA7E,EAAA,GAAA6E,EAAA5E,EAAA,GAER,OAFQoE,GAEpBlF,EAAQ0I,aAARxD,GAAAmC,KAAArH,EAAe,CAAEyE,SAAAA,EAAUI,UAAAA,GAAWC,YAAAA,GAAa2D,QAAS1D,KAAe,KAAA,IAAvGI,GAAmBO,EAAArE,KAEvB4D,GAAc,CACZsB,aAA8C,OAAlCnB,GAAED,GAAoBoB,cAAYnB,GAAIJ,GAAgBuB,aAClEoC,iBAAkBxD,GAAoBwD,iBACtCjC,OAAQvB,GAAoBuB,SAE/BhB,EAAA5E,EAAA,GAAA,MAAA,KAAA,GAAA4E,EAAA7E,EAAA,GAAA2E,GAAAE,EAAArE,EAED4D,GAAc,CACZsB,aAAcC,EAAAA,aAAayB,cAC3BvB,OAAQwB,EAAc1C,KACtB,KAAA,GAcH,OAVHU,EAAAA,oBAAmBC,EAAAA,cAAAA,gBAAA,CACjBC,WAAY3B,EAASqB,IAClBb,IAAW,GAAA,CACd2D,WAAY/D,GAAUgE,OACtBjE,MAAOC,GAAUD,MACjBkE,OAAQjE,GAAUiE,OAAOC,MAAM,EAAGvF,EAAOwC,uBAAoBgD,EAC7DtC,QAA2B,OAAnBlC,EAACS,GAAYyB,QAAMlC,EAAIK,GAAU6B,QAAQqC,MAAM,EAAGvF,EAAOwC,uBAAoBgD,EACrFC,YAAapE,GAAUoE,YACvBC,YAAarE,GAAUqE,YACvBpE,YAAaA,GAAY0C,OAAS,EAAI1C,QAAckE,KACnDtD,EAAA5E,EAAA,GAEGqH,EAAAA,sBAAsB/G,EAAK8C,GAAY,KAAA,GAAA,GACzCe,GAAYsB,eAAiBC,EAAAA,aAAaiB,SAAQ,CAAA/B,EAAA5E,EAAA,GAAA,KAAA,CAAA,OAAA4E,EAAAzD,EAAA,EAAS,CAAEoE,aAAa,IAAO,KAAA,GAAAX,EAAA5E,EAAA,GAAA,MAAA,KAAA,GAAA4E,EAAA5E,EAAA,GAAA,MAAA,KAAA,GAAA4E,EAAA7E,EAAA,GAAA4E,GAAAC,EAAArE,EAAA+C,EAAArC,EAAA0D,IAAA,KAAA,GAAA,OAAAC,EAAA7E,EAAA,GAAAuD,EAAApC,IAAA0D,EAAA1D,EAAA,IAAA,KAAA,GAAA,OAAA0D,EAAAzD,EAAA,EAGhF,CAAEoE,aAAa,IAAM,EAAA3D,EAAA,KAAA,CAAA,CAAA,GAAA,IAAA,CAAA,GAAA,IAAA,CAAA,GAAA,GAAA,GAAA,IAAA,CAAA,EAAA,KAAA,KAC7BR,MAAAC,KAAAC,UAAA,CAED,SAASR,EAAsBpB,EAA0BC,GACvD,OAAOA,EAAO4F,eAAgD,aAA/B7F,EAAY2I,eAC7C,CAEA,SAAS7B,EACPtD,EACAyE,GAC2E,IAAAW,EACrEC,EAAcC,EAAAA,qBAClBtF,EAAa,GACbA,EAAa+E,MAAM,GACnB,CAAE3H,IAAKqH,EAAQrH,IAAKmI,SAAU,OAAQ1F,IAAK4E,EAAQ5E,KACnD4E,EAAQjF,OAAOuC,qBAEX6C,EAA+B,OAArBQ,EAAGC,EAAYR,QAAMO,OAAIJ,EAEzC,OAA2B,IAAvBK,EAAYR,OACP,CACLzC,WAAYqC,EAAQrC,WACpBG,aAAcC,EAAAA,aAAaS,YAC3B2B,WAAAA,EACAE,OAAQO,EAAYP,OAAOC,MAAM,EAAGN,EAAQjF,OAAOwC,iBACnDU,OAAQ2C,EAAY3C,OAAOqC,MAAM,EAAGN,EAAQjF,OAAOwC,iBACnDiD,YAAaI,EAAYJ,YACzBC,YAAaG,EAAYH,aAIzBG,EAAYJ,YAAcR,EAAQjF,OAAOuC,oBACpC,CACLK,WAAYqC,EAAQrC,WACpBG,aAAcC,EAAAA,aAAagD,0BAC3BZ,WAAAA,EACAE,OAAQO,EAAYP,OAAOC,MAAM,EAAGN,EAAQjF,OAAOwC,iBACnDU,OAAQ2C,EAAY3C,OAAOqC,MAAM,EAAGN,EAAQjF,OAAOwC,iBACnDiD,YAAaI,EAAYJ,YACzBC,YAAaG,EAAYH,aAK3BG,EAAYP,OAAOtB,OAASiB,EAAQjF,OAAOwC,iBAC3CqD,EAAY3C,OAAOc,OAASiB,EAAQjF,OAAOwC,gBAEpC,CACLI,WAAYqC,EAAQrC,WACpBG,aAAcC,EAAAA,aAAaiD,iCAC3Bb,WAAAA,EACAE,OAAQO,EAAYP,OAAOC,MAAM,EAAGN,EAAQjF,OAAOwC,iBACnDU,OAAQ2C,EAAY3C,OAAOqC,MAAM,EAAGN,EAAQjF,OAAOwC,iBACnDiD,YAAaI,EAAYJ,YACzBC,YAAaG,EAAYH,kBAX7B,CAgBF,CAEA,SAAShB,EAAewB,GACtB,OAAOA,aAAiBxC,MAAQwC,EAAMvC,QAAUC,OAAOsC,EACzD,CAUC,SAEc7D,EAAoB8D,GAAA,OAAAC,EAAA1H,MAAAC,KAAAC,UAAA,CAAA,SAAAwH,IASlC,OATkCA,EAAAjK,EAAAA,iBAAAC,EAAAA,cAAAC,EAAnC,SAAAgK,EACE9J,GAAkB,IAAA+J,EAAAC,EAAAC,EAAA,OAAApK,gBAAAe,EAAA,SAAAsJ,GAAA,cAAAA,EAAAnJ,GAAA,KAAA,EAAA,OAAAmJ,EAAAnJ,EAAA,EAEUoJ,EAAAA,cAAkBC,EAAKC,KAAKrK,EAAY,eAAc,KAAA,EACgB,GAD5FgK,EAAaE,EAAA5I,EACb2I,EAAmBD,EAAcM,IAAI,SAAC5F,GAAQ,MAP7C,CAAEqB,IAPgBrE,EAckDgD,GAPxDqB,GAAIgC,MAAOrG,EAAMqG,MAAOH,cAAelG,EAAMkG,eAPlE,IAA2BlG,CAc2D,GAC5D,OAD0EqI,EAC9FC,EAAcrC,UAAdoC,EAAsBnC,cAAa,CAAAsC,EAAAnJ,EAAA,EAAA,KAAA,CAAA,OAAAmJ,EAAAhI,EAAA,EAC9BqI,OAAOC,OAAOP,EAAkB,CAAEtC,OAAQ,CAAEC,cAAeoC,EAAcrC,OAAOC,kBAAkB,KAAA,EAAA,OAAAsC,EAAAhI,EAAA,EAEpG+H,GAAgB,EAAAH,EAAA,KACxB3H,MAAAC,KAAAC,UAAA,CAED,SAAS4F,EACPrD,EACA8D,GAMkB,IAAA+B,EACZnB,EAAcC,EAAAA,qBAClB3E,EAAQ,GACRA,EAAQoE,MAAM,GACd,CAAE3H,IAAKqH,EAAQrH,IAAKmI,SAAU,OAAQzB,MAAOW,EAAQ7D,MAAOf,IAAK4E,EAAQ5E,KACzE4E,EAAQ/D,kBAGV,MAAO,CACLE,MAAO6D,EAAQ7D,MACfkE,OAAQO,EAAYP,OACpBpC,OAAQ2C,EAAY3C,OACpBmC,OAA0B,OAApB2B,EAAEnB,EAAYR,QAAM2B,OAAIxB,EAC9BC,YAAaI,EAAYJ,YACzBC,YAAaG,EAAYH,YAE7B,CAEA,SAASV,EAAiBC,GAIC,IAAAgC,EAAAC,EAAAC,EACzB,GAAiC,IAA7BlC,EAAQ5D,UAAUgE,OACpB,MAAO,CAAEtC,aAAcC,EAAAA,aAAayB,cAAevB,OAAQ+B,EAAQ5D,UAAU6B,QAG/E,GAAI+B,EAAQ5D,UAAUoE,YAAcR,EAAQA,QAAQ/D,iBAClD,MAAO,CAAE6B,aAAcC,EAAAA,aAAaoE,oBAAqBlE,OAAQ+B,EAAQ5D,UAAU6B,QAGrF,GACE+B,EAAQ5D,UAAUqE,aACyC,OAD9BuB,EAC5BhC,EAAQA,QAAQpF,2BAA2BkF,iBAAekC,EAAII,OAAOC,mBAEtE,MAAO,CAAEvE,aAAcC,EAAAA,aAAauE,sBAAuBrE,OAAQ+B,EAAQ5D,UAAU6B,QAGvF,GACE+B,EAAQ5D,UAAUiE,OAAOtB,OAASiB,EAAQA,QAAQH,mBAClDG,EAAQ5D,UAAU6B,OAAOc,OAASiB,EAAQA,QAAQH,kBAElD,MAAO,CAAE/B,aAAcC,EAAAA,aAAawE,2BAA4BtE,OAAQ+B,EAAQ5D,UAAU6B,QAG5F,IAAMuE,EAAoG,OAA7EP,SAAAC,EAAGlC,EAAQA,QAAQpF,2BAA2BgF,gCAA3CsC,EAAoEnD,QAAMkD,EAAI,EAC9G,OAAIjC,EAAQ3D,YAAY0C,OAASyD,EACxB,CAAE1E,aAAcC,EAAAA,aAAa0E,oCAG/B,CAAE3E,aAAcC,EAAAA,aAAaiB,SACtC,4BA/UA,SAAwC0D,EAAAC,GAAA,OAAA1L,EAAAwC,MAAAC,KAAAC,UAAA"}
|
package/dist/presets/command.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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
|
|
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 a,snapshotWorkingDirectory as u}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as o}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 h}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as C}from"../helpers/readTestCases.js";import{resolveCwds as I,printDebugExpectationFailureBanner as v,printDebugCwdBanner as g}from"../helpers/resolveCwds.js";import{spawnSyncWithTimeout as E}from"../helpers/spawnSyncWithTimeout.js";import{DecisionCode as R}from"../types/decisionCode.js";var b=i.object({language:i.union([i.string(),i.array(i.string())]).optional()});function y(e,t){return L.apply(this,arguments)}function L(){return(L=e(t().m(function e(n,s){var i,a,u,o,d,c,l,p,f,h;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return i=m(process.argv),a=b.parse(i.params),e.n=1,I(n,i.cwd);case 1:u=e.v,o=u.cwds,d=u.isDebugMode,c=r(o),e.p=2,c.s();case 3:if((l=c.n()).done){e.n=6;break}return p=l.value,d&&g(n,p),e.n=4,S(n,p.cwd,a,s);case 4:f=e.v,d&&!k(p,f)&&(process.exitCode=1,v(n,p));case 5:e.n=3;break;case 6:e.n=8;break;case 7:e.p=7,h=e.v,c.e(h);case 8:return e.p=8,c.f(),e.f(8);case 9:return e.a(2)}},e,null,[[2,7,8,9]])}))).apply(this,arguments)}function S(e,t,r,n){return O.apply(this,arguments)}function O(){return(O=e(t().m(function e(s,i,m,C){var I,v,g,E,b,y,L,S,O,k,x,D,B,F,j,A,U,N,X,q,G,W,H,Q,Y,Z,z,V,J,K,$,ee,te,re,ne,se,ie,ae,ue,oe,de,ce,le,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 x=e.v,e.n=2,(null!=(I=C.readTestCases)?I:M)(s);case 2:return D=e.v,B=null!=(v=null==(g=D[0])?void 0:g.id)?v:"prebuild",F={buildTimeoutSeconds:null!=(E=null==(b=C.limits)?void 0:b.buildTimeoutSeconds)?E:10,maxOutputLength:null!=(y=null==(L=C.limits)?void 0:L.maxOutputLength)?y:5e4},j=null!=(S=C.runTimeoutSeconds)?S:2,e.n=3,l(i,x);case 3:if(!(A=e.v)){e.n=4;break}return p(n({testCaseId:B},A)),e.a(2,{allAccepted:!1});case 4:return e.n=5,d(i,m.language);case 5:if(U=e.v){e.n=6;break}return p({testCaseId:B,decisionCode:R.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(m.language?": language: ".concat(m.language):"")}),e.a(2,{allAccepted:!1});case 6:if(N=c(U)){e.n=7;break}return p({testCaseId:B,decisionCode:R.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2,{allAccepted:!1});case 7:if(X=n(n({},process.env),{},{CI:"",FORCE_COLOR:"0"}),q=U,!N.prebuild){e.n=12;break}return e.p=8,e.n=9,N.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,le=e.v,p({testCaseId:B,decisionCode:R.BUILD_ERROR,stderr:le instanceof Error?le.message:String(le)}),e.a(2,{allAccepted:!1});case 12:if(!(W=null==(O=N.buildCommand)?void 0:O.call(N,q))){e.n=13;break}if(!(H=T(W,{cwd:i,env:X,testCaseId:B,limits:F}))){e.n=13;break}return p(H),e.a(2,{allAccepted:!1});case 13:return e.n=14,u(i);case 14:if(Q=e.v,0!==D.length){e.n=15;break}return p({testCaseId:"default",decisionCode:R.ACCEPTED}),e.a(2,{allAccepted:!0});case 15:Y=null==(k=D.shared)?void 0:k.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 x.timeLimitMs?x.timeLimitMs/1e3:j,te=N.command(q),re=null!=(V=$.input)?V:"",ne=void 0,e.p=20,!C.resolveInput){e.n=22;break}return e.n=21,C.resolveInput({testCase:$,cwd:i,env:X});case 21:re=e.v;case 22:if(!C.runCommand){e.n=24;break}return e.n=23,C.runCommand({testCase:$,command:te,stdin:re,cwd:i,env:X,timeLimitSeconds:ee});case 23:me=e.v,e.n=25;break;case 24:me=w(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:R.RUNTIME_ERROR,stdin:re,stderr:_(pe)}),e.n=27,a(i,Q);case 27:return e.a(2,{allAccepted:!1});case 28:return e.n=29,f(i,null!=(J=x.requiredOutputFilePaths)?J:[]);case 29:if(se=e.v,ie={timeLimitSeconds:ee,outputLimitLength:F.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:x.memoryLimitByte,requiredOutputFilePaths:x.requiredOutputFilePaths}},ae=P({runResult:ne,outputFiles:se,context:ie}),ue=ae,ae.decisionCode!==R.ACCEPTED){e.n=33;break}return e.p=30,e.n=31,null==(oe=C.test)?void 0:oe.call(C,{testCase:$,runResult:ne,outputFiles:se,context:ie});case 31:(de=e.v)&&(ue={decisionCode:null!=(ce=de.decisionCode)?ce:ae.decisionCode,feedbackMarkdown:de.feedbackMarkdown,stderr:de.stderr}),e.n=33;break;case 32:e.p=32,fe=e.v,ue={decisionCode:R.RUNTIME_ERROR,stderr:_(fe)};case 33:return p(n(n({testCaseId:$.id},ue),{},{exitStatus:ne.status,stdin:ne.stdin,stdout:ne.stdout.slice(0,F.maxOutputLength)||void 0,stderr:(null!=(K=ue.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,a(i,Q);case 34:if(ue.decisionCode===R.ACCEPTED){e.n=35;break}return e.a(2,{allAccepted:!1});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,{allAccepted:!0})}},e,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function k(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function T(e,t){var r,n=E(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:R.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:R.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:R.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){return e instanceof Error?e.message:String(e)}function M(e){return x.apply(this,arguments)}function x(){return(x=e(t().m(function e(r){var n,i,a;return t().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,C(s.join(r,"test_cases"));case 1:if(i=e.v,a=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(a,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,a)}},e)}))).apply(this,arguments)}function w(e,t){var r,n=E(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 P(e){var t,r,n;if(0!==e.runResult.status)return{decisionCode:R.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:R.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:R.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:R.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:R.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:R.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 { 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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"}
|
|
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 {\n printDebugCwdBanner,\n printDebugExpectationFailureBanner,\n resolveCwds,\n type ResolvedCwd,\n} 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 resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase>(problemDir, resolvedCwd.cwd, params, options);\n if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n process.exitCode = 1;\n printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n }\n }\n}\n\nasync function runCommandJudgeForCwd<TTestCase extends BaseCommandTestCase>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<{ allAccepted: boolean }> {\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 { allAccepted: false };\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 { allAccepted: false };\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 { allAccepted: false };\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 { allAccepted: false };\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 { allAccepted: false };\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return { allAccepted: true };\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 { allAccepted: false };\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 { allAccepted: false };\n }\n\n return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\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","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","exitCode","printDebugExpectationFailureBanner","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","allAccepted","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","expectedResult","_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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exercode/problem-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": ":100: A set of utilities for judging programs on Exercode (https://exercode.willbooster.com/).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"exercode",
|
|
@@ -67,13 +67,13 @@
|
|
|
67
67
|
"@willbooster/oxfmt-config": "1.2.2",
|
|
68
68
|
"@willbooster/oxlint-config": "1.4.6",
|
|
69
69
|
"@willbooster/prettier-config": "10.4.0",
|
|
70
|
-
"@willbooster/wb": "13.12.
|
|
70
|
+
"@willbooster/wb": "13.12.17",
|
|
71
71
|
"build-ts": "17.1.13",
|
|
72
72
|
"conventional-changelog-conventionalcommits": "9.3.1",
|
|
73
73
|
"dotenv-cli": "11.0.0",
|
|
74
74
|
"lefthook": "2.1.6",
|
|
75
|
-
"oxfmt": "0.
|
|
76
|
-
"oxlint": "1.
|
|
75
|
+
"oxfmt": "0.49.0",
|
|
76
|
+
"oxlint": "1.64.0",
|
|
77
77
|
"oxlint-tsgolint": "0.22.1",
|
|
78
78
|
"prettier": "3.8.3",
|
|
79
79
|
"prettier-plugin-java": "2.8.1",
|