@exercode/problem-utils
Advanced tools
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:child_process"),t=require("node:fs"),n=require("node:os"),s=require("node:path"),o=require("../types/decisionCode.cjs"),i=require("../types/testCaseResult.cjs"),a=require("./printDebugBanner.cjs");function c(){return(c=e.asyncToGenerator(e.regenerator().m(function o(i,c,m){var v,b,g,k,E,D,j,C,S,w,_,T,B,A,q,P,x,G;return e.regenerator().w(function(o){for(;;)switch(o.p=o.n){case 0:return o.p=0,o.n=1,t.promises.mkdtemp(s.join(n.tmpdir(),"problem-utils-isolation_"));case 1:return v=o.v,C=s.resolve(i),S=s.join(v,f(C)),o.n=2,t.promises.mkdir(s.dirname(S),{recursive:!0});case 2:return o.n=3,t.promises.cp(C,S,{recursive:!0,filter:u});case 3:return o.n=4,d(v,C);case 4:if(w=s.relative(C,s.resolve(c.cwd)),_=s.join(S,w),!(T=h(C)).startsWith("..")&&!s.isAbsolute(T)){o.n=5;break}return a.printDebugBanner(["[DEBUG MODE] isolated problem directory check skipped","","The invoked judge script is located outside the problem directory.","Script path: ".concat(T)]),o.a(2,{passed:!0});case 5:if(B=process.execArgv.filter(l),A=JSON.stringify(p(m)?m:{}),q=r.spawnSync(process.execPath,[].concat(e.toConsumableArray(B),[T,_,A]),{cwd:S,encoding:"utf8",env:process.env,timeout:3e4}),P=null!=(b=q.stdout)?b:"",x=null!=(g=q.stderr)?g:"",0!==q.status||!y(P)){o.n=6;break}return a.printDebugBanner(["[DEBUG MODE] isolated problem directory check passed","","Copied problem dir : ".concat(S),"Checked cwd : ".concat(w)]),o.a(2,{passed:!0});case 6:return a.printDebugBanner(["[DEBUG MODE] isolated problem directory check failed","","The judge did not complete successfully after copying only the problem directory to a temporary location.","Make sure judge.ts imports only files included in the problem directory.","","Copied problem dir : ".concat(S),"Checked cwd : ".concat(w),"Exit status : ".concat(null!=(k=null!=(E=q.status)?E:q.signal)?k:"unknown"),"Spawn error : ".concat(null!=(D=null==(j=q.error)?void 0:j.message)?D:"<none>"),"","stdout:",P.trimEnd()||"<empty>","","stderr:",x.trimEnd()||"<empty>"]),o.a(2,{passed:!1});case 7:return o.p=7,G=o.v,a.printDebugBanner(["[DEBUG MODE] isolated problem directory check failed due to an unexpected error","",G instanceof Error?G.message:String(G)]),o.a(2,{passed:!1});case 8:if(o.p=8,!v){o.n=12;break}return o.p=9,o.n=10,t.promises.rm(v,{recursive:!0,force:!0});case 10:o.n=12;break;case 11:o.p=11,o.v;case 12:return o.f(8);case 13:return o.a(2)}},o,null,[[9,11],[0,7,8,13]])}))).apply(this,arguments)}function u(e){var r=s.basename(e);return"node_modules"!==r&&".git"!==r}function l(e){return!e.startsWith("--inspect")&&!e.startsWith("--watch")&&!e.startsWith("--hot")}function p(r){return null!=r&&"object"===e.typeof(r)&&!Array.isArray(r)}function d(e,r){return m.apply(this,arguments)}function m(){return(m=e.asyncToGenerator(e.regenerator().m(function r(n,o){var i,a,c,u;return e.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:i=s.resolve(o);case 1:if(a=s.join(i,"node_modules"),!t.existsSync(a)){e.n=5;break}return c=s.join(n,f(i),"node_modules"),e.p=2,e.n=3,t.promises.symlink(a,c,"win32"===process.platform?"junction":"dir");case 3:e.n=5;break;case 4:e.p=4,e.v;case 5:if((u=s.dirname(i))!==i){e.n=6;break}return e.a(3,7);case 6:i=u,e.n=1;break;case 7:return e.a(2)}},r,null,[[2,4]])}))).apply(this,arguments)}function f(e){var r=s.parse(e).root;return s.relative(r,e)}function h(e){var r=process.argv[1];if(!r)return".".concat(s.sep,"judge.ts");var t=s.relative(e,s.resolve(r));return s.isAbsolute(t)||t.startsWith(".")?t:".".concat(s.sep).concat(t)}function y(e){var r=e.split(/\r?\n/).filter(function(e){return e.startsWith(i.TEST_CASE_RESULT_PREFIX)});return 0!==r.length&&r.every(function(e){try{var r=i.testCaseResultSchema.safeParse(JSON.parse(e.slice(i.TEST_CASE_RESULT_PREFIX.length)));return r.success&&r.data.decisionCode===o.DecisionCode.ACCEPTED}catch(e){return!1}})}exports.checkProblemDirIsolation=function(e,r,t){return c.apply(this,arguments)}; | ||
| //# sourceMappingURL=checkProblemDirIsolation.cjs.map |
| {"version":3,"file":"checkProblemDirIsolation.cjs","sources":["../../src/helpers/checkProblemDirIsolation.ts"],"sourcesContent":["import child_process from 'node:child_process';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { DecisionCode } from '../types/decisionCode.js';\nimport { TEST_CASE_RESULT_PREFIX, testCaseResultSchema } from '../types/testCaseResult.js';\n\nimport { printDebugBanner } from './printDebugBanner.js';\nimport type { ResolvedCwd } from './resolveCwds.js';\n\nconst ISOLATION_CHECK_TIMEOUT_MS = 30_000;\n\nexport interface ProblemDirIsolationCheckResult {\n passed: boolean;\n}\n\n/**\n * Check that a judge can run after only the problem directory is copied elsewhere.\n */\nexport async function checkProblemDirIsolation(\n problemDir: string,\n resolvedCwd: ResolvedCwd,\n params: unknown\n): Promise<ProblemDirIsolationCheckResult> {\n let tempRoot: string | undefined;\n try {\n tempRoot = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'problem-utils-isolation_'));\n const absoluteProblemDir = path.resolve(problemDir);\n const copiedProblemDir = path.join(tempRoot, toTempRelativePath(absoluteProblemDir));\n await fs.promises.mkdir(path.dirname(copiedProblemDir), { recursive: true });\n await fs.promises.cp(absoluteProblemDir, copiedProblemDir, {\n recursive: true,\n filter: isCopiedProblemPath,\n });\n await symlinkAllAncestorNodeModules(tempRoot, absoluteProblemDir);\n\n const relativeCwd = path.relative(absoluteProblemDir, path.resolve(resolvedCwd.cwd));\n const copiedCwd = path.join(copiedProblemDir, relativeCwd);\n const scriptPath = getInvokedScriptPath(absoluteProblemDir);\n if (scriptPath.startsWith('..') || path.isAbsolute(scriptPath)) {\n printDebugBanner([\n '[DEBUG MODE] isolated problem directory check skipped',\n '',\n 'The invoked judge script is located outside the problem directory.',\n `Script path: ${scriptPath}`,\n ]);\n return { passed: true };\n }\n const execArgv = process.execArgv.filter(isIsolationExecArg);\n const paramsJson = JSON.stringify(isJudgeParamsObject(params) ? params : {});\n const spawnResult = child_process.spawnSync(process.execPath, [...execArgv, scriptPath, copiedCwd, paramsJson], {\n cwd: copiedProblemDir,\n encoding: 'utf8',\n env: process.env,\n timeout: ISOLATION_CHECK_TIMEOUT_MS,\n });\n const stdout = spawnResult.stdout ?? '';\n const stderr = spawnResult.stderr ?? '';\n\n if (spawnResult.status === 0 && isAcceptedJudgeOutput(stdout)) {\n printDebugBanner([\n '[DEBUG MODE] isolated problem directory check passed',\n '',\n `Copied problem dir : ${copiedProblemDir}`,\n `Checked cwd : ${relativeCwd}`,\n ]);\n return { passed: true };\n }\n\n printDebugBanner([\n '[DEBUG MODE] isolated problem directory check failed',\n '',\n 'The judge did not complete successfully after copying only the problem directory to a temporary location.',\n 'Make sure judge.ts imports only files included in the problem directory.',\n '',\n `Copied problem dir : ${copiedProblemDir}`,\n `Checked cwd : ${relativeCwd}`,\n `Exit status : ${spawnResult.status ?? spawnResult.signal ?? 'unknown'}`,\n `Spawn error : ${spawnResult.error?.message ?? '<none>'}`,\n '',\n 'stdout:',\n stdout.trimEnd() || '<empty>',\n '',\n 'stderr:',\n stderr.trimEnd() || '<empty>',\n ]);\n return { passed: false };\n } catch (error) {\n printDebugBanner([\n '[DEBUG MODE] isolated problem directory check failed due to an unexpected error',\n '',\n error instanceof Error ? error.message : String(error),\n ]);\n return { passed: false };\n } finally {\n if (tempRoot) {\n try {\n await fs.promises.rm(tempRoot, { recursive: true, force: true });\n } catch {\n // Cleanup errors should not mask the primary isolation check result.\n }\n }\n }\n}\n\nfunction isCopiedProblemPath(src: string): boolean {\n const name = path.basename(src);\n return name !== 'node_modules' && name !== '.git';\n}\n\nfunction isIsolationExecArg(arg: string): boolean {\n return !arg.startsWith('--inspect') && !arg.startsWith('--watch') && !arg.startsWith('--hot');\n}\n\nfunction isJudgeParamsObject(params: unknown): params is object {\n return params !== undefined && params !== null && typeof params === 'object' && !Array.isArray(params);\n}\n\nasync function symlinkAllAncestorNodeModules(tempRoot: string, problemDir: string): Promise<void> {\n let currentDir = path.resolve(problemDir);\n while (true) {\n const nodeModulesPath = path.join(currentDir, 'node_modules');\n if (fs.existsSync(nodeModulesPath)) {\n const targetSymlinkPath = path.join(tempRoot, toTempRelativePath(currentDir), 'node_modules');\n try {\n await fs.promises.symlink(\n nodeModulesPath,\n targetSymlinkPath,\n process.platform === 'win32' ? 'junction' : 'dir'\n );\n } catch {\n // Package resolution is best-effort; the isolation check still reports a clear spawn failure if imports break.\n }\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break;\n currentDir = parentDir;\n }\n}\n\nfunction toTempRelativePath(absolutePath: string): string {\n const { root } = path.parse(absolutePath);\n return path.relative(root, absolutePath);\n}\n\nfunction getInvokedScriptPath(problemDir: string): string {\n const scriptPath = process.argv[1];\n if (!scriptPath) return `.${path.sep}judge.ts`;\n const relativeScriptPath = path.relative(problemDir, path.resolve(scriptPath));\n if (path.isAbsolute(relativeScriptPath)) return relativeScriptPath;\n return relativeScriptPath.startsWith('.') ? relativeScriptPath : `.${path.sep}${relativeScriptPath}`;\n}\n\nfunction isAcceptedJudgeOutput(stdout: string): boolean {\n const resultLines = stdout.split(/\\r?\\n/).filter((line) => line.startsWith(TEST_CASE_RESULT_PREFIX));\n if (resultLines.length === 0) return false;\n\n return resultLines.every((line) => {\n try {\n const parsedResult = testCaseResultSchema.safeParse(JSON.parse(line.slice(TEST_CASE_RESULT_PREFIX.length)));\n return parsedResult.success && parsedResult.data.decisionCode === DecisionCode.ACCEPTED;\n } catch {\n return false;\n }\n });\n}\n"],"names":["_checkProblemDirIsolation","_asyncToGenerator","_regenerator","m","_callee","problemDir","resolvedCwd","params","tempRoot","_spawnResult$stdout","_spawnResult$stderr","_ref","_spawnResult$status","_spawnResult$error$me","_spawnResult$error","absoluteProblemDir","copiedProblemDir","relativeCwd","copiedCwd","scriptPath","execArgv","paramsJson","spawnResult","stdout","stderr","_t","w","_context","p","n","fs","promises","mkdtemp","path","join","os","tmpdir","v","resolve","toTempRelativePath","mkdir","dirname","recursive","cp","filter","isCopiedProblemPath","symlinkAllAncestorNodeModules","relative","cwd","getInvokedScriptPath","startsWith","isAbsolute","printDebugBanner","concat","a","passed","process","isIsolationExecArg","JSON","stringify","isJudgeParamsObject","child_process","spawnSync","execPath","_toConsumableArray","encoding","env","timeout","status","isAcceptedJudgeOutput","signal","error","message","trimEnd","Error","String","rm","force","f","apply","this","arguments","src","name","basename","arg","_typeof","Array","isArray","_x4","_x5","_symlinkAllAncestorNodeModules","_callee2","currentDir","nodeModulesPath","targetSymlinkPath","parentDir","_context2","existsSync","symlink","platform","absolutePath","root","parse","argv","sep","relativeScriptPath","resultLines","split","line","TEST_CASE_RESULT_PREFIX","length","every","parsedResult","testCaseResultSchema","safeParse","slice","success","data","decisionCode","DecisionCode","ACCEPTED","_unused","_x","_x2","_x3"],"mappings":"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"} |
| import type { ResolvedCwd } from './resolveCwds.js'; | ||
| export interface ProblemDirIsolationCheckResult { | ||
| passed: boolean; | ||
| } | ||
| /** | ||
| * Check that a judge can run after only the problem directory is copied elsewhere. | ||
| */ | ||
| export declare function checkProblemDirIsolation(problemDir: string, resolvedCwd: ResolvedCwd, params: unknown): Promise<ProblemDirIsolationCheckResult>; |
| import{asyncToGenerator as e,regenerator as r,toConsumableArray as t,typeof as n}from"../_virtual/_rollupPluginBabelHelpers.js";import s from"node:child_process";import o from"node:fs";import i from"node:os";import a from"node:path";import{DecisionCode as c}from"../types/decisionCode.js";import{TEST_CASE_RESULT_PREFIX as u,testCaseResultSchema as p}from"../types/testCaseResult.js";import{printDebugBanner as l}from"./printDebugBanner.js";function d(e,r,t){return m.apply(this,arguments)}function m(){return(m=e(r().m(function e(n,c,u){var p,d,m,b,E,w,C,D,A,S,_,x,B,O,W,G,M,P;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,o.promises.mkdtemp(a.join(i.tmpdir(),"problem-utils-isolation_"));case 1:return p=e.v,D=a.resolve(n),A=a.join(p,k(D)),e.n=2,o.promises.mkdir(a.dirname(A),{recursive:!0});case 2:return e.n=3,o.promises.cp(D,A,{recursive:!0,filter:f});case 3:return e.n=4,v(p,D);case 4:if(S=a.relative(D,a.resolve(c.cwd)),_=a.join(A,S),!(x=g(D)).startsWith("..")&&!a.isAbsolute(x)){e.n=5;break}return l(["[DEBUG MODE] isolated problem directory check skipped","","The invoked judge script is located outside the problem directory.","Script path: ".concat(x)]),e.a(2,{passed:!0});case 5:if(B=process.execArgv.filter(h),O=JSON.stringify(y(u)?u:{}),W=s.spawnSync(process.execPath,[].concat(t(B),[x,_,O]),{cwd:A,encoding:"utf8",env:process.env,timeout:3e4}),G=null!=(d=W.stdout)?d:"",M=null!=(m=W.stderr)?m:"",0!==W.status||!j(G)){e.n=6;break}return l(["[DEBUG MODE] isolated problem directory check passed","","Copied problem dir : ".concat(A),"Checked cwd : ".concat(S)]),e.a(2,{passed:!0});case 6:return l(["[DEBUG MODE] isolated problem directory check failed","","The judge did not complete successfully after copying only the problem directory to a temporary location.","Make sure judge.ts imports only files included in the problem directory.","","Copied problem dir : ".concat(A),"Checked cwd : ".concat(S),"Exit status : ".concat(null!=(b=null!=(E=W.status)?E:W.signal)?b:"unknown"),"Spawn error : ".concat(null!=(w=null==(C=W.error)?void 0:C.message)?w:"<none>"),"","stdout:",G.trimEnd()||"<empty>","","stderr:",M.trimEnd()||"<empty>"]),e.a(2,{passed:!1});case 7:return e.p=7,P=e.v,l(["[DEBUG MODE] isolated problem directory check failed due to an unexpected error","",P instanceof Error?P.message:String(P)]),e.a(2,{passed:!1});case 8:if(e.p=8,!p){e.n=12;break}return e.p=9,e.n=10,o.promises.rm(p,{recursive:!0,force:!0});case 10:e.n=12;break;case 11:e.p=11,e.v;case 12:return e.f(8);case 13:return e.a(2)}},e,null,[[9,11],[0,7,8,13]])}))).apply(this,arguments)}function f(e){var r=a.basename(e);return"node_modules"!==r&&".git"!==r}function h(e){return!e.startsWith("--inspect")&&!e.startsWith("--watch")&&!e.startsWith("--hot")}function y(e){return null!=e&&"object"===n(e)&&!Array.isArray(e)}function v(e,r){return b.apply(this,arguments)}function b(){return(b=e(r().m(function e(t,n){var s,i,c,u;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:s=a.resolve(n);case 1:if(i=a.join(s,"node_modules"),!o.existsSync(i)){e.n=5;break}return c=a.join(t,k(s),"node_modules"),e.p=2,e.n=3,o.promises.symlink(i,c,"win32"===process.platform?"junction":"dir");case 3:e.n=5;break;case 4:e.p=4,e.v;case 5:if((u=a.dirname(s))!==s){e.n=6;break}return e.a(3,7);case 6:s=u,e.n=1;break;case 7:return e.a(2)}},e,null,[[2,4]])}))).apply(this,arguments)}function k(e){var r=a.parse(e).root;return a.relative(r,e)}function g(e){var r=process.argv[1];if(!r)return".".concat(a.sep,"judge.ts");var t=a.relative(e,a.resolve(r));return a.isAbsolute(t)||t.startsWith(".")?t:".".concat(a.sep).concat(t)}function j(e){var r=e.split(/\r?\n/).filter(function(e){return e.startsWith(u)});return 0!==r.length&&r.every(function(e){try{var r=p.safeParse(JSON.parse(e.slice(u.length)));return r.success&&r.data.decisionCode===c.ACCEPTED}catch(e){return!1}})}export{d as checkProblemDirIsolation}; | ||
| //# sourceMappingURL=checkProblemDirIsolation.js.map |
| {"version":3,"file":"checkProblemDirIsolation.js","sources":["../../src/helpers/checkProblemDirIsolation.ts"],"sourcesContent":["import child_process from 'node:child_process';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { DecisionCode } from '../types/decisionCode.js';\nimport { TEST_CASE_RESULT_PREFIX, testCaseResultSchema } from '../types/testCaseResult.js';\n\nimport { printDebugBanner } from './printDebugBanner.js';\nimport type { ResolvedCwd } from './resolveCwds.js';\n\nconst ISOLATION_CHECK_TIMEOUT_MS = 30_000;\n\nexport interface ProblemDirIsolationCheckResult {\n passed: boolean;\n}\n\n/**\n * Check that a judge can run after only the problem directory is copied elsewhere.\n */\nexport async function checkProblemDirIsolation(\n problemDir: string,\n resolvedCwd: ResolvedCwd,\n params: unknown\n): Promise<ProblemDirIsolationCheckResult> {\n let tempRoot: string | undefined;\n try {\n tempRoot = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'problem-utils-isolation_'));\n const absoluteProblemDir = path.resolve(problemDir);\n const copiedProblemDir = path.join(tempRoot, toTempRelativePath(absoluteProblemDir));\n await fs.promises.mkdir(path.dirname(copiedProblemDir), { recursive: true });\n await fs.promises.cp(absoluteProblemDir, copiedProblemDir, {\n recursive: true,\n filter: isCopiedProblemPath,\n });\n await symlinkAllAncestorNodeModules(tempRoot, absoluteProblemDir);\n\n const relativeCwd = path.relative(absoluteProblemDir, path.resolve(resolvedCwd.cwd));\n const copiedCwd = path.join(copiedProblemDir, relativeCwd);\n const scriptPath = getInvokedScriptPath(absoluteProblemDir);\n if (scriptPath.startsWith('..') || path.isAbsolute(scriptPath)) {\n printDebugBanner([\n '[DEBUG MODE] isolated problem directory check skipped',\n '',\n 'The invoked judge script is located outside the problem directory.',\n `Script path: ${scriptPath}`,\n ]);\n return { passed: true };\n }\n const execArgv = process.execArgv.filter(isIsolationExecArg);\n const paramsJson = JSON.stringify(isJudgeParamsObject(params) ? params : {});\n const spawnResult = child_process.spawnSync(process.execPath, [...execArgv, scriptPath, copiedCwd, paramsJson], {\n cwd: copiedProblemDir,\n encoding: 'utf8',\n env: process.env,\n timeout: ISOLATION_CHECK_TIMEOUT_MS,\n });\n const stdout = spawnResult.stdout ?? '';\n const stderr = spawnResult.stderr ?? '';\n\n if (spawnResult.status === 0 && isAcceptedJudgeOutput(stdout)) {\n printDebugBanner([\n '[DEBUG MODE] isolated problem directory check passed',\n '',\n `Copied problem dir : ${copiedProblemDir}`,\n `Checked cwd : ${relativeCwd}`,\n ]);\n return { passed: true };\n }\n\n printDebugBanner([\n '[DEBUG MODE] isolated problem directory check failed',\n '',\n 'The judge did not complete successfully after copying only the problem directory to a temporary location.',\n 'Make sure judge.ts imports only files included in the problem directory.',\n '',\n `Copied problem dir : ${copiedProblemDir}`,\n `Checked cwd : ${relativeCwd}`,\n `Exit status : ${spawnResult.status ?? spawnResult.signal ?? 'unknown'}`,\n `Spawn error : ${spawnResult.error?.message ?? '<none>'}`,\n '',\n 'stdout:',\n stdout.trimEnd() || '<empty>',\n '',\n 'stderr:',\n stderr.trimEnd() || '<empty>',\n ]);\n return { passed: false };\n } catch (error) {\n printDebugBanner([\n '[DEBUG MODE] isolated problem directory check failed due to an unexpected error',\n '',\n error instanceof Error ? error.message : String(error),\n ]);\n return { passed: false };\n } finally {\n if (tempRoot) {\n try {\n await fs.promises.rm(tempRoot, { recursive: true, force: true });\n } catch {\n // Cleanup errors should not mask the primary isolation check result.\n }\n }\n }\n}\n\nfunction isCopiedProblemPath(src: string): boolean {\n const name = path.basename(src);\n return name !== 'node_modules' && name !== '.git';\n}\n\nfunction isIsolationExecArg(arg: string): boolean {\n return !arg.startsWith('--inspect') && !arg.startsWith('--watch') && !arg.startsWith('--hot');\n}\n\nfunction isJudgeParamsObject(params: unknown): params is object {\n return params !== undefined && params !== null && typeof params === 'object' && !Array.isArray(params);\n}\n\nasync function symlinkAllAncestorNodeModules(tempRoot: string, problemDir: string): Promise<void> {\n let currentDir = path.resolve(problemDir);\n while (true) {\n const nodeModulesPath = path.join(currentDir, 'node_modules');\n if (fs.existsSync(nodeModulesPath)) {\n const targetSymlinkPath = path.join(tempRoot, toTempRelativePath(currentDir), 'node_modules');\n try {\n await fs.promises.symlink(\n nodeModulesPath,\n targetSymlinkPath,\n process.platform === 'win32' ? 'junction' : 'dir'\n );\n } catch {\n // Package resolution is best-effort; the isolation check still reports a clear spawn failure if imports break.\n }\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break;\n currentDir = parentDir;\n }\n}\n\nfunction toTempRelativePath(absolutePath: string): string {\n const { root } = path.parse(absolutePath);\n return path.relative(root, absolutePath);\n}\n\nfunction getInvokedScriptPath(problemDir: string): string {\n const scriptPath = process.argv[1];\n if (!scriptPath) return `.${path.sep}judge.ts`;\n const relativeScriptPath = path.relative(problemDir, path.resolve(scriptPath));\n if (path.isAbsolute(relativeScriptPath)) return relativeScriptPath;\n return relativeScriptPath.startsWith('.') ? relativeScriptPath : `.${path.sep}${relativeScriptPath}`;\n}\n\nfunction isAcceptedJudgeOutput(stdout: string): boolean {\n const resultLines = stdout.split(/\\r?\\n/).filter((line) => line.startsWith(TEST_CASE_RESULT_PREFIX));\n if (resultLines.length === 0) return false;\n\n return resultLines.every((line) => {\n try {\n const parsedResult = testCaseResultSchema.safeParse(JSON.parse(line.slice(TEST_CASE_RESULT_PREFIX.length)));\n return parsedResult.success && parsedResult.data.decisionCode === DecisionCode.ACCEPTED;\n } catch {\n return false;\n }\n });\n}\n"],"names":["checkProblemDirIsolation","_x","_x2","_x3","_checkProblemDirIsolation","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","resolvedCwd","params","tempRoot","_spawnResult$stdout","_spawnResult$stderr","_ref","_spawnResult$status","_spawnResult$error$me","_spawnResult$error","absoluteProblemDir","copiedProblemDir","relativeCwd","copiedCwd","scriptPath","execArgv","paramsJson","spawnResult","stdout","stderr","_t","w","_context","p","n","fs","promises","mkdtemp","path","join","os","tmpdir","v","resolve","toTempRelativePath","mkdir","dirname","recursive","cp","filter","isCopiedProblemPath","symlinkAllAncestorNodeModules","relative","cwd","getInvokedScriptPath","startsWith","isAbsolute","printDebugBanner","concat","a","passed","process","isIsolationExecArg","JSON","stringify","isJudgeParamsObject","child_process","spawnSync","execPath","_toConsumableArray","encoding","env","timeout","status","isAcceptedJudgeOutput","signal","error","message","trimEnd","Error","String","rm","force","f","src","name","basename","arg","_typeof","Array","isArray","_x4","_x5","_symlinkAllAncestorNodeModules","_callee2","currentDir","nodeModulesPath","targetSymlinkPath","parentDir","_context2","existsSync","symlink","platform","absolutePath","root","parse","argv","sep","relativeScriptPath","resultLines","split","line","TEST_CASE_RESULT_PREFIX","length","every","parsedResult","testCaseResultSchema","safeParse","slice","success","data","decisionCode","DecisionCode","ACCEPTED","_unused"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| "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&&!E(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,E,S,L,O,k,_,w,M,x,P,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",x={buildTimeoutSeconds:null!=(I=null==(y=m.limits)?void 0:y.buildTimeoutSeconds)?I:10,maxOutputLength:null!=(E=null==(S=m.limits)?void 0:S.maxOutputLength)?E:5e4},P=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=v(N,{cwd:o,env:q,testCaseId:M,limits:x}))){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:P,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:x.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,x.maxOutputLength)||void 0,stderr:(null!=(Z=se.stderr)?Z:ee.stderr).slice(0,x.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 E(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function v(e,t){var r,n=C.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),s=null!=(r=n.status)?r:void 0;return 0!==n.status?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_ERROR,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.stdout.length>t.limits.maxOutputLength||n.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:void 0}function 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.outputLimitExceeded||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)}; | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),t=require("node:path"),r=require("zod"),n=require("../helpers/checkProblemDirIsolation.cjs"),s=require("../helpers/cleanWorkingDirectory.cjs"),i=require("../helpers/copyTestCaseFileInput.cjs"),a=require("../helpers/findEntryPointFile.cjs"),u=require("../helpers/findLanguageDefinitionByPath.cjs"),o=require("../helpers/judgeByStaticAnalysis.cjs"),c=require("../helpers/parseArgs.cjs"),d=require("../helpers/printDebugBanner.cjs"),l=require("../helpers/printTestCaseResult.cjs"),p=require("../helpers/readOutputFiles.cjs"),m=require("../helpers/readProblemMarkdownFrontMatter.cjs"),C=require("../helpers/readTestCases.cjs"),f=require("../helpers/resolveCwds.cjs"),h=require("../helpers/spawnSyncWithTimeout.cjs"),g=require("../types/decisionCode.cjs"),I=r.z.object({language:r.z.union([r.z.string(),r.z.array(r.z.string())]).optional()});function b(){return(b=e.asyncToGenerator(e.regenerator().m(function t(r,s){var i,a,u,o,l,p,m,C,h,g,b;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return i=c.parseArgs(process.argv),a=I.parse(i.params),t.n=1,f.resolveCwds(r,i.cwd);case 1:if(u=t.v,o=u.cwds,!(l=u.isDebugMode)){t.n=5;break}if(!(p=o.find(function(e){return"accepted"===e.expectedResult}))){t.n=4;break}return t.n=2,n.checkProblemDirIsolation(r,p,a);case 2:if(t.v.passed){t.n=3;break}return process.exitCode=1,t.a(2);case 3:t.n=5;break;case 4:d.printDebugBanner(["[DEBUG MODE] isolated problem directory check skipped","","No accepted model answer is available for checking that the copied judge still accepts a valid submission."]);case 5:m=e.createForOfIteratorHelper(o),t.p=6,m.s();case 7:if((C=m.n()).done){t.n=10;break}return h=C.value,l&&f.printDebugCwdBanner(r,h),t.n=8,v(r,h.cwd,a,s);case 8:g=t.v,l&&!y(h,g)&&(process.exitCode=1,f.printDebugExpectationFailureBanner(r,h));case 9:t.n=7;break;case 10:t.n=12;break;case 11:t.p=11,b=t.v,m.e(b);case 12:return t.p=12,m.f(),t.f(12);case 13:return t.a(2)}},t,null,[[6,11,12,13]])}))).apply(this,arguments)}function v(e,t,r,n){return E.apply(this,arguments)}function E(){return(E=e.asyncToGenerator(e.regenerator().m(function t(r,n,c,d){var C,f,h,I,b,v,E,y,T,O,_,w,x,M,P,B,F,j,q,A,U,N,W,G,z,X,H,Q,Y,Z,J,V,K,$,ee,te,re,ne,se,ie,ae,ue,oe,ce,de,le,pe;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return t.n=1,m.readProblemMarkdownFrontMatter(r);case 1:return _=t.v,t.n=2,(null!=(C=d.readTestCases)?C:S)(r);case 2:return w=t.v,x=null!=(f=null==(h=w[0])?void 0:h.id)?f:"prebuild",M={buildTimeoutSeconds:null!=(I=null==(b=d.limits)?void 0:b.buildTimeoutSeconds)?I:10,maxOutputLength:null!=(v=null==(E=d.limits)?void 0:E.maxOutputLength)?v:5e4},P=null!=(y=d.runTimeoutSeconds)?y:2,t.n=3,o.judgeByStaticAnalysis(n,_);case 3:if(!(B=t.v)){t.n=4;break}return l.printTestCaseResult(e.objectSpread2({testCaseId:x},B)),t.a(2,{allAccepted:!1});case 4:return t.n=5,a.findEntryPointFile(n,c.language);case 5:if(F=t.v){t.n=6;break}return l.printTestCaseResult({testCaseId:x,decisionCode:g.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(c.language?": language: ".concat(c.language):"")}),t.a(2,{allAccepted:!1});case 6:if(j=u.findLanguageDefinitionByPath(F)){t.n=7;break}return l.printTestCaseResult({testCaseId:x,decisionCode:g.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=F,!j.prebuild){t.n=12;break}return t.p=8,t.n=9,j.prebuild(n);case 9:return t.n=10,a.findEntryPointFile(n,c.language);case 10:(U=t.v)&&(A=U),t.n=12;break;case 11:return t.p=11,oe=t.v,l.printTestCaseResult({testCaseId:x,decisionCode:g.DecisionCode.BUILD_ERROR,stderr:oe instanceof Error?oe.message:String(oe)}),t.a(2,{allAccepted:!1});case 12:if(!(N=null==(T=j.buildCommand)?void 0:T.call(j,A))){t.n=13;break}if(!(W=R(N,{cwd:n,env:q,testCaseId:x,limits:M}))){t.n=13;break}return l.printTestCaseResult(W),t.a(2,{allAccepted:!1});case 13:return t.n=14,s.snapshotWorkingDirectory(n);case 14:if(G=t.v,0!==w.length){t.n=15;break}return l.printTestCaseResult({testCaseId:"default",decisionCode:g.DecisionCode.ACCEPTED}),t.a(2,{allAccepted:!0});case 15:z=null==(O=w.shared)?void 0:O.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,!z){t.n=18;break}return t.n=18,i.copyTestCaseFileInput(z,n);case 18:if(!J.fileInputPath){t.n=19;break}return t.n=19,i.copyTestCaseFileInput(J.fileInputPath,n);case 19:if(V="number"==typeof _.timeLimitMs?_.timeLimitMs/1e3:P,K=j.command(A),$=null!=(Q=J.input)?Q:"",ee=void 0,t.p=20,!d.resolveInput){t.n=22;break}return t.n=21,d.resolveInput({testCase:J,cwd:n,env:q});case 21:$=t.v;case 22:if(!d.runCommand){t.n=24;break}return t.n=23,d.runCommand({testCase:J,command:K,stdin:$,cwd:n,env:q,timeLimitSeconds:V});case 23:ce=t.v,t.n=25;break;case 24:ce=k(K,{stdin:$,cwd:n,env:q,timeLimitSeconds:V});case 25:ee=ce,t.n=28;break;case 26:return t.p=26,de=t.v,l.printTestCaseResult({testCaseId:J.id,decisionCode:g.DecisionCode.RUNTIME_ERROR,stdin:$,stderr:D(de)}),t.n=27,s.cleanWorkingDirectory(n,G);case 27:return t.a(2,{allAccepted:!1});case 28:return t.n=29,p.readOutputFiles(n,null!=(Y=_.requiredOutputFilePaths)?Y:[]);case 29:if(te=t.v,re={timeLimitSeconds:V,outputLimitLength:M.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:_.memoryLimitByte,requiredOutputFilePaths:_.requiredOutputFilePaths}},ne=L({runResult:ee,outputFiles:te,context:re}),se=ne,ne.decisionCode!==g.DecisionCode.ACCEPTED){t.n=33;break}return t.p=30,t.n=31,null==(ie=d.test)?void 0:ie.call(d,{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:g.DecisionCode.RUNTIME_ERROR,stderr:D(le)};case 33:return l.printTestCaseResult(e.objectSpread2(e.objectSpread2({testCaseId:J.id},se),{},{exitStatus:ee.status,stdin:ee.stdin,stdout:ee.stdout.slice(0,M.maxOutputLength)||void 0,stderr:(null!=(Z=se.stderr)?Z:ee.stderr).slice(0,M.maxOutputLength)||void 0,timeSeconds:ee.timeSeconds,memoryBytes:ee.memoryBytes,outputFiles:te.length>0?te:void 0})),t.n=34,s.cleanWorkingDirectory(n,G);case 34:if(se.decisionCode===g.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 y(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function R(e,t){var r,n=h.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:g.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:g.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:g.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 D(e){return e instanceof Error?e.message:String(e)}function S(e){return T.apply(this,arguments)}function T(){return(T=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,C.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 k(e,t){var r,n=h.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 L(e){var t,r,n;if(0!==e.runResult.status)return{decisionCode:g.DecisionCode.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:g.DecisionCode.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:g.DecisionCode.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.outputLimitExceeded||e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:g.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:g.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:g.DecisionCode.ACCEPTED}}exports.commandJudgePreset=function(e,t){return b.apply(this,arguments)}; | ||
| //# sourceMappingURL=command.cjs.map |
@@ -1,1 +0,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 outputLimitExceeded?: boolean;\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<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n> {\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<TRunResult> | TRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: TRunResult;\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<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(problemDir: string, options: CommandJudgePresetOptions<TTestCase, TRunResult>): 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, TRunResult>(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<\n TTestCase extends BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase, TRunResult>\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: TRunResult;\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 }) as TRunResult);\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.outputLimitExceeded ||\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","outputLimitExceeded","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x","_x2"],"mappings":"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"} | ||
| {"version":3,"file":"command.cjs","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { checkProblemDirIsolation } from '../helpers/checkProblemDirIsolation.js';\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 { printDebugBanner } from '../helpers/printDebugBanner.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 outputLimitExceeded?: boolean;\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<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n> {\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<TRunResult> | TRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: TRunResult;\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<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(problemDir: string, options: CommandJudgePresetOptions<TTestCase, TRunResult>): 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 if (isDebugMode) {\n const acceptedCwd = cwds.find((cwd) => cwd.expectedResult === 'accepted');\n if (acceptedCwd) {\n const isolationCheckResult = await checkProblemDirIsolation(problemDir, acceptedCwd, params);\n if (!isolationCheckResult.passed) {\n process.exitCode = 1;\n return;\n }\n } else {\n printDebugBanner([\n '[DEBUG MODE] isolated problem directory check skipped',\n '',\n 'No accepted model answer is available for checking that the copied judge still accepts a valid submission.',\n ]);\n }\n }\n\n for (const resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase, TRunResult>(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<\n TTestCase extends BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase, TRunResult>\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: TRunResult;\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 }) as TRunResult);\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.outputLimitExceeded ||\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","acceptedCwd","_iterator","_step","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","find","expectedResult","checkProblemDirIsolation","passed","exitCode","a","printDebugBanner","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","printDebugExpectationFailureBanner","e","f","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","_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","outputLimitExceeded","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x","_x2"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as e,regenerator as t,createForOfIteratorHelper as r,objectSpread2 as n}from"../_virtual/_rollupPluginBabelHelpers.js";import s from"node:path";import{z as i}from"zod";import{cleanWorkingDirectory as u,snapshotWorkingDirectory as a}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as o}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as d}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as 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,u,a,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),u=b.parse(i.params),e.n=1,I(n,i.cwd);case 1:a=e.v,o=a.cwds,d=a.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,u,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,M,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,ue,ae,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 M=e.v,e.n=2,(null!=(I=C.readTestCases)?I:x)(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,M);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,a(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 M.timeLimitMs?M.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,u(i,Q);case 27:return e.a(2,{allAccepted:!1});case 28:return e.n=29,f(i,null!=(J=M.requiredOutputFilePaths)?J:[]);case 29:if(se=e.v,ie={timeLimitSeconds:ee,outputLimitLength:F.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:M.memoryLimitByte,requiredOutputFilePaths:M.requiredOutputFilePaths}},ue=P({runResult:ne,outputFiles:se,context:ie}),ae=ue,ue.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)&&(ae={decisionCode:null!=(ce=de.decisionCode)?ce:ue.decisionCode,feedbackMarkdown:de.feedbackMarkdown,stderr:de.stderr}),e.n=33;break;case 32:e.p=32,fe=e.v,ae={decisionCode:R.RUNTIME_ERROR,stderr:_(fe)};case 33:return p(n(n({testCaseId:$.id},ae),{},{exitStatus:ne.status,stdin:ne.stdin,stdout:ne.stdout.slice(0,F.maxOutputLength)||void 0,stderr:(null!=(K=ae.stderr)?K:ne.stderr).slice(0,F.maxOutputLength)||void 0,timeSeconds:ne.timeSeconds,memoryBytes:ne.memoryBytes,outputFiles:se.length>0?se:void 0})),e.n=34,u(i,Q);case 34:if(ae.decisionCode===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 x(e){return M.apply(this,arguments)}function M(){return(M=e(t().m(function e(r){var n,i,u;return t().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,C(s.join(r,"test_cases"));case 1:if(i=e.v,u=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(n=i.shared)||!n.fileInputPath){e.n=2;break}return e.a(2,Object.assign(u,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,u)}},e)}))).apply(this,arguments)}function 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.outputLimitExceeded||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}; | ||
| import{asyncToGenerator as e,regenerator as t,createForOfIteratorHelper as r,objectSpread2 as s}from"../_virtual/_rollupPluginBabelHelpers.js";import n from"node:path";import{z as i}from"zod";import{checkProblemDirIsolation as a}from"../helpers/checkProblemDirIsolation.js";import{cleanWorkingDirectory as u,snapshotWorkingDirectory as o}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as d}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as c}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as l}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as m}from"../helpers/judgeByStaticAnalysis.js";import{parseArgs as p}from"../helpers/parseArgs.js";import{printDebugBanner as f}from"../helpers/printDebugBanner.js";import{printTestCaseResult as h}from"../helpers/printTestCaseResult.js";import{readOutputFiles as C}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as I}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as v}from"../helpers/readTestCases.js";import{resolveCwds as g,printDebugExpectationFailureBanner as E,printDebugCwdBanner as b}from"../helpers/resolveCwds.js";import{spawnSyncWithTimeout as R}from"../helpers/spawnSyncWithTimeout.js";import{DecisionCode as y}from"../types/decisionCode.js";var L=i.object({language:i.union([i.string(),i.array(i.string())]).optional()});function S(e,t){return k.apply(this,arguments)}function k(){return(k=e(t().m(function e(s,n){var i,u,o,d,c,l,m,h,C,I,v;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return i=p(process.argv),u=L.parse(i.params),e.n=1,g(s,i.cwd);case 1:if(o=e.v,d=o.cwds,!(c=o.isDebugMode)){e.n=5;break}if(!(l=d.find(function(e){return"accepted"===e.expectedResult}))){e.n=4;break}return e.n=2,a(s,l,u);case 2:if(e.v.passed){e.n=3;break}return process.exitCode=1,e.a(2);case 3:e.n=5;break;case 4:f(["[DEBUG MODE] isolated problem directory check skipped","","No accepted model answer is available for checking that the copied judge still accepts a valid submission."]);case 5:m=r(d),e.p=6,m.s();case 7:if((h=m.n()).done){e.n=10;break}return C=h.value,c&&b(s,C),e.n=8,O(s,C.cwd,u,n);case 8:I=e.v,c&&!_(C,I)&&(process.exitCode=1,E(s,C));case 9:e.n=7;break;case 10:e.n=12;break;case 11:e.p=11,v=e.v,m.e(v);case 12:return e.p=12,m.f(),e.f(12);case 13:return e.a(2)}},e,null,[[6,11,12,13]])}))).apply(this,arguments)}function O(e,t,r,s){return T.apply(this,arguments)}function T(){return(T=e(t().m(function e(n,i,a,p){var f,v,g,E,b,R,L,S,k,O,T,_,w,j,F,A,U,N,G,X,q,W,H,Q,Y,Z,z,V,J,K,$,ee,te,re,se,ne,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,I(n);case 1:return T=e.v,e.n=2,(null!=(f=p.readTestCases)?f:D)(n);case 2:return _=e.v,w=null!=(v=null==(g=_[0])?void 0:g.id)?v:"prebuild",j={buildTimeoutSeconds:null!=(E=null==(b=p.limits)?void 0:b.buildTimeoutSeconds)?E:10,maxOutputLength:null!=(R=null==(L=p.limits)?void 0:L.maxOutputLength)?R:5e4},F=null!=(S=p.runTimeoutSeconds)?S:2,e.n=3,m(i,T);case 3:if(!(A=e.v)){e.n=4;break}return h(s({testCaseId:w},A)),e.a(2,{allAccepted:!1});case 4:return e.n=5,c(i,a.language);case 5:if(U=e.v){e.n=6;break}return h({testCaseId:w,decisionCode:y.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(a.language?": language: ".concat(a.language):"")}),e.a(2,{allAccepted:!1});case 6:if(N=l(U)){e.n=7;break}return h({testCaseId:w,decisionCode:y.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2,{allAccepted:!1});case 7:if(G=s(s({},process.env),{},{CI:"",FORCE_COLOR:"0"}),X=U,!N.prebuild){e.n=12;break}return e.p=8,e.n=9,N.prebuild(i);case 9:return e.n=10,c(i,a.language);case 10:(q=e.v)&&(X=q),e.n=12;break;case 11:return e.p=11,le=e.v,h({testCaseId:w,decisionCode:y.BUILD_ERROR,stderr:le instanceof Error?le.message:String(le)}),e.a(2,{allAccepted:!1});case 12:if(!(W=null==(k=N.buildCommand)?void 0:k.call(N,X))){e.n=13;break}if(!(H=x(W,{cwd:i,env:G,testCaseId:w,limits:j}))){e.n=13;break}return h(H),e.a(2,{allAccepted:!1});case 13:return e.n=14,o(i);case 14:if(Q=e.v,0!==_.length){e.n=15;break}return h({testCaseId:"default",decisionCode:y.ACCEPTED}),e.a(2,{allAccepted:!0});case 15:Y=null==(O=_.shared)?void 0:O.fileInputPath,Z=r(_),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,d(Y,i);case 18:if(!$.fileInputPath){e.n=19;break}return e.n=19,d($.fileInputPath,i);case 19:if(ee="number"==typeof T.timeLimitMs?T.timeLimitMs/1e3:F,te=N.command(X),re=null!=(V=$.input)?V:"",se=void 0,e.p=20,!p.resolveInput){e.n=22;break}return e.n=21,p.resolveInput({testCase:$,cwd:i,env:G});case 21:re=e.v;case 22:if(!p.runCommand){e.n=24;break}return e.n=23,p.runCommand({testCase:$,command:te,stdin:re,cwd:i,env:G,timeLimitSeconds:ee});case 23:me=e.v,e.n=25;break;case 24:me=P(te,{stdin:re,cwd:i,env:G,timeLimitSeconds:ee});case 25:se=me,e.n=28;break;case 26:return e.p=26,pe=e.v,h({testCaseId:$.id,decisionCode:y.RUNTIME_ERROR,stdin:re,stderr:M(pe)}),e.n=27,u(i,Q);case 27:return e.a(2,{allAccepted:!1});case 28:return e.n=29,C(i,null!=(J=T.requiredOutputFilePaths)?J:[]);case 29:if(ne=e.v,ie={timeLimitSeconds:ee,outputLimitLength:j.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:T.memoryLimitByte,requiredOutputFilePaths:T.requiredOutputFilePaths}},ae=B({runResult:se,outputFiles:ne,context:ie}),ue=ae,ae.decisionCode!==y.ACCEPTED){e.n=33;break}return e.p=30,e.n=31,null==(oe=p.test)?void 0:oe.call(p,{testCase:$,runResult:se,outputFiles:ne,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:y.RUNTIME_ERROR,stderr:M(fe)};case 33:return h(s(s({testCaseId:$.id},ue),{},{exitStatus:se.status,stdin:se.stdin,stdout:se.stdout.slice(0,j.maxOutputLength)||void 0,stderr:(null!=(K=ue.stderr)?K:se.stderr).slice(0,j.maxOutputLength)||void 0,timeSeconds:se.timeSeconds,memoryBytes:se.memoryBytes,outputFiles:ne.length>0?ne:void 0})),e.n=34,u(i,Q);case 34:if(ue.decisionCode===y.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 _(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function x(e,t){var r,s=R(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),n=null!=(r=s.status)?r:void 0;return 0!==s.status?{testCaseId:t.testCaseId,decisionCode:y.BUILD_ERROR,exitStatus:n,stdout:s.stdout.slice(0,t.limits.maxOutputLength),stderr:s.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}:s.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:y.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:n,stdout:s.stdout.slice(0,t.limits.maxOutputLength),stderr:s.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}:s.stdout.length>t.limits.maxOutputLength||s.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:y.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:n,stdout:s.stdout.slice(0,t.limits.maxOutputLength),stderr:s.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}:void 0}function M(e){return e instanceof Error?e.message:String(e)}function D(e){return w.apply(this,arguments)}function w(){return(w=e(t().m(function e(r){var s,i,a;return t().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,v(n.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==(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)}},e)}))).apply(this,arguments)}function P(e,t){var r,s=R(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:s.stdout,stderr:s.stderr,status:null!=(r=s.status)?r:void 0,timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}}function B(e){var t,r,s;if(0!==e.runResult.status)return{decisionCode:y.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:y.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:y.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.outputLimitExceeded||e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:y.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var n=null!=(r=null==(s=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:s.length)?r:0;return e.outputFiles.length<n?{decisionCode:y.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:y.ACCEPTED}}export{S as commandJudgePreset}; | ||
| //# sourceMappingURL=command.js.map |
@@ -1,1 +0,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 outputLimitExceeded?: boolean;\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<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n> {\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<TRunResult> | TRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: TRunResult;\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<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(problemDir: string, options: CommandJudgePresetOptions<TTestCase, TRunResult>): 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, TRunResult>(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<\n TTestCase extends BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase, TRunResult>\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: TRunResult;\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 }) as TRunResult);\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.outputLimitExceeded ||\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","outputLimitExceeded","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR"],"mappings":"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"} | ||
| {"version":3,"file":"command.js","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { checkProblemDirIsolation } from '../helpers/checkProblemDirIsolation.js';\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 { printDebugBanner } from '../helpers/printDebugBanner.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 outputLimitExceeded?: boolean;\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<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n> {\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<TRunResult> | TRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: TRunResult;\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<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(problemDir: string, options: CommandJudgePresetOptions<TTestCase, TRunResult>): 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 if (isDebugMode) {\n const acceptedCwd = cwds.find((cwd) => cwd.expectedResult === 'accepted');\n if (acceptedCwd) {\n const isolationCheckResult = await checkProblemDirIsolation(problemDir, acceptedCwd, params);\n if (!isolationCheckResult.passed) {\n process.exitCode = 1;\n return;\n }\n } else {\n printDebugBanner([\n '[DEBUG MODE] isolated problem directory check skipped',\n '',\n 'No accepted model answer is available for checking that the copied judge still accepts a valid submission.',\n ]);\n }\n }\n\n for (const resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase, TRunResult>(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<\n TTestCase extends BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase, TRunResult>\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: TRunResult;\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 }) as TRunResult);\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.outputLimitExceeded ||\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","acceptedCwd","_iterator","_step","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","find","expectedResult","checkProblemDirIsolation","passed","exitCode","a","printDebugBanner","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","printDebugExpectationFailureBanner","e","f","_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","_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","outputLimitExceeded","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR"],"mappings":"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"} |
+7
-7
| { | ||
| "name": "@exercode/problem-utils", | ||
| "version": "1.15.4", | ||
| "version": "1.16.0", | ||
| "description": ":100: A set of utilities for judging programs on Exercode (https://exercode.willbooster.com/).", | ||
@@ -66,12 +66,12 @@ "keywords": [ | ||
| "@types/node": "24.12.3", | ||
| "@typescript/native-preview": "7.0.0-dev.20260607.1", | ||
| "@typescript/native-preview": "7.0.0-dev.20260608.1", | ||
| "@willbooster/oxfmt-config": "1.2.2", | ||
| "@willbooster/oxlint-config": "1.4.8", | ||
| "@willbooster/prettier-config": "10.4.0", | ||
| "@willbooster/wb": "13.22.13", | ||
| "build-ts": "17.1.22", | ||
| "@willbooster/wb": "13.22.16", | ||
| "build-ts": "17.1.24", | ||
| "conventional-changelog-conventionalcommits": "9.3.1", | ||
| "lefthook": "2.1.9", | ||
| "oxfmt": "0.54.0", | ||
| "oxlint": "1.69.0", | ||
| "oxfmt": "0.55.0", | ||
| "oxlint": "1.70.0", | ||
| "oxlint-tsgolint": "0.23.0", | ||
@@ -85,3 +85,3 @@ "prettier": "3.8.3", | ||
| }, | ||
| "packageManager": "yarn@4.16.0", | ||
| "packageManager": "yarn@4.17.0", | ||
| "engines": { | ||
@@ -88,0 +88,0 @@ "node": ">=24" |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
690489
5.6%157
3.29%1262
3.7%49
4.26%20
11.11%