🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@exercode/problem-utils

Package Overview
Dependencies
Maintainers
1
Versions
73
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@exercode/problem-utils - npm Package Compare versions

Comparing version
1.15.4
to
1.16.0
+2
dist/helpers/checkProblemDirIsolation.cjs
"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
-1

@@ -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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"}
{
"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"