@exercode/problem-utils 1.15.4 → 1.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/helpers/checkProblemDirIsolation.cjs +2 -0
- package/dist/helpers/checkProblemDirIsolation.cjs.map +1 -0
- package/dist/helpers/checkProblemDirIsolation.d.ts +8 -0
- package/dist/helpers/checkProblemDirIsolation.js +2 -0
- package/dist/helpers/checkProblemDirIsolation.js.map +1 -0
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.cjs +1 -1
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.cjs.map +1 -1
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.d.ts +5 -2
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.js +1 -1
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.js.map +1 -1
- package/dist/presets/command.cjs +1 -1
- package/dist/presets/command.cjs.map +1 -1
- package/dist/presets/command.js +1 -1
- package/dist/presets/command.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"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)};
|
|
2
|
+
//# sourceMappingURL=checkProblemDirIsolation.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResolvedCwd } from './resolveCwds.js';
|
|
2
|
+
export interface ProblemDirIsolationCheckResult {
|
|
3
|
+
passed: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Check that a judge can run after only the problem directory is copied elsewhere.
|
|
7
|
+
*/
|
|
8
|
+
export declare function checkProblemDirIsolation(problemDir: string, resolvedCwd: ResolvedCwd, params: unknown): Promise<ProblemDirIsolationCheckResult>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
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};
|
|
2
|
+
//# sourceMappingURL=checkProblemDirIsolation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"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":"ybAoBA,SAAsBA,EAAwBC,EAAAC,EAAAC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAoF7C,SAAAH,IAAA,OAAAA,EAAAI,EAAAC,IAAAC,EApFM,SAAAC,EACLC,EACAC,EACAC,GAAe,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAvB,IAAAwB,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAAA,OAAAF,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAIIC,EAAGC,SAASC,QAAQC,EAAKC,KAAKC,EAAGC,SAAU,6BAA4B,KAAA,EAEJ,OAFpF5B,EAAQmB,EAAAU,EACFtB,EAAqBkB,EAAKK,QAAQjC,GAClCW,EAAmBiB,EAAKC,KAAK1B,EAAU+B,EAAmBxB,IAAoBY,EAAAE,EAAA,EAC9EC,EAAGC,SAASS,MAAMP,EAAKQ,QAAQzB,GAAmB,CAAE0B,WAAW,IAAO,KAAA,EAAA,OAAAf,EAAAE,EAAA,EACtEC,EAAGC,SAASY,GAAG5B,EAAoBC,EAAkB,CACzD0B,WAAW,EACXE,OAAQC,IACR,KAAA,EAAA,OAAAlB,EAAAE,EAAA,EACIiB,EAA8BtC,EAAUO,GAAmB,KAAA,EAIN,GAFrDE,EAAcgB,EAAKc,SAAShC,EAAoBkB,EAAKK,QAAQhC,EAAY0C,MACzE9B,EAAYe,EAAKC,KAAKlB,EAAkBC,KACxCE,EAAa8B,EAAqBlC,IACzBmC,WAAW,QAASjB,EAAKkB,WAAWhC,GAAW,CAAAQ,EAAAE,EAAA,EAAA,KAAA,CAMzD,OALHuB,EAAiB,CACf,wDACA,GACA,qEAAoE,gBAAAC,OACpDlC,KACfQ,EAAA2B,EAAA,EACI,CAAEC,QAAQ,IAAM,KAAA,EAWc,GATjCnC,EAAWoC,QAAQpC,SAASwB,OAAOa,GACnCpC,EAAaqC,KAAKC,UAAUC,EAAoBrD,GAAUA,EAAS,IACnEe,EAAcuC,EAAcC,UAAUN,QAAQO,SAAQ,GAAAV,OAAAW,EAAM5C,GAAQ,CAAED,EAAYD,EAAWG,IAAa,CAC9G2B,IAAKhC,EACLiD,SAAU,OACVC,IAAKV,QAAQU,IACbC,QA5C6B,MA8CzB5C,EAA2B,OAArBd,EAAGa,EAAYC,QAAMd,EAAI,GAC/Be,EAA2B,OAArBd,EAAGY,EAAYE,QAAMd,EAAI,GAEV,IAAvBY,EAAY8C,SAAgBC,EAAsB9C,GAAO,CAAAI,EAAAE,EAAA,EAAA,KAAA,CAMxD,OALHuB,EAAiB,CACf,uDACA,GAAE,wBAAAC,OACsBrC,GAAgB,wBAAAqC,OAChBpC,KACvBU,EAAA2B,EAAA,EACI,CAAEC,QAAQ,IAAM,KAAA,EAmBtB,OAhBHH,EAAiB,CACf,uDACA,GACA,4GACA,2EACA,GAAE,wBAAAC,OACsBrC,GAAgB,wBAAAqC,OAChBpC,GAAW,wBAAAoC,cAAA1C,EACO,OADPC,EACXU,EAAY8C,QAAMxD,EAAIU,EAAYgD,QAAM3D,EAAI,WAAS,wBAAA0C,cAAAxC,EACpC,OADoCC,EACrDQ,EAAYiD,YAAK,EAAjBzD,EAAmB0D,SAAO3D,EAAI,UACtD,GACA,UACAU,EAAOkD,WAAa,UACpB,GACA,UACAjD,EAAOiD,WAAa,YACnB9C,EAAA2B,EAAA,EACI,CAAEC,QAAQ,IAAO,KAAA,EAMrB,OANqB5B,EAAAC,EAAA,EAAAH,EAAAE,EAAAU,EAExBe,EAAiB,CACf,kFACA,GACA3B,aAAiBiD,MAAQjD,EAAM+C,QAAUG,OAAMlD,KAC9CE,EAAA2B,EAAA,EACI,CAAEC,QAAQ,IAAO,KAAA,EAAA,GAAA5B,EAAAC,EAAA,GAEpBpB,EAAQ,CAAAmB,EAAAE,EAAA,GAAA,KAAA,CAAA,OAAAF,EAAAC,EAAA,EAAAD,EAAAE,EAAA,GAEFC,EAAGC,SAAS6C,GAAGpE,EAAU,CAAEkC,WAAW,EAAMmC,OAAO,IAAO,KAAA,GAAAlD,EAAAE,EAAA,GAAA,MAAA,KAAA,GAAAF,EAAAC,EAAA,GAAAD,EAAAU,EAAA,KAAA,GAAA,OAAAV,EAAAmD,EAAA,GAAA,KAAA,GAAA,OAAAnD,EAAA2B,EAAA,GAAA,EAAAlD,EAAA,KAAA,CAAA,CAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,KAAA,KAMvEN,MAAAC,KAAAC,UAAA,CAED,SAAS6C,EAAoBkC,GAC3B,IAAMC,EAAO/C,EAAKgD,SAASF,GAC3B,MAAgB,iBAATC,GAAoC,SAATA,CACpC,CAEA,SAASvB,EAAmByB,GAC1B,OAAQA,EAAIhC,WAAW,eAAiBgC,EAAIhC,WAAW,aAAegC,EAAIhC,WAAW,QACvF,CAEA,SAASU,EAAoBrD,GAC3B,OAAOA,SAA6D,WAAlB4E,EAAO5E,KAAwB6E,MAAMC,QAAQ9E,EACjG,CAAC,SAEcuC,EAA6BwC,EAAAC,GAAA,OAAAC,EAAA1F,MAAAC,KAAAC,UAAA,CAAA,SAAAwF,IAqB3C,OArB2CA,EAAAvF,EAAAC,IAAAC,EAA5C,SAAAsF,EAA6CjF,EAAkBH,GAAkB,IAAAqF,EAAAC,EAAAC,EAAAC,EAAA,OAAA3F,IAAAwB,EAAA,SAAAoE,GAAA,cAAAA,EAAAlE,EAAAkE,EAAAjE,GAAA,KAAA,EAC3E6D,EAAazD,EAAKK,QAAQjC,GAAW,KAAA,EAEsB,GAAvDsF,EAAkB1D,EAAKC,KAAKwD,EAAY,iBAC1C5D,EAAGiE,WAAWJ,GAAgB,CAAAG,EAAAjE,EAAA,EAAA,KAAA,CAC6D,OAAvF+D,EAAoB3D,EAAKC,KAAK1B,EAAU+B,EAAmBmD,GAAa,gBAAeI,EAAAlE,EAAA,EAAAkE,EAAAjE,EAAA,EAErFC,EAAGC,SAASiE,QAChBL,EACAC,EACqB,UAArBpC,QAAQyC,SAAuB,WAAa,OAC7C,KAAA,EAAAH,EAAAjE,EAAA,EAAA,MAAA,KAAA,EAAAiE,EAAAlE,EAAA,EAAAkE,EAAAzD,EAAA,KAAA,EAMqC,IAApCwD,EAAY5D,EAAKQ,QAAQiD,MACbA,EAAU,CAAAI,EAAAjE,EAAA,EAAA,KAAA,CAAA,OAAAiE,EAAAxC,EAAA,EAAA,GAAA,KAAA,EAC5BoC,EAAaG,EAAUC,EAAAjE,EAAA,EAAA,MAAA,KAAA,EAAA,OAAAiE,EAAAxC,EAAA,GAAA,EAAAmC,EAAA,KAAA,CAAA,CAAA,EAAA,IAAA,KAE1B3F,MAAAC,KAAAC,UAAA,CAED,SAASuC,EAAmB2D,GAC1B,IAAQC,EAASlE,EAAKmE,MAAMF,GAApBC,KACR,OAAOlE,EAAKc,SAASoD,EAAMD,EAC7B,CAEA,SAASjD,EAAqB5C,GAC5B,IAAMc,EAAaqC,QAAQ6C,KAAK,GAChC,IAAKlF,EAAY,MAAA,IAAAkC,OAAWpB,EAAKqE,IAAG,YACpC,IAAMC,EAAqBtE,EAAKc,SAAS1C,EAAY4B,EAAKK,QAAQnB,IAClE,OAAIc,EAAKkB,WAAWoD,IACbA,EAAmBrD,WAAW,KADWqD,EACc,IAAAlD,OAAOpB,EAAKqE,KAAGjD,OAAGkD,EAClF,CAEA,SAASlC,EAAsB9C,GAC7B,IAAMiF,EAAcjF,EAAOkF,MAAM,SAAS7D,OAAO,SAAC8D,GAAI,OAAKA,EAAKxD,WAAWyD,EAAwB,GACnG,OAA2B,IAAvBH,EAAYI,QAETJ,EAAYK,MAAM,SAACH,GACxB,IACE,IAAMI,EAAeC,EAAqBC,UAAUtD,KAAK0C,MAAMM,EAAKO,MAAMN,EAAwBC,UAClG,OAAOE,EAAaI,SAAWJ,EAAaK,KAAKC,eAAiBC,EAAaC,QACjF,CAAE,MAAAC,GACA,OAAO,CACT,CACF,EACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e,
|
|
1
|
+
"use strict";var e,t,n=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:child_process"),o=require("node:fs/promises"),i=require("node:os"),a=require("node:path"),s={bun:["package.json","bun.lock","bun.lockb"],cargo:["Cargo.toml","Cargo.lock"],go:["go.mod","go.sum"],gradle:["build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","gradle","gradlew","gradlew.bat"],maven:["pom.xml",".mvn","mvnw","mvnw.cmd"],npm:["package.json","package-lock.json"],pnpm:["package.json","pnpm-lock.yaml","pnpm-workspace.yaml"],ruby:["Gemfile","Gemfile.lock",".ruby-version"],uv:["pyproject.toml","uv.lock"],yarn:["package.json","yarn.lock",".yarnrc.yml",".yarn"]},u={bun:["bun","install","--silent"],npm:["npm","install","--silent"],pnpm:["pnpm","install","--silent"],yarn:["yarn","install","--silent"]},c=(e="darwin"===i.platform()?"gtime":"/usr/bin/time",(t=r.spawnSync(e,["--version"],{stdio:"ignore"})).error||0!==t.status?void 0:[e,"--format","%e %M"]);function l(){return l=n.asyncToGenerator(n.regenerator().m(function e(t){var r,s,u,c,l,y,g,v,k,S,w,h,L,j,B,E,T,x,P,D,G;return n.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.n=1,o.mkdtemp(a.join(i.tmpdir(),null!=(r=t.tempDirPrefix)?r:"exercode-"));case 1:return s=e.v,e.p=2,e.n=3,o.cp(t.cwd,s,{recursive:!0});case 3:return e.n=4,f({packageManager:t.packageManager,projectDir:t.projectDir,runDir:s,projectFilePaths:t.projectFilePaths});case 4:if(l=t.env?n.objectSpread2(n.objectSpread2({},process.env),t.env):process.env,y=m(t,s),g="function"==typeof t.command?t.command({runDir:s}):t.command,v=Date.now(),k=null!=(u=t.outputLimitBytes)?u:52428800,!y){e.n=6;break}return e.n=5,b(y,{cwd:s,env:l,outputLimitBytes:k,stdin:"",timeLimitSeconds:t.timeLimitSeconds});case 5:if(!p(S=e.v)){e.n=6;break}return e.a(2,d({elapsedTimeSeconds:(Date.now()-v)/1e3,options:t,result:S}));case 6:if(!((w=t.timeLimitSeconds-(Date.now()-v)/1e3)<=0)){e.n=7;break}return e.a(2,{stdin:null!=(h=t.stdin)?h:"",stdout:null!=(L=null==(j=S)?void 0:j.stdout)?L:"",stderr:null!=(B=null==(E=S)?void 0:E.stderr)?B:"",status:0,timeSeconds:t.timeLimitSeconds+.001,memoryBytes:null!=(T=null==(x=S)?void 0:x.memoryBytes)?T:0,timedOut:!0,signal:null==(P=S)?void 0:P.signal,outputLimitExceeded:!1});case 7:return e.n=8,b(g,{cwd:s,env:l,outputLimitBytes:k,stdin:null!=(c=t.stdin)?c:"",timeLimitSeconds:w});case 8:if(D=e.v,G=(Date.now()-v)/1e3,!S){e.n=9;break}return e.a(2,d({elapsedTimeSeconds:G,options:t,result:n.objectSpread2(n.objectSpread2({},D),{},{timeSeconds:S.timeSeconds+D.timeSeconds,memoryBytes:Math.max(S.memoryBytes,D.memoryBytes)})}));case 9:return e.a(2,d({elapsedTimeSeconds:G,options:t,result:D}));case 10:return e.p=10,e.n=11,o.rm(s,{force:!0,recursive:!0});case 11:return e.f(10);case 12:return e.a(2)}},e,null,[[2,,10,12]])})),l.apply(this,arguments)}function d(e){var t;return{stdin:null!=(t=e.options.stdin)?t:"",stdout:e.result.stdout,stderr:e.result.stderr,status:e.result.timedOut||e.result.outputLimitExceeded?0:e.result.status,timeSeconds:e.result.timedOut?e.options.timeLimitSeconds+.001:e.result.timeSeconds||e.elapsedTimeSeconds,memoryBytes:e.result.memoryBytes,timedOut:e.result.timedOut,signal:e.result.signal,outputLimitExceeded:e.result.outputLimitExceeded}}function m(e,t){if(e.install){if(!0===e.install){var n=u[e.packageManager];if(void 0===n)throw new Error("No default install command is available for package manager: ".concat(e.packageManager));return n}return"function"==typeof e.install?e.install({runDir:t}):e.install}}function p(e){return 0!==e.status||e.timedOut||e.outputLimitExceeded}function f(e){return y.apply(this,arguments)}function y(){return(y=n.asyncToGenerator(n.regenerator().m(function e(t){var r,o,i,u,c;return n.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:o=n.createForOfIteratorHelper(null!=(r=t.projectFilePaths)?r:s[t.packageManager]),e.p=1,o.s();case 2:if((i=o.n()).done){e.n=4;break}return u=i.value,e.n=3,g(a.join(t.projectDir,u),a.join(t.runDir,u));case 3:e.n=2;break;case 4:e.n=6;break;case 5:e.p=5,c=e.v,o.e(c);case 6:return e.p=6,o.f(),e.f(6);case 7:return e.a(2)}},e,null,[[1,5,6,7]])}))).apply(this,arguments)}function g(e,t){return v.apply(this,arguments)}function v(){return(v=n.asyncToGenerator(n.regenerator().m(function e(t,r){var i;return n.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,o.cp(t,r,{recursive:!0});case 1:e.n=3;break;case 2:if(e.p=2,i=e.v,"ENOENT"===("object"===n.typeof(i)&&null!==i&&"code"in i?i.code:void 0)){e.n=3;break}throw i;case 3:return e.a(2)}},e,null,[[0,2]])}))).apply(this,arguments)}function b(e,t){return k.apply(this,arguments)}function k(){return k=n.asyncToGenerator(n.regenerator().m(function e(t,o){var i,s,u,l,d,m,p,f,y,g,v,b,k,h,L,j,B,E;return n.regenerator().w(function(e){for(;;)switch(e.n){case 0:return i=void 0===c?void 0:a.join(o.cwd,".exercode-time-result"),s=void 0===c?t:[].concat(n.toConsumableArray(c),["--output=".concat(i)],n.toConsumableArray(t)),u=r.spawn(s[0],s.slice(1),{cwd:o.cwd,detached:"win32"!==process.platform,env:o.env,stdio:["pipe","pipe","pipe"]}),l=[],d=[],m=0,p=!1,f=!1,y=function(e,t){if(m>=o.outputLimitBytes)t.byteLength>0&&(f=!0,S(u,"SIGKILL"));else{var n=o.outputLimitBytes-m,r=t.byteLength>n?t.subarray(0,n):t;e.push(r),m+=r.byteLength,t.byteLength>n&&(f=!0,S(u,"SIGKILL"))}},u.stdout.on("data",function(e){return y(l,e)}),u.stderr.on("data",function(e){return y(d,e)}),g=setTimeout(function(){p=!0,S(u,"SIGTERM")},1e3*o.timeLimitSeconds),(v=setTimeout(function(){p&&S(u,"SIGKILL")},1e3*o.timeLimitSeconds+1e3)).unref(),e.n=1,new Promise(function(e,t){var n,r=!1,i=function(e){r||(n=e,S(u,"SIGKILL"),void 0===u.pid&&(r=!0,t(e)))};u.on("error",i),u.stdin.on("error",function(e){"EPIPE"!==e.code&&i(e)}),u.on("close",function(o,i){r||(r=!0,n?t(n):e({status:null!=o?o:void 0,signal:null!=i?i:void 0}))}),u.stdin.end(o.stdin)}).finally(function(){clearTimeout(g),clearTimeout(v)});case 1:if(b=e.v,k=b.status,h=b.signal,void 0!==i){e.n=2;break}E={timeSeconds:0,memoryBytes:0},e.n=4;break;case 2:return e.n=3,w(i);case 3:E=e.v;case 4:return j=(L=E).timeSeconds,B=L.memoryBytes,e.a(2,{stdout:Buffer.concat(l).toString(),stderr:Buffer.concat(d).toString(),status:k,timeSeconds:j,memoryBytes:B,timedOut:p,signal:h,outputLimitExceeded:f})}},e)})),k.apply(this,arguments)}function S(e,t){if(void 0!==e.pid)try{if("win32"===process.platform)return void e.kill(t);process.kill(-e.pid,t)}catch(e){var r="object"===n.typeof(e)&&null!==e&&"code"in e?e.code:void 0;if("ESRCH"!==r&&"EPERM"!==r)throw e}}function w(e){return h.apply(this,arguments)}function h(){return(h=n.asyncToGenerator(n.regenerator().m(function e(t){var r,i,a;return n.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,o.readFile(t,"utf8");case 1:r=e.v,e.n=4;break;case 2:if(e.p=2,a=e.v,"ENOENT"===("object"===n.typeof(a)&&null!==a&&"code"in a?a.code:void 0)){e.n=3;break}throw a;case 3:return e.a(2,{timeSeconds:0,memoryBytes:0});case 4:if(i=/(\d+(?:[.,]\d+)?) (\d+)\s*$/.exec(r)){e.n=5;break}return e.a(2,{timeSeconds:0,memoryBytes:0});case 5:return e.a(2,{timeSeconds:Number(i[1].replace(",",".")),memoryBytes:1024*Number(i[2])})}},e,null,[[0,2]])}))).apply(this,arguments)}exports.copyPackageManagerProjectFiles=f,exports.runCommandInTemporaryPackageManagerProject=function(e){return l.apply(this,arguments)};
|
|
2
2
|
//# sourceMappingURL=runCommandInTemporaryPackageManagerProject.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runCommandInTemporaryPackageManagerProject.cjs","sources":["../../src/helpers/runCommandInTemporaryPackageManagerProject.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport type PackageManager = 'bun' | 'cargo' | 'go' | 'gradle' | 'maven' | 'npm' | 'pnpm' | 'ruby' | 'uv' | 'yarn';\n\nexport interface PackageManagerCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}\n\nexport interface RunCommandInTemporaryPackageManagerProjectOptions {\n cwd: string;\n projectDir: string;\n packageManager: PackageManager;\n command: readonly [string, ...string[]] | ((context: { runDir: string }) => readonly [string, ...string[]]);\n stdin?: string;\n env?: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n outputLimitBytes?: number;\n tempDirPrefix?: string;\n projectFilePaths?: readonly string[];\n}\n\nconst packageManagerProjectFilePaths = {\n bun: ['package.json', 'bun.lock', 'bun.lockb'],\n cargo: ['Cargo.toml', 'Cargo.lock'],\n go: ['go.mod', 'go.sum'],\n gradle: [\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n 'gradle.properties',\n 'gradle',\n 'gradlew',\n 'gradlew.bat',\n ],\n maven: ['pom.xml', '.mvn', 'mvnw', 'mvnw.cmd'],\n npm: ['package.json', 'package-lock.json'],\n pnpm: ['package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml'],\n ruby: ['Gemfile', 'Gemfile.lock', '.ruby-version'],\n uv: ['pyproject.toml', 'uv.lock'],\n yarn: ['package.json', 'yarn.lock', '.yarnrc.yml', '.yarn'],\n} as const satisfies Record<PackageManager, readonly string[]>;\n\nconst defaultOutputLimitBytes = 50 * 1024 * 1024;\nconst killGracePeriodMilliseconds = 1000;\nconst timeCommand = resolveTimeCommand();\n\n/**\n * Copies a submission directory to a temporary directory, overlays package\n * manager project files from the problem directory, runs a command, and then\n * removes the temporary directory.\n */\nexport async function runCommandInTemporaryPackageManagerProject(\n options: RunCommandInTemporaryPackageManagerProjectOptions\n): Promise<PackageManagerCommandRunResult> {\n const runDir = await fs.mkdtemp(path.join(os.tmpdir(), options.tempDirPrefix ?? 'exercode-'));\n try {\n await fs.cp(options.cwd, runDir, { recursive: true });\n await copyPackageManagerProjectFiles({\n packageManager: options.packageManager,\n projectDir: options.projectDir,\n runDir,\n projectFilePaths: options.projectFilePaths,\n });\n\n const command = typeof options.command === 'function' ? options.command({ runDir }) : options.command;\n const startedAt = Date.now();\n const result = await spawnWithInput(command, {\n cwd: runDir,\n env: options.env ? { ...process.env, ...options.env } : process.env,\n outputLimitBytes: options.outputLimitBytes ?? defaultOutputLimitBytes,\n stdin: options.stdin ?? '',\n timeLimitSeconds: options.timeLimitSeconds,\n });\n const elapsedTimeSeconds = (Date.now() - startedAt) / 1000;\n\n return {\n stdin: options.stdin ?? '',\n stdout: result.stdout,\n stderr: result.stderr,\n status: result.timedOut || result.outputLimitExceeded ? 0 : result.status,\n timeSeconds: result.timedOut ? options.timeLimitSeconds + 1e-3 : result.timeSeconds || elapsedTimeSeconds,\n memoryBytes: result.memoryBytes,\n timedOut: result.timedOut,\n signal: result.signal,\n outputLimitExceeded: result.outputLimitExceeded,\n };\n } finally {\n await fs.rm(runDir, { force: true, recursive: true });\n }\n}\n\nexport async function copyPackageManagerProjectFiles(options: {\n packageManager: PackageManager;\n projectDir: string;\n runDir: string;\n projectFilePaths?: readonly string[];\n}): Promise<void> {\n for (const projectFilePath of options.projectFilePaths ?? packageManagerProjectFilePaths[options.packageManager]) {\n await copyPathIfExists(path.join(options.projectDir, projectFilePath), path.join(options.runDir, projectFilePath));\n }\n}\n\nasync function copyPathIfExists(sourcePath: string, destinationPath: string): Promise<void> {\n try {\n await fs.cp(sourcePath, destinationPath, { recursive: true });\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n }\n}\n\nasync function spawnWithInput(\n command: readonly [string, ...string[]],\n context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n outputLimitBytes: number;\n stdin: string;\n timeLimitSeconds: number;\n }\n): Promise<{\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}> {\n const timeOutputPath = timeCommand === undefined ? undefined : path.join(context.cwd, '.exercode-time-result');\n const spawnedCommand =\n timeCommand === undefined ? command : ([...timeCommand, `--output=${timeOutputPath}`, ...command] as const);\n const subprocess = childProcess.spawn(spawnedCommand[0], spawnedCommand.slice(1), {\n cwd: context.cwd,\n detached: process.platform !== 'win32',\n env: context.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let outputBytes = 0;\n let timedOut = false;\n let outputLimitExceeded = false;\n\n const appendOutputChunk = (chunks: Buffer[], chunk: Buffer): void => {\n if (outputBytes >= context.outputLimitBytes) {\n if (chunk.byteLength > 0) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n return;\n }\n\n const remainingBytes = context.outputLimitBytes - outputBytes;\n const appendedChunk = chunk.byteLength > remainingBytes ? chunk.subarray(0, remainingBytes) : chunk;\n chunks.push(appendedChunk);\n outputBytes += appendedChunk.byteLength;\n\n if (chunk.byteLength > remainingBytes) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n };\n\n subprocess.stdout.on('data', (chunk: Buffer) => appendOutputChunk(stdoutChunks, chunk));\n subprocess.stderr.on('data', (chunk: Buffer) => appendOutputChunk(stderrChunks, chunk));\n\n const timeout = setTimeout(() => {\n timedOut = true;\n killSubprocessGroup(subprocess, 'SIGTERM');\n }, context.timeLimitSeconds * 1000);\n const killTimeout = setTimeout(\n () => {\n if (timedOut) killSubprocessGroup(subprocess, 'SIGKILL');\n },\n context.timeLimitSeconds * 1000 + killGracePeriodMilliseconds\n );\n killTimeout.unref();\n\n const { status, signal } = await new Promise<{ status: number | undefined; signal: NodeJS.Signals | undefined }>(\n (resolve, reject) => {\n let settled = false;\n let pendingError: Error | undefined;\n const failAfterClose = (error: Error): void => {\n if (settled) return;\n pendingError = error;\n killSubprocessGroup(subprocess, 'SIGKILL');\n if (subprocess.pid === undefined) {\n settled = true;\n reject(error);\n }\n };\n subprocess.on('error', failAfterClose);\n subprocess.stdin.on('error', (error: NodeJS.ErrnoException) => {\n if (error.code !== 'EPIPE') failAfterClose(error);\n });\n subprocess.on('close', (code, closeSignal) => {\n if (settled) return;\n settled = true;\n if (pendingError) {\n reject(pendingError);\n return;\n }\n resolve({ status: code ?? undefined, signal: closeSignal ?? undefined });\n });\n subprocess.stdin.end(context.stdin);\n }\n ).finally(() => {\n clearTimeout(timeout);\n clearTimeout(killTimeout);\n });\n\n const { timeSeconds, memoryBytes } =\n timeOutputPath === undefined ? { timeSeconds: 0, memoryBytes: 0 } : await readTimeResult(timeOutputPath);\n\n return {\n stdout: Buffer.concat(stdoutChunks).toString(),\n stderr: Buffer.concat(stderrChunks).toString(),\n status,\n timeSeconds,\n memoryBytes,\n timedOut,\n signal,\n outputLimitExceeded,\n };\n}\n\nfunction resolveTimeCommand(): readonly [string, ...string[]] | undefined {\n const command = os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time';\n const result = childProcess.spawnSync(command, ['--version'], { stdio: 'ignore' });\n if (result.error || result.status !== 0) return undefined;\n\n return [command, '--format', '%e %M'];\n}\n\nfunction killSubprocessGroup(subprocess: childProcess.ChildProcess, signal: NodeJS.Signals): void {\n if (subprocess.pid === undefined) return;\n\n try {\n if (process.platform === 'win32') {\n subprocess.kill(signal);\n return;\n }\n process.kill(-subprocess.pid, signal);\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ESRCH' && code !== 'EPERM') throw error;\n }\n}\n\nasync function readTimeResult(timeOutputPath: string): Promise<{ timeSeconds: number; memoryBytes: number }> {\n let content: string;\n try {\n content = await fs.readFile(timeOutputPath, 'utf8');\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n return { timeSeconds: 0, memoryBytes: 0 };\n }\n\n const match = /(\\d+(?:[.,]\\d+)?) (\\d+)\\s*$/.exec(content);\n if (!match) return { timeSeconds: 0, memoryBytes: 0 };\n\n return { timeSeconds: Number(match[1]!.replace(',', '.')), memoryBytes: Number(match[2]) * 1024 };\n}\n"],"names":["command","result","packageManagerProjectFilePaths","bun","cargo","go","gradle","maven","npm","pnpm","ruby","uv","yarn","timeCommand","os","platform","childProcess","spawnSync","stdio","error","status","_runCommandInTemporaryPackageManagerProject","_asyncToGenerator","_regenerator","m","_callee","options","_options$tempDirPrefi","runDir","_options$outputLimitB","_options$stdin","_options$stdin2","startedAt","elapsedTimeSeconds","w","_context","p","n","fs","mkdtemp","path","join","tmpdir","tempDirPrefix","v","cp","cwd","recursive","copyPackageManagerProjectFiles","packageManager","projectDir","projectFilePaths","Date","now","spawnWithInput","env","_objectSpread","process","outputLimitBytes","stdin","timeLimitSeconds","a","stdout","stderr","timedOut","outputLimitExceeded","timeSeconds","memoryBytes","signal","rm","force","f","apply","this","arguments","_x2","_copyPackageManagerProjectFiles","_callee2","_options$projectFileP","_iterator","_step","projectFilePath","_t","_context2","_createForOfIteratorHelper","s","done","value","copyPathIfExists","e","_x3","_x4","_copyPathIfExists","_callee3","sourcePath","destinationPath","_t2","_context3","_typeof","code","undefined","_x5","_x6","_spawnWithInput","_callee4","context","timeOutputPath","spawnedCommand","subprocess","stdoutChunks","stderrChunks","outputBytes","appendOutputChunk","timeout","killTimeout","_yield$Promise$finall","_ref","_t3","_context4","concat","_toConsumableArray","spawn","slice","detached","chunks","chunk","byteLength","killSubprocessGroup","remainingBytes","appendedChunk","subarray","push","on","setTimeout","unref","Promise","resolve","reject","pendingError","settled","failAfterClose","pid","closeSignal","end","clearTimeout","readTimeResult","Buffer","toString","kill","_x7","_readTimeResult","_callee5","content","match","_t4","_context5","readFile","exec","Number","replace","_x"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runCommandInTemporaryPackageManagerProject.cjs","sources":["../../src/helpers/runCommandInTemporaryPackageManagerProject.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport type PackageManager = 'bun' | 'cargo' | 'go' | 'gradle' | 'maven' | 'npm' | 'pnpm' | 'ruby' | 'uv' | 'yarn';\n\nexport interface PackageManagerCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}\n\nexport interface RunCommandInTemporaryPackageManagerProjectOptions {\n cwd: string;\n projectDir: string;\n packageManager: PackageManager;\n command: readonly [string, ...string[]] | ((context: { runDir: string }) => readonly [string, ...string[]]);\n install?:\n | boolean\n | readonly [string, ...string[]]\n | ((context: { runDir: string }) => readonly [string, ...string[]]);\n stdin?: string;\n env?: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n outputLimitBytes?: number;\n tempDirPrefix?: string;\n projectFilePaths?: readonly string[];\n}\n\nconst packageManagerProjectFilePaths = {\n bun: ['package.json', 'bun.lock', 'bun.lockb'],\n cargo: ['Cargo.toml', 'Cargo.lock'],\n go: ['go.mod', 'go.sum'],\n gradle: [\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n 'gradle.properties',\n 'gradle',\n 'gradlew',\n 'gradlew.bat',\n ],\n maven: ['pom.xml', '.mvn', 'mvnw', 'mvnw.cmd'],\n npm: ['package.json', 'package-lock.json'],\n pnpm: ['package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml'],\n ruby: ['Gemfile', 'Gemfile.lock', '.ruby-version'],\n uv: ['pyproject.toml', 'uv.lock'],\n yarn: ['package.json', 'yarn.lock', '.yarnrc.yml', '.yarn'],\n} as const satisfies Record<PackageManager, readonly string[]>;\n\nconst packageManagerInstallCommands: Partial<Record<PackageManager, readonly [string, ...string[]]>> = {\n bun: ['bun', 'install', '--silent'],\n npm: ['npm', 'install', '--silent'],\n pnpm: ['pnpm', 'install', '--silent'],\n yarn: ['yarn', 'install', '--silent'],\n};\n\nconst defaultOutputLimitBytes = 50 * 1024 * 1024;\nconst killGracePeriodMilliseconds = 1000;\nconst timeCommand = resolveTimeCommand();\n\n/**\n * Copies a submission directory to a temporary directory, overlays package\n * manager project files from the problem directory, optionally installs\n * dependencies, runs a command, and then removes the temporary directory.\n */\nexport async function runCommandInTemporaryPackageManagerProject(\n options: RunCommandInTemporaryPackageManagerProjectOptions\n): Promise<PackageManagerCommandRunResult> {\n const runDir = await fs.mkdtemp(path.join(os.tmpdir(), options.tempDirPrefix ?? 'exercode-'));\n try {\n await fs.cp(options.cwd, runDir, { recursive: true });\n await copyPackageManagerProjectFiles({\n packageManager: options.packageManager,\n projectDir: options.projectDir,\n runDir,\n projectFilePaths: options.projectFilePaths,\n });\n\n const env = options.env ? { ...process.env, ...options.env } : process.env;\n const installCommand = resolveInstallCommand(options, runDir);\n const command = typeof options.command === 'function' ? options.command({ runDir }) : options.command;\n const startedAt = Date.now();\n const outputLimitBytes = options.outputLimitBytes ?? defaultOutputLimitBytes;\n let installResult: Awaited<ReturnType<typeof spawnWithInput>> | undefined;\n\n if (installCommand) {\n installResult = await spawnWithInput(installCommand, {\n cwd: runDir,\n env,\n outputLimitBytes,\n stdin: '',\n timeLimitSeconds: options.timeLimitSeconds,\n });\n if (isFailedSpawnResult(installResult)) {\n return toPackageManagerCommandRunResult({\n elapsedTimeSeconds: (Date.now() - startedAt) / 1000,\n options,\n result: installResult,\n });\n }\n }\n\n const remainingTimeLimitSeconds = options.timeLimitSeconds - (Date.now() - startedAt) / 1000;\n if (remainingTimeLimitSeconds <= 0) {\n return {\n stdin: options.stdin ?? '',\n stdout: installResult?.stdout ?? '',\n stderr: installResult?.stderr ?? '',\n status: 0,\n timeSeconds: options.timeLimitSeconds + 1e-3,\n memoryBytes: installResult?.memoryBytes ?? 0,\n timedOut: true,\n signal: installResult?.signal,\n outputLimitExceeded: false,\n };\n }\n\n const result = await spawnWithInput(command, {\n cwd: runDir,\n env,\n outputLimitBytes,\n stdin: options.stdin ?? '',\n timeLimitSeconds: remainingTimeLimitSeconds,\n });\n const elapsedTimeSeconds = (Date.now() - startedAt) / 1000;\n\n if (installResult) {\n return toPackageManagerCommandRunResult({\n elapsedTimeSeconds,\n options,\n result: {\n ...result,\n timeSeconds: installResult.timeSeconds + result.timeSeconds,\n memoryBytes: Math.max(installResult.memoryBytes, result.memoryBytes),\n },\n });\n }\n\n return toPackageManagerCommandRunResult({ elapsedTimeSeconds, options, result });\n } finally {\n await fs.rm(runDir, { force: true, recursive: true });\n }\n}\n\nfunction toPackageManagerCommandRunResult(context: {\n elapsedTimeSeconds: number;\n options: RunCommandInTemporaryPackageManagerProjectOptions;\n result: Awaited<ReturnType<typeof spawnWithInput>>;\n}): PackageManagerCommandRunResult {\n return {\n stdin: context.options.stdin ?? '',\n stdout: context.result.stdout,\n stderr: context.result.stderr,\n status: context.result.timedOut || context.result.outputLimitExceeded ? 0 : context.result.status,\n timeSeconds: context.result.timedOut\n ? context.options.timeLimitSeconds + 1e-3\n : context.result.timeSeconds || context.elapsedTimeSeconds,\n memoryBytes: context.result.memoryBytes,\n timedOut: context.result.timedOut,\n signal: context.result.signal,\n outputLimitExceeded: context.result.outputLimitExceeded,\n };\n}\n\nfunction resolveInstallCommand(\n options: RunCommandInTemporaryPackageManagerProjectOptions,\n runDir: string\n): readonly [string, ...string[]] | undefined {\n if (!options.install) return undefined;\n if (options.install === true) {\n const installCommand = packageManagerInstallCommands[options.packageManager];\n if (installCommand === undefined) {\n throw new Error(`No default install command is available for package manager: ${options.packageManager}`);\n }\n return installCommand;\n }\n return typeof options.install === 'function' ? options.install({ runDir }) : options.install;\n}\n\nfunction isFailedSpawnResult(result: Awaited<ReturnType<typeof spawnWithInput>>): boolean {\n return result.status !== 0 || result.timedOut || result.outputLimitExceeded;\n}\n\nexport async function copyPackageManagerProjectFiles(options: {\n packageManager: PackageManager;\n projectDir: string;\n runDir: string;\n projectFilePaths?: readonly string[];\n}): Promise<void> {\n for (const projectFilePath of options.projectFilePaths ?? packageManagerProjectFilePaths[options.packageManager]) {\n await copyPathIfExists(path.join(options.projectDir, projectFilePath), path.join(options.runDir, projectFilePath));\n }\n}\n\nasync function copyPathIfExists(sourcePath: string, destinationPath: string): Promise<void> {\n try {\n await fs.cp(sourcePath, destinationPath, { recursive: true });\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n }\n}\n\nasync function spawnWithInput(\n command: readonly [string, ...string[]],\n context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n outputLimitBytes: number;\n stdin: string;\n timeLimitSeconds: number;\n }\n): Promise<{\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}> {\n const timeOutputPath = timeCommand === undefined ? undefined : path.join(context.cwd, '.exercode-time-result');\n const spawnedCommand =\n timeCommand === undefined ? command : ([...timeCommand, `--output=${timeOutputPath}`, ...command] as const);\n const subprocess = childProcess.spawn(spawnedCommand[0], spawnedCommand.slice(1), {\n cwd: context.cwd,\n detached: process.platform !== 'win32',\n env: context.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let outputBytes = 0;\n let timedOut = false;\n let outputLimitExceeded = false;\n\n const appendOutputChunk = (chunks: Buffer[], chunk: Buffer): void => {\n if (outputBytes >= context.outputLimitBytes) {\n if (chunk.byteLength > 0) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n return;\n }\n\n const remainingBytes = context.outputLimitBytes - outputBytes;\n const appendedChunk = chunk.byteLength > remainingBytes ? chunk.subarray(0, remainingBytes) : chunk;\n chunks.push(appendedChunk);\n outputBytes += appendedChunk.byteLength;\n\n if (chunk.byteLength > remainingBytes) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n };\n\n subprocess.stdout.on('data', (chunk: Buffer) => appendOutputChunk(stdoutChunks, chunk));\n subprocess.stderr.on('data', (chunk: Buffer) => appendOutputChunk(stderrChunks, chunk));\n\n const timeout = setTimeout(() => {\n timedOut = true;\n killSubprocessGroup(subprocess, 'SIGTERM');\n }, context.timeLimitSeconds * 1000);\n const killTimeout = setTimeout(\n () => {\n if (timedOut) killSubprocessGroup(subprocess, 'SIGKILL');\n },\n context.timeLimitSeconds * 1000 + killGracePeriodMilliseconds\n );\n killTimeout.unref();\n\n const { status, signal } = await new Promise<{ status: number | undefined; signal: NodeJS.Signals | undefined }>(\n (resolve, reject) => {\n let settled = false;\n let pendingError: Error | undefined;\n const failAfterClose = (error: Error): void => {\n if (settled) return;\n pendingError = error;\n killSubprocessGroup(subprocess, 'SIGKILL');\n if (subprocess.pid === undefined) {\n settled = true;\n reject(error);\n }\n };\n subprocess.on('error', failAfterClose);\n subprocess.stdin.on('error', (error: NodeJS.ErrnoException) => {\n if (error.code !== 'EPIPE') failAfterClose(error);\n });\n subprocess.on('close', (code, closeSignal) => {\n if (settled) return;\n settled = true;\n if (pendingError) {\n reject(pendingError);\n return;\n }\n resolve({ status: code ?? undefined, signal: closeSignal ?? undefined });\n });\n subprocess.stdin.end(context.stdin);\n }\n ).finally(() => {\n clearTimeout(timeout);\n clearTimeout(killTimeout);\n });\n\n const { timeSeconds, memoryBytes } =\n timeOutputPath === undefined ? { timeSeconds: 0, memoryBytes: 0 } : await readTimeResult(timeOutputPath);\n\n return {\n stdout: Buffer.concat(stdoutChunks).toString(),\n stderr: Buffer.concat(stderrChunks).toString(),\n status,\n timeSeconds,\n memoryBytes,\n timedOut,\n signal,\n outputLimitExceeded,\n };\n}\n\nfunction resolveTimeCommand(): readonly [string, ...string[]] | undefined {\n const command = os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time';\n const result = childProcess.spawnSync(command, ['--version'], { stdio: 'ignore' });\n if (result.error || result.status !== 0) return undefined;\n\n return [command, '--format', '%e %M'];\n}\n\nfunction killSubprocessGroup(subprocess: childProcess.ChildProcess, signal: NodeJS.Signals): void {\n if (subprocess.pid === undefined) return;\n\n try {\n if (process.platform === 'win32') {\n subprocess.kill(signal);\n return;\n }\n process.kill(-subprocess.pid, signal);\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ESRCH' && code !== 'EPERM') throw error;\n }\n}\n\nasync function readTimeResult(timeOutputPath: string): Promise<{ timeSeconds: number; memoryBytes: number }> {\n let content: string;\n try {\n content = await fs.readFile(timeOutputPath, 'utf8');\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n return { timeSeconds: 0, memoryBytes: 0 };\n }\n\n const match = /(\\d+(?:[.,]\\d+)?) (\\d+)\\s*$/.exec(content);\n if (!match) return { timeSeconds: 0, memoryBytes: 0 };\n\n return { timeSeconds: Number(match[1]!.replace(',', '.')), memoryBytes: Number(match[2]) * 1024 };\n}\n"],"names":["command","result","packageManagerProjectFilePaths","bun","cargo","go","gradle","maven","npm","pnpm","ruby","uv","yarn","packageManagerInstallCommands","timeCommand","os","platform","childProcess","spawnSync","stdio","error","status","_runCommandInTemporaryPackageManagerProject","_asyncToGenerator","_regenerator","m","_callee","options","_options$tempDirPrefi","runDir","_options$outputLimitB","_options$stdin2","env","installCommand","startedAt","outputLimitBytes","installResult","remainingTimeLimitSeconds","_options$stdin","_installResult$stdout","_installResult","_installResult$stderr","_installResult2","_installResult$memory","_installResult3","_installResult4","elapsedTimeSeconds","w","_context","p","n","fs","mkdtemp","path","join","tmpdir","tempDirPrefix","v","cp","cwd","recursive","copyPackageManagerProjectFiles","packageManager","projectDir","projectFilePaths","_objectSpread","process","resolveInstallCommand","Date","now","spawnWithInput","stdin","timeLimitSeconds","isFailedSpawnResult","a","toPackageManagerCommandRunResult","stdout","stderr","timeSeconds","memoryBytes","timedOut","signal","outputLimitExceeded","Math","max","rm","force","f","apply","this","arguments","context","_context$options$stdi","install","undefined","Error","concat","_x2","_copyPackageManagerProjectFiles","_callee2","_options$projectFileP","_iterator","_step","projectFilePath","_t","_context2","_createForOfIteratorHelper","s","done","value","copyPathIfExists","e","_x3","_x4","_copyPathIfExists","_callee3","sourcePath","destinationPath","_t2","_context3","_typeof","code","_x5","_x6","_spawnWithInput","_callee4","timeOutputPath","spawnedCommand","subprocess","stdoutChunks","stderrChunks","outputBytes","appendOutputChunk","timeout","killTimeout","_yield$Promise$finall","_ref","_t3","_context4","_toConsumableArray","spawn","slice","detached","chunks","chunk","byteLength","killSubprocessGroup","remainingBytes","appendedChunk","subarray","push","on","setTimeout","unref","Promise","resolve","reject","pendingError","settled","failAfterClose","pid","closeSignal","end","clearTimeout","readTimeResult","Buffer","toString","kill","_x7","_readTimeResult","_callee5","content","match","_t4","_context5","readFile","exec","Number","replace","_x"],"mappings":"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"}
|
|
@@ -17,6 +17,9 @@ export interface RunCommandInTemporaryPackageManagerProjectOptions {
|
|
|
17
17
|
command: readonly [string, ...string[]] | ((context: {
|
|
18
18
|
runDir: string;
|
|
19
19
|
}) => readonly [string, ...string[]]);
|
|
20
|
+
install?: boolean | readonly [string, ...string[]] | ((context: {
|
|
21
|
+
runDir: string;
|
|
22
|
+
}) => readonly [string, ...string[]]);
|
|
20
23
|
stdin?: string;
|
|
21
24
|
env?: NodeJS.ProcessEnv;
|
|
22
25
|
timeLimitSeconds: number;
|
|
@@ -26,8 +29,8 @@ export interface RunCommandInTemporaryPackageManagerProjectOptions {
|
|
|
26
29
|
}
|
|
27
30
|
/**
|
|
28
31
|
* Copies a submission directory to a temporary directory, overlays package
|
|
29
|
-
* manager project files from the problem directory,
|
|
30
|
-
* removes the temporary directory.
|
|
32
|
+
* manager project files from the problem directory, optionally installs
|
|
33
|
+
* dependencies, runs a command, and then removes the temporary directory.
|
|
31
34
|
*/
|
|
32
35
|
export declare function runCommandInTemporaryPackageManagerProject(options: RunCommandInTemporaryPackageManagerProjectOptions): Promise<PackageManagerCommandRunResult>;
|
|
33
36
|
export declare function copyPackageManagerProjectFiles(options: {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asyncToGenerator as e,regenerator as t,objectSpread2 as n,createForOfIteratorHelper as r,typeof as
|
|
1
|
+
import{asyncToGenerator as e,regenerator as t,objectSpread2 as n,createForOfIteratorHelper as r,typeof as i,toConsumableArray as o}from"../_virtual/_rollupPluginBabelHelpers.js";import s from"node:child_process";import a from"node:fs/promises";import u from"node:os";import c from"node:path";var l,m,d={bun:["package.json","bun.lock","bun.lockb"],cargo:["Cargo.toml","Cargo.lock"],go:["go.mod","go.sum"],gradle:["build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","gradle","gradlew","gradlew.bat"],maven:["pom.xml",".mvn","mvnw","mvnw.cmd"],npm:["package.json","package-lock.json"],pnpm:["package.json","pnpm-lock.yaml","pnpm-workspace.yaml"],ruby:["Gemfile","Gemfile.lock",".ruby-version"],uv:["pyproject.toml","uv.lock"],yarn:["package.json","yarn.lock",".yarnrc.yml",".yarn"]},p={bun:["bun","install","--silent"],npm:["npm","install","--silent"],pnpm:["pnpm","install","--silent"],yarn:["yarn","install","--silent"]},f=(l="darwin"===u.platform()?"gtime":"/usr/bin/time",(m=s.spawnSync(l,["--version"],{stdio:"ignore"})).error||0!==m.status?void 0:[l,"--format","%e %M"]);function y(e){return v.apply(this,arguments)}function v(){return v=e(t().m(function e(r){var i,o,s,l,m,d,p,f,y,v,S,h,L,B,E,x,D,T,I,O,M;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.n=1,a.mkdtemp(c.join(u.tmpdir(),null!=(i=r.tempDirPrefix)?i:"exercode-"));case 1:return o=e.v,e.p=2,e.n=3,a.cp(r.cwd,o,{recursive:!0});case 3:return e.n=4,w({packageManager:r.packageManager,projectDir:r.projectDir,runDir:o,projectFilePaths:r.projectFilePaths});case 4:if(m=r.env?n(n({},process.env),r.env):process.env,d=b(r,o),p="function"==typeof r.command?r.command({runDir:o}):r.command,f=Date.now(),y=null!=(s=r.outputLimitBytes)?s:52428800,!d){e.n=6;break}return e.n=5,j(d,{cwd:o,env:m,outputLimitBytes:y,stdin:"",timeLimitSeconds:r.timeLimitSeconds});case 5:if(!k(v=e.v)){e.n=6;break}return e.a(2,g({elapsedTimeSeconds:(Date.now()-f)/1e3,options:r,result:v}));case 6:if(!((S=r.timeLimitSeconds-(Date.now()-f)/1e3)<=0)){e.n=7;break}return e.a(2,{stdin:null!=(h=r.stdin)?h:"",stdout:null!=(L=null==(B=v)?void 0:B.stdout)?L:"",stderr:null!=(E=null==(x=v)?void 0:x.stderr)?E:"",status:0,timeSeconds:r.timeLimitSeconds+.001,memoryBytes:null!=(D=null==(T=v)?void 0:T.memoryBytes)?D:0,timedOut:!0,signal:null==(I=v)?void 0:I.signal,outputLimitExceeded:!1});case 7:return e.n=8,j(p,{cwd:o,env:m,outputLimitBytes:y,stdin:null!=(l=r.stdin)?l:"",timeLimitSeconds:S});case 8:if(O=e.v,M=(Date.now()-f)/1e3,!v){e.n=9;break}return e.a(2,g({elapsedTimeSeconds:M,options:r,result:n(n({},O),{},{timeSeconds:v.timeSeconds+O.timeSeconds,memoryBytes:Math.max(v.memoryBytes,O.memoryBytes)})}));case 9:return e.a(2,g({elapsedTimeSeconds:M,options:r,result:O}));case 10:return e.p=10,e.n=11,a.rm(o,{force:!0,recursive:!0});case 11:return e.f(10);case 12:return e.a(2)}},e,null,[[2,,10,12]])})),v.apply(this,arguments)}function g(e){var t;return{stdin:null!=(t=e.options.stdin)?t:"",stdout:e.result.stdout,stderr:e.result.stderr,status:e.result.timedOut||e.result.outputLimitExceeded?0:e.result.status,timeSeconds:e.result.timedOut?e.options.timeLimitSeconds+.001:e.result.timeSeconds||e.elapsedTimeSeconds,memoryBytes:e.result.memoryBytes,timedOut:e.result.timedOut,signal:e.result.signal,outputLimitExceeded:e.result.outputLimitExceeded}}function b(e,t){if(e.install){if(!0===e.install){var n=p[e.packageManager];if(void 0===n)throw new Error("No default install command is available for package manager: ".concat(e.packageManager));return n}return"function"==typeof e.install?e.install({runDir:t}):e.install}}function k(e){return 0!==e.status||e.timedOut||e.outputLimitExceeded}function w(e){return S.apply(this,arguments)}function S(){return(S=e(t().m(function e(n){var i,o,s,a,u;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:o=r(null!=(i=n.projectFilePaths)?i:d[n.packageManager]),e.p=1,o.s();case 2:if((s=o.n()).done){e.n=4;break}return a=s.value,e.n=3,h(c.join(n.projectDir,a),c.join(n.runDir,a));case 3:e.n=2;break;case 4:e.n=6;break;case 5:e.p=5,u=e.v,o.e(u);case 6:return e.p=6,o.f(),e.f(6);case 7:return e.a(2)}},e,null,[[1,5,6,7]])}))).apply(this,arguments)}function h(e,t){return L.apply(this,arguments)}function L(){return(L=e(t().m(function e(n,r){var o;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,a.cp(n,r,{recursive:!0});case 1:e.n=3;break;case 2:if(e.p=2,o=e.v,"ENOENT"===("object"===i(o)&&null!==o&&"code"in o?o.code:void 0)){e.n=3;break}throw o;case 3:return e.a(2)}},e,null,[[0,2]])}))).apply(this,arguments)}function j(e,t){return B.apply(this,arguments)}function B(){return B=e(t().m(function e(n,r){var i,a,u,l,m,d,p,y,v,g,b,k,w,S,h,L,j,B;return t().w(function(e){for(;;)switch(e.n){case 0:return i=void 0===f?void 0:c.join(r.cwd,".exercode-time-result"),a=void 0===f?n:[].concat(o(f),["--output=".concat(i)],o(n)),u=s.spawn(a[0],a.slice(1),{cwd:r.cwd,detached:"win32"!==process.platform,env:r.env,stdio:["pipe","pipe","pipe"]}),l=[],m=[],d=0,p=!1,y=!1,v=function(e,t){if(d>=r.outputLimitBytes)t.byteLength>0&&(y=!0,E(u,"SIGKILL"));else{var n=r.outputLimitBytes-d,i=t.byteLength>n?t.subarray(0,n):t;e.push(i),d+=i.byteLength,t.byteLength>n&&(y=!0,E(u,"SIGKILL"))}},u.stdout.on("data",function(e){return v(l,e)}),u.stderr.on("data",function(e){return v(m,e)}),g=setTimeout(function(){p=!0,E(u,"SIGTERM")},1e3*r.timeLimitSeconds),(b=setTimeout(function(){p&&E(u,"SIGKILL")},1e3*r.timeLimitSeconds+1e3)).unref(),e.n=1,new Promise(function(e,t){var n,i=!1,o=function(e){i||(n=e,E(u,"SIGKILL"),void 0===u.pid&&(i=!0,t(e)))};u.on("error",o),u.stdin.on("error",function(e){"EPIPE"!==e.code&&o(e)}),u.on("close",function(r,o){i||(i=!0,n?t(n):e({status:null!=r?r:void 0,signal:null!=o?o:void 0}))}),u.stdin.end(r.stdin)}).finally(function(){clearTimeout(g),clearTimeout(b)});case 1:if(k=e.v,w=k.status,S=k.signal,void 0!==i){e.n=2;break}B={timeSeconds:0,memoryBytes:0},e.n=4;break;case 2:return e.n=3,x(i);case 3:B=e.v;case 4:return L=(h=B).timeSeconds,j=h.memoryBytes,e.a(2,{stdout:Buffer.concat(l).toString(),stderr:Buffer.concat(m).toString(),status:w,timeSeconds:L,memoryBytes:j,timedOut:p,signal:S,outputLimitExceeded:y})}},e)})),B.apply(this,arguments)}function E(e,t){if(void 0!==e.pid)try{if("win32"===process.platform)return void e.kill(t);process.kill(-e.pid,t)}catch(e){var n="object"===i(e)&&null!==e&&"code"in e?e.code:void 0;if("ESRCH"!==n&&"EPERM"!==n)throw e}}function x(e){return D.apply(this,arguments)}function D(){return(D=e(t().m(function e(n){var r,o,s;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,a.readFile(n,"utf8");case 1:r=e.v,e.n=4;break;case 2:if(e.p=2,s=e.v,"ENOENT"===("object"===i(s)&&null!==s&&"code"in s?s.code:void 0)){e.n=3;break}throw s;case 3:return e.a(2,{timeSeconds:0,memoryBytes:0});case 4:if(o=/(\d+(?:[.,]\d+)?) (\d+)\s*$/.exec(r)){e.n=5;break}return e.a(2,{timeSeconds:0,memoryBytes:0});case 5:return e.a(2,{timeSeconds:Number(o[1].replace(",",".")),memoryBytes:1024*Number(o[2])})}},e,null,[[0,2]])}))).apply(this,arguments)}export{w as copyPackageManagerProjectFiles,y as runCommandInTemporaryPackageManagerProject};
|
|
2
2
|
//# sourceMappingURL=runCommandInTemporaryPackageManagerProject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runCommandInTemporaryPackageManagerProject.js","sources":["../../src/helpers/runCommandInTemporaryPackageManagerProject.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport type PackageManager = 'bun' | 'cargo' | 'go' | 'gradle' | 'maven' | 'npm' | 'pnpm' | 'ruby' | 'uv' | 'yarn';\n\nexport interface PackageManagerCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}\n\nexport interface RunCommandInTemporaryPackageManagerProjectOptions {\n cwd: string;\n projectDir: string;\n packageManager: PackageManager;\n command: readonly [string, ...string[]] | ((context: { runDir: string }) => readonly [string, ...string[]]);\n stdin?: string;\n env?: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n outputLimitBytes?: number;\n tempDirPrefix?: string;\n projectFilePaths?: readonly string[];\n}\n\nconst packageManagerProjectFilePaths = {\n bun: ['package.json', 'bun.lock', 'bun.lockb'],\n cargo: ['Cargo.toml', 'Cargo.lock'],\n go: ['go.mod', 'go.sum'],\n gradle: [\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n 'gradle.properties',\n 'gradle',\n 'gradlew',\n 'gradlew.bat',\n ],\n maven: ['pom.xml', '.mvn', 'mvnw', 'mvnw.cmd'],\n npm: ['package.json', 'package-lock.json'],\n pnpm: ['package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml'],\n ruby: ['Gemfile', 'Gemfile.lock', '.ruby-version'],\n uv: ['pyproject.toml', 'uv.lock'],\n yarn: ['package.json', 'yarn.lock', '.yarnrc.yml', '.yarn'],\n} as const satisfies Record<PackageManager, readonly string[]>;\n\nconst defaultOutputLimitBytes = 50 * 1024 * 1024;\nconst killGracePeriodMilliseconds = 1000;\nconst timeCommand = resolveTimeCommand();\n\n/**\n * Copies a submission directory to a temporary directory, overlays package\n * manager project files from the problem directory, runs a command, and then\n * removes the temporary directory.\n */\nexport async function runCommandInTemporaryPackageManagerProject(\n options: RunCommandInTemporaryPackageManagerProjectOptions\n): Promise<PackageManagerCommandRunResult> {\n const runDir = await fs.mkdtemp(path.join(os.tmpdir(), options.tempDirPrefix ?? 'exercode-'));\n try {\n await fs.cp(options.cwd, runDir, { recursive: true });\n await copyPackageManagerProjectFiles({\n packageManager: options.packageManager,\n projectDir: options.projectDir,\n runDir,\n projectFilePaths: options.projectFilePaths,\n });\n\n const command = typeof options.command === 'function' ? options.command({ runDir }) : options.command;\n const startedAt = Date.now();\n const result = await spawnWithInput(command, {\n cwd: runDir,\n env: options.env ? { ...process.env, ...options.env } : process.env,\n outputLimitBytes: options.outputLimitBytes ?? defaultOutputLimitBytes,\n stdin: options.stdin ?? '',\n timeLimitSeconds: options.timeLimitSeconds,\n });\n const elapsedTimeSeconds = (Date.now() - startedAt) / 1000;\n\n return {\n stdin: options.stdin ?? '',\n stdout: result.stdout,\n stderr: result.stderr,\n status: result.timedOut || result.outputLimitExceeded ? 0 : result.status,\n timeSeconds: result.timedOut ? options.timeLimitSeconds + 1e-3 : result.timeSeconds || elapsedTimeSeconds,\n memoryBytes: result.memoryBytes,\n timedOut: result.timedOut,\n signal: result.signal,\n outputLimitExceeded: result.outputLimitExceeded,\n };\n } finally {\n await fs.rm(runDir, { force: true, recursive: true });\n }\n}\n\nexport async function copyPackageManagerProjectFiles(options: {\n packageManager: PackageManager;\n projectDir: string;\n runDir: string;\n projectFilePaths?: readonly string[];\n}): Promise<void> {\n for (const projectFilePath of options.projectFilePaths ?? packageManagerProjectFilePaths[options.packageManager]) {\n await copyPathIfExists(path.join(options.projectDir, projectFilePath), path.join(options.runDir, projectFilePath));\n }\n}\n\nasync function copyPathIfExists(sourcePath: string, destinationPath: string): Promise<void> {\n try {\n await fs.cp(sourcePath, destinationPath, { recursive: true });\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n }\n}\n\nasync function spawnWithInput(\n command: readonly [string, ...string[]],\n context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n outputLimitBytes: number;\n stdin: string;\n timeLimitSeconds: number;\n }\n): Promise<{\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}> {\n const timeOutputPath = timeCommand === undefined ? undefined : path.join(context.cwd, '.exercode-time-result');\n const spawnedCommand =\n timeCommand === undefined ? command : ([...timeCommand, `--output=${timeOutputPath}`, ...command] as const);\n const subprocess = childProcess.spawn(spawnedCommand[0], spawnedCommand.slice(1), {\n cwd: context.cwd,\n detached: process.platform !== 'win32',\n env: context.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let outputBytes = 0;\n let timedOut = false;\n let outputLimitExceeded = false;\n\n const appendOutputChunk = (chunks: Buffer[], chunk: Buffer): void => {\n if (outputBytes >= context.outputLimitBytes) {\n if (chunk.byteLength > 0) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n return;\n }\n\n const remainingBytes = context.outputLimitBytes - outputBytes;\n const appendedChunk = chunk.byteLength > remainingBytes ? chunk.subarray(0, remainingBytes) : chunk;\n chunks.push(appendedChunk);\n outputBytes += appendedChunk.byteLength;\n\n if (chunk.byteLength > remainingBytes) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n };\n\n subprocess.stdout.on('data', (chunk: Buffer) => appendOutputChunk(stdoutChunks, chunk));\n subprocess.stderr.on('data', (chunk: Buffer) => appendOutputChunk(stderrChunks, chunk));\n\n const timeout = setTimeout(() => {\n timedOut = true;\n killSubprocessGroup(subprocess, 'SIGTERM');\n }, context.timeLimitSeconds * 1000);\n const killTimeout = setTimeout(\n () => {\n if (timedOut) killSubprocessGroup(subprocess, 'SIGKILL');\n },\n context.timeLimitSeconds * 1000 + killGracePeriodMilliseconds\n );\n killTimeout.unref();\n\n const { status, signal } = await new Promise<{ status: number | undefined; signal: NodeJS.Signals | undefined }>(\n (resolve, reject) => {\n let settled = false;\n let pendingError: Error | undefined;\n const failAfterClose = (error: Error): void => {\n if (settled) return;\n pendingError = error;\n killSubprocessGroup(subprocess, 'SIGKILL');\n if (subprocess.pid === undefined) {\n settled = true;\n reject(error);\n }\n };\n subprocess.on('error', failAfterClose);\n subprocess.stdin.on('error', (error: NodeJS.ErrnoException) => {\n if (error.code !== 'EPIPE') failAfterClose(error);\n });\n subprocess.on('close', (code, closeSignal) => {\n if (settled) return;\n settled = true;\n if (pendingError) {\n reject(pendingError);\n return;\n }\n resolve({ status: code ?? undefined, signal: closeSignal ?? undefined });\n });\n subprocess.stdin.end(context.stdin);\n }\n ).finally(() => {\n clearTimeout(timeout);\n clearTimeout(killTimeout);\n });\n\n const { timeSeconds, memoryBytes } =\n timeOutputPath === undefined ? { timeSeconds: 0, memoryBytes: 0 } : await readTimeResult(timeOutputPath);\n\n return {\n stdout: Buffer.concat(stdoutChunks).toString(),\n stderr: Buffer.concat(stderrChunks).toString(),\n status,\n timeSeconds,\n memoryBytes,\n timedOut,\n signal,\n outputLimitExceeded,\n };\n}\n\nfunction resolveTimeCommand(): readonly [string, ...string[]] | undefined {\n const command = os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time';\n const result = childProcess.spawnSync(command, ['--version'], { stdio: 'ignore' });\n if (result.error || result.status !== 0) return undefined;\n\n return [command, '--format', '%e %M'];\n}\n\nfunction killSubprocessGroup(subprocess: childProcess.ChildProcess, signal: NodeJS.Signals): void {\n if (subprocess.pid === undefined) return;\n\n try {\n if (process.platform === 'win32') {\n subprocess.kill(signal);\n return;\n }\n process.kill(-subprocess.pid, signal);\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ESRCH' && code !== 'EPERM') throw error;\n }\n}\n\nasync function readTimeResult(timeOutputPath: string): Promise<{ timeSeconds: number; memoryBytes: number }> {\n let content: string;\n try {\n content = await fs.readFile(timeOutputPath, 'utf8');\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n return { timeSeconds: 0, memoryBytes: 0 };\n }\n\n const match = /(\\d+(?:[.,]\\d+)?) (\\d+)\\s*$/.exec(content);\n if (!match) return { timeSeconds: 0, memoryBytes: 0 };\n\n return { timeSeconds: Number(match[1]!.replace(',', '.')), memoryBytes: Number(match[2]) * 1024 };\n}\n"],"names":["command","result","packageManagerProjectFilePaths","bun","cargo","go","gradle","maven","npm","pnpm","ruby","uv","yarn","timeCommand","os","platform","childProcess","spawnSync","stdio","error","status","runCommandInTemporaryPackageManagerProject","_x","_runCommandInTemporaryPackageManagerProject","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","options","_options$tempDirPrefi","runDir","_options$outputLimitB","_options$stdin","_options$stdin2","startedAt","elapsedTimeSeconds","w","_context","p","n","fs","mkdtemp","path","join","tmpdir","tempDirPrefix","v","cp","cwd","recursive","copyPackageManagerProjectFiles","packageManager","projectDir","projectFilePaths","Date","now","spawnWithInput","env","_objectSpread","process","outputLimitBytes","stdin","timeLimitSeconds","a","stdout","stderr","timedOut","outputLimitExceeded","timeSeconds","memoryBytes","signal","rm","force","f","_x2","_copyPackageManagerProjectFiles","_callee2","_options$projectFileP","_iterator","_step","projectFilePath","_t","_context2","_createForOfIteratorHelper","s","done","value","copyPathIfExists","e","_x3","_x4","_copyPathIfExists","_callee3","sourcePath","destinationPath","_t2","_context3","_typeof","code","undefined","_x5","_x6","_spawnWithInput","_callee4","context","timeOutputPath","spawnedCommand","subprocess","stdoutChunks","stderrChunks","outputBytes","appendOutputChunk","timeout","killTimeout","_yield$Promise$finall","_ref","_t3","_context4","concat","_toConsumableArray","spawn","slice","detached","chunks","chunk","byteLength","killSubprocessGroup","remainingBytes","appendedChunk","subarray","push","on","setTimeout","unref","Promise","resolve","reject","pendingError","settled","failAfterClose","pid","closeSignal","end","clearTimeout","readTimeResult","Buffer","toString","kill","_x7","_readTimeResult","_callee5","content","match","_t4","_context5","readFile","exec","Number","replace"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runCommandInTemporaryPackageManagerProject.js","sources":["../../src/helpers/runCommandInTemporaryPackageManagerProject.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport type PackageManager = 'bun' | 'cargo' | 'go' | 'gradle' | 'maven' | 'npm' | 'pnpm' | 'ruby' | 'uv' | 'yarn';\n\nexport interface PackageManagerCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}\n\nexport interface RunCommandInTemporaryPackageManagerProjectOptions {\n cwd: string;\n projectDir: string;\n packageManager: PackageManager;\n command: readonly [string, ...string[]] | ((context: { runDir: string }) => readonly [string, ...string[]]);\n install?:\n | boolean\n | readonly [string, ...string[]]\n | ((context: { runDir: string }) => readonly [string, ...string[]]);\n stdin?: string;\n env?: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n outputLimitBytes?: number;\n tempDirPrefix?: string;\n projectFilePaths?: readonly string[];\n}\n\nconst packageManagerProjectFilePaths = {\n bun: ['package.json', 'bun.lock', 'bun.lockb'],\n cargo: ['Cargo.toml', 'Cargo.lock'],\n go: ['go.mod', 'go.sum'],\n gradle: [\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n 'gradle.properties',\n 'gradle',\n 'gradlew',\n 'gradlew.bat',\n ],\n maven: ['pom.xml', '.mvn', 'mvnw', 'mvnw.cmd'],\n npm: ['package.json', 'package-lock.json'],\n pnpm: ['package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml'],\n ruby: ['Gemfile', 'Gemfile.lock', '.ruby-version'],\n uv: ['pyproject.toml', 'uv.lock'],\n yarn: ['package.json', 'yarn.lock', '.yarnrc.yml', '.yarn'],\n} as const satisfies Record<PackageManager, readonly string[]>;\n\nconst packageManagerInstallCommands: Partial<Record<PackageManager, readonly [string, ...string[]]>> = {\n bun: ['bun', 'install', '--silent'],\n npm: ['npm', 'install', '--silent'],\n pnpm: ['pnpm', 'install', '--silent'],\n yarn: ['yarn', 'install', '--silent'],\n};\n\nconst defaultOutputLimitBytes = 50 * 1024 * 1024;\nconst killGracePeriodMilliseconds = 1000;\nconst timeCommand = resolveTimeCommand();\n\n/**\n * Copies a submission directory to a temporary directory, overlays package\n * manager project files from the problem directory, optionally installs\n * dependencies, runs a command, and then removes the temporary directory.\n */\nexport async function runCommandInTemporaryPackageManagerProject(\n options: RunCommandInTemporaryPackageManagerProjectOptions\n): Promise<PackageManagerCommandRunResult> {\n const runDir = await fs.mkdtemp(path.join(os.tmpdir(), options.tempDirPrefix ?? 'exercode-'));\n try {\n await fs.cp(options.cwd, runDir, { recursive: true });\n await copyPackageManagerProjectFiles({\n packageManager: options.packageManager,\n projectDir: options.projectDir,\n runDir,\n projectFilePaths: options.projectFilePaths,\n });\n\n const env = options.env ? { ...process.env, ...options.env } : process.env;\n const installCommand = resolveInstallCommand(options, runDir);\n const command = typeof options.command === 'function' ? options.command({ runDir }) : options.command;\n const startedAt = Date.now();\n const outputLimitBytes = options.outputLimitBytes ?? defaultOutputLimitBytes;\n let installResult: Awaited<ReturnType<typeof spawnWithInput>> | undefined;\n\n if (installCommand) {\n installResult = await spawnWithInput(installCommand, {\n cwd: runDir,\n env,\n outputLimitBytes,\n stdin: '',\n timeLimitSeconds: options.timeLimitSeconds,\n });\n if (isFailedSpawnResult(installResult)) {\n return toPackageManagerCommandRunResult({\n elapsedTimeSeconds: (Date.now() - startedAt) / 1000,\n options,\n result: installResult,\n });\n }\n }\n\n const remainingTimeLimitSeconds = options.timeLimitSeconds - (Date.now() - startedAt) / 1000;\n if (remainingTimeLimitSeconds <= 0) {\n return {\n stdin: options.stdin ?? '',\n stdout: installResult?.stdout ?? '',\n stderr: installResult?.stderr ?? '',\n status: 0,\n timeSeconds: options.timeLimitSeconds + 1e-3,\n memoryBytes: installResult?.memoryBytes ?? 0,\n timedOut: true,\n signal: installResult?.signal,\n outputLimitExceeded: false,\n };\n }\n\n const result = await spawnWithInput(command, {\n cwd: runDir,\n env,\n outputLimitBytes,\n stdin: options.stdin ?? '',\n timeLimitSeconds: remainingTimeLimitSeconds,\n });\n const elapsedTimeSeconds = (Date.now() - startedAt) / 1000;\n\n if (installResult) {\n return toPackageManagerCommandRunResult({\n elapsedTimeSeconds,\n options,\n result: {\n ...result,\n timeSeconds: installResult.timeSeconds + result.timeSeconds,\n memoryBytes: Math.max(installResult.memoryBytes, result.memoryBytes),\n },\n });\n }\n\n return toPackageManagerCommandRunResult({ elapsedTimeSeconds, options, result });\n } finally {\n await fs.rm(runDir, { force: true, recursive: true });\n }\n}\n\nfunction toPackageManagerCommandRunResult(context: {\n elapsedTimeSeconds: number;\n options: RunCommandInTemporaryPackageManagerProjectOptions;\n result: Awaited<ReturnType<typeof spawnWithInput>>;\n}): PackageManagerCommandRunResult {\n return {\n stdin: context.options.stdin ?? '',\n stdout: context.result.stdout,\n stderr: context.result.stderr,\n status: context.result.timedOut || context.result.outputLimitExceeded ? 0 : context.result.status,\n timeSeconds: context.result.timedOut\n ? context.options.timeLimitSeconds + 1e-3\n : context.result.timeSeconds || context.elapsedTimeSeconds,\n memoryBytes: context.result.memoryBytes,\n timedOut: context.result.timedOut,\n signal: context.result.signal,\n outputLimitExceeded: context.result.outputLimitExceeded,\n };\n}\n\nfunction resolveInstallCommand(\n options: RunCommandInTemporaryPackageManagerProjectOptions,\n runDir: string\n): readonly [string, ...string[]] | undefined {\n if (!options.install) return undefined;\n if (options.install === true) {\n const installCommand = packageManagerInstallCommands[options.packageManager];\n if (installCommand === undefined) {\n throw new Error(`No default install command is available for package manager: ${options.packageManager}`);\n }\n return installCommand;\n }\n return typeof options.install === 'function' ? options.install({ runDir }) : options.install;\n}\n\nfunction isFailedSpawnResult(result: Awaited<ReturnType<typeof spawnWithInput>>): boolean {\n return result.status !== 0 || result.timedOut || result.outputLimitExceeded;\n}\n\nexport async function copyPackageManagerProjectFiles(options: {\n packageManager: PackageManager;\n projectDir: string;\n runDir: string;\n projectFilePaths?: readonly string[];\n}): Promise<void> {\n for (const projectFilePath of options.projectFilePaths ?? packageManagerProjectFilePaths[options.packageManager]) {\n await copyPathIfExists(path.join(options.projectDir, projectFilePath), path.join(options.runDir, projectFilePath));\n }\n}\n\nasync function copyPathIfExists(sourcePath: string, destinationPath: string): Promise<void> {\n try {\n await fs.cp(sourcePath, destinationPath, { recursive: true });\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n }\n}\n\nasync function spawnWithInput(\n command: readonly [string, ...string[]],\n context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n outputLimitBytes: number;\n stdin: string;\n timeLimitSeconds: number;\n }\n): Promise<{\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}> {\n const timeOutputPath = timeCommand === undefined ? undefined : path.join(context.cwd, '.exercode-time-result');\n const spawnedCommand =\n timeCommand === undefined ? command : ([...timeCommand, `--output=${timeOutputPath}`, ...command] as const);\n const subprocess = childProcess.spawn(spawnedCommand[0], spawnedCommand.slice(1), {\n cwd: context.cwd,\n detached: process.platform !== 'win32',\n env: context.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let outputBytes = 0;\n let timedOut = false;\n let outputLimitExceeded = false;\n\n const appendOutputChunk = (chunks: Buffer[], chunk: Buffer): void => {\n if (outputBytes >= context.outputLimitBytes) {\n if (chunk.byteLength > 0) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n return;\n }\n\n const remainingBytes = context.outputLimitBytes - outputBytes;\n const appendedChunk = chunk.byteLength > remainingBytes ? chunk.subarray(0, remainingBytes) : chunk;\n chunks.push(appendedChunk);\n outputBytes += appendedChunk.byteLength;\n\n if (chunk.byteLength > remainingBytes) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n };\n\n subprocess.stdout.on('data', (chunk: Buffer) => appendOutputChunk(stdoutChunks, chunk));\n subprocess.stderr.on('data', (chunk: Buffer) => appendOutputChunk(stderrChunks, chunk));\n\n const timeout = setTimeout(() => {\n timedOut = true;\n killSubprocessGroup(subprocess, 'SIGTERM');\n }, context.timeLimitSeconds * 1000);\n const killTimeout = setTimeout(\n () => {\n if (timedOut) killSubprocessGroup(subprocess, 'SIGKILL');\n },\n context.timeLimitSeconds * 1000 + killGracePeriodMilliseconds\n );\n killTimeout.unref();\n\n const { status, signal } = await new Promise<{ status: number | undefined; signal: NodeJS.Signals | undefined }>(\n (resolve, reject) => {\n let settled = false;\n let pendingError: Error | undefined;\n const failAfterClose = (error: Error): void => {\n if (settled) return;\n pendingError = error;\n killSubprocessGroup(subprocess, 'SIGKILL');\n if (subprocess.pid === undefined) {\n settled = true;\n reject(error);\n }\n };\n subprocess.on('error', failAfterClose);\n subprocess.stdin.on('error', (error: NodeJS.ErrnoException) => {\n if (error.code !== 'EPIPE') failAfterClose(error);\n });\n subprocess.on('close', (code, closeSignal) => {\n if (settled) return;\n settled = true;\n if (pendingError) {\n reject(pendingError);\n return;\n }\n resolve({ status: code ?? undefined, signal: closeSignal ?? undefined });\n });\n subprocess.stdin.end(context.stdin);\n }\n ).finally(() => {\n clearTimeout(timeout);\n clearTimeout(killTimeout);\n });\n\n const { timeSeconds, memoryBytes } =\n timeOutputPath === undefined ? { timeSeconds: 0, memoryBytes: 0 } : await readTimeResult(timeOutputPath);\n\n return {\n stdout: Buffer.concat(stdoutChunks).toString(),\n stderr: Buffer.concat(stderrChunks).toString(),\n status,\n timeSeconds,\n memoryBytes,\n timedOut,\n signal,\n outputLimitExceeded,\n };\n}\n\nfunction resolveTimeCommand(): readonly [string, ...string[]] | undefined {\n const command = os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time';\n const result = childProcess.spawnSync(command, ['--version'], { stdio: 'ignore' });\n if (result.error || result.status !== 0) return undefined;\n\n return [command, '--format', '%e %M'];\n}\n\nfunction killSubprocessGroup(subprocess: childProcess.ChildProcess, signal: NodeJS.Signals): void {\n if (subprocess.pid === undefined) return;\n\n try {\n if (process.platform === 'win32') {\n subprocess.kill(signal);\n return;\n }\n process.kill(-subprocess.pid, signal);\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ESRCH' && code !== 'EPERM') throw error;\n }\n}\n\nasync function readTimeResult(timeOutputPath: string): Promise<{ timeSeconds: number; memoryBytes: number }> {\n let content: string;\n try {\n content = await fs.readFile(timeOutputPath, 'utf8');\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n return { timeSeconds: 0, memoryBytes: 0 };\n }\n\n const match = /(\\d+(?:[.,]\\d+)?) (\\d+)\\s*$/.exec(content);\n if (!match) return { timeSeconds: 0, memoryBytes: 0 };\n\n return { timeSeconds: Number(match[1]!.replace(',', '.')), memoryBytes: Number(match[2]) * 1024 };\n}\n"],"names":["command","result","packageManagerProjectFilePaths","bun","cargo","go","gradle","maven","npm","pnpm","ruby","uv","yarn","packageManagerInstallCommands","timeCommand","os","platform","childProcess","spawnSync","stdio","error","status","runCommandInTemporaryPackageManagerProject","_x","_runCommandInTemporaryPackageManagerProject","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","options","_options$tempDirPrefi","runDir","_options$outputLimitB","_options$stdin2","env","installCommand","startedAt","outputLimitBytes","installResult","remainingTimeLimitSeconds","_options$stdin","_installResult$stdout","_installResult","_installResult$stderr","_installResult2","_installResult$memory","_installResult3","_installResult4","elapsedTimeSeconds","w","_context","p","n","fs","mkdtemp","path","join","tmpdir","tempDirPrefix","v","cp","cwd","recursive","copyPackageManagerProjectFiles","packageManager","projectDir","projectFilePaths","_objectSpread","process","resolveInstallCommand","Date","now","spawnWithInput","stdin","timeLimitSeconds","isFailedSpawnResult","a","toPackageManagerCommandRunResult","stdout","stderr","timeSeconds","memoryBytes","timedOut","signal","outputLimitExceeded","Math","max","rm","force","f","context","_context$options$stdi","install","undefined","Error","concat","_x2","_copyPackageManagerProjectFiles","_callee2","_options$projectFileP","_iterator","_step","projectFilePath","_t","_context2","_createForOfIteratorHelper","s","done","value","copyPathIfExists","e","_x3","_x4","_copyPathIfExists","_callee3","sourcePath","destinationPath","_t2","_context3","_typeof","code","_x5","_x6","_spawnWithInput","_callee4","timeOutputPath","spawnedCommand","subprocess","stdoutChunks","stderrChunks","outputBytes","appendOutputChunk","timeout","killTimeout","_yield$Promise$finall","_ref","_t3","_context4","_toConsumableArray","spawn","slice","detached","chunks","chunk","byteLength","killSubprocessGroup","remainingBytes","appendedChunk","subarray","push","on","setTimeout","unref","Promise","resolve","reject","pendingError","settled","failAfterClose","pid","closeSignal","end","clearTimeout","readTimeResult","Buffer","toString","kill","_x7","_readTimeResult","_callee5","content","match","_t4","_context5","readFile","exec","Number","replace"],"mappings":"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"}
|
package/dist/presets/command.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),t=require("node:path"),r=require("zod"),n=require("../helpers/
|
|
1
|
+
"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)};
|
|
2
2
|
//# sourceMappingURL=command.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.cjs","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\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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"}
|
|
1
|
+
{"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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"}
|
package/dist/presets/command.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asyncToGenerator as e,regenerator as t,createForOfIteratorHelper as r,objectSpread2 as
|
|
1
|
+
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};
|
|
2
2
|
//# sourceMappingURL=command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\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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"}
|
|
1
|
+
{"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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exercode/problem-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.16.1",
|
|
4
4
|
"description": ":100: A set of utilities for judging programs on Exercode (https://exercode.willbooster.com/).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"exercode",
|
|
@@ -63,16 +63,16 @@
|
|
|
63
63
|
"@tsconfig/node-ts": "23.6.4",
|
|
64
64
|
"@tsconfig/node24": "24.0.4",
|
|
65
65
|
"@types/node": "24.12.3",
|
|
66
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
66
|
+
"@typescript/native-preview": "7.0.0-dev.20260608.1",
|
|
67
67
|
"@willbooster/oxfmt-config": "1.2.2",
|
|
68
68
|
"@willbooster/oxlint-config": "1.4.8",
|
|
69
69
|
"@willbooster/prettier-config": "10.4.0",
|
|
70
|
-
"@willbooster/wb": "13.22.
|
|
71
|
-
"build-ts": "17.1.
|
|
70
|
+
"@willbooster/wb": "13.22.16",
|
|
71
|
+
"build-ts": "17.1.24",
|
|
72
72
|
"conventional-changelog-conventionalcommits": "9.3.1",
|
|
73
73
|
"lefthook": "2.1.9",
|
|
74
|
-
"oxfmt": "0.
|
|
75
|
-
"oxlint": "1.
|
|
74
|
+
"oxfmt": "0.55.0",
|
|
75
|
+
"oxlint": "1.70.0",
|
|
76
76
|
"oxlint-tsgolint": "0.23.0",
|
|
77
77
|
"prettier": "3.8.3",
|
|
78
78
|
"prettier-plugin-java": "2.9.7",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"sort-package-json": "4.0.0",
|
|
82
82
|
"vitest": "4.1.8"
|
|
83
83
|
},
|
|
84
|
-
"packageManager": "yarn@4.
|
|
84
|
+
"packageManager": "yarn@4.17.0",
|
|
85
85
|
"engines": {
|
|
86
86
|
"node": ">=24"
|
|
87
87
|
},
|