@exercode/problem-utils
Advanced tools
| "use strict";var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));exports.__toESM=s; |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:child_process"),t=require("node:fs"),n=require("node:os"),s=require("node:path"),o=require("../types/decisionCode.cjs"),i=require("../types/testCaseResult.cjs"),a=require("./printDebugBanner.cjs");function c(){return(c=e.asyncToGenerator(e.regenerator().m(function o(i,c,m){var v,b,g,k,E,D,j,C,S,w,_,T,B,A,q,P,x,G;return e.regenerator().w(function(o){for(;;)switch(o.p=o.n){case 0:return o.p=0,o.n=1,t.promises.mkdtemp(s.join(n.tmpdir(),"problem-utils-isolation_"));case 1:return v=o.v,C=s.resolve(i),S=s.join(v,f(C)),o.n=2,t.promises.mkdir(s.dirname(S),{recursive:!0});case 2:return o.n=3,t.promises.cp(C,S,{recursive:!0,filter:u});case 3:return o.n=4,d(v,C);case 4:if(w=s.relative(C,s.resolve(c.cwd)),_=s.join(S,w),!(T=h(C)).startsWith("..")&&!s.isAbsolute(T)){o.n=5;break}return a.printDebugBanner(["[DEBUG MODE] isolated problem directory check skipped","","The invoked judge script is located outside the problem directory.","Script path: ".concat(T)]),o.a(2,{passed:!0});case 5:if(B=process.execArgv.filter(l),A=JSON.stringify(p(m)?m:{}),q=r.spawnSync(process.execPath,[].concat(e.toConsumableArray(B),[T,_,A]),{cwd:S,encoding:"utf8",env:process.env,timeout:3e4}),P=null!=(b=q.stdout)?b:"",x=null!=(g=q.stderr)?g:"",0!==q.status||!y(P)){o.n=6;break}return a.printDebugBanner(["[DEBUG MODE] isolated problem directory check passed","","Copied problem dir : ".concat(S),"Checked cwd : ".concat(w)]),o.a(2,{passed:!0});case 6:return a.printDebugBanner(["[DEBUG MODE] isolated problem directory check failed","","The judge did not complete successfully after copying only the problem directory to a temporary location.","Make sure judge.ts imports only files included in the problem directory.","","Copied problem dir : ".concat(S),"Checked cwd : ".concat(w),"Exit status : ".concat(null!=(k=null!=(E=q.status)?E:q.signal)?k:"unknown"),"Spawn error : ".concat(null!=(D=null==(j=q.error)?void 0:j.message)?D:"<none>"),"","stdout:",P.trimEnd()||"<empty>","","stderr:",x.trimEnd()||"<empty>"]),o.a(2,{passed:!1});case 7:return o.p=7,G=o.v,a.printDebugBanner(["[DEBUG MODE] isolated problem directory check failed due to an unexpected error","",G instanceof Error?G.message:String(G)]),o.a(2,{passed:!1});case 8:if(o.p=8,!v){o.n=12;break}return o.p=9,o.n=10,t.promises.rm(v,{recursive:!0,force:!0});case 10:o.n=12;break;case 11:o.p=11,o.v;case 12:return o.f(8);case 13:return o.a(2)}},o,null,[[9,11],[0,7,8,13]])}))).apply(this,arguments)}function u(e){var r=s.basename(e);return"node_modules"!==r&&".git"!==r}function l(e){return!e.startsWith("--inspect")&&!e.startsWith("--watch")&&!e.startsWith("--hot")}function p(r){return null!=r&&"object"===e.typeof(r)&&!Array.isArray(r)}function d(e,r){return m.apply(this,arguments)}function m(){return(m=e.asyncToGenerator(e.regenerator().m(function r(n,o){var i,a,c,u;return e.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:i=s.resolve(o);case 1:if(a=s.join(i,"node_modules"),!t.existsSync(a)){e.n=5;break}return c=s.join(n,f(i),"node_modules"),e.p=2,e.n=3,t.promises.symlink(a,c,"win32"===process.platform?"junction":"dir");case 3:e.n=5;break;case 4:e.p=4,e.v;case 5:if((u=s.dirname(i))!==i){e.n=6;break}return e.a(3,7);case 6:i=u,e.n=1;break;case 7:return e.a(2)}},r,null,[[2,4]])}))).apply(this,arguments)}function f(e){var r=s.parse(e).root;return s.relative(r,e)}function h(e){var r=process.argv[1];if(!r)return".".concat(s.sep,"judge.ts");var t=s.relative(e,s.resolve(r));return s.isAbsolute(t)||t.startsWith(".")?t:".".concat(s.sep).concat(t)}function y(e){var r=e.split(/\r?\n/).filter(function(e){return e.startsWith(i.TEST_CASE_RESULT_PREFIX)});return 0!==r.length&&r.every(function(e){try{var r=i.testCaseResultSchema.safeParse(JSON.parse(e.slice(i.TEST_CASE_RESULT_PREFIX.length)));return r.success&&r.data.decisionCode===o.DecisionCode.ACCEPTED}catch(e){return!1}})}exports.checkProblemDirIsolation=function(e,r,t){return c.apply(this,arguments)}; | ||
| //# sourceMappingURL=checkProblemDirIsolation.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../types/testCaseResult.cjs"),n=require("../types/decisionCode.cjs"),r=require("./printDebugBanner.cjs");let i=require("node:child_process");i=e.__toESM(i,1);let a=require("node:os");a=e.__toESM(a,1);let o=require("node:path");o=e.__toESM(o,1);let s=require("node:fs");s=e.__toESM(s,1);async function c(e,t,n){let c;try{c=await s.default.promises.mkdtemp(o.default.join(a.default.tmpdir(),`problem-utils-isolation_`));let g=o.default.resolve(e),_=o.default.join(c,p(g));await s.default.promises.mkdir(o.default.dirname(_),{recursive:!0}),await s.default.promises.cp(g,_,{recursive:!0,filter:l}),await f(c,g);let v=o.default.relative(g,o.default.resolve(t.cwd)),y=o.default.join(_,v),b=m(g);if(b.startsWith(`..`)||o.default.isAbsolute(b))return r.printDebugBanner([`[DEBUG MODE] isolated problem directory check skipped`,``,`The invoked judge script is located outside the problem directory.`,`Script path: ${b}`]),{passed:!0};let x=process.execArgv.filter(u),S=JSON.stringify(d(n)?n:{}),C=i.default.spawnSync(process.execPath,[...x,b,y,S],{cwd:_,encoding:`utf8`,env:process.env,timeout:3e4}),w=C.stdout??``,T=C.stderr??``;return C.status===0&&h(w)?(r.printDebugBanner([`[DEBUG MODE] isolated problem directory check passed`,``,`Copied problem dir : ${_}`,`Checked cwd : ${v}`]),{passed:!0}):(r.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 : ${_}`,`Checked cwd : ${v}`,`Exit status : ${C.status??C.signal??`unknown`}`,`Spawn error : ${C.error?.message??`<none>`}`,``,`stdout:`,w.trimEnd()||`<empty>`,``,`stderr:`,T.trimEnd()||`<empty>`]),{passed:!1})}catch(e){return r.printDebugBanner([`[DEBUG MODE] isolated problem directory check failed due to an unexpected error`,``,e instanceof Error?e.message:String(e)]),{passed:!1}}finally{if(c)try{await s.default.promises.rm(c,{recursive:!0,force:!0})}catch{}}}function l(e){let t=o.default.basename(e);return t!==`node_modules`&&t!==`.git`}function u(e){return!e.startsWith(`--inspect`)&&!e.startsWith(`--watch`)&&!e.startsWith(`--hot`)}function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function f(e,t){let n=o.default.resolve(t);for(;;){let t=o.default.join(n,`node_modules`);if(s.default.existsSync(t)){let r=o.default.join(e,p(n),`node_modules`);try{await s.default.promises.symlink(t,r,process.platform===`win32`?`junction`:`dir`)}catch{}}let r=o.default.dirname(n);if(r===n)break;n=r}}function p(e){let{root:t}=o.default.parse(e);return o.default.relative(t,e)}function m(e){let t=process.argv[1];if(!t)return`.${o.default.sep}judge.ts`;let n=o.default.relative(e,o.default.resolve(t));return o.default.isAbsolute(n)||n.startsWith(`.`)?n:`.${o.default.sep}${n}`}function h(e){let r=e.split(/\r?\n/).filter(e=>e.startsWith(t.TEST_CASE_RESULT_PREFIX));return r.length===0?!1:r.every(e=>{try{let r=t.testCaseResultSchema.safeParse(JSON.parse(e.slice(t.TEST_CASE_RESULT_PREFIX.length)));return r.success&&r.data.decisionCode===n.DecisionCode.ACCEPTED}catch{return!1}})}exports.checkProblemDirIsolation=c; | ||
| //# sourceMappingURL=checkProblemDirIsolation.cjs.map |
@@ -1,1 +0,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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"} | ||
| {"version":3,"file":"checkProblemDirIsolation.cjs","names":["fs","path","os","child_process","TEST_CASE_RESULT_PREFIX","testCaseResultSchema","DecisionCode"],"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"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as e,regenerator as r,toConsumableArray as t,typeof as n}from"../_virtual/_rollupPluginBabelHelpers.js";import s from"node:child_process";import o from"node:fs";import i from"node:os";import a from"node:path";import{DecisionCode as c}from"../types/decisionCode.js";import{TEST_CASE_RESULT_PREFIX as u,testCaseResultSchema as p}from"../types/testCaseResult.js";import{printDebugBanner as l}from"./printDebugBanner.js";function d(e,r,t){return m.apply(this,arguments)}function m(){return(m=e(r().m(function e(n,c,u){var p,d,m,b,E,w,C,D,A,S,_,x,B,O,W,G,M,P;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,o.promises.mkdtemp(a.join(i.tmpdir(),"problem-utils-isolation_"));case 1:return p=e.v,D=a.resolve(n),A=a.join(p,k(D)),e.n=2,o.promises.mkdir(a.dirname(A),{recursive:!0});case 2:return e.n=3,o.promises.cp(D,A,{recursive:!0,filter:f});case 3:return e.n=4,v(p,D);case 4:if(S=a.relative(D,a.resolve(c.cwd)),_=a.join(A,S),!(x=g(D)).startsWith("..")&&!a.isAbsolute(x)){e.n=5;break}return l(["[DEBUG MODE] isolated problem directory check skipped","","The invoked judge script is located outside the problem directory.","Script path: ".concat(x)]),e.a(2,{passed:!0});case 5:if(B=process.execArgv.filter(h),O=JSON.stringify(y(u)?u:{}),W=s.spawnSync(process.execPath,[].concat(t(B),[x,_,O]),{cwd:A,encoding:"utf8",env:process.env,timeout:3e4}),G=null!=(d=W.stdout)?d:"",M=null!=(m=W.stderr)?m:"",0!==W.status||!j(G)){e.n=6;break}return l(["[DEBUG MODE] isolated problem directory check passed","","Copied problem dir : ".concat(A),"Checked cwd : ".concat(S)]),e.a(2,{passed:!0});case 6:return l(["[DEBUG MODE] isolated problem directory check failed","","The judge did not complete successfully after copying only the problem directory to a temporary location.","Make sure judge.ts imports only files included in the problem directory.","","Copied problem dir : ".concat(A),"Checked cwd : ".concat(S),"Exit status : ".concat(null!=(b=null!=(E=W.status)?E:W.signal)?b:"unknown"),"Spawn error : ".concat(null!=(w=null==(C=W.error)?void 0:C.message)?w:"<none>"),"","stdout:",G.trimEnd()||"<empty>","","stderr:",M.trimEnd()||"<empty>"]),e.a(2,{passed:!1});case 7:return e.p=7,P=e.v,l(["[DEBUG MODE] isolated problem directory check failed due to an unexpected error","",P instanceof Error?P.message:String(P)]),e.a(2,{passed:!1});case 8:if(e.p=8,!p){e.n=12;break}return e.p=9,e.n=10,o.promises.rm(p,{recursive:!0,force:!0});case 10:e.n=12;break;case 11:e.p=11,e.v;case 12:return e.f(8);case 13:return e.a(2)}},e,null,[[9,11],[0,7,8,13]])}))).apply(this,arguments)}function f(e){var r=a.basename(e);return"node_modules"!==r&&".git"!==r}function h(e){return!e.startsWith("--inspect")&&!e.startsWith("--watch")&&!e.startsWith("--hot")}function y(e){return null!=e&&"object"===n(e)&&!Array.isArray(e)}function v(e,r){return b.apply(this,arguments)}function b(){return(b=e(r().m(function e(t,n){var s,i,c,u;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:s=a.resolve(n);case 1:if(i=a.join(s,"node_modules"),!o.existsSync(i)){e.n=5;break}return c=a.join(t,k(s),"node_modules"),e.p=2,e.n=3,o.promises.symlink(i,c,"win32"===process.platform?"junction":"dir");case 3:e.n=5;break;case 4:e.p=4,e.v;case 5:if((u=a.dirname(s))!==s){e.n=6;break}return e.a(3,7);case 6:s=u,e.n=1;break;case 7:return e.a(2)}},e,null,[[2,4]])}))).apply(this,arguments)}function k(e){var r=a.parse(e).root;return a.relative(r,e)}function g(e){var r=process.argv[1];if(!r)return".".concat(a.sep,"judge.ts");var t=a.relative(e,a.resolve(r));return a.isAbsolute(t)||t.startsWith(".")?t:".".concat(a.sep).concat(t)}function j(e){var r=e.split(/\r?\n/).filter(function(e){return e.startsWith(u)});return 0!==r.length&&r.every(function(e){try{var r=p.safeParse(JSON.parse(e.slice(u.length)));return r.success&&r.data.decisionCode===c.ACCEPTED}catch(e){return!1}})}export{d as checkProblemDirIsolation}; | ||
| //# sourceMappingURL=checkProblemDirIsolation.js.map | ||
| import{TEST_CASE_RESULT_PREFIX as e,testCaseResultSchema as t}from"../types/testCaseResult.js";import{DecisionCode as n}from"../types/decisionCode.js";import{printDebugBanner as r}from"./printDebugBanner.js";import i from"node:child_process";import a from"node:os";import o from"node:path";import s from"node:fs";async function c(e,t,n){let c;try{c=await s.promises.mkdtemp(o.join(a.tmpdir(),`problem-utils-isolation_`));let g=o.resolve(e),_=o.join(c,p(g));await s.promises.mkdir(o.dirname(_),{recursive:!0}),await s.promises.cp(g,_,{recursive:!0,filter:l}),await f(c,g);let v=o.relative(g,o.resolve(t.cwd)),y=o.join(_,v),b=m(g);if(b.startsWith(`..`)||o.isAbsolute(b))return r([`[DEBUG MODE] isolated problem directory check skipped`,``,`The invoked judge script is located outside the problem directory.`,`Script path: ${b}`]),{passed:!0};let x=process.execArgv.filter(u),S=JSON.stringify(d(n)?n:{}),C=i.spawnSync(process.execPath,[...x,b,y,S],{cwd:_,encoding:`utf8`,env:process.env,timeout:3e4}),w=C.stdout??``,T=C.stderr??``;return C.status===0&&h(w)?(r([`[DEBUG MODE] isolated problem directory check passed`,``,`Copied problem dir : ${_}`,`Checked cwd : ${v}`]),{passed:!0}):(r([`[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 : ${_}`,`Checked cwd : ${v}`,`Exit status : ${C.status??C.signal??`unknown`}`,`Spawn error : ${C.error?.message??`<none>`}`,``,`stdout:`,w.trimEnd()||`<empty>`,``,`stderr:`,T.trimEnd()||`<empty>`]),{passed:!1})}catch(e){return r([`[DEBUG MODE] isolated problem directory check failed due to an unexpected error`,``,e instanceof Error?e.message:String(e)]),{passed:!1}}finally{if(c)try{await s.promises.rm(c,{recursive:!0,force:!0})}catch{}}}function l(e){let t=o.basename(e);return t!==`node_modules`&&t!==`.git`}function u(e){return!e.startsWith(`--inspect`)&&!e.startsWith(`--watch`)&&!e.startsWith(`--hot`)}function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function f(e,t){let n=o.resolve(t);for(;;){let t=o.join(n,`node_modules`);if(s.existsSync(t)){let r=o.join(e,p(n),`node_modules`);try{await s.promises.symlink(t,r,process.platform===`win32`?`junction`:`dir`)}catch{}}let r=o.dirname(n);if(r===n)break;n=r}}function p(e){let{root:t}=o.parse(e);return o.relative(t,e)}function m(e){let t=process.argv[1];if(!t)return`.${o.sep}judge.ts`;let n=o.relative(e,o.resolve(t));return o.isAbsolute(n)||n.startsWith(`.`)?n:`.${o.sep}${n}`}function h(r){let i=r.split(/\r?\n/).filter(t=>t.startsWith(e));return i.length===0?!1:i.every(r=>{try{let i=t.safeParse(JSON.parse(r.slice(e.length)));return i.success&&i.data.decisionCode===n.ACCEPTED}catch{return!1}})}export{c as checkProblemDirIsolation}; | ||
| //# sourceMappingURL=checkProblemDirIsolation.js.map |
@@ -1,1 +0,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":"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"} | ||
| {"version":3,"file":"checkProblemDirIsolation.js","names":["child_process"],"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"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var r=require("../_virtual/_rollupPluginBabelHelpers.cjs"),e=require("node:fs"),n=require("node:path");function t(){return(t=r.asyncToGenerator(r.regenerator().m(function n(t){var a;return r.regenerator().w(function(r){for(;;)switch(r.n){case 0:return r.n=1,e.promises.readdir(t,{recursive:!0});case 1:return a=r.v,r.a(2,new Set(a))}},n)}))).apply(this,arguments)}function a(){return(a=r.asyncToGenerator(r.regenerator().m(function t(a,s){var o,i,c,u,p;return r.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return u=r.createForOfIteratorHelper,t.n=1,e.promises.readdir(a,{recursive:!0});case 1:o=u(t.v),t.p=2,o.s();case 3:if((i=o.n()).done){t.n=6;break}if(c=i.value,!s.has(c)){t.n=4;break}return t.a(3,5);case 4:return t.n=5,e.promises.rm(n.join(a,c),{force:!0,recursive:!0});case 5:t.n=3;break;case 6:t.n=8;break;case 7:t.p=7,p=t.v,o.e(p);case 8:return t.p=8,o.f(),t.f(8);case 9:return t.a(2)}},t,null,[[2,7,8,9]])}))).apply(this,arguments)}exports.cleanWorkingDirectory=function(r,e){return a.apply(this,arguments)},exports.snapshotWorkingDirectory=function(r){return t.apply(this,arguments)}; | ||
| //# sourceMappingURL=cleanWorkingDirectory.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:path");t=e.__toESM(t,1);let n=require("node:fs");n=e.__toESM(n,1);async function r(e){let t=await n.default.promises.readdir(e,{recursive:!0});return new Set(t)}async function i(e,r){for(let i of await n.default.promises.readdir(e,{recursive:!0}))r.has(i)||await n.default.promises.rm(t.default.join(e,i),{force:!0,recursive:!0})}exports.cleanWorkingDirectory=i,exports.snapshotWorkingDirectory=r; | ||
| //# sourceMappingURL=cleanWorkingDirectory.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cleanWorkingDirectory.cjs","sources":["../../src/helpers/cleanWorkingDirectory.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n// Currently, it does not support changing file contents and deleting files.\nexport async function snapshotWorkingDirectory(cwd: string): Promise<ReadonlySet<string>> {\n const paths = await fs.promises.readdir(cwd, { recursive: true });\n return new Set(paths);\n}\n\nexport async function cleanWorkingDirectory(cwd: string, snapshot: ReadonlySet<string>): Promise<void> {\n for (const p of await fs.promises.readdir(cwd, { recursive: true })) {\n if (snapshot.has(p)) continue;\n await fs.promises.rm(path.join(cwd, p), { force: true, recursive: true });\n }\n}\n"],"names":["_snapshotWorkingDirectory","_asyncToGenerator","_regenerator","m","_callee","cwd","paths","w","_context","n","fs","promises","readdir","recursive","v","a","Set","apply","this","arguments","_cleanWorkingDirectory","_callee2","snapshot","_iterator","_step","p","_t","_t2","_context2","_createForOfIteratorHelper","s","done","value","has","rm","path","join","force","e","f","_x2","_x3","_x"],"mappings":"oHAOC,SAAAA,IAAA,OAAAA,EAAAC,EAAAA,iBAAAC,EAAAA,cAAAC,EAHM,SAAAC,EAAwCC,GAAW,IAAAC,EAAA,OAAAJ,gBAAAK,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,OAAAD,EAAAC,EAAA,EACpCC,EAAGC,SAASC,QAAQP,EAAK,CAAEQ,WAAW,IAAO,KAAA,EAAtD,OAALP,EAAKE,EAAAM,EAAAN,EAAAO,EAAA,EACJ,IAAIC,IAAIV,IAAM,EAAAF,EAAA,KACtBa,MAAAC,KAAAC,UAAA,CAOA,SAAAC,IAAA,OAAAA,EAAAnB,EAAAA,iBAAAC,gBAAAC,EALM,SAAAkB,EAAqChB,EAAaiB,GAA6B,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAzB,gBAAAK,EAAA,SAAAqB,GAAA,cAAAA,EAAAH,EAAAG,EAAAnB,GAAA,KAAA,EAAA,OAAAiB,EAAAG,EAAAA,0BAAAD,EAAAnB,EAAA,EAC9DC,EAAGC,SAASC,QAAQP,EAAK,CAAEQ,WAAW,IAAO,KAAA,EAAAU,EAAAG,EAAAE,EAAAd,GAAAc,EAAAH,EAAA,EAAAF,EAAAO,IAAA,KAAA,EAAA,IAAAN,EAAAD,EAAAd,KAAAsB,KAAA,CAAAH,EAAAnB,EAAA,EAAA,KAAA,CAAvD,GAADgB,EAACD,EAAAQ,OACNV,EAASW,IAAIR,GAAE,CAAAG,EAAAnB,EAAA,EAAA,KAAA,CAAA,OAAAmB,EAAAb,EAAA,EAAA,GAAA,KAAA,EAAA,OAAAa,EAAAnB,EAAA,EACbC,EAAGC,SAASuB,GAAGC,EAAKC,KAAK/B,EAAKoB,GAAI,CAAEY,OAAO,EAAMxB,WAAW,IAAO,KAAA,EAAAe,EAAAnB,EAAA,EAAA,MAAA,KAAA,EAAAmB,EAAAnB,EAAA,EAAA,MAAA,KAAA,EAAAmB,EAAAH,EAAA,EAAAE,EAAAC,EAAAd,EAAAS,EAAAe,EAAAX,GAAA,KAAA,EAAA,OAAAC,EAAAH,EAAA,EAAAF,EAAAgB,IAAAX,EAAAW,EAAA,GAAA,KAAA,EAAA,OAAAX,EAAAb,EAAA,GAAA,EAAAM,EAAA,KAAA,CAAA,CAAA,EAAA,EAAA,EAAA,IAAA,KAE5EJ,MAAAC,KAAAC,UAAA,+BALD,SAA2CqB,EAAAC,GAAA,OAAArB,EAAAH,MAAAC,KAAAC,UAAA,mCAL3C,SAA8CuB,GAAA,OAAA1C,EAAAiB,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"cleanWorkingDirectory.cjs","names":["fs","path"],"sources":["../../src/helpers/cleanWorkingDirectory.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n// Currently, it does not support changing file contents and deleting files.\nexport async function snapshotWorkingDirectory(cwd: string): Promise<ReadonlySet<string>> {\n const paths = await fs.promises.readdir(cwd, { recursive: true });\n return new Set(paths);\n}\n\nexport async function cleanWorkingDirectory(cwd: string, snapshot: ReadonlySet<string>): Promise<void> {\n for (const p of await fs.promises.readdir(cwd, { recursive: true })) {\n if (snapshot.has(p)) continue;\n await fs.promises.rm(path.join(cwd, p), { force: true, recursive: true });\n }\n}\n"],"mappings":"wJAIA,eAAsB,EAAyB,EAA2C,CACxF,IAAM,EAAQ,MAAMA,EAAAA,QAAG,SAAS,QAAQ,EAAK,CAAE,UAAW,EAAK,CAAC,EAChE,OAAO,IAAI,IAAI,CAAK,CACtB,CAEA,eAAsB,EAAsB,EAAa,EAA8C,CACrG,IAAK,IAAM,KAAK,MAAMA,EAAAA,QAAG,SAAS,QAAQ,EAAK,CAAE,UAAW,EAAK,CAAC,EAC5D,EAAS,IAAI,CAAC,GAClB,MAAMA,EAAAA,QAAG,SAAS,GAAGC,EAAAA,QAAK,KAAK,EAAK,CAAC,EAAG,CAAE,MAAO,GAAM,UAAW,EAAK,CAAC,CAE5E"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as r,regenerator as e,createForOfIteratorHelper as n}from"../_virtual/_rollupPluginBabelHelpers.js";import a from"node:fs";import t from"node:path";function s(r){return o.apply(this,arguments)}function o(){return(o=r(e().m(function r(n){var t;return e().w(function(r){for(;;)switch(r.n){case 0:return r.n=1,a.promises.readdir(n,{recursive:!0});case 1:return t=r.v,r.a(2,new Set(t))}},r)}))).apply(this,arguments)}function i(r,e){return u.apply(this,arguments)}function u(){return(u=r(e().m(function r(s,o){var i,u,c,p,f;return e().w(function(r){for(;;)switch(r.p=r.n){case 0:return p=n,r.n=1,a.promises.readdir(s,{recursive:!0});case 1:i=p(r.v),r.p=2,i.s();case 3:if((u=i.n()).done){r.n=6;break}if(c=u.value,!o.has(c)){r.n=4;break}return r.a(3,5);case 4:return r.n=5,a.promises.rm(t.join(s,c),{force:!0,recursive:!0});case 5:r.n=3;break;case 6:r.n=8;break;case 7:r.p=7,f=r.v,i.e(f);case 8:return r.p=8,i.f(),r.f(8);case 9:return r.a(2)}},r,null,[[2,7,8,9]])}))).apply(this,arguments)}export{i as cleanWorkingDirectory,s as snapshotWorkingDirectory}; | ||
| //# sourceMappingURL=cleanWorkingDirectory.js.map | ||
| import e from"node:path";import t from"node:fs";async function n(e){let n=await t.promises.readdir(e,{recursive:!0});return new Set(n)}async function r(n,r){for(let i of await t.promises.readdir(n,{recursive:!0}))r.has(i)||await t.promises.rm(e.join(n,i),{force:!0,recursive:!0})}export{r as cleanWorkingDirectory,n as snapshotWorkingDirectory}; | ||
| //# sourceMappingURL=cleanWorkingDirectory.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cleanWorkingDirectory.js","sources":["../../src/helpers/cleanWorkingDirectory.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n// Currently, it does not support changing file contents and deleting files.\nexport async function snapshotWorkingDirectory(cwd: string): Promise<ReadonlySet<string>> {\n const paths = await fs.promises.readdir(cwd, { recursive: true });\n return new Set(paths);\n}\n\nexport async function cleanWorkingDirectory(cwd: string, snapshot: ReadonlySet<string>): Promise<void> {\n for (const p of await fs.promises.readdir(cwd, { recursive: true })) {\n if (snapshot.has(p)) continue;\n await fs.promises.rm(path.join(cwd, p), { force: true, recursive: true });\n }\n}\n"],"names":["snapshotWorkingDirectory","_x","_snapshotWorkingDirectory","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","cwd","paths","w","_context","n","fs","promises","readdir","recursive","v","a","Set","cleanWorkingDirectory","_x2","_x3","_cleanWorkingDirectory","_callee2","snapshot","_iterator","_step","p","_t","_t2","_context2","_createForOfIteratorHelper","s","done","value","has","rm","path","join","force","e","f"],"mappings":"4KAIA,SAAsBA,EAAwBC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAG7C,SAAAH,IAAA,OAAAA,EAAAI,EAAAC,IAAAC,EAHM,SAAAC,EAAwCC,GAAW,IAAAC,EAAA,OAAAJ,IAAAK,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,OAAAD,EAAAC,EAAA,EACpCC,EAAGC,SAASC,QAAQP,EAAK,CAAEQ,WAAW,IAAO,KAAA,EAAtD,OAALP,EAAKE,EAAAM,EAAAN,EAAAO,EAAA,EACJ,IAAIC,IAAIV,IAAM,EAAAF,EAAA,KACtBN,MAAAC,KAAAC,UAAA,CAED,SAAsBiB,EAAqBC,EAAAC,GAAA,OAAAC,EAAAtB,MAAAC,KAAAC,UAAA,CAK1C,SAAAoB,IAAA,OAAAA,EAAAnB,EAAAC,IAAAC,EALM,SAAAkB,EAAqChB,EAAaiB,GAA6B,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAzB,IAAAK,EAAA,SAAAqB,GAAA,cAAAA,EAAAH,EAAAG,EAAAnB,GAAA,KAAA,EAAA,OAAAiB,EAAAG,EAAAD,EAAAnB,EAAA,EAC9DC,EAAGC,SAASC,QAAQP,EAAK,CAAEQ,WAAW,IAAO,KAAA,EAAAU,EAAAG,EAAAE,EAAAd,GAAAc,EAAAH,EAAA,EAAAF,EAAAO,IAAA,KAAA,EAAA,IAAAN,EAAAD,EAAAd,KAAAsB,KAAA,CAAAH,EAAAnB,EAAA,EAAA,KAAA,CAAvD,GAADgB,EAACD,EAAAQ,OACNV,EAASW,IAAIR,GAAE,CAAAG,EAAAnB,EAAA,EAAA,KAAA,CAAA,OAAAmB,EAAAb,EAAA,EAAA,GAAA,KAAA,EAAA,OAAAa,EAAAnB,EAAA,EACbC,EAAGC,SAASuB,GAAGC,EAAKC,KAAK/B,EAAKoB,GAAI,CAAEY,OAAO,EAAMxB,WAAW,IAAO,KAAA,EAAAe,EAAAnB,EAAA,EAAA,MAAA,KAAA,EAAAmB,EAAAnB,EAAA,EAAA,MAAA,KAAA,EAAAmB,EAAAH,EAAA,EAAAE,EAAAC,EAAAd,EAAAS,EAAAe,EAAAX,GAAA,KAAA,EAAA,OAAAC,EAAAH,EAAA,EAAAF,EAAAgB,IAAAX,EAAAW,EAAA,GAAA,KAAA,EAAA,OAAAX,EAAAb,EAAA,GAAA,EAAAM,EAAA,KAAA,CAAA,CAAA,EAAA,EAAA,EAAA,IAAA,KAE5EvB,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"cleanWorkingDirectory.js","names":[],"sources":["../../src/helpers/cleanWorkingDirectory.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n// Currently, it does not support changing file contents and deleting files.\nexport async function snapshotWorkingDirectory(cwd: string): Promise<ReadonlySet<string>> {\n const paths = await fs.promises.readdir(cwd, { recursive: true });\n return new Set(paths);\n}\n\nexport async function cleanWorkingDirectory(cwd: string, snapshot: ReadonlySet<string>): Promise<void> {\n for (const p of await fs.promises.readdir(cwd, { recursive: true })) {\n if (snapshot.has(p)) continue;\n await fs.promises.rm(path.join(cwd, p), { force: true, recursive: true });\n }\n}\n"],"mappings":"gDAIA,eAAsB,EAAyB,EAA2C,CACxF,IAAM,EAAQ,MAAM,EAAG,SAAS,QAAQ,EAAK,CAAE,UAAW,EAAK,CAAC,EAChE,OAAO,IAAI,IAAI,CAAK,CACtB,CAEA,eAAsB,EAAsB,EAAa,EAA8C,CACrG,IAAK,IAAM,KAAK,MAAM,EAAG,SAAS,QAAQ,EAAK,CAAE,UAAW,EAAK,CAAC,EAC5D,EAAS,IAAI,CAAC,GAClB,MAAM,EAAG,SAAS,GAAG,EAAK,KAAK,EAAK,CAAC,EAAG,CAAE,MAAO,GAAM,UAAW,EAAK,CAAC,CAE5E"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var r=require("../_virtual/_rollupPluginBabelHelpers.cjs"),e=1e-6;exports.compareStdoutAsSpaceSeparatedTokens=function(t,a){var i=t.trim().split(/\s+/),s=a.trim().split(/\s+/);if(i.length!==s.length)return!1;var n,u=r.createForOfIteratorHelper(s.entries());try{for(u.s();!(n=u.n()).done;){var l=r.slicedToArray(n.value,2),o=l[0],N=l[1],c=i[o];if(!Number.isNaN(Number(N))&&N.includes(".")){var f=Number(c),b=Number(N);if(Number.isNaN(b))throw new TypeError("invalid token in test case: ".concat(N));if(Number.isNaN(f))return!1;var m=Math.abs(f-b),p=0===b?Number.POSITIVE_INFINITY:Math.abs(m/b);if(m>e&&p>e)return!1}else if(c!==N)return!1}}catch(r){u.e(r)}finally{u.f()}return!0}; | ||
| //# sourceMappingURL=compareStdoutAsSpaceSeparatedTokens.cjs.map | ||
| "use strict";const e=1e-6;function t(t,n){let r=t.trim().split(/\s+/),i=n.trim().split(/\s+/);if(r.length!==i.length)return!1;for(let[t,n]of i.entries()){let i=r[t];if(!Number.isNaN(Number(n))&&n.includes(`.`)){let t=Number(i),r=Number(n);if(Number.isNaN(r))throw TypeError(`invalid token in test case: ${n}`);if(Number.isNaN(t))return!1;let a=Math.abs(t-r),o=r===0?1/0:Math.abs(a/r);if(a>e&&o>e)return!1}else if(i!==n)return!1}return!0}exports.compareStdoutAsSpaceSeparatedTokens=t; | ||
| //# sourceMappingURL=compareStdoutAsSpaceSeparatedTokens.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"compareStdoutAsSpaceSeparatedTokens.cjs","sources":["../../src/helpers/compareStdoutAsSpaceSeparatedTokens.ts"],"sourcesContent":["const ACCEPTABLE_FLOAT_ERROR = 1e-6;\n\nexport function compareStdoutAsSpaceSeparatedTokens(received: string, expected: string): boolean {\n // Consecutive white spaces (including tabs, page breaks, and line breaks) are treated as one space character.\n const receivedTokens = received.trim().split(/\\s+/);\n const expectedTokens = expected.trim().split(/\\s+/);\n\n if (receivedTokens.length !== expectedTokens.length) return false;\n\n for (const [i, expectedToken] of expectedTokens.entries()) {\n const receivedToken = receivedTokens[i];\n\n const isDecimal = !Number.isNaN(Number(expectedToken)) && expectedToken.includes('.');\n if (isDecimal) {\n const receivedNumber = Number(receivedToken);\n const expectedNumber = Number(expectedToken);\n\n if (Number.isNaN(expectedNumber)) throw new TypeError(`invalid token in test case: ${expectedToken}`);\n if (Number.isNaN(receivedNumber)) return false;\n\n const absoluteError = Math.abs(receivedNumber - expectedNumber);\n const relativeError = expectedNumber === 0 ? Number.POSITIVE_INFINITY : Math.abs(absoluteError / expectedNumber);\n if (absoluteError > ACCEPTABLE_FLOAT_ERROR && relativeError > ACCEPTABLE_FLOAT_ERROR) return false;\n } else {\n if (receivedToken !== expectedToken) return false;\n }\n }\n\n return true;\n}\n"],"names":["ACCEPTABLE_FLOAT_ERROR","received","expected","receivedTokens","trim","split","expectedTokens","length","_step","_iterator","_createForOfIteratorHelper","entries","s","n","done","_step$value","_slicedToArray","value","i","expectedToken","receivedToken","Number","isNaN","includes","receivedNumber","expectedNumber","TypeError","concat","absoluteError","Math","abs","relativeError","POSITIVE_INFINITY","err","e","f"],"mappings":"wEAAMA,EAAyB,iDAExB,SAA6CC,EAAkBC,GAEpE,IAAMC,EAAiBF,EAASG,OAAOC,MAAM,OACvCC,EAAiBJ,EAASE,OAAOC,MAAM,OAE7C,GAAIF,EAAeI,SAAWD,EAAeC,OAAQ,OAAO,EAAM,IAETC,EAFSC,EAAAC,EAAAA,0BAEjCJ,EAAeK,WAAS,IAAzD,IAAAF,EAAAG,MAAAJ,EAAAC,EAAAI,KAAAC,MAA2D,CAAA,IAAAC,EAAAC,EAAAA,cAAAR,EAAAS,MAAA,GAA/CC,EAACH,EAAA,GAAEI,EAAaJ,EAAA,GACpBK,EAAgBjB,EAAee,GAGrC,IADmBG,OAAOC,MAAMD,OAAOF,KAAmBA,EAAcI,SAAS,KAClE,CACb,IAAMC,EAAiBH,OAAOD,GACxBK,EAAiBJ,OAAOF,GAE9B,GAAIE,OAAOC,MAAMG,GAAiB,MAAM,IAAIC,UAAS,+BAAAC,OAAgCR,IACrF,GAAIE,OAAOC,MAAME,GAAiB,OAAO,EAEzC,IAAMI,EAAgBC,KAAKC,IAAIN,EAAiBC,GAC1CM,EAAmC,IAAnBN,EAAuBJ,OAAOW,kBAAoBH,KAAKC,IAAIF,EAAgBH,GACjG,GAAIG,EAAgB5B,GAA0B+B,EAAgB/B,EAAwB,OAAO,CAC/F,MACE,GAAIoB,IAAkBD,EAAe,OAAO,CAEhD,CAAC,CAAA,MAAAc,GAAAxB,EAAAyB,EAAAD,EAAA,CAAA,QAAAxB,EAAA0B,GAAA,CAED,OAAO,CACT"} | ||
| {"version":3,"file":"compareStdoutAsSpaceSeparatedTokens.cjs","names":[],"sources":["../../src/helpers/compareStdoutAsSpaceSeparatedTokens.ts"],"sourcesContent":["const ACCEPTABLE_FLOAT_ERROR = 1e-6;\n\nexport function compareStdoutAsSpaceSeparatedTokens(received: string, expected: string): boolean {\n // Consecutive white spaces (including tabs, page breaks, and line breaks) are treated as one space character.\n const receivedTokens = received.trim().split(/\\s+/);\n const expectedTokens = expected.trim().split(/\\s+/);\n\n if (receivedTokens.length !== expectedTokens.length) return false;\n\n for (const [i, expectedToken] of expectedTokens.entries()) {\n const receivedToken = receivedTokens[i];\n\n const isDecimal = !Number.isNaN(Number(expectedToken)) && expectedToken.includes('.');\n if (isDecimal) {\n const receivedNumber = Number(receivedToken);\n const expectedNumber = Number(expectedToken);\n\n if (Number.isNaN(expectedNumber)) throw new TypeError(`invalid token in test case: ${expectedToken}`);\n if (Number.isNaN(receivedNumber)) return false;\n\n const absoluteError = Math.abs(receivedNumber - expectedNumber);\n const relativeError = expectedNumber === 0 ? Number.POSITIVE_INFINITY : Math.abs(absoluteError / expectedNumber);\n if (absoluteError > ACCEPTABLE_FLOAT_ERROR && relativeError > ACCEPTABLE_FLOAT_ERROR) return false;\n } else {\n if (receivedToken !== expectedToken) return false;\n }\n }\n\n return true;\n}\n"],"mappings":"aAAA,MAAM,EAAyB,KAE/B,SAAgB,EAAoC,EAAkB,EAA2B,CAE/F,IAAM,EAAiB,EAAS,KAAK,CAAC,CAAC,MAAM,KAAK,EAC5C,EAAiB,EAAS,KAAK,CAAC,CAAC,MAAM,KAAK,EAElD,GAAI,EAAe,SAAW,EAAe,OAAQ,MAAO,GAE5D,IAAK,GAAM,CAAC,EAAG,KAAkB,EAAe,QAAQ,EAAG,CACzD,IAAM,EAAgB,EAAe,GAGrC,GADkB,CAAC,OAAO,MAAM,OAAO,CAAa,CAAC,GAAK,EAAc,SAAS,GAAG,EACrE,CACb,IAAM,EAAiB,OAAO,CAAa,EACrC,EAAiB,OAAO,CAAa,EAE3C,GAAI,OAAO,MAAM,CAAc,EAAG,MAAU,UAAU,+BAA+B,GAAe,EACpG,GAAI,OAAO,MAAM,CAAc,EAAG,MAAO,GAEzC,IAAM,EAAgB,KAAK,IAAI,EAAiB,CAAc,EACxD,EAAgB,IAAmB,EAAI,IAA2B,KAAK,IAAI,EAAgB,CAAc,EAC/G,GAAI,EAAgB,GAA0B,EAAgB,EAAwB,MAAO,EAC/F,MACE,GAAI,IAAkB,EAAe,MAAO,EAEhD,CAEA,MAAO,EACT"} |
@@ -1,2 +0,2 @@ | ||
| import{createForOfIteratorHelper as r,slicedToArray as e}from"../_virtual/_rollupPluginBabelHelpers.js";var t=1e-6;function a(a,i){var n=a.trim().split(/\s+/),s=i.trim().split(/\s+/);if(n.length!==s.length)return!1;var l,u=r(s.entries());try{for(u.s();!(l=u.n()).done;){var N=e(l.value,2),o=N[0],f=N[1],m=n[o];if(!Number.isNaN(Number(f))&&f.includes(".")){var b=Number(m),c=Number(f);if(Number.isNaN(c))throw new TypeError("invalid token in test case: ".concat(f));if(Number.isNaN(b))return!1;var v=Math.abs(b-c),p=0===c?Number.POSITIVE_INFINITY:Math.abs(v/c);if(v>t&&p>t)return!1}else if(m!==f)return!1}}catch(r){u.e(r)}finally{u.f()}return!0}export{a as compareStdoutAsSpaceSeparatedTokens}; | ||
| //# sourceMappingURL=compareStdoutAsSpaceSeparatedTokens.js.map | ||
| const e=1e-6;function t(t,n){let r=t.trim().split(/\s+/),i=n.trim().split(/\s+/);if(r.length!==i.length)return!1;for(let[t,n]of i.entries()){let i=r[t];if(!Number.isNaN(Number(n))&&n.includes(`.`)){let t=Number(i),r=Number(n);if(Number.isNaN(r))throw TypeError(`invalid token in test case: ${n}`);if(Number.isNaN(t))return!1;let a=Math.abs(t-r),o=r===0?1/0:Math.abs(a/r);if(a>e&&o>e)return!1}else if(i!==n)return!1}return!0}export{t as compareStdoutAsSpaceSeparatedTokens}; | ||
| //# sourceMappingURL=compareStdoutAsSpaceSeparatedTokens.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"compareStdoutAsSpaceSeparatedTokens.js","sources":["../../src/helpers/compareStdoutAsSpaceSeparatedTokens.ts"],"sourcesContent":["const ACCEPTABLE_FLOAT_ERROR = 1e-6;\n\nexport function compareStdoutAsSpaceSeparatedTokens(received: string, expected: string): boolean {\n // Consecutive white spaces (including tabs, page breaks, and line breaks) are treated as one space character.\n const receivedTokens = received.trim().split(/\\s+/);\n const expectedTokens = expected.trim().split(/\\s+/);\n\n if (receivedTokens.length !== expectedTokens.length) return false;\n\n for (const [i, expectedToken] of expectedTokens.entries()) {\n const receivedToken = receivedTokens[i];\n\n const isDecimal = !Number.isNaN(Number(expectedToken)) && expectedToken.includes('.');\n if (isDecimal) {\n const receivedNumber = Number(receivedToken);\n const expectedNumber = Number(expectedToken);\n\n if (Number.isNaN(expectedNumber)) throw new TypeError(`invalid token in test case: ${expectedToken}`);\n if (Number.isNaN(receivedNumber)) return false;\n\n const absoluteError = Math.abs(receivedNumber - expectedNumber);\n const relativeError = expectedNumber === 0 ? Number.POSITIVE_INFINITY : Math.abs(absoluteError / expectedNumber);\n if (absoluteError > ACCEPTABLE_FLOAT_ERROR && relativeError > ACCEPTABLE_FLOAT_ERROR) return false;\n } else {\n if (receivedToken !== expectedToken) return false;\n }\n }\n\n return true;\n}\n"],"names":["ACCEPTABLE_FLOAT_ERROR","compareStdoutAsSpaceSeparatedTokens","received","expected","receivedTokens","trim","split","expectedTokens","length","_step","_iterator","_createForOfIteratorHelper","entries","s","n","done","_step$value","_slicedToArray","value","i","expectedToken","receivedToken","Number","isNaN","includes","receivedNumber","expectedNumber","TypeError","concat","absoluteError","Math","abs","relativeError","POSITIVE_INFINITY","err","e","f"],"mappings":"wGAAA,IAAMA,EAAyB,KAExB,SAASC,EAAoCC,EAAkBC,GAEpE,IAAMC,EAAiBF,EAASG,OAAOC,MAAM,OACvCC,EAAiBJ,EAASE,OAAOC,MAAM,OAE7C,GAAIF,EAAeI,SAAWD,EAAeC,OAAQ,OAAO,EAAM,IAETC,EAFSC,EAAAC,EAEjCJ,EAAeK,WAAS,IAAzD,IAAAF,EAAAG,MAAAJ,EAAAC,EAAAI,KAAAC,MAA2D,CAAA,IAAAC,EAAAC,EAAAR,EAAAS,MAAA,GAA/CC,EAACH,EAAA,GAAEI,EAAaJ,EAAA,GACpBK,EAAgBjB,EAAee,GAGrC,IADmBG,OAAOC,MAAMD,OAAOF,KAAmBA,EAAcI,SAAS,KAClE,CACb,IAAMC,EAAiBH,OAAOD,GACxBK,EAAiBJ,OAAOF,GAE9B,GAAIE,OAAOC,MAAMG,GAAiB,MAAM,IAAIC,UAAS,+BAAAC,OAAgCR,IACrF,GAAIE,OAAOC,MAAME,GAAiB,OAAO,EAEzC,IAAMI,EAAgBC,KAAKC,IAAIN,EAAiBC,GAC1CM,EAAmC,IAAnBN,EAAuBJ,OAAOW,kBAAoBH,KAAKC,IAAIF,EAAgBH,GACjG,GAAIG,EAAgB7B,GAA0BgC,EAAgBhC,EAAwB,OAAO,CAC/F,MACE,GAAIqB,IAAkBD,EAAe,OAAO,CAEhD,CAAC,CAAA,MAAAc,GAAAxB,EAAAyB,EAAAD,EAAA,CAAA,QAAAxB,EAAA0B,GAAA,CAED,OAAO,CACT"} | ||
| {"version":3,"file":"compareStdoutAsSpaceSeparatedTokens.js","names":[],"sources":["../../src/helpers/compareStdoutAsSpaceSeparatedTokens.ts"],"sourcesContent":["const ACCEPTABLE_FLOAT_ERROR = 1e-6;\n\nexport function compareStdoutAsSpaceSeparatedTokens(received: string, expected: string): boolean {\n // Consecutive white spaces (including tabs, page breaks, and line breaks) are treated as one space character.\n const receivedTokens = received.trim().split(/\\s+/);\n const expectedTokens = expected.trim().split(/\\s+/);\n\n if (receivedTokens.length !== expectedTokens.length) return false;\n\n for (const [i, expectedToken] of expectedTokens.entries()) {\n const receivedToken = receivedTokens[i];\n\n const isDecimal = !Number.isNaN(Number(expectedToken)) && expectedToken.includes('.');\n if (isDecimal) {\n const receivedNumber = Number(receivedToken);\n const expectedNumber = Number(expectedToken);\n\n if (Number.isNaN(expectedNumber)) throw new TypeError(`invalid token in test case: ${expectedToken}`);\n if (Number.isNaN(receivedNumber)) return false;\n\n const absoluteError = Math.abs(receivedNumber - expectedNumber);\n const relativeError = expectedNumber === 0 ? Number.POSITIVE_INFINITY : Math.abs(absoluteError / expectedNumber);\n if (absoluteError > ACCEPTABLE_FLOAT_ERROR && relativeError > ACCEPTABLE_FLOAT_ERROR) return false;\n } else {\n if (receivedToken !== expectedToken) return false;\n }\n }\n\n return true;\n}\n"],"mappings":"AAAA,MAAM,EAAyB,KAE/B,SAAgB,EAAoC,EAAkB,EAA2B,CAE/F,IAAM,EAAiB,EAAS,KAAK,CAAC,CAAC,MAAM,KAAK,EAC5C,EAAiB,EAAS,KAAK,CAAC,CAAC,MAAM,KAAK,EAElD,GAAI,EAAe,SAAW,EAAe,OAAQ,MAAO,GAE5D,IAAK,GAAM,CAAC,EAAG,KAAkB,EAAe,QAAQ,EAAG,CACzD,IAAM,EAAgB,EAAe,GAGrC,GADkB,CAAC,OAAO,MAAM,OAAO,CAAa,CAAC,GAAK,EAAc,SAAS,GAAG,EACrE,CACb,IAAM,EAAiB,OAAO,CAAa,EACrC,EAAiB,OAAO,CAAa,EAE3C,GAAI,OAAO,MAAM,CAAc,EAAG,MAAU,UAAU,+BAA+B,GAAe,EACpG,GAAI,OAAO,MAAM,CAAc,EAAG,MAAO,GAEzC,IAAM,EAAgB,KAAK,IAAI,EAAiB,CAAc,EACxD,EAAgB,IAAmB,EAAI,IAA2B,KAAK,IAAI,EAAgB,CAAc,EAC/G,GAAI,EAAgB,GAA0B,EAAgB,EAAwB,MAAO,EAC/F,MACE,GAAI,IAAkB,EAAe,MAAO,EAEhD,CAEA,MAAO,EACT"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var r=require("../_virtual/_rollupPluginBabelHelpers.cjs"),e=require("node:fs");function n(){return(n=r.asyncToGenerator(r.regenerator().m(function n(t,s){return r.regenerator().w(function(r){for(;;)switch(r.n){case 0:return r.n=1,e.promises.cp(t,s,{force:!0,recursive:!0});case 1:return r.a(2)}},n)}))).apply(this,arguments)}exports.copyTestCaseFileInput=function(r,e){return n.apply(this,arguments)}; | ||
| //# sourceMappingURL=copyTestCaseFileInput.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:fs");t=e.__toESM(t,1);async function n(e,n){await t.default.promises.cp(e,n,{force:!0,recursive:!0})}exports.copyTestCaseFileInput=n; | ||
| //# sourceMappingURL=copyTestCaseFileInput.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"copyTestCaseFileInput.cjs","sources":["../../src/helpers/copyTestCaseFileInput.ts"],"sourcesContent":["import fs from 'node:fs';\n\nexport async function copyTestCaseFileInput(fileInputPath: string, cwd: string): Promise<void> {\n await fs.promises.cp(fileInputPath, cwd, { force: true, recursive: true });\n}\n"],"names":["_copyTestCaseFileInput","_asyncToGenerator","_regenerator","m","_callee","fileInputPath","cwd","w","_context","n","fs","promises","cp","force","recursive","a","apply","this","arguments","_x","_x2"],"mappings":"6FAIC,SAAAA,IAAA,OAAAA,EAAAC,EAAAA,iBAAAC,gBAAAC,EAFM,SAAAC,EAAqCC,EAAuBC,GAAW,OAAAJ,gBAAAK,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,OAAAD,EAAAC,EAAA,EACtEC,EAAGC,SAASC,GAAGP,EAAeC,EAAK,CAAEO,OAAO,EAAMC,WAAW,IAAO,KAAA,EAAA,OAAAN,EAAAO,EAAA,GAAA,EAAAX,EAAA,KAC3EY,MAAAC,KAAAC,UAAA,+BAFD,SAA2CC,EAAAC,GAAA,OAAApB,EAAAgB,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"copyTestCaseFileInput.cjs","names":["fs"],"sources":["../../src/helpers/copyTestCaseFileInput.ts"],"sourcesContent":["import fs from 'node:fs';\n\nexport async function copyTestCaseFileInput(fileInputPath: string, cwd: string): Promise<void> {\n await fs.promises.cp(fileInputPath, cwd, { force: true, recursive: true });\n}\n"],"mappings":"4GAEA,eAAsB,EAAsB,EAAuB,EAA4B,CAC7F,MAAMA,EAAAA,QAAG,SAAS,GAAG,EAAe,EAAK,CAAE,MAAO,GAAM,UAAW,EAAK,CAAC,CAC3E"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as r,regenerator as e}from"../_virtual/_rollupPluginBabelHelpers.js";import n from"node:fs";function t(r,e){return o.apply(this,arguments)}function o(){return(o=r(e().m(function r(t,o){return e().w(function(r){for(;;)switch(r.n){case 0:return r.n=1,n.promises.cp(t,o,{force:!0,recursive:!0});case 1:return r.a(2)}},r)}))).apply(this,arguments)}export{t as copyTestCaseFileInput}; | ||
| //# sourceMappingURL=copyTestCaseFileInput.js.map | ||
| import e from"node:fs";async function t(t,n){await e.promises.cp(t,n,{force:!0,recursive:!0})}export{t as copyTestCaseFileInput}; | ||
| //# sourceMappingURL=copyTestCaseFileInput.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"copyTestCaseFileInput.js","sources":["../../src/helpers/copyTestCaseFileInput.ts"],"sourcesContent":["import fs from 'node:fs';\n\nexport async function copyTestCaseFileInput(fileInputPath: string, cwd: string): Promise<void> {\n await fs.promises.cp(fileInputPath, cwd, { force: true, recursive: true });\n}\n"],"names":["copyTestCaseFileInput","_x","_x2","_copyTestCaseFileInput","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","fileInputPath","cwd","w","_context","n","fs","promises","cp","force","recursive","a"],"mappings":"oHAEA,SAAsBA,EAAqBC,EAAAC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAE1C,SAAAH,IAAA,OAAAA,EAAAI,EAAAC,IAAAC,EAFM,SAAAC,EAAqCC,EAAuBC,GAAW,OAAAJ,IAAAK,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,OAAAD,EAAAC,EAAA,EACtEC,EAAGC,SAASC,GAAGP,EAAeC,EAAK,CAAEO,OAAO,EAAMC,WAAW,IAAO,KAAA,EAAA,OAAAN,EAAAO,EAAA,GAAA,EAAAX,EAAA,KAC3EN,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"copyTestCaseFileInput.js","names":[],"sources":["../../src/helpers/copyTestCaseFileInput.ts"],"sourcesContent":["import fs from 'node:fs';\n\nexport async function copyTestCaseFileInput(fileInputPath: string, cwd: string): Promise<void> {\n await fs.promises.cp(fileInputPath, cwd, { force: true, recursive: true });\n}\n"],"mappings":"uBAEA,eAAsB,EAAsB,EAAuB,EAA4B,CAC7F,MAAM,EAAG,SAAS,GAAG,EAAe,EAAK,CAAE,MAAO,GAAM,UAAW,EAAK,CAAC,CAC3E"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:fs"),n=require("../types/language.cjs"),a=["index","main"],t=[".DS_Store",".class"];function i(){return(i=e.asyncToGenerator(e.regenerator().m(function i(s,u){var o,c,l,f,p,d,m,g;return e.regenerator().w(function(i){for(;;)switch(i.p=i.n){case 0:return o=u&&[u].flat().flatMap(function(e){var r,a;return null!=(r=null==(a=n.languageIdToDefinition[e])?void 0:a.fileExtensions)?r:[]}),l=-1,m=e.createForOfIteratorHelper,i.n=1,r.promises.readdir(s,{withFileTypes:!0});case 1:f=m(i.v),i.p=2,d=e.regenerator().m(function r(){var n,i;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:if((n=p.value).isFile()){e.n=1;break}return e.a(2,0);case 1:if(!t.some(function(e){return n.name.endsWith(e)})){e.n=2;break}return e.a(2,0);case 2:if(!o||o.some(function(e){return n.name.endsWith(e)})){e.n=3;break}return e.a(2,0);case 3:i=a.findLastIndex(function(e){return n.name.toLowerCase().startsWith("".concat(e,"."))}),c&&!(i===l?n.name.localeCompare(c)<0:i>l)||(c=n.name,l=i);case 4:return e.a(2)}},r)}),f.s();case 3:if((p=f.n()).done){i.n=6;break}return i.d(e.regeneratorValues(d()),4);case 4:if(0!==i.v){i.n=5;break}return i.a(3,5);case 5:i.n=3;break;case 6:i.n=8;break;case 7:i.p=7,g=i.v,f.e(g);case 8:return i.p=8,f.f(),i.f(8);case 9:return i.a(2,c)}},i,null,[[2,7,8,9]])}))).apply(this,arguments)}exports.findEntryPointFile=function(e,r){return i.apply(this,arguments)}; | ||
| //# sourceMappingURL=findEntryPointFile.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../types/language.cjs");let n=require("node:fs");n=e.__toESM(n,1);const r=[`index`,`main`],i=[`.DS_Store`,`.class`];async function a(e,a){let o=a&&[a].flat().flatMap(e=>t.languageIdToDefinition[e]?.fileExtensions??[]),s,c=-1;for(let t of await n.default.promises.readdir(e,{withFileTypes:!0})){if(!t.isFile()||i.some(e=>t.name.endsWith(e))||o&&!o.some(e=>t.name.endsWith(e)))continue;let e=r.findLastIndex(e=>t.name.toLowerCase().startsWith(`${e}.`));(!s||(e===c?t.name.localeCompare(s)<0:e>c))&&(s=t.name,c=e)}return s}exports.findEntryPointFile=a; | ||
| //# sourceMappingURL=findEntryPointFile.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"findEntryPointFile.cjs","sources":["../../src/helpers/findEntryPointFile.ts"],"sourcesContent":["import fs from 'node:fs';\n\nimport { languageIdToDefinition } from '../types/language.js';\n\n// The last is most prioritized.\nconst PRIOTIZED_FILE_NAMES = ['index', 'main'] as const;\n\nconst IGNORED_FILE_EXTENSIONS = ['.DS_Store', '.class'] as const;\n\nexport async function findEntryPointFile(\n cwd: string,\n language?: string | readonly string[]\n): Promise<string | undefined> {\n const fileExtensions =\n language && [language].flat().flatMap((language) => languageIdToDefinition[language]?.fileExtensions ?? []);\n\n let mainFileName: string | undefined;\n let mainFilePrioryty = -1;\n\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile()) continue;\n if (IGNORED_FILE_EXTENSIONS.some((ext) => dirent.name.endsWith(ext))) continue;\n if (fileExtensions && !fileExtensions.some((ext) => dirent.name.endsWith(ext))) continue;\n\n const direntPrioryty = PRIOTIZED_FILE_NAMES.findLastIndex((name) =>\n dirent.name.toLowerCase().startsWith(`${name}.`)\n );\n\n if (\n !mainFileName ||\n (direntPrioryty === mainFilePrioryty\n ? dirent.name.localeCompare(mainFileName) < 0\n : direntPrioryty > mainFilePrioryty)\n ) {\n mainFileName = dirent.name;\n mainFilePrioryty = direntPrioryty;\n }\n }\n\n return mainFileName;\n}\n"],"names":["PRIOTIZED_FILE_NAMES","IGNORED_FILE_EXTENSIONS","_findEntryPointFile","_asyncToGenerator","_regenerator","m","_callee","cwd","language","fileExtensions","mainFileName","mainFilePrioryty","_iterator","_step","_loop","_t","_t2","w","_context2","p","n","flat","flatMap","_languageIdToDefiniti","_languageIdToDefiniti2","languageIdToDefinition","_createForOfIteratorHelper","fs","promises","readdir","withFileTypes","v","dirent","direntPrioryty","_context","value","isFile","a","some","ext","name","endsWith","findLastIndex","toLowerCase","startsWith","concat","localeCompare","s","done","d","_regeneratorValues","e","f","apply","this","arguments","_x","_x2"],"mappings":"gIAKMA,EAAuB,CAAC,QAAS,QAEjCC,EAA0B,CAAC,YAAa,UAiC7C,SAAAC,IAAA,OAAAA,EAAAC,EAAAA,iBAAAC,gBAAAC,EA/BM,SAAAC,EACLC,EACAC,GAAqC,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAZ,gBAAAa,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAMZ,OAJnBX,EACJD,GAAY,CAACA,GAAUa,OAAOC,QAAQ,SAACd,GAAQ,IAAAe,EAAAC,EAAA,OAAqD,OAArDD,EAAqC,OAArCC,EAAKC,EAAAA,uBAAuBjB,SAAS,EAAhCgB,EAAkCf,gBAAcc,EAAI,EAAE,GAGxGZ,GAAmB,EAAEI,EAAAW,EAAAA,0BAAAR,EAAAE,EAAA,EAEEO,EAAGC,SAASC,QAAQtB,EAAK,CAAEuB,eAAe,IAAO,KAAA,EAAAlB,EAAAG,EAAAG,EAAAa,GAAAb,EAAAC,EAAA,EAAAL,EAAAV,EAAAA,cAAAC,WAAAS,IAAA,IAAAkB,EAAAC,EAAA,OAAA7B,gBAAAa,EAAA,SAAAiB,GAAA,cAAAA,EAAAd,GAAA,KAAA,EAA3D,IAANY,EAAMnB,EAAAsB,OACHC,SAAQ,CAAAF,EAAAd,EAAA,EAAA,KAAA,CAAA,OAAAc,EAAAG,EAAA,EAAA,GAAA,KAAA,EAAA,IAChBpC,EAAwBqC,KAAK,SAACC,GAAG,OAAKP,EAAOQ,KAAKC,SAASF,EAAI,GAAC,CAAAL,EAAAd,EAAA,EAAA,KAAA,CAAA,OAAAc,EAAAG,EAAA,EAAA,GAAA,KAAA,EAAA,IAChE5B,GAAmBA,EAAe6B,KAAK,SAACC,GAAG,OAAKP,EAAOQ,KAAKC,SAASF,EAAI,GAAC,CAAAL,EAAAd,EAAA,EAAA,KAAA,CAAA,OAAAc,EAAAG,EAAA,EAAA,GAAA,KAAA,EAExEJ,EAAiBjC,EAAqB0C,cAAc,SAACF,GAAI,OAC7DR,EAAOQ,KAAKG,cAAcC,WAAU,GAAAC,OAAIL,OAAQ,GAI/C9B,KACAuB,IAAmBtB,EAChBqB,EAAOQ,KAAKM,cAAcpC,GAAgB,EAC1CuB,EAAiBtB,KAErBD,EAAesB,EAAOQ,KACtB7B,EAAmBsB,GACpB,KAAA,EAAA,OAAAC,EAAAG,EAAA,GAAA,EAAAvB,EAAA,GAAAF,EAAAmC,IAAA,KAAA,EAAA,IAAAlC,EAAAD,EAAAQ,KAAA4B,KAAA,CAAA9B,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAA+B,EAAAC,EAAAA,kBAAApC,KAAA,GAAA,KAAA,EAAA,GAAA,IAAAI,EAAAa,EAAA,CAAAb,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAmB,EAAA,EAAA,GAAA,KAAA,EAAAnB,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAC,EAAA,EAAAH,EAAAE,EAAAa,EAAAnB,EAAAuC,EAAAnC,GAAA,KAAA,EAAA,OAAAE,EAAAC,EAAA,EAAAP,EAAAwC,IAAAlC,EAAAkC,EAAA,GAAA,KAAA,EAAA,OAAAlC,EAAAmB,EAAA,EAGI3B,GAAY,EAAAJ,EAAA,KAAA,CAAA,CAAA,EAAA,EAAA,EAAA,IAAA,KACpB+C,MAAAC,KAAAC,UAAA,4BA/BD,SAAwCC,EAAAC,GAAA,OAAAvD,EAAAmD,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"findEntryPointFile.cjs","names":["languageIdToDefinition","fs"],"sources":["../../src/helpers/findEntryPointFile.ts"],"sourcesContent":["import fs from 'node:fs';\n\nimport { languageIdToDefinition } from '../types/language.js';\n\n// The last is most prioritized.\nconst PRIOTIZED_FILE_NAMES = ['index', 'main'] as const;\n\nconst IGNORED_FILE_EXTENSIONS = ['.DS_Store', '.class'] as const;\n\nexport async function findEntryPointFile(\n cwd: string,\n language?: string | readonly string[]\n): Promise<string | undefined> {\n const fileExtensions =\n language && [language].flat().flatMap((language) => languageIdToDefinition[language]?.fileExtensions ?? []);\n\n let mainFileName: string | undefined;\n let mainFilePrioryty = -1;\n\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile()) continue;\n if (IGNORED_FILE_EXTENSIONS.some((ext) => dirent.name.endsWith(ext))) continue;\n if (fileExtensions && !fileExtensions.some((ext) => dirent.name.endsWith(ext))) continue;\n\n const direntPrioryty = PRIOTIZED_FILE_NAMES.findLastIndex((name) =>\n dirent.name.toLowerCase().startsWith(`${name}.`)\n );\n\n if (\n !mainFileName ||\n (direntPrioryty === mainFilePrioryty\n ? dirent.name.localeCompare(mainFileName) < 0\n : direntPrioryty > mainFilePrioryty)\n ) {\n mainFileName = dirent.name;\n mainFilePrioryty = direntPrioryty;\n }\n }\n\n return mainFileName;\n}\n"],"mappings":"+IAKA,MAAM,EAAuB,CAAC,QAAS,MAAM,EAEvC,EAA0B,CAAC,YAAa,QAAQ,EAEtD,eAAsB,EACpB,EACA,EAC6B,CAC7B,IAAM,EACJ,GAAY,CAAC,CAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,QAAS,GAAaA,EAAAA,uBAAuB,EAAS,EAAE,gBAAkB,CAAC,CAAC,EAExG,EACA,EAAmB,GAEvB,IAAK,IAAM,KAAU,MAAMC,EAAAA,QAAG,SAAS,QAAQ,EAAK,CAAE,cAAe,EAAK,CAAC,EAAG,CAG5E,GAFI,CAAC,EAAO,OAAO,GACf,EAAwB,KAAM,GAAQ,EAAO,KAAK,SAAS,CAAG,CAAC,GAC/D,GAAkB,CAAC,EAAe,KAAM,GAAQ,EAAO,KAAK,SAAS,CAAG,CAAC,EAAG,SAEhF,IAAM,EAAiB,EAAqB,cAAe,GACzD,EAAO,KAAK,YAAY,CAAC,CAAC,WAAW,GAAG,EAAK,EAAE,CACjD,GAGE,CAAC,IACA,IAAmB,EAChB,EAAO,KAAK,cAAc,CAAY,EAAI,EAC1C,EAAiB,MAErB,EAAe,EAAO,KACtB,EAAmB,EAEvB,CAEA,OAAO,CACT"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as e,regenerator as r,regeneratorValues as n,createForOfIteratorHelper as a}from"../_virtual/_rollupPluginBabelHelpers.js";import t from"node:fs";import{languageIdToDefinition as s}from"../types/language.js";var i=["index","main"],o=[".DS_Store",".class"];function u(e,r){return c.apply(this,arguments)}function c(){return(c=e(r().m(function e(u,c){var f,l,p,m,d,v,b,h;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:return f=c&&[c].flat().flatMap(function(e){var r,n;return null!=(r=null==(n=s[e])?void 0:n.fileExtensions)?r:[]}),p=-1,b=a,e.n=1,t.promises.readdir(u,{withFileTypes:!0});case 1:m=b(e.v),e.p=2,v=r().m(function e(){var n,a;return r().w(function(e){for(;;)switch(e.n){case 0:if((n=d.value).isFile()){e.n=1;break}return e.a(2,0);case 1:if(!o.some(function(e){return n.name.endsWith(e)})){e.n=2;break}return e.a(2,0);case 2:if(!f||f.some(function(e){return n.name.endsWith(e)})){e.n=3;break}return e.a(2,0);case 3:a=i.findLastIndex(function(e){return n.name.toLowerCase().startsWith("".concat(e,"."))}),l&&!(a===p?n.name.localeCompare(l)<0:a>p)||(l=n.name,p=a);case 4:return e.a(2)}},e)}),m.s();case 3:if((d=m.n()).done){e.n=6;break}return e.d(n(v()),4);case 4:if(0!==e.v){e.n=5;break}return e.a(3,5);case 5:e.n=3;break;case 6:e.n=8;break;case 7:e.p=7,h=e.v,m.e(h);case 8:return e.p=8,m.f(),e.f(8);case 9:return e.a(2,l)}},e,null,[[2,7,8,9]])}))).apply(this,arguments)}export{u as findEntryPointFile}; | ||
| //# sourceMappingURL=findEntryPointFile.js.map | ||
| import{languageIdToDefinition as e}from"../types/language.js";import t from"node:fs";const n=[`index`,`main`],r=[`.DS_Store`,`.class`];async function i(i,a){let o=a&&[a].flat().flatMap(t=>e[t]?.fileExtensions??[]),s,c=-1;for(let e of await t.promises.readdir(i,{withFileTypes:!0})){if(!e.isFile()||r.some(t=>e.name.endsWith(t))||o&&!o.some(t=>e.name.endsWith(t)))continue;let t=n.findLastIndex(t=>e.name.toLowerCase().startsWith(`${t}.`));(!s||(t===c?e.name.localeCompare(s)<0:t>c))&&(s=e.name,c=t)}return s}export{i as findEntryPointFile}; | ||
| //# sourceMappingURL=findEntryPointFile.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"findEntryPointFile.js","sources":["../../src/helpers/findEntryPointFile.ts"],"sourcesContent":["import fs from 'node:fs';\n\nimport { languageIdToDefinition } from '../types/language.js';\n\n// The last is most prioritized.\nconst PRIOTIZED_FILE_NAMES = ['index', 'main'] as const;\n\nconst IGNORED_FILE_EXTENSIONS = ['.DS_Store', '.class'] as const;\n\nexport async function findEntryPointFile(\n cwd: string,\n language?: string | readonly string[]\n): Promise<string | undefined> {\n const fileExtensions =\n language && [language].flat().flatMap((language) => languageIdToDefinition[language]?.fileExtensions ?? []);\n\n let mainFileName: string | undefined;\n let mainFilePrioryty = -1;\n\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile()) continue;\n if (IGNORED_FILE_EXTENSIONS.some((ext) => dirent.name.endsWith(ext))) continue;\n if (fileExtensions && !fileExtensions.some((ext) => dirent.name.endsWith(ext))) continue;\n\n const direntPrioryty = PRIOTIZED_FILE_NAMES.findLastIndex((name) =>\n dirent.name.toLowerCase().startsWith(`${name}.`)\n );\n\n if (\n !mainFileName ||\n (direntPrioryty === mainFilePrioryty\n ? dirent.name.localeCompare(mainFileName) < 0\n : direntPrioryty > mainFilePrioryty)\n ) {\n mainFileName = dirent.name;\n mainFilePrioryty = direntPrioryty;\n }\n }\n\n return mainFileName;\n}\n"],"names":["PRIOTIZED_FILE_NAMES","IGNORED_FILE_EXTENSIONS","findEntryPointFile","_x","_x2","_findEntryPointFile","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","cwd","language","fileExtensions","mainFileName","mainFilePrioryty","_iterator","_step","_loop","_t","_t2","w","_context2","p","n","flat","flatMap","_languageIdToDefiniti","_languageIdToDefiniti2","languageIdToDefinition","_createForOfIteratorHelper","fs","promises","readdir","withFileTypes","v","dirent","direntPrioryty","_context","value","isFile","a","some","ext","name","endsWith","findLastIndex","toLowerCase","startsWith","concat","localeCompare","s","done","d","_regeneratorValues","e","f"],"mappings":"wOAKA,IAAMA,EAAuB,CAAC,QAAS,QAEjCC,EAA0B,CAAC,YAAa,UAE9C,SAAsBC,EAAkBC,EAAAC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CA+BvC,SAAAH,IAAA,OAAAA,EAAAI,EAAAC,IAAAC,EA/BM,SAAAC,EACLC,EACAC,GAAqC,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAZ,IAAAa,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAMZ,OAJnBX,EACJD,GAAY,CAACA,GAAUa,OAAOC,QAAQ,SAACd,GAAQ,IAAAe,EAAAC,EAAA,OAAqD,OAArDD,EAAqC,OAArCC,EAAKC,EAAuBjB,SAAS,EAAhCgB,EAAkCf,gBAAcc,EAAI,EAAE,GAGxGZ,GAAmB,EAAEI,EAAAW,EAAAR,EAAAE,EAAA,EAEEO,EAAGC,SAASC,QAAQtB,EAAK,CAAEuB,eAAe,IAAO,KAAA,EAAAlB,EAAAG,EAAAG,EAAAa,GAAAb,EAAAC,EAAA,EAAAL,EAAAV,IAAAC,WAAAS,IAAA,IAAAkB,EAAAC,EAAA,OAAA7B,IAAAa,EAAA,SAAAiB,GAAA,cAAAA,EAAAd,GAAA,KAAA,EAA3D,IAANY,EAAMnB,EAAAsB,OACHC,SAAQ,CAAAF,EAAAd,EAAA,EAAA,KAAA,CAAA,OAAAc,EAAAG,EAAA,EAAA,GAAA,KAAA,EAAA,IAChB1C,EAAwB2C,KAAK,SAACC,GAAG,OAAKP,EAAOQ,KAAKC,SAASF,EAAI,GAAC,CAAAL,EAAAd,EAAA,EAAA,KAAA,CAAA,OAAAc,EAAAG,EAAA,EAAA,GAAA,KAAA,EAAA,IAChE5B,GAAmBA,EAAe6B,KAAK,SAACC,GAAG,OAAKP,EAAOQ,KAAKC,SAASF,EAAI,GAAC,CAAAL,EAAAd,EAAA,EAAA,KAAA,CAAA,OAAAc,EAAAG,EAAA,EAAA,GAAA,KAAA,EAExEJ,EAAiBvC,EAAqBgD,cAAc,SAACF,GAAI,OAC7DR,EAAOQ,KAAKG,cAAcC,WAAU,GAAAC,OAAIL,OAAQ,GAI/C9B,KACAuB,IAAmBtB,EAChBqB,EAAOQ,KAAKM,cAAcpC,GAAgB,EAC1CuB,EAAiBtB,KAErBD,EAAesB,EAAOQ,KACtB7B,EAAmBsB,GACpB,KAAA,EAAA,OAAAC,EAAAG,EAAA,GAAA,EAAAvB,EAAA,GAAAF,EAAAmC,IAAA,KAAA,EAAA,IAAAlC,EAAAD,EAAAQ,KAAA4B,KAAA,CAAA9B,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAA+B,EAAAC,EAAApC,KAAA,GAAA,KAAA,EAAA,GAAA,IAAAI,EAAAa,EAAA,CAAAb,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAmB,EAAA,EAAA,GAAA,KAAA,EAAAnB,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAC,EAAA,EAAAH,EAAAE,EAAAa,EAAAnB,EAAAuC,EAAAnC,GAAA,KAAA,EAAA,OAAAE,EAAAC,EAAA,EAAAP,EAAAwC,IAAAlC,EAAAkC,EAAA,GAAA,KAAA,EAAA,OAAAlC,EAAAmB,EAAA,EAGI3B,GAAY,EAAAJ,EAAA,KAAA,CAAA,CAAA,EAAA,EAAA,EAAA,IAAA,KACpBN,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"findEntryPointFile.js","names":[],"sources":["../../src/helpers/findEntryPointFile.ts"],"sourcesContent":["import fs from 'node:fs';\n\nimport { languageIdToDefinition } from '../types/language.js';\n\n// The last is most prioritized.\nconst PRIOTIZED_FILE_NAMES = ['index', 'main'] as const;\n\nconst IGNORED_FILE_EXTENSIONS = ['.DS_Store', '.class'] as const;\n\nexport async function findEntryPointFile(\n cwd: string,\n language?: string | readonly string[]\n): Promise<string | undefined> {\n const fileExtensions =\n language && [language].flat().flatMap((language) => languageIdToDefinition[language]?.fileExtensions ?? []);\n\n let mainFileName: string | undefined;\n let mainFilePrioryty = -1;\n\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile()) continue;\n if (IGNORED_FILE_EXTENSIONS.some((ext) => dirent.name.endsWith(ext))) continue;\n if (fileExtensions && !fileExtensions.some((ext) => dirent.name.endsWith(ext))) continue;\n\n const direntPrioryty = PRIOTIZED_FILE_NAMES.findLastIndex((name) =>\n dirent.name.toLowerCase().startsWith(`${name}.`)\n );\n\n if (\n !mainFileName ||\n (direntPrioryty === mainFilePrioryty\n ? dirent.name.localeCompare(mainFileName) < 0\n : direntPrioryty > mainFilePrioryty)\n ) {\n mainFileName = dirent.name;\n mainFilePrioryty = direntPrioryty;\n }\n }\n\n return mainFileName;\n}\n"],"mappings":"qFAKA,MAAM,EAAuB,CAAC,QAAS,MAAM,EAEvC,EAA0B,CAAC,YAAa,QAAQ,EAEtD,eAAsB,EACpB,EACA,EAC6B,CAC7B,IAAM,EACJ,GAAY,CAAC,CAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,QAAS,GAAa,EAAuB,EAAS,EAAE,gBAAkB,CAAC,CAAC,EAExG,EACA,EAAmB,GAEvB,IAAK,IAAM,KAAU,MAAM,EAAG,SAAS,QAAQ,EAAK,CAAE,cAAe,EAAK,CAAC,EAAG,CAG5E,GAFI,CAAC,EAAO,OAAO,GACf,EAAwB,KAAM,GAAQ,EAAO,KAAK,SAAS,CAAG,CAAC,GAC/D,GAAkB,CAAC,EAAe,KAAM,GAAQ,EAAO,KAAK,SAAS,CAAG,CAAC,EAAG,SAEhF,IAAM,EAAiB,EAAqB,cAAe,GACzD,EAAO,KAAK,YAAY,CAAC,CAAC,WAAW,GAAG,EAAK,EAAE,CACjD,GAGE,CAAC,IACA,IAAmB,EAChB,EAAO,KAAK,cAAc,CAAY,EAAI,EAC1C,EAAiB,MAErB,EAAe,EAAO,KACtB,EAAmB,EAEvB,CAEA,OAAO,CACT"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var n=require("../types/language.cjs");exports.findLanguageDefinitionByPath=function(e){return Object.values(n.languageIdToDefinition).find(function(n){return n.fileExtensions.some(function(n){return e.endsWith(n)})})}; | ||
| //# sourceMappingURL=findLanguageDefinitionByPath.cjs.map | ||
| "use strict";const e=require("../types/language.cjs");function t(t){return Object.values(e.languageIdToDefinition).find(e=>e.fileExtensions.some(e=>t.endsWith(e)))}exports.findLanguageDefinitionByPath=t; | ||
| //# sourceMappingURL=findLanguageDefinitionByPath.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"findLanguageDefinitionByPath.cjs","sources":["../../src/helpers/findLanguageDefinitionByPath.ts"],"sourcesContent":["import { languageIdToDefinition } from '../types/language.js';\nimport type { LanguageDefinition } from '../types/language.js';\n\nexport function findLanguageDefinitionByPath(path: string): LanguageDefinition | undefined {\n return Object.values(languageIdToDefinition).find((definition) =>\n definition.fileExtensions.some((ext) => path.endsWith(ext))\n );\n}\n"],"names":["path","Object","values","languageIdToDefinition","find","definition","fileExtensions","some","ext","endsWith"],"mappings":"yFAGO,SAAsCA,GAC3C,OAAOC,OAAOC,OAAOC,EAAAA,wBAAwBC,KAAK,SAACC,GAAU,OAC3DA,EAAWC,eAAeC,KAAK,SAACC,GAAG,OAAKR,EAAKS,SAASD,EAAI,EAAC,EAE/D"} | ||
| {"version":3,"file":"findLanguageDefinitionByPath.cjs","names":["languageIdToDefinition"],"sources":["../../src/helpers/findLanguageDefinitionByPath.ts"],"sourcesContent":["import { languageIdToDefinition } from '../types/language.js';\nimport type { LanguageDefinition } from '../types/language.js';\n\nexport function findLanguageDefinitionByPath(path: string): LanguageDefinition | undefined {\n return Object.values(languageIdToDefinition).find((definition) =>\n definition.fileExtensions.some((ext) => path.endsWith(ext))\n );\n}\n"],"mappings":"sDAGA,SAAgB,EAA6B,EAA8C,CACzF,OAAO,OAAO,OAAOA,EAAAA,sBAAsB,CAAC,CAAC,KAAM,GACjD,EAAW,eAAe,KAAM,GAAQ,EAAK,SAAS,CAAG,CAAC,CAC5D,CACF"} |
@@ -1,2 +0,2 @@ | ||
| import{languageIdToDefinition as n}from"../types/language.js";function e(e){return Object.values(n).find(function(n){return n.fileExtensions.some(function(n){return e.endsWith(n)})})}export{e as findLanguageDefinitionByPath}; | ||
| //# sourceMappingURL=findLanguageDefinitionByPath.js.map | ||
| import{languageIdToDefinition as e}from"../types/language.js";function t(t){return Object.values(e).find(e=>e.fileExtensions.some(e=>t.endsWith(e)))}export{t as findLanguageDefinitionByPath}; | ||
| //# sourceMappingURL=findLanguageDefinitionByPath.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"findLanguageDefinitionByPath.js","sources":["../../src/helpers/findLanguageDefinitionByPath.ts"],"sourcesContent":["import { languageIdToDefinition } from '../types/language.js';\nimport type { LanguageDefinition } from '../types/language.js';\n\nexport function findLanguageDefinitionByPath(path: string): LanguageDefinition | undefined {\n return Object.values(languageIdToDefinition).find((definition) =>\n definition.fileExtensions.some((ext) => path.endsWith(ext))\n );\n}\n"],"names":["findLanguageDefinitionByPath","path","Object","values","languageIdToDefinition","find","definition","fileExtensions","some","ext","endsWith"],"mappings":"8DAGO,SAASA,EAA6BC,GAC3C,OAAOC,OAAOC,OAAOC,GAAwBC,KAAK,SAACC,GAAU,OAC3DA,EAAWC,eAAeC,KAAK,SAACC,GAAG,OAAKR,EAAKS,SAASD,EAAI,EAAC,EAE/D"} | ||
| {"version":3,"file":"findLanguageDefinitionByPath.js","names":[],"sources":["../../src/helpers/findLanguageDefinitionByPath.ts"],"sourcesContent":["import { languageIdToDefinition } from '../types/language.js';\nimport type { LanguageDefinition } from '../types/language.js';\n\nexport function findLanguageDefinitionByPath(path: string): LanguageDefinition | undefined {\n return Object.values(languageIdToDefinition).find((definition) =>\n definition.fileExtensions.some((ext) => path.endsWith(ext))\n );\n}\n"],"mappings":"8DAGA,SAAgB,EAA6B,EAA8C,CACzF,OAAO,OAAO,OAAO,CAAsB,CAAC,CAAC,KAAM,GACjD,EAAW,eAAe,KAAM,GAAQ,EAAK,SAAS,CAAG,CAAC,CAC5D,CACF"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var r=require("../_virtual/_rollupPluginBabelHelpers.cjs"),e=require("node:fs/promises"),n=require("node:path"),t="model_answers",o="model_answers.fails";function i(){return(i=r.asyncToGenerator(r.regenerator().m(function e(n){return r.regenerator().w(function(r){for(;;)if(0===r.n)return r.a(2,u(n,t))},e)}))).apply(this,arguments)}function a(){return(a=r.asyncToGenerator(r.regenerator().m(function e(n){return r.regenerator().w(function(r){for(;;)if(0===r.n)return r.a(2,u(n,o))},e)}))).apply(this,arguments)}function u(r,e){return s.apply(this,arguments)}function s(){return(s=r.asyncToGenerator(r.regenerator().m(function t(o,i){var a,u,s;return r.regenerator().w(function(r){for(;;)switch(r.p=r.n){case 0:return a=n.join(o,i),r.p=1,r.n=2,e.readdir(a,{withFileTypes:!0});case 2:u=r.v,r.n=5;break;case 3:if(r.p=3,"ENOENT"!==(s=r.v).code){r.n=4;break}return r.a(2,[]);case 4:throw s;case 5:return r.a(2,u.filter(function(r){return r.isDirectory()}).map(function(r){return n.join(a,r.name)}).toSorted())}},t,null,[[1,3]])}))).apply(this,arguments)}exports.FAILING_MODEL_ANSWERS_DIRNAME=o,exports.MODEL_ANSWERS_DIRNAME=t,exports.findFailingModelAnswerDirs=function(r){return a.apply(this,arguments)},exports.findModelAnswerDirs=function(r){return i.apply(this,arguments)}; | ||
| //# sourceMappingURL=findModelAnswerDirs.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:fs/promises");t=e.__toESM(t,1);let n=require("node:path");n=e.__toESM(n,1);const r=`model_answers`,i=`model_answers.fails`;async function a(e){return s(e,r)}async function o(e){return s(e,i)}async function s(e,r){let i=n.default.join(e,r),a;try{a=await t.default.readdir(i,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}return a.filter(e=>e.isDirectory()).map(e=>n.default.join(i,e.name)).toSorted()}exports.FAILING_MODEL_ANSWERS_DIRNAME=i,exports.MODEL_ANSWERS_DIRNAME=r,exports.findFailingModelAnswerDirs=o,exports.findModelAnswerDirs=a; | ||
| //# sourceMappingURL=findModelAnswerDirs.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"findModelAnswerDirs.cjs","sources":["../../src/helpers/findModelAnswerDirs.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport const MODEL_ANSWERS_DIRNAME = 'model_answers';\nexport const FAILING_MODEL_ANSWERS_DIRNAME = 'model_answers.fails';\n\n/**\n * Find model answer directories under `<problemDir>/model_answers/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findModelAnswerDirs(problemDir: string): Promise<string[]> {\n return findAnswerDirs(problemDir, MODEL_ANSWERS_DIRNAME);\n}\n\n/**\n * Find failing model answer directories under `<problemDir>/model_answers.fails/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findFailingModelAnswerDirs(problemDir: string): Promise<string[]> {\n return findAnswerDirs(problemDir, FAILING_MODEL_ANSWERS_DIRNAME);\n}\n\nasync function findAnswerDirs(problemDir: string, dirname: string): Promise<string[]> {\n const modelAnswersDir = path.join(problemDir, dirname);\n let entries;\n try {\n entries = await fs.readdir(modelAnswersDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw error;\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(modelAnswersDir, entry.name))\n .toSorted();\n}\n"],"names":["MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME","_findModelAnswerDirs","_asyncToGenerator","_regenerator","m","_callee","problemDir","w","_context","n","a","findAnswerDirs","apply","this","arguments","_findFailingModelAnswerDirs","_callee2","_context2","_x3","_x4","_findAnswerDirs","_callee3","dirname","modelAnswersDir","entries","_t","_context3","p","path","join","fs","readdir","withFileTypes","v","code","filter","entry","isDirectory","map","name","toSorted","_x2","_x"],"mappings":"6HAGaA,EAAwB,gBACxBC,EAAgC,sBAU7C,SAAAC,IAFC,OAEDA,EAAAC,EAAAA,iBAAAC,EAAAA,cAAAC,EAJO,SAAAC,EAAmCC,GAAkB,OAAAH,gBAAAI,EAAA,SAAAC,GAAA,UAAA,IAAAA,EAAAC,EAAA,OAAAD,EAAAE,EAAA,EACnDC,EAAeL,EAAYP,GAAsB,EAAAM,EAAA,KACzDO,MAAAC,KAAAC,UAAA,CAQA,SAAAC,IAAA,OAAAA,EAAAb,EAAAA,iBAAAC,EAAAA,cAAAC,EAFM,SAAAY,EAA0CV,GAAkB,OAAAH,gBAAAI,EAAA,SAAAU,GAAA,UAAA,IAAAA,EAAAR,EAAA,OAAAQ,EAAAP,EAAA,EAC1DC,EAAeL,EAAYN,GAA8B,EAAAgB,EAAA,KACjEJ,MAAAC,KAAAC,UAAA,CAAA,SAEcH,EAAcO,EAAAC,GAAA,OAAAC,EAAAR,MAAAC,KAAAC,UAAA,CAAA,SAAAM,IAa5B,OAb4BA,EAAAlB,EAAAA,iBAAAC,gBAAAC,EAA7B,SAAAiB,EAA8Bf,EAAoBgB,GAAe,IAAAC,EAAAC,EAAAC,EAAA,OAAAtB,gBAAAI,EAAA,SAAAmB,GAAA,cAAAA,EAAAC,EAAAD,EAAAjB,GAAA,KAAA,EACT,OAAhDc,EAAkBK,EAAKC,KAAKvB,EAAYgB,GAAQI,EAAAC,EAAA,EAAAD,EAAAjB,EAAA,EAGpCqB,EAAGC,QAAQR,EAAiB,CAAES,eAAe,IAAO,KAAA,EAApER,EAAOE,EAAAO,EAAAP,EAAAjB,EAAA,EAAA,MAAA,KAAA,EAAA,GAAAiB,EAAAC,EAAA,EAEuC,YAFvCF,EAAAC,EAAAO,GAE8BC,KAAiB,CAAAR,EAAAjB,EAAA,EAAA,KAAA,CAAA,OAAAiB,EAAAhB,EAAA,EAAS,IAAE,KAAA,EAAA,MAAAe,EAAA,KAAA,EAAA,OAAAC,EAAAhB,EAAA,EAG5Dc,EACJW,OAAO,SAACC,GAAK,OAAKA,EAAMC,aAAa,GACrCC,IAAI,SAACF,GAAK,OAAKR,EAAKC,KAAKN,EAAiBa,EAAMG,KAAK,GACrDC,YAAU,EAAAnB,EAAA,KAAA,CAAA,CAAA,EAAA,IAAA,KACdT,MAAAC,KAAAC,UAAA,4GAjBD,SAAgD2B,GAAA,OAAA1B,EAAAH,MAAAC,KAAAC,UAAA,8BARhD,SAAyC4B,GAAA,OAAAzC,EAAAW,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"findModelAnswerDirs.cjs","names":["path","fs"],"sources":["../../src/helpers/findModelAnswerDirs.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport const MODEL_ANSWERS_DIRNAME = 'model_answers';\nexport const FAILING_MODEL_ANSWERS_DIRNAME = 'model_answers.fails';\n\n/**\n * Find model answer directories under `<problemDir>/model_answers/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findModelAnswerDirs(problemDir: string): Promise<string[]> {\n return findAnswerDirs(problemDir, MODEL_ANSWERS_DIRNAME);\n}\n\n/**\n * Find failing model answer directories under `<problemDir>/model_answers.fails/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findFailingModelAnswerDirs(problemDir: string): Promise<string[]> {\n return findAnswerDirs(problemDir, FAILING_MODEL_ANSWERS_DIRNAME);\n}\n\nasync function findAnswerDirs(problemDir: string, dirname: string): Promise<string[]> {\n const modelAnswersDir = path.join(problemDir, dirname);\n let entries;\n try {\n entries = await fs.readdir(modelAnswersDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw error;\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(modelAnswersDir, entry.name))\n .toSorted();\n}\n"],"mappings":"iKAGA,MAAa,EAAwB,gBACxB,EAAgC,sBAM7C,eAAsB,EAAoB,EAAuC,CAC/E,OAAO,EAAe,EAAY,CAAqB,CACzD,CAMA,eAAsB,EAA2B,EAAuC,CACtF,OAAO,EAAe,EAAY,CAA6B,CACjE,CAEA,eAAe,EAAe,EAAoB,EAAoC,CACpF,IAAM,EAAkBA,EAAAA,QAAK,KAAK,EAAY,CAAO,EACjD,EACJ,GAAI,CACF,EAAU,MAAMC,EAAAA,QAAG,QAAQ,EAAiB,CAAE,cAAe,EAAK,CAAC,CACrE,OAAS,EAAO,CACd,GAAK,EAAgC,OAAS,SAAU,MAAO,CAAC,EAChE,MAAM,CACR,CACA,OAAO,EACJ,OAAQ,GAAU,EAAM,YAAY,CAAC,CAAC,CACtC,IAAK,GAAUD,EAAAA,QAAK,KAAK,EAAiB,EAAM,IAAI,CAAC,CAAC,CACtD,SAAS,CACd"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as r,regenerator as n}from"../_virtual/_rollupPluginBabelHelpers.js";import t from"node:fs/promises";import e from"node:path";var o="model_answers",i="model_answers.fails";function u(r){return a.apply(this,arguments)}function a(){return(a=r(n().m(function r(t){return n().w(function(r){for(;;)if(0===r.n)return r.a(2,p(t,o))},r)}))).apply(this,arguments)}function s(r){return f.apply(this,arguments)}function f(){return(f=r(n().m(function r(t){return n().w(function(r){for(;;)if(0===r.n)return r.a(2,p(t,i))},r)}))).apply(this,arguments)}function p(r,n){return c.apply(this,arguments)}function c(){return(c=r(n().m(function r(o,i){var u,a,s;return n().w(function(r){for(;;)switch(r.p=r.n){case 0:return u=e.join(o,i),r.p=1,r.n=2,t.readdir(u,{withFileTypes:!0});case 2:a=r.v,r.n=5;break;case 3:if(r.p=3,"ENOENT"!==(s=r.v).code){r.n=4;break}return r.a(2,[]);case 4:throw s;case 5:return r.a(2,a.filter(function(r){return r.isDirectory()}).map(function(r){return e.join(u,r.name)}).toSorted())}},r,null,[[1,3]])}))).apply(this,arguments)}export{i as FAILING_MODEL_ANSWERS_DIRNAME,o as MODEL_ANSWERS_DIRNAME,s as findFailingModelAnswerDirs,u as findModelAnswerDirs}; | ||
| //# sourceMappingURL=findModelAnswerDirs.js.map | ||
| import e from"node:fs/promises";import t from"node:path";const n=`model_answers`,r=`model_answers.fails`;async function i(e){return o(e,n)}async function a(e){return o(e,r)}async function o(n,r){let i=t.join(n,r),a;try{a=await e.readdir(i,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}return a.filter(e=>e.isDirectory()).map(e=>t.join(i,e.name)).toSorted()}export{r as FAILING_MODEL_ANSWERS_DIRNAME,n as MODEL_ANSWERS_DIRNAME,a as findFailingModelAnswerDirs,i as findModelAnswerDirs}; | ||
| //# sourceMappingURL=findModelAnswerDirs.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"findModelAnswerDirs.js","sources":["../../src/helpers/findModelAnswerDirs.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport const MODEL_ANSWERS_DIRNAME = 'model_answers';\nexport const FAILING_MODEL_ANSWERS_DIRNAME = 'model_answers.fails';\n\n/**\n * Find model answer directories under `<problemDir>/model_answers/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findModelAnswerDirs(problemDir: string): Promise<string[]> {\n return findAnswerDirs(problemDir, MODEL_ANSWERS_DIRNAME);\n}\n\n/**\n * Find failing model answer directories under `<problemDir>/model_answers.fails/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findFailingModelAnswerDirs(problemDir: string): Promise<string[]> {\n return findAnswerDirs(problemDir, FAILING_MODEL_ANSWERS_DIRNAME);\n}\n\nasync function findAnswerDirs(problemDir: string, dirname: string): Promise<string[]> {\n const modelAnswersDir = path.join(problemDir, dirname);\n let entries;\n try {\n entries = await fs.readdir(modelAnswersDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw error;\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(modelAnswersDir, entry.name))\n .toSorted();\n}\n"],"names":["MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME","findModelAnswerDirs","_x","_findModelAnswerDirs","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","w","_context","n","a","findAnswerDirs","findFailingModelAnswerDirs","_x2","_findFailingModelAnswerDirs","_callee2","_context2","_x3","_x4","_findAnswerDirs","_callee3","dirname","modelAnswersDir","entries","_t","_context3","p","path","join","fs","readdir","withFileTypes","v","code","filter","entry","isDirectory","map","name","toSorted"],"mappings":"sJAGO,IAAMA,EAAwB,gBACxBC,EAAgC,sBAM7C,SAAsBC,EAAmBC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAIzC,SAAAH,IAFC,OAEDA,EAAAI,EAAAC,IAAAC,EAJO,SAAAC,EAAmCC,GAAkB,OAAAH,IAAAI,EAAA,SAAAC,GAAA,UAAA,IAAAA,EAAAC,EAAA,OAAAD,EAAAE,EAAA,EACnDC,EAAeL,EAAYZ,GAAsB,EAAAW,EAAA,KACzDN,MAAAC,KAAAC,UAAA,CAMD,SAAsBW,EAA0BC,GAAA,OAAAC,EAAAf,MAAAC,KAAAC,UAAA,CAE/C,SAAAa,IAAA,OAAAA,EAAAZ,EAAAC,IAAAC,EAFM,SAAAW,EAA0CT,GAAkB,OAAAH,IAAAI,EAAA,SAAAS,GAAA,UAAA,IAAAA,EAAAP,EAAA,OAAAO,EAAAN,EAAA,EAC1DC,EAAeL,EAAYX,GAA8B,EAAAoB,EAAA,KACjEhB,MAAAC,KAAAC,UAAA,CAAA,SAEcU,EAAcM,EAAAC,GAAA,OAAAC,EAAApB,MAAAC,KAAAC,UAAA,CAAA,SAAAkB,IAa5B,OAb4BA,EAAAjB,EAAAC,IAAAC,EAA7B,SAAAgB,EAA8Bd,EAAoBe,GAAe,IAAAC,EAAAC,EAAAC,EAAA,OAAArB,IAAAI,EAAA,SAAAkB,GAAA,cAAAA,EAAAC,EAAAD,EAAAhB,GAAA,KAAA,EACT,OAAhDa,EAAkBK,EAAKC,KAAKtB,EAAYe,GAAQI,EAAAC,EAAA,EAAAD,EAAAhB,EAAA,EAGpCoB,EAAGC,QAAQR,EAAiB,CAAES,eAAe,IAAO,KAAA,EAApER,EAAOE,EAAAO,EAAAP,EAAAhB,EAAA,EAAA,MAAA,KAAA,EAAA,GAAAgB,EAAAC,EAAA,EAEuC,YAFvCF,EAAAC,EAAAO,GAE8BC,KAAiB,CAAAR,EAAAhB,EAAA,EAAA,KAAA,CAAA,OAAAgB,EAAAf,EAAA,EAAS,IAAE,KAAA,EAAA,MAAAc,EAAA,KAAA,EAAA,OAAAC,EAAAf,EAAA,EAG5Da,EACJW,OAAO,SAACC,GAAK,OAAKA,EAAMC,aAAa,GACrCC,IAAI,SAACF,GAAK,OAAKR,EAAKC,KAAKN,EAAiBa,EAAMG,KAAK,GACrDC,YAAU,EAAAnB,EAAA,KAAA,CAAA,CAAA,EAAA,IAAA,KACdrB,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"findModelAnswerDirs.js","names":[],"sources":["../../src/helpers/findModelAnswerDirs.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport const MODEL_ANSWERS_DIRNAME = 'model_answers';\nexport const FAILING_MODEL_ANSWERS_DIRNAME = 'model_answers.fails';\n\n/**\n * Find model answer directories under `<problemDir>/model_answers/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findModelAnswerDirs(problemDir: string): Promise<string[]> {\n return findAnswerDirs(problemDir, MODEL_ANSWERS_DIRNAME);\n}\n\n/**\n * Find failing model answer directories under `<problemDir>/model_answers.fails/`.\n * Returns absolute paths sorted lexicographically.\n */\nexport async function findFailingModelAnswerDirs(problemDir: string): Promise<string[]> {\n return findAnswerDirs(problemDir, FAILING_MODEL_ANSWERS_DIRNAME);\n}\n\nasync function findAnswerDirs(problemDir: string, dirname: string): Promise<string[]> {\n const modelAnswersDir = path.join(problemDir, dirname);\n let entries;\n try {\n entries = await fs.readdir(modelAnswersDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw error;\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(modelAnswersDir, entry.name))\n .toSorted();\n}\n"],"mappings":"yDAGA,MAAa,EAAwB,gBACxB,EAAgC,sBAM7C,eAAsB,EAAoB,EAAuC,CAC/E,OAAO,EAAe,EAAY,CAAqB,CACzD,CAMA,eAAsB,EAA2B,EAAuC,CACtF,OAAO,EAAe,EAAY,CAA6B,CACjE,CAEA,eAAe,EAAe,EAAoB,EAAoC,CACpF,IAAM,EAAkB,EAAK,KAAK,EAAY,CAAO,EACjD,EACJ,GAAI,CACF,EAAU,MAAM,EAAG,QAAQ,EAAiB,CAAE,cAAe,EAAK,CAAC,CACrE,OAAS,EAAO,CACd,GAAK,EAAgC,OAAS,SAAU,MAAO,CAAC,EAChE,MAAM,CACR,CACA,OAAO,EACJ,OAAQ,GAAU,EAAM,YAAY,CAAC,CAAC,CACtC,IAAK,GAAU,EAAK,KAAK,EAAiB,EAAM,IAAI,CAAC,CAAC,CACtD,SAAS,CACd"} |
@@ -1,2 +0,19 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),n=require("node:fs"),r=require("node:path"),a=require("../types/decisionCode.cjs"),t=require("./findLanguageDefinitionByPath.cjs"),c=require("./removeCommentsInSourceCode.cjs");function o(){return(o=e.asyncToGenerator(e.regenerator().m(function o(i,s){var u,f,d,p,l,h,b,m,k,g,I,R,v,E,C,S,_,y,O,F,w,D,j,q,P,x,N,T,B,H,M,A,L,U,G,Q,V;return e.regenerator().w(function(o){for(;;)switch(o.p=o.n){case 0:return f=new Set,d=[],U=e.createForOfIteratorHelper,o.n=1,n.promises.readdir(i,{withFileTypes:!0,recursive:!0});case 1:p=U(o.v),o.p=2,p.s();case 3:if((l=p.n()).done){o.n=9;break}if((h=l.value).isFile()){o.n=4;break}return o.a(3,8);case 4:return b=r.relative(i,r.join(h.parentPath,h.name)),f.add(b),o.n=5,n.promises.readFile(r.join(h.parentPath,h.name),"utf8");case 5:if(m=o.v,!m.includes("�")){o.n=6;break}return o.a(3,8);case 6:if(k=t.findLanguageDefinitionByPath(h.name)){o.n=7;break}return o.a(3,8);case 7:d.push({path:h.name,data:k.grammer?c.removeCommentsInSourceCode(k.grammer,m):m});case 8:o.n=3;break;case 9:o.n=11;break;case 10:o.p=10,G=o.v,p.e(G);case 11:return o.p=11,p.f(),o.f(11);case 12:if(!s.requiredSubmissionFilePaths){o.n=13;break}if(g=s.requiredSubmissionFilePaths.filter(function(e){return!f.has(e)}).toSorted(),!(g.length>0)){o.n=13;break}return o.a(2,{decisionCode:a.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,feedbackMarkdown:"ファイルが不足しています。\n次のファイルを追加してから再度提出してください。\n\n".concat(g.map(function(e){return"- `".concat(e,"`")}).join("\n"),"\n")});case 13:I=[],R=0,v=d;case 14:if(!(R<v.length)){o.n=24;break}S=v[R],_=e.createForOfIteratorHelper(null!=(E=s.forbiddenRegExpsInCode)?E:[]);try{for(_.s();!(y=_.n()).done;){O=y.value,F=new RegExp(O,"g"),w=S.data.matchAll(F),D=e.createForOfIteratorHelper(w);try{for(D.s();!(j=D.n()).done;)q=j.value,I.push({pattern:F.toString(),path:S.path,match:q[0]})}catch(e){D.e(e)}finally{D.f()}}}catch(e){_.e(e)}finally{_.f()}P=e.createForOfIteratorHelper(null!=(C=s.forbiddenTextsInCode)?C:[]),o.p=15,P.s();case 16:if((x=P.n()).done){o.n=20;break}N=x.value,T=0;case 17:if(!(T<S.data.length)){o.n=19;break}if(-1!==(B=S.data.indexOf(N,T))){o.n=18;break}return o.a(3,19);case 18:I.push({pattern:N,path:S.path,match:N}),T=B+N.length,o.n=17;break;case 19:o.n=16;break;case 20:o.n=22;break;case 21:o.p=21,Q=o.v,P.e(Q);case 22:return o.p=22,P.f(),o.f(22);case 23:R++,o.n=14;break;case 24:if(!(I.length>0)){o.n=25;break}return o.a(2,{decisionCode:a.DecisionCode.FORBIDDEN_PATTERNS_IN_CODE_ERROR,feedbackMarkdown:"ソースコード中に禁止された文字列が含まれています。\nソースコードを修正してから再度提出してください。\n\n| ファイル | 禁止パターン | 文字列 |\n| -------- | ------------ | ------ |\n".concat(I.map(function(e){return"| `".concat(e.path,"` | `").concat(e.pattern,"` | `").concat(e.match,"` |")}).join("\n"),"\n")});case 25:H=[],M=e.createForOfIteratorHelper(null!=(u=s.requiredRegExpsInCode)?u:[]),o.p=26,L=e.regenerator().m(function n(){var r,a;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:r=A.value,a=new RegExp(r),d.some(function(e){return a.test(e.data)})||H.push(a.toString());case 1:return e.a(2)}},n)}),M.s();case 27:if((A=M.n()).done){o.n=29;break}return o.d(e.regeneratorValues(L()),28);case 28:o.n=27;break;case 29:o.n=31;break;case 30:o.p=30,V=o.v,M.e(V);case 31:return o.p=31,M.f(),o.f(31);case 32:if(!(H.length>0)){o.n=33;break}return o.a(2,{decisionCode:a.DecisionCode.REQUIRED_PATTERNS_IN_CODE_ERROR,feedbackMarkdown:"ソースコード中に必要な文字列が含まれていません。\nソースコードを修正してから再度提出してください。\n\n".concat(H.map(function(e){return"- `".concat(e,"`")}).join("\n"),"\n")});case 33:return o.a(2)}},o,null,[[26,30,31,32],[15,21,22,23],[2,10,11,12]])}))).apply(this,arguments)}exports.judgeByStaticAnalysis=function(e,n){return o.apply(this,arguments)}; | ||
| //# sourceMappingURL=judgeByStaticAnalysis.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("./removeCommentsInSourceCode.cjs"),n=require("../types/decisionCode.cjs"),r=require("./findLanguageDefinitionByPath.cjs");let i=require("node:path");i=e.__toESM(i,1);let a=require("node:fs");a=e.__toESM(a,1);async function o(e,o){let s=new Set,c=[];for(let n of await a.default.promises.readdir(e,{withFileTypes:!0,recursive:!0})){if(!n.isFile())continue;let o=i.default.relative(e,i.default.join(n.parentPath,n.name));s.add(o);let l=await a.default.promises.readFile(i.default.join(n.parentPath,n.name),`utf8`);if(l.includes(`�`))continue;let u=r.findLanguageDefinitionByPath(n.name);u&&c.push({path:n.name,data:u.grammer?t.removeCommentsInSourceCode(u.grammer,l):l})}if(o.requiredSubmissionFilePaths){let e=o.requiredSubmissionFilePaths.filter(e=>!s.has(e)).toSorted();if(e.length>0)return{decisionCode:n.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,feedbackMarkdown:`ファイルが不足しています。 | ||
| 次のファイルを追加してから再度提出してください。 | ||
| ${e.map(e=>`- \`${e}\``).join(` | ||
| `)} | ||
| `}}let l=[];for(let e of c){for(let t of o.forbiddenRegExpsInCode??[]){let n=new RegExp(t,`g`),r=e.data.matchAll(n);for(let t of r)l.push({pattern:n.toString(),path:e.path,match:t[0]})}for(let t of o.forbiddenTextsInCode??[]){let n=0;for(;n<e.data.length;){let r=e.data.indexOf(t,n);if(r===-1)break;l.push({pattern:t,path:e.path,match:t}),n=r+t.length}}}if(l.length>0)return{decisionCode:n.DecisionCode.FORBIDDEN_PATTERNS_IN_CODE_ERROR,feedbackMarkdown:`ソースコード中に禁止された文字列が含まれています。 | ||
| ソースコードを修正してから再度提出してください。 | ||
| | ファイル | 禁止パターン | 文字列 | | ||
| | -------- | ------------ | ------ | | ||
| ${l.map(e=>`| \`${e.path}\` | \`${e.pattern}\` | \`${e.match}\` |`).join(` | ||
| `)} | ||
| `};let u=[];for(let e of o.requiredRegExpsInCode??[]){let t=new RegExp(e);c.some(e=>t.test(e.data))||u.push(t.toString())}if(u.length>0)return{decisionCode:n.DecisionCode.REQUIRED_PATTERNS_IN_CODE_ERROR,feedbackMarkdown:`ソースコード中に必要な文字列が含まれていません。 | ||
| ソースコードを修正してから再度提出してください。 | ||
| ${u.map(e=>`- \`${e}\``).join(` | ||
| `)} | ||
| `}}exports.judgeByStaticAnalysis=o; | ||
| //# sourceMappingURL=judgeByStaticAnalysis.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"judgeByStaticAnalysis.cjs","sources":["../../src/helpers/judgeByStaticAnalysis.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nimport { findLanguageDefinitionByPath } from './findLanguageDefinitionByPath.js';\nimport { removeCommentsInSourceCode } from './removeCommentsInSourceCode.js';\n\nexport async function judgeByStaticAnalysis(\n cwd: string,\n problemMarkdownFrontMatterLike: Pick<\n ProblemMarkdownFrontMatter,\n 'forbiddenRegExpsInCode' | 'forbiddenTextsInCode' | 'requiredRegExpsInCode' | 'requiredSubmissionFilePaths'\n >\n): Promise<Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown'> | undefined> {\n const filePathSet = new Set<string>();\n const sourceCodeWithoutCommentFiles: { path: string; data: string }[] = [];\n\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true, recursive: true })) {\n if (!dirent.isFile()) continue;\n\n const relativePath = path.relative(cwd, path.join(dirent.parentPath, dirent.name));\n filePathSet.add(relativePath);\n\n const text = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n const isBinary = text.includes('\\uFFFD');\n if (isBinary) continue;\n\n const languageDefinition = findLanguageDefinitionByPath(dirent.name);\n if (!languageDefinition) continue;\n\n sourceCodeWithoutCommentFiles.push({\n path: dirent.name,\n data: languageDefinition.grammer ? removeCommentsInSourceCode(languageDefinition.grammer, text) : text,\n });\n }\n\n if (problemMarkdownFrontMatterLike.requiredSubmissionFilePaths) {\n const missingFilePaths = problemMarkdownFrontMatterLike.requiredSubmissionFilePaths\n .filter((p) => !filePathSet.has(p))\n .toSorted();\n\n if (missingFilePaths.length > 0) {\n return {\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n feedbackMarkdown: `ファイルが不足しています。\n次のファイルを追加してから再度提出してください。\n\n${missingFilePaths.map((p) => `- \\`${p}\\``).join('\\n')}\n`,\n };\n }\n }\n\n const forbiddenFounds: { pattern: string; path: string; match: string }[] = [];\n\n for (const file of sourceCodeWithoutCommentFiles) {\n for (const pattern of problemMarkdownFrontMatterLike.forbiddenRegExpsInCode ?? []) {\n const re = new RegExp(pattern, 'g');\n const mathces = file.data.matchAll(re);\n for (const match of mathces) forbiddenFounds.push({ pattern: re.toString(), path: file.path, match: match[0] });\n }\n for (const pattern of problemMarkdownFrontMatterLike.forbiddenTextsInCode ?? []) {\n let p = 0;\n while (p < file.data.length) {\n const index = file.data.indexOf(pattern, p);\n if (index === -1) break;\n forbiddenFounds.push({ pattern, path: file.path, match: pattern });\n p = index + pattern.length;\n }\n }\n }\n\n if (forbiddenFounds.length > 0) {\n return {\n decisionCode: DecisionCode.FORBIDDEN_PATTERNS_IN_CODE_ERROR,\n feedbackMarkdown: `ソースコード中に禁止された文字列が含まれています。\nソースコードを修正してから再度提出してください。\n\n| ファイル | 禁止パターン | 文字列 |\n| -------- | ------------ | ------ |\n${forbiddenFounds.map((f) => `| \\`${f.path}\\` | \\`${f.pattern}\\` | \\`${f.match}\\` |`).join('\\n')}\n`,\n };\n }\n\n const missingRequiredPatterns: string[] = [];\n\n for (const pattern of problemMarkdownFrontMatterLike.requiredRegExpsInCode ?? []) {\n const re = new RegExp(pattern);\n const isFound = sourceCodeWithoutCommentFiles.some((f) => re.test(f.data));\n if (!isFound) missingRequiredPatterns.push(re.toString());\n }\n\n if (missingRequiredPatterns.length > 0) {\n return {\n decisionCode: DecisionCode.REQUIRED_PATTERNS_IN_CODE_ERROR,\n feedbackMarkdown: `ソースコード中に必要な文字列が含まれていません。\nソースコードを修正してから再度提出してください。\n\n${missingRequiredPatterns.map((p) => `- \\`${p}\\``).join('\\n')}\n`,\n };\n }\n\n return;\n}\n"],"names":["_judgeByStaticAnalysis","_asyncToGenerator","_regenerator","m","_callee","cwd","problemMarkdownFrontMatterLike","_problemMarkdownFront3","filePathSet","sourceCodeWithoutCommentFiles","_iterator","_step","dirent","relativePath","text","languageDefinition","missingFilePaths","forbiddenFounds","_i","_sourceCodeWithoutCom","_problemMarkdownFront","_problemMarkdownFront2","file","_iterator2","_step2","pattern","re","mathces","_iterator4","_step4","match","_iterator3","_step3","_pattern","p","index","missingRequiredPatterns","_iterator5","_step5","_loop","_t","_t2","_t3","_t4","w","_context2","n","Set","_createForOfIteratorHelper","fs","promises","readdir","withFileTypes","recursive","v","s","done","value","isFile","a","path","relative","join","parentPath","name","add","readFile","includes","findLanguageDefinitionByPath","push","data","grammer","removeCommentsInSourceCode","e","f","requiredSubmissionFilePaths","filter","has","toSorted","length","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","feedbackMarkdown","concat","map","forbiddenRegExpsInCode","RegExp","matchAll","toString","err","forbiddenTextsInCode","indexOf","FORBIDDEN_PATTERNS_IN_CODE_ERROR","requiredRegExpsInCode","_context","some","test","d","_regeneratorValues","REQUIRED_PATTERNS_IN_CODE_ERROR","apply","this","arguments","_x","_x2"],"mappings":"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"} | ||
| {"version":3,"file":"judgeByStaticAnalysis.cjs","names":["fs","path","findLanguageDefinitionByPath","removeCommentsInSourceCode","DecisionCode"],"sources":["../../src/helpers/judgeByStaticAnalysis.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nimport { findLanguageDefinitionByPath } from './findLanguageDefinitionByPath.js';\nimport { removeCommentsInSourceCode } from './removeCommentsInSourceCode.js';\n\nexport async function judgeByStaticAnalysis(\n cwd: string,\n problemMarkdownFrontMatterLike: Pick<\n ProblemMarkdownFrontMatter,\n 'forbiddenRegExpsInCode' | 'forbiddenTextsInCode' | 'requiredRegExpsInCode' | 'requiredSubmissionFilePaths'\n >\n): Promise<Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown'> | undefined> {\n const filePathSet = new Set<string>();\n const sourceCodeWithoutCommentFiles: { path: string; data: string }[] = [];\n\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true, recursive: true })) {\n if (!dirent.isFile()) continue;\n\n const relativePath = path.relative(cwd, path.join(dirent.parentPath, dirent.name));\n filePathSet.add(relativePath);\n\n const text = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n const isBinary = text.includes('\\uFFFD');\n if (isBinary) continue;\n\n const languageDefinition = findLanguageDefinitionByPath(dirent.name);\n if (!languageDefinition) continue;\n\n sourceCodeWithoutCommentFiles.push({\n path: dirent.name,\n data: languageDefinition.grammer ? removeCommentsInSourceCode(languageDefinition.grammer, text) : text,\n });\n }\n\n if (problemMarkdownFrontMatterLike.requiredSubmissionFilePaths) {\n const missingFilePaths = problemMarkdownFrontMatterLike.requiredSubmissionFilePaths\n .filter((p) => !filePathSet.has(p))\n .toSorted();\n\n if (missingFilePaths.length > 0) {\n return {\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n feedbackMarkdown: `ファイルが不足しています。\n次のファイルを追加してから再度提出してください。\n\n${missingFilePaths.map((p) => `- \\`${p}\\``).join('\\n')}\n`,\n };\n }\n }\n\n const forbiddenFounds: { pattern: string; path: string; match: string }[] = [];\n\n for (const file of sourceCodeWithoutCommentFiles) {\n for (const pattern of problemMarkdownFrontMatterLike.forbiddenRegExpsInCode ?? []) {\n const re = new RegExp(pattern, 'g');\n const mathces = file.data.matchAll(re);\n for (const match of mathces) forbiddenFounds.push({ pattern: re.toString(), path: file.path, match: match[0] });\n }\n for (const pattern of problemMarkdownFrontMatterLike.forbiddenTextsInCode ?? []) {\n let p = 0;\n while (p < file.data.length) {\n const index = file.data.indexOf(pattern, p);\n if (index === -1) break;\n forbiddenFounds.push({ pattern, path: file.path, match: pattern });\n p = index + pattern.length;\n }\n }\n }\n\n if (forbiddenFounds.length > 0) {\n return {\n decisionCode: DecisionCode.FORBIDDEN_PATTERNS_IN_CODE_ERROR,\n feedbackMarkdown: `ソースコード中に禁止された文字列が含まれています。\nソースコードを修正してから再度提出してください。\n\n| ファイル | 禁止パターン | 文字列 |\n| -------- | ------------ | ------ |\n${forbiddenFounds.map((f) => `| \\`${f.path}\\` | \\`${f.pattern}\\` | \\`${f.match}\\` |`).join('\\n')}\n`,\n };\n }\n\n const missingRequiredPatterns: string[] = [];\n\n for (const pattern of problemMarkdownFrontMatterLike.requiredRegExpsInCode ?? []) {\n const re = new RegExp(pattern);\n const isFound = sourceCodeWithoutCommentFiles.some((f) => re.test(f.data));\n if (!isFound) missingRequiredPatterns.push(re.toString());\n }\n\n if (missingRequiredPatterns.length > 0) {\n return {\n decisionCode: DecisionCode.REQUIRED_PATTERNS_IN_CODE_ERROR,\n feedbackMarkdown: `ソースコード中に必要な文字列が含まれていません。\nソースコードを修正してから再度提出してください。\n\n${missingRequiredPatterns.map((p) => `- \\`${p}\\``).join('\\n')}\n`,\n };\n }\n\n return;\n}\n"],"mappings":"6RAUA,eAAsB,EACpB,EACA,EAIgF,CAChF,IAAM,EAAc,IAAI,IAClB,EAAkE,CAAC,EAEzE,IAAK,IAAM,KAAU,MAAMA,EAAAA,QAAG,SAAS,QAAQ,EAAK,CAAE,cAAe,GAAM,UAAW,EAAK,CAAC,EAAG,CAC7F,GAAI,CAAC,EAAO,OAAO,EAAG,SAEtB,IAAM,EAAeC,EAAAA,QAAK,SAAS,EAAKA,EAAAA,QAAK,KAAK,EAAO,WAAY,EAAO,IAAI,CAAC,EACjF,EAAY,IAAI,CAAY,EAE5B,IAAM,EAAO,MAAMD,EAAAA,QAAG,SAAS,SAASC,EAAAA,QAAK,KAAK,EAAO,WAAY,EAAO,IAAI,EAAG,MAAM,EAEzF,GADiB,EAAK,SAAS,GACpB,EAAG,SAEd,IAAM,EAAqBC,EAAAA,6BAA6B,EAAO,IAAI,EAC9D,GAEL,EAA8B,KAAK,CACjC,KAAM,EAAO,KACb,KAAM,EAAmB,QAAUC,EAAAA,2BAA2B,EAAmB,QAAS,CAAI,EAAI,CACpG,CAAC,CACH,CAEA,GAAI,EAA+B,4BAA6B,CAC9D,IAAM,EAAmB,EAA+B,4BACrD,OAAQ,GAAM,CAAC,EAAY,IAAI,CAAC,CAAC,CAAC,CAClC,SAAS,EAEZ,GAAI,EAAiB,OAAS,EAC5B,MAAO,CACL,aAAcC,EAAAA,aAAa,uCAC3B,iBAAkB;;;EAGxB,EAAiB,IAAK,GAAM,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK;CAAI,EAAE;CAEjD,CAEJ,CAEA,IAAM,EAAsE,CAAC,EAE7E,IAAK,IAAM,KAAQ,EAA+B,CAChD,IAAK,IAAM,KAAW,EAA+B,wBAA0B,CAAC,EAAG,CACjF,IAAM,EAAK,IAAI,OAAO,EAAS,GAAG,EAC5B,EAAU,EAAK,KAAK,SAAS,CAAE,EACrC,IAAK,IAAM,KAAS,EAAS,EAAgB,KAAK,CAAE,QAAS,EAAG,SAAS,EAAG,KAAM,EAAK,KAAM,MAAO,EAAM,EAAG,CAAC,CAChH,CACA,IAAK,IAAM,KAAW,EAA+B,sBAAwB,CAAC,EAAG,CAC/E,IAAI,EAAI,EACR,KAAO,EAAI,EAAK,KAAK,QAAQ,CAC3B,IAAM,EAAQ,EAAK,KAAK,QAAQ,EAAS,CAAC,EAC1C,GAAI,IAAU,GAAI,MAClB,EAAgB,KAAK,CAAE,UAAS,KAAM,EAAK,KAAM,MAAO,CAAQ,CAAC,EACjE,EAAI,EAAQ,EAAQ,MACtB,CACF,CACF,CAEA,GAAI,EAAgB,OAAS,EAC3B,MAAO,CACL,aAAcA,EAAAA,aAAa,iCAC3B,iBAAkB;;;;;EAKtB,EAAgB,IAAK,GAAM,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,SAAS,EAAE,MAAM,KAAK,CAAC,CAAC,KAAK;CAAI,EAAE;CAE7F,EAGF,IAAM,EAAoC,CAAC,EAE3C,IAAK,IAAM,KAAW,EAA+B,uBAAyB,CAAC,EAAG,CAChF,IAAM,EAAK,IAAI,OAAO,CAAO,EACb,EAA8B,KAAM,GAAM,EAAG,KAAK,EAAE,IAAI,CAC7D,GAAG,EAAwB,KAAK,EAAG,SAAS,CAAC,CAC1D,CAEA,GAAI,EAAwB,OAAS,EACnC,MAAO,CACL,aAAcA,EAAAA,aAAa,gCAC3B,iBAAkB;;;EAGtB,EAAwB,IAAK,GAAM,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK;CAAI,EAAE;CAE1D,CAIJ"} |
@@ -1,2 +0,19 @@ | ||
| import{asyncToGenerator as e,regenerator as n,regeneratorValues as a,createForOfIteratorHelper as r}from"../_virtual/_rollupPluginBabelHelpers.js";import t from"node:fs";import o from"node:path";import{DecisionCode as s}from"../types/decisionCode.js";import{findLanguageDefinitionByPath as c}from"./findLanguageDefinitionByPath.js";import{removeCommentsInSourceCode as i}from"./removeCommentsInSourceCode.js";function u(e,n){return f.apply(this,arguments)}function f(){return(f=e(n().m(function e(u,f){var p,d,l,m,h,b,k,g,R,E,v,I,S,_,w,C,y,j,O,F,P,x,D,N,T,M,B,q,A,U,G,H,L,Q,V,z,J;return n().w(function(e){for(;;)switch(e.p=e.n){case 0:return d=new Set,l=[],Q=r,e.n=1,t.promises.readdir(u,{withFileTypes:!0,recursive:!0});case 1:m=Q(e.v),e.p=2,m.s();case 3:if((h=m.n()).done){e.n=9;break}if((b=h.value).isFile()){e.n=4;break}return e.a(3,8);case 4:return k=o.relative(u,o.join(b.parentPath,b.name)),d.add(k),e.n=5,t.promises.readFile(o.join(b.parentPath,b.name),"utf8");case 5:if(g=e.v,!g.includes("�")){e.n=6;break}return e.a(3,8);case 6:if(R=c(b.name)){e.n=7;break}return e.a(3,8);case 7:l.push({path:b.name,data:R.grammer?i(R.grammer,g):g});case 8:e.n=3;break;case 9:e.n=11;break;case 10:e.p=10,V=e.v,m.e(V);case 11:return e.p=11,m.f(),e.f(11);case 12:if(!f.requiredSubmissionFilePaths){e.n=13;break}if(E=f.requiredSubmissionFilePaths.filter(function(e){return!d.has(e)}).toSorted(),!(E.length>0)){e.n=13;break}return e.a(2,{decisionCode:s.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,feedbackMarkdown:"ファイルが不足しています。\n次のファイルを追加してから再度提出してください。\n\n".concat(E.map(function(e){return"- `".concat(e,"`")}).join("\n"),"\n")});case 13:v=[],I=0,S=l;case 14:if(!(I<S.length)){e.n=24;break}C=S[I],y=r(null!=(_=f.forbiddenRegExpsInCode)?_:[]);try{for(y.s();!(j=y.n()).done;){O=j.value,F=new RegExp(O,"g"),P=C.data.matchAll(F),x=r(P);try{for(x.s();!(D=x.n()).done;)N=D.value,v.push({pattern:F.toString(),path:C.path,match:N[0]})}catch(e){x.e(e)}finally{x.f()}}}catch(e){y.e(e)}finally{y.f()}T=r(null!=(w=f.forbiddenTextsInCode)?w:[]),e.p=15,T.s();case 16:if((M=T.n()).done){e.n=20;break}B=M.value,q=0;case 17:if(!(q<C.data.length)){e.n=19;break}if(-1!==(A=C.data.indexOf(B,q))){e.n=18;break}return e.a(3,19);case 18:v.push({pattern:B,path:C.path,match:B}),q=A+B.length,e.n=17;break;case 19:e.n=16;break;case 20:e.n=22;break;case 21:e.p=21,z=e.v,T.e(z);case 22:return e.p=22,T.f(),e.f(22);case 23:I++,e.n=14;break;case 24:if(!(v.length>0)){e.n=25;break}return e.a(2,{decisionCode:s.FORBIDDEN_PATTERNS_IN_CODE_ERROR,feedbackMarkdown:"ソースコード中に禁止された文字列が含まれています。\nソースコードを修正してから再度提出してください。\n\n| ファイル | 禁止パターン | 文字列 |\n| -------- | ------------ | ------ |\n".concat(v.map(function(e){return"| `".concat(e.path,"` | `").concat(e.pattern,"` | `").concat(e.match,"` |")}).join("\n"),"\n")});case 25:U=[],G=r(null!=(p=f.requiredRegExpsInCode)?p:[]),e.p=26,L=n().m(function e(){var a,r;return n().w(function(e){for(;;)switch(e.n){case 0:a=H.value,r=new RegExp(a),l.some(function(e){return r.test(e.data)})||U.push(r.toString());case 1:return e.a(2)}},e)}),G.s();case 27:if((H=G.n()).done){e.n=29;break}return e.d(a(L()),28);case 28:e.n=27;break;case 29:e.n=31;break;case 30:e.p=30,J=e.v,G.e(J);case 31:return e.p=31,G.f(),e.f(31);case 32:if(!(U.length>0)){e.n=33;break}return e.a(2,{decisionCode:s.REQUIRED_PATTERNS_IN_CODE_ERROR,feedbackMarkdown:"ソースコード中に必要な文字列が含まれていません。\nソースコードを修正してから再度提出してください。\n\n".concat(U.map(function(e){return"- `".concat(e,"`")}).join("\n"),"\n")});case 33:return e.a(2)}},e,null,[[26,30,31,32],[15,21,22,23],[2,10,11,12]])}))).apply(this,arguments)}export{u as judgeByStaticAnalysis}; | ||
| //# sourceMappingURL=judgeByStaticAnalysis.js.map | ||
| import{removeCommentsInSourceCode as e}from"./removeCommentsInSourceCode.js";import{DecisionCode as t}from"../types/decisionCode.js";import{findLanguageDefinitionByPath as n}from"./findLanguageDefinitionByPath.js";import r from"node:path";import i from"node:fs";async function a(a,o){let s=new Set,c=[];for(let t of await i.promises.readdir(a,{withFileTypes:!0,recursive:!0})){if(!t.isFile())continue;let o=r.relative(a,r.join(t.parentPath,t.name));s.add(o);let l=await i.promises.readFile(r.join(t.parentPath,t.name),`utf8`);if(l.includes(`�`))continue;let u=n(t.name);u&&c.push({path:t.name,data:u.grammer?e(u.grammer,l):l})}if(o.requiredSubmissionFilePaths){let e=o.requiredSubmissionFilePaths.filter(e=>!s.has(e)).toSorted();if(e.length>0)return{decisionCode:t.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,feedbackMarkdown:`ファイルが不足しています。 | ||
| 次のファイルを追加してから再度提出してください。 | ||
| ${e.map(e=>`- \`${e}\``).join(` | ||
| `)} | ||
| `}}let l=[];for(let e of c){for(let t of o.forbiddenRegExpsInCode??[]){let n=new RegExp(t,`g`),r=e.data.matchAll(n);for(let t of r)l.push({pattern:n.toString(),path:e.path,match:t[0]})}for(let t of o.forbiddenTextsInCode??[]){let n=0;for(;n<e.data.length;){let r=e.data.indexOf(t,n);if(r===-1)break;l.push({pattern:t,path:e.path,match:t}),n=r+t.length}}}if(l.length>0)return{decisionCode:t.FORBIDDEN_PATTERNS_IN_CODE_ERROR,feedbackMarkdown:`ソースコード中に禁止された文字列が含まれています。 | ||
| ソースコードを修正してから再度提出してください。 | ||
| | ファイル | 禁止パターン | 文字列 | | ||
| | -------- | ------------ | ------ | | ||
| ${l.map(e=>`| \`${e.path}\` | \`${e.pattern}\` | \`${e.match}\` |`).join(` | ||
| `)} | ||
| `};let u=[];for(let e of o.requiredRegExpsInCode??[]){let t=new RegExp(e);c.some(e=>t.test(e.data))||u.push(t.toString())}if(u.length>0)return{decisionCode:t.REQUIRED_PATTERNS_IN_CODE_ERROR,feedbackMarkdown:`ソースコード中に必要な文字列が含まれていません。 | ||
| ソースコードを修正してから再度提出してください。 | ||
| ${u.map(e=>`- \`${e}\``).join(` | ||
| `)} | ||
| `}}export{a as judgeByStaticAnalysis}; | ||
| //# sourceMappingURL=judgeByStaticAnalysis.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"judgeByStaticAnalysis.js","sources":["../../src/helpers/judgeByStaticAnalysis.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nimport { findLanguageDefinitionByPath } from './findLanguageDefinitionByPath.js';\nimport { removeCommentsInSourceCode } from './removeCommentsInSourceCode.js';\n\nexport async function judgeByStaticAnalysis(\n cwd: string,\n problemMarkdownFrontMatterLike: Pick<\n ProblemMarkdownFrontMatter,\n 'forbiddenRegExpsInCode' | 'forbiddenTextsInCode' | 'requiredRegExpsInCode' | 'requiredSubmissionFilePaths'\n >\n): Promise<Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown'> | undefined> {\n const filePathSet = new Set<string>();\n const sourceCodeWithoutCommentFiles: { path: string; data: string }[] = [];\n\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true, recursive: true })) {\n if (!dirent.isFile()) continue;\n\n const relativePath = path.relative(cwd, path.join(dirent.parentPath, dirent.name));\n filePathSet.add(relativePath);\n\n const text = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n const isBinary = text.includes('\\uFFFD');\n if (isBinary) continue;\n\n const languageDefinition = findLanguageDefinitionByPath(dirent.name);\n if (!languageDefinition) continue;\n\n sourceCodeWithoutCommentFiles.push({\n path: dirent.name,\n data: languageDefinition.grammer ? removeCommentsInSourceCode(languageDefinition.grammer, text) : text,\n });\n }\n\n if (problemMarkdownFrontMatterLike.requiredSubmissionFilePaths) {\n const missingFilePaths = problemMarkdownFrontMatterLike.requiredSubmissionFilePaths\n .filter((p) => !filePathSet.has(p))\n .toSorted();\n\n if (missingFilePaths.length > 0) {\n return {\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n feedbackMarkdown: `ファイルが不足しています。\n次のファイルを追加してから再度提出してください。\n\n${missingFilePaths.map((p) => `- \\`${p}\\``).join('\\n')}\n`,\n };\n }\n }\n\n const forbiddenFounds: { pattern: string; path: string; match: string }[] = [];\n\n for (const file of sourceCodeWithoutCommentFiles) {\n for (const pattern of problemMarkdownFrontMatterLike.forbiddenRegExpsInCode ?? []) {\n const re = new RegExp(pattern, 'g');\n const mathces = file.data.matchAll(re);\n for (const match of mathces) forbiddenFounds.push({ pattern: re.toString(), path: file.path, match: match[0] });\n }\n for (const pattern of problemMarkdownFrontMatterLike.forbiddenTextsInCode ?? []) {\n let p = 0;\n while (p < file.data.length) {\n const index = file.data.indexOf(pattern, p);\n if (index === -1) break;\n forbiddenFounds.push({ pattern, path: file.path, match: pattern });\n p = index + pattern.length;\n }\n }\n }\n\n if (forbiddenFounds.length > 0) {\n return {\n decisionCode: DecisionCode.FORBIDDEN_PATTERNS_IN_CODE_ERROR,\n feedbackMarkdown: `ソースコード中に禁止された文字列が含まれています。\nソースコードを修正してから再度提出してください。\n\n| ファイル | 禁止パターン | 文字列 |\n| -------- | ------------ | ------ |\n${forbiddenFounds.map((f) => `| \\`${f.path}\\` | \\`${f.pattern}\\` | \\`${f.match}\\` |`).join('\\n')}\n`,\n };\n }\n\n const missingRequiredPatterns: string[] = [];\n\n for (const pattern of problemMarkdownFrontMatterLike.requiredRegExpsInCode ?? []) {\n const re = new RegExp(pattern);\n const isFound = sourceCodeWithoutCommentFiles.some((f) => re.test(f.data));\n if (!isFound) missingRequiredPatterns.push(re.toString());\n }\n\n if (missingRequiredPatterns.length > 0) {\n return {\n decisionCode: DecisionCode.REQUIRED_PATTERNS_IN_CODE_ERROR,\n feedbackMarkdown: `ソースコード中に必要な文字列が含まれていません。\nソースコードを修正してから再度提出してください。\n\n${missingRequiredPatterns.map((p) => `- \\`${p}\\``).join('\\n')}\n`,\n };\n }\n\n return;\n}\n"],"names":["judgeByStaticAnalysis","_x","_x2","_judgeByStaticAnalysis","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","cwd","problemMarkdownFrontMatterLike","_problemMarkdownFront3","filePathSet","sourceCodeWithoutCommentFiles","_iterator","_step","dirent","relativePath","text","languageDefinition","missingFilePaths","forbiddenFounds","_i","_sourceCodeWithoutCom","_problemMarkdownFront","_problemMarkdownFront2","file","_iterator2","_step2","pattern","re","mathces","_iterator4","_step4","match","_iterator3","_step3","_pattern","p","index","missingRequiredPatterns","_iterator5","_step5","_loop","_t","_t2","_t3","_t4","w","_context2","n","Set","_createForOfIteratorHelper","fs","promises","readdir","withFileTypes","recursive","v","s","done","value","isFile","a","path","relative","join","parentPath","name","add","readFile","includes","findLanguageDefinitionByPath","push","data","grammer","removeCommentsInSourceCode","e","f","requiredSubmissionFilePaths","filter","has","toSorted","length","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","feedbackMarkdown","concat","map","forbiddenRegExpsInCode","RegExp","matchAll","toString","err","forbiddenTextsInCode","indexOf","FORBIDDEN_PATTERNS_IN_CODE_ERROR","requiredRegExpsInCode","_context","some","test","d","_regeneratorValues","REQUIRED_PATTERNS_IN_CODE_ERROR"],"mappings":"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"} | ||
| {"version":3,"file":"judgeByStaticAnalysis.js","names":[],"sources":["../../src/helpers/judgeByStaticAnalysis.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nimport { findLanguageDefinitionByPath } from './findLanguageDefinitionByPath.js';\nimport { removeCommentsInSourceCode } from './removeCommentsInSourceCode.js';\n\nexport async function judgeByStaticAnalysis(\n cwd: string,\n problemMarkdownFrontMatterLike: Pick<\n ProblemMarkdownFrontMatter,\n 'forbiddenRegExpsInCode' | 'forbiddenTextsInCode' | 'requiredRegExpsInCode' | 'requiredSubmissionFilePaths'\n >\n): Promise<Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown'> | undefined> {\n const filePathSet = new Set<string>();\n const sourceCodeWithoutCommentFiles: { path: string; data: string }[] = [];\n\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true, recursive: true })) {\n if (!dirent.isFile()) continue;\n\n const relativePath = path.relative(cwd, path.join(dirent.parentPath, dirent.name));\n filePathSet.add(relativePath);\n\n const text = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n const isBinary = text.includes('\\uFFFD');\n if (isBinary) continue;\n\n const languageDefinition = findLanguageDefinitionByPath(dirent.name);\n if (!languageDefinition) continue;\n\n sourceCodeWithoutCommentFiles.push({\n path: dirent.name,\n data: languageDefinition.grammer ? removeCommentsInSourceCode(languageDefinition.grammer, text) : text,\n });\n }\n\n if (problemMarkdownFrontMatterLike.requiredSubmissionFilePaths) {\n const missingFilePaths = problemMarkdownFrontMatterLike.requiredSubmissionFilePaths\n .filter((p) => !filePathSet.has(p))\n .toSorted();\n\n if (missingFilePaths.length > 0) {\n return {\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n feedbackMarkdown: `ファイルが不足しています。\n次のファイルを追加してから再度提出してください。\n\n${missingFilePaths.map((p) => `- \\`${p}\\``).join('\\n')}\n`,\n };\n }\n }\n\n const forbiddenFounds: { pattern: string; path: string; match: string }[] = [];\n\n for (const file of sourceCodeWithoutCommentFiles) {\n for (const pattern of problemMarkdownFrontMatterLike.forbiddenRegExpsInCode ?? []) {\n const re = new RegExp(pattern, 'g');\n const mathces = file.data.matchAll(re);\n for (const match of mathces) forbiddenFounds.push({ pattern: re.toString(), path: file.path, match: match[0] });\n }\n for (const pattern of problemMarkdownFrontMatterLike.forbiddenTextsInCode ?? []) {\n let p = 0;\n while (p < file.data.length) {\n const index = file.data.indexOf(pattern, p);\n if (index === -1) break;\n forbiddenFounds.push({ pattern, path: file.path, match: pattern });\n p = index + pattern.length;\n }\n }\n }\n\n if (forbiddenFounds.length > 0) {\n return {\n decisionCode: DecisionCode.FORBIDDEN_PATTERNS_IN_CODE_ERROR,\n feedbackMarkdown: `ソースコード中に禁止された文字列が含まれています。\nソースコードを修正してから再度提出してください。\n\n| ファイル | 禁止パターン | 文字列 |\n| -------- | ------------ | ------ |\n${forbiddenFounds.map((f) => `| \\`${f.path}\\` | \\`${f.pattern}\\` | \\`${f.match}\\` |`).join('\\n')}\n`,\n };\n }\n\n const missingRequiredPatterns: string[] = [];\n\n for (const pattern of problemMarkdownFrontMatterLike.requiredRegExpsInCode ?? []) {\n const re = new RegExp(pattern);\n const isFound = sourceCodeWithoutCommentFiles.some((f) => re.test(f.data));\n if (!isFound) missingRequiredPatterns.push(re.toString());\n }\n\n if (missingRequiredPatterns.length > 0) {\n return {\n decisionCode: DecisionCode.REQUIRED_PATTERNS_IN_CODE_ERROR,\n feedbackMarkdown: `ソースコード中に必要な文字列が含まれていません。\nソースコードを修正してから再度提出してください。\n\n${missingRequiredPatterns.map((p) => `- \\`${p}\\``).join('\\n')}\n`,\n };\n }\n\n return;\n}\n"],"mappings":"sQAUA,eAAsB,EACpB,EACA,EAIgF,CAChF,IAAM,EAAc,IAAI,IAClB,EAAkE,CAAC,EAEzE,IAAK,IAAM,KAAU,MAAM,EAAG,SAAS,QAAQ,EAAK,CAAE,cAAe,GAAM,UAAW,EAAK,CAAC,EAAG,CAC7F,GAAI,CAAC,EAAO,OAAO,EAAG,SAEtB,IAAM,EAAe,EAAK,SAAS,EAAK,EAAK,KAAK,EAAO,WAAY,EAAO,IAAI,CAAC,EACjF,EAAY,IAAI,CAAY,EAE5B,IAAM,EAAO,MAAM,EAAG,SAAS,SAAS,EAAK,KAAK,EAAO,WAAY,EAAO,IAAI,EAAG,MAAM,EAEzF,GADiB,EAAK,SAAS,GACpB,EAAG,SAEd,IAAM,EAAqB,EAA6B,EAAO,IAAI,EAC9D,GAEL,EAA8B,KAAK,CACjC,KAAM,EAAO,KACb,KAAM,EAAmB,QAAU,EAA2B,EAAmB,QAAS,CAAI,EAAI,CACpG,CAAC,CACH,CAEA,GAAI,EAA+B,4BAA6B,CAC9D,IAAM,EAAmB,EAA+B,4BACrD,OAAQ,GAAM,CAAC,EAAY,IAAI,CAAC,CAAC,CAAC,CAClC,SAAS,EAEZ,GAAI,EAAiB,OAAS,EAC5B,MAAO,CACL,aAAc,EAAa,uCAC3B,iBAAkB;;;EAGxB,EAAiB,IAAK,GAAM,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK;CAAI,EAAE;CAEjD,CAEJ,CAEA,IAAM,EAAsE,CAAC,EAE7E,IAAK,IAAM,KAAQ,EAA+B,CAChD,IAAK,IAAM,KAAW,EAA+B,wBAA0B,CAAC,EAAG,CACjF,IAAM,EAAK,IAAI,OAAO,EAAS,GAAG,EAC5B,EAAU,EAAK,KAAK,SAAS,CAAE,EACrC,IAAK,IAAM,KAAS,EAAS,EAAgB,KAAK,CAAE,QAAS,EAAG,SAAS,EAAG,KAAM,EAAK,KAAM,MAAO,EAAM,EAAG,CAAC,CAChH,CACA,IAAK,IAAM,KAAW,EAA+B,sBAAwB,CAAC,EAAG,CAC/E,IAAI,EAAI,EACR,KAAO,EAAI,EAAK,KAAK,QAAQ,CAC3B,IAAM,EAAQ,EAAK,KAAK,QAAQ,EAAS,CAAC,EAC1C,GAAI,IAAU,GAAI,MAClB,EAAgB,KAAK,CAAE,UAAS,KAAM,EAAK,KAAM,MAAO,CAAQ,CAAC,EACjE,EAAI,EAAQ,EAAQ,MACtB,CACF,CACF,CAEA,GAAI,EAAgB,OAAS,EAC3B,MAAO,CACL,aAAc,EAAa,iCAC3B,iBAAkB;;;;;EAKtB,EAAgB,IAAK,GAAM,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,SAAS,EAAE,MAAM,KAAK,CAAC,CAAC,KAAK;CAAI,EAAE;CAE7F,EAGF,IAAM,EAAoC,CAAC,EAE3C,IAAK,IAAM,KAAW,EAA+B,uBAAyB,CAAC,EAAG,CAChF,IAAM,EAAK,IAAI,OAAO,CAAO,EACb,EAA8B,KAAM,GAAM,EAAG,KAAK,EAAE,IAAI,CAC7D,GAAG,EAAwB,KAAK,EAAG,SAAS,CAAC,CAC1D,CAEA,GAAI,EAAwB,OAAS,EACnC,MAAO,CACL,aAAc,EAAa,gCAC3B,iBAAkB;;;EAGtB,EAAwB,IAAK,GAAM,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK;CAAI,EAAE;CAE1D,CAIJ"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";exports.parseArgs=function(r){var a=r[2]||void 0,s=r[3];try{return{cwd:a,params:s?JSON.parse(s):{}}}catch(r){throw new Error("bad params argument",{cause:r})}}; | ||
| //# sourceMappingURL=parseArgs.cjs.map | ||
| "use strict";function e(e){let t=e[2]||void 0,n=e[3];try{return{cwd:t,params:n?JSON.parse(n):{}}}catch(e){throw Error(`bad params argument`,{cause:e})}}exports.parseArgs=e; | ||
| //# sourceMappingURL=parseArgs.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"parseArgs.cjs","sources":["../../src/helpers/parseArgs.ts"],"sourcesContent":["/**\n * Parse command line arguments in `judge.ts` or `debug.ts`.\n *\n * `cwd` is optional: when omitted, presets that support it may fall back to\n * judging against model answers under `<problemDir>/model_answers/*`.\n */\nexport function parseArgs(argv: readonly string[]): { cwd: string | undefined; params: unknown } {\n const cwd = argv[2] || undefined;\n const paramsJson = argv[3];\n\n try {\n return { cwd, params: paramsJson ? JSON.parse(paramsJson) : {} };\n } catch (error) {\n throw new Error('bad params argument', { cause: error });\n }\n}\n"],"names":["argv","cwd","undefined","paramsJson","params","JSON","parse","error","Error","cause"],"mappings":"+BAMO,SAAmBA,GACxB,IAAMC,EAAMD,EAAK,SAAME,EACjBC,EAAaH,EAAK,GAExB,IACE,MAAO,CAAEC,IAAAA,EAAKG,OAAQD,EAAaE,KAAKC,MAAMH,GAAc,CAAA,EAC9D,CAAE,MAAOI,GACP,MAAM,IAAIC,MAAM,sBAAuB,CAAEC,MAAOF,GAClD,CACF"} | ||
| {"version":3,"file":"parseArgs.cjs","names":[],"sources":["../../src/helpers/parseArgs.ts"],"sourcesContent":["/**\n * Parse command line arguments in `judge.ts` or `debug.ts`.\n *\n * `cwd` is optional: when omitted, presets that support it may fall back to\n * judging against model answers under `<problemDir>/model_answers/*`.\n */\nexport function parseArgs(argv: readonly string[]): { cwd: string | undefined; params: unknown } {\n const cwd = argv[2] || undefined;\n const paramsJson = argv[3];\n\n try {\n return { cwd, params: paramsJson ? JSON.parse(paramsJson) : {} };\n } catch (error) {\n throw new Error('bad params argument', { cause: error });\n }\n}\n"],"mappings":"aAMA,SAAgB,EAAU,EAAuE,CAC/F,IAAM,EAAM,EAAK,IAAM,IAAA,GACjB,EAAa,EAAK,GAExB,GAAI,CACF,MAAO,CAAE,MAAK,OAAQ,EAAa,KAAK,MAAM,CAAU,EAAI,CAAC,CAAE,CACjE,OAAS,EAAO,CACd,MAAU,MAAM,sBAAuB,CAAE,MAAO,CAAM,CAAC,CACzD,CACF"} |
@@ -1,2 +0,2 @@ | ||
| function r(r){var a=r[2]||void 0,t=r[3];try{return{cwd:a,params:t?JSON.parse(t):{}}}catch(r){throw new Error("bad params argument",{cause:r})}}export{r as parseArgs}; | ||
| //# sourceMappingURL=parseArgs.js.map | ||
| function e(e){let t=e[2]||void 0,n=e[3];try{return{cwd:t,params:n?JSON.parse(n):{}}}catch(e){throw Error(`bad params argument`,{cause:e})}}export{e as parseArgs}; | ||
| //# sourceMappingURL=parseArgs.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"parseArgs.js","sources":["../../src/helpers/parseArgs.ts"],"sourcesContent":["/**\n * Parse command line arguments in `judge.ts` or `debug.ts`.\n *\n * `cwd` is optional: when omitted, presets that support it may fall back to\n * judging against model answers under `<problemDir>/model_answers/*`.\n */\nexport function parseArgs(argv: readonly string[]): { cwd: string | undefined; params: unknown } {\n const cwd = argv[2] || undefined;\n const paramsJson = argv[3];\n\n try {\n return { cwd, params: paramsJson ? JSON.parse(paramsJson) : {} };\n } catch (error) {\n throw new Error('bad params argument', { cause: error });\n }\n}\n"],"names":["parseArgs","argv","cwd","undefined","paramsJson","params","JSON","parse","error","Error","cause"],"mappings":"AAMO,SAASA,EAAUC,GACxB,IAAMC,EAAMD,EAAK,SAAME,EACjBC,EAAaH,EAAK,GAExB,IACE,MAAO,CAAEC,IAAAA,EAAKG,OAAQD,EAAaE,KAAKC,MAAMH,GAAc,CAAA,EAC9D,CAAE,MAAOI,GACP,MAAM,IAAIC,MAAM,sBAAuB,CAAEC,MAAOF,GAClD,CACF"} | ||
| {"version":3,"file":"parseArgs.js","names":[],"sources":["../../src/helpers/parseArgs.ts"],"sourcesContent":["/**\n * Parse command line arguments in `judge.ts` or `debug.ts`.\n *\n * `cwd` is optional: when omitted, presets that support it may fall back to\n * judging against model answers under `<problemDir>/model_answers/*`.\n */\nexport function parseArgs(argv: readonly string[]): { cwd: string | undefined; params: unknown } {\n const cwd = argv[2] || undefined;\n const paramsJson = argv[3];\n\n try {\n return { cwd, params: paramsJson ? JSON.parse(paramsJson) : {} };\n } catch (error) {\n throw new Error('bad params argument', { cause: error });\n }\n}\n"],"mappings":"AAMA,SAAgB,EAAU,EAAuE,CAC/F,IAAM,EAAM,EAAK,IAAM,IAAA,GACjB,EAAa,EAAK,GAExB,GAAI,CACF,MAAO,CAAE,MAAK,OAAQ,EAAa,KAAK,MAAM,CAAU,EAAI,CAAC,CAAE,CACjE,OAAS,EAAO,CACd,MAAU,MAAM,sBAAuB,CAAE,MAAO,CAAM,CAAC,CACzD,CACF"} |
@@ -1,2 +0,3 @@ | ||
| "use strict";var n="=".repeat(72);exports.printDebugBanner=function(c){var t=c.map(function(n){return" ".concat(n)}).join("\n");console.warn("\n".concat(n,"\n").concat(t,"\n").concat(n))}; | ||
| //# sourceMappingURL=printDebugBanner.cjs.map | ||
| "use strict";const e=`=`.repeat(72);function t(t){let n=t.map(e=>` ${e}`).join(` | ||
| `);console.warn(`\n${e}\n${n}\n${e}`)}exports.printDebugBanner=t; | ||
| //# sourceMappingURL=printDebugBanner.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"printDebugBanner.cjs","sources":["../../src/helpers/printDebugBanner.ts"],"sourcesContent":["const BANNER_LINE = '='.repeat(72);\n\n/**\n * Print a prominent, multi-line banner to stderr so that debug-mode runs\n * (e.g., judging against model answers without an explicit cwd) are obvious.\n *\n * Written to stderr to avoid interfering with `printTestCaseResult` output on stdout.\n */\nexport function printDebugBanner(lines: readonly string[]): void {\n const body = lines.map((line) => ` ${line}`).join('\\n');\n console.warn(`\\n${BANNER_LINE}\\n${body}\\n${BANNER_LINE}`);\n}\n"],"names":["BANNER_LINE","repeat","lines","body","map","line","concat","join","console","warn"],"mappings":"aAAA,IAAMA,EAAc,IAAIC,OAAO,6BAQxB,SAA0BC,GAC/B,IAAMC,EAAOD,EAAME,IAAI,SAACC,GAAI,MAAA,KAAAC,OAAUD,EAAI,GAAIE,KAAK,MACnDC,QAAQC,KAAI,KAAAH,OAAMN,EAAW,MAAAM,OAAKH,EAAI,MAAAG,OAAKN,GAC7C"} | ||
| {"version":3,"file":"printDebugBanner.cjs","names":[],"sources":["../../src/helpers/printDebugBanner.ts"],"sourcesContent":["const BANNER_LINE = '='.repeat(72);\n\n/**\n * Print a prominent, multi-line banner to stderr so that debug-mode runs\n * (e.g., judging against model answers without an explicit cwd) are obvious.\n *\n * Written to stderr to avoid interfering with `printTestCaseResult` output on stdout.\n */\nexport function printDebugBanner(lines: readonly string[]): void {\n const body = lines.map((line) => ` ${line}`).join('\\n');\n console.warn(`\\n${BANNER_LINE}\\n${body}\\n${BANNER_LINE}`);\n}\n"],"mappings":"aAAA,MAAM,EAAc,IAAI,OAAO,EAAE,EAQjC,SAAgB,EAAiB,EAAgC,CAC/D,IAAM,EAAO,EAAM,IAAK,GAAS,KAAK,GAAM,CAAC,CAAC,KAAK;CAAI,EACvD,QAAQ,KAAK,KAAK,EAAY,IAAI,EAAK,IAAI,GAAa,CAC1D"} |
@@ -1,2 +0,3 @@ | ||
| var n="=".repeat(72);function c(c){var o=c.map(function(n){return" ".concat(n)}).join("\n");console.warn("\n".concat(n,"\n").concat(o,"\n").concat(n))}export{c as printDebugBanner}; | ||
| //# sourceMappingURL=printDebugBanner.js.map | ||
| const e=`=`.repeat(72);function t(t){let n=t.map(e=>` ${e}`).join(` | ||
| `);console.warn(`\n${e}\n${n}\n${e}`)}export{t as printDebugBanner}; | ||
| //# sourceMappingURL=printDebugBanner.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"printDebugBanner.js","sources":["../../src/helpers/printDebugBanner.ts"],"sourcesContent":["const BANNER_LINE = '='.repeat(72);\n\n/**\n * Print a prominent, multi-line banner to stderr so that debug-mode runs\n * (e.g., judging against model answers without an explicit cwd) are obvious.\n *\n * Written to stderr to avoid interfering with `printTestCaseResult` output on stdout.\n */\nexport function printDebugBanner(lines: readonly string[]): void {\n const body = lines.map((line) => ` ${line}`).join('\\n');\n console.warn(`\\n${BANNER_LINE}\\n${body}\\n${BANNER_LINE}`);\n}\n"],"names":["BANNER_LINE","repeat","printDebugBanner","lines","body","map","line","concat","join","console","warn"],"mappings":"AAAA,IAAMA,EAAc,IAAIC,OAAO,IAQxB,SAASC,EAAiBC,GAC/B,IAAMC,EAAOD,EAAME,IAAI,SAACC,GAAI,MAAA,KAAAC,OAAUD,EAAI,GAAIE,KAAK,MACnDC,QAAQC,KAAI,KAAAH,OAAMP,EAAW,MAAAO,OAAKH,EAAI,MAAAG,OAAKP,GAC7C"} | ||
| {"version":3,"file":"printDebugBanner.js","names":[],"sources":["../../src/helpers/printDebugBanner.ts"],"sourcesContent":["const BANNER_LINE = '='.repeat(72);\n\n/**\n * Print a prominent, multi-line banner to stderr so that debug-mode runs\n * (e.g., judging against model answers without an explicit cwd) are obvious.\n *\n * Written to stderr to avoid interfering with `printTestCaseResult` output on stdout.\n */\nexport function printDebugBanner(lines: readonly string[]): void {\n const body = lines.map((line) => ` ${line}`).join('\\n');\n console.warn(`\\n${BANNER_LINE}\\n${body}\\n${BANNER_LINE}`);\n}\n"],"mappings":"AAAA,MAAM,EAAc,IAAI,OAAO,EAAE,EAQjC,SAAgB,EAAiB,EAAgC,CAC/D,IAAM,EAAO,EAAM,IAAK,GAAS,KAAK,GAAM,CAAC,CAAC,KAAK;CAAI,EACvD,QAAQ,KAAK,KAAK,EAAY,IAAI,EAAK,IAAI,GAAa,CAC1D"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var t=require("../types/testCaseResult.cjs");exports.encodeFileForTestCaseResult=function(t,e){var s=e.toString("utf8");return s.includes("�")?{path:t,encoding:"base64",data:e.toString("base64")}:{path:t,data:s}},exports.printTestCaseResult=function(e){console.info("".concat(t.TEST_CASE_RESULT_PREFIX).concat(JSON.stringify(e)))}; | ||
| //# sourceMappingURL=printTestCaseResult.cjs.map | ||
| "use strict";const e=require("../types/testCaseResult.cjs");function t(t){console.info(`${e.TEST_CASE_RESULT_PREFIX}${JSON.stringify(t)}`)}function n(e,t){let n=t.toString(`utf8`);return n.includes(`�`)?{path:e,encoding:`base64`,data:t.toString(`base64`)}:{path:e,data:n}}exports.encodeFileForTestCaseResult=n,exports.printTestCaseResult=t; | ||
| //# sourceMappingURL=printTestCaseResult.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"printTestCaseResult.cjs","sources":["../../src/helpers/printTestCaseResult.ts"],"sourcesContent":["import type { TestCaseResult } from '../types/testCaseResult.js';\nimport { TEST_CASE_RESULT_PREFIX } from '../types/testCaseResult.js';\n\n/**\n * Print a test case result in a format that can be read by the judge server.\n */\nexport function printTestCaseResult(result: TestCaseResult): void {\n console.info(`${TEST_CASE_RESULT_PREFIX}${JSON.stringify(result)}`);\n}\n\nexport function encodeFileForTestCaseResult(\n path: string,\n data: Buffer\n): NonNullable<TestCaseResult['outputFiles']>[number] {\n const utf8Text = data.toString('utf8');\n const isBinary = utf8Text.includes('\\uFFFD');\n return isBinary ? { path, encoding: 'base64', data: data.toString('base64') } : { path, data: utf8Text };\n}\n"],"names":["path","data","utf8Text","toString","includes","encoding","result","console","info","concat","TEST_CASE_RESULT_PREFIX","JSON","stringify"],"mappings":"8FAUO,SACLA,EACAC,GAEA,IAAMC,EAAWD,EAAKE,SAAS,QAE/B,OADiBD,EAASE,SAAS,KACjB,CAAEJ,KAAAA,EAAMK,SAAU,SAAUJ,KAAMA,EAAKE,SAAS,WAAc,CAAEH,KAAAA,EAAMC,KAAMC,EAChG,8BAXO,SAA6BI,GAClCC,QAAQC,KAAI,GAAAC,OAAIC,EAAAA,yBAAuBD,OAAGE,KAAKC,UAAUN,IAC3D"} | ||
| {"version":3,"file":"printTestCaseResult.cjs","names":["TEST_CASE_RESULT_PREFIX"],"sources":["../../src/helpers/printTestCaseResult.ts"],"sourcesContent":["import type { TestCaseResult } from '../types/testCaseResult.js';\nimport { TEST_CASE_RESULT_PREFIX } from '../types/testCaseResult.js';\n\n/**\n * Print a test case result in a format that can be read by the judge server.\n */\nexport function printTestCaseResult(result: TestCaseResult): void {\n console.info(`${TEST_CASE_RESULT_PREFIX}${JSON.stringify(result)}`);\n}\n\nexport function encodeFileForTestCaseResult(\n path: string,\n data: Buffer\n): NonNullable<TestCaseResult['outputFiles']>[number] {\n const utf8Text = data.toString('utf8');\n const isBinary = utf8Text.includes('\\uFFFD');\n return isBinary ? { path, encoding: 'base64', data: data.toString('base64') } : { path, data: utf8Text };\n}\n"],"mappings":"4DAMA,SAAgB,EAAoB,EAA8B,CAChE,QAAQ,KAAK,GAAGA,EAAAA,0BAA0B,KAAK,UAAU,CAAM,GAAG,CACpE,CAEA,SAAgB,EACd,EACA,EACoD,CACpD,IAAM,EAAW,EAAK,SAAS,MAAM,EAErC,OADiB,EAAS,SAAS,GACrB,EAAI,CAAE,OAAM,SAAU,SAAU,KAAM,EAAK,SAAS,QAAQ,CAAE,EAAI,CAAE,OAAM,KAAM,CAAS,CACzG"} |
@@ -1,2 +0,2 @@ | ||
| import{TEST_CASE_RESULT_PREFIX as t}from"../types/testCaseResult.js";function n(n){console.info("".concat(t).concat(JSON.stringify(n)))}function o(t,n){var o=n.toString("utf8");return o.includes("�")?{path:t,encoding:"base64",data:n.toString("base64")}:{path:t,data:o}}export{o as encodeFileForTestCaseResult,n as printTestCaseResult}; | ||
| //# sourceMappingURL=printTestCaseResult.js.map | ||
| import{TEST_CASE_RESULT_PREFIX as e}from"../types/testCaseResult.js";function t(t){console.info(`${e}${JSON.stringify(t)}`)}function n(e,t){let n=t.toString(`utf8`);return n.includes(`�`)?{path:e,encoding:`base64`,data:t.toString(`base64`)}:{path:e,data:n}}export{n as encodeFileForTestCaseResult,t as printTestCaseResult}; | ||
| //# sourceMappingURL=printTestCaseResult.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"printTestCaseResult.js","sources":["../../src/helpers/printTestCaseResult.ts"],"sourcesContent":["import type { TestCaseResult } from '../types/testCaseResult.js';\nimport { TEST_CASE_RESULT_PREFIX } from '../types/testCaseResult.js';\n\n/**\n * Print a test case result in a format that can be read by the judge server.\n */\nexport function printTestCaseResult(result: TestCaseResult): void {\n console.info(`${TEST_CASE_RESULT_PREFIX}${JSON.stringify(result)}`);\n}\n\nexport function encodeFileForTestCaseResult(\n path: string,\n data: Buffer\n): NonNullable<TestCaseResult['outputFiles']>[number] {\n const utf8Text = data.toString('utf8');\n const isBinary = utf8Text.includes('\\uFFFD');\n return isBinary ? { path, encoding: 'base64', data: data.toString('base64') } : { path, data: utf8Text };\n}\n"],"names":["printTestCaseResult","result","console","info","concat","TEST_CASE_RESULT_PREFIX","JSON","stringify","encodeFileForTestCaseResult","path","data","utf8Text","toString","includes","encoding"],"mappings":"qEAMO,SAASA,EAAoBC,GAClCC,QAAQC,KAAI,GAAAC,OAAIC,GAAuBD,OAAGE,KAAKC,UAAUN,IAC3D,CAEO,SAASO,EACdC,EACAC,GAEA,IAAMC,EAAWD,EAAKE,SAAS,QAE/B,OADiBD,EAASE,SAAS,KACjB,CAAEJ,KAAAA,EAAMK,SAAU,SAAUJ,KAAMA,EAAKE,SAAS,WAAc,CAAEH,KAAAA,EAAMC,KAAMC,EAChG"} | ||
| {"version":3,"file":"printTestCaseResult.js","names":[],"sources":["../../src/helpers/printTestCaseResult.ts"],"sourcesContent":["import type { TestCaseResult } from '../types/testCaseResult.js';\nimport { TEST_CASE_RESULT_PREFIX } from '../types/testCaseResult.js';\n\n/**\n * Print a test case result in a format that can be read by the judge server.\n */\nexport function printTestCaseResult(result: TestCaseResult): void {\n console.info(`${TEST_CASE_RESULT_PREFIX}${JSON.stringify(result)}`);\n}\n\nexport function encodeFileForTestCaseResult(\n path: string,\n data: Buffer\n): NonNullable<TestCaseResult['outputFiles']>[number] {\n const utf8Text = data.toString('utf8');\n const isBinary = utf8Text.includes('\\uFFFD');\n return isBinary ? { path, encoding: 'base64', data: data.toString('base64') } : { path, data: utf8Text };\n}\n"],"mappings":"qEAMA,SAAgB,EAAoB,EAA8B,CAChE,QAAQ,KAAK,GAAG,IAA0B,KAAK,UAAU,CAAM,GAAG,CACpE,CAEA,SAAgB,EACd,EACA,EACoD,CACpD,IAAM,EAAW,EAAK,SAAS,MAAM,EAErC,OADiB,EAAS,SAAS,GACrB,EAAI,CAAE,OAAM,SAAU,SAAU,KAAM,EAAK,SAAS,QAAQ,CAAE,EAAI,CAAE,OAAM,KAAM,CAAS,CACzG"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:fs"),n=require("node:path"),a=require("./printTestCaseResult.cjs");function s(){return(s=e.asyncToGenerator(e.regenerator().m(function s(t,u){var i,c,o,p,l,f;return e.regenerator().w(function(s){for(;;)switch(s.p=s.n){case 0:i=[],c=e.createForOfIteratorHelper(u),s.p=1,c.s();case 2:if((o=c.n()).done){s.n=7;break}return p=o.value,s.p=3,s.n=4,r.promises.readFile(n.join(t,p));case 4:l=s.v,i.push(a.encodeFileForTestCaseResult(p,l)),s.n=6;break;case 5:s.p=5,s.v;case 6:s.n=2;break;case 7:s.n=9;break;case 8:s.p=8,f=s.v,c.e(f);case 9:return s.p=9,c.f(),s.f(9);case 10:return s.a(2,i)}},s,null,[[3,5],[1,8,9,10]])}))).apply(this,arguments)}exports.readOutputFiles=function(e,r){return s.apply(this,arguments)}; | ||
| //# sourceMappingURL=readOutputFiles.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("./printTestCaseResult.cjs");let n=require("node:path");n=e.__toESM(n,1);let r=require("node:fs");r=e.__toESM(r,1);async function i(e,i){let a=[];for(let o of i)try{let i=await r.default.promises.readFile(n.default.join(e,o));a.push(t.encodeFileForTestCaseResult(o,i))}catch{}return a}exports.readOutputFiles=i; | ||
| //# sourceMappingURL=readOutputFiles.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"readOutputFiles.cjs","sources":["../../src/helpers/readOutputFiles.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nimport { encodeFileForTestCaseResult } from './printTestCaseResult.js';\n\nexport async function readOutputFiles(\n cwd: string,\n outputFilePaths: readonly string[]\n): Promise<NonNullable<TestCaseResult['outputFiles']>> {\n const outputFiles: NonNullable<TestCaseResult['outputFiles']> = [];\n for (const filePath of outputFilePaths) {\n try {\n const buffer = await fs.promises.readFile(path.join(cwd, filePath));\n outputFiles.push(encodeFileForTestCaseResult(filePath, buffer));\n } catch {\n // file not found\n }\n }\n return outputFiles;\n}\n"],"names":["_readOutputFiles","_asyncToGenerator","_regenerator","m","_callee","cwd","outputFilePaths","outputFiles","_iterator","_step","filePath","buffer","_t2","w","_context","p","n","_createForOfIteratorHelper","s","done","value","fs","promises","readFile","path","join","v","push","encodeFileForTestCaseResult","e","f","a","apply","this","arguments","_x","_x2"],"mappings":"2JAqBC,SAAAA,IAAA,OAAAA,EAAAC,EAAAA,iBAAAC,gBAAAC,EAdM,SAAAC,EACLC,EACAC,GAAkC,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAV,gBAAAW,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAE5BT,EAA0D,GAAEC,EAAAS,EAAAA,0BAC3CX,GAAeQ,EAAAC,EAAA,EAAAP,EAAAU,IAAA,KAAA,EAAA,IAAAT,EAAAD,EAAAQ,KAAAG,KAAA,CAAAL,EAAAE,EAAA,EAAA,KAAA,CAAnB,OAARN,EAAQD,EAAAW,MAAAN,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAEMK,EAAGC,SAASC,SAASC,EAAKC,KAAKpB,EAAKK,IAAU,KAAA,EAA7DC,EAAMG,EAAAY,EACZnB,EAAYoB,KAAKC,EAAAA,4BAA4BlB,EAAUC,IAASG,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAC,EAAA,EAAAD,EAAAY,EAAA,KAAA,EAAAZ,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAC,EAAA,EAAAH,EAAAE,EAAAY,EAAAlB,EAAAqB,EAAAjB,GAAA,KAAA,EAAA,OAAAE,EAAAC,EAAA,EAAAP,EAAAsB,IAAAhB,EAAAgB,EAAA,GAAA,KAAA,GAAA,OAAAhB,EAAAiB,EAAA,EAK7DxB,GAAW,EAAAH,EAAA,KAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,EAAA,EAAA,KAAA,KACnB4B,MAAAC,KAAAC,UAAA,yBAdD,SAAqCC,EAAAC,GAAA,OAAApC,EAAAgC,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"readOutputFiles.cjs","names":["fs","path","encodeFileForTestCaseResult"],"sources":["../../src/helpers/readOutputFiles.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nimport { encodeFileForTestCaseResult } from './printTestCaseResult.js';\n\nexport async function readOutputFiles(\n cwd: string,\n outputFilePaths: readonly string[]\n): Promise<NonNullable<TestCaseResult['outputFiles']>> {\n const outputFiles: NonNullable<TestCaseResult['outputFiles']> = [];\n for (const filePath of outputFilePaths) {\n try {\n const buffer = await fs.promises.readFile(path.join(cwd, filePath));\n outputFiles.push(encodeFileForTestCaseResult(filePath, buffer));\n } catch {\n // file not found\n }\n }\n return outputFiles;\n}\n"],"mappings":"+LAOA,eAAsB,EACpB,EACA,EACqD,CACrD,IAAM,EAA0D,CAAC,EACjE,IAAK,IAAM,KAAY,EACrB,GAAI,CACF,IAAM,EAAS,MAAMA,EAAAA,QAAG,SAAS,SAASC,EAAAA,QAAK,KAAK,EAAK,CAAQ,CAAC,EAClE,EAAY,KAAKC,EAAAA,4BAA4B,EAAU,CAAM,CAAC,CAChE,MAAQ,CAER,CAEF,OAAO,CACT"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as e,regenerator as r,createForOfIteratorHelper as a}from"../_virtual/_rollupPluginBabelHelpers.js";import n from"node:fs";import t from"node:path";import{encodeFileForTestCaseResult as s}from"./printTestCaseResult.js";function o(e,r){return p.apply(this,arguments)}function p(){return(p=e(r().m(function e(o,p){var i,u,c,f,l,m;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:i=[],u=a(p),e.p=1,u.s();case 2:if((c=u.n()).done){e.n=7;break}return f=c.value,e.p=3,e.n=4,n.promises.readFile(t.join(o,f));case 4:l=e.v,i.push(s(f,l)),e.n=6;break;case 5:e.p=5,e.v;case 6:e.n=2;break;case 7:e.n=9;break;case 8:e.p=8,m=e.v,u.e(m);case 9:return e.p=9,u.f(),e.f(9);case 10:return e.a(2,i)}},e,null,[[3,5],[1,8,9,10]])}))).apply(this,arguments)}export{o as readOutputFiles}; | ||
| //# sourceMappingURL=readOutputFiles.js.map | ||
| import{encodeFileForTestCaseResult as e}from"./printTestCaseResult.js";import t from"node:path";import n from"node:fs";async function r(r,i){let a=[];for(let o of i)try{let i=await n.promises.readFile(t.join(r,o));a.push(e(o,i))}catch{}return a}export{r as readOutputFiles}; | ||
| //# sourceMappingURL=readOutputFiles.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"readOutputFiles.js","sources":["../../src/helpers/readOutputFiles.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nimport { encodeFileForTestCaseResult } from './printTestCaseResult.js';\n\nexport async function readOutputFiles(\n cwd: string,\n outputFilePaths: readonly string[]\n): Promise<NonNullable<TestCaseResult['outputFiles']>> {\n const outputFiles: NonNullable<TestCaseResult['outputFiles']> = [];\n for (const filePath of outputFilePaths) {\n try {\n const buffer = await fs.promises.readFile(path.join(cwd, filePath));\n outputFiles.push(encodeFileForTestCaseResult(filePath, buffer));\n } catch {\n // file not found\n }\n }\n return outputFiles;\n}\n"],"names":["readOutputFiles","_x","_x2","_readOutputFiles","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","cwd","outputFilePaths","outputFiles","_iterator","_step","filePath","buffer","_t2","w","_context","p","n","_createForOfIteratorHelper","s","done","value","fs","promises","readFile","path","join","v","push","encodeFileForTestCaseResult","e","f","a"],"mappings":"mPAOA,SAAsBA,EAAeC,EAAAC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAcpC,SAAAH,IAAA,OAAAA,EAAAI,EAAAC,IAAAC,EAdM,SAAAC,EACLC,EACAC,GAAkC,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAV,IAAAW,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAE5BT,EAA0D,GAAEC,EAAAS,EAC3CX,GAAeQ,EAAAC,EAAA,EAAAP,EAAAU,IAAA,KAAA,EAAA,IAAAT,EAAAD,EAAAQ,KAAAG,KAAA,CAAAL,EAAAE,EAAA,EAAA,KAAA,CAAnB,OAARN,EAAQD,EAAAW,MAAAN,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAEMK,EAAGC,SAASC,SAASC,EAAKC,KAAKpB,EAAKK,IAAU,KAAA,EAA7DC,EAAMG,EAAAY,EACZnB,EAAYoB,KAAKC,EAA4BlB,EAAUC,IAASG,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAC,EAAA,EAAAD,EAAAY,EAAA,KAAA,EAAAZ,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAC,EAAA,EAAAH,EAAAE,EAAAY,EAAAlB,EAAAqB,EAAAjB,GAAA,KAAA,EAAA,OAAAE,EAAAC,EAAA,EAAAP,EAAAsB,IAAAhB,EAAAgB,EAAA,GAAA,KAAA,GAAA,OAAAhB,EAAAiB,EAAA,EAK7DxB,GAAW,EAAAH,EAAA,KAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,EAAA,EAAA,KAAA,KACnBN,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"readOutputFiles.js","names":[],"sources":["../../src/helpers/readOutputFiles.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nimport { encodeFileForTestCaseResult } from './printTestCaseResult.js';\n\nexport async function readOutputFiles(\n cwd: string,\n outputFilePaths: readonly string[]\n): Promise<NonNullable<TestCaseResult['outputFiles']>> {\n const outputFiles: NonNullable<TestCaseResult['outputFiles']> = [];\n for (const filePath of outputFilePaths) {\n try {\n const buffer = await fs.promises.readFile(path.join(cwd, filePath));\n outputFiles.push(encodeFileForTestCaseResult(filePath, buffer));\n } catch {\n // file not found\n }\n }\n return outputFiles;\n}\n"],"mappings":"uHAOA,eAAsB,EACpB,EACA,EACqD,CACrD,IAAM,EAA0D,CAAC,EACjE,IAAK,IAAM,KAAY,EACrB,GAAI,CACF,IAAM,EAAS,MAAM,EAAG,SAAS,SAAS,EAAK,KAAK,EAAK,CAAQ,CAAC,EAClE,EAAY,KAAK,EAA4B,EAAU,CAAM,CAAC,CAChE,MAAQ,CAER,CAEF,OAAO,CACT"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:fs"),a=require("node:path"),n=require("front-matter"),t=require("../types/problem.cjs");function o(){return(o=e.asyncToGenerator(e.regenerator().m(function o(s){var i,u,c,p,l,m,f,d;return e.regenerator().w(function(o){for(;;)switch(o.p=o.n){case 0:return f=e.createForOfIteratorHelper,o.n=1,r.promises.readdir(s,{withFileTypes:!0});case 1:i=f(o.v),o.p=2,i.s();case 3:if((u=i.n()).done){o.n=8;break}if((c=u.value).isFile()){o.n=4;break}return o.a(3,7);case 4:if("problem.md"===c.name||c.name.endsWith(".problem.md")){o.n=5;break}return o.a(3,7);case 5:return o.n=6,r.promises.readFile(a.join(c.parentPath,c.name),"utf8");case 6:return p=o.v,l=n(p),m=l.attributes,o.a(2,t.problemMarkdownFrontMatterSchema.parse(m));case 7:o.n=3;break;case 8:o.n=10;break;case 9:o.p=9,d=o.v,i.e(d);case 10:return o.p=10,i.f(),o.f(10);case 11:throw new Error("problem markdown not found: ".concat(s));case 12:return o.a(2)}},o,null,[[2,9,10,11]])}))).apply(this,arguments)}exports.readProblemMarkdownFrontMatter=function(e){return o.apply(this,arguments)}; | ||
| //# sourceMappingURL=readProblemMarkdownFrontMatter.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../types/problem.cjs");let n=require("node:path");n=e.__toESM(n,1);let r=require("node:fs");r=e.__toESM(r,1);let i=require("front-matter");i=e.__toESM(i,1);async function a(e){for(let a of await r.default.promises.readdir(e,{withFileTypes:!0})){if(!a.isFile()||!(a.name===`problem.md`||a.name.endsWith(`.problem.md`)))continue;let{attributes:e}=(0,i.default)(await r.default.promises.readFile(n.default.join(a.parentPath,a.name),`utf8`));return t.problemMarkdownFrontMatterSchema.parse(e)}throw Error(`problem markdown not found: ${e}`)}exports.readProblemMarkdownFrontMatter=a; | ||
| //# sourceMappingURL=readProblemMarkdownFrontMatter.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"readProblemMarkdownFrontMatter.cjs","sources":["../../src/helpers/readProblemMarkdownFrontMatter.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport parseFrontMatter from 'front-matter';\n\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport { problemMarkdownFrontMatterSchema } from '../types/problem.js';\n\nexport async function readProblemMarkdownFrontMatter(problemDir: string): Promise<ProblemMarkdownFrontMatter> {\n for (const dirent of await fs.promises.readdir(problemDir, { withFileTypes: true })) {\n if (!dirent.isFile()) continue;\n if (!(dirent.name === 'problem.md' || dirent.name.endsWith('.problem.md'))) continue;\n\n const markdown = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n\n const { attributes } = (parseFrontMatter as unknown as (markdown: string) => { attributes: unknown })(markdown);\n\n return problemMarkdownFrontMatterSchema.parse(attributes);\n }\n\n throw new Error(`problem markdown not found: ${problemDir}`);\n}\n"],"names":["_readProblemMarkdownFrontMatter","_asyncToGenerator","_regenerator","m","_callee","problemDir","_iterator","_step","dirent","markdown","_ref","attributes","_t","_t2","w","_context","p","n","_createForOfIteratorHelper","fs","promises","readdir","withFileTypes","v","s","done","value","isFile","a","name","endsWith","readFile","path","join","parentPath","parseFrontMatter","problemMarkdownFrontMatterSchema","parse","e","f","Error","concat","apply","this","arguments","_x"],"mappings":"gLAqBC,SAAAA,IAAA,OAAAA,EAAAC,EAAAA,iBAAAC,EAAAA,cAAAC,EAbM,SAAAC,EAA8CC,GAAkB,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAX,gBAAAY,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAAA,OAAAL,EAAAM,EAAAA,0BAAAH,EAAAE,EAAA,EAC1CE,EAAGC,SAASC,QAAQhB,EAAY,CAAEiB,eAAe,IAAO,KAAA,EAAAhB,EAAAM,EAAAG,EAAAQ,GAAAR,EAAAC,EAAA,EAAAV,EAAAkB,IAAA,KAAA,EAAA,IAAAjB,EAAAD,EAAAW,KAAAQ,KAAA,CAAAV,EAAAE,EAAA,EAAA,KAAA,CAAlE,IAANT,EAAMD,EAAAmB,OACHC,SAAQ,CAAAZ,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAa,EAAA,EAAA,GAAA,KAAA,EAAA,GACE,eAAhBpB,EAAOqB,MAAyBrB,EAAOqB,KAAKC,SAAS,eAAc,CAAAf,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAa,EAAA,EAAA,GAAA,KAAA,EAAA,OAAAb,EAAAE,EAAA,EAElDE,EAAGC,SAASW,SAASC,EAAKC,KAAKzB,EAAO0B,WAAY1B,EAAOqB,MAAO,QAAO,KAAA,EAE5E,OAFZpB,EAAQM,EAAAQ,EAAAb,EAEUyB,EAA8E1B,GAA9FE,EAAUD,EAAVC,WAAUI,EAAAa,EAAA,EAEXQ,EAAAA,iCAAiCC,MAAM1B,IAAW,KAAA,EAAAI,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAE,EAAA,GAAA,MAAA,KAAA,EAAAF,EAAAC,EAAA,EAAAH,EAAAE,EAAAQ,EAAAjB,EAAAgC,EAAAzB,GAAA,KAAA,GAAA,OAAAE,EAAAC,EAAA,GAAAV,EAAAiC,IAAAxB,EAAAwB,EAAA,IAAA,KAAA,GAAA,MAGrD,IAAIC,MAAK,+BAAAC,OAAgCpC,IAAa,KAAA,GAAA,OAAAU,EAAAa,EAAA,GAAA,EAAAxB,EAAA,KAAA,CAAA,CAAA,EAAA,EAAA,GAAA,KAAA,KAC7DsC,MAAAC,KAAAC,UAAA,wCAbD,SAAoDC,GAAA,OAAA7C,EAAA0C,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"readProblemMarkdownFrontMatter.cjs","names":["fs","path","problemMarkdownFrontMatterSchema"],"sources":["../../src/helpers/readProblemMarkdownFrontMatter.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport parseFrontMatter from 'front-matter';\n\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport { problemMarkdownFrontMatterSchema } from '../types/problem.js';\n\nexport async function readProblemMarkdownFrontMatter(problemDir: string): Promise<ProblemMarkdownFrontMatter> {\n for (const dirent of await fs.promises.readdir(problemDir, { withFileTypes: true })) {\n if (!dirent.isFile()) continue;\n if (!(dirent.name === 'problem.md' || dirent.name.endsWith('.problem.md'))) continue;\n\n const markdown = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n\n const { attributes } = (parseFrontMatter as unknown as (markdown: string) => { attributes: unknown })(markdown);\n\n return problemMarkdownFrontMatterSchema.parse(attributes);\n }\n\n throw new Error(`problem markdown not found: ${problemDir}`);\n}\n"],"mappings":"yOAQA,eAAsB,EAA+B,EAAyD,CAC5G,IAAK,IAAM,KAAU,MAAMA,EAAAA,QAAG,SAAS,QAAQ,EAAY,CAAE,cAAe,EAAK,CAAC,EAAG,CAEnF,GADI,CAAC,EAAO,OAAO,GACf,EAAE,EAAO,OAAS,cAAgB,EAAO,KAAK,SAAS,aAAa,GAAI,SAI5E,GAAM,CAAE,eAAA,EAAA,EAAA,QAAA,CAA8F,MAF/EA,EAAAA,QAAG,SAAS,SAASC,EAAAA,QAAK,KAAK,EAAO,WAAY,EAAO,IAAI,EAAG,MAAM,CAEiB,EAE9G,OAAOC,EAAAA,iCAAiC,MAAM,CAAU,CAC1D,CAEA,MAAU,MAAM,+BAA+B,GAAY,CAC7D"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as r,regenerator as e,createForOfIteratorHelper as a}from"../_virtual/_rollupPluginBabelHelpers.js";import n from"node:fs";import t from"node:path";import o from"front-matter";import{problemMarkdownFrontMatterSchema as s}from"../types/problem.js";function i(r){return p.apply(this,arguments)}function p(){return(p=r(e().m(function r(i){var p,m,u,c,f,l,b,d;return e().w(function(r){for(;;)switch(r.p=r.n){case 0:return b=a,r.n=1,n.promises.readdir(i,{withFileTypes:!0});case 1:p=b(r.v),r.p=2,p.s();case 3:if((m=p.n()).done){r.n=8;break}if((u=m.value).isFile()){r.n=4;break}return r.a(3,7);case 4:if("problem.md"===u.name||u.name.endsWith(".problem.md")){r.n=5;break}return r.a(3,7);case 5:return r.n=6,n.promises.readFile(t.join(u.parentPath,u.name),"utf8");case 6:return c=r.v,f=o(c),l=f.attributes,r.a(2,s.parse(l));case 7:r.n=3;break;case 8:r.n=10;break;case 9:r.p=9,d=r.v,p.e(d);case 10:return r.p=10,p.f(),r.f(10);case 11:throw new Error("problem markdown not found: ".concat(i));case 12:return r.a(2)}},r,null,[[2,9,10,11]])}))).apply(this,arguments)}export{i as readProblemMarkdownFrontMatter}; | ||
| //# sourceMappingURL=readProblemMarkdownFrontMatter.js.map | ||
| import{problemMarkdownFrontMatterSchema as e}from"../types/problem.js";import t from"node:path";import n from"node:fs";import r from"front-matter";async function i(i){for(let a of await n.promises.readdir(i,{withFileTypes:!0})){if(!a.isFile()||!(a.name===`problem.md`||a.name.endsWith(`.problem.md`)))continue;let{attributes:i}=r(await n.promises.readFile(t.join(a.parentPath,a.name),`utf8`));return e.parse(i)}throw Error(`problem markdown not found: ${i}`)}export{i as readProblemMarkdownFrontMatter}; | ||
| //# sourceMappingURL=readProblemMarkdownFrontMatter.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"readProblemMarkdownFrontMatter.js","sources":["../../src/helpers/readProblemMarkdownFrontMatter.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport parseFrontMatter from 'front-matter';\n\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport { problemMarkdownFrontMatterSchema } from '../types/problem.js';\n\nexport async function readProblemMarkdownFrontMatter(problemDir: string): Promise<ProblemMarkdownFrontMatter> {\n for (const dirent of await fs.promises.readdir(problemDir, { withFileTypes: true })) {\n if (!dirent.isFile()) continue;\n if (!(dirent.name === 'problem.md' || dirent.name.endsWith('.problem.md'))) continue;\n\n const markdown = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n\n const { attributes } = (parseFrontMatter as unknown as (markdown: string) => { attributes: unknown })(markdown);\n\n return problemMarkdownFrontMatterSchema.parse(attributes);\n }\n\n throw new Error(`problem markdown not found: ${problemDir}`);\n}\n"],"names":["readProblemMarkdownFrontMatter","_x","_readProblemMarkdownFrontMatter","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","_iterator","_step","dirent","markdown","_ref","attributes","_t","_t2","w","_context","p","n","_createForOfIteratorHelper","fs","promises","readdir","withFileTypes","v","s","done","value","isFile","a","name","endsWith","readFile","path","join","parentPath","parseFrontMatter","problemMarkdownFrontMatterSchema","parse","e","f","Error","concat"],"mappings":"+QAQA,SAAsBA,EAA8BC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAanD,SAAAH,IAAA,OAAAA,EAAAI,EAAAC,IAAAC,EAbM,SAAAC,EAA8CC,GAAkB,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAX,IAAAY,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAAA,OAAAL,EAAAM,EAAAH,EAAAE,EAAA,EAC1CE,EAAGC,SAASC,QAAQhB,EAAY,CAAEiB,eAAe,IAAO,KAAA,EAAAhB,EAAAM,EAAAG,EAAAQ,GAAAR,EAAAC,EAAA,EAAAV,EAAAkB,IAAA,KAAA,EAAA,IAAAjB,EAAAD,EAAAW,KAAAQ,KAAA,CAAAV,EAAAE,EAAA,EAAA,KAAA,CAAlE,IAANT,EAAMD,EAAAmB,OACHC,SAAQ,CAAAZ,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAa,EAAA,EAAA,GAAA,KAAA,EAAA,GACE,eAAhBpB,EAAOqB,MAAyBrB,EAAOqB,KAAKC,SAAS,eAAc,CAAAf,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAa,EAAA,EAAA,GAAA,KAAA,EAAA,OAAAb,EAAAE,EAAA,EAElDE,EAAGC,SAASW,SAASC,EAAKC,KAAKzB,EAAO0B,WAAY1B,EAAOqB,MAAO,QAAO,KAAA,EAE5E,OAFZpB,EAAQM,EAAAQ,EAAAb,EAEUyB,EAA8E1B,GAA9FE,EAAUD,EAAVC,WAAUI,EAAAa,EAAA,EAEXQ,EAAiCC,MAAM1B,IAAW,KAAA,EAAAI,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAAF,EAAAE,EAAA,GAAA,MAAA,KAAA,EAAAF,EAAAC,EAAA,EAAAH,EAAAE,EAAAQ,EAAAjB,EAAAgC,EAAAzB,GAAA,KAAA,GAAA,OAAAE,EAAAC,EAAA,GAAAV,EAAAiC,IAAAxB,EAAAwB,EAAA,IAAA,KAAA,GAAA,MAGrD,IAAIC,MAAK,+BAAAC,OAAgCpC,IAAa,KAAA,GAAA,OAAAU,EAAAa,EAAA,GAAA,EAAAxB,EAAA,KAAA,CAAA,CAAA,EAAA,EAAA,GAAA,KAAA,KAC7DN,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"readProblemMarkdownFrontMatter.js","names":[],"sources":["../../src/helpers/readProblemMarkdownFrontMatter.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport parseFrontMatter from 'front-matter';\n\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport { problemMarkdownFrontMatterSchema } from '../types/problem.js';\n\nexport async function readProblemMarkdownFrontMatter(problemDir: string): Promise<ProblemMarkdownFrontMatter> {\n for (const dirent of await fs.promises.readdir(problemDir, { withFileTypes: true })) {\n if (!dirent.isFile()) continue;\n if (!(dirent.name === 'problem.md' || dirent.name.endsWith('.problem.md'))) continue;\n\n const markdown = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n\n const { attributes } = (parseFrontMatter as unknown as (markdown: string) => { attributes: unknown })(markdown);\n\n return problemMarkdownFrontMatterSchema.parse(attributes);\n }\n\n throw new Error(`problem markdown not found: ${problemDir}`);\n}\n"],"mappings":"mJAQA,eAAsB,EAA+B,EAAyD,CAC5G,IAAK,IAAM,KAAU,MAAM,EAAG,SAAS,QAAQ,EAAY,CAAE,cAAe,EAAK,CAAC,EAAG,CAEnF,GADI,CAAC,EAAO,OAAO,GACf,EAAE,EAAO,OAAS,cAAgB,EAAO,KAAK,SAAS,aAAa,GAAI,SAI5E,GAAM,CAAE,cAAgB,EAA8E,MAF/E,EAAG,SAAS,SAAS,EAAK,KAAK,EAAO,WAAY,EAAO,IAAI,EAAG,MAAM,CAEiB,EAE9G,OAAO,EAAiC,MAAM,CAAU,CAC1D,CAEA,MAAU,MAAM,+BAA+B,GAAY,CAC7D"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:fs"),a=require("node:path"),n="_shared";function t(){return(t=e.asyncToGenerator(e.regenerator().m(function t(s){var i,u,o,p,c,f,l,d,h,m,b,k,g,w,v,y,P,j;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:if(r.existsSync(s)){t.n=1;break}return t.a(2,[]);case 1:return i=new Set,u=new Map,o=new Map,p=new Map,c=new Map,P=e.createForOfIteratorHelper,t.n=2,r.promises.readdir(s,{withFileTypes:!0});case 2:f=P(t.v),t.p=3,f.s();case 4:if((l=f.n()).done){t.n=10;break}if(!(d=l.value).isFile()){t.n=7;break}if(h=a.parse(d.name),m=h.ext,b=h.name,".in"===m||".out"===m){t.n=5;break}return t.a(3,9);case 5:return t.n=6,r.promises.readFile(a.join(d.parentPath,d.name),"utf8");case 6:k=t.v,i.add(b),".in"===m&&u.set(b,k),".out"===m&&o.set(b,k),t.n=9;break;case 7:if(!d.isDirectory()){t.n=9;break}if(g=a.parse(d.name),w=g.ext,v=g.name,".fin"===w||".fout"===w){t.n=8;break}return t.a(3,9);case 8:i.add(v),".fin"===w&&p.set(v,a.join(d.parentPath,d.name)),".fout"===w&&c.set(v,a.join(d.parentPath,d.name));case 9:t.n=4;break;case 10:t.n=12;break;case 11:t.p=11,j=t.v,f.e(j);case 12:return t.p=12,f.f(),t.f(12);case 13:return y=e.toConsumableArray(i).filter(function(e){return e!==n}).toSorted().map(function(e){return{id:e,input:u.get(e),output:o.get(e),fileInputPath:p.get(e),fileOutputPath:c.get(e)}}),i.has(n)&&(y.shared={fileInputPath:p.get(n)}),t.a(2,y)}},t,null,[[3,11,12,13]])}))).apply(this,arguments)}exports.readTestCases=function(e){return t.apply(this,arguments)}; | ||
| //# sourceMappingURL=readTestCases.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:path");t=e.__toESM(t,1);let n=require("node:fs");n=e.__toESM(n,1);const r=`_shared`;async function i(e){if(!n.default.existsSync(e))return[];let i=new Set,a=new Map,o=new Map,s=new Map,c=new Map;for(let r of await n.default.promises.readdir(e,{withFileTypes:!0}))if(r.isFile()){let{ext:e,name:s}=t.default.parse(r.name);if(e!==`.in`&&e!==`.out`)continue;let c=await n.default.promises.readFile(t.default.join(r.parentPath,r.name),`utf8`);i.add(s),e===`.in`&&a.set(s,c),e===`.out`&&o.set(s,c)}else if(r.isDirectory()){let{ext:e,name:n}=t.default.parse(r.name);if(e!==`.fin`&&e!==`.fout`)continue;i.add(n),e===`.fin`&&s.set(n,t.default.join(r.parentPath,r.name)),e===`.fout`&&c.set(n,t.default.join(r.parentPath,r.name))}let l=[...i].filter(e=>e!==r).toSorted().map(e=>({id:e,input:a.get(e),output:o.get(e),fileInputPath:s.get(e),fileOutputPath:c.get(e)}));return i.has(r)&&(l.shared={fileInputPath:s.get(r)}),l}exports.readTestCases=i; | ||
| //# sourceMappingURL=readTestCases.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"readTestCases.cjs","sources":["../../src/helpers/readTestCases.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nconst SHARED_TEST_CASE_NAME = '_shared';\n\nexport async function readTestCases(directory: string): Promise<\n { id: string; input?: string; output?: string; fileInputPath?: string; fileOutputPath?: string }[] & {\n shared?: { fileInputPath?: string };\n }\n> {\n if (!fs.existsSync(directory)) return [];\n\n const idSet = new Set<string>();\n const idToInput = new Map<string, string>();\n const idToOutput = new Map<string, string>();\n const idToFileInputPath = new Map<string, string>();\n const idToFileOutputPath = new Map<string, string>();\n\n for (const dirent of await fs.promises.readdir(directory, { withFileTypes: true })) {\n if (dirent.isFile()) {\n const { ext, name } = path.parse(dirent.name);\n if (ext !== '.in' && ext !== '.out') continue;\n\n const text = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n\n idSet.add(name);\n if (ext === '.in') idToInput.set(name, text);\n if (ext === '.out') idToOutput.set(name, text);\n } else if (dirent.isDirectory()) {\n const { ext, name } = path.parse(dirent.name);\n if (ext !== '.fin' && ext !== '.fout') continue;\n\n idSet.add(name);\n if (ext === '.fin') idToFileInputPath.set(name, path.join(dirent.parentPath, dirent.name));\n if (ext === '.fout') idToFileOutputPath.set(name, path.join(dirent.parentPath, dirent.name));\n }\n }\n\n const testCases: Awaited<ReturnType<typeof readTestCases>> = [...idSet]\n .filter((id) => id !== SHARED_TEST_CASE_NAME)\n .toSorted()\n .map((id) => ({\n id,\n input: idToInput.get(id),\n output: idToOutput.get(id),\n fileInputPath: idToFileInputPath.get(id),\n fileOutputPath: idToFileOutputPath.get(id),\n }));\n\n if (idSet.has(SHARED_TEST_CASE_NAME)) {\n testCases.shared = { fileInputPath: idToFileInputPath.get(SHARED_TEST_CASE_NAME) };\n }\n\n return testCases;\n}\n"],"names":["SHARED_TEST_CASE_NAME","_readTestCases","_asyncToGenerator","_regenerator","m","_callee","directory","idSet","idToInput","idToOutput","idToFileInputPath","idToFileOutputPath","_iterator","_step","dirent","_path$parse","ext","name","text","_path$parse2","_ext","_name","testCases","_t","_t2","w","_context","p","n","fs","existsSync","a","Set","Map","_createForOfIteratorHelper","promises","readdir","withFileTypes","v","s","done","value","isFile","path","parse","readFile","join","parentPath","add","set","isDirectory","e","f","_toConsumableArray","filter","id","toSorted","map","input","get","output","fileInputPath","fileOutputPath","has","shared","apply","this","arguments","_x"],"mappings":"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"} | ||
| {"version":3,"file":"readTestCases.cjs","names":["fs","path"],"sources":["../../src/helpers/readTestCases.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nconst SHARED_TEST_CASE_NAME = '_shared';\n\nexport async function readTestCases(directory: string): Promise<\n { id: string; input?: string; output?: string; fileInputPath?: string; fileOutputPath?: string }[] & {\n shared?: { fileInputPath?: string };\n }\n> {\n if (!fs.existsSync(directory)) return [];\n\n const idSet = new Set<string>();\n const idToInput = new Map<string, string>();\n const idToOutput = new Map<string, string>();\n const idToFileInputPath = new Map<string, string>();\n const idToFileOutputPath = new Map<string, string>();\n\n for (const dirent of await fs.promises.readdir(directory, { withFileTypes: true })) {\n if (dirent.isFile()) {\n const { ext, name } = path.parse(dirent.name);\n if (ext !== '.in' && ext !== '.out') continue;\n\n const text = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n\n idSet.add(name);\n if (ext === '.in') idToInput.set(name, text);\n if (ext === '.out') idToOutput.set(name, text);\n } else if (dirent.isDirectory()) {\n const { ext, name } = path.parse(dirent.name);\n if (ext !== '.fin' && ext !== '.fout') continue;\n\n idSet.add(name);\n if (ext === '.fin') idToFileInputPath.set(name, path.join(dirent.parentPath, dirent.name));\n if (ext === '.fout') idToFileOutputPath.set(name, path.join(dirent.parentPath, dirent.name));\n }\n }\n\n const testCases: Awaited<ReturnType<typeof readTestCases>> = [...idSet]\n .filter((id) => id !== SHARED_TEST_CASE_NAME)\n .toSorted()\n .map((id) => ({\n id,\n input: idToInput.get(id),\n output: idToOutput.get(id),\n fileInputPath: idToFileInputPath.get(id),\n fileOutputPath: idToFileOutputPath.get(id),\n }));\n\n if (idSet.has(SHARED_TEST_CASE_NAME)) {\n testCases.shared = { fileInputPath: idToFileInputPath.get(SHARED_TEST_CASE_NAME) };\n }\n\n return testCases;\n}\n"],"mappings":"wJAGA,MAAM,EAAwB,UAE9B,eAAsB,EAAc,EAIlC,CACA,GAAI,CAACA,EAAAA,QAAG,WAAW,CAAS,EAAG,MAAO,CAAC,EAEvC,IAAM,EAAQ,IAAI,IACZ,EAAY,IAAI,IAChB,EAAa,IAAI,IACjB,EAAoB,IAAI,IACxB,EAAqB,IAAI,IAE/B,IAAK,IAAM,KAAU,MAAMA,EAAAA,QAAG,SAAS,QAAQ,EAAW,CAAE,cAAe,EAAK,CAAC,EAC/E,GAAI,EAAO,OAAO,EAAG,CACnB,GAAM,CAAE,MAAK,QAASC,EAAAA,QAAK,MAAM,EAAO,IAAI,EAC5C,GAAI,IAAQ,OAAS,IAAQ,OAAQ,SAErC,IAAM,EAAO,MAAMD,EAAAA,QAAG,SAAS,SAASC,EAAAA,QAAK,KAAK,EAAO,WAAY,EAAO,IAAI,EAAG,MAAM,EAEzF,EAAM,IAAI,CAAI,EACV,IAAQ,OAAO,EAAU,IAAI,EAAM,CAAI,EACvC,IAAQ,QAAQ,EAAW,IAAI,EAAM,CAAI,CAC/C,MAAO,GAAI,EAAO,YAAY,EAAG,CAC/B,GAAM,CAAE,MAAK,QAASA,EAAAA,QAAK,MAAM,EAAO,IAAI,EAC5C,GAAI,IAAQ,QAAU,IAAQ,QAAS,SAEvC,EAAM,IAAI,CAAI,EACV,IAAQ,QAAQ,EAAkB,IAAI,EAAMA,EAAAA,QAAK,KAAK,EAAO,WAAY,EAAO,IAAI,CAAC,EACrF,IAAQ,SAAS,EAAmB,IAAI,EAAMA,EAAAA,QAAK,KAAK,EAAO,WAAY,EAAO,IAAI,CAAC,CAC7F,CAGF,IAAM,EAAuD,CAAC,GAAG,CAAK,CAAC,CACpE,OAAQ,GAAO,IAAO,CAAqB,CAAC,CAC5C,SAAS,CAAC,CACV,IAAK,IAAQ,CACZ,KACA,MAAO,EAAU,IAAI,CAAE,EACvB,OAAQ,EAAW,IAAI,CAAE,EACzB,cAAe,EAAkB,IAAI,CAAE,EACvC,eAAgB,EAAmB,IAAI,CAAE,CAC3C,EAAE,EAMJ,OAJI,EAAM,IAAI,CAAqB,IACjC,EAAU,OAAS,CAAE,cAAe,EAAkB,IAAI,CAAqB,CAAE,GAG5E,CACT"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as e,regenerator as a,toConsumableArray as r,createForOfIteratorHelper as n}from"../_virtual/_rollupPluginBabelHelpers.js";import t from"node:fs";import i from"node:path";var s="_shared";function o(e){return u.apply(this,arguments)}function u(){return(u=e(a().m(function e(o){var u,p,f,c,l,m,d,h,b,k,w,g,v,y,P,j,x,F;return a().w(function(e){for(;;)switch(e.p=e.n){case 0:if(t.existsSync(o)){e.n=1;break}return e.a(2,[]);case 1:return u=new Set,p=new Map,f=new Map,c=new Map,l=new Map,x=n,e.n=2,t.promises.readdir(o,{withFileTypes:!0});case 2:m=x(e.v),e.p=3,m.s();case 4:if((d=m.n()).done){e.n=10;break}if(!(h=d.value).isFile()){e.n=7;break}if(b=i.parse(h.name),k=b.ext,w=b.name,".in"===k||".out"===k){e.n=5;break}return e.a(3,9);case 5:return e.n=6,t.promises.readFile(i.join(h.parentPath,h.name),"utf8");case 6:g=e.v,u.add(w),".in"===k&&p.set(w,g),".out"===k&&f.set(w,g),e.n=9;break;case 7:if(!h.isDirectory()){e.n=9;break}if(v=i.parse(h.name),y=v.ext,P=v.name,".fin"===y||".fout"===y){e.n=8;break}return e.a(3,9);case 8:u.add(P),".fin"===y&&c.set(P,i.join(h.parentPath,h.name)),".fout"===y&&l.set(P,i.join(h.parentPath,h.name));case 9:e.n=4;break;case 10:e.n=12;break;case 11:e.p=11,F=e.v,m.e(F);case 12:return e.p=12,m.f(),e.f(12);case 13:return j=r(u).filter(function(e){return e!==s}).toSorted().map(function(e){return{id:e,input:p.get(e),output:f.get(e),fileInputPath:c.get(e),fileOutputPath:l.get(e)}}),u.has(s)&&(j.shared={fileInputPath:c.get(s)}),e.a(2,j)}},e,null,[[3,11,12,13]])}))).apply(this,arguments)}export{o as readTestCases}; | ||
| //# sourceMappingURL=readTestCases.js.map | ||
| import e from"node:path";import t from"node:fs";const n=`_shared`;async function r(r){if(!t.existsSync(r))return[];let i=new Set,a=new Map,o=new Map,s=new Map,c=new Map;for(let n of await t.promises.readdir(r,{withFileTypes:!0}))if(n.isFile()){let{ext:r,name:s}=e.parse(n.name);if(r!==`.in`&&r!==`.out`)continue;let c=await t.promises.readFile(e.join(n.parentPath,n.name),`utf8`);i.add(s),r===`.in`&&a.set(s,c),r===`.out`&&o.set(s,c)}else if(n.isDirectory()){let{ext:t,name:r}=e.parse(n.name);if(t!==`.fin`&&t!==`.fout`)continue;i.add(r),t===`.fin`&&s.set(r,e.join(n.parentPath,n.name)),t===`.fout`&&c.set(r,e.join(n.parentPath,n.name))}let l=[...i].filter(e=>e!==n).toSorted().map(e=>({id:e,input:a.get(e),output:o.get(e),fileInputPath:s.get(e),fileOutputPath:c.get(e)}));return i.has(n)&&(l.shared={fileInputPath:s.get(n)}),l}export{r as readTestCases}; | ||
| //# sourceMappingURL=readTestCases.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"readTestCases.js","sources":["../../src/helpers/readTestCases.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nconst SHARED_TEST_CASE_NAME = '_shared';\n\nexport async function readTestCases(directory: string): Promise<\n { id: string; input?: string; output?: string; fileInputPath?: string; fileOutputPath?: string }[] & {\n shared?: { fileInputPath?: string };\n }\n> {\n if (!fs.existsSync(directory)) return [];\n\n const idSet = new Set<string>();\n const idToInput = new Map<string, string>();\n const idToOutput = new Map<string, string>();\n const idToFileInputPath = new Map<string, string>();\n const idToFileOutputPath = new Map<string, string>();\n\n for (const dirent of await fs.promises.readdir(directory, { withFileTypes: true })) {\n if (dirent.isFile()) {\n const { ext, name } = path.parse(dirent.name);\n if (ext !== '.in' && ext !== '.out') continue;\n\n const text = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n\n idSet.add(name);\n if (ext === '.in') idToInput.set(name, text);\n if (ext === '.out') idToOutput.set(name, text);\n } else if (dirent.isDirectory()) {\n const { ext, name } = path.parse(dirent.name);\n if (ext !== '.fin' && ext !== '.fout') continue;\n\n idSet.add(name);\n if (ext === '.fin') idToFileInputPath.set(name, path.join(dirent.parentPath, dirent.name));\n if (ext === '.fout') idToFileOutputPath.set(name, path.join(dirent.parentPath, dirent.name));\n }\n }\n\n const testCases: Awaited<ReturnType<typeof readTestCases>> = [...idSet]\n .filter((id) => id !== SHARED_TEST_CASE_NAME)\n .toSorted()\n .map((id) => ({\n id,\n input: idToInput.get(id),\n output: idToOutput.get(id),\n fileInputPath: idToFileInputPath.get(id),\n fileOutputPath: idToFileOutputPath.get(id),\n }));\n\n if (idSet.has(SHARED_TEST_CASE_NAME)) {\n testCases.shared = { fileInputPath: idToFileInputPath.get(SHARED_TEST_CASE_NAME) };\n }\n\n return testCases;\n}\n"],"names":["SHARED_TEST_CASE_NAME","readTestCases","_x","_readTestCases","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","directory","idSet","idToInput","idToOutput","idToFileInputPath","idToFileOutputPath","_iterator","_step","dirent","_path$parse","ext","name","text","_path$parse2","_ext","_name","testCases","_t","_t2","w","_context","p","n","fs","existsSync","a","Set","Map","_createForOfIteratorHelper","promises","readdir","withFileTypes","v","s","done","value","isFile","path","parse","readFile","join","parentPath","add","set","isDirectory","e","f","_toConsumableArray","filter","id","toSorted","map","input","get","output","fileInputPath","fileOutputPath","has","shared"],"mappings":"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"} | ||
| {"version":3,"file":"readTestCases.js","names":[],"sources":["../../src/helpers/readTestCases.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nconst SHARED_TEST_CASE_NAME = '_shared';\n\nexport async function readTestCases(directory: string): Promise<\n { id: string; input?: string; output?: string; fileInputPath?: string; fileOutputPath?: string }[] & {\n shared?: { fileInputPath?: string };\n }\n> {\n if (!fs.existsSync(directory)) return [];\n\n const idSet = new Set<string>();\n const idToInput = new Map<string, string>();\n const idToOutput = new Map<string, string>();\n const idToFileInputPath = new Map<string, string>();\n const idToFileOutputPath = new Map<string, string>();\n\n for (const dirent of await fs.promises.readdir(directory, { withFileTypes: true })) {\n if (dirent.isFile()) {\n const { ext, name } = path.parse(dirent.name);\n if (ext !== '.in' && ext !== '.out') continue;\n\n const text = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name), 'utf8');\n\n idSet.add(name);\n if (ext === '.in') idToInput.set(name, text);\n if (ext === '.out') idToOutput.set(name, text);\n } else if (dirent.isDirectory()) {\n const { ext, name } = path.parse(dirent.name);\n if (ext !== '.fin' && ext !== '.fout') continue;\n\n idSet.add(name);\n if (ext === '.fin') idToFileInputPath.set(name, path.join(dirent.parentPath, dirent.name));\n if (ext === '.fout') idToFileOutputPath.set(name, path.join(dirent.parentPath, dirent.name));\n }\n }\n\n const testCases: Awaited<ReturnType<typeof readTestCases>> = [...idSet]\n .filter((id) => id !== SHARED_TEST_CASE_NAME)\n .toSorted()\n .map((id) => ({\n id,\n input: idToInput.get(id),\n output: idToOutput.get(id),\n fileInputPath: idToFileInputPath.get(id),\n fileOutputPath: idToFileOutputPath.get(id),\n }));\n\n if (idSet.has(SHARED_TEST_CASE_NAME)) {\n testCases.shared = { fileInputPath: idToFileInputPath.get(SHARED_TEST_CASE_NAME) };\n }\n\n return testCases;\n}\n"],"mappings":"gDAGA,MAAM,EAAwB,UAE9B,eAAsB,EAAc,EAIlC,CACA,GAAI,CAAC,EAAG,WAAW,CAAS,EAAG,MAAO,CAAC,EAEvC,IAAM,EAAQ,IAAI,IACZ,EAAY,IAAI,IAChB,EAAa,IAAI,IACjB,EAAoB,IAAI,IACxB,EAAqB,IAAI,IAE/B,IAAK,IAAM,KAAU,MAAM,EAAG,SAAS,QAAQ,EAAW,CAAE,cAAe,EAAK,CAAC,EAC/E,GAAI,EAAO,OAAO,EAAG,CACnB,GAAM,CAAE,MAAK,QAAS,EAAK,MAAM,EAAO,IAAI,EAC5C,GAAI,IAAQ,OAAS,IAAQ,OAAQ,SAErC,IAAM,EAAO,MAAM,EAAG,SAAS,SAAS,EAAK,KAAK,EAAO,WAAY,EAAO,IAAI,EAAG,MAAM,EAEzF,EAAM,IAAI,CAAI,EACV,IAAQ,OAAO,EAAU,IAAI,EAAM,CAAI,EACvC,IAAQ,QAAQ,EAAW,IAAI,EAAM,CAAI,CAC/C,MAAO,GAAI,EAAO,YAAY,EAAG,CAC/B,GAAM,CAAE,MAAK,QAAS,EAAK,MAAM,EAAO,IAAI,EAC5C,GAAI,IAAQ,QAAU,IAAQ,QAAS,SAEvC,EAAM,IAAI,CAAI,EACV,IAAQ,QAAQ,EAAkB,IAAI,EAAM,EAAK,KAAK,EAAO,WAAY,EAAO,IAAI,CAAC,EACrF,IAAQ,SAAS,EAAmB,IAAI,EAAM,EAAK,KAAK,EAAO,WAAY,EAAO,IAAI,CAAC,CAC7F,CAGF,IAAM,EAAuD,CAAC,GAAG,CAAK,CAAC,CACpE,OAAQ,GAAO,IAAO,CAAqB,CAAC,CAC5C,SAAS,CAAC,CACV,IAAK,IAAQ,CACZ,KACA,MAAO,EAAU,IAAI,CAAE,EACvB,OAAQ,EAAW,IAAI,CAAE,EACzB,cAAe,EAAkB,IAAI,CAAE,EACvC,eAAgB,EAAmB,IAAI,CAAE,CAC3C,EAAE,EAMJ,OAJI,EAAM,IAAI,CAAqB,IACjC,EAAU,OAAS,CAAE,cAAe,EAAkB,IAAI,CAAqB,CAAE,GAG5E,CACT"} |
@@ -1,2 +0,6 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs");function n(n,i,a,u){var c,f;if(void 0===u&&(u=function(n){var r,l,i,s;return[].concat(e.toConsumableArray(null!=(r=null==(l=n.comments)?void 0:l.map(function(e){var n;return{closeRegExp:t(null!=(n=e.close)?n:/(?=\n)/g),isComment:!0,openRegExp:t(e.open)}}))?r:[]),e.toConsumableArray(null!=(i=null==(s=n.strings)?void 0:s.map(function(e){return{closeRegExp:t(e.close),isComment:!1,openRegExp:t(e.open)}}))?i:[]))}(n)),!(null!=(c=n.comments)&&c.length||a.removeStrings&&null!=(f=n.strings)&&f.length))return i;for(var g=[],m=0;m<i.length;){var h,v=void 0,x=e.createForOfIteratorHelper(u);try{for(x.s();!(h=x.n()).done;){var d=h.value,p=d.openRegExp;p.lastIndex=m;var S=p.exec(i);S&&r(S,d,v,a)&&(v={grammar:d,match:S})}}catch(e){x.e(e)}finally{x.f()}if(v){var E=v.match.index;if(!v.grammar.isComment&&a.removeStrings&&(E=s(i,v.match.index)),g.push(i.slice(m,E)),v.grammar.isComment){var R=v.grammar.closeRegExp;R.lastIndex=v.match.index+v.match[0].length;var C=R.exec(i);m=C?C.index+C[0].length:i.length}else{m=l(i,v.match.index,v.grammar);var I=i.slice(v.match.index,m);a.removeStrings?g.push(o(n,u,i,v.match.index,I)):g.push(I)}}else g.push(i.slice(m)),m=i.length}return g.join("")}function r(e,n,r,t){return!r||(e.index<r.match.index||!(e.index>r.match.index)&&(t.removeStrings&&r.grammar.isComment&&!n.isComment))}function t(e){return new RegExp(e,e.flags.includes("g")?e.flags:"".concat(e.flags,"g"))}function l(e,n,r){if("`"===e[n])return function(e,n){var r=n+1;for(;r<e.length;)if("\\"!==e[r]){if("`"===e[r])return r+1;"$"!==e[r]||"{"!==e[r+1]?r+=1:r=c(e,r+2,"}",{slashStartsRegExp:!0}).endIndex+1}else r+=2;return e.length}(e,n);if(u(e,n))return function(e,n){var r=i(e,n),t=n+r.length;for(;t<e.length;){if(e.startsWith(r,t))return t+r.length;"{"!==e[t]||"{"!==e[t+1]?"{"!==e[t]?t+="\\"===e[t]?2:1:t=c(e,t+1,"}",{slashStartsRegExp:!1}).endIndex+1:t+=2}return e.length}(e,n);var t=r.closeRegExp;t.lastIndex=n+1;var l=t.exec(e);return l?l.index+l[0].length:e.length}function i(e,n){var r,t=e.slice(n,n+3);return"'''"===t||'"""'===t?t:null!=(r=e[n])?r:""}function s(e,n){var r=a(e,n);return r?n-r.length:n}function a(e,n){var r;if('"'===e[n]||"'"===e[n]){for(var t=n-1;t>=0&&/[A-Za-z]/.test(null!=(l=e[t])?l:"");){var l;t-=1}var i=e.slice(t+1,n);if(i&&/^[bfru]+$/i.test(i)&&!(t>=0&&/[\dA-Za-z_]/.test(null!=(r=e[t])?r:"")))return i}}function o(e,r,t,l,s){return s.startsWith("`")?function(e,r,t){var l=[],i=1;for(;i<t.length-1;)if("\\"!==t[i])if("$"!==t[i]||"{"!==t[i+1])i+=1;else{var s=c(t,i+2,"}",{slashStartsRegExp:!0});l.push(n(e,s.content,{removeStrings:!0},r)),i=s.endIndex+1}else i+=2;return l.join("\n")}(e,r,s):u(t,l)?function(e,r,t){var l=i(t,0).length,s=[],a=l;for(;a<t.length-l;)if("{"!==t[a]||"{"!==t[a+1])if("{"!==t[a])a+="\\"===t[a]?2:1;else{var o=c(t,a+1,"}",{slashStartsRegExp:!1});s.push(n(e,o.content,{removeStrings:!0},r)),a=o.endIndex+1}else a+=2;return s.join("\n")}(e,r,s):""}function u(e,n){var r,t;return null!=(r=null==(t=a(e,n))?void 0:t.toLowerCase().includes("f"))&&r}function c(e,n,r,t){for(var l=1,i=n;i<e.length;){var s=e[i];if('"'!==s&&"'"!==s&&"`"!==s)if(t.slashStartsRegExp&&"/"===e[i]&&"/"===e[i+1])i=m(e,i);else if(t.slashStartsRegExp&&"/"===e[i]&&"*"===e[i+1])i=h(e,i);else if(t.slashStartsRegExp&&"/"===s)i=g(e,i);else{if("{"===s&&(l+=1),s===r&&0===(l-=1))return{content:e.slice(n,i),endIndex:i};i+=1}else i=f(e,i)}return{content:e.slice(n),endIndex:e.length}}function f(e,n){for(var r=i(e,n),t=n+r.length;t<e.length;)if("\\"!==e[t]){if(e.startsWith(r,t))return t+r.length;t+=1}else t+=2;return t}function g(e,n){for(var r=n+1,t=!1;r<e.length;)if("\\"!==e[r]){if("["===e[r]&&(t=!0),"]"===e[r]&&(t=!1),"/"===e[r]&&!t){for(r+=1;/[A-Za-z]/.test(null!=(l=e[r])?l:"");){var l;r+=1}return r}if("\n"===e[r])return n+1;r+=1}else r+=2;return n+1}function m(e,n){var r=e.indexOf("\n",n+2);return-1===r?e.length:r}function h(e,n){var r=e.indexOf("*/",n+2);return-1===r?e.length:r+2}exports.removeCommentsAndStringsInSourceCode=function(e,r){return n(e,r,{removeStrings:!0})},exports.removeCommentsInSourceCode=function(e,r){return n(e,r,{removeStrings:!1})}; | ||
| //# sourceMappingURL=removeCommentsInSourceCode.cjs.map | ||
| "use strict";function e(e,t){return n(e,t,{removeStrings:!1})}function t(e,t){return n(e,t,{removeStrings:!0})}function n(e,t,n,a=r(e)){if(!e.comments?.length&&(!n.removeStrings||!e.strings?.length))return t;let s=[],c=0;for(;c<t.length;){let r;for(let e of a){let a=e.openRegExp;a.lastIndex=c;let o=a.exec(t);o&&i(o,e,r,n)&&(r={grammar:e,match:o})}if(r){let i=r.match.index;if(!r.grammar.isComment&&n.removeStrings&&(i=u(t,r.match.index)),s.push(t.slice(c,i)),r.grammar.isComment){let e=r.grammar.closeRegExp;e.lastIndex=r.match.index+r.match[0].length;let n=e.exec(t);c=n?n.index+n[0].length:t.length}else{c=o(t,r.match.index,r.grammar);let i=t.slice(r.match.index,c);n.removeStrings?s.push(f(e,a,t,r.match.index,i)):s.push(i)}}else s.push(t.slice(c)),c=t.length}return s.join(``)}function r(e){return[...e.comments?.map(e=>({closeRegExp:a(e.close??/(?=\n)/g),isComment:!0,openRegExp:a(e.open)}))??[],...e.strings?.map(e=>({closeRegExp:a(e.close),isComment:!1,openRegExp:a(e.open)}))??[]]}function i(e,t,n,r){return!n||e.index<n.match.index?!0:e.index>n.match.index?!1:r.removeStrings&&n.grammar.isComment&&!t.isComment}function a(e){return new RegExp(e,e.flags.includes(`g`)?e.flags:`${e.flags}g`)}function o(e,t,n){if(e[t]==="`")return s(e,t);if(p(e,t))return c(e,t);let r=n.closeRegExp;r.lastIndex=t+1;let i=r.exec(e);return i?i.index+i[0].length:e.length}function s(e,t){let n=t+1;for(;n<e.length;){if(e[n]===`\\`){n+=2;continue}if(e[n]==="`")return n+1;if(e[n]===`$`&&e[n+1]===`{`){n=g(e,n+2,`}`,{slashStartsRegExp:!0}).endIndex+1;continue}n+=1}return e.length}function c(e,t){let n=l(e,t),r=t+n.length;for(;r<e.length;){if(e.startsWith(n,r))return r+n.length;if(e[r]===`{`&&e[r+1]===`{`){r+=2;continue}if(e[r]===`{`){r=g(e,r+1,`}`,{slashStartsRegExp:!1}).endIndex+1;continue}r+=e[r]===`\\`?2:1}return e.length}function l(e,t){let n=e.slice(t,t+3);return n===`'''`||n===`"""`?n:e[t]??``}function u(e,t){let n=d(e,t);return n?t-n.length:t}function d(e,t){if(e[t]!==`"`&&e[t]!==`'`)return;let n=t-1;for(;n>=0&&/[A-Za-z]/.test(e[n]??``);)--n;let r=e.slice(n+1,t);if(!(!r||!/^[bfru]+$/i.test(r))&&!(n>=0&&/[\dA-Za-z_]/.test(e[n]??``)))return r}function f(e,t,n,r,i){return i.startsWith("`")?m(e,t,i):p(n,r)?h(e,t,i):``}function p(e,t){return d(e,t)?.toLowerCase().includes(`f`)??!1}function m(e,t,r){let i=[],a=1;for(;a<r.length-1;){if(r[a]===`\\`){a+=2;continue}if(r[a]===`$`&&r[a+1]===`{`){let o=g(r,a+2,`}`,{slashStartsRegExp:!0});i.push(n(e,o.content,{removeStrings:!0},t)),a=o.endIndex+1;continue}a+=1}return i.join(` | ||
| `)}function h(e,t,r){let i=l(r,0).length,a=[],o=i;for(;o<r.length-i;){if(r[o]===`{`&&r[o+1]===`{`){o+=2;continue}if(r[o]===`{`){let i=g(r,o+1,`}`,{slashStartsRegExp:!1});a.push(n(e,i.content,{removeStrings:!0},t)),o=i.endIndex+1;continue}o+=r[o]===`\\`?2:1}return a.join(` | ||
| `)}function g(e,t,n,r){let i=1,a=t;for(;a<e.length;){let o=e[a];if(o===`"`||o===`'`||o==="`"){a=_(e,a);continue}if(r.slashStartsRegExp&&e[a]===`/`&&e[a+1]===`/`){a=y(e,a);continue}if(r.slashStartsRegExp&&e[a]===`/`&&e[a+1]===`*`){a=b(e,a);continue}if(r.slashStartsRegExp&&o===`/`){a=v(e,a);continue}if(o===`{`&&(i+=1),o===n&&(--i,i===0))return{content:e.slice(t,a),endIndex:a};a+=1}return{content:e.slice(t),endIndex:e.length}}function _(e,t){let n=l(e,t),r=t+n.length;for(;r<e.length;){if(e[r]===`\\`){r+=2;continue}if(e.startsWith(n,r))return r+n.length;r+=1}return r}function v(e,t){let n=t+1,r=!1;for(;n<e.length;){if(e[n]===`\\`){n+=2;continue}if(e[n]===`[`&&(r=!0),e[n]===`]`&&(r=!1),e[n]===`/`&&!r){for(n+=1;/[A-Za-z]/.test(e[n]??``);)n+=1;return n}if(e[n]===` | ||
| `)return t+1;n+=1}return t+1}function y(e,t){let n=e.indexOf(` | ||
| `,t+2);return n===-1?e.length:n}function b(e,t){let n=e.indexOf(`*/`,t+2);return n===-1?e.length:n+2}exports.removeCommentsAndStringsInSourceCode=t,exports.removeCommentsInSourceCode=e; | ||
| //# sourceMappingURL=removeCommentsInSourceCode.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"removeCommentsInSourceCode.cjs","sources":["../../src/helpers/removeCommentsInSourceCode.ts"],"sourcesContent":["import type { LanguageDefinition } from '../types/language.js';\n\nexport type SourceCodeGrammar = NonNullable<LanguageDefinition['grammer']>;\n\n/** Removes comments from source code according to the provided language grammar. */\nexport function removeCommentsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: false });\n}\n\n/** Removes comments and string literal contents while preserving executable interpolation expressions. */\nexport function removeCommentsAndStringsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: true });\n}\n\ninterface CommentOrStringGrammar {\n closeRegExp: RegExp;\n isComment: boolean;\n openRegExp: RegExp;\n}\n\nfunction removeCommentsAndMaybeStringsInSourceCode(\n grammar: SourceCodeGrammar,\n sourceCode: string,\n options: { removeStrings: boolean },\n commentOrStringGrammars = compileCommentOrStringGrammars(grammar)\n): string {\n if (!grammar.comments?.length && (!options.removeStrings || !grammar.strings?.length)) return sourceCode;\n\n const newSourceCodeSlices: string[] = [];\n\n let lastIndex = 0;\n\n while (lastIndex < sourceCode.length) {\n let first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined;\n\n for (const commentOrStringGrammer of commentOrStringGrammars) {\n const startRegExp = commentOrStringGrammer.openRegExp;\n startRegExp.lastIndex = lastIndex;\n\n const match = startRegExp.exec(sourceCode);\n\n if (match && shouldPreferMatch(match, commentOrStringGrammer, first, options)) {\n first = { grammar: commentOrStringGrammer, match };\n }\n }\n\n if (first) {\n let stringPrefixStartIndex = first.match.index;\n if (!first.grammar.isComment && options.removeStrings) {\n stringPrefixStartIndex = getPythonStringPrefixStartIndex(sourceCode, first.match.index);\n }\n newSourceCodeSlices.push(sourceCode.slice(lastIndex, stringPrefixStartIndex));\n\n if (!first.grammar.isComment) {\n lastIndex = findStringEndIndex(sourceCode, first.match.index, first.grammar);\n const stringLiteral = sourceCode.slice(first.match.index, lastIndex);\n if (options.removeStrings) {\n newSourceCodeSlices.push(\n preserveStringInterpolationExpressions(\n grammar,\n commentOrStringGrammars,\n sourceCode,\n first.match.index,\n stringLiteral\n )\n );\n } else {\n newSourceCodeSlices.push(stringLiteral);\n }\n } else {\n const closeRegExp = first.grammar.closeRegExp;\n closeRegExp.lastIndex = first.match.index + first.match[0].length;\n\n const match = closeRegExp.exec(sourceCode);\n\n lastIndex = match ? match.index + match[0].length : sourceCode.length;\n }\n } else {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex));\n lastIndex = sourceCode.length;\n }\n }\n\n return newSourceCodeSlices.join('');\n}\n\nfunction compileCommentOrStringGrammars(grammar: SourceCodeGrammar): readonly CommentOrStringGrammar[] {\n return [\n ...(grammar.comments?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close ?? /(?=\\n)/g),\n isComment: true,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ...(grammar.strings?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close),\n isComment: false,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ] satisfies CommentOrStringGrammar[];\n}\n\nfunction shouldPreferMatch(\n match: RegExpExecArray,\n grammar: CommentOrStringGrammar,\n first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined,\n options: { removeStrings: boolean }\n): boolean {\n if (!first) return true;\n if (match.index < first.match.index) return true;\n if (match.index > first.match.index) return false;\n return options.removeStrings && first.grammar.isComment && !grammar.isComment;\n}\n\nfunction makeGlobalRegExp(regExp: RegExp): RegExp {\n return new RegExp(regExp, regExp.flags.includes('g') ? regExp.flags : `${regExp.flags}g`);\n}\n\nfunction findStringEndIndex(sourceCode: string, stringStartIndex: number, grammar: CommentOrStringGrammar): number {\n if (sourceCode[stringStartIndex] === '`') return findJavaScriptTemplateEndIndex(sourceCode, stringStartIndex);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return findPythonFStringEndIndex(sourceCode, stringStartIndex);\n\n const closeRegExp = grammar.closeRegExp;\n closeRegExp.lastIndex = stringStartIndex + 1;\n const match = closeRegExp.exec(sourceCode);\n return match ? match.index + match[0].length : sourceCode.length;\n}\n\nfunction findJavaScriptTemplateEndIndex(sourceCode: string, stringStartIndex: number): number {\n let index = stringStartIndex + 1;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '`') return index + 1;\n if (sourceCode[index] === '$' && sourceCode[index + 1] === '{') {\n index = readBalancedExpression(sourceCode, index + 2, '}', { slashStartsRegExp: true }).endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return sourceCode.length;\n}\n\nfunction findPythonFStringEndIndex(sourceCode: string, stringStartIndex: number): number {\n const quote = getStringQuote(sourceCode, stringStartIndex);\n let index = stringStartIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n if (sourceCode[index] === '{' && sourceCode[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '{') {\n index = readBalancedExpression(sourceCode, index + 1, '}', { slashStartsRegExp: false }).endIndex + 1;\n continue;\n }\n index += sourceCode[index] === '\\\\' ? 2 : 1;\n }\n\n return sourceCode.length;\n}\n\nfunction getStringQuote(sourceCode: string, stringStartIndex: number): string {\n const threeCharacterQuote = sourceCode.slice(stringStartIndex, stringStartIndex + 3);\n if (threeCharacterQuote === \"'''\" || threeCharacterQuote === '\"\"\"') return threeCharacterQuote;\n return sourceCode[stringStartIndex] ?? '';\n}\n\nfunction getPythonStringPrefixStartIndex(sourceCode: string, stringStartIndex: number): number {\n const prefix = getPythonStringPrefix(sourceCode, stringStartIndex);\n return prefix ? stringStartIndex - prefix.length : stringStartIndex;\n}\n\nfunction getPythonStringPrefix(sourceCode: string, stringStartIndex: number): string | undefined {\n if (sourceCode[stringStartIndex] !== '\"' && sourceCode[stringStartIndex] !== \"'\") return undefined;\n let index = stringStartIndex - 1;\n while (index >= 0 && /[A-Za-z]/.test(sourceCode[index] ?? '')) index -= 1;\n\n const prefix = sourceCode.slice(index + 1, stringStartIndex);\n if (!prefix || !/^[bfru]+$/i.test(prefix)) return undefined;\n if (index >= 0 && /[\\dA-Za-z_]/.test(sourceCode[index] ?? '')) return undefined;\n\n return prefix;\n}\n\nfunction preserveStringInterpolationExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n sourceCode: string,\n stringStartIndex: number,\n stringLiteral: string\n): string {\n if (stringLiteral.startsWith('`'))\n return preserveJavaScriptTemplateExpressions(grammar, commentOrStringGrammars, stringLiteral);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return preservePythonFStringExpressions(grammar, commentOrStringGrammars, stringLiteral);\n return '';\n}\n\nfunction hasPythonFStringPrefix(sourceCode: string, stringStartIndex: number): boolean {\n return getPythonStringPrefix(sourceCode, stringStartIndex)?.toLowerCase().includes('f') ?? false;\n}\n\nfunction preserveJavaScriptTemplateExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const expressions: string[] = [];\n let index = 1;\n\n while (index < stringLiteral.length - 1) {\n if (stringLiteral[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '$' && stringLiteral[index + 1] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 2, '}', { slashStartsRegExp: true });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction preservePythonFStringExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const quoteLength = getStringQuote(stringLiteral, 0).length;\n const expressions: string[] = [];\n let index = quoteLength;\n\n while (index < stringLiteral.length - quoteLength) {\n if (stringLiteral[index] === '{' && stringLiteral[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 1, '}', { slashStartsRegExp: false });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += stringLiteral[index] === '\\\\' ? 2 : 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction readBalancedExpression(\n sourceCode: string,\n startIndex: number,\n closeChar: string,\n options: { slashStartsRegExp: boolean }\n): { content: string; endIndex: number } {\n let depth = 1;\n let index = startIndex;\n\n while (index < sourceCode.length) {\n const char = sourceCode[index];\n if (char === '\"' || char === \"'\" || char === '`') {\n index = skipQuotedSpan(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '/') {\n index = skipJavaScriptSingleLineComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '*') {\n index = skipJavaScriptBlockComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && char === '/') {\n index = skipJavaScriptRegExpLiteral(sourceCode, index);\n continue;\n }\n if (char === '{') depth += 1;\n if (char === closeChar) {\n depth -= 1;\n if (depth === 0) return { content: sourceCode.slice(startIndex, index), endIndex: index };\n }\n index += 1;\n }\n\n return { content: sourceCode.slice(startIndex), endIndex: sourceCode.length };\n}\n\nfunction skipQuotedSpan(sourceCode: string, startIndex: number): number {\n const quote = getStringQuote(sourceCode, startIndex);\n let index = startIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n index += 1;\n }\n\n return index;\n}\n\nfunction skipJavaScriptRegExpLiteral(sourceCode: string, startIndex: number): number {\n let index = startIndex + 1;\n let inCharacterClass = false;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '[') inCharacterClass = true;\n if (sourceCode[index] === ']') inCharacterClass = false;\n if (sourceCode[index] === '/' && !inCharacterClass) {\n index += 1;\n while (/[A-Za-z]/.test(sourceCode[index] ?? '')) index += 1;\n return index;\n }\n if (sourceCode[index] === '\\n') return startIndex + 1;\n index += 1;\n }\n\n return startIndex + 1;\n}\n\nfunction skipJavaScriptSingleLineComment(sourceCode: string, startIndex: number): number {\n const newLineIndex = sourceCode.indexOf('\\n', startIndex + 2);\n return newLineIndex === -1 ? sourceCode.length : newLineIndex;\n}\n\nfunction skipJavaScriptBlockComment(sourceCode: string, startIndex: number): number {\n const endIndex = sourceCode.indexOf('*/', startIndex + 2);\n return endIndex === -1 ? sourceCode.length : endIndex + 2;\n}\n"],"names":["removeCommentsAndMaybeStringsInSourceCode","grammar","sourceCode","options","commentOrStringGrammars","_grammar$comments","_grammar$strings","_grammar$comments$map","_grammar$comments2","_grammar$strings$map","_grammar$strings2","concat","_toConsumableArray","comments","map","v","_v$close","closeRegExp","makeGlobalRegExp","close","isComment","openRegExp","open","strings","compileCommentOrStringGrammars","length","removeStrings","newSourceCodeSlices","lastIndex","_step","first","_iterator","_createForOfIteratorHelper","s","n","done","commentOrStringGrammer","value","startRegExp","match","exec","shouldPreferMatch","err","e","f","stringPrefixStartIndex","index","getPythonStringPrefixStartIndex","push","slice","findStringEndIndex","stringLiteral","preserveStringInterpolationExpressions","join","regExp","RegExp","flags","includes","stringStartIndex","readBalancedExpression","slashStartsRegExp","endIndex","findJavaScriptTemplateEndIndex","hasPythonFStringPrefix","quote","getStringQuote","startsWith","findPythonFStringEndIndex","_sourceCode$stringSta","threeCharacterQuote","prefix","getPythonStringPrefix","_sourceCode$index2","test","_sourceCode$index","expressions","expression","content","preserveJavaScriptTemplateExpressions","quoteLength","preservePythonFStringExpressions","_getPythonStringPrefi","_getPythonStringPrefi2","toLowerCase","startIndex","closeChar","depth","char","skipJavaScriptSingleLineComment","skipJavaScriptBlockComment","skipJavaScriptRegExpLiteral","skipQuotedSpan","inCharacterClass","_sourceCode$index3","newLineIndex","indexOf"],"mappings":"wEAoBA,SAASA,EACPC,EACAC,EACAC,EACAC,GACQ,IAAAC,EAAAC,EACR,QAFuB,IAAvBF,IAAAA,EA8DF,SAAwCH,GAA+D,IAAAM,EAAAC,EAAAC,EAAAC,EACrG,MAAA,GAAAC,OAAAC,EAAAA,yBAAAL,EACsB,OADtBC,EACMP,EAAQY,eAAQ,EAAhBL,EAAkBM,IAAI,SAACC,GAAC,IAAAC,EAAA,MAAM,CAChCC,YAAaC,EAAwB,OAARF,EAACD,EAAEI,OAAKH,EAAI,WACzCI,WAAW,EACXC,WAAYH,EAAiBH,EAAEO,MAChC,IAAEf,EAAI,IAAEK,EAAAA,kBAKN,OALMH,EACU,OADVC,EACLT,EAAQsB,cAAO,EAAfb,EAAiBI,IAAI,SAACC,GAAC,MAAM,CAC/BE,YAAaC,EAAiBH,EAAEI,OAChCC,WAAW,EACXC,WAAYH,EAAiBH,EAAEO,MAChC,IAAEb,EAAI,IAEX,CA3E4Be,CAA+BvB,MAEpC,OAAjBI,EAACJ,EAAQY,WAARR,EAAkBoB,QAAYtB,EAAQuB,eAAiC,OAAhBpB,EAACL,EAAQsB,UAARjB,EAAiBmB,QAAS,OAAOvB,EAM9F,IAJA,IAAMyB,EAAgC,GAElCC,EAAY,EAETA,EAAY1B,EAAWuB,QAAQ,CACpC,IAE4DI,EAFxDC,OAA8E,EAACC,EAAAC,EAAAA,0BAE9C5B,GAAuB,IAA5D,IAAA2B,EAAAE,MAAAJ,EAAAE,EAAAG,KAAAC,MAA8D,CAAA,IAAnDC,EAAsBP,EAAAQ,MACzBC,EAAcF,EAAuBf,WAC3CiB,EAAYV,UAAYA,EAExB,IAAMW,EAAQD,EAAYE,KAAKtC,GAE3BqC,GAASE,EAAkBF,EAAOH,EAAwBN,EAAO3B,KACnE2B,EAAQ,CAAE7B,QAASmC,EAAwBG,MAAAA,GAE/C,CAAC,CAAA,MAAAG,GAAAX,EAAAY,EAAAD,EAAA,CAAA,QAAAX,EAAAa,GAAA,CAED,GAAId,EAAO,CACT,IAAIe,EAAyBf,EAAMS,MAAMO,MAMzC,IALKhB,EAAM7B,QAAQmB,WAAajB,EAAQuB,gBACtCmB,EAAyBE,EAAgC7C,EAAY4B,EAAMS,MAAMO,QAEnFnB,EAAoBqB,KAAK9C,EAAW+C,MAAMrB,EAAWiB,IAEhDf,EAAM7B,QAAQmB,UAgBZ,CACL,IAAMH,EAAca,EAAM7B,QAAQgB,YAClCA,EAAYW,UAAYE,EAAMS,MAAMO,MAAQhB,EAAMS,MAAM,GAAGd,OAE3D,IAAMc,EAAQtB,EAAYuB,KAAKtC,GAE/B0B,EAAYW,EAAQA,EAAMO,MAAQP,EAAM,GAAGd,OAASvB,EAAWuB,MACjE,KAvB8B,CAC5BG,EAAYsB,EAAmBhD,EAAY4B,EAAMS,MAAMO,MAAOhB,EAAM7B,SACpE,IAAMkD,EAAgBjD,EAAW+C,MAAMnB,EAAMS,MAAMO,MAAOlB,GACtDzB,EAAQuB,cACVC,EAAoBqB,KAClBI,EACEnD,EACAG,EACAF,EACA4B,EAAMS,MAAMO,MACZK,IAIJxB,EAAoBqB,KAAKG,EAE7B,CAQF,MACExB,EAAoBqB,KAAK9C,EAAW+C,MAAMrB,IAC1CA,EAAY1B,EAAWuB,MAE3B,CAEA,OAAOE,EAAoB0B,KAAK,GAClC,CAiBA,SAASZ,EACPF,EACAtC,EACA6B,EACA3B,GAEA,OAAK2B,IACDS,EAAMO,MAAQhB,EAAMS,MAAMO,SAC1BP,EAAMO,MAAQhB,EAAMS,MAAMO,SACvB3C,EAAQuB,eAAiBI,EAAM7B,QAAQmB,YAAcnB,EAAQmB,WACtE,CAEA,SAASF,EAAiBoC,GACxB,OAAO,IAAIC,OAAOD,EAAQA,EAAOE,MAAMC,SAAS,KAAOH,EAAOE,MAAK,GAAA7C,OAAM2C,EAAOE,MAAK,KACvF,CAEA,SAASN,EAAmBhD,EAAoBwD,EAA0BzD,GACxE,GAAqC,MAAjCC,EAAWwD,GAA2B,OAU5C,SAAwCxD,EAAoBwD,GAC1D,IAAIZ,EAAQY,EAAmB,EAE/B,KAAOZ,EAAQ5C,EAAWuB,QACxB,GAA0B,OAAtBvB,EAAW4C,GAAf,CAIA,GAA0B,MAAtB5C,EAAW4C,GAAgB,OAAOA,EAAQ,EACpB,MAAtB5C,EAAW4C,IAA4C,MAA1B5C,EAAW4C,EAAQ,GAIpDA,GAAS,EAHPA,EAAQa,EAAuBzD,EAAY4C,EAAQ,EAAG,IAAK,CAAEc,mBAAmB,IAAQC,SAAW,CAHrG,MAFEf,GAAS,EAWb,OAAO5C,EAAWuB,MACpB,CA3BmDqC,CAA+B5D,EAAYwD,GAC5F,GAAIK,EAAuB7D,EAAYwD,GACrC,OA2BJ,SAAmCxD,EAAoBwD,GACrD,IAAMM,EAAQC,EAAe/D,EAAYwD,GACrCZ,EAAQY,EAAmBM,EAAMvC,OAErC,KAAOqB,EAAQ5C,EAAWuB,QAAQ,CAChC,GAAIvB,EAAWgE,WAAWF,EAAOlB,GAAQ,OAAOA,EAAQkB,EAAMvC,OACpC,MAAtBvB,EAAW4C,IAA4C,MAA1B5C,EAAW4C,EAAQ,GAI1B,MAAtB5C,EAAW4C,GAIfA,GAA+B,OAAtB5C,EAAW4C,GAAkB,EAAI,EAHxCA,EAAQa,EAAuBzD,EAAY4C,EAAQ,EAAG,IAAK,CAAEc,mBAAmB,IAASC,SAAW,EAJpGf,GAAS,CAQb,CAEA,OAAO5C,EAAWuB,MACpB,CA7CW0C,CAA0BjE,EAAYwD,GAE/C,IAAMzC,EAAchB,EAAQgB,YAC5BA,EAAYW,UAAY8B,EAAmB,EAC3C,IAAMnB,EAAQtB,EAAYuB,KAAKtC,GAC/B,OAAOqC,EAAQA,EAAMO,MAAQP,EAAM,GAAGd,OAASvB,EAAWuB,MAC5D,CAyCA,SAASwC,EAAe/D,EAAoBwD,GAAkC,IAAAU,EACtEC,EAAsBnE,EAAW+C,MAAMS,EAAkBA,EAAmB,GAClF,MAA4B,QAAxBW,GAAyD,QAAxBA,EAAsCA,EACxC,OAAnCD,EAAOlE,EAAWwD,IAAiBU,EAAI,EACzC,CAEA,SAASrB,EAAgC7C,EAAoBwD,GAC3D,IAAMY,EAASC,EAAsBrE,EAAYwD,GACjD,OAAOY,EAASZ,EAAmBY,EAAO7C,OAASiC,CACrD,CAEA,SAASa,EAAsBrE,EAAoBwD,GAA8C,IAAAc,EAC/F,GAAqC,MAAjCtE,EAAWwD,IAA8D,MAAjCxD,EAAWwD,GAAvD,CAEA,IADA,IAAIZ,EAAQY,EAAmB,EACxBZ,GAAS,GAAK,WAAW2B,YAAIC,EAACxE,EAAW4C,IAAM4B,EAAI,KAAG,CAAA,IAAAA,EAAE5B,GAAS,CAAE,CAE1E,IAAMwB,EAASpE,EAAW+C,MAAMH,EAAQ,EAAGY,GAC3C,GAAKY,GAAW,aAAaG,KAAKH,MAC9BxB,GAAS,GAAK,cAAc2B,KAAsB,OAAlBD,EAACtE,EAAW4C,IAAM0B,EAAI,KAE1D,OAAOF,CAR2F,CASpG,CAEA,SAASlB,EACPnD,EACAG,EACAF,EACAwD,EACAP,GAEA,OAAIA,EAAce,WAAW,KAW/B,SACEjE,EACAG,EACA+C,GAEA,IAAMwB,EAAwB,GAC1B7B,EAAQ,EAEZ,KAAOA,EAAQK,EAAc1B,OAAS,GACpC,GAA6B,OAAzB0B,EAAcL,GAIlB,GAA6B,MAAzBK,EAAcL,IAA+C,MAA7BK,EAAcL,EAAQ,GAa1DA,GAAS,MAbT,CACE,IAAM8B,EAAajB,EAAuBR,EAAeL,EAAQ,EAAG,IAAK,CAAEc,mBAAmB,IAC9Fe,EAAY3B,KACVhD,EACEC,EACA2E,EAAWC,QACX,CAAEnD,eAAe,GACjBtB,IAGJ0C,EAAQ8B,EAAWf,SAAW,CAEhC,MAfEf,GAAS,EAmBb,OAAO6B,EAAYtB,KAAK,KAC1B,CAxCWyB,CAAsC7E,EAASG,EAAyB+C,GAC7EY,EAAuB7D,EAAYwD,GAyCzC,SACEzD,EACAG,EACA+C,GAEA,IAAM4B,EAAcd,EAAed,EAAe,GAAG1B,OAC/CkD,EAAwB,GAC1B7B,EAAQiC,EAEZ,KAAOjC,EAAQK,EAAc1B,OAASsD,GACpC,GAA6B,MAAzB5B,EAAcL,IAA+C,MAA7BK,EAAcL,EAAQ,GAI1D,GAA6B,MAAzBK,EAAcL,GAalBA,GAAkC,OAAzBK,EAAcL,GAAkB,EAAI,MAb7C,CACE,IAAM8B,EAAajB,EAAuBR,EAAeL,EAAQ,EAAG,IAAK,CAAEc,mBAAmB,IAC9Fe,EAAY3B,KACVhD,EACEC,EACA2E,EAAWC,QACX,CAAEnD,eAAe,GACjBtB,IAGJ0C,EAAQ8B,EAAWf,SAAW,CAEhC,MAfEf,GAAS,EAmBb,OAAO6B,EAAYtB,KAAK,KAC1B,CAvEW2B,CAAiC/E,EAASG,EAAyB+C,GACrE,EACT,CAEA,SAASY,EAAuB7D,EAAoBwD,GAAmC,IAAAuB,EAAAC,EACrF,OAAuF,OAAvFD,EAA0D,OAA1DC,EAAOX,EAAsBrE,EAAYwD,SAAiB,EAAnDwB,EAAqDC,cAAc1B,SAAS,OAAIwB,CACzF,CAmEA,SAAStB,EACPzD,EACAkF,EACAC,EACAlF,GAKA,IAHA,IAAImF,EAAQ,EACRxC,EAAQsC,EAELtC,EAAQ5C,EAAWuB,QAAQ,CAChC,IAAM8D,EAAOrF,EAAW4C,GACxB,GAAa,MAATyC,GAAyB,MAATA,GAAyB,MAATA,EAIpC,GAAIpF,EAAQyD,mBAA2C,MAAtB1D,EAAW4C,IAA4C,MAA1B5C,EAAW4C,EAAQ,GAC/EA,EAAQ0C,EAAgCtF,EAAY4C,QAGtD,GAAI3C,EAAQyD,mBAA2C,MAAtB1D,EAAW4C,IAA4C,MAA1B5C,EAAW4C,EAAQ,GAC/EA,EAAQ2C,EAA2BvF,EAAY4C,QAGjD,GAAI3C,EAAQyD,mBAA8B,MAAT2B,EAC/BzC,EAAQ4C,EAA4BxF,EAAY4C,OADlD,CAKA,GADa,MAATyC,IAAcD,GAAS,GACvBC,IAASF,GAEG,KADdC,GAAS,GACQ,MAAO,CAAET,QAAS3E,EAAW+C,MAAMmC,EAAYtC,GAAQe,SAAUf,GAEpFA,GAAS,CANT,MAdEA,EAAQ6C,EAAezF,EAAY4C,EAqBvC,CAEA,MAAO,CAAE+B,QAAS3E,EAAW+C,MAAMmC,GAAavB,SAAU3D,EAAWuB,OACvE,CAEA,SAASkE,EAAezF,EAAoBkF,GAI1C,IAHA,IAAMpB,EAAQC,EAAe/D,EAAYkF,GACrCtC,EAAQsC,EAAapB,EAAMvC,OAExBqB,EAAQ5C,EAAWuB,QACxB,GAA0B,OAAtBvB,EAAW4C,GAAf,CAIA,GAAI5C,EAAWgE,WAAWF,EAAOlB,GAAQ,OAAOA,EAAQkB,EAAMvC,OAC9DqB,GAAS,CAFT,MAFEA,GAAS,EAOb,OAAOA,CACT,CAEA,SAAS4C,EAA4BxF,EAAoBkF,GAIvD,IAHA,IAAItC,EAAQsC,EAAa,EACrBQ,GAAmB,EAEhB9C,EAAQ5C,EAAWuB,QACxB,GAA0B,OAAtBvB,EAAW4C,GAAf,CAMA,GAF0B,MAAtB5C,EAAW4C,KAAgB8C,GAAmB,GACxB,MAAtB1F,EAAW4C,KAAgB8C,GAAmB,GACxB,MAAtB1F,EAAW4C,KAAmB8C,EAAkB,CAElD,IADA9C,GAAS,EACF,WAAW2B,KAAsB,OAAlBoB,EAAC3F,EAAW4C,IAAM+C,EAAI,KAAG,CAAA,IAAAA,EAAE/C,GAAS,CAAE,CAC5D,OAAOA,CACT,CACA,GAA0B,OAAtB5C,EAAW4C,GAAiB,OAAOsC,EAAa,EACpDtC,GAAS,CATT,MAFEA,GAAS,EAcb,OAAOsC,EAAa,CACtB,CAEA,SAASI,EAAgCtF,EAAoBkF,GAC3D,IAAMU,EAAe5F,EAAW6F,QAAQ,KAAMX,EAAa,GAC3D,OAAwB,IAAjBU,EAAsB5F,EAAWuB,OAASqE,CACnD,CAEA,SAASL,EAA2BvF,EAAoBkF,GACtD,IAAMvB,EAAW3D,EAAW6F,QAAQ,KAAMX,EAAa,GACvD,OAAoB,IAAbvB,EAAkB3D,EAAWuB,OAASoC,EAAW,CAC1D,8CA5VO,SAA8C5D,EAA4BC,GAC/E,OAAOF,EAA0CC,EAASC,EAAY,CAAEwB,eAAe,GACzF,qCAPO,SAAoCzB,EAA4BC,GACrE,OAAOF,EAA0CC,EAASC,EAAY,CAAEwB,eAAe,GACzF"} | ||
| {"version":3,"file":"removeCommentsInSourceCode.cjs","names":[],"sources":["../../src/helpers/removeCommentsInSourceCode.ts"],"sourcesContent":["import type { LanguageDefinition } from '../types/language.js';\n\nexport type SourceCodeGrammar = NonNullable<LanguageDefinition['grammer']>;\n\n/** Removes comments from source code according to the provided language grammar. */\nexport function removeCommentsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: false });\n}\n\n/** Removes comments and string literal contents while preserving executable interpolation expressions. */\nexport function removeCommentsAndStringsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: true });\n}\n\ninterface CommentOrStringGrammar {\n closeRegExp: RegExp;\n isComment: boolean;\n openRegExp: RegExp;\n}\n\nfunction removeCommentsAndMaybeStringsInSourceCode(\n grammar: SourceCodeGrammar,\n sourceCode: string,\n options: { removeStrings: boolean },\n commentOrStringGrammars = compileCommentOrStringGrammars(grammar)\n): string {\n if (!grammar.comments?.length && (!options.removeStrings || !grammar.strings?.length)) return sourceCode;\n\n const newSourceCodeSlices: string[] = [];\n\n let lastIndex = 0;\n\n while (lastIndex < sourceCode.length) {\n let first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined;\n\n for (const commentOrStringGrammer of commentOrStringGrammars) {\n const startRegExp = commentOrStringGrammer.openRegExp;\n startRegExp.lastIndex = lastIndex;\n\n const match = startRegExp.exec(sourceCode);\n\n if (match && shouldPreferMatch(match, commentOrStringGrammer, first, options)) {\n first = { grammar: commentOrStringGrammer, match };\n }\n }\n\n if (first) {\n let stringPrefixStartIndex = first.match.index;\n if (!first.grammar.isComment && options.removeStrings) {\n stringPrefixStartIndex = getPythonStringPrefixStartIndex(sourceCode, first.match.index);\n }\n newSourceCodeSlices.push(sourceCode.slice(lastIndex, stringPrefixStartIndex));\n\n if (!first.grammar.isComment) {\n lastIndex = findStringEndIndex(sourceCode, first.match.index, first.grammar);\n const stringLiteral = sourceCode.slice(first.match.index, lastIndex);\n if (options.removeStrings) {\n newSourceCodeSlices.push(\n preserveStringInterpolationExpressions(\n grammar,\n commentOrStringGrammars,\n sourceCode,\n first.match.index,\n stringLiteral\n )\n );\n } else {\n newSourceCodeSlices.push(stringLiteral);\n }\n } else {\n const closeRegExp = first.grammar.closeRegExp;\n closeRegExp.lastIndex = first.match.index + first.match[0].length;\n\n const match = closeRegExp.exec(sourceCode);\n\n lastIndex = match ? match.index + match[0].length : sourceCode.length;\n }\n } else {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex));\n lastIndex = sourceCode.length;\n }\n }\n\n return newSourceCodeSlices.join('');\n}\n\nfunction compileCommentOrStringGrammars(grammar: SourceCodeGrammar): readonly CommentOrStringGrammar[] {\n return [\n ...(grammar.comments?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close ?? /(?=\\n)/g),\n isComment: true,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ...(grammar.strings?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close),\n isComment: false,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ] satisfies CommentOrStringGrammar[];\n}\n\nfunction shouldPreferMatch(\n match: RegExpExecArray,\n grammar: CommentOrStringGrammar,\n first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined,\n options: { removeStrings: boolean }\n): boolean {\n if (!first) return true;\n if (match.index < first.match.index) return true;\n if (match.index > first.match.index) return false;\n return options.removeStrings && first.grammar.isComment && !grammar.isComment;\n}\n\nfunction makeGlobalRegExp(regExp: RegExp): RegExp {\n return new RegExp(regExp, regExp.flags.includes('g') ? regExp.flags : `${regExp.flags}g`);\n}\n\nfunction findStringEndIndex(sourceCode: string, stringStartIndex: number, grammar: CommentOrStringGrammar): number {\n if (sourceCode[stringStartIndex] === '`') return findJavaScriptTemplateEndIndex(sourceCode, stringStartIndex);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return findPythonFStringEndIndex(sourceCode, stringStartIndex);\n\n const closeRegExp = grammar.closeRegExp;\n closeRegExp.lastIndex = stringStartIndex + 1;\n const match = closeRegExp.exec(sourceCode);\n return match ? match.index + match[0].length : sourceCode.length;\n}\n\nfunction findJavaScriptTemplateEndIndex(sourceCode: string, stringStartIndex: number): number {\n let index = stringStartIndex + 1;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '`') return index + 1;\n if (sourceCode[index] === '$' && sourceCode[index + 1] === '{') {\n index = readBalancedExpression(sourceCode, index + 2, '}', { slashStartsRegExp: true }).endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return sourceCode.length;\n}\n\nfunction findPythonFStringEndIndex(sourceCode: string, stringStartIndex: number): number {\n const quote = getStringQuote(sourceCode, stringStartIndex);\n let index = stringStartIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n if (sourceCode[index] === '{' && sourceCode[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '{') {\n index = readBalancedExpression(sourceCode, index + 1, '}', { slashStartsRegExp: false }).endIndex + 1;\n continue;\n }\n index += sourceCode[index] === '\\\\' ? 2 : 1;\n }\n\n return sourceCode.length;\n}\n\nfunction getStringQuote(sourceCode: string, stringStartIndex: number): string {\n const threeCharacterQuote = sourceCode.slice(stringStartIndex, stringStartIndex + 3);\n if (threeCharacterQuote === \"'''\" || threeCharacterQuote === '\"\"\"') return threeCharacterQuote;\n return sourceCode[stringStartIndex] ?? '';\n}\n\nfunction getPythonStringPrefixStartIndex(sourceCode: string, stringStartIndex: number): number {\n const prefix = getPythonStringPrefix(sourceCode, stringStartIndex);\n return prefix ? stringStartIndex - prefix.length : stringStartIndex;\n}\n\nfunction getPythonStringPrefix(sourceCode: string, stringStartIndex: number): string | undefined {\n if (sourceCode[stringStartIndex] !== '\"' && sourceCode[stringStartIndex] !== \"'\") return undefined;\n let index = stringStartIndex - 1;\n while (index >= 0 && /[A-Za-z]/.test(sourceCode[index] ?? '')) index -= 1;\n\n const prefix = sourceCode.slice(index + 1, stringStartIndex);\n if (!prefix || !/^[bfru]+$/i.test(prefix)) return undefined;\n if (index >= 0 && /[\\dA-Za-z_]/.test(sourceCode[index] ?? '')) return undefined;\n\n return prefix;\n}\n\nfunction preserveStringInterpolationExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n sourceCode: string,\n stringStartIndex: number,\n stringLiteral: string\n): string {\n if (stringLiteral.startsWith('`'))\n return preserveJavaScriptTemplateExpressions(grammar, commentOrStringGrammars, stringLiteral);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return preservePythonFStringExpressions(grammar, commentOrStringGrammars, stringLiteral);\n return '';\n}\n\nfunction hasPythonFStringPrefix(sourceCode: string, stringStartIndex: number): boolean {\n return getPythonStringPrefix(sourceCode, stringStartIndex)?.toLowerCase().includes('f') ?? false;\n}\n\nfunction preserveJavaScriptTemplateExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const expressions: string[] = [];\n let index = 1;\n\n while (index < stringLiteral.length - 1) {\n if (stringLiteral[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '$' && stringLiteral[index + 1] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 2, '}', { slashStartsRegExp: true });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction preservePythonFStringExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const quoteLength = getStringQuote(stringLiteral, 0).length;\n const expressions: string[] = [];\n let index = quoteLength;\n\n while (index < stringLiteral.length - quoteLength) {\n if (stringLiteral[index] === '{' && stringLiteral[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 1, '}', { slashStartsRegExp: false });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += stringLiteral[index] === '\\\\' ? 2 : 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction readBalancedExpression(\n sourceCode: string,\n startIndex: number,\n closeChar: string,\n options: { slashStartsRegExp: boolean }\n): { content: string; endIndex: number } {\n let depth = 1;\n let index = startIndex;\n\n while (index < sourceCode.length) {\n const char = sourceCode[index];\n if (char === '\"' || char === \"'\" || char === '`') {\n index = skipQuotedSpan(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '/') {\n index = skipJavaScriptSingleLineComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '*') {\n index = skipJavaScriptBlockComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && char === '/') {\n index = skipJavaScriptRegExpLiteral(sourceCode, index);\n continue;\n }\n if (char === '{') depth += 1;\n if (char === closeChar) {\n depth -= 1;\n if (depth === 0) return { content: sourceCode.slice(startIndex, index), endIndex: index };\n }\n index += 1;\n }\n\n return { content: sourceCode.slice(startIndex), endIndex: sourceCode.length };\n}\n\nfunction skipQuotedSpan(sourceCode: string, startIndex: number): number {\n const quote = getStringQuote(sourceCode, startIndex);\n let index = startIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n index += 1;\n }\n\n return index;\n}\n\nfunction skipJavaScriptRegExpLiteral(sourceCode: string, startIndex: number): number {\n let index = startIndex + 1;\n let inCharacterClass = false;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '[') inCharacterClass = true;\n if (sourceCode[index] === ']') inCharacterClass = false;\n if (sourceCode[index] === '/' && !inCharacterClass) {\n index += 1;\n while (/[A-Za-z]/.test(sourceCode[index] ?? '')) index += 1;\n return index;\n }\n if (sourceCode[index] === '\\n') return startIndex + 1;\n index += 1;\n }\n\n return startIndex + 1;\n}\n\nfunction skipJavaScriptSingleLineComment(sourceCode: string, startIndex: number): number {\n const newLineIndex = sourceCode.indexOf('\\n', startIndex + 2);\n return newLineIndex === -1 ? sourceCode.length : newLineIndex;\n}\n\nfunction skipJavaScriptBlockComment(sourceCode: string, startIndex: number): number {\n const endIndex = sourceCode.indexOf('*/', startIndex + 2);\n return endIndex === -1 ? sourceCode.length : endIndex + 2;\n}\n"],"mappings":"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"} |
@@ -1,2 +0,6 @@ | ||
| import{createForOfIteratorHelper as e,toConsumableArray as n}from"../_virtual/_rollupPluginBabelHelpers.js";function r(e,n){return l(e,n,{removeStrings:!1})}function t(e,n){return l(e,n,{removeStrings:!0})}function l(r,t,l,o){var f,c;if(void 0===o&&(o=function(e){var r,t,l,i;return[].concat(n(null!=(r=null==(t=e.comments)?void 0:t.map(function(e){var n;return{closeRegExp:s(null!=(n=e.close)?n:/(?=\n)/g),isComment:!0,openRegExp:s(e.open)}}))?r:[]),n(null!=(l=null==(i=e.strings)?void 0:i.map(function(e){return{closeRegExp:s(e.close),isComment:!1,openRegExp:s(e.open)}}))?l:[]))}(r)),!(null!=(f=r.comments)&&f.length||l.removeStrings&&null!=(c=r.strings)&&c.length))return t;for(var h=[],m=0;m<t.length;){var v,x=void 0,d=e(o);try{for(d.s();!(v=d.n()).done;){var p=v.value,E=p.openRegExp;E.lastIndex=m;var R=E.exec(t);R&&i(R,p,x,l)&&(x={grammar:p,match:R})}}catch(e){d.e(e)}finally{d.f()}if(x){var S=x.match.index;if(!x.grammar.isComment&&l.removeStrings&&(S=u(t,x.match.index)),h.push(t.slice(m,S)),x.grammar.isComment){var I=x.grammar.closeRegExp;I.lastIndex=x.match.index+x.match[0].length;var C=I.exec(t);m=C?C.index+C[0].length:t.length}else{m=a(t,x.match.index,x.grammar);var j=t.slice(x.match.index,m);l.removeStrings?h.push(g(r,o,t,x.match.index,j)):h.push(j)}}else h.push(t.slice(m)),m=t.length}return h.join("")}function i(e,n,r,t){return!r||(e.index<r.match.index||!(e.index>r.match.index)&&(t.removeStrings&&r.grammar.isComment&&!n.isComment))}function s(e){return new RegExp(e,e.flags.includes("g")?e.flags:"".concat(e.flags,"g"))}function a(e,n,r){if("`"===e[n])return function(e,n){var r=n+1;for(;r<e.length;)if("\\"!==e[r]){if("`"===e[r])return r+1;"$"!==e[r]||"{"!==e[r+1]?r+=1:r=h(e,r+2,"}",{slashStartsRegExp:!0}).endIndex+1}else r+=2;return e.length}(e,n);if(c(e,n))return function(e,n){var r=o(e,n),t=n+r.length;for(;t<e.length;){if(e.startsWith(r,t))return t+r.length;"{"!==e[t]||"{"!==e[t+1]?"{"!==e[t]?t+="\\"===e[t]?2:1:t=h(e,t+1,"}",{slashStartsRegExp:!1}).endIndex+1:t+=2}return e.length}(e,n);var t=r.closeRegExp;t.lastIndex=n+1;var l=t.exec(e);return l?l.index+l[0].length:e.length}function o(e,n){var r,t=e.slice(n,n+3);return"'''"===t||'"""'===t?t:null!=(r=e[n])?r:""}function u(e,n){var r=f(e,n);return r?n-r.length:n}function f(e,n){var r;if('"'===e[n]||"'"===e[n]){for(var t=n-1;t>=0&&/[A-Za-z]/.test(null!=(l=e[t])?l:"");){var l;t-=1}var i=e.slice(t+1,n);if(i&&/^[bfru]+$/i.test(i)&&!(t>=0&&/[\dA-Za-z_]/.test(null!=(r=e[t])?r:"")))return i}}function g(e,n,r,t,i){return i.startsWith("`")?function(e,n,r){var t=[],i=1;for(;i<r.length-1;)if("\\"!==r[i])if("$"!==r[i]||"{"!==r[i+1])i+=1;else{var s=h(r,i+2,"}",{slashStartsRegExp:!0});t.push(l(e,s.content,{removeStrings:!0},n)),i=s.endIndex+1}else i+=2;return t.join("\n")}(e,n,i):c(r,t)?function(e,n,r){var t=o(r,0).length,i=[],s=t;for(;s<r.length-t;)if("{"!==r[s]||"{"!==r[s+1])if("{"!==r[s])s+="\\"===r[s]?2:1;else{var a=h(r,s+1,"}",{slashStartsRegExp:!1});i.push(l(e,a.content,{removeStrings:!0},n)),s=a.endIndex+1}else s+=2;return i.join("\n")}(e,n,i):""}function c(e,n){var r,t;return null!=(r=null==(t=f(e,n))?void 0:t.toLowerCase().includes("f"))&&r}function h(e,n,r,t){for(var l=1,i=n;i<e.length;){var s=e[i];if('"'!==s&&"'"!==s&&"`"!==s)if(t.slashStartsRegExp&&"/"===e[i]&&"/"===e[i+1])i=x(e,i);else if(t.slashStartsRegExp&&"/"===e[i]&&"*"===e[i+1])i=d(e,i);else if(t.slashStartsRegExp&&"/"===s)i=v(e,i);else{if("{"===s&&(l+=1),s===r&&0===(l-=1))return{content:e.slice(n,i),endIndex:i};i+=1}else i=m(e,i)}return{content:e.slice(n),endIndex:e.length}}function m(e,n){for(var r=o(e,n),t=n+r.length;t<e.length;)if("\\"!==e[t]){if(e.startsWith(r,t))return t+r.length;t+=1}else t+=2;return t}function v(e,n){for(var r=n+1,t=!1;r<e.length;)if("\\"!==e[r]){if("["===e[r]&&(t=!0),"]"===e[r]&&(t=!1),"/"===e[r]&&!t){for(r+=1;/[A-Za-z]/.test(null!=(l=e[r])?l:"");){var l;r+=1}return r}if("\n"===e[r])return n+1;r+=1}else r+=2;return n+1}function x(e,n){var r=e.indexOf("\n",n+2);return-1===r?e.length:r}function d(e,n){var r=e.indexOf("*/",n+2);return-1===r?e.length:r+2}export{t as removeCommentsAndStringsInSourceCode,r as removeCommentsInSourceCode}; | ||
| //# sourceMappingURL=removeCommentsInSourceCode.js.map | ||
| function e(e,t){return n(e,t,{removeStrings:!1})}function t(e,t){return n(e,t,{removeStrings:!0})}function n(e,t,n,a=r(e)){if(!e.comments?.length&&(!n.removeStrings||!e.strings?.length))return t;let s=[],c=0;for(;c<t.length;){let r;for(let e of a){let a=e.openRegExp;a.lastIndex=c;let o=a.exec(t);o&&i(o,e,r,n)&&(r={grammar:e,match:o})}if(r){let i=r.match.index;if(!r.grammar.isComment&&n.removeStrings&&(i=u(t,r.match.index)),s.push(t.slice(c,i)),r.grammar.isComment){let e=r.grammar.closeRegExp;e.lastIndex=r.match.index+r.match[0].length;let n=e.exec(t);c=n?n.index+n[0].length:t.length}else{c=o(t,r.match.index,r.grammar);let i=t.slice(r.match.index,c);n.removeStrings?s.push(f(e,a,t,r.match.index,i)):s.push(i)}}else s.push(t.slice(c)),c=t.length}return s.join(``)}function r(e){return[...e.comments?.map(e=>({closeRegExp:a(e.close??/(?=\n)/g),isComment:!0,openRegExp:a(e.open)}))??[],...e.strings?.map(e=>({closeRegExp:a(e.close),isComment:!1,openRegExp:a(e.open)}))??[]]}function i(e,t,n,r){return!n||e.index<n.match.index?!0:e.index>n.match.index?!1:r.removeStrings&&n.grammar.isComment&&!t.isComment}function a(e){return new RegExp(e,e.flags.includes(`g`)?e.flags:`${e.flags}g`)}function o(e,t,n){if(e[t]==="`")return s(e,t);if(p(e,t))return c(e,t);let r=n.closeRegExp;r.lastIndex=t+1;let i=r.exec(e);return i?i.index+i[0].length:e.length}function s(e,t){let n=t+1;for(;n<e.length;){if(e[n]===`\\`){n+=2;continue}if(e[n]==="`")return n+1;if(e[n]===`$`&&e[n+1]===`{`){n=g(e,n+2,`}`,{slashStartsRegExp:!0}).endIndex+1;continue}n+=1}return e.length}function c(e,t){let n=l(e,t),r=t+n.length;for(;r<e.length;){if(e.startsWith(n,r))return r+n.length;if(e[r]===`{`&&e[r+1]===`{`){r+=2;continue}if(e[r]===`{`){r=g(e,r+1,`}`,{slashStartsRegExp:!1}).endIndex+1;continue}r+=e[r]===`\\`?2:1}return e.length}function l(e,t){let n=e.slice(t,t+3);return n===`'''`||n===`"""`?n:e[t]??``}function u(e,t){let n=d(e,t);return n?t-n.length:t}function d(e,t){if(e[t]!==`"`&&e[t]!==`'`)return;let n=t-1;for(;n>=0&&/[A-Za-z]/.test(e[n]??``);)--n;let r=e.slice(n+1,t);if(!(!r||!/^[bfru]+$/i.test(r))&&!(n>=0&&/[\dA-Za-z_]/.test(e[n]??``)))return r}function f(e,t,n,r,i){return i.startsWith("`")?m(e,t,i):p(n,r)?h(e,t,i):``}function p(e,t){return d(e,t)?.toLowerCase().includes(`f`)??!1}function m(e,t,r){let i=[],a=1;for(;a<r.length-1;){if(r[a]===`\\`){a+=2;continue}if(r[a]===`$`&&r[a+1]===`{`){let o=g(r,a+2,`}`,{slashStartsRegExp:!0});i.push(n(e,o.content,{removeStrings:!0},t)),a=o.endIndex+1;continue}a+=1}return i.join(` | ||
| `)}function h(e,t,r){let i=l(r,0).length,a=[],o=i;for(;o<r.length-i;){if(r[o]===`{`&&r[o+1]===`{`){o+=2;continue}if(r[o]===`{`){let i=g(r,o+1,`}`,{slashStartsRegExp:!1});a.push(n(e,i.content,{removeStrings:!0},t)),o=i.endIndex+1;continue}o+=r[o]===`\\`?2:1}return a.join(` | ||
| `)}function g(e,t,n,r){let i=1,a=t;for(;a<e.length;){let o=e[a];if(o===`"`||o===`'`||o==="`"){a=_(e,a);continue}if(r.slashStartsRegExp&&e[a]===`/`&&e[a+1]===`/`){a=y(e,a);continue}if(r.slashStartsRegExp&&e[a]===`/`&&e[a+1]===`*`){a=b(e,a);continue}if(r.slashStartsRegExp&&o===`/`){a=v(e,a);continue}if(o===`{`&&(i+=1),o===n&&(--i,i===0))return{content:e.slice(t,a),endIndex:a};a+=1}return{content:e.slice(t),endIndex:e.length}}function _(e,t){let n=l(e,t),r=t+n.length;for(;r<e.length;){if(e[r]===`\\`){r+=2;continue}if(e.startsWith(n,r))return r+n.length;r+=1}return r}function v(e,t){let n=t+1,r=!1;for(;n<e.length;){if(e[n]===`\\`){n+=2;continue}if(e[n]===`[`&&(r=!0),e[n]===`]`&&(r=!1),e[n]===`/`&&!r){for(n+=1;/[A-Za-z]/.test(e[n]??``);)n+=1;return n}if(e[n]===` | ||
| `)return t+1;n+=1}return t+1}function y(e,t){let n=e.indexOf(` | ||
| `,t+2);return n===-1?e.length:n}function b(e,t){let n=e.indexOf(`*/`,t+2);return n===-1?e.length:n+2}export{t as removeCommentsAndStringsInSourceCode,e as removeCommentsInSourceCode}; | ||
| //# sourceMappingURL=removeCommentsInSourceCode.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"removeCommentsInSourceCode.js","sources":["../../src/helpers/removeCommentsInSourceCode.ts"],"sourcesContent":["import type { LanguageDefinition } from '../types/language.js';\n\nexport type SourceCodeGrammar = NonNullable<LanguageDefinition['grammer']>;\n\n/** Removes comments from source code according to the provided language grammar. */\nexport function removeCommentsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: false });\n}\n\n/** Removes comments and string literal contents while preserving executable interpolation expressions. */\nexport function removeCommentsAndStringsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: true });\n}\n\ninterface CommentOrStringGrammar {\n closeRegExp: RegExp;\n isComment: boolean;\n openRegExp: RegExp;\n}\n\nfunction removeCommentsAndMaybeStringsInSourceCode(\n grammar: SourceCodeGrammar,\n sourceCode: string,\n options: { removeStrings: boolean },\n commentOrStringGrammars = compileCommentOrStringGrammars(grammar)\n): string {\n if (!grammar.comments?.length && (!options.removeStrings || !grammar.strings?.length)) return sourceCode;\n\n const newSourceCodeSlices: string[] = [];\n\n let lastIndex = 0;\n\n while (lastIndex < sourceCode.length) {\n let first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined;\n\n for (const commentOrStringGrammer of commentOrStringGrammars) {\n const startRegExp = commentOrStringGrammer.openRegExp;\n startRegExp.lastIndex = lastIndex;\n\n const match = startRegExp.exec(sourceCode);\n\n if (match && shouldPreferMatch(match, commentOrStringGrammer, first, options)) {\n first = { grammar: commentOrStringGrammer, match };\n }\n }\n\n if (first) {\n let stringPrefixStartIndex = first.match.index;\n if (!first.grammar.isComment && options.removeStrings) {\n stringPrefixStartIndex = getPythonStringPrefixStartIndex(sourceCode, first.match.index);\n }\n newSourceCodeSlices.push(sourceCode.slice(lastIndex, stringPrefixStartIndex));\n\n if (!first.grammar.isComment) {\n lastIndex = findStringEndIndex(sourceCode, first.match.index, first.grammar);\n const stringLiteral = sourceCode.slice(first.match.index, lastIndex);\n if (options.removeStrings) {\n newSourceCodeSlices.push(\n preserveStringInterpolationExpressions(\n grammar,\n commentOrStringGrammars,\n sourceCode,\n first.match.index,\n stringLiteral\n )\n );\n } else {\n newSourceCodeSlices.push(stringLiteral);\n }\n } else {\n const closeRegExp = first.grammar.closeRegExp;\n closeRegExp.lastIndex = first.match.index + first.match[0].length;\n\n const match = closeRegExp.exec(sourceCode);\n\n lastIndex = match ? match.index + match[0].length : sourceCode.length;\n }\n } else {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex));\n lastIndex = sourceCode.length;\n }\n }\n\n return newSourceCodeSlices.join('');\n}\n\nfunction compileCommentOrStringGrammars(grammar: SourceCodeGrammar): readonly CommentOrStringGrammar[] {\n return [\n ...(grammar.comments?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close ?? /(?=\\n)/g),\n isComment: true,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ...(grammar.strings?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close),\n isComment: false,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ] satisfies CommentOrStringGrammar[];\n}\n\nfunction shouldPreferMatch(\n match: RegExpExecArray,\n grammar: CommentOrStringGrammar,\n first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined,\n options: { removeStrings: boolean }\n): boolean {\n if (!first) return true;\n if (match.index < first.match.index) return true;\n if (match.index > first.match.index) return false;\n return options.removeStrings && first.grammar.isComment && !grammar.isComment;\n}\n\nfunction makeGlobalRegExp(regExp: RegExp): RegExp {\n return new RegExp(regExp, regExp.flags.includes('g') ? regExp.flags : `${regExp.flags}g`);\n}\n\nfunction findStringEndIndex(sourceCode: string, stringStartIndex: number, grammar: CommentOrStringGrammar): number {\n if (sourceCode[stringStartIndex] === '`') return findJavaScriptTemplateEndIndex(sourceCode, stringStartIndex);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return findPythonFStringEndIndex(sourceCode, stringStartIndex);\n\n const closeRegExp = grammar.closeRegExp;\n closeRegExp.lastIndex = stringStartIndex + 1;\n const match = closeRegExp.exec(sourceCode);\n return match ? match.index + match[0].length : sourceCode.length;\n}\n\nfunction findJavaScriptTemplateEndIndex(sourceCode: string, stringStartIndex: number): number {\n let index = stringStartIndex + 1;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '`') return index + 1;\n if (sourceCode[index] === '$' && sourceCode[index + 1] === '{') {\n index = readBalancedExpression(sourceCode, index + 2, '}', { slashStartsRegExp: true }).endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return sourceCode.length;\n}\n\nfunction findPythonFStringEndIndex(sourceCode: string, stringStartIndex: number): number {\n const quote = getStringQuote(sourceCode, stringStartIndex);\n let index = stringStartIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n if (sourceCode[index] === '{' && sourceCode[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '{') {\n index = readBalancedExpression(sourceCode, index + 1, '}', { slashStartsRegExp: false }).endIndex + 1;\n continue;\n }\n index += sourceCode[index] === '\\\\' ? 2 : 1;\n }\n\n return sourceCode.length;\n}\n\nfunction getStringQuote(sourceCode: string, stringStartIndex: number): string {\n const threeCharacterQuote = sourceCode.slice(stringStartIndex, stringStartIndex + 3);\n if (threeCharacterQuote === \"'''\" || threeCharacterQuote === '\"\"\"') return threeCharacterQuote;\n return sourceCode[stringStartIndex] ?? '';\n}\n\nfunction getPythonStringPrefixStartIndex(sourceCode: string, stringStartIndex: number): number {\n const prefix = getPythonStringPrefix(sourceCode, stringStartIndex);\n return prefix ? stringStartIndex - prefix.length : stringStartIndex;\n}\n\nfunction getPythonStringPrefix(sourceCode: string, stringStartIndex: number): string | undefined {\n if (sourceCode[stringStartIndex] !== '\"' && sourceCode[stringStartIndex] !== \"'\") return undefined;\n let index = stringStartIndex - 1;\n while (index >= 0 && /[A-Za-z]/.test(sourceCode[index] ?? '')) index -= 1;\n\n const prefix = sourceCode.slice(index + 1, stringStartIndex);\n if (!prefix || !/^[bfru]+$/i.test(prefix)) return undefined;\n if (index >= 0 && /[\\dA-Za-z_]/.test(sourceCode[index] ?? '')) return undefined;\n\n return prefix;\n}\n\nfunction preserveStringInterpolationExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n sourceCode: string,\n stringStartIndex: number,\n stringLiteral: string\n): string {\n if (stringLiteral.startsWith('`'))\n return preserveJavaScriptTemplateExpressions(grammar, commentOrStringGrammars, stringLiteral);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return preservePythonFStringExpressions(grammar, commentOrStringGrammars, stringLiteral);\n return '';\n}\n\nfunction hasPythonFStringPrefix(sourceCode: string, stringStartIndex: number): boolean {\n return getPythonStringPrefix(sourceCode, stringStartIndex)?.toLowerCase().includes('f') ?? false;\n}\n\nfunction preserveJavaScriptTemplateExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const expressions: string[] = [];\n let index = 1;\n\n while (index < stringLiteral.length - 1) {\n if (stringLiteral[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '$' && stringLiteral[index + 1] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 2, '}', { slashStartsRegExp: true });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction preservePythonFStringExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const quoteLength = getStringQuote(stringLiteral, 0).length;\n const expressions: string[] = [];\n let index = quoteLength;\n\n while (index < stringLiteral.length - quoteLength) {\n if (stringLiteral[index] === '{' && stringLiteral[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 1, '}', { slashStartsRegExp: false });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += stringLiteral[index] === '\\\\' ? 2 : 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction readBalancedExpression(\n sourceCode: string,\n startIndex: number,\n closeChar: string,\n options: { slashStartsRegExp: boolean }\n): { content: string; endIndex: number } {\n let depth = 1;\n let index = startIndex;\n\n while (index < sourceCode.length) {\n const char = sourceCode[index];\n if (char === '\"' || char === \"'\" || char === '`') {\n index = skipQuotedSpan(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '/') {\n index = skipJavaScriptSingleLineComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '*') {\n index = skipJavaScriptBlockComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && char === '/') {\n index = skipJavaScriptRegExpLiteral(sourceCode, index);\n continue;\n }\n if (char === '{') depth += 1;\n if (char === closeChar) {\n depth -= 1;\n if (depth === 0) return { content: sourceCode.slice(startIndex, index), endIndex: index };\n }\n index += 1;\n }\n\n return { content: sourceCode.slice(startIndex), endIndex: sourceCode.length };\n}\n\nfunction skipQuotedSpan(sourceCode: string, startIndex: number): number {\n const quote = getStringQuote(sourceCode, startIndex);\n let index = startIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n index += 1;\n }\n\n return index;\n}\n\nfunction skipJavaScriptRegExpLiteral(sourceCode: string, startIndex: number): number {\n let index = startIndex + 1;\n let inCharacterClass = false;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '[') inCharacterClass = true;\n if (sourceCode[index] === ']') inCharacterClass = false;\n if (sourceCode[index] === '/' && !inCharacterClass) {\n index += 1;\n while (/[A-Za-z]/.test(sourceCode[index] ?? '')) index += 1;\n return index;\n }\n if (sourceCode[index] === '\\n') return startIndex + 1;\n index += 1;\n }\n\n return startIndex + 1;\n}\n\nfunction skipJavaScriptSingleLineComment(sourceCode: string, startIndex: number): number {\n const newLineIndex = sourceCode.indexOf('\\n', startIndex + 2);\n return newLineIndex === -1 ? sourceCode.length : newLineIndex;\n}\n\nfunction skipJavaScriptBlockComment(sourceCode: string, startIndex: number): number {\n const endIndex = sourceCode.indexOf('*/', startIndex + 2);\n return endIndex === -1 ? sourceCode.length : endIndex + 2;\n}\n"],"names":["removeCommentsInSourceCode","grammar","sourceCode","removeCommentsAndMaybeStringsInSourceCode","removeStrings","removeCommentsAndStringsInSourceCode","options","commentOrStringGrammars","_grammar$comments","_grammar$strings","_grammar$comments$map","_grammar$comments2","_grammar$strings$map","_grammar$strings2","concat","_toConsumableArray","comments","map","v","_v$close","closeRegExp","makeGlobalRegExp","close","isComment","openRegExp","open","strings","compileCommentOrStringGrammars","length","newSourceCodeSlices","lastIndex","_step","first","_iterator","_createForOfIteratorHelper","s","n","done","commentOrStringGrammer","value","startRegExp","match","exec","shouldPreferMatch","err","e","f","stringPrefixStartIndex","index","getPythonStringPrefixStartIndex","push","slice","findStringEndIndex","stringLiteral","preserveStringInterpolationExpressions","join","regExp","RegExp","flags","includes","stringStartIndex","readBalancedExpression","slashStartsRegExp","endIndex","findJavaScriptTemplateEndIndex","hasPythonFStringPrefix","quote","getStringQuote","startsWith","findPythonFStringEndIndex","_sourceCode$stringSta","threeCharacterQuote","prefix","getPythonStringPrefix","_sourceCode$index2","test","_sourceCode$index","expressions","expression","content","preserveJavaScriptTemplateExpressions","quoteLength","preservePythonFStringExpressions","_getPythonStringPrefi","_getPythonStringPrefi2","toLowerCase","startIndex","closeChar","depth","char","skipJavaScriptSingleLineComment","skipJavaScriptBlockComment","skipJavaScriptRegExpLiteral","skipQuotedSpan","inCharacterClass","_sourceCode$index3","newLineIndex","indexOf"],"mappings":"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"} | ||
| {"version":3,"file":"removeCommentsInSourceCode.js","names":[],"sources":["../../src/helpers/removeCommentsInSourceCode.ts"],"sourcesContent":["import type { LanguageDefinition } from '../types/language.js';\n\nexport type SourceCodeGrammar = NonNullable<LanguageDefinition['grammer']>;\n\n/** Removes comments from source code according to the provided language grammar. */\nexport function removeCommentsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: false });\n}\n\n/** Removes comments and string literal contents while preserving executable interpolation expressions. */\nexport function removeCommentsAndStringsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: true });\n}\n\ninterface CommentOrStringGrammar {\n closeRegExp: RegExp;\n isComment: boolean;\n openRegExp: RegExp;\n}\n\nfunction removeCommentsAndMaybeStringsInSourceCode(\n grammar: SourceCodeGrammar,\n sourceCode: string,\n options: { removeStrings: boolean },\n commentOrStringGrammars = compileCommentOrStringGrammars(grammar)\n): string {\n if (!grammar.comments?.length && (!options.removeStrings || !grammar.strings?.length)) return sourceCode;\n\n const newSourceCodeSlices: string[] = [];\n\n let lastIndex = 0;\n\n while (lastIndex < sourceCode.length) {\n let first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined;\n\n for (const commentOrStringGrammer of commentOrStringGrammars) {\n const startRegExp = commentOrStringGrammer.openRegExp;\n startRegExp.lastIndex = lastIndex;\n\n const match = startRegExp.exec(sourceCode);\n\n if (match && shouldPreferMatch(match, commentOrStringGrammer, first, options)) {\n first = { grammar: commentOrStringGrammer, match };\n }\n }\n\n if (first) {\n let stringPrefixStartIndex = first.match.index;\n if (!first.grammar.isComment && options.removeStrings) {\n stringPrefixStartIndex = getPythonStringPrefixStartIndex(sourceCode, first.match.index);\n }\n newSourceCodeSlices.push(sourceCode.slice(lastIndex, stringPrefixStartIndex));\n\n if (!first.grammar.isComment) {\n lastIndex = findStringEndIndex(sourceCode, first.match.index, first.grammar);\n const stringLiteral = sourceCode.slice(first.match.index, lastIndex);\n if (options.removeStrings) {\n newSourceCodeSlices.push(\n preserveStringInterpolationExpressions(\n grammar,\n commentOrStringGrammars,\n sourceCode,\n first.match.index,\n stringLiteral\n )\n );\n } else {\n newSourceCodeSlices.push(stringLiteral);\n }\n } else {\n const closeRegExp = first.grammar.closeRegExp;\n closeRegExp.lastIndex = first.match.index + first.match[0].length;\n\n const match = closeRegExp.exec(sourceCode);\n\n lastIndex = match ? match.index + match[0].length : sourceCode.length;\n }\n } else {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex));\n lastIndex = sourceCode.length;\n }\n }\n\n return newSourceCodeSlices.join('');\n}\n\nfunction compileCommentOrStringGrammars(grammar: SourceCodeGrammar): readonly CommentOrStringGrammar[] {\n return [\n ...(grammar.comments?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close ?? /(?=\\n)/g),\n isComment: true,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ...(grammar.strings?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close),\n isComment: false,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ] satisfies CommentOrStringGrammar[];\n}\n\nfunction shouldPreferMatch(\n match: RegExpExecArray,\n grammar: CommentOrStringGrammar,\n first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined,\n options: { removeStrings: boolean }\n): boolean {\n if (!first) return true;\n if (match.index < first.match.index) return true;\n if (match.index > first.match.index) return false;\n return options.removeStrings && first.grammar.isComment && !grammar.isComment;\n}\n\nfunction makeGlobalRegExp(regExp: RegExp): RegExp {\n return new RegExp(regExp, regExp.flags.includes('g') ? regExp.flags : `${regExp.flags}g`);\n}\n\nfunction findStringEndIndex(sourceCode: string, stringStartIndex: number, grammar: CommentOrStringGrammar): number {\n if (sourceCode[stringStartIndex] === '`') return findJavaScriptTemplateEndIndex(sourceCode, stringStartIndex);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return findPythonFStringEndIndex(sourceCode, stringStartIndex);\n\n const closeRegExp = grammar.closeRegExp;\n closeRegExp.lastIndex = stringStartIndex + 1;\n const match = closeRegExp.exec(sourceCode);\n return match ? match.index + match[0].length : sourceCode.length;\n}\n\nfunction findJavaScriptTemplateEndIndex(sourceCode: string, stringStartIndex: number): number {\n let index = stringStartIndex + 1;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '`') return index + 1;\n if (sourceCode[index] === '$' && sourceCode[index + 1] === '{') {\n index = readBalancedExpression(sourceCode, index + 2, '}', { slashStartsRegExp: true }).endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return sourceCode.length;\n}\n\nfunction findPythonFStringEndIndex(sourceCode: string, stringStartIndex: number): number {\n const quote = getStringQuote(sourceCode, stringStartIndex);\n let index = stringStartIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n if (sourceCode[index] === '{' && sourceCode[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '{') {\n index = readBalancedExpression(sourceCode, index + 1, '}', { slashStartsRegExp: false }).endIndex + 1;\n continue;\n }\n index += sourceCode[index] === '\\\\' ? 2 : 1;\n }\n\n return sourceCode.length;\n}\n\nfunction getStringQuote(sourceCode: string, stringStartIndex: number): string {\n const threeCharacterQuote = sourceCode.slice(stringStartIndex, stringStartIndex + 3);\n if (threeCharacterQuote === \"'''\" || threeCharacterQuote === '\"\"\"') return threeCharacterQuote;\n return sourceCode[stringStartIndex] ?? '';\n}\n\nfunction getPythonStringPrefixStartIndex(sourceCode: string, stringStartIndex: number): number {\n const prefix = getPythonStringPrefix(sourceCode, stringStartIndex);\n return prefix ? stringStartIndex - prefix.length : stringStartIndex;\n}\n\nfunction getPythonStringPrefix(sourceCode: string, stringStartIndex: number): string | undefined {\n if (sourceCode[stringStartIndex] !== '\"' && sourceCode[stringStartIndex] !== \"'\") return undefined;\n let index = stringStartIndex - 1;\n while (index >= 0 && /[A-Za-z]/.test(sourceCode[index] ?? '')) index -= 1;\n\n const prefix = sourceCode.slice(index + 1, stringStartIndex);\n if (!prefix || !/^[bfru]+$/i.test(prefix)) return undefined;\n if (index >= 0 && /[\\dA-Za-z_]/.test(sourceCode[index] ?? '')) return undefined;\n\n return prefix;\n}\n\nfunction preserveStringInterpolationExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n sourceCode: string,\n stringStartIndex: number,\n stringLiteral: string\n): string {\n if (stringLiteral.startsWith('`'))\n return preserveJavaScriptTemplateExpressions(grammar, commentOrStringGrammars, stringLiteral);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return preservePythonFStringExpressions(grammar, commentOrStringGrammars, stringLiteral);\n return '';\n}\n\nfunction hasPythonFStringPrefix(sourceCode: string, stringStartIndex: number): boolean {\n return getPythonStringPrefix(sourceCode, stringStartIndex)?.toLowerCase().includes('f') ?? false;\n}\n\nfunction preserveJavaScriptTemplateExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const expressions: string[] = [];\n let index = 1;\n\n while (index < stringLiteral.length - 1) {\n if (stringLiteral[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '$' && stringLiteral[index + 1] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 2, '}', { slashStartsRegExp: true });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction preservePythonFStringExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const quoteLength = getStringQuote(stringLiteral, 0).length;\n const expressions: string[] = [];\n let index = quoteLength;\n\n while (index < stringLiteral.length - quoteLength) {\n if (stringLiteral[index] === '{' && stringLiteral[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 1, '}', { slashStartsRegExp: false });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += stringLiteral[index] === '\\\\' ? 2 : 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction readBalancedExpression(\n sourceCode: string,\n startIndex: number,\n closeChar: string,\n options: { slashStartsRegExp: boolean }\n): { content: string; endIndex: number } {\n let depth = 1;\n let index = startIndex;\n\n while (index < sourceCode.length) {\n const char = sourceCode[index];\n if (char === '\"' || char === \"'\" || char === '`') {\n index = skipQuotedSpan(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '/') {\n index = skipJavaScriptSingleLineComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '*') {\n index = skipJavaScriptBlockComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && char === '/') {\n index = skipJavaScriptRegExpLiteral(sourceCode, index);\n continue;\n }\n if (char === '{') depth += 1;\n if (char === closeChar) {\n depth -= 1;\n if (depth === 0) return { content: sourceCode.slice(startIndex, index), endIndex: index };\n }\n index += 1;\n }\n\n return { content: sourceCode.slice(startIndex), endIndex: sourceCode.length };\n}\n\nfunction skipQuotedSpan(sourceCode: string, startIndex: number): number {\n const quote = getStringQuote(sourceCode, startIndex);\n let index = startIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n index += 1;\n }\n\n return index;\n}\n\nfunction skipJavaScriptRegExpLiteral(sourceCode: string, startIndex: number): number {\n let index = startIndex + 1;\n let inCharacterClass = false;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '[') inCharacterClass = true;\n if (sourceCode[index] === ']') inCharacterClass = false;\n if (sourceCode[index] === '/' && !inCharacterClass) {\n index += 1;\n while (/[A-Za-z]/.test(sourceCode[index] ?? '')) index += 1;\n return index;\n }\n if (sourceCode[index] === '\\n') return startIndex + 1;\n index += 1;\n }\n\n return startIndex + 1;\n}\n\nfunction skipJavaScriptSingleLineComment(sourceCode: string, startIndex: number): number {\n const newLineIndex = sourceCode.indexOf('\\n', startIndex + 2);\n return newLineIndex === -1 ? sourceCode.length : newLineIndex;\n}\n\nfunction skipJavaScriptBlockComment(sourceCode: string, startIndex: number): number {\n const endIndex = sourceCode.indexOf('*/', startIndex + 2);\n return endIndex === -1 ? sourceCode.length : endIndex + 2;\n}\n"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),n=require("node:path"),r=require("./findModelAnswerDirs.cjs"),t=require("./printDebugBanner.cjs");function a(){return(a=e.asyncToGenerator(e.regenerator().m(function a(o,s){var i,u,d,l,p,g,w,b;return e.regenerator().w(function(a){for(;;)switch(a.n){case 0:if(!s){a.n=1;break}return a.a(2,{cwds:[{cwd:s,expectedResult:"accepted"}],isDebugMode:!1});case 1:return a.n=2,Promise.all([r.findModelAnswerDirs(o),r.findFailingModelAnswerDirs(o)]);case 2:if(d=a.v,l=e.slicedToArray(d,2),p=l[0],g=l[1],0!==p.length||0!==g.length){a.n=3;break}throw new Error("cwd argument required (no model answer directories found in ".concat(n.join(o,r.MODEL_ANSWERS_DIRNAME)," or ").concat(n.join(o,r.FAILING_MODEL_ANSWERS_DIRNAME),")"));case 3:return w=c(),b=n.relative(o,null!=(i=null!=(u=p[0])?u:g[0])?i:"")||"<model_answer>",t.printDebugBanner(["[DEBUG MODE] cwd not provided -- judging against all model answers","","Problem dir : ".concat(o),"Model answers (".concat(p.length,"):")].concat(e.toConsumableArray(p.map(function(e){return" - ".concat(n.relative(o,e))})),["Failing model answers (".concat(g.length,"):")],e.toConsumableArray(g.map(function(e){return" - ".concat(n.relative(o,e))})),["","To judge a single cwd (e.g., a user submission), pass it as the first argument:"," bun ".concat(w," <cwd> [params-json]"),"For example:"," bun ".concat(w," ").concat(b)," bun ".concat(w," ").concat(b,' \'{"language":"python"}\'')])),a.a(2,{cwds:[].concat(e.toConsumableArray(p.map(function(e){return{cwd:e,expectedResult:"accepted"}})),e.toConsumableArray(g.map(function(e){return{cwd:e,expectedResult:"rejected"}}))),isDebugMode:!0})}},a)}))).apply(this,arguments)}function c(){var e=process.argv[1];return e?n.basename(e):"judge.ts"}exports.printDebugCwdBanner=function(e,r){var a=n.relative(e,r.cwd)||r.cwd,o=c();t.printDebugBanner(["[DEBUG MODE] judging: ".concat(a),"Expected result: ".concat(r.expectedResult),"","To judge only this cwd as a normal submission:"," bun ".concat(o," ").concat(a),"Run without a cwd to check debug-mode expectations."])},exports.printDebugExpectationFailureBanner=function(e,r){var a=n.relative(e,r.cwd)||r.cwd;t.printDebugBanner(["[DEBUG MODE] expectation failed: ".concat(a),"Expected result: ".concat(r.expectedResult),"accepted"===r.expectedResult?"The model answer was rejected by the judge.":"The failing model answer was accepted by the judge."])},exports.resolveCwds=function(e,n){return a.apply(this,arguments)}; | ||
| //# sourceMappingURL=resolveCwds.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("./printDebugBanner.cjs"),n=require("./findModelAnswerDirs.cjs");let r=require("node:path");r=e.__toESM(r,1);async function i(e,i){if(i)return{cwds:[{cwd:i,expectedResult:`accepted`}],isDebugMode:!1};let[a,o]=await Promise.all([n.findModelAnswerDirs(e),n.findFailingModelAnswerDirs(e)]);if(a.length===0&&o.length===0)throw Error(`cwd argument required (no model answer directories found in ${r.default.join(e,n.MODEL_ANSWERS_DIRNAME)} or ${r.default.join(e,n.FAILING_MODEL_ANSWERS_DIRNAME)})`);let c=s(),l=r.default.relative(e,a[0]??o[0]??``)||`<model_answer>`;return t.printDebugBanner([`[DEBUG MODE] cwd not provided -- judging against all model answers`,``,`Problem dir : ${e}`,`Model answers (${a.length}):`,...a.map(t=>` - ${r.default.relative(e,t)}`),`Failing model answers (${o.length}):`,...o.map(t=>` - ${r.default.relative(e,t)}`),``,`To judge a single cwd (e.g., a user submission), pass it as the first argument:`,` bun ${c} <cwd> [params-json]`,`For example:`,` bun ${c} ${l}`,` bun ${c} ${l} '{"language":"python"}'`]),{cwds:[...a.map(e=>({cwd:e,expectedResult:`accepted`})),...o.map(e=>({cwd:e,expectedResult:`rejected`}))],isDebugMode:!0}}function a(e,n){let i=r.default.relative(e,n.cwd)||n.cwd,a=s();t.printDebugBanner([`[DEBUG MODE] judging: ${i}`,`Expected result: ${n.expectedResult}`,``,`To judge only this cwd as a normal submission:`,` bun ${a} ${i}`,`Run without a cwd to check debug-mode expectations.`])}function o(e,n){t.printDebugBanner([`[DEBUG MODE] expectation failed: ${r.default.relative(e,n.cwd)||n.cwd}`,`Expected result: ${n.expectedResult}`,n.expectedResult===`accepted`?`The model answer was rejected by the judge.`:`The failing model answer was accepted by the judge.`])}function s(){let e=process.argv[1];return e?r.default.basename(e):`judge.ts`}exports.printDebugCwdBanner=a,exports.printDebugExpectationFailureBanner=o,exports.resolveCwds=i; | ||
| //# sourceMappingURL=resolveCwds.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"resolveCwds.cjs","sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n FAILING_MODEL_ANSWERS_DIRNAME,\n MODEL_ANSWERS_DIRNAME,\n findFailingModelAnswerDirs,\n findModelAnswerDirs,\n} from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport type ExpectedJudgeResult = 'accepted' | 'rejected';\n\nexport interface ResolvedCwd {\n cwd: string;\n expectedResult: ExpectedJudgeResult;\n}\n\nexport interface ResolvedCwds {\n cwds: readonly ResolvedCwd[];\n isDebugMode: boolean;\n}\n\n/**\n * Resolve which working directories to judge.\n *\n * - If `cwdArg` is provided, use it as the single cwd.\n * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and\n * `<problemDir>/model_answers.fails/*` and judge each.\n * A prominent banner is printed so users can tell at a glance that this is a debug run.\n *\n * @throws if `cwdArg` is missing and no model answer directories are found.\n */\nexport async function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds> {\n if (cwdArg) return { cwds: [{ cwd: cwdArg, expectedResult: 'accepted' }], isDebugMode: false };\n\n const [modelAnswerDirs, failingModelAnswerDirs] = await Promise.all([\n findModelAnswerDirs(problemDir),\n findFailingModelAnswerDirs(problemDir),\n ]);\n if (modelAnswerDirs.length === 0 && failingModelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, MODEL_ANSWERS_DIRNAME)} or ${path.join(problemDir, FAILING_MODEL_ANSWERS_DIRNAME)})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer =\n path.relative(problemDir, modelAnswerDirs[0] ?? failingModelAnswerDirs[0] ?? '') || '<model_answer>';\n printDebugBanner([\n '[DEBUG MODE] cwd not provided -- judging against all model answers',\n '',\n `Problem dir : ${problemDir}`,\n `Model answers (${modelAnswerDirs.length}):`,\n ...modelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n `Failing model answers (${failingModelAnswerDirs.length}):`,\n ...failingModelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n '',\n 'To judge a single cwd (e.g., a user submission), pass it as the first argument:',\n ` bun ${scriptName} <cwd> [params-json]`,\n 'For example:',\n ` bun ${scriptName} ${exampleAnswer}`,\n ` bun ${scriptName} ${exampleAnswer} '{\"language\":\"python\"}'`,\n ]);\n\n return {\n cwds: [\n ...modelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'accepted' as const })),\n ...failingModelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'rejected' as const })),\n ],\n isDebugMode: true,\n };\n}\n\n/**\n * Print a per-cwd banner shown before judging each model answer in debug mode.\n * Includes the command for re-running this single cwd.\n */\nexport function printDebugCwdBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n '',\n 'To judge only this cwd as a normal submission:',\n ` bun ${scriptName} ${relativeCwd}`,\n 'Run without a cwd to check debug-mode expectations.',\n ]);\n}\n\nexport function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n printDebugBanner([\n `[DEBUG MODE] expectation failed: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n resolvedCwd.expectedResult === 'accepted'\n ? 'The model answer was rejected by the judge.'\n : 'The failing model answer was accepted by the judge.',\n ]);\n}\n\nfunction getInvokedScriptName(): string {\n const scriptPath = process.argv[1];\n return scriptPath ? path.basename(scriptPath) : 'judge.ts';\n}\n"],"names":["_resolveCwds","_asyncToGenerator","_regenerator","m","_callee","problemDir","cwdArg","_ref","_modelAnswerDirs$","_yield$Promise$all","_yield$Promise$all2","modelAnswerDirs","failingModelAnswerDirs","scriptName","exampleAnswer","w","_context","n","a","cwds","cwd","expectedResult","isDebugMode","Promise","all","findModelAnswerDirs","findFailingModelAnswerDirs","v","_slicedToArray","length","Error","concat","path","join","MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME","getInvokedScriptName","relative","printDebugBanner","_toConsumableArray","map","dir","apply","this","arguments","scriptPath","process","argv","basename","resolvedCwd","relativeCwd","_x","_x2"],"mappings":"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"} | ||
| {"version":3,"file":"resolveCwds.cjs","names":["findModelAnswerDirs","findFailingModelAnswerDirs","path","MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME"],"sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n FAILING_MODEL_ANSWERS_DIRNAME,\n MODEL_ANSWERS_DIRNAME,\n findFailingModelAnswerDirs,\n findModelAnswerDirs,\n} from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport type ExpectedJudgeResult = 'accepted' | 'rejected';\n\nexport interface ResolvedCwd {\n cwd: string;\n expectedResult: ExpectedJudgeResult;\n}\n\nexport interface ResolvedCwds {\n cwds: readonly ResolvedCwd[];\n isDebugMode: boolean;\n}\n\n/**\n * Resolve which working directories to judge.\n *\n * - If `cwdArg` is provided, use it as the single cwd.\n * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and\n * `<problemDir>/model_answers.fails/*` and judge each.\n * A prominent banner is printed so users can tell at a glance that this is a debug run.\n *\n * @throws if `cwdArg` is missing and no model answer directories are found.\n */\nexport async function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds> {\n if (cwdArg) return { cwds: [{ cwd: cwdArg, expectedResult: 'accepted' }], isDebugMode: false };\n\n const [modelAnswerDirs, failingModelAnswerDirs] = await Promise.all([\n findModelAnswerDirs(problemDir),\n findFailingModelAnswerDirs(problemDir),\n ]);\n if (modelAnswerDirs.length === 0 && failingModelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, MODEL_ANSWERS_DIRNAME)} or ${path.join(problemDir, FAILING_MODEL_ANSWERS_DIRNAME)})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer =\n path.relative(problemDir, modelAnswerDirs[0] ?? failingModelAnswerDirs[0] ?? '') || '<model_answer>';\n printDebugBanner([\n '[DEBUG MODE] cwd not provided -- judging against all model answers',\n '',\n `Problem dir : ${problemDir}`,\n `Model answers (${modelAnswerDirs.length}):`,\n ...modelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n `Failing model answers (${failingModelAnswerDirs.length}):`,\n ...failingModelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n '',\n 'To judge a single cwd (e.g., a user submission), pass it as the first argument:',\n ` bun ${scriptName} <cwd> [params-json]`,\n 'For example:',\n ` bun ${scriptName} ${exampleAnswer}`,\n ` bun ${scriptName} ${exampleAnswer} '{\"language\":\"python\"}'`,\n ]);\n\n return {\n cwds: [\n ...modelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'accepted' as const })),\n ...failingModelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'rejected' as const })),\n ],\n isDebugMode: true,\n };\n}\n\n/**\n * Print a per-cwd banner shown before judging each model answer in debug mode.\n * Includes the command for re-running this single cwd.\n */\nexport function printDebugCwdBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n '',\n 'To judge only this cwd as a normal submission:',\n ` bun ${scriptName} ${relativeCwd}`,\n 'Run without a cwd to check debug-mode expectations.',\n ]);\n}\n\nexport function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n printDebugBanner([\n `[DEBUG MODE] expectation failed: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n resolvedCwd.expectedResult === 'accepted'\n ? 'The model answer was rejected by the judge.'\n : 'The failing model answer was accepted by the judge.',\n ]);\n}\n\nfunction getInvokedScriptName(): string {\n const scriptPath = process.argv[1];\n return scriptPath ? path.basename(scriptPath) : 'judge.ts';\n}\n"],"mappings":"yLAgCA,eAAsB,EAAY,EAAoB,EAAmD,CACvG,GAAI,EAAQ,MAAO,CAAE,KAAM,CAAC,CAAE,IAAK,EAAQ,eAAgB,UAAW,CAAC,EAAG,YAAa,EAAM,EAE7F,GAAM,CAAC,EAAiB,GAA0B,MAAM,QAAQ,IAAI,CAClEA,EAAAA,oBAAoB,CAAU,EAC9BC,EAAAA,2BAA2B,CAAU,CACvC,CAAC,EACD,GAAI,EAAgB,SAAW,GAAK,EAAuB,SAAW,EACpE,MAAU,MACR,+DAA+DC,EAAAA,QAAK,KAAK,EAAYC,EAAAA,qBAAqB,EAAE,MAAMD,EAAAA,QAAK,KAAK,EAAYE,EAAAA,6BAA6B,EAAE,EACzK,EAGF,IAAM,EAAa,EAAqB,EAClC,EACJF,EAAAA,QAAK,SAAS,EAAY,EAAgB,IAAM,EAAuB,IAAM,EAAE,GAAK,iBAiBtF,OAhBA,EAAA,iBAAiB,CACf,qEACA,GACA,iBAAiB,IACjB,kBAAkB,EAAgB,OAAO,IACzC,GAAG,EAAgB,IAAK,GAAQ,OAAOA,EAAAA,QAAK,SAAS,EAAY,CAAG,GAAG,EACvE,0BAA0B,EAAuB,OAAO,IACxD,GAAG,EAAuB,IAAK,GAAQ,OAAOA,EAAAA,QAAK,SAAS,EAAY,CAAG,GAAG,EAC9E,GACA,kFACA,SAAS,EAAW,sBACpB,eACA,SAAS,EAAW,GAAG,IACvB,SAAS,EAAW,GAAG,EAAc,yBACvC,CAAC,EAEM,CACL,KAAM,CACJ,GAAG,EAAgB,IAAK,IAAS,CAAE,MAAK,eAAgB,UAAoB,EAAE,EAC9E,GAAG,EAAuB,IAAK,IAAS,CAAE,MAAK,eAAgB,UAAoB,EAAE,CACvF,EACA,YAAa,EACf,CACF,CAMA,SAAgB,EAAoB,EAAoB,EAAgC,CACtF,IAAM,EAAcA,EAAAA,QAAK,SAAS,EAAY,EAAY,GAAG,GAAK,EAAY,IACxE,EAAa,EAAqB,EACxC,EAAA,iBAAiB,CACf,yBAAyB,IACzB,oBAAoB,EAAY,iBAChC,GACA,iDACA,SAAS,EAAW,GAAG,IACvB,qDACF,CAAC,CACH,CAEA,SAAgB,EAAmC,EAAoB,EAAgC,CAErG,EAAA,iBAAiB,CACf,oCAFkBA,EAAAA,QAAK,SAAS,EAAY,EAAY,GAAG,GAAK,EAAY,MAG5E,oBAAoB,EAAY,iBAChC,EAAY,iBAAmB,WAC3B,8CACA,qDACN,CAAC,CACH,CAEA,SAAS,GAA+B,CACtC,IAAM,EAAa,QAAQ,KAAK,GAChC,OAAO,EAAaA,EAAAA,QAAK,SAAS,CAAU,EAAI,UAClD"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as e,regenerator as n,toConsumableArray as t,slicedToArray as a}from"../_virtual/_rollupPluginBabelHelpers.js";import c from"node:path";import{MODEL_ANSWERS_DIRNAME as r,FAILING_MODEL_ANSWERS_DIRNAME as o,findModelAnswerDirs as s,findFailingModelAnswerDirs as i}from"./findModelAnswerDirs.js";import{printDebugBanner as u}from"./printDebugBanner.js";function d(e,n){return l.apply(this,arguments)}function l(){return(l=e(n().m(function e(d,l){var p,m,g,f,b,h,j,v;return n().w(function(e){for(;;)switch(e.n){case 0:if(!l){e.n=1;break}return e.a(2,{cwds:[{cwd:l,expectedResult:"accepted"}],isDebugMode:!1});case 1:return e.n=2,Promise.all([s(d),i(d)]);case 2:if(g=e.v,f=a(g,2),b=f[0],h=f[1],0!==b.length||0!==h.length){e.n=3;break}throw new Error("cwd argument required (no model answer directories found in ".concat(c.join(d,r)," or ").concat(c.join(d,o),")"));case 3:return j=w(),v=c.relative(d,null!=(p=null!=(m=b[0])?m:h[0])?p:"")||"<model_answer>",u(["[DEBUG MODE] cwd not provided -- judging against all model answers","","Problem dir : ".concat(d),"Model answers (".concat(b.length,"):")].concat(t(b.map(function(e){return" - ".concat(c.relative(d,e))})),["Failing model answers (".concat(h.length,"):")],t(h.map(function(e){return" - ".concat(c.relative(d,e))})),["","To judge a single cwd (e.g., a user submission), pass it as the first argument:"," bun ".concat(j," <cwd> [params-json]"),"For example:"," bun ".concat(j," ").concat(v)," bun ".concat(j," ").concat(v,' \'{"language":"python"}\'')])),e.a(2,{cwds:[].concat(t(b.map(function(e){return{cwd:e,expectedResult:"accepted"}})),t(h.map(function(e){return{cwd:e,expectedResult:"rejected"}}))),isDebugMode:!0})}},e)}))).apply(this,arguments)}function p(e,n){var t=c.relative(e,n.cwd)||n.cwd,a=w();u(["[DEBUG MODE] judging: ".concat(t),"Expected result: ".concat(n.expectedResult),"","To judge only this cwd as a normal submission:"," bun ".concat(a," ").concat(t),"Run without a cwd to check debug-mode expectations."])}function m(e,n){var t=c.relative(e,n.cwd)||n.cwd;u(["[DEBUG MODE] expectation failed: ".concat(t),"Expected result: ".concat(n.expectedResult),"accepted"===n.expectedResult?"The model answer was rejected by the judge.":"The failing model answer was accepted by the judge."])}function w(){var e=process.argv[1];return e?c.basename(e):"judge.ts"}export{p as printDebugCwdBanner,m as printDebugExpectationFailureBanner,d as resolveCwds}; | ||
| //# sourceMappingURL=resolveCwds.js.map | ||
| import{printDebugBanner as e}from"./printDebugBanner.js";import{FAILING_MODEL_ANSWERS_DIRNAME as t,MODEL_ANSWERS_DIRNAME as n,findFailingModelAnswerDirs as r,findModelAnswerDirs as i}from"./findModelAnswerDirs.js";import a from"node:path";async function o(o,s){if(s)return{cwds:[{cwd:s,expectedResult:`accepted`}],isDebugMode:!1};let[c,u]=await Promise.all([i(o),r(o)]);if(c.length===0&&u.length===0)throw Error(`cwd argument required (no model answer directories found in ${a.join(o,n)} or ${a.join(o,t)})`);let d=l(),f=a.relative(o,c[0]??u[0]??``)||`<model_answer>`;return e([`[DEBUG MODE] cwd not provided -- judging against all model answers`,``,`Problem dir : ${o}`,`Model answers (${c.length}):`,...c.map(e=>` - ${a.relative(o,e)}`),`Failing model answers (${u.length}):`,...u.map(e=>` - ${a.relative(o,e)}`),``,`To judge a single cwd (e.g., a user submission), pass it as the first argument:`,` bun ${d} <cwd> [params-json]`,`For example:`,` bun ${d} ${f}`,` bun ${d} ${f} '{"language":"python"}'`]),{cwds:[...c.map(e=>({cwd:e,expectedResult:`accepted`})),...u.map(e=>({cwd:e,expectedResult:`rejected`}))],isDebugMode:!0}}function s(t,n){let r=a.relative(t,n.cwd)||n.cwd,i=l();e([`[DEBUG MODE] judging: ${r}`,`Expected result: ${n.expectedResult}`,``,`To judge only this cwd as a normal submission:`,` bun ${i} ${r}`,`Run without a cwd to check debug-mode expectations.`])}function c(t,n){e([`[DEBUG MODE] expectation failed: ${a.relative(t,n.cwd)||n.cwd}`,`Expected result: ${n.expectedResult}`,n.expectedResult===`accepted`?`The model answer was rejected by the judge.`:`The failing model answer was accepted by the judge.`])}function l(){let e=process.argv[1];return e?a.basename(e):`judge.ts`}export{s as printDebugCwdBanner,c as printDebugExpectationFailureBanner,o as resolveCwds}; | ||
| //# sourceMappingURL=resolveCwds.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"resolveCwds.js","sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n FAILING_MODEL_ANSWERS_DIRNAME,\n MODEL_ANSWERS_DIRNAME,\n findFailingModelAnswerDirs,\n findModelAnswerDirs,\n} from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport type ExpectedJudgeResult = 'accepted' | 'rejected';\n\nexport interface ResolvedCwd {\n cwd: string;\n expectedResult: ExpectedJudgeResult;\n}\n\nexport interface ResolvedCwds {\n cwds: readonly ResolvedCwd[];\n isDebugMode: boolean;\n}\n\n/**\n * Resolve which working directories to judge.\n *\n * - If `cwdArg` is provided, use it as the single cwd.\n * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and\n * `<problemDir>/model_answers.fails/*` and judge each.\n * A prominent banner is printed so users can tell at a glance that this is a debug run.\n *\n * @throws if `cwdArg` is missing and no model answer directories are found.\n */\nexport async function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds> {\n if (cwdArg) return { cwds: [{ cwd: cwdArg, expectedResult: 'accepted' }], isDebugMode: false };\n\n const [modelAnswerDirs, failingModelAnswerDirs] = await Promise.all([\n findModelAnswerDirs(problemDir),\n findFailingModelAnswerDirs(problemDir),\n ]);\n if (modelAnswerDirs.length === 0 && failingModelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, MODEL_ANSWERS_DIRNAME)} or ${path.join(problemDir, FAILING_MODEL_ANSWERS_DIRNAME)})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer =\n path.relative(problemDir, modelAnswerDirs[0] ?? failingModelAnswerDirs[0] ?? '') || '<model_answer>';\n printDebugBanner([\n '[DEBUG MODE] cwd not provided -- judging against all model answers',\n '',\n `Problem dir : ${problemDir}`,\n `Model answers (${modelAnswerDirs.length}):`,\n ...modelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n `Failing model answers (${failingModelAnswerDirs.length}):`,\n ...failingModelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n '',\n 'To judge a single cwd (e.g., a user submission), pass it as the first argument:',\n ` bun ${scriptName} <cwd> [params-json]`,\n 'For example:',\n ` bun ${scriptName} ${exampleAnswer}`,\n ` bun ${scriptName} ${exampleAnswer} '{\"language\":\"python\"}'`,\n ]);\n\n return {\n cwds: [\n ...modelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'accepted' as const })),\n ...failingModelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'rejected' as const })),\n ],\n isDebugMode: true,\n };\n}\n\n/**\n * Print a per-cwd banner shown before judging each model answer in debug mode.\n * Includes the command for re-running this single cwd.\n */\nexport function printDebugCwdBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n '',\n 'To judge only this cwd as a normal submission:',\n ` bun ${scriptName} ${relativeCwd}`,\n 'Run without a cwd to check debug-mode expectations.',\n ]);\n}\n\nexport function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n printDebugBanner([\n `[DEBUG MODE] expectation failed: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n resolvedCwd.expectedResult === 'accepted'\n ? 'The model answer was rejected by the judge.'\n : 'The failing model answer was accepted by the judge.',\n ]);\n}\n\nfunction getInvokedScriptName(): string {\n const scriptPath = process.argv[1];\n return scriptPath ? path.basename(scriptPath) : 'judge.ts';\n}\n"],"names":["resolveCwds","_x","_x2","_resolveCwds","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","cwdArg","_ref","_modelAnswerDirs$","_yield$Promise$all","_yield$Promise$all2","modelAnswerDirs","failingModelAnswerDirs","scriptName","exampleAnswer","w","_context","n","a","cwds","cwd","expectedResult","isDebugMode","Promise","all","findModelAnswerDirs","findFailingModelAnswerDirs","v","_slicedToArray","length","Error","concat","path","join","MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME","getInvokedScriptName","relative","printDebugBanner","_toConsumableArray","map","dir","printDebugCwdBanner","resolvedCwd","relativeCwd","printDebugExpectationFailureBanner","scriptPath","process","argv","basename"],"mappings":"sXAgCA,SAAsBA,EAAWC,EAAAC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAyCjC,SAAAH,IAFC,OAEDA,EAAAI,EAAAC,IAAAC,EAzCO,SAAAC,EAA2BC,EAAoBC,GAA0B,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAZ,IAAAa,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,IAC1EX,EAAM,CAAAU,EAAAC,EAAA,EAAA,KAAA,CAAA,OAAAD,EAAAE,EAAA,EAAS,CAAEC,KAAM,CAAC,CAAEC,IAAKd,EAAQe,eAAgB,aAAeC,aAAa,IAAO,KAAA,EAAA,OAAAN,EAAAC,EAAA,EAEtCM,QAAQC,IAAI,CAClEC,EAAoBpB,GACpBqB,EAA2BrB,KAC3B,KAAA,EAH4C,GAG5CI,EAAAO,EAAAW,EAAAjB,EAAAkB,EAAAnB,EAAA,GAHKE,EAAeD,EAAA,GAAEE,EAAsBF,EAAA,GAIf,IAA3BC,EAAgBkB,QAAkD,IAAlCjB,EAAuBiB,OAAY,CAAAb,EAAAC,EAAA,EAAA,KAAA,CAAA,MAC/D,IAAIa,MAAK,+DAAAC,OACkDC,EAAKC,KAAK5B,EAAY6B,GAAsB,QAAAH,OAAOC,EAAKC,KAAK5B,EAAY8B,GAA8B,MACvK,KAAA,EAoBA,OAjBGtB,EAAauB,IACbtB,EACJkB,EAAKK,SAAShC,EAA2D,OAAjDE,EAAoB,OAApBC,EAAEG,EAAgB,IAAEH,EAAII,EAAuB,IAAEL,EAAI,KAAO,iBACtF+B,EAAgB,CACd,qEACA,GAAE,iBAAAP,OACe1B,GAAU,kBAAA0B,OACTpB,EAAgBkB,OAAM,OAAAE,OAAAQ,EACrC5B,EAAgB6B,IAAI,SAACC,GAAG,MAAA,OAAAV,OAAYC,EAAKK,SAAShC,EAAYoC,GAAI,IAAG,CAAA,0BAAAV,OAC9CnB,EAAuBiB,OAAM,OAAAU,EACpD3B,EAAuB4B,IAAI,SAACC,GAAG,MAAA,OAAAV,OAAYC,EAAKK,SAAShC,EAAYoC,GAAI,IAAG,CAC/E,GACA,kFAAiF,SAAAV,OACxElB,EAAU,wBACnB,eAAc,SAAAkB,OACLlB,EAAU,KAAAkB,OAAIjB,GAAa,SAAAiB,OAC3BlB,EAAU,KAAAkB,OAAIjB,EAAa,iCACnCE,EAAAE,EAAA,EAEI,CACLC,KAAI,GAAAY,OAAAQ,EACC5B,EAAgB6B,IAAI,SAACpB,GAAG,MAAM,CAAEA,IAAAA,EAAKC,eAAgB,WAAqB,IAAEkB,EAC5E3B,EAAuB4B,IAAI,SAACpB,GAAG,MAAM,CAAEA,IAAAA,EAAKC,eAAgB,WAAqB,KAEtFC,aAAa,IACd,EAAAlB,EAAA,KACFN,MAAAC,KAAAC,UAAA,CAMM,SAAS0C,EAAoBrC,EAAoBsC,GACtD,IAAMC,EAAcZ,EAAKK,SAAShC,EAAYsC,EAAYvB,MAAQuB,EAAYvB,IACxEP,EAAauB,IACnBE,EAAiB,CAAA,yBAAAP,OACUa,GAAW,oBAAAb,OAChBY,EAAYtB,gBAChC,GACA,iDAAgD,SAAAU,OACvClB,EAAU,KAAAkB,OAAIa,GACvB,uDAEJ,CAEO,SAASC,EAAmCxC,EAAoBsC,GACrE,IAAMC,EAAcZ,EAAKK,SAAShC,EAAYsC,EAAYvB,MAAQuB,EAAYvB,IAC9EkB,EAAiB,qCAAAP,OACqBa,GAAW,oBAAAb,OAC3BY,EAAYtB,gBACD,aAA/BsB,EAAYtB,eACR,8CACA,uDAER,CAEA,SAASe,IACP,IAAMU,EAAaC,QAAQC,KAAK,GAChC,OAAOF,EAAad,EAAKiB,SAASH,GAAc,UAClD"} | ||
| {"version":3,"file":"resolveCwds.js","names":[],"sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n FAILING_MODEL_ANSWERS_DIRNAME,\n MODEL_ANSWERS_DIRNAME,\n findFailingModelAnswerDirs,\n findModelAnswerDirs,\n} from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport type ExpectedJudgeResult = 'accepted' | 'rejected';\n\nexport interface ResolvedCwd {\n cwd: string;\n expectedResult: ExpectedJudgeResult;\n}\n\nexport interface ResolvedCwds {\n cwds: readonly ResolvedCwd[];\n isDebugMode: boolean;\n}\n\n/**\n * Resolve which working directories to judge.\n *\n * - If `cwdArg` is provided, use it as the single cwd.\n * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and\n * `<problemDir>/model_answers.fails/*` and judge each.\n * A prominent banner is printed so users can tell at a glance that this is a debug run.\n *\n * @throws if `cwdArg` is missing and no model answer directories are found.\n */\nexport async function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds> {\n if (cwdArg) return { cwds: [{ cwd: cwdArg, expectedResult: 'accepted' }], isDebugMode: false };\n\n const [modelAnswerDirs, failingModelAnswerDirs] = await Promise.all([\n findModelAnswerDirs(problemDir),\n findFailingModelAnswerDirs(problemDir),\n ]);\n if (modelAnswerDirs.length === 0 && failingModelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, MODEL_ANSWERS_DIRNAME)} or ${path.join(problemDir, FAILING_MODEL_ANSWERS_DIRNAME)})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer =\n path.relative(problemDir, modelAnswerDirs[0] ?? failingModelAnswerDirs[0] ?? '') || '<model_answer>';\n printDebugBanner([\n '[DEBUG MODE] cwd not provided -- judging against all model answers',\n '',\n `Problem dir : ${problemDir}`,\n `Model answers (${modelAnswerDirs.length}):`,\n ...modelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n `Failing model answers (${failingModelAnswerDirs.length}):`,\n ...failingModelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n '',\n 'To judge a single cwd (e.g., a user submission), pass it as the first argument:',\n ` bun ${scriptName} <cwd> [params-json]`,\n 'For example:',\n ` bun ${scriptName} ${exampleAnswer}`,\n ` bun ${scriptName} ${exampleAnswer} '{\"language\":\"python\"}'`,\n ]);\n\n return {\n cwds: [\n ...modelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'accepted' as const })),\n ...failingModelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'rejected' as const })),\n ],\n isDebugMode: true,\n };\n}\n\n/**\n * Print a per-cwd banner shown before judging each model answer in debug mode.\n * Includes the command for re-running this single cwd.\n */\nexport function printDebugCwdBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n '',\n 'To judge only this cwd as a normal submission:',\n ` bun ${scriptName} ${relativeCwd}`,\n 'Run without a cwd to check debug-mode expectations.',\n ]);\n}\n\nexport function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n printDebugBanner([\n `[DEBUG MODE] expectation failed: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n resolvedCwd.expectedResult === 'accepted'\n ? 'The model answer was rejected by the judge.'\n : 'The failing model answer was accepted by the judge.',\n ]);\n}\n\nfunction getInvokedScriptName(): string {\n const scriptPath = process.argv[1];\n return scriptPath ? path.basename(scriptPath) : 'judge.ts';\n}\n"],"mappings":"+OAgCA,eAAsB,EAAY,EAAoB,EAAmD,CACvG,GAAI,EAAQ,MAAO,CAAE,KAAM,CAAC,CAAE,IAAK,EAAQ,eAAgB,UAAW,CAAC,EAAG,YAAa,EAAM,EAE7F,GAAM,CAAC,EAAiB,GAA0B,MAAM,QAAQ,IAAI,CAClE,EAAoB,CAAU,EAC9B,EAA2B,CAAU,CACvC,CAAC,EACD,GAAI,EAAgB,SAAW,GAAK,EAAuB,SAAW,EACpE,MAAU,MACR,+DAA+D,EAAK,KAAK,EAAY,CAAqB,EAAE,MAAM,EAAK,KAAK,EAAY,CAA6B,EAAE,EACzK,EAGF,IAAM,EAAa,EAAqB,EAClC,EACJ,EAAK,SAAS,EAAY,EAAgB,IAAM,EAAuB,IAAM,EAAE,GAAK,iBAiBtF,OAhBA,EAAiB,CACf,qEACA,GACA,iBAAiB,IACjB,kBAAkB,EAAgB,OAAO,IACzC,GAAG,EAAgB,IAAK,GAAQ,OAAO,EAAK,SAAS,EAAY,CAAG,GAAG,EACvE,0BAA0B,EAAuB,OAAO,IACxD,GAAG,EAAuB,IAAK,GAAQ,OAAO,EAAK,SAAS,EAAY,CAAG,GAAG,EAC9E,GACA,kFACA,SAAS,EAAW,sBACpB,eACA,SAAS,EAAW,GAAG,IACvB,SAAS,EAAW,GAAG,EAAc,yBACvC,CAAC,EAEM,CACL,KAAM,CACJ,GAAG,EAAgB,IAAK,IAAS,CAAE,MAAK,eAAgB,UAAoB,EAAE,EAC9E,GAAG,EAAuB,IAAK,IAAS,CAAE,MAAK,eAAgB,UAAoB,EAAE,CACvF,EACA,YAAa,EACf,CACF,CAMA,SAAgB,EAAoB,EAAoB,EAAgC,CACtF,IAAM,EAAc,EAAK,SAAS,EAAY,EAAY,GAAG,GAAK,EAAY,IACxE,EAAa,EAAqB,EACxC,EAAiB,CACf,yBAAyB,IACzB,oBAAoB,EAAY,iBAChC,GACA,iDACA,SAAS,EAAW,GAAG,IACvB,qDACF,CAAC,CACH,CAEA,SAAgB,EAAmC,EAAoB,EAAgC,CAErG,EAAiB,CACf,oCAFkB,EAAK,SAAS,EAAY,EAAY,GAAG,GAAK,EAAY,MAG5E,oBAAoB,EAAY,iBAChC,EAAY,iBAAmB,WAC3B,8CACA,qDACN,CAAC,CACH,CAEA,SAAS,GAA+B,CACtC,IAAM,EAAa,QAAQ,KAAK,GAChC,OAAO,EAAa,EAAK,SAAS,CAAU,EAAI,UAClD"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e,n,r=require("../_virtual/_rollupPluginBabelHelpers.cjs"),t=require("node:child_process"),a=require("node:fs/promises"),o=require("node:os"),i=require("node:path"),c={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.lockfile","buildscript-gradle.lockfile","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",".yarnrc.yml",".yarn"]},s={bun:function(e){return m.apply(this,arguments)},cargo:function(e){return y.apply(this,arguments)},go:function(e){return g.apply(this,arguments)},gradle:function(e){return v.apply(this,arguments)},maven:function(e){return k.apply(this,arguments)},npm:function(e){return b.apply(this,arguments)},pnpm:function(e){return h.apply(this,arguments)},ruby:function(e){return w.apply(this,arguments)},uv:function(){return j.apply(this,arguments)},yarn:function(e){return S.apply(this,arguments)}},u=(e="darwin"===o.platform()?"gtime":"/usr/bin/time",(n=t.spawnSync(e,["--version"],{stdio:"ignore"})).error||0!==n.status?void 0:[e,"--format","%e %M"]);function l(){return l=r.asyncToGenerator(r.regenerator().m(function e(n){var t,c,s,u,l,m,y,g,v,k,b,h,w,j,S,T,L,G,B,E,x;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.n=1,a.mkdtemp(i.join(o.tmpdir(),null!=(t=n.tempDirPrefix)?t:"exercode-"));case 1:return c=e.v,e.p=2,e.n=3,a.cp(n.cwd,c,{recursive:!0});case 3:return e.n=4,P({packageManager:n.packageManager,projectDir:n.projectDir,runDir:c,projectFilePaths:n.projectFilePaths});case 4:return l=n.env?r.objectSpread2(r.objectSpread2({},process.env),n.env):process.env,e.n=5,d(n.packageManager,c);case 5:if(m=e.v,y="function"==typeof n.command?n.command({runDir:c}):n.command,g=Date.now(),v=null!=(s=n.outputLimitBytes)?s:52428800,!m){e.n=7;break}return e.n=6,q(m,{cwd:c,env:l,outputLimitBytes:v,stdin:"",timeLimitSeconds:n.timeLimitSeconds});case 6:if(!f(k=e.v)){e.n=7;break}return e.a(2,p({elapsedTimeSeconds:(Date.now()-g)/1e3,options:n,result:k}));case 7:if(!((b=n.timeLimitSeconds-(Date.now()-g)/1e3)<=0)){e.n=8;break}return e.a(2,{stdin:null!=(h=n.stdin)?h:"",stdout:null!=(w=null==(j=k)?void 0:j.stdout)?w:"",stderr:null!=(S=null==(T=k)?void 0:T.stderr)?S:"",status:0,timeSeconds:n.timeLimitSeconds+.001,memoryBytes:null!=(L=null==(G=k)?void 0:G.memoryBytes)?L:0,timedOut:!0,signal:null==(B=k)?void 0:B.signal,outputLimitExceeded:!1});case 8:return e.n=9,q(y,{cwd:c,env:l,outputLimitBytes:v,stdin:null!=(u=n.stdin)?u:"",timeLimitSeconds:b});case 9:if(E=e.v,x=(Date.now()-g)/1e3,!k){e.n=10;break}return e.a(2,p({elapsedTimeSeconds:x,options:n,result:r.objectSpread2(r.objectSpread2({},E),{},{timeSeconds:k.timeSeconds+E.timeSeconds,memoryBytes:Math.max(k.memoryBytes,E.memoryBytes)})}));case 10:return e.a(2,p({elapsedTimeSeconds:x,options:n,result:E}));case 11:return e.p=11,e.n=12,a.rm(c,{force:!0,recursive:!0});case 12:return e.f(11);case 13:return e.a(2)}},e,null,[[2,,11,13]])})),l.apply(this,arguments)}function p(e){var n;return{stdin:null!=(n=e.options.stdin)?n:"",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 d(e,n){return s[e](n)}function f(e){return 0!==e.status||e.timedOut||e.outputLimitExceeded}function m(){return(m=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"package.json"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,G(n,["bun.lock","bun.lockb"]);case 3:if(!e.v){e.n=4;break}t=["bun","install","--frozen-lockfile","--silent"],e.n=5;break;case 4:t=["bun","install","--silent"];case 5:return e.a(2,t)}},e)}))).apply(this,arguments)}function y(){return(y=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"Cargo.toml"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,E(i.join(n,"Cargo.lock"));case 3:if(!e.v){e.n=4;break}t=["cargo","fetch","--locked"],e.n=5;break;case 4:t=["cargo","fetch"];case 5:return e.a(2,t)}},e)}))).apply(this,arguments)}function g(){return(g=r.asyncToGenerator(r.regenerator().m(function e(n){return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"go.mod"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.a(2,["go","mod","download"])}},e)}))).apply(this,arguments)}function v(){return(v=r.asyncToGenerator(r.regenerator().m(function e(n){var t,a,o;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,G(n,["build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradlew","gradlew.bat"]);case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:if(t=["--no-daemon","--quiet","dependencies"],"win32"!==process.platform){e.n=6;break}return e.n=3,E(i.join(n,"gradlew.bat"));case 3:if(!e.v){e.n=4;break}a=["cmd.exe","/c","gradlew.bat"].concat(t),e.n=5;break;case 4:a=["gradle"].concat(t);case 5:return e.a(2,a);case 6:return e.n=7,E(i.join(n,"gradlew"));case 7:if(!e.v){e.n=8;break}o=["sh","./gradlew"].concat(t),e.n=9;break;case 8:o=["gradle"].concat(t);case 9:return e.a(2,o)}},e)}))).apply(this,arguments)}function k(){return(k=r.asyncToGenerator(r.regenerator().m(function e(n){var t,a,o;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"pom.xml"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:if(t=["-q","dependency:go-offline"],"win32"!==process.platform){e.n=6;break}return e.n=3,E(i.join(n,"mvnw.cmd"));case 3:if(!e.v){e.n=4;break}a=["cmd.exe","/c","mvnw.cmd"].concat(t),e.n=5;break;case 4:a=["mvn"].concat(t);case 5:return e.a(2,a);case 6:return e.n=7,E(i.join(n,"mvnw"));case 7:if(!e.v){e.n=8;break}o=["sh","./mvnw"].concat(t),e.n=9;break;case 8:o=["mvn"].concat(t);case 9:return e.a(2,o)}},e)}))).apply(this,arguments)}function b(){return(b=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"package.json"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,E(i.join(n,"package-lock.json"));case 3:if(!e.v){e.n=4;break}t=["npm","ci","--silent"],e.n=5;break;case 4:t=["npm","install","--silent"];case 5:return e.a(2,t)}},e)}))).apply(this,arguments)}function h(){return(h=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"package.json"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,E(i.join(n,"pnpm-lock.yaml"));case 3:if(!e.v){e.n=4;break}t=["pnpm","install","--frozen-lockfile","--silent"],e.n=5;break;case 4:t=["pnpm","install","--silent"];case 5:return e.a(2,t)}},e)}))).apply(this,arguments)}function w(){return(w=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"Gemfile"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,E(i.join(n,"Gemfile.lock"));case 3:if(!e.v){e.n=4;break}t=["bundle","install","--frozen","--quiet"],e.n=5;break;case 4:t=["bundle","install","--quiet"];case 5:return e.a(2,t)}},e)}))).apply(this,arguments)}function j(){return(j=r.asyncToGenerator(r.regenerator().m(function e(){return r.regenerator().w(function(e){for(;;)if(0===e.n)return e.a(2,void 0)},e)}))).apply(this,arguments)}function S(){return(S=r.asyncToGenerator(r.regenerator().m(function e(n){var t,a;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"package.json"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,T(n);case 3:return t=e.v,e.n=4,E(i.join(n,"yarn.lock"));case 4:if(a=e.v,!t){e.n=5;break}return e.a(2,a?["yarn","install","--immutable"]:["yarn","install"]);case 5:return e.a(2,a?["yarn","install","--frozen-lockfile","--silent"]:["yarn","install","--silent"])}},e)}))).apply(this,arguments)}function T(e){return L.apply(this,arguments)}function L(){return(L=r.asyncToGenerator(r.regenerator().m(function e(n){var t,a,o,c;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,".yarnrc.yml"));case 1:if(!e.v){e.n=2;break}return e.a(2,!0);case 2:return e.n=3,O(i.join(n,"package.json"));case 3:return a=e.v,o="string"==typeof a.packageManager?a.packageManager:void 0,c=null==(t=/^yarn@(\d+)/.exec(null!=o?o:""))?void 0:t[1],e.a(2,void 0!==c&&Number(c)>=2)}},e)}))).apply(this,arguments)}function G(e,n){return B.apply(this,arguments)}function B(){return(B=r.asyncToGenerator(r.regenerator().m(function e(n,t){var a,o,c,s;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:a=r.createForOfIteratorHelper(t),e.p=1,a.s();case 2:if((o=a.n()).done){e.n=5;break}return c=o.value,e.n=3,E(i.join(n,c));case 3:if(!e.v){e.n=4;break}return e.a(2,!0);case 4:e.n=2;break;case 5:e.n=7;break;case 6:e.p=6,s=e.v,a.e(s);case 7:return e.p=7,a.f(),e.f(7);case 8:return e.a(2,!1)}},e,null,[[1,6,7,8]])}))).apply(this,arguments)}function E(e){return x.apply(this,arguments)}function x(){return(x=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,a.access(n);case 1:return e.a(2,!0);case 2:if(e.p=2,t=e.v,"ENOENT"===("object"===r.typeof(t)&&null!==t&&"code"in t?t.code:void 0)){e.n=3;break}throw t;case 3:return e.a(2,!1)}},e,null,[[0,2]])}))).apply(this,arguments)}function O(e){return I.apply(this,arguments)}function I(){return(I=r.asyncToGenerator(r.regenerator().m(function e(n){var t,o,i;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,o=JSON,e.n=1,a.readFile(n,"utf8");case 1:return t=o.parse.call(o,e.v),e.a(2,"object"!==r.typeof(t)||null===t||Array.isArray(t)?{}:t);case 2:if(e.p=2,!((i=e.v)instanceof SyntaxError)){e.n=3;break}return e.a(2,{});case 3:if("ENOENT"!==("object"===r.typeof(i)&&null!==i&&"code"in i?i.code:void 0)){e.n=4;break}return e.a(2,{});case 4:throw i;case 5:return e.a(2)}},e,null,[[0,2]])}))).apply(this,arguments)}function P(e){return M.apply(this,arguments)}function M(){return(M=r.asyncToGenerator(r.regenerator().m(function e(n){var t,a,o,s,u;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:a=r.createForOfIteratorHelper(null!=(t=n.projectFilePaths)?t:c[n.packageManager]),e.p=1,a.s();case 2:if((o=a.n()).done){e.n=4;break}return s=o.value,e.n=3,N(i.join(n.projectDir,s),i.join(n.runDir,s));case 3:e.n=2;break;case 4:e.n=6;break;case 5:e.p=5,u=e.v,a.e(u);case 6:return e.p=6,a.f(),e.f(6);case 7:return e.a(2)}},e,null,[[1,5,6,7]])}))).apply(this,arguments)}function N(e,n){return D.apply(this,arguments)}function D(){return(D=r.asyncToGenerator(r.regenerator().m(function e(n,t){var o;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,a.cp(n,t,{recursive:!0});case 1:e.n=3;break;case 2:if(e.p=2,o=e.v,"ENOENT"===("object"===r.typeof(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 q(e,n){return C.apply(this,arguments)}function C(){return C=r.asyncToGenerator(r.regenerator().m(function e(n,a){var o,c,s,l,p,d,f,m,y,g,v,k,b,h,w,j,S,T;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return o=void 0===u?void 0:i.join(a.cwd,".exercode-time-result"),c=void 0===u?n:[].concat(r.toConsumableArray(u),["--output=".concat(o)],r.toConsumableArray(n)),s=t.spawn(c[0],c.slice(1),{cwd:a.cwd,detached:"win32"!==process.platform,env:a.env,stdio:["pipe","pipe","pipe"]}),l=[],p=[],d=0,f=!1,m=!1,y=function(e,n){if(d>=a.outputLimitBytes)n.byteLength>0&&(m=!0,F(s,"SIGKILL"));else{var r=a.outputLimitBytes-d,t=n.byteLength>r?n.subarray(0,r):n;e.push(t),d+=t.byteLength,n.byteLength>r&&(m=!0,F(s,"SIGKILL"))}},s.stdout.on("data",function(e){return y(l,e)}),s.stderr.on("data",function(e){return y(p,e)}),g=setTimeout(function(){f=!0,F(s,"SIGTERM")},1e3*a.timeLimitSeconds),(v=setTimeout(function(){f&&F(s,"SIGKILL")},1e3*a.timeLimitSeconds+1e3)).unref(),e.n=1,new Promise(function(e,n){var r,t=!1,o=function(e){t||(r=e,F(s,"SIGKILL"),void 0===s.pid&&(t=!0,n(e)))};s.on("error",o),s.stdin.on("error",function(e){"EPIPE"!==e.code&&o(e)}),s.on("close",function(a,o){t||(t=!0,r?n(r):e({status:null!=a?a:void 0,signal:null!=o?o:void 0}))}),s.stdin.end(a.stdin)}).finally(function(){clearTimeout(g),clearTimeout(v)});case 1:if(k=e.v,b=k.status,h=k.signal,void 0!==o){e.n=2;break}T={timeSeconds:0,memoryBytes:0},e.n=4;break;case 2:return e.n=3,z(o);case 3:T=e.v;case 4:return j=(w=T).timeSeconds,S=w.memoryBytes,e.a(2,{stdout:Buffer.concat(l).toString(),stderr:Buffer.concat(p).toString(),status:b,timeSeconds:j,memoryBytes:S,timedOut:f,signal:h,outputLimitExceeded:m})}},e)})),C.apply(this,arguments)}function F(e,n){if(void 0!==e.pid)try{if("win32"===process.platform)return void e.kill(n);process.kill(-e.pid,n)}catch(e){var t="object"===r.typeof(e)&&null!==e&&"code"in e?e.code:void 0;if("ESRCH"!==t&&"EPERM"!==t)throw e}}function z(e){return A.apply(this,arguments)}function A(){return(A=r.asyncToGenerator(r.regenerator().m(function e(n){var t,o,i;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,a.readFile(n,"utf8");case 1:t=e.v,e.n=4;break;case 2:if(e.p=2,i=e.v,"ENOENT"===("object"===r.typeof(i)&&null!==i&&"code"in i?i.code:void 0)){e.n=3;break}throw i;case 3:return e.a(2,{timeSeconds:0,memoryBytes:0});case 4:if(o=/(\d+(?:[.,]\d+)?) (\d+)\s*$/.exec(t)){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)}exports.copyPackageManagerProjectFiles=P,exports.runCommandInTemporaryPackageManagerProject=function(e){return l.apply(this,arguments)}; | ||
| //# sourceMappingURL=runCommandInTemporaryPackageManagerProject.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:child_process");t=e.__toESM(t,1);let n=require("node:fs/promises");n=e.__toESM(n,1);let r=require("node:os");r=e.__toESM(r,1);let i=require("node:path");i=e.__toESM(i,1);const a={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.lockfile`,`buildscript-gradle.lockfile`,`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`,`.yarnrc.yml`,`.yarn`]},o={bun:f,cargo:p,go:m,gradle:h,maven:g,npm:_,pnpm:v,ruby:y,uv:b,yarn:x},s=k();async function c(e){let t=await n.default.mkdtemp(i.default.join(r.default.tmpdir(),e.tempDirPrefix??`exercode-`));try{await n.default.cp(e.cwd,t,{recursive:!0}),await E({packageManager:e.packageManager,projectDir:e.projectDir,runDir:t,projectFilePaths:e.projectFilePaths});let r=e.env?{...process.env,...e.env}:process.env,i=await u(e.packageManager,t),a=typeof e.command==`function`?e.command({runDir:t}):e.command,o=Date.now(),s=e.outputLimitBytes??52428800,c;if(i&&(c=await O(i,{cwd:t,env:r,outputLimitBytes:s,stdin:``,timeLimitSeconds:e.timeLimitSeconds}),d(c)))return l({elapsedTimeSeconds:(Date.now()-o)/1e3,options:e,result:c});let f=e.timeLimitSeconds-(Date.now()-o)/1e3;if(f<=0)return{stdin:e.stdin??``,stdout:c?.stdout??``,stderr:c?.stderr??``,status:0,timeSeconds:e.timeLimitSeconds+.001,memoryBytes:c?.memoryBytes??0,timedOut:!0,signal:c?.signal,outputLimitExceeded:!1};let p=await O(a,{cwd:t,env:r,outputLimitBytes:s,stdin:e.stdin??``,timeLimitSeconds:f}),m=(Date.now()-o)/1e3;return l(c?{elapsedTimeSeconds:m,options:e,result:{...p,timeSeconds:c.timeSeconds+p.timeSeconds,memoryBytes:Math.max(c.memoryBytes,p.memoryBytes)}}:{elapsedTimeSeconds:m,options:e,result:p})}finally{await n.default.rm(t,{force:!0,recursive:!0})}}function l(e){return{stdin:e.options.stdin??``,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 u(e,t){return o[e](t)}function d(e){return e.status!==0||e.timedOut||e.outputLimitExceeded}async function f(e){if(await w(i.default.join(e,`package.json`)))return await C(e,[`bun.lock`,`bun.lockb`])?[`bun`,`install`,`--frozen-lockfile`,`--silent`]:[`bun`,`install`,`--silent`]}async function p(e){if(await w(i.default.join(e,`Cargo.toml`)))return await w(i.default.join(e,`Cargo.lock`))?[`cargo`,`fetch`,`--locked`]:[`cargo`,`fetch`]}async function m(e){if(await w(i.default.join(e,`go.mod`)))return[`go`,`mod`,`download`]}async function h(e){if(!await C(e,[`build.gradle`,`build.gradle.kts`,`settings.gradle`,`settings.gradle.kts`,`gradlew`,`gradlew.bat`]))return;let t=[`--no-daemon`,`--quiet`,`dependencies`];return process.platform===`win32`?await w(i.default.join(e,`gradlew.bat`))?[`cmd.exe`,`/c`,`gradlew.bat`,...t]:[`gradle`,...t]:await w(i.default.join(e,`gradlew`))?[`sh`,`./gradlew`,...t]:[`gradle`,...t]}async function g(e){if(!await w(i.default.join(e,`pom.xml`)))return;let t=[`-q`,`dependency:go-offline`];return process.platform===`win32`?await w(i.default.join(e,`mvnw.cmd`))?[`cmd.exe`,`/c`,`mvnw.cmd`,...t]:[`mvn`,...t]:await w(i.default.join(e,`mvnw`))?[`sh`,`./mvnw`,...t]:[`mvn`,...t]}async function _(e){if(await w(i.default.join(e,`package.json`)))return await w(i.default.join(e,`package-lock.json`))?[`npm`,`ci`,`--silent`]:[`npm`,`install`,`--silent`]}async function v(e){if(await w(i.default.join(e,`package.json`)))return await w(i.default.join(e,`pnpm-lock.yaml`))?[`pnpm`,`install`,`--frozen-lockfile`,`--silent`]:[`pnpm`,`install`,`--silent`]}async function y(e){if(await w(i.default.join(e,`Gemfile`)))return await w(i.default.join(e,`Gemfile.lock`))?[`bundle`,`install`,`--frozen`,`--quiet`]:[`bundle`,`install`,`--quiet`]}async function b(){}async function x(e){if(!await w(i.default.join(e,`package.json`)))return;let t=await S(e),n=await w(i.default.join(e,`yarn.lock`));return t?n?[`yarn`,`install`,`--immutable`]:[`yarn`,`install`]:n?[`yarn`,`install`,`--frozen-lockfile`,`--silent`]:[`yarn`,`install`,`--silent`]}async function S(e){if(await w(i.default.join(e,`.yarnrc.yml`)))return!0;let t=await T(i.default.join(e,`package.json`)),n=typeof t.packageManager==`string`?t.packageManager:void 0,r=/^yarn@(\d+)/.exec(n??``)?.[1];return r!==void 0&&Number(r)>=2}async function C(e,t){for(let n of t)if(await w(i.default.join(e,n)))return!0;return!1}async function w(e){try{return await n.default.access(e),!0}catch(e){if((typeof e==`object`&&e&&`code`in e?e.code:void 0)!==`ENOENT`)throw e;return!1}}async function T(e){try{let t=JSON.parse(await n.default.readFile(e,`utf8`));return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch(e){if(e instanceof SyntaxError||(typeof e==`object`&&e&&`code`in e?e.code:void 0)===`ENOENT`)return{};throw e}}async function E(e){for(let t of e.projectFilePaths??a[e.packageManager])await D(i.default.join(e.projectDir,t),i.default.join(e.runDir,t))}async function D(e,t){try{await n.default.cp(e,t,{recursive:!0})}catch(e){if((typeof e==`object`&&e&&`code`in e?e.code:void 0)!==`ENOENT`)throw e}}async function O(e,n){let r=s===void 0?void 0:i.default.join(n.cwd,`.exercode-time-result`),a=s===void 0?e:[...s,`--output=${r}`,...e],o=t.default.spawn(a[0],a.slice(1),{cwd:n.cwd,detached:process.platform!==`win32`,env:n.env,stdio:[`pipe`,`pipe`,`pipe`]}),c=[],l=[],u=0,d=!1,f=!1,p=(e,t)=>{if(u>=n.outputLimitBytes){t.byteLength>0&&(f=!0,A(o,`SIGKILL`));return}let r=n.outputLimitBytes-u,i=t.byteLength>r?t.subarray(0,r):t;e.push(i),u+=i.byteLength,t.byteLength>r&&(f=!0,A(o,`SIGKILL`))};o.stdout.on(`data`,e=>p(c,e)),o.stderr.on(`data`,e=>p(l,e));let m=setTimeout(()=>{d=!0,A(o,`SIGTERM`)},n.timeLimitSeconds*1e3),h=setTimeout(()=>{d&&A(o,`SIGKILL`)},n.timeLimitSeconds*1e3+1e3);h.unref();let{status:g,signal:_}=await new Promise((e,t)=>{let r=!1,i,a=e=>{r||(i=e,A(o,`SIGKILL`),o.pid===void 0&&(r=!0,t(e)))};o.on(`error`,a),o.stdin.on(`error`,e=>{e.code!==`EPIPE`&&a(e)}),o.on(`close`,(n,a)=>{if(!r){if(r=!0,i){t(i);return}e({status:n??void 0,signal:a??void 0})}}),o.stdin.end(n.stdin)}).finally(()=>{clearTimeout(m),clearTimeout(h)}),{timeSeconds:v,memoryBytes:y}=r===void 0?{timeSeconds:0,memoryBytes:0}:await j(r);return{stdout:Buffer.concat(c).toString(),stderr:Buffer.concat(l).toString(),status:g,timeSeconds:v,memoryBytes:y,timedOut:d,signal:_,outputLimitExceeded:f}}function k(){let e=r.default.platform()===`darwin`?`gtime`:`/usr/bin/time`,n=t.default.spawnSync(e,[`--version`],{stdio:`ignore`});if(!(n.error||n.status!==0))return[e,`--format`,`%e %M`]}function A(e,t){if(e.pid!==void 0)try{if(process.platform===`win32`){e.kill(t);return}process.kill(-e.pid,t)}catch(e){let t=typeof e==`object`&&e&&`code`in e?e.code:void 0;if(t!==`ESRCH`&&t!==`EPERM`)throw e}}async function j(e){let t;try{t=await n.default.readFile(e,`utf8`)}catch(e){if((typeof e==`object`&&e&&`code`in e?e.code:void 0)!==`ENOENT`)throw e;return{timeSeconds:0,memoryBytes:0}}let r=/(\d+(?:[.,]\d+)?) (\d+)\s*$/.exec(t);return r?{timeSeconds:Number(r[1].replace(`,`,`.`)),memoryBytes:Number(r[2])*1024}:{timeSeconds:0,memoryBytes:0}}exports.copyPackageManagerProjectFiles=E,exports.runCommandInTemporaryPackageManagerProject=c; | ||
| //# sourceMappingURL=runCommandInTemporaryPackageManagerProject.cjs.map |
@@ -1,1 +0,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';\ntype PackageManagerInstallCommand = readonly [string, ...string[]];\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.lockfile',\n 'buildscript-gradle.lockfile',\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', '.yarnrc.yml', '.yarn'],\n} as const satisfies Record<PackageManager, readonly string[]>;\n\nconst packageManagerInstallCommandResolvers = {\n bun: resolveBunInstallCommand,\n cargo: resolveCargoInstallCommand,\n go: resolveGoInstallCommand,\n gradle: resolveGradleInstallCommand,\n maven: resolveMavenInstallCommand,\n npm: resolveNpmInstallCommand,\n pnpm: resolvePnpmInstallCommand,\n ruby: resolveRubyInstallCommand,\n uv: resolveUvInstallCommand,\n yarn: resolveYarnInstallCommand,\n} as const satisfies Record<PackageManager, (runDir: string) => Promise<PackageManagerInstallCommand | undefined>>;\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, prepares dependencies,\n * 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 = await resolveInstallCommand(options.packageManager, 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 packageManager: PackageManager,\n runDir: string\n): Promise<PackageManagerInstallCommand | undefined> {\n return packageManagerInstallCommandResolvers[packageManager](runDir);\n}\n\nfunction isFailedSpawnResult(result: Awaited<ReturnType<typeof spawnWithInput>>): boolean {\n return result.status !== 0 || result.timedOut || result.outputLimitExceeded;\n}\n\nasync function resolveBunInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n // Bun supports --silent and it keeps successful preparation output out of judge output buffers.\n return (await hasAnyPath(runDir, ['bun.lock', 'bun.lockb']))\n ? ['bun', 'install', '--frozen-lockfile', '--silent']\n : ['bun', 'install', '--silent'];\n}\n\nasync function resolveCargoInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'Cargo.toml')))) return undefined;\n return (await pathExists(path.join(runDir, 'Cargo.lock'))) ? ['cargo', 'fetch', '--locked'] : ['cargo', 'fetch'];\n}\n\nasync function resolveGoInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'go.mod')))) return undefined;\n return ['go', 'mod', 'download'];\n}\n\nasync function resolveGradleInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (\n !(await hasAnyPath(runDir, [\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n 'gradlew',\n 'gradlew.bat',\n ]))\n )\n return undefined;\n const args = ['--no-daemon', '--quiet', 'dependencies'] as const;\n if (process.platform === 'win32') {\n return (await pathExists(path.join(runDir, 'gradlew.bat')))\n ? ['cmd.exe', '/c', 'gradlew.bat', ...args]\n : ['gradle', ...args];\n }\n return (await pathExists(path.join(runDir, 'gradlew'))) ? ['sh', './gradlew', ...args] : ['gradle', ...args];\n}\n\nasync function resolveMavenInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'pom.xml')))) return undefined;\n const args = ['-q', 'dependency:go-offline'] as const;\n if (process.platform === 'win32') {\n return (await pathExists(path.join(runDir, 'mvnw.cmd')))\n ? ['cmd.exe', '/c', 'mvnw.cmd', ...args]\n : ['mvn', ...args];\n }\n return (await pathExists(path.join(runDir, 'mvnw'))) ? ['sh', './mvnw', ...args] : ['mvn', ...args];\n}\n\nasync function resolveNpmInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n return (await pathExists(path.join(runDir, 'package-lock.json')))\n ? ['npm', 'ci', '--silent']\n : ['npm', 'install', '--silent'];\n}\n\nasync function resolvePnpmInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n return (await pathExists(path.join(runDir, 'pnpm-lock.yaml')))\n ? ['pnpm', 'install', '--frozen-lockfile', '--silent']\n : ['pnpm', 'install', '--silent'];\n}\n\nasync function resolveRubyInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'Gemfile')))) return undefined;\n return (await pathExists(path.join(runDir, 'Gemfile.lock')))\n ? ['bundle', 'install', '--frozen', '--quiet']\n : ['bundle', 'install', '--quiet'];\n}\n\nasync function resolveUvInstallCommand(): Promise<undefined> {\n return undefined;\n}\n\nasync function resolveYarnInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n const isBerry = await isYarnBerryProject(runDir);\n const hasLockfile = await pathExists(path.join(runDir, 'yarn.lock'));\n if (isBerry) return hasLockfile ? ['yarn', 'install', '--immutable'] : ['yarn', 'install'];\n return hasLockfile ? ['yarn', 'install', '--frozen-lockfile', '--silent'] : ['yarn', 'install', '--silent'];\n}\n\nasync function isYarnBerryProject(runDir: string): Promise<boolean> {\n if (await pathExists(path.join(runDir, '.yarnrc.yml'))) return true;\n\n const packageJson = await readJson(path.join(runDir, 'package.json'));\n const packageManager = typeof packageJson.packageManager === 'string' ? packageJson.packageManager : undefined;\n const yarnMajorVersion = /^yarn@(\\d+)/.exec(packageManager ?? '')?.[1];\n return yarnMajorVersion !== undefined && Number(yarnMajorVersion) >= 2;\n}\n\nasync function hasAnyPath(directoryPath: string, relativePaths: readonly string[]): Promise<boolean> {\n for (const relativePath of relativePaths) {\n if (await pathExists(path.join(directoryPath, relativePath))) return true;\n }\n return false;\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return 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 return false;\n }\n}\n\nasync function readJson(filePath: string): Promise<Record<string, unknown>> {\n try {\n const parsed = JSON.parse(await fs.readFile(filePath, 'utf8')) as unknown;\n return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch (error) {\n if (error instanceof SyntaxError) return {};\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code === 'ENOENT') return {};\n throw error;\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","packageManagerInstallCommandResolvers","_x2","_resolveBunInstallCommand","apply","this","arguments","_x3","_resolveCargoInstallCommand","_x4","_resolveGoInstallCommand","_x5","_resolveGradleInstallCommand","_x6","_resolveMavenInstallCommand","_x7","_resolveNpmInstallCommand","_x8","_resolvePnpmInstallCommand","_x9","_resolveRubyInstallCommand","_resolveUvInstallCommand","_x0","_resolveYarnInstallCommand","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","context","_context$options$stdi","_callee2","_t","_context2","pathExists","undefined","hasAnyPath","_callee3","_t2","_context3","_callee4","_context4","_callee5","args","_t3","_t4","_context5","concat","_callee6","_t5","_t6","_context6","_callee7","_t7","_context7","_callee8","_t8","_context8","_callee9","_t9","_context9","_callee0","_context0","_callee1","isBerry","hasLockfile","_context1","isYarnBerryProject","_x1","_isYarnBerryProject","_callee10","_exec","packageJson","yarnMajorVersion","_context10","readJson","exec","Number","_x10","_x11","_hasAnyPath","_callee11","directoryPath","relativePaths","_iterator","_step","relativePath","_t0","_context11","_createForOfIteratorHelper","s","done","value","e","_x12","_pathExists","_callee12","filePath","_t1","_context12","access","_typeof","code","_x13","_readJson","_callee13","parsed","_t10","_t11","_context13","JSON","readFile","parse","call","Array","isArray","SyntaxError","_x14","_copyPackageManagerProjectFiles","_callee14","_options$projectFileP","_iterator2","_step2","projectFilePath","_t12","_context14","copyPathIfExists","_x15","_x16","_copyPathIfExists","_callee15","sourcePath","destinationPath","_t13","_context15","_x17","_x18","_spawnWithInput","_callee16","timeOutputPath","spawnedCommand","subprocess","stdoutChunks","stderrChunks","outputBytes","appendOutputChunk","timeout","killTimeout","_yield$Promise$finall","_ref","_t14","_context16","_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","_x19","_readTimeResult","_callee17","content","match","_t15","_context17","replace","_x"],"mappings":"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"} | ||
| {"version":3,"file":"runCommandInTemporaryPackageManagerProject.cjs","names":["fs","path","os","childProcess"],"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';\ntype PackageManagerInstallCommand = readonly [string, ...string[]];\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.lockfile',\n 'buildscript-gradle.lockfile',\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', '.yarnrc.yml', '.yarn'],\n} as const satisfies Record<PackageManager, readonly string[]>;\n\nconst packageManagerInstallCommandResolvers = {\n bun: resolveBunInstallCommand,\n cargo: resolveCargoInstallCommand,\n go: resolveGoInstallCommand,\n gradle: resolveGradleInstallCommand,\n maven: resolveMavenInstallCommand,\n npm: resolveNpmInstallCommand,\n pnpm: resolvePnpmInstallCommand,\n ruby: resolveRubyInstallCommand,\n uv: resolveUvInstallCommand,\n yarn: resolveYarnInstallCommand,\n} as const satisfies Record<PackageManager, (runDir: string) => Promise<PackageManagerInstallCommand | undefined>>;\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, prepares dependencies,\n * 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 = await resolveInstallCommand(options.packageManager, 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 packageManager: PackageManager,\n runDir: string\n): Promise<PackageManagerInstallCommand | undefined> {\n return packageManagerInstallCommandResolvers[packageManager](runDir);\n}\n\nfunction isFailedSpawnResult(result: Awaited<ReturnType<typeof spawnWithInput>>): boolean {\n return result.status !== 0 || result.timedOut || result.outputLimitExceeded;\n}\n\nasync function resolveBunInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n // Bun supports --silent and it keeps successful preparation output out of judge output buffers.\n return (await hasAnyPath(runDir, ['bun.lock', 'bun.lockb']))\n ? ['bun', 'install', '--frozen-lockfile', '--silent']\n : ['bun', 'install', '--silent'];\n}\n\nasync function resolveCargoInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'Cargo.toml')))) return undefined;\n return (await pathExists(path.join(runDir, 'Cargo.lock'))) ? ['cargo', 'fetch', '--locked'] : ['cargo', 'fetch'];\n}\n\nasync function resolveGoInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'go.mod')))) return undefined;\n return ['go', 'mod', 'download'];\n}\n\nasync function resolveGradleInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (\n !(await hasAnyPath(runDir, [\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n 'gradlew',\n 'gradlew.bat',\n ]))\n )\n return undefined;\n const args = ['--no-daemon', '--quiet', 'dependencies'] as const;\n if (process.platform === 'win32') {\n return (await pathExists(path.join(runDir, 'gradlew.bat')))\n ? ['cmd.exe', '/c', 'gradlew.bat', ...args]\n : ['gradle', ...args];\n }\n return (await pathExists(path.join(runDir, 'gradlew'))) ? ['sh', './gradlew', ...args] : ['gradle', ...args];\n}\n\nasync function resolveMavenInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'pom.xml')))) return undefined;\n const args = ['-q', 'dependency:go-offline'] as const;\n if (process.platform === 'win32') {\n return (await pathExists(path.join(runDir, 'mvnw.cmd')))\n ? ['cmd.exe', '/c', 'mvnw.cmd', ...args]\n : ['mvn', ...args];\n }\n return (await pathExists(path.join(runDir, 'mvnw'))) ? ['sh', './mvnw', ...args] : ['mvn', ...args];\n}\n\nasync function resolveNpmInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n return (await pathExists(path.join(runDir, 'package-lock.json')))\n ? ['npm', 'ci', '--silent']\n : ['npm', 'install', '--silent'];\n}\n\nasync function resolvePnpmInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n return (await pathExists(path.join(runDir, 'pnpm-lock.yaml')))\n ? ['pnpm', 'install', '--frozen-lockfile', '--silent']\n : ['pnpm', 'install', '--silent'];\n}\n\nasync function resolveRubyInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'Gemfile')))) return undefined;\n return (await pathExists(path.join(runDir, 'Gemfile.lock')))\n ? ['bundle', 'install', '--frozen', '--quiet']\n : ['bundle', 'install', '--quiet'];\n}\n\nasync function resolveUvInstallCommand(): Promise<undefined> {\n return undefined;\n}\n\nasync function resolveYarnInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n const isBerry = await isYarnBerryProject(runDir);\n const hasLockfile = await pathExists(path.join(runDir, 'yarn.lock'));\n if (isBerry) return hasLockfile ? ['yarn', 'install', '--immutable'] : ['yarn', 'install'];\n return hasLockfile ? ['yarn', 'install', '--frozen-lockfile', '--silent'] : ['yarn', 'install', '--silent'];\n}\n\nasync function isYarnBerryProject(runDir: string): Promise<boolean> {\n if (await pathExists(path.join(runDir, '.yarnrc.yml'))) return true;\n\n const packageJson = await readJson(path.join(runDir, 'package.json'));\n const packageManager = typeof packageJson.packageManager === 'string' ? packageJson.packageManager : undefined;\n const yarnMajorVersion = /^yarn@(\\d+)/.exec(packageManager ?? '')?.[1];\n return yarnMajorVersion !== undefined && Number(yarnMajorVersion) >= 2;\n}\n\nasync function hasAnyPath(directoryPath: string, relativePaths: readonly string[]): Promise<boolean> {\n for (const relativePath of relativePaths) {\n if (await pathExists(path.join(directoryPath, relativePath))) return true;\n }\n return false;\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return 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 return false;\n }\n}\n\nasync function readJson(filePath: string): Promise<Record<string, unknown>> {\n try {\n const parsed = JSON.parse(await fs.readFile(filePath, 'utf8')) as unknown;\n return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch (error) {\n if (error instanceof SyntaxError) return {};\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code === 'ENOENT') return {};\n throw error;\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"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as n,regenerator as e,objectSpread2 as r,createForOfIteratorHelper as t,typeof as a,toConsumableArray as i}from"../_virtual/_rollupPluginBabelHelpers.js";import o from"node:child_process";import c from"node:fs/promises";import s from"node:os";import u from"node:path";var l,p,f={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.lockfile","buildscript-gradle.lockfile","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",".yarnrc.yml",".yarn"]},d={bun:function(n){return h.apply(this,arguments)},cargo:function(n){return w.apply(this,arguments)},go:function(n){return j.apply(this,arguments)},gradle:function(n){return S.apply(this,arguments)},maven:function(n){return L.apply(this,arguments)},npm:function(n){return B.apply(this,arguments)},pnpm:function(n){return E.apply(this,arguments)},ruby:function(n){return x.apply(this,arguments)},uv:function(){return T.apply(this,arguments)},yarn:function(n){return O.apply(this,arguments)}},m=(l="darwin"===s.platform()?"gtime":"/usr/bin/time",(p=o.spawnSync(l,["--version"],{stdio:"ignore"})).error||0!==p.status?void 0:[l,"--format","%e %M"]);function v(n){return y.apply(this,arguments)}function y(){return y=n(e().m(function n(t){var a,i,o,l,p,f,d,m,v,y,h,w,j,S,L,B,E,x,T,O,N;return e().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.n=1,c.mkdtemp(u.join(s.tmpdir(),null!=(a=t.tempDirPrefix)?a:"exercode-"));case 1:return i=n.v,n.p=2,n.n=3,c.cp(t.cwd,i,{recursive:!0});case 3:return n.n=4,q({packageManager:t.packageManager,projectDir:t.projectDir,runDir:i,projectFilePaths:t.projectFilePaths});case 4:return p=t.env?r(r({},process.env),t.env):process.env,n.n=5,b(t.packageManager,i);case 5:if(f=n.v,d="function"==typeof t.command?t.command({runDir:i}):t.command,m=Date.now(),v=null!=(o=t.outputLimitBytes)?o:52428800,!f){n.n=7;break}return n.n=6,H(f,{cwd:i,env:p,outputLimitBytes:v,stdin:"",timeLimitSeconds:t.timeLimitSeconds});case 6:if(!g(y=n.v)){n.n=7;break}return n.a(2,k({elapsedTimeSeconds:(Date.now()-m)/1e3,options:t,result:y}));case 7:if(!((h=t.timeLimitSeconds-(Date.now()-m)/1e3)<=0)){n.n=8;break}return n.a(2,{stdin:null!=(w=t.stdin)?w:"",stdout:null!=(j=null==(S=y)?void 0:S.stdout)?j:"",stderr:null!=(L=null==(B=y)?void 0:B.stderr)?L:"",status:0,timeSeconds:t.timeLimitSeconds+.001,memoryBytes:null!=(E=null==(x=y)?void 0:x.memoryBytes)?E:0,timedOut:!0,signal:null==(T=y)?void 0:T.signal,outputLimitExceeded:!1});case 8:return n.n=9,H(d,{cwd:i,env:p,outputLimitBytes:v,stdin:null!=(l=t.stdin)?l:"",timeLimitSeconds:h});case 9:if(O=n.v,N=(Date.now()-m)/1e3,!y){n.n=10;break}return n.a(2,k({elapsedTimeSeconds:N,options:t,result:r(r({},O),{},{timeSeconds:y.timeSeconds+O.timeSeconds,memoryBytes:Math.max(y.memoryBytes,O.memoryBytes)})}));case 10:return n.a(2,k({elapsedTimeSeconds:N,options:t,result:O}));case 11:return n.p=11,n.n=12,c.rm(i,{force:!0,recursive:!0});case 12:return n.f(11);case 13:return n.a(2)}},n,null,[[2,,11,13]])})),y.apply(this,arguments)}function k(n){var e;return{stdin:null!=(e=n.options.stdin)?e:"",stdout:n.result.stdout,stderr:n.result.stderr,status:n.result.timedOut||n.result.outputLimitExceeded?0:n.result.status,timeSeconds:n.result.timedOut?n.options.timeLimitSeconds+.001:n.result.timeSeconds||n.elapsedTimeSeconds,memoryBytes:n.result.memoryBytes,timedOut:n.result.timedOut,signal:n.result.signal,outputLimitExceeded:n.result.outputLimitExceeded}}function b(n,e){return d[n](e)}function g(n){return 0!==n.status||n.timedOut||n.outputLimitExceeded}function h(){return(h=n(e().m(function n(r){var t;return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,M(u.join(r,"package.json"));case 1:if(n.v){n.n=2;break}return n.a(2,void 0);case 2:return n.n=3,I(r,["bun.lock","bun.lockb"]);case 3:if(!n.v){n.n=4;break}t=["bun","install","--frozen-lockfile","--silent"],n.n=5;break;case 4:t=["bun","install","--silent"];case 5:return n.a(2,t)}},n)}))).apply(this,arguments)}function w(){return(w=n(e().m(function n(r){var t;return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,M(u.join(r,"Cargo.toml"));case 1:if(n.v){n.n=2;break}return n.a(2,void 0);case 2:return n.n=3,M(u.join(r,"Cargo.lock"));case 3:if(!n.v){n.n=4;break}t=["cargo","fetch","--locked"],n.n=5;break;case 4:t=["cargo","fetch"];case 5:return n.a(2,t)}},n)}))).apply(this,arguments)}function j(){return(j=n(e().m(function n(r){return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,M(u.join(r,"go.mod"));case 1:if(n.v){n.n=2;break}return n.a(2,void 0);case 2:return n.a(2,["go","mod","download"])}},n)}))).apply(this,arguments)}function S(){return(S=n(e().m(function n(r){var t,a,i;return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,I(r,["build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradlew","gradlew.bat"]);case 1:if(n.v){n.n=2;break}return n.a(2,void 0);case 2:if(t=["--no-daemon","--quiet","dependencies"],"win32"!==process.platform){n.n=6;break}return n.n=3,M(u.join(r,"gradlew.bat"));case 3:if(!n.v){n.n=4;break}a=["cmd.exe","/c","gradlew.bat"].concat(t),n.n=5;break;case 4:a=["gradle"].concat(t);case 5:return n.a(2,a);case 6:return n.n=7,M(u.join(r,"gradlew"));case 7:if(!n.v){n.n=8;break}i=["sh","./gradlew"].concat(t),n.n=9;break;case 8:i=["gradle"].concat(t);case 9:return n.a(2,i)}},n)}))).apply(this,arguments)}function L(){return(L=n(e().m(function n(r){var t,a,i;return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,M(u.join(r,"pom.xml"));case 1:if(n.v){n.n=2;break}return n.a(2,void 0);case 2:if(t=["-q","dependency:go-offline"],"win32"!==process.platform){n.n=6;break}return n.n=3,M(u.join(r,"mvnw.cmd"));case 3:if(!n.v){n.n=4;break}a=["cmd.exe","/c","mvnw.cmd"].concat(t),n.n=5;break;case 4:a=["mvn"].concat(t);case 5:return n.a(2,a);case 6:return n.n=7,M(u.join(r,"mvnw"));case 7:if(!n.v){n.n=8;break}i=["sh","./mvnw"].concat(t),n.n=9;break;case 8:i=["mvn"].concat(t);case 9:return n.a(2,i)}},n)}))).apply(this,arguments)}function B(){return(B=n(e().m(function n(r){var t;return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,M(u.join(r,"package.json"));case 1:if(n.v){n.n=2;break}return n.a(2,void 0);case 2:return n.n=3,M(u.join(r,"package-lock.json"));case 3:if(!n.v){n.n=4;break}t=["npm","ci","--silent"],n.n=5;break;case 4:t=["npm","install","--silent"];case 5:return n.a(2,t)}},n)}))).apply(this,arguments)}function E(){return(E=n(e().m(function n(r){var t;return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,M(u.join(r,"package.json"));case 1:if(n.v){n.n=2;break}return n.a(2,void 0);case 2:return n.n=3,M(u.join(r,"pnpm-lock.yaml"));case 3:if(!n.v){n.n=4;break}t=["pnpm","install","--frozen-lockfile","--silent"],n.n=5;break;case 4:t=["pnpm","install","--silent"];case 5:return n.a(2,t)}},n)}))).apply(this,arguments)}function x(){return(x=n(e().m(function n(r){var t;return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,M(u.join(r,"Gemfile"));case 1:if(n.v){n.n=2;break}return n.a(2,void 0);case 2:return n.n=3,M(u.join(r,"Gemfile.lock"));case 3:if(!n.v){n.n=4;break}t=["bundle","install","--frozen","--quiet"],n.n=5;break;case 4:t=["bundle","install","--quiet"];case 5:return n.a(2,t)}},n)}))).apply(this,arguments)}function T(){return(T=n(e().m(function n(){return e().w(function(n){for(;;)if(0===n.n)return n.a(2,void 0)},n)}))).apply(this,arguments)}function O(){return(O=n(e().m(function n(r){var t,a;return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,M(u.join(r,"package.json"));case 1:if(n.v){n.n=2;break}return n.a(2,void 0);case 2:return n.n=3,N(r);case 3:return t=n.v,n.n=4,M(u.join(r,"yarn.lock"));case 4:if(a=n.v,!t){n.n=5;break}return n.a(2,a?["yarn","install","--immutable"]:["yarn","install"]);case 5:return n.a(2,a?["yarn","install","--frozen-lockfile","--silent"]:["yarn","install","--silent"])}},n)}))).apply(this,arguments)}function N(n){return D.apply(this,arguments)}function D(){return(D=n(e().m(function n(r){var t,a,i,o;return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,M(u.join(r,".yarnrc.yml"));case 1:if(!n.v){n.n=2;break}return n.a(2,!0);case 2:return n.n=3,C(u.join(r,"package.json"));case 3:return a=n.v,i="string"==typeof a.packageManager?a.packageManager:void 0,o=null==(t=/^yarn@(\d+)/.exec(null!=i?i:""))?void 0:t[1],n.a(2,void 0!==o&&Number(o)>=2)}},n)}))).apply(this,arguments)}function I(n,e){return G.apply(this,arguments)}function G(){return(G=n(e().m(function n(r,a){var i,o,c,s;return e().w(function(n){for(;;)switch(n.p=n.n){case 0:i=t(a),n.p=1,i.s();case 2:if((o=i.n()).done){n.n=5;break}return c=o.value,n.n=3,M(u.join(r,c));case 3:if(!n.v){n.n=4;break}return n.a(2,!0);case 4:n.n=2;break;case 5:n.n=7;break;case 6:n.p=6,s=n.v,i.e(s);case 7:return n.p=7,i.f(),n.f(7);case 8:return n.a(2,!1)}},n,null,[[1,6,7,8]])}))).apply(this,arguments)}function M(n){return P.apply(this,arguments)}function P(){return(P=n(e().m(function n(r){var t;return e().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.p=0,n.n=1,c.access(r);case 1:return n.a(2,!0);case 2:if(n.p=2,t=n.v,"ENOENT"===("object"===a(t)&&null!==t&&"code"in t?t.code:void 0)){n.n=3;break}throw t;case 3:return n.a(2,!1)}},n,null,[[0,2]])}))).apply(this,arguments)}function C(n){return F.apply(this,arguments)}function F(){return(F=n(e().m(function n(r){var t,i,o;return e().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.p=0,i=JSON,n.n=1,c.readFile(r,"utf8");case 1:return t=i.parse.call(i,n.v),n.a(2,"object"!==a(t)||null===t||Array.isArray(t)?{}:t);case 2:if(n.p=2,!((o=n.v)instanceof SyntaxError)){n.n=3;break}return n.a(2,{});case 3:if("ENOENT"!==("object"===a(o)&&null!==o&&"code"in o?o.code:void 0)){n.n=4;break}return n.a(2,{});case 4:throw o;case 5:return n.a(2)}},n,null,[[0,2]])}))).apply(this,arguments)}function q(n){return z.apply(this,arguments)}function z(){return(z=n(e().m(function n(r){var a,i,o,c,s;return e().w(function(n){for(;;)switch(n.p=n.n){case 0:i=t(null!=(a=r.projectFilePaths)?a:f[r.packageManager]),n.p=1,i.s();case 2:if((o=i.n()).done){n.n=4;break}return c=o.value,n.n=3,K(u.join(r.projectDir,c),u.join(r.runDir,c));case 3:n.n=2;break;case 4:n.n=6;break;case 5:n.p=5,s=n.v,i.e(s);case 6:return n.p=6,i.f(),n.f(6);case 7:return n.a(2)}},n,null,[[1,5,6,7]])}))).apply(this,arguments)}function K(n,e){return A.apply(this,arguments)}function A(){return(A=n(e().m(function n(r,t){var i;return e().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.p=0,n.n=1,c.cp(r,t,{recursive:!0});case 1:n.n=3;break;case 2:if(n.p=2,i=n.v,"ENOENT"===("object"===a(i)&&null!==i&&"code"in i?i.code:void 0)){n.n=3;break}throw i;case 3:return n.a(2)}},n,null,[[0,2]])}))).apply(this,arguments)}function H(n,e){return R.apply(this,arguments)}function R(){return R=n(e().m(function n(r,t){var a,c,s,l,p,f,d,v,y,k,b,g,h,w,j,S,L,B;return e().w(function(n){for(;;)switch(n.n){case 0:return a=void 0===m?void 0:u.join(t.cwd,".exercode-time-result"),c=void 0===m?r:[].concat(i(m),["--output=".concat(a)],i(r)),s=o.spawn(c[0],c.slice(1),{cwd:t.cwd,detached:"win32"!==process.platform,env:t.env,stdio:["pipe","pipe","pipe"]}),l=[],p=[],f=0,d=!1,v=!1,y=function(n,e){if(f>=t.outputLimitBytes)e.byteLength>0&&(v=!0,_(s,"SIGKILL"));else{var r=t.outputLimitBytes-f,a=e.byteLength>r?e.subarray(0,r):e;n.push(a),f+=a.byteLength,e.byteLength>r&&(v=!0,_(s,"SIGKILL"))}},s.stdout.on("data",function(n){return y(l,n)}),s.stderr.on("data",function(n){return y(p,n)}),k=setTimeout(function(){d=!0,_(s,"SIGTERM")},1e3*t.timeLimitSeconds),(b=setTimeout(function(){d&&_(s,"SIGKILL")},1e3*t.timeLimitSeconds+1e3)).unref(),n.n=1,new Promise(function(n,e){var r,a=!1,i=function(n){a||(r=n,_(s,"SIGKILL"),void 0===s.pid&&(a=!0,e(n)))};s.on("error",i),s.stdin.on("error",function(n){"EPIPE"!==n.code&&i(n)}),s.on("close",function(t,i){a||(a=!0,r?e(r):n({status:null!=t?t:void 0,signal:null!=i?i:void 0}))}),s.stdin.end(t.stdin)}).finally(function(){clearTimeout(k),clearTimeout(b)});case 1:if(g=n.v,h=g.status,w=g.signal,void 0!==a){n.n=2;break}B={timeSeconds:0,memoryBytes:0},n.n=4;break;case 2:return n.n=3,J(a);case 3:B=n.v;case 4:return S=(j=B).timeSeconds,L=j.memoryBytes,n.a(2,{stdout:Buffer.concat(l).toString(),stderr:Buffer.concat(p).toString(),status:h,timeSeconds:S,memoryBytes:L,timedOut:d,signal:w,outputLimitExceeded:v})}},n)})),R.apply(this,arguments)}function _(n,e){if(void 0!==n.pid)try{if("win32"===process.platform)return void n.kill(e);process.kill(-n.pid,e)}catch(n){var r="object"===a(n)&&null!==n&&"code"in n?n.code:void 0;if("ESRCH"!==r&&"EPERM"!==r)throw n}}function J(n){return $.apply(this,arguments)}function $(){return($=n(e().m(function n(r){var t,i,o;return e().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.p=0,n.n=1,c.readFile(r,"utf8");case 1:t=n.v,n.n=4;break;case 2:if(n.p=2,o=n.v,"ENOENT"===("object"===a(o)&&null!==o&&"code"in o?o.code:void 0)){n.n=3;break}throw o;case 3:return n.a(2,{timeSeconds:0,memoryBytes:0});case 4:if(i=/(\d+(?:[.,]\d+)?) (\d+)\s*$/.exec(t)){n.n=5;break}return n.a(2,{timeSeconds:0,memoryBytes:0});case 5:return n.a(2,{timeSeconds:Number(i[1].replace(",",".")),memoryBytes:1024*Number(i[2])})}},n,null,[[0,2]])}))).apply(this,arguments)}export{q as copyPackageManagerProjectFiles,v as runCommandInTemporaryPackageManagerProject}; | ||
| //# sourceMappingURL=runCommandInTemporaryPackageManagerProject.js.map | ||
| import e from"node:child_process";import t from"node:fs/promises";import n from"node:os";import r from"node:path";const i={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.lockfile`,`buildscript-gradle.lockfile`,`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`,`.yarnrc.yml`,`.yarn`]},a={bun:d,cargo:f,go:p,gradle:m,maven:h,npm:g,pnpm:_,ruby:v,uv:y,yarn:b},o=O();async function s(e){let i=await t.mkdtemp(r.join(n.tmpdir(),e.tempDirPrefix??`exercode-`));try{await t.cp(e.cwd,i,{recursive:!0}),await T({packageManager:e.packageManager,projectDir:e.projectDir,runDir:i,projectFilePaths:e.projectFilePaths});let n=e.env?{...process.env,...e.env}:process.env,r=await l(e.packageManager,i),a=typeof e.command==`function`?e.command({runDir:i}):e.command,o=Date.now(),s=e.outputLimitBytes??52428800,d;if(r&&(d=await D(r,{cwd:i,env:n,outputLimitBytes:s,stdin:``,timeLimitSeconds:e.timeLimitSeconds}),u(d)))return c({elapsedTimeSeconds:(Date.now()-o)/1e3,options:e,result:d});let f=e.timeLimitSeconds-(Date.now()-o)/1e3;if(f<=0)return{stdin:e.stdin??``,stdout:d?.stdout??``,stderr:d?.stderr??``,status:0,timeSeconds:e.timeLimitSeconds+.001,memoryBytes:d?.memoryBytes??0,timedOut:!0,signal:d?.signal,outputLimitExceeded:!1};let p=await D(a,{cwd:i,env:n,outputLimitBytes:s,stdin:e.stdin??``,timeLimitSeconds:f}),m=(Date.now()-o)/1e3;return c(d?{elapsedTimeSeconds:m,options:e,result:{...p,timeSeconds:d.timeSeconds+p.timeSeconds,memoryBytes:Math.max(d.memoryBytes,p.memoryBytes)}}:{elapsedTimeSeconds:m,options:e,result:p})}finally{await t.rm(i,{force:!0,recursive:!0})}}function c(e){return{stdin:e.options.stdin??``,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 l(e,t){return a[e](t)}function u(e){return e.status!==0||e.timedOut||e.outputLimitExceeded}async function d(e){if(await C(r.join(e,`package.json`)))return await S(e,[`bun.lock`,`bun.lockb`])?[`bun`,`install`,`--frozen-lockfile`,`--silent`]:[`bun`,`install`,`--silent`]}async function f(e){if(await C(r.join(e,`Cargo.toml`)))return await C(r.join(e,`Cargo.lock`))?[`cargo`,`fetch`,`--locked`]:[`cargo`,`fetch`]}async function p(e){if(await C(r.join(e,`go.mod`)))return[`go`,`mod`,`download`]}async function m(e){if(!await S(e,[`build.gradle`,`build.gradle.kts`,`settings.gradle`,`settings.gradle.kts`,`gradlew`,`gradlew.bat`]))return;let t=[`--no-daemon`,`--quiet`,`dependencies`];return process.platform===`win32`?await C(r.join(e,`gradlew.bat`))?[`cmd.exe`,`/c`,`gradlew.bat`,...t]:[`gradle`,...t]:await C(r.join(e,`gradlew`))?[`sh`,`./gradlew`,...t]:[`gradle`,...t]}async function h(e){if(!await C(r.join(e,`pom.xml`)))return;let t=[`-q`,`dependency:go-offline`];return process.platform===`win32`?await C(r.join(e,`mvnw.cmd`))?[`cmd.exe`,`/c`,`mvnw.cmd`,...t]:[`mvn`,...t]:await C(r.join(e,`mvnw`))?[`sh`,`./mvnw`,...t]:[`mvn`,...t]}async function g(e){if(await C(r.join(e,`package.json`)))return await C(r.join(e,`package-lock.json`))?[`npm`,`ci`,`--silent`]:[`npm`,`install`,`--silent`]}async function _(e){if(await C(r.join(e,`package.json`)))return await C(r.join(e,`pnpm-lock.yaml`))?[`pnpm`,`install`,`--frozen-lockfile`,`--silent`]:[`pnpm`,`install`,`--silent`]}async function v(e){if(await C(r.join(e,`Gemfile`)))return await C(r.join(e,`Gemfile.lock`))?[`bundle`,`install`,`--frozen`,`--quiet`]:[`bundle`,`install`,`--quiet`]}async function y(){}async function b(e){if(!await C(r.join(e,`package.json`)))return;let t=await x(e),n=await C(r.join(e,`yarn.lock`));return t?n?[`yarn`,`install`,`--immutable`]:[`yarn`,`install`]:n?[`yarn`,`install`,`--frozen-lockfile`,`--silent`]:[`yarn`,`install`,`--silent`]}async function x(e){if(await C(r.join(e,`.yarnrc.yml`)))return!0;let t=await w(r.join(e,`package.json`)),n=typeof t.packageManager==`string`?t.packageManager:void 0,i=/^yarn@(\d+)/.exec(n??``)?.[1];return i!==void 0&&Number(i)>=2}async function S(e,t){for(let n of t)if(await C(r.join(e,n)))return!0;return!1}async function C(e){try{return await t.access(e),!0}catch(e){if((typeof e==`object`&&e&&`code`in e?e.code:void 0)!==`ENOENT`)throw e;return!1}}async function w(e){try{let n=JSON.parse(await t.readFile(e,`utf8`));return typeof n==`object`&&n&&!Array.isArray(n)?n:{}}catch(e){if(e instanceof SyntaxError||(typeof e==`object`&&e&&`code`in e?e.code:void 0)===`ENOENT`)return{};throw e}}async function T(e){for(let t of e.projectFilePaths??i[e.packageManager])await E(r.join(e.projectDir,t),r.join(e.runDir,t))}async function E(e,n){try{await t.cp(e,n,{recursive:!0})}catch(e){if((typeof e==`object`&&e&&`code`in e?e.code:void 0)!==`ENOENT`)throw e}}async function D(t,n){let i=o===void 0?void 0:r.join(n.cwd,`.exercode-time-result`),a=o===void 0?t:[...o,`--output=${i}`,...t],s=e.spawn(a[0],a.slice(1),{cwd:n.cwd,detached:process.platform!==`win32`,env:n.env,stdio:[`pipe`,`pipe`,`pipe`]}),c=[],l=[],u=0,d=!1,f=!1,p=(e,t)=>{if(u>=n.outputLimitBytes){t.byteLength>0&&(f=!0,k(s,`SIGKILL`));return}let r=n.outputLimitBytes-u,i=t.byteLength>r?t.subarray(0,r):t;e.push(i),u+=i.byteLength,t.byteLength>r&&(f=!0,k(s,`SIGKILL`))};s.stdout.on(`data`,e=>p(c,e)),s.stderr.on(`data`,e=>p(l,e));let m=setTimeout(()=>{d=!0,k(s,`SIGTERM`)},n.timeLimitSeconds*1e3),h=setTimeout(()=>{d&&k(s,`SIGKILL`)},n.timeLimitSeconds*1e3+1e3);h.unref();let{status:g,signal:_}=await new Promise((e,t)=>{let r=!1,i,a=e=>{r||(i=e,k(s,`SIGKILL`),s.pid===void 0&&(r=!0,t(e)))};s.on(`error`,a),s.stdin.on(`error`,e=>{e.code!==`EPIPE`&&a(e)}),s.on(`close`,(n,a)=>{if(!r){if(r=!0,i){t(i);return}e({status:n??void 0,signal:a??void 0})}}),s.stdin.end(n.stdin)}).finally(()=>{clearTimeout(m),clearTimeout(h)}),{timeSeconds:v,memoryBytes:y}=i===void 0?{timeSeconds:0,memoryBytes:0}:await A(i);return{stdout:Buffer.concat(c).toString(),stderr:Buffer.concat(l).toString(),status:g,timeSeconds:v,memoryBytes:y,timedOut:d,signal:_,outputLimitExceeded:f}}function O(){let t=n.platform()===`darwin`?`gtime`:`/usr/bin/time`,r=e.spawnSync(t,[`--version`],{stdio:`ignore`});if(!(r.error||r.status!==0))return[t,`--format`,`%e %M`]}function k(e,t){if(e.pid!==void 0)try{if(process.platform===`win32`){e.kill(t);return}process.kill(-e.pid,t)}catch(e){let t=typeof e==`object`&&e&&`code`in e?e.code:void 0;if(t!==`ESRCH`&&t!==`EPERM`)throw e}}async function A(e){let n;try{n=await t.readFile(e,`utf8`)}catch(e){if((typeof e==`object`&&e&&`code`in e?e.code:void 0)!==`ENOENT`)throw e;return{timeSeconds:0,memoryBytes:0}}let r=/(\d+(?:[.,]\d+)?) (\d+)\s*$/.exec(n);return r?{timeSeconds:Number(r[1].replace(`,`,`.`)),memoryBytes:Number(r[2])*1024}:{timeSeconds:0,memoryBytes:0}}export{T as copyPackageManagerProjectFiles,s as runCommandInTemporaryPackageManagerProject}; | ||
| //# sourceMappingURL=runCommandInTemporaryPackageManagerProject.js.map |
@@ -1,1 +0,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';\ntype PackageManagerInstallCommand = readonly [string, ...string[]];\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.lockfile',\n 'buildscript-gradle.lockfile',\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', '.yarnrc.yml', '.yarn'],\n} as const satisfies Record<PackageManager, readonly string[]>;\n\nconst packageManagerInstallCommandResolvers = {\n bun: resolveBunInstallCommand,\n cargo: resolveCargoInstallCommand,\n go: resolveGoInstallCommand,\n gradle: resolveGradleInstallCommand,\n maven: resolveMavenInstallCommand,\n npm: resolveNpmInstallCommand,\n pnpm: resolvePnpmInstallCommand,\n ruby: resolveRubyInstallCommand,\n uv: resolveUvInstallCommand,\n yarn: resolveYarnInstallCommand,\n} as const satisfies Record<PackageManager, (runDir: string) => Promise<PackageManagerInstallCommand | undefined>>;\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, prepares dependencies,\n * 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 = await resolveInstallCommand(options.packageManager, 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 packageManager: PackageManager,\n runDir: string\n): Promise<PackageManagerInstallCommand | undefined> {\n return packageManagerInstallCommandResolvers[packageManager](runDir);\n}\n\nfunction isFailedSpawnResult(result: Awaited<ReturnType<typeof spawnWithInput>>): boolean {\n return result.status !== 0 || result.timedOut || result.outputLimitExceeded;\n}\n\nasync function resolveBunInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n // Bun supports --silent and it keeps successful preparation output out of judge output buffers.\n return (await hasAnyPath(runDir, ['bun.lock', 'bun.lockb']))\n ? ['bun', 'install', '--frozen-lockfile', '--silent']\n : ['bun', 'install', '--silent'];\n}\n\nasync function resolveCargoInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'Cargo.toml')))) return undefined;\n return (await pathExists(path.join(runDir, 'Cargo.lock'))) ? ['cargo', 'fetch', '--locked'] : ['cargo', 'fetch'];\n}\n\nasync function resolveGoInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'go.mod')))) return undefined;\n return ['go', 'mod', 'download'];\n}\n\nasync function resolveGradleInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (\n !(await hasAnyPath(runDir, [\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n 'gradlew',\n 'gradlew.bat',\n ]))\n )\n return undefined;\n const args = ['--no-daemon', '--quiet', 'dependencies'] as const;\n if (process.platform === 'win32') {\n return (await pathExists(path.join(runDir, 'gradlew.bat')))\n ? ['cmd.exe', '/c', 'gradlew.bat', ...args]\n : ['gradle', ...args];\n }\n return (await pathExists(path.join(runDir, 'gradlew'))) ? ['sh', './gradlew', ...args] : ['gradle', ...args];\n}\n\nasync function resolveMavenInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'pom.xml')))) return undefined;\n const args = ['-q', 'dependency:go-offline'] as const;\n if (process.platform === 'win32') {\n return (await pathExists(path.join(runDir, 'mvnw.cmd')))\n ? ['cmd.exe', '/c', 'mvnw.cmd', ...args]\n : ['mvn', ...args];\n }\n return (await pathExists(path.join(runDir, 'mvnw'))) ? ['sh', './mvnw', ...args] : ['mvn', ...args];\n}\n\nasync function resolveNpmInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n return (await pathExists(path.join(runDir, 'package-lock.json')))\n ? ['npm', 'ci', '--silent']\n : ['npm', 'install', '--silent'];\n}\n\nasync function resolvePnpmInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n return (await pathExists(path.join(runDir, 'pnpm-lock.yaml')))\n ? ['pnpm', 'install', '--frozen-lockfile', '--silent']\n : ['pnpm', 'install', '--silent'];\n}\n\nasync function resolveRubyInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'Gemfile')))) return undefined;\n return (await pathExists(path.join(runDir, 'Gemfile.lock')))\n ? ['bundle', 'install', '--frozen', '--quiet']\n : ['bundle', 'install', '--quiet'];\n}\n\nasync function resolveUvInstallCommand(): Promise<undefined> {\n return undefined;\n}\n\nasync function resolveYarnInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n const isBerry = await isYarnBerryProject(runDir);\n const hasLockfile = await pathExists(path.join(runDir, 'yarn.lock'));\n if (isBerry) return hasLockfile ? ['yarn', 'install', '--immutable'] : ['yarn', 'install'];\n return hasLockfile ? ['yarn', 'install', '--frozen-lockfile', '--silent'] : ['yarn', 'install', '--silent'];\n}\n\nasync function isYarnBerryProject(runDir: string): Promise<boolean> {\n if (await pathExists(path.join(runDir, '.yarnrc.yml'))) return true;\n\n const packageJson = await readJson(path.join(runDir, 'package.json'));\n const packageManager = typeof packageJson.packageManager === 'string' ? packageJson.packageManager : undefined;\n const yarnMajorVersion = /^yarn@(\\d+)/.exec(packageManager ?? '')?.[1];\n return yarnMajorVersion !== undefined && Number(yarnMajorVersion) >= 2;\n}\n\nasync function hasAnyPath(directoryPath: string, relativePaths: readonly string[]): Promise<boolean> {\n for (const relativePath of relativePaths) {\n if (await pathExists(path.join(directoryPath, relativePath))) return true;\n }\n return false;\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return 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 return false;\n }\n}\n\nasync function readJson(filePath: string): Promise<Record<string, unknown>> {\n try {\n const parsed = JSON.parse(await fs.readFile(filePath, 'utf8')) as unknown;\n return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch (error) {\n if (error instanceof SyntaxError) return {};\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code === 'ENOENT') return {};\n throw error;\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","packageManagerInstallCommandResolvers","_x2","_resolveBunInstallCommand","apply","this","arguments","_x3","_resolveCargoInstallCommand","_x4","_resolveGoInstallCommand","_x5","_resolveGradleInstallCommand","_x6","_resolveMavenInstallCommand","_x7","_resolveNpmInstallCommand","_x8","_resolvePnpmInstallCommand","_x9","_resolveRubyInstallCommand","_resolveUvInstallCommand","_x0","_resolveYarnInstallCommand","timeCommand","os","platform","childProcess","spawnSync","stdio","error","status","runCommandInTemporaryPackageManagerProject","_x","_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","context","_context$options$stdi","_callee2","_t","_context2","pathExists","undefined","hasAnyPath","_callee3","_t2","_context3","_callee4","_context4","_callee5","args","_t3","_t4","_context5","concat","_callee6","_t5","_t6","_context6","_callee7","_t7","_context7","_callee8","_t8","_context8","_callee9","_t9","_context9","_callee0","_context0","_callee1","isBerry","hasLockfile","_context1","isYarnBerryProject","_x1","_isYarnBerryProject","_callee10","_exec","packageJson","yarnMajorVersion","_context10","readJson","exec","Number","_x10","_x11","_hasAnyPath","_callee11","directoryPath","relativePaths","_iterator","_step","relativePath","_t0","_context11","_createForOfIteratorHelper","s","done","value","e","_x12","_pathExists","_callee12","filePath","_t1","_context12","access","_typeof","code","_x13","_readJson","_callee13","parsed","_t10","_t11","_context13","JSON","readFile","parse","call","Array","isArray","SyntaxError","_x14","_copyPackageManagerProjectFiles","_callee14","_options$projectFileP","_iterator2","_step2","projectFilePath","_t12","_context14","copyPathIfExists","_x15","_x16","_copyPathIfExists","_callee15","sourcePath","destinationPath","_t13","_context15","_x17","_x18","_spawnWithInput","_callee16","timeOutputPath","spawnedCommand","subprocess","stdoutChunks","stderrChunks","outputBytes","appendOutputChunk","timeout","killTimeout","_yield$Promise$finall","_ref","_t14","_context16","_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","_x19","_readTimeResult","_callee17","content","match","_t15","_context17","replace"],"mappings":"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"} | ||
| {"version":3,"file":"runCommandInTemporaryPackageManagerProject.js","names":[],"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';\ntype PackageManagerInstallCommand = readonly [string, ...string[]];\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.lockfile',\n 'buildscript-gradle.lockfile',\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', '.yarnrc.yml', '.yarn'],\n} as const satisfies Record<PackageManager, readonly string[]>;\n\nconst packageManagerInstallCommandResolvers = {\n bun: resolveBunInstallCommand,\n cargo: resolveCargoInstallCommand,\n go: resolveGoInstallCommand,\n gradle: resolveGradleInstallCommand,\n maven: resolveMavenInstallCommand,\n npm: resolveNpmInstallCommand,\n pnpm: resolvePnpmInstallCommand,\n ruby: resolveRubyInstallCommand,\n uv: resolveUvInstallCommand,\n yarn: resolveYarnInstallCommand,\n} as const satisfies Record<PackageManager, (runDir: string) => Promise<PackageManagerInstallCommand | undefined>>;\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, prepares dependencies,\n * 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 = await resolveInstallCommand(options.packageManager, 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 packageManager: PackageManager,\n runDir: string\n): Promise<PackageManagerInstallCommand | undefined> {\n return packageManagerInstallCommandResolvers[packageManager](runDir);\n}\n\nfunction isFailedSpawnResult(result: Awaited<ReturnType<typeof spawnWithInput>>): boolean {\n return result.status !== 0 || result.timedOut || result.outputLimitExceeded;\n}\n\nasync function resolveBunInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n // Bun supports --silent and it keeps successful preparation output out of judge output buffers.\n return (await hasAnyPath(runDir, ['bun.lock', 'bun.lockb']))\n ? ['bun', 'install', '--frozen-lockfile', '--silent']\n : ['bun', 'install', '--silent'];\n}\n\nasync function resolveCargoInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'Cargo.toml')))) return undefined;\n return (await pathExists(path.join(runDir, 'Cargo.lock'))) ? ['cargo', 'fetch', '--locked'] : ['cargo', 'fetch'];\n}\n\nasync function resolveGoInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'go.mod')))) return undefined;\n return ['go', 'mod', 'download'];\n}\n\nasync function resolveGradleInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (\n !(await hasAnyPath(runDir, [\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n 'gradlew',\n 'gradlew.bat',\n ]))\n )\n return undefined;\n const args = ['--no-daemon', '--quiet', 'dependencies'] as const;\n if (process.platform === 'win32') {\n return (await pathExists(path.join(runDir, 'gradlew.bat')))\n ? ['cmd.exe', '/c', 'gradlew.bat', ...args]\n : ['gradle', ...args];\n }\n return (await pathExists(path.join(runDir, 'gradlew'))) ? ['sh', './gradlew', ...args] : ['gradle', ...args];\n}\n\nasync function resolveMavenInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'pom.xml')))) return undefined;\n const args = ['-q', 'dependency:go-offline'] as const;\n if (process.platform === 'win32') {\n return (await pathExists(path.join(runDir, 'mvnw.cmd')))\n ? ['cmd.exe', '/c', 'mvnw.cmd', ...args]\n : ['mvn', ...args];\n }\n return (await pathExists(path.join(runDir, 'mvnw'))) ? ['sh', './mvnw', ...args] : ['mvn', ...args];\n}\n\nasync function resolveNpmInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n return (await pathExists(path.join(runDir, 'package-lock.json')))\n ? ['npm', 'ci', '--silent']\n : ['npm', 'install', '--silent'];\n}\n\nasync function resolvePnpmInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n return (await pathExists(path.join(runDir, 'pnpm-lock.yaml')))\n ? ['pnpm', 'install', '--frozen-lockfile', '--silent']\n : ['pnpm', 'install', '--silent'];\n}\n\nasync function resolveRubyInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'Gemfile')))) return undefined;\n return (await pathExists(path.join(runDir, 'Gemfile.lock')))\n ? ['bundle', 'install', '--frozen', '--quiet']\n : ['bundle', 'install', '--quiet'];\n}\n\nasync function resolveUvInstallCommand(): Promise<undefined> {\n return undefined;\n}\n\nasync function resolveYarnInstallCommand(runDir: string): Promise<PackageManagerInstallCommand | undefined> {\n if (!(await pathExists(path.join(runDir, 'package.json')))) return undefined;\n const isBerry = await isYarnBerryProject(runDir);\n const hasLockfile = await pathExists(path.join(runDir, 'yarn.lock'));\n if (isBerry) return hasLockfile ? ['yarn', 'install', '--immutable'] : ['yarn', 'install'];\n return hasLockfile ? ['yarn', 'install', '--frozen-lockfile', '--silent'] : ['yarn', 'install', '--silent'];\n}\n\nasync function isYarnBerryProject(runDir: string): Promise<boolean> {\n if (await pathExists(path.join(runDir, '.yarnrc.yml'))) return true;\n\n const packageJson = await readJson(path.join(runDir, 'package.json'));\n const packageManager = typeof packageJson.packageManager === 'string' ? packageJson.packageManager : undefined;\n const yarnMajorVersion = /^yarn@(\\d+)/.exec(packageManager ?? '')?.[1];\n return yarnMajorVersion !== undefined && Number(yarnMajorVersion) >= 2;\n}\n\nasync function hasAnyPath(directoryPath: string, relativePaths: readonly string[]): Promise<boolean> {\n for (const relativePath of relativePaths) {\n if (await pathExists(path.join(directoryPath, relativePath))) return true;\n }\n return false;\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return 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 return false;\n }\n}\n\nasync function readJson(filePath: string): Promise<Record<string, unknown>> {\n try {\n const parsed = JSON.parse(await fs.readFile(filePath, 'utf8')) as unknown;\n return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch (error) {\n if (error instanceof SyntaxError) return {};\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code === 'ENOENT') return {};\n throw error;\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"],"mappings":"kHAiCA,MAAM,EAAiC,CACrC,IAAK,CAAC,eAAgB,WAAY,WAAW,EAC7C,MAAO,CAAC,aAAc,YAAY,EAClC,GAAI,CAAC,SAAU,QAAQ,EACvB,OAAQ,CACN,eACA,mBACA,kBACA,sBACA,oBACA,kBACA,8BACA,SACA,UACA,aACF,EACA,MAAO,CAAC,UAAW,OAAQ,OAAQ,UAAU,EAC7C,IAAK,CAAC,eAAgB,mBAAmB,EACzC,KAAM,CAAC,eAAgB,iBAAkB,qBAAqB,EAC9D,KAAM,CAAC,UAAW,eAAgB,eAAe,EACjD,GAAI,CAAC,iBAAkB,SAAS,EAChC,KAAM,CAAC,eAAgB,YAAa,UAAW,cAAe,OAAO,CACvE,EAEM,EAAwC,CAC5C,IAAK,EACL,MAAO,EACP,GAAI,EACJ,OAAQ,EACR,MAAO,EACP,IAAK,EACL,KAAM,EACN,KAAM,EACN,GAAI,EACJ,KAAM,CACR,EAIM,EAAc,EAAmB,EAOvC,eAAsB,EACpB,EACyC,CACzC,IAAM,EAAS,MAAM,EAAG,QAAQ,EAAK,KAAK,EAAG,OAAO,EAAG,EAAQ,eAAiB,WAAW,CAAC,EAC5F,GAAI,CACF,MAAM,EAAG,GAAG,EAAQ,IAAK,EAAQ,CAAE,UAAW,EAAK,CAAC,EACpD,MAAM,EAA+B,CACnC,eAAgB,EAAQ,eACxB,WAAY,EAAQ,WACpB,SACA,iBAAkB,EAAQ,gBAC5B,CAAC,EAED,IAAM,EAAM,EAAQ,IAAM,CAAE,GAAG,QAAQ,IAAK,GAAG,EAAQ,GAAI,EAAI,QAAQ,IACjE,EAAiB,MAAM,EAAsB,EAAQ,eAAgB,CAAM,EAC3E,EAAU,OAAO,EAAQ,SAAY,WAAa,EAAQ,QAAQ,CAAE,QAAO,CAAC,EAAI,EAAQ,QACxF,EAAY,KAAK,IAAI,EACrB,EAAmB,EAAQ,kBAAoB,SACjD,EAEJ,GAAI,IACF,EAAgB,MAAM,EAAe,EAAgB,CACnD,IAAK,EACL,MACA,mBACA,MAAO,GACP,iBAAkB,EAAQ,gBAC5B,CAAC,EACG,EAAoB,CAAa,GACnC,OAAO,EAAiC,CACtC,oBAAqB,KAAK,IAAI,EAAI,GAAa,IAC/C,UACA,OAAQ,CACV,CAAC,EAIL,IAAM,EAA4B,EAAQ,kBAAoB,KAAK,IAAI,EAAI,GAAa,IACxF,GAAI,GAA6B,EAC/B,MAAO,CACL,MAAO,EAAQ,OAAS,GACxB,OAAQ,GAAe,QAAU,GACjC,OAAQ,GAAe,QAAU,GACjC,OAAQ,EACR,YAAa,EAAQ,iBAAmB,KACxC,YAAa,GAAe,aAAe,EAC3C,SAAU,GACV,OAAQ,GAAe,OACvB,oBAAqB,EACvB,EAGF,IAAM,EAAS,MAAM,EAAe,EAAS,CAC3C,IAAK,EACL,MACA,mBACA,MAAO,EAAQ,OAAS,GACxB,iBAAkB,CACpB,CAAC,EACK,GAAsB,KAAK,IAAI,EAAI,GAAa,IActD,OAXS,EADL,EACsC,CACtC,qBACA,UACA,OAAQ,CACN,GAAG,EACH,YAAa,EAAc,YAAc,EAAO,YAChD,YAAa,KAAK,IAAI,EAAc,YAAa,EAAO,WAAW,CACrE,CACF,EAGsC,CAAE,qBAAoB,UAAS,QAAO,CAH3E,CAIL,QAAU,CACR,MAAM,EAAG,GAAG,EAAQ,CAAE,MAAO,GAAM,UAAW,EAAK,CAAC,CACtD,CACF,CAEA,SAAS,EAAiC,EAIP,CACjC,MAAO,CACL,MAAO,EAAQ,QAAQ,OAAS,GAChC,OAAQ,EAAQ,OAAO,OACvB,OAAQ,EAAQ,OAAO,OACvB,OAAQ,EAAQ,OAAO,UAAY,EAAQ,OAAO,oBAAsB,EAAI,EAAQ,OAAO,OAC3F,YAAa,EAAQ,OAAO,SACxB,EAAQ,QAAQ,iBAAmB,KACnC,EAAQ,OAAO,aAAe,EAAQ,mBAC1C,YAAa,EAAQ,OAAO,YAC5B,SAAU,EAAQ,OAAO,SACzB,OAAQ,EAAQ,OAAO,OACvB,oBAAqB,EAAQ,OAAO,mBACtC,CACF,CAEA,SAAS,EACP,EACA,EACmD,CACnD,OAAO,EAAsC,EAAe,CAAC,CAAM,CACrE,CAEA,SAAS,EAAoB,EAA6D,CACxF,OAAO,EAAO,SAAW,GAAK,EAAO,UAAY,EAAO,mBAC1D,CAEA,eAAe,EAAyB,EAAmE,CACnG,SAAM,EAAW,EAAK,KAAK,EAAQ,cAAc,CAAC,EAExD,OAAQ,MAAM,EAAW,EAAQ,CAAC,WAAY,WAAW,CAAC,EACtD,CAAC,MAAO,UAAW,oBAAqB,UAAU,EAClD,CAAC,MAAO,UAAW,UAAU,CACnC,CAEA,eAAe,EAA2B,EAAmE,CACrG,SAAM,EAAW,EAAK,KAAK,EAAQ,YAAY,CAAC,EACtD,OAAQ,MAAM,EAAW,EAAK,KAAK,EAAQ,YAAY,CAAC,EAAK,CAAC,QAAS,QAAS,UAAU,EAAI,CAAC,QAAS,OAAO,CACjH,CAEA,eAAe,EAAwB,EAAmE,CAClG,SAAM,EAAW,EAAK,KAAK,EAAQ,QAAQ,CAAC,EAClD,MAAO,CAAC,KAAM,MAAO,UAAU,CACjC,CAEA,eAAe,EAA4B,EAAmE,CAC5G,GACE,CAAE,MAAM,EAAW,EAAQ,CACzB,eACA,mBACA,kBACA,sBACA,UACA,aACF,CAAC,EAED,OACF,IAAM,EAAO,CAAC,cAAe,UAAW,cAAc,EAMtD,OALI,QAAQ,WAAa,QACf,MAAM,EAAW,EAAK,KAAK,EAAQ,aAAa,CAAC,EACrD,CAAC,UAAW,KAAM,cAAe,GAAG,CAAI,EACxC,CAAC,SAAU,GAAG,CAAI,EAEhB,MAAM,EAAW,EAAK,KAAK,EAAQ,SAAS,CAAC,EAAK,CAAC,KAAM,YAAa,GAAG,CAAI,EAAI,CAAC,SAAU,GAAG,CAAI,CAC7G,CAEA,eAAe,EAA2B,EAAmE,CAC3G,GAAI,CAAE,MAAM,EAAW,EAAK,KAAK,EAAQ,SAAS,CAAC,EAAI,OACvD,IAAM,EAAO,CAAC,KAAM,uBAAuB,EAM3C,OALI,QAAQ,WAAa,QACf,MAAM,EAAW,EAAK,KAAK,EAAQ,UAAU,CAAC,EAClD,CAAC,UAAW,KAAM,WAAY,GAAG,CAAI,EACrC,CAAC,MAAO,GAAG,CAAI,EAEb,MAAM,EAAW,EAAK,KAAK,EAAQ,MAAM,CAAC,EAAK,CAAC,KAAM,SAAU,GAAG,CAAI,EAAI,CAAC,MAAO,GAAG,CAAI,CACpG,CAEA,eAAe,EAAyB,EAAmE,CACnG,SAAM,EAAW,EAAK,KAAK,EAAQ,cAAc,CAAC,EACxD,OAAQ,MAAM,EAAW,EAAK,KAAK,EAAQ,mBAAmB,CAAC,EAC3D,CAAC,MAAO,KAAM,UAAU,EACxB,CAAC,MAAO,UAAW,UAAU,CACnC,CAEA,eAAe,EAA0B,EAAmE,CACpG,SAAM,EAAW,EAAK,KAAK,EAAQ,cAAc,CAAC,EACxD,OAAQ,MAAM,EAAW,EAAK,KAAK,EAAQ,gBAAgB,CAAC,EACxD,CAAC,OAAQ,UAAW,oBAAqB,UAAU,EACnD,CAAC,OAAQ,UAAW,UAAU,CACpC,CAEA,eAAe,EAA0B,EAAmE,CACpG,SAAM,EAAW,EAAK,KAAK,EAAQ,SAAS,CAAC,EACnD,OAAQ,MAAM,EAAW,EAAK,KAAK,EAAQ,cAAc,CAAC,EACtD,CAAC,SAAU,UAAW,WAAY,SAAS,EAC3C,CAAC,SAAU,UAAW,SAAS,CACrC,CAEA,eAAe,GAA8C,CAE7D,CAEA,eAAe,EAA0B,EAAmE,CAC1G,GAAI,CAAE,MAAM,EAAW,EAAK,KAAK,EAAQ,cAAc,CAAC,EAAI,OAC5D,IAAM,EAAU,MAAM,EAAmB,CAAM,EACzC,EAAc,MAAM,EAAW,EAAK,KAAK,EAAQ,WAAW,CAAC,EAEnE,OADI,EAAgB,EAAc,CAAC,OAAQ,UAAW,aAAa,EAAI,CAAC,OAAQ,SAAS,EAClF,EAAc,CAAC,OAAQ,UAAW,oBAAqB,UAAU,EAAI,CAAC,OAAQ,UAAW,UAAU,CAC5G,CAEA,eAAe,EAAmB,EAAkC,CAClE,GAAI,MAAM,EAAW,EAAK,KAAK,EAAQ,aAAa,CAAC,EAAG,MAAO,GAE/D,IAAM,EAAc,MAAM,EAAS,EAAK,KAAK,EAAQ,cAAc,CAAC,EAC9D,EAAiB,OAAO,EAAY,gBAAmB,SAAW,EAAY,eAAiB,IAAA,GAC/F,EAAmB,cAAc,KAAK,GAAkB,EAAE,CAAC,GAAG,GACpE,OAAO,IAAqB,IAAA,IAAa,OAAO,CAAgB,GAAK,CACvE,CAEA,eAAe,EAAW,EAAuB,EAAoD,CACnG,IAAK,IAAM,KAAgB,EACzB,GAAI,MAAM,EAAW,EAAK,KAAK,EAAe,CAAY,CAAC,EAAG,MAAO,GAEvE,MAAO,EACT,CAEA,eAAe,EAAW,EAAoC,CAC5D,GAAI,CAEF,OADA,MAAM,EAAG,OAAO,CAAQ,EACjB,EACT,OAAS,EAAO,CAGd,IADE,OAAO,GAAU,UAAY,GAAkB,SAAU,EAAS,EAA4B,KAAO,IAAA,MAC1F,SAAU,MAAM,EAC7B,MAAO,EACT,CACF,CAEA,eAAe,EAAS,EAAoD,CAC1E,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,MAAM,EAAG,SAAS,EAAU,MAAM,CAAC,EAC7D,OAAO,OAAO,GAAW,UAAY,GAAmB,CAAC,MAAM,QAAQ,CAAM,EACxE,EACD,CAAC,CACP,OAAS,EAAO,CAId,GAHI,aAAiB,cAEnB,OAAO,GAAU,UAAY,GAAkB,SAAU,EAAS,EAA4B,KAAO,IAAA,MAC1F,SAAU,MAAO,CAAC,EAC/B,MAAM,CACR,CACF,CAEA,eAAsB,EAA+B,EAKnC,CAChB,IAAK,IAAM,KAAmB,EAAQ,kBAAoB,EAA+B,EAAQ,gBAC/F,MAAM,EAAiB,EAAK,KAAK,EAAQ,WAAY,CAAe,EAAG,EAAK,KAAK,EAAQ,OAAQ,CAAe,CAAC,CAErH,CAEA,eAAe,EAAiB,EAAoB,EAAwC,CAC1F,GAAI,CACF,MAAM,EAAG,GAAG,EAAY,EAAiB,CAAE,UAAW,EAAK,CAAC,CAC9D,OAAS,EAAO,CAGd,IADE,OAAO,GAAU,UAAY,GAAkB,SAAU,EAAS,EAA4B,KAAO,IAAA,MAC1F,SAAU,MAAM,CAC/B,CACF,CAEA,eAAe,EACb,EACA,EAgBC,CACD,IAAM,EAAiB,IAAgB,IAAA,GAAY,IAAA,GAAY,EAAK,KAAK,EAAQ,IAAK,uBAAuB,EACvG,EACJ,IAAgB,IAAA,GAAY,EAAW,CAAC,GAAG,EAAa,YAAY,IAAkB,GAAG,CAAO,EAC5F,EAAa,EAAa,MAAM,EAAe,GAAI,EAAe,MAAM,CAAC,EAAG,CAChF,IAAK,EAAQ,IACb,SAAU,QAAQ,WAAa,QAC/B,IAAK,EAAQ,IACb,MAAO,CAAC,OAAQ,OAAQ,MAAM,CAChC,CAAC,EAEK,EAAyB,CAAC,EAC1B,EAAyB,CAAC,EAC5B,EAAc,EACd,EAAW,GACX,EAAsB,GAEpB,GAAqB,EAAkB,IAAwB,CACnE,GAAI,GAAe,EAAQ,iBAAkB,CACvC,EAAM,WAAa,IACrB,EAAsB,GACtB,EAAoB,EAAY,SAAS,GAE3C,MACF,CAEA,IAAM,EAAiB,EAAQ,iBAAmB,EAC5C,EAAgB,EAAM,WAAa,EAAiB,EAAM,SAAS,EAAG,CAAc,EAAI,EAC9F,EAAO,KAAK,CAAa,EACzB,GAAe,EAAc,WAEzB,EAAM,WAAa,IACrB,EAAsB,GACtB,EAAoB,EAAY,SAAS,EAE7C,EAEA,EAAW,OAAO,GAAG,OAAS,GAAkB,EAAkB,EAAc,CAAK,CAAC,EACtF,EAAW,OAAO,GAAG,OAAS,GAAkB,EAAkB,EAAc,CAAK,CAAC,EAEtF,IAAM,EAAU,eAAiB,CAC/B,EAAW,GACX,EAAoB,EAAY,SAAS,CAC3C,EAAG,EAAQ,iBAAmB,GAAI,EAC5B,EAAc,eACZ,CACA,GAAU,EAAoB,EAAY,SAAS,CACzD,EACA,EAAQ,iBAAmB,IAAO,GACpC,EACA,EAAY,MAAM,EAElB,GAAM,CAAE,SAAQ,UAAW,MAAM,IAAI,SAClC,EAAS,IAAW,CACnB,IAAI,EAAU,GACV,EACE,EAAkB,GAAuB,CACzC,IACJ,EAAe,EACf,EAAoB,EAAY,SAAS,EACrC,EAAW,MAAQ,IAAA,KACrB,EAAU,GACV,EAAO,CAAK,GAEhB,EACA,EAAW,GAAG,QAAS,CAAc,EACrC,EAAW,MAAM,GAAG,QAAU,GAAiC,CACzD,EAAM,OAAS,SAAS,EAAe,CAAK,CAClD,CAAC,EACD,EAAW,GAAG,SAAU,EAAM,IAAgB,CACxC,MAEJ,IADA,EAAU,GACN,EAAc,CAChB,EAAO,CAAY,EACnB,MACF,CACA,EAAQ,CAAE,OAAQ,GAAQ,IAAA,GAAW,OAAQ,GAAe,IAAA,EAAU,CAAC,CADvE,CAEF,CAAC,EACD,EAAW,MAAM,IAAI,EAAQ,KAAK,CACpC,CACF,CAAC,CAAC,YAAc,CACd,aAAa,CAAO,EACpB,aAAa,CAAW,CAC1B,CAAC,EAEK,CAAE,cAAa,eACnB,IAAmB,IAAA,GAAY,CAAE,YAAa,EAAG,YAAa,CAAE,EAAI,MAAM,EAAe,CAAc,EAEzG,MAAO,CACL,OAAQ,OAAO,OAAO,CAAY,CAAC,CAAC,SAAS,EAC7C,OAAQ,OAAO,OAAO,CAAY,CAAC,CAAC,SAAS,EAC7C,SACA,cACA,cACA,WACA,SACA,qBACF,CACF,CAEA,SAAS,GAAiE,CACxE,IAAM,EAAU,EAAG,SAAS,IAAM,SAAW,QAAU,gBACjD,EAAS,EAAa,UAAU,EAAS,CAAC,WAAW,EAAG,CAAE,MAAO,QAAS,CAAC,EAC7E,OAAO,OAAS,EAAO,SAAW,GAEtC,MAAO,CAAC,EAAS,WAAY,OAAO,CACtC,CAEA,SAAS,EAAoB,EAAuC,EAA8B,CAC5F,KAAW,MAAQ,IAAA,GAEvB,GAAI,CACF,GAAI,QAAQ,WAAa,QAAS,CAChC,EAAW,KAAK,CAAM,EACtB,MACF,CACA,QAAQ,KAAK,CAAC,EAAW,IAAK,CAAM,CACtC,OAAS,EAAO,CACd,IAAM,EACJ,OAAO,GAAU,UAAY,GAAkB,SAAU,EAAS,EAA4B,KAAO,IAAA,GACvG,GAAI,IAAS,SAAW,IAAS,QAAS,MAAM,CAClD,CACF,CAEA,eAAe,EAAe,EAA+E,CAC3G,IAAI,EACJ,GAAI,CACF,EAAU,MAAM,EAAG,SAAS,EAAgB,MAAM,CACpD,OAAS,EAAO,CAGd,IADE,OAAO,GAAU,UAAY,GAAkB,SAAU,EAAS,EAA4B,KAAO,IAAA,MAC1F,SAAU,MAAM,EAC7B,MAAO,CAAE,YAAa,EAAG,YAAa,CAAE,CAC1C,CAEA,IAAM,EAAQ,8BAA8B,KAAK,CAAO,EAGxD,OAFK,EAEE,CAAE,YAAa,OAAO,EAAM,EAAE,CAAE,QAAQ,IAAK,GAAG,CAAC,EAAG,YAAa,OAAO,EAAM,EAAE,EAAI,IAAK,EAF7E,CAAE,YAAa,EAAG,YAAa,CAAE,CAGtD"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var r=require("../_virtual/_rollupPluginBabelHelpers.cjs"),e=require("./runCommandInTemporaryPackageManagerProject.cjs"),a=["pythonArgs","uvArgs"],o=["main.py"];exports.runPythonInTemporaryUvProject=function(n){var t=n.pythonArgs,u=void 0===t?o:t,c=n.uvArgs,p=void 0===c?[]:c,s=r.objectWithoutProperties(n,a);return e.runCommandInTemporaryPackageManagerProject(r.objectSpread2(r.objectSpread2({},s),{},{packageManager:"uv",command:["uv","run","--quiet","--no-progress"].concat(r.toConsumableArray(p),["python"],r.toConsumableArray(u))}))}; | ||
| //# sourceMappingURL=runPythonInTemporaryUvProject.cjs.map | ||
| "use strict";const e=require("./runCommandInTemporaryPackageManagerProject.cjs"),t=[`main.py`];function n(n){let{pythonArgs:r=t,uvArgs:i=[],...a}=n;return e.runCommandInTemporaryPackageManagerProject({...a,packageManager:`uv`,command:[`uv`,`run`,`--quiet`,`--no-progress`,...i,`python`,...r]})}exports.runPythonInTemporaryUvProject=n; | ||
| //# sourceMappingURL=runPythonInTemporaryUvProject.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"runPythonInTemporaryUvProject.cjs","sources":["../../src/helpers/runPythonInTemporaryUvProject.ts"],"sourcesContent":["import {\n type PackageManagerCommandRunResult,\n runCommandInTemporaryPackageManagerProject,\n type RunCommandInTemporaryPackageManagerProjectOptions,\n} from './runCommandInTemporaryPackageManagerProject.js';\n\nexport interface RunPythonInTemporaryUvProjectOptions extends Omit<\n RunCommandInTemporaryPackageManagerProjectOptions,\n 'command' | 'packageManager'\n> {\n pythonArgs?: readonly [string, ...string[]];\n uvArgs?: readonly string[];\n}\n\nconst defaultPythonArgs = ['main.py'] as const;\n\n/**\n * Runs a Python command inside a temporary uv project created from a submission\n * directory and the problem's `pyproject.toml` / `uv.lock`.\n */\nexport function runPythonInTemporaryUvProject(\n options: RunPythonInTemporaryUvProjectOptions\n): Promise<PackageManagerCommandRunResult> {\n const { pythonArgs = defaultPythonArgs, uvArgs = [], ...restOptions } = options;\n return runCommandInTemporaryPackageManagerProject({\n ...restOptions,\n packageManager: 'uv',\n command: ['uv', 'run', '--quiet', '--no-progress', ...uvArgs, 'python', ...pythonArgs] as const,\n });\n}\n"],"names":["defaultPythonArgs","options","_options$pythonArgs","pythonArgs","_options$uvArgs","uvArgs","restOptions","_objectWithoutProperties","_excluded","runCommandInTemporaryPackageManagerProject","_objectSpread","packageManager","command","concat","_toConsumableArray"],"mappings":"gKAcMA,EAAoB,CAAC,iDAMpB,SACLC,GAEA,IAAAC,EAAwED,EAAhEE,WAAAA,WAAUD,EAAGF,EAAiBE,EAAAE,EAAkCH,EAAhCI,OAAAA,WAAMD,EAAG,GAAEA,EAAKE,EAAWC,EAAAA,wBAAKN,EAAOO,GAC/E,OAAOC,EAAAA,2CAA0CC,EAAAA,cAAAA,EAAAA,iBAC5CJ,GAAW,GAAA,CACdK,eAAgB,KAChBC,SAAU,KAAM,MAAO,UAAW,iBAAeC,OAAAC,EAAAA,kBAAKT,GAAM,CAAE,UAAQS,EAAAA,kBAAKX,MAE/E"} | ||
| {"version":3,"file":"runPythonInTemporaryUvProject.cjs","names":["runCommandInTemporaryPackageManagerProject"],"sources":["../../src/helpers/runPythonInTemporaryUvProject.ts"],"sourcesContent":["import {\n type PackageManagerCommandRunResult,\n runCommandInTemporaryPackageManagerProject,\n type RunCommandInTemporaryPackageManagerProjectOptions,\n} from './runCommandInTemporaryPackageManagerProject.js';\n\nexport interface RunPythonInTemporaryUvProjectOptions extends Omit<\n RunCommandInTemporaryPackageManagerProjectOptions,\n 'command' | 'packageManager'\n> {\n pythonArgs?: readonly [string, ...string[]];\n uvArgs?: readonly string[];\n}\n\nconst defaultPythonArgs = ['main.py'] as const;\n\n/**\n * Runs a Python command inside a temporary uv project created from a submission\n * directory and the problem's `pyproject.toml` / `uv.lock`.\n */\nexport function runPythonInTemporaryUvProject(\n options: RunPythonInTemporaryUvProjectOptions\n): Promise<PackageManagerCommandRunResult> {\n const { pythonArgs = defaultPythonArgs, uvArgs = [], ...restOptions } = options;\n return runCommandInTemporaryPackageManagerProject({\n ...restOptions,\n packageManager: 'uv',\n command: ['uv', 'run', '--quiet', '--no-progress', ...uvArgs, 'python', ...pythonArgs] as const,\n });\n}\n"],"mappings":"iFAcM,EAAoB,CAAC,SAAS,EAMpC,SAAgB,EACd,EACyC,CACzC,GAAM,CAAE,aAAa,EAAmB,SAAS,CAAC,EAAG,GAAG,GAAgB,EACxE,OAAOA,EAAAA,2CAA2C,CAChD,GAAG,EACH,eAAgB,KAChB,QAAS,CAAC,KAAM,MAAO,UAAW,gBAAiB,GAAG,EAAQ,SAAU,GAAG,CAAU,CACvF,CAAC,CACH"} |
@@ -1,2 +0,2 @@ | ||
| import{objectWithoutProperties as r,objectSpread2 as o,toConsumableArray as a}from"../_virtual/_rollupPluginBabelHelpers.js";import{runCommandInTemporaryPackageManagerProject as e}from"./runCommandInTemporaryPackageManagerProject.js";var n=["pythonArgs","uvArgs"],t=["main.py"];function p(p){var s=p.pythonArgs,u=void 0===s?t:s,i=p.uvArgs,m=void 0===i?[]:i,g=r(p,n);return e(o(o({},g),{},{packageManager:"uv",command:["uv","run","--quiet","--no-progress"].concat(a(m),["python"],a(u))}))}export{p as runPythonInTemporaryUvProject}; | ||
| //# sourceMappingURL=runPythonInTemporaryUvProject.js.map | ||
| import{runCommandInTemporaryPackageManagerProject as e}from"./runCommandInTemporaryPackageManagerProject.js";const t=[`main.py`];function n(n){let{pythonArgs:r=t,uvArgs:i=[],...a}=n;return e({...a,packageManager:`uv`,command:[`uv`,`run`,`--quiet`,`--no-progress`,...i,`python`,...r]})}export{n as runPythonInTemporaryUvProject}; | ||
| //# sourceMappingURL=runPythonInTemporaryUvProject.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"runPythonInTemporaryUvProject.js","sources":["../../src/helpers/runPythonInTemporaryUvProject.ts"],"sourcesContent":["import {\n type PackageManagerCommandRunResult,\n runCommandInTemporaryPackageManagerProject,\n type RunCommandInTemporaryPackageManagerProjectOptions,\n} from './runCommandInTemporaryPackageManagerProject.js';\n\nexport interface RunPythonInTemporaryUvProjectOptions extends Omit<\n RunCommandInTemporaryPackageManagerProjectOptions,\n 'command' | 'packageManager'\n> {\n pythonArgs?: readonly [string, ...string[]];\n uvArgs?: readonly string[];\n}\n\nconst defaultPythonArgs = ['main.py'] as const;\n\n/**\n * Runs a Python command inside a temporary uv project created from a submission\n * directory and the problem's `pyproject.toml` / `uv.lock`.\n */\nexport function runPythonInTemporaryUvProject(\n options: RunPythonInTemporaryUvProjectOptions\n): Promise<PackageManagerCommandRunResult> {\n const { pythonArgs = defaultPythonArgs, uvArgs = [], ...restOptions } = options;\n return runCommandInTemporaryPackageManagerProject({\n ...restOptions,\n packageManager: 'uv',\n command: ['uv', 'run', '--quiet', '--no-progress', ...uvArgs, 'python', ...pythonArgs] as const,\n });\n}\n"],"names":["defaultPythonArgs","runPythonInTemporaryUvProject","options","_options$pythonArgs","pythonArgs","_options$uvArgs","uvArgs","restOptions","_objectWithoutProperties","_excluded","runCommandInTemporaryPackageManagerProject","_objectSpread","packageManager","command","concat","_toConsumableArray"],"mappings":"wQAcMA,EAAoB,CAAC,WAMpB,SAASC,EACdC,GAEA,IAAAC,EAAwED,EAAhEE,WAAAA,WAAUD,EAAGH,EAAiBG,EAAAE,EAAkCH,EAAhCI,OAAAA,WAAMD,EAAG,GAAEA,EAAKE,EAAWC,EAAKN,EAAOO,GAC/E,OAAOC,EAA0CC,EAAAA,KAC5CJ,GAAW,GAAA,CACdK,eAAgB,KAChBC,SAAU,KAAM,MAAO,UAAW,iBAAeC,OAAAC,EAAKT,GAAM,CAAE,UAAQS,EAAKX,MAE/E"} | ||
| {"version":3,"file":"runPythonInTemporaryUvProject.js","names":[],"sources":["../../src/helpers/runPythonInTemporaryUvProject.ts"],"sourcesContent":["import {\n type PackageManagerCommandRunResult,\n runCommandInTemporaryPackageManagerProject,\n type RunCommandInTemporaryPackageManagerProjectOptions,\n} from './runCommandInTemporaryPackageManagerProject.js';\n\nexport interface RunPythonInTemporaryUvProjectOptions extends Omit<\n RunCommandInTemporaryPackageManagerProjectOptions,\n 'command' | 'packageManager'\n> {\n pythonArgs?: readonly [string, ...string[]];\n uvArgs?: readonly string[];\n}\n\nconst defaultPythonArgs = ['main.py'] as const;\n\n/**\n * Runs a Python command inside a temporary uv project created from a submission\n * directory and the problem's `pyproject.toml` / `uv.lock`.\n */\nexport function runPythonInTemporaryUvProject(\n options: RunPythonInTemporaryUvProjectOptions\n): Promise<PackageManagerCommandRunResult> {\n const { pythonArgs = defaultPythonArgs, uvArgs = [], ...restOptions } = options;\n return runCommandInTemporaryPackageManagerProject({\n ...restOptions,\n packageManager: 'uv',\n command: ['uv', 'run', '--quiet', '--no-progress', ...uvArgs, 'python', ...pythonArgs] as const,\n });\n}\n"],"mappings":"6GAcA,MAAM,EAAoB,CAAC,SAAS,EAMpC,SAAgB,EACd,EACyC,CACzC,GAAM,CAAE,aAAa,EAAmB,SAAS,CAAC,EAAG,GAAG,GAAgB,EACxE,OAAO,EAA2C,CAChD,GAAG,EACH,eAAgB,KAChB,QAAS,CAAC,KAAM,MAAO,UAAW,gBAAiB,GAAG,EAAQ,SAAU,GAAG,CAAU,CACvF,CAAC,CACH"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("../types/language.cjs"),a=Object.fromEntries(Object.entries(r.languageIdToDefinition).flatMap(function(r){var a=e.slicedToArray(r,2),t=a[0],i=a[1];return i.grammer?[[t,i.grammer]]:[]}));exports.languageIdToSourceCodeGrammar=a; | ||
| //# sourceMappingURL=sourceCodeGrammars.cjs.map | ||
| "use strict";const e=require("../types/language.cjs"),t=Object.fromEntries(Object.entries(e.languageIdToDefinition).flatMap(([e,t])=>t.grammer?[[e,t.grammer]]:[]));exports.languageIdToSourceCodeGrammar=t; | ||
| //# sourceMappingURL=sourceCodeGrammars.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"sourceCodeGrammars.cjs","sources":["../../src/helpers/sourceCodeGrammars.ts"],"sourcesContent":["import type { SourceCodeGrammar } from './removeCommentsInSourceCode.js';\nimport { languageIdToDefinition } from '../types/language.js';\n\nexport const languageIdToSourceCodeGrammar = Object.fromEntries(\n Object.entries(languageIdToDefinition).flatMap(([languageId, languageDefinition]) =>\n languageDefinition.grammer ? [[languageId, languageDefinition.grammer] as const] : []\n )\n) as Readonly<Record<string, SourceCodeGrammar | undefined>>;\n"],"names":["languageIdToSourceCodeGrammar","Object","fromEntries","entries","languageIdToDefinition","flatMap","_ref","_ref2","_slicedToArray","languageId","languageDefinition","grammer"],"mappings":"2GAGaA,EAAgCC,OAAOC,YAClDD,OAAOE,QAAQC,0BAAwBC,QAAQ,SAAAC,GAAA,IAAAC,EAAAC,EAAAA,cAAAF,EAAA,GAAEG,EAAUF,EAAA,GAAEG,EAAkBH,EAAA,GAAA,OAC7EG,EAAmBC,QAAU,CAAC,CAACF,EAAYC,EAAmBC,UAAqB,EAAE"} | ||
| {"version":3,"file":"sourceCodeGrammars.cjs","names":["languageIdToDefinition"],"sources":["../../src/helpers/sourceCodeGrammars.ts"],"sourcesContent":["import type { SourceCodeGrammar } from './removeCommentsInSourceCode.js';\nimport { languageIdToDefinition } from '../types/language.js';\n\nexport const languageIdToSourceCodeGrammar = Object.fromEntries(\n Object.entries(languageIdToDefinition).flatMap(([languageId, languageDefinition]) =>\n languageDefinition.grammer ? [[languageId, languageDefinition.grammer] as const] : []\n )\n) as Readonly<Record<string, SourceCodeGrammar | undefined>>;\n"],"mappings":"sDAGa,EAAgC,OAAO,YAClD,OAAO,QAAQA,EAAAA,sBAAsB,CAAC,CAAC,SAAS,CAAC,EAAY,KAC3D,EAAmB,QAAU,CAAC,CAAC,EAAY,EAAmB,OAAO,CAAU,EAAI,CAAC,CACtF,CACF"} |
@@ -1,2 +0,2 @@ | ||
| import{slicedToArray as r}from"../_virtual/_rollupPluginBabelHelpers.js";import{languageIdToDefinition as e}from"../types/language.js";var a=Object.fromEntries(Object.entries(e).flatMap(function(e){var a=r(e,2),t=a[0],l=a[1];return l.grammer?[[t,l.grammer]]:[]}));export{a as languageIdToSourceCodeGrammar}; | ||
| //# sourceMappingURL=sourceCodeGrammars.js.map | ||
| import{languageIdToDefinition as e}from"../types/language.js";const t=Object.fromEntries(Object.entries(e).flatMap(([e,t])=>t.grammer?[[e,t.grammer]]:[]));export{t as languageIdToSourceCodeGrammar}; | ||
| //# sourceMappingURL=sourceCodeGrammars.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"sourceCodeGrammars.js","sources":["../../src/helpers/sourceCodeGrammars.ts"],"sourcesContent":["import type { SourceCodeGrammar } from './removeCommentsInSourceCode.js';\nimport { languageIdToDefinition } from '../types/language.js';\n\nexport const languageIdToSourceCodeGrammar = Object.fromEntries(\n Object.entries(languageIdToDefinition).flatMap(([languageId, languageDefinition]) =>\n languageDefinition.grammer ? [[languageId, languageDefinition.grammer] as const] : []\n )\n) as Readonly<Record<string, SourceCodeGrammar | undefined>>;\n"],"names":["languageIdToSourceCodeGrammar","Object","fromEntries","entries","languageIdToDefinition","flatMap","_ref","_ref2","_slicedToArray","languageId","languageDefinition","grammer"],"mappings":"2IAGaA,EAAgCC,OAAOC,YAClDD,OAAOE,QAAQC,GAAwBC,QAAQ,SAAAC,GAAA,IAAAC,EAAAC,EAAAF,EAAA,GAAEG,EAAUF,EAAA,GAAEG,EAAkBH,EAAA,GAAA,OAC7EG,EAAmBC,QAAU,CAAC,CAACF,EAAYC,EAAmBC,UAAqB,EAAE"} | ||
| {"version":3,"file":"sourceCodeGrammars.js","names":[],"sources":["../../src/helpers/sourceCodeGrammars.ts"],"sourcesContent":["import type { SourceCodeGrammar } from './removeCommentsInSourceCode.js';\nimport { languageIdToDefinition } from '../types/language.js';\n\nexport const languageIdToSourceCodeGrammar = Object.fromEntries(\n Object.entries(languageIdToDefinition).flatMap(([languageId, languageDefinition]) =>\n languageDefinition.grammer ? [[languageId, languageDefinition.grammer] as const] : []\n )\n) as Readonly<Record<string, SourceCodeGrammar | undefined>>;\n"],"mappings":"8DAGA,MAAa,EAAgC,OAAO,YAClD,OAAO,QAAQ,CAAsB,CAAC,CAAC,SAAS,CAAC,EAAY,KAC3D,EAAmB,QAAU,CAAC,CAAC,EAAY,EAAmB,OAAO,CAAU,EAAI,CAAC,CACtF,CACF"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:child_process"),t=["darwin"===require("node:os").platform()?"gtime":"/usr/bin/time","--format","%e %M"];exports.spawnSyncWithTimeout=function(o,s,d,i){var n=Date.now(),a=r.spawnSync("timeout",[i.toFixed(3)].concat(t,[o],e.toConsumableArray(s)),d),u=Date.now(),c=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(a.stderr),m=c?a.stderr.slice(0,c.index):a.stderr,l=Number(null==c?void 0:c[1])||(u-n)/1e3,p=1024*Number(null==c?void 0:c[2])||0;return 124===a.status?e.objectSpread2(e.objectSpread2({},a),{},{status:0,stderr:m,timeSeconds:i+.001,memoryBytes:p}):e.objectSpread2(e.objectSpread2({},a),{},{stderr:m,timeSeconds:l,memoryBytes:p})}; | ||
| //# sourceMappingURL=spawnSyncWithTimeout.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:child_process");t=e.__toESM(t,1);let n=require("node:os");n=e.__toESM(n,1);const r=[n.default.platform()===`darwin`?`gtime`:`/usr/bin/time`,`--format`,`%e %M`];function i(e,n,i,a){let o=Date.now(),s=t.default.spawnSync(`timeout`,[a.toFixed(3),...r,e,...n],i),c=Date.now(),l=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(s.stderr),u=l?s.stderr.slice(0,l.index):s.stderr,d=Number(l?.[1])||(c-o)/1e3,f=Number(l?.[2])*1024||0;return s.status===124?{...s,status:0,stderr:u,timeSeconds:a+.001,memoryBytes:f}:{...s,stderr:u,timeSeconds:d,memoryBytes:f}}exports.spawnSyncWithTimeout=i; | ||
| //# sourceMappingURL=spawnSyncWithTimeout.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"spawnSyncWithTimeout.cjs","sources":["../../src/helpers/spawnSyncWithTimeout.ts"],"sourcesContent":["import child_process from 'node:child_process';\nimport os from 'node:os';\n\nconst TIME_COMMAND = [os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time', '--format', '%e %M'] as const;\n\nexport function spawnSyncWithTimeout(\n command: string,\n args: readonly string[],\n options: child_process.SpawnSyncOptionsWithStringEncoding,\n timeoutSeconds: number\n): child_process.SpawnSyncReturns<string> & { timeSeconds: number; memoryBytes: number } {\n const startTimeMilliseconds = Date.now();\n\n const spawnResult = child_process.spawnSync(\n 'timeout',\n [timeoutSeconds.toFixed(3), ...TIME_COMMAND, command, ...args],\n options\n );\n\n const stopTimeMilliseconds = Date.now();\n\n const match = /(?:^|\\n)(\\d+\\.\\d+) (\\d+)\\s*$/.exec(spawnResult.stderr);\n const stderr = match ? spawnResult.stderr.slice(0, match.index) : spawnResult.stderr;\n const timeSeconds = Number(match?.[1]) || (stopTimeMilliseconds - startTimeMilliseconds) / 1000;\n const memoryBytes = Number(match?.[2]) * 1024 || 0;\n\n // timeout\n if (spawnResult.status === 124) {\n return { ...spawnResult, status: 0, stderr, timeSeconds: timeoutSeconds + 1e-3, memoryBytes };\n }\n\n return { ...spawnResult, stderr, timeSeconds, memoryBytes };\n}\n"],"names":["TIME_COMMAND","platform","command","args","options","timeoutSeconds","startTimeMilliseconds","Date","now","spawnResult","child_process","spawnSync","toFixed","concat","_toConsumableArray","stopTimeMilliseconds","match","exec","stderr","slice","index","timeSeconds","Number","memoryBytes","status","_objectSpread"],"mappings":"wGAGMA,EAAe,CAAmB,8BAAfC,WAA0B,QAAU,gBAAiB,WAAY,sCAEnF,SACLC,EACAC,EACAC,EACAC,GAEA,IAAMC,EAAwBC,KAAKC,MAE7BC,EAAcC,EAAcC,UAChC,UAAS,CACRN,EAAeO,QAAQ,IAAEC,OAAKb,EAAY,CAAEE,GAAOY,EAAAA,kBAAKX,IACzDC,GAGIW,EAAuBR,KAAKC,MAE5BQ,EAAQ,+BAA+BC,KAAKR,EAAYS,QACxDA,EAASF,EAAQP,EAAYS,OAAOC,MAAM,EAAGH,EAAMI,OAASX,EAAYS,OACxEG,EAAcC,aAAON,SAAAA,EAAQ,MAAQD,EAAuBT,GAAyB,IACrFiB,EAAmC,KAArBD,OAAY,MAALN,SAAAA,EAAQ,KAAc,EAGjD,OAA2B,MAAvBP,EAAYe,OACdC,EAAAA,cAAAA,EAAAA,cAAA,CAAA,EAAYhB,GAAW,CAAA,EAAA,CAAEe,OAAQ,EAAGN,OAAAA,EAAQG,YAAahB,EAAiB,KAAMkB,YAAAA,IAGlFE,EAAAA,cAAAA,EAAAA,cAAA,CAAA,EAAYhB,GAAW,CAAA,EAAA,CAAES,OAAAA,EAAQG,YAAAA,EAAaE,YAAAA,GAChD"} | ||
| {"version":3,"file":"spawnSyncWithTimeout.cjs","names":["os","child_process"],"sources":["../../src/helpers/spawnSyncWithTimeout.ts"],"sourcesContent":["import child_process from 'node:child_process';\nimport os from 'node:os';\n\nconst TIME_COMMAND = [os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time', '--format', '%e %M'] as const;\n\nexport function spawnSyncWithTimeout(\n command: string,\n args: readonly string[],\n options: child_process.SpawnSyncOptionsWithStringEncoding,\n timeoutSeconds: number\n): child_process.SpawnSyncReturns<string> & { timeSeconds: number; memoryBytes: number } {\n const startTimeMilliseconds = Date.now();\n\n const spawnResult = child_process.spawnSync(\n 'timeout',\n [timeoutSeconds.toFixed(3), ...TIME_COMMAND, command, ...args],\n options\n );\n\n const stopTimeMilliseconds = Date.now();\n\n const match = /(?:^|\\n)(\\d+\\.\\d+) (\\d+)\\s*$/.exec(spawnResult.stderr);\n const stderr = match ? spawnResult.stderr.slice(0, match.index) : spawnResult.stderr;\n const timeSeconds = Number(match?.[1]) || (stopTimeMilliseconds - startTimeMilliseconds) / 1000;\n const memoryBytes = Number(match?.[2]) * 1024 || 0;\n\n // timeout\n if (spawnResult.status === 124) {\n return { ...spawnResult, status: 0, stderr, timeSeconds: timeoutSeconds + 1e-3, memoryBytes };\n }\n\n return { ...spawnResult, stderr, timeSeconds, memoryBytes };\n}\n"],"mappings":"iKAGA,MAAM,EAAe,CAACA,EAAAA,QAAG,SAAS,IAAM,SAAW,QAAU,gBAAiB,WAAY,OAAO,EAEjG,SAAgB,EACd,EACA,EACA,EACA,EACuF,CACvF,IAAM,EAAwB,KAAK,IAAI,EAEjC,EAAcC,EAAAA,QAAc,UAChC,UACA,CAAC,EAAe,QAAQ,CAAC,EAAG,GAAG,EAAc,EAAS,GAAG,CAAI,EAC7D,CACF,EAEM,EAAuB,KAAK,IAAI,EAEhC,EAAQ,+BAA+B,KAAK,EAAY,MAAM,EAC9D,EAAS,EAAQ,EAAY,OAAO,MAAM,EAAG,EAAM,KAAK,EAAI,EAAY,OACxE,EAAc,OAAO,IAAQ,EAAE,IAAM,EAAuB,GAAyB,IACrF,EAAc,OAAO,IAAQ,EAAE,EAAI,MAAQ,EAOjD,OAJI,EAAY,SAAW,IAClB,CAAE,GAAG,EAAa,OAAQ,EAAG,SAAQ,YAAa,EAAiB,KAAM,aAAY,EAGvF,CAAE,GAAG,EAAa,SAAQ,cAAa,aAAY,CAC5D"} |
@@ -1,2 +0,2 @@ | ||
| import{toConsumableArray as e,objectSpread2 as r}from"../_virtual/_rollupPluginBabelHelpers.js";import t from"node:child_process";import o from"node:os";var s=["darwin"===o.platform()?"gtime":"/usr/bin/time","--format","%e %M"];function m(o,m,n,d){var i=Date.now(),a=t.spawnSync("timeout",[d.toFixed(3)].concat(s,[o],e(m)),n),l=Date.now(),u=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(a.stderr),c=u?a.stderr.slice(0,u.index):a.stderr,p=Number(null==u?void 0:u[1])||(l-i)/1e3,b=1024*Number(null==u?void 0:u[2])||0;return 124===a.status?r(r({},a),{},{status:0,stderr:c,timeSeconds:d+.001,memoryBytes:b}):r(r({},a),{},{stderr:c,timeSeconds:p,memoryBytes:b})}export{m as spawnSyncWithTimeout}; | ||
| //# sourceMappingURL=spawnSyncWithTimeout.js.map | ||
| import e from"node:child_process";import t from"node:os";const n=[t.platform()===`darwin`?`gtime`:`/usr/bin/time`,`--format`,`%e %M`];function r(t,r,i,a){let o=Date.now(),s=e.spawnSync(`timeout`,[a.toFixed(3),...n,t,...r],i),c=Date.now(),l=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(s.stderr),u=l?s.stderr.slice(0,l.index):s.stderr,d=Number(l?.[1])||(c-o)/1e3,f=Number(l?.[2])*1024||0;return s.status===124?{...s,status:0,stderr:u,timeSeconds:a+.001,memoryBytes:f}:{...s,stderr:u,timeSeconds:d,memoryBytes:f}}export{r as spawnSyncWithTimeout}; | ||
| //# sourceMappingURL=spawnSyncWithTimeout.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"spawnSyncWithTimeout.js","sources":["../../src/helpers/spawnSyncWithTimeout.ts"],"sourcesContent":["import child_process from 'node:child_process';\nimport os from 'node:os';\n\nconst TIME_COMMAND = [os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time', '--format', '%e %M'] as const;\n\nexport function spawnSyncWithTimeout(\n command: string,\n args: readonly string[],\n options: child_process.SpawnSyncOptionsWithStringEncoding,\n timeoutSeconds: number\n): child_process.SpawnSyncReturns<string> & { timeSeconds: number; memoryBytes: number } {\n const startTimeMilliseconds = Date.now();\n\n const spawnResult = child_process.spawnSync(\n 'timeout',\n [timeoutSeconds.toFixed(3), ...TIME_COMMAND, command, ...args],\n options\n );\n\n const stopTimeMilliseconds = Date.now();\n\n const match = /(?:^|\\n)(\\d+\\.\\d+) (\\d+)\\s*$/.exec(spawnResult.stderr);\n const stderr = match ? spawnResult.stderr.slice(0, match.index) : spawnResult.stderr;\n const timeSeconds = Number(match?.[1]) || (stopTimeMilliseconds - startTimeMilliseconds) / 1000;\n const memoryBytes = Number(match?.[2]) * 1024 || 0;\n\n // timeout\n if (spawnResult.status === 124) {\n return { ...spawnResult, status: 0, stderr, timeSeconds: timeoutSeconds + 1e-3, memoryBytes };\n }\n\n return { ...spawnResult, stderr, timeSeconds, memoryBytes };\n}\n"],"names":["TIME_COMMAND","os","platform","spawnSyncWithTimeout","command","args","options","timeoutSeconds","startTimeMilliseconds","Date","now","spawnResult","child_process","spawnSync","toFixed","concat","_toConsumableArray","stopTimeMilliseconds","match","exec","stderr","slice","index","timeSeconds","Number","memoryBytes","status","_objectSpread"],"mappings":"yJAGA,IAAMA,EAAe,CAAmB,WAAlBC,EAAGC,WAA0B,QAAU,gBAAiB,WAAY,SAEnF,SAASC,EACdC,EACAC,EACAC,EACAC,GAEA,IAAMC,EAAwBC,KAAKC,MAE7BC,EAAcC,EAAcC,UAChC,UAAS,CACRN,EAAeO,QAAQ,IAAEC,OAAKf,EAAY,CAAEI,GAAOY,EAAKX,IACzDC,GAGIW,EAAuBR,KAAKC,MAE5BQ,EAAQ,+BAA+BC,KAAKR,EAAYS,QACxDA,EAASF,EAAQP,EAAYS,OAAOC,MAAM,EAAGH,EAAMI,OAASX,EAAYS,OACxEG,EAAcC,aAAON,SAAAA,EAAQ,MAAQD,EAAuBT,GAAyB,IACrFiB,EAAmC,KAArBD,OAAY,MAALN,SAAAA,EAAQ,KAAc,EAGjD,OAA2B,MAAvBP,EAAYe,OACdC,EAAAA,EAAA,CAAA,EAAYhB,GAAW,CAAA,EAAA,CAAEe,OAAQ,EAAGN,OAAAA,EAAQG,YAAahB,EAAiB,KAAMkB,YAAAA,IAGlFE,EAAAA,EAAA,CAAA,EAAYhB,GAAW,CAAA,EAAA,CAAES,OAAAA,EAAQG,YAAAA,EAAaE,YAAAA,GAChD"} | ||
| {"version":3,"file":"spawnSyncWithTimeout.js","names":["child_process"],"sources":["../../src/helpers/spawnSyncWithTimeout.ts"],"sourcesContent":["import child_process from 'node:child_process';\nimport os from 'node:os';\n\nconst TIME_COMMAND = [os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time', '--format', '%e %M'] as const;\n\nexport function spawnSyncWithTimeout(\n command: string,\n args: readonly string[],\n options: child_process.SpawnSyncOptionsWithStringEncoding,\n timeoutSeconds: number\n): child_process.SpawnSyncReturns<string> & { timeSeconds: number; memoryBytes: number } {\n const startTimeMilliseconds = Date.now();\n\n const spawnResult = child_process.spawnSync(\n 'timeout',\n [timeoutSeconds.toFixed(3), ...TIME_COMMAND, command, ...args],\n options\n );\n\n const stopTimeMilliseconds = Date.now();\n\n const match = /(?:^|\\n)(\\d+\\.\\d+) (\\d+)\\s*$/.exec(spawnResult.stderr);\n const stderr = match ? spawnResult.stderr.slice(0, match.index) : spawnResult.stderr;\n const timeSeconds = Number(match?.[1]) || (stopTimeMilliseconds - startTimeMilliseconds) / 1000;\n const memoryBytes = Number(match?.[2]) * 1024 || 0;\n\n // timeout\n if (spawnResult.status === 124) {\n return { ...spawnResult, status: 0, stderr, timeSeconds: timeoutSeconds + 1e-3, memoryBytes };\n }\n\n return { ...spawnResult, stderr, timeSeconds, memoryBytes };\n}\n"],"mappings":"yDAGA,MAAM,EAAe,CAAC,EAAG,SAAS,IAAM,SAAW,QAAU,gBAAiB,WAAY,OAAO,EAEjG,SAAgB,EACd,EACA,EACA,EACA,EACuF,CACvF,IAAM,EAAwB,KAAK,IAAI,EAEjC,EAAcA,EAAc,UAChC,UACA,CAAC,EAAe,QAAQ,CAAC,EAAG,GAAG,EAAc,EAAS,GAAG,CAAI,EAC7D,CACF,EAEM,EAAuB,KAAK,IAAI,EAEhC,EAAQ,+BAA+B,KAAK,EAAY,MAAM,EAC9D,EAAS,EAAQ,EAAY,OAAO,MAAM,EAAG,EAAM,KAAK,EAAI,EAAY,OACxE,EAAc,OAAO,IAAQ,EAAE,IAAM,EAAuB,GAAyB,IACrF,EAAc,OAAO,IAAQ,EAAE,EAAI,MAAQ,EAOjD,OAJI,EAAY,SAAW,IAClB,CAAE,GAAG,EAAa,OAAQ,EAAG,SAAQ,YAAa,EAAiB,KAAM,aAAY,EAGvF,CAAE,GAAG,EAAa,SAAQ,cAAa,aAAY,CAC5D"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),t=require("node:fs"),r=require("node:http"),n=require("node:path");var o={".css":"text/css",".html":"text/html",".js":"text/javascript",".gif":"image/gif",".jpg":"image/jpeg",".png":"image/png",".svg":"image/svg+xml"};function s(t){for(var r=0,n=Object.entries(o);r<n.length;r++){var s=e.slicedToArray(n[r],2),a=s[0],i=s[1];if(t.endsWith(a))return i}return"text/plain"}exports.startHttpServer=function(o){var a,i=r.createServer(function(e,r){var a,i=new URL(null!=(a=e.url)?a:"/","http://127.0.0.1").pathname;"/"===i&&(i="/index.html");var c=i.endsWith("/")?n.join(i,"index.html"):i,l=n.join(o,c);if(t.existsSync(l))try{var u=t.readFileSync(l);r.writeHead(200,{"Access-Control-Allow-Origin":"*",Pragma:"no-cache","Cache-Control":"no-cache","Content-Type":s(c)}),r.end(u)}catch(e){r.statusCode=500,r.end()}else r.statusCode=404,r.end()});i.listen();var c=i.address();if(!c)throw new Error("server has been unexpectedly closed");return(a={})[Symbol.asyncDispose]=e.asyncToGenerator(e.regenerator().m(function t(){return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:return i.closeAllConnections(),e.n=1,new Promise(function(e){i.close(function(){e()})});case 1:return e.a(2)}},t)})),a.url="string"==typeof c?c:"http://127.0.0.1:".concat(c.port),a.port="object"===e.typeof(c)?c.port:void 0,a}; | ||
| //# sourceMappingURL=startHttpServer.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:path");t=e.__toESM(t,1);let n=require("node:fs");n=e.__toESM(n,1);let r=require("node:http");r=e.__toESM(r,1);function i(e){let i=r.default.createServer((r,i)=>{let a=new URL(r.url??`/`,`http://127.0.0.1`).pathname;a===`/`&&(a=`/index.html`);let s=a.endsWith(`/`)?t.default.join(a,`index.html`):a,c=t.default.join(e,s);if(n.default.existsSync(c))try{let e=n.default.readFileSync(c);i.writeHead(200,{"Access-Control-Allow-Origin":`*`,Pragma:`no-cache`,"Cache-Control":`no-cache`,"Content-Type":o(s)}),i.end(e)}catch{i.statusCode=500,i.end()}else i.statusCode=404,i.end()});i.listen();let a=i.address();if(!a)throw Error(`server has been unexpectedly closed`);return{[Symbol.asyncDispose]:async()=>{i.closeAllConnections(),await new Promise(e=>{i.close(()=>{e()})})},url:typeof a==`string`?a:`http://127.0.0.1:${a.port}`,port:typeof a==`object`?a.port:void 0}}const a={".css":`text/css`,".html":`text/html`,".js":`text/javascript`,".gif":`image/gif`,".jpg":`image/jpeg`,".png":`image/png`,".svg":`image/svg+xml`};function o(e){for(let[t,n]of Object.entries(a))if(e.endsWith(t))return n;return`text/plain`}exports.startHttpServer=i; | ||
| //# sourceMappingURL=startHttpServer.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"startHttpServer.cjs","sources":["../../src/helpers/startHttpServer.ts"],"sourcesContent":["import fs from 'node:fs';\nimport http from 'node:http';\nimport path from 'node:path';\n\nexport interface HttpServer {\n [Symbol.asyncDispose](): Promise<void>;\n url: string;\n port: number | undefined;\n}\n\n/**\n * Start a HTTP server for testing web pages.\n */\nexport function startHttpServer(dir: string): HttpServer {\n const server = http.createServer((request, response) => {\n let pathname = new URL(request.url ?? '/', 'http://127.0.0.1').pathname;\n\n if (pathname === '/') {\n pathname = '/index.html';\n }\n\n const pathnameWithIndexHtml = pathname.endsWith('/') ? path.join(pathname, 'index.html') : pathname;\n\n const filePath = path.join(dir, pathnameWithIndexHtml);\n\n if (fs.existsSync(filePath)) {\n try {\n const buffer = fs.readFileSync(filePath);\n response.writeHead(200, {\n 'Access-Control-Allow-Origin': '*',\n Pragma: 'no-cache',\n 'Cache-Control': 'no-cache',\n 'Content-Type': getContentType(pathnameWithIndexHtml),\n });\n response.end(buffer);\n } catch {\n response.statusCode = 500;\n response.end();\n }\n } else {\n response.statusCode = 404;\n response.end();\n }\n });\n\n server.listen();\n\n const address = server.address();\n if (!address) throw new Error('server has been unexpectedly closed');\n\n return {\n [Symbol.asyncDispose]: async () => {\n server.closeAllConnections();\n await new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n });\n },\n url: typeof address === 'string' ? address : `http://127.0.0.1:${address.port}`,\n port: typeof address === 'object' ? address.port : undefined,\n };\n}\n\nconst CONTENT_TYPE_BY_SUFFIX: Record<string, string> = {\n '.css': 'text/css',\n '.html': 'text/html',\n '.js': 'text/javascript',\n '.gif': 'image/gif',\n '.jpg': 'image/jpeg',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n};\n\nfunction getContentType(pathname: string): string {\n for (const [suffix, contentType] of Object.entries(CONTENT_TYPE_BY_SUFFIX)) {\n if (pathname.endsWith(suffix)) return contentType;\n }\n return 'text/plain';\n}\n"],"names":["CONTENT_TYPE_BY_SUFFIX","getContentType","pathname","_i","_Object$entries","Object","entries","length","_Object$entries$_i","_slicedToArray","suffix","contentType","endsWith","dir","_ref2","server","http","createServer","request","response","_request$url","URL","url","pathnameWithIndexHtml","path","join","filePath","fs","existsSync","buffer","readFileSync","writeHead","Pragma","end","_unused","statusCode","listen","address","Error","Symbol","asyncDispose","_asyncToGenerator","_regenerator","m","_callee","w","_context","n","closeAllConnections","Promise","resolve","close","a","concat","port","_typeof","undefined"],"mappings":"2IAgEA,IAAMA,EAAiD,CACrD,OAAQ,WACR,QAAS,YACT,MAAO,kBACP,OAAQ,YACR,OAAQ,aACR,OAAQ,YACR,OAAQ,iBAGV,SAASC,EAAeC,GACtB,IAAA,IAAAC,EAAA,EAAAC,EAAoCC,OAAOC,QAAQN,GAAuBG,EAAAC,EAAAG,OAAAJ,IAAE,CAAvE,IAAAK,EAAAC,EAAAA,cAAAL,EAAAD,GAAA,GAAOO,EAAMF,EAAA,GAAEG,EAAWH,EAAA,GAC7B,GAAIN,EAASU,SAASF,GAAS,OAAOC,CACxC,CACA,MAAO,YACT,yBAlEO,SAAyBE,GAAyB,IAAAC,EACjDC,EAASC,EAAKC,aAAa,SAACC,EAASC,GAAa,IAAAC,EAClDlB,EAAW,IAAImB,IAAe,OAAZD,EAACF,EAAQI,KAAGF,EAAI,IAAK,oBAAoBlB,SAE9C,MAAbA,IACFA,EAAW,eAGb,IAAMqB,EAAwBrB,EAASU,SAAS,KAAOY,EAAKC,KAAKvB,EAAU,cAAgBA,EAErFwB,EAAWF,EAAKC,KAAKZ,EAAKU,GAEhC,GAAII,EAAGC,WAAWF,GAChB,IACE,IAAMG,EAASF,EAAGG,aAAaJ,GAC/BP,EAASY,UAAU,IAAK,CACtB,8BAA+B,IAC/BC,OAAQ,WACR,gBAAiB,WACjB,eAAgB/B,EAAesB,KAEjCJ,EAASc,IAAIJ,EACf,CAAE,MAAAK,GACAf,EAASgB,WAAa,IACtBhB,EAASc,KACX,MAEAd,EAASgB,WAAa,IACtBhB,EAASc,KAEb,GAEAlB,EAAOqB,SAEP,IAAMC,EAAUtB,EAAOsB,UACvB,IAAKA,EAAS,MAAM,IAAIC,MAAM,uCAE9B,OAAAxB,EAAA,CAAA,GACGyB,OAAOC,cAAYC,EAAAA,iBAAAC,EAAAA,cAAAC,EAAG,SAAAC,IAAA,OAAAF,gBAAAG,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EACQ,OAA7BhC,EAAOiC,sBAAsBF,EAAAC,EAAA,EACvB,IAAIE,QAAc,SAACC,GACvBnC,EAAOoC,MAAM,WACXD,GACF,EACF,GAAE,KAAA,EAAA,OAAAJ,EAAAM,EAAA,GAAA,EAAAR,EAAA,IACH9B,EACDQ,IAAwB,iBAAZe,EAAuBA,EAAO,oBAAAgB,OAAuBhB,EAAQiB,MAAMxC,EAC/EwC,KAAyB,WAAnBC,SAAOlB,GAAuBA,EAAQiB,UAAOE,EAAS1C,CAEhE"} | ||
| {"version":3,"file":"startHttpServer.cjs","names":["http","path","fs"],"sources":["../../src/helpers/startHttpServer.ts"],"sourcesContent":["import fs from 'node:fs';\nimport http from 'node:http';\nimport path from 'node:path';\n\nexport interface HttpServer {\n [Symbol.asyncDispose](): Promise<void>;\n url: string;\n port: number | undefined;\n}\n\n/**\n * Start a HTTP server for testing web pages.\n */\nexport function startHttpServer(dir: string): HttpServer {\n const server = http.createServer((request, response) => {\n let pathname = new URL(request.url ?? '/', 'http://127.0.0.1').pathname;\n\n if (pathname === '/') {\n pathname = '/index.html';\n }\n\n const pathnameWithIndexHtml = pathname.endsWith('/') ? path.join(pathname, 'index.html') : pathname;\n\n const filePath = path.join(dir, pathnameWithIndexHtml);\n\n if (fs.existsSync(filePath)) {\n try {\n const buffer = fs.readFileSync(filePath);\n response.writeHead(200, {\n 'Access-Control-Allow-Origin': '*',\n Pragma: 'no-cache',\n 'Cache-Control': 'no-cache',\n 'Content-Type': getContentType(pathnameWithIndexHtml),\n });\n response.end(buffer);\n } catch {\n response.statusCode = 500;\n response.end();\n }\n } else {\n response.statusCode = 404;\n response.end();\n }\n });\n\n server.listen();\n\n const address = server.address();\n if (!address) throw new Error('server has been unexpectedly closed');\n\n return {\n [Symbol.asyncDispose]: async () => {\n server.closeAllConnections();\n await new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n });\n },\n url: typeof address === 'string' ? address : `http://127.0.0.1:${address.port}`,\n port: typeof address === 'object' ? address.port : undefined,\n };\n}\n\nconst CONTENT_TYPE_BY_SUFFIX: Record<string, string> = {\n '.css': 'text/css',\n '.html': 'text/html',\n '.js': 'text/javascript',\n '.gif': 'image/gif',\n '.jpg': 'image/jpeg',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n};\n\nfunction getContentType(pathname: string): string {\n for (const [suffix, contentType] of Object.entries(CONTENT_TYPE_BY_SUFFIX)) {\n if (pathname.endsWith(suffix)) return contentType;\n }\n return 'text/plain';\n}\n"],"mappings":"oMAaA,SAAgB,EAAgB,EAAyB,CACvD,IAAM,EAASA,EAAAA,QAAK,cAAc,EAAS,IAAa,CACtD,IAAI,EAAW,IAAI,IAAI,EAAQ,KAAO,IAAK,kBAAkB,CAAC,CAAC,SAE3D,IAAa,MACf,EAAW,eAGb,IAAM,EAAwB,EAAS,SAAS,GAAG,EAAIC,EAAAA,QAAK,KAAK,EAAU,YAAY,EAAI,EAErF,EAAWA,EAAAA,QAAK,KAAK,EAAK,CAAqB,EAErD,GAAIC,EAAAA,QAAG,WAAW,CAAQ,EACxB,GAAI,CACF,IAAM,EAASA,EAAAA,QAAG,aAAa,CAAQ,EACvC,EAAS,UAAU,IAAK,CACtB,8BAA+B,IAC/B,OAAQ,WACR,gBAAiB,WACjB,eAAgB,EAAe,CAAqB,CACtD,CAAC,EACD,EAAS,IAAI,CAAM,CACrB,MAAQ,CACN,EAAS,WAAa,IACtB,EAAS,IAAI,CACf,KAEA,GAAS,WAAa,IACtB,EAAS,IAAI,CAEjB,CAAC,EAED,EAAO,OAAO,EAEd,IAAM,EAAU,EAAO,QAAQ,EAC/B,GAAI,CAAC,EAAS,MAAU,MAAM,qCAAqC,EAEnE,MAAO,EACJ,OAAO,cAAe,SAAY,CACjC,EAAO,oBAAoB,EAC3B,MAAM,IAAI,QAAe,GAAY,CACnC,EAAO,UAAY,CACjB,EAAQ,CACV,CAAC,CACH,CAAC,CACH,EACA,IAAK,OAAO,GAAY,SAAW,EAAU,oBAAoB,EAAQ,OACzE,KAAM,OAAO,GAAY,SAAW,EAAQ,KAAO,IAAA,EACrD,CACF,CAEA,MAAM,EAAiD,CACrD,OAAQ,WACR,QAAS,YACT,MAAO,kBACP,OAAQ,YACR,OAAQ,aACR,OAAQ,YACR,OAAQ,eACV,EAEA,SAAS,EAAe,EAA0B,CAChD,IAAK,GAAM,CAAC,EAAQ,KAAgB,OAAO,QAAQ,CAAsB,EACvE,GAAI,EAAS,SAAS,CAAM,EAAG,OAAO,EAExC,MAAO,YACT"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as e,typeof as t,slicedToArray as r,regenerator as n}from"../_virtual/_rollupPluginBabelHelpers.js";import o from"node:fs";import a from"node:http";import s from"node:path";function i(r){var i,c=a.createServer(function(e,t){var n,a=new URL(null!=(n=e.url)?n:"/","http://127.0.0.1").pathname;"/"===a&&(a="/index.html");var i=a.endsWith("/")?s.join(a,"index.html"):a,c=s.join(r,i);if(o.existsSync(c))try{var p=o.readFileSync(c);t.writeHead(200,{"Access-Control-Allow-Origin":"*",Pragma:"no-cache","Cache-Control":"no-cache","Content-Type":l(i)}),t.end(p)}catch(e){t.statusCode=500,t.end()}else t.statusCode=404,t.end()});c.listen();var p=c.address();if(!p)throw new Error("server has been unexpectedly closed");return(i={})[Symbol.asyncDispose]=e(n().m(function e(){return n().w(function(e){for(;;)switch(e.n){case 0:return c.closeAllConnections(),e.n=1,new Promise(function(e){c.close(function(){e()})});case 1:return e.a(2)}},e)})),i.url="string"==typeof p?p:"http://127.0.0.1:".concat(p.port),i.port="object"===t(p)?p.port:void 0,i}var c={".css":"text/css",".html":"text/html",".js":"text/javascript",".gif":"image/gif",".jpg":"image/jpeg",".png":"image/png",".svg":"image/svg+xml"};function l(e){for(var t=0,n=Object.entries(c);t<n.length;t++){var o=r(n[t],2),a=o[0],s=o[1];if(e.endsWith(a))return s}return"text/plain"}export{i as startHttpServer}; | ||
| //# sourceMappingURL=startHttpServer.js.map | ||
| import e from"node:path";import t from"node:fs";import n from"node:http";function r(r){let i=n.createServer((n,i)=>{let o=new URL(n.url??`/`,`http://127.0.0.1`).pathname;o===`/`&&(o=`/index.html`);let s=o.endsWith(`/`)?e.join(o,`index.html`):o,c=e.join(r,s);if(t.existsSync(c))try{let e=t.readFileSync(c);i.writeHead(200,{"Access-Control-Allow-Origin":`*`,Pragma:`no-cache`,"Cache-Control":`no-cache`,"Content-Type":a(s)}),i.end(e)}catch{i.statusCode=500,i.end()}else i.statusCode=404,i.end()});i.listen();let o=i.address();if(!o)throw Error(`server has been unexpectedly closed`);return{[Symbol.asyncDispose]:async()=>{i.closeAllConnections(),await new Promise(e=>{i.close(()=>{e()})})},url:typeof o==`string`?o:`http://127.0.0.1:${o.port}`,port:typeof o==`object`?o.port:void 0}}const i={".css":`text/css`,".html":`text/html`,".js":`text/javascript`,".gif":`image/gif`,".jpg":`image/jpeg`,".png":`image/png`,".svg":`image/svg+xml`};function a(e){for(let[t,n]of Object.entries(i))if(e.endsWith(t))return n;return`text/plain`}export{r as startHttpServer}; | ||
| //# sourceMappingURL=startHttpServer.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"startHttpServer.js","sources":["../../src/helpers/startHttpServer.ts"],"sourcesContent":["import fs from 'node:fs';\nimport http from 'node:http';\nimport path from 'node:path';\n\nexport interface HttpServer {\n [Symbol.asyncDispose](): Promise<void>;\n url: string;\n port: number | undefined;\n}\n\n/**\n * Start a HTTP server for testing web pages.\n */\nexport function startHttpServer(dir: string): HttpServer {\n const server = http.createServer((request, response) => {\n let pathname = new URL(request.url ?? '/', 'http://127.0.0.1').pathname;\n\n if (pathname === '/') {\n pathname = '/index.html';\n }\n\n const pathnameWithIndexHtml = pathname.endsWith('/') ? path.join(pathname, 'index.html') : pathname;\n\n const filePath = path.join(dir, pathnameWithIndexHtml);\n\n if (fs.existsSync(filePath)) {\n try {\n const buffer = fs.readFileSync(filePath);\n response.writeHead(200, {\n 'Access-Control-Allow-Origin': '*',\n Pragma: 'no-cache',\n 'Cache-Control': 'no-cache',\n 'Content-Type': getContentType(pathnameWithIndexHtml),\n });\n response.end(buffer);\n } catch {\n response.statusCode = 500;\n response.end();\n }\n } else {\n response.statusCode = 404;\n response.end();\n }\n });\n\n server.listen();\n\n const address = server.address();\n if (!address) throw new Error('server has been unexpectedly closed');\n\n return {\n [Symbol.asyncDispose]: async () => {\n server.closeAllConnections();\n await new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n });\n },\n url: typeof address === 'string' ? address : `http://127.0.0.1:${address.port}`,\n port: typeof address === 'object' ? address.port : undefined,\n };\n}\n\nconst CONTENT_TYPE_BY_SUFFIX: Record<string, string> = {\n '.css': 'text/css',\n '.html': 'text/html',\n '.js': 'text/javascript',\n '.gif': 'image/gif',\n '.jpg': 'image/jpeg',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n};\n\nfunction getContentType(pathname: string): string {\n for (const [suffix, contentType] of Object.entries(CONTENT_TYPE_BY_SUFFIX)) {\n if (pathname.endsWith(suffix)) return contentType;\n }\n return 'text/plain';\n}\n"],"names":["startHttpServer","dir","_ref2","server","http","createServer","request","response","_request$url","pathname","URL","url","pathnameWithIndexHtml","endsWith","path","join","filePath","fs","existsSync","buffer","readFileSync","writeHead","Pragma","getContentType","end","_unused","statusCode","listen","address","Error","Symbol","asyncDispose","_asyncToGenerator","_regenerator","m","_callee","w","_context","n","closeAllConnections","Promise","resolve","close","a","concat","port","_typeof","undefined","CONTENT_TYPE_BY_SUFFIX","_i","_Object$entries","Object","entries","length","_Object$entries$_i","_slicedToArray","suffix","contentType"],"mappings":"qMAaO,SAASA,EAAgBC,GAAyB,IAAAC,EACjDC,EAASC,EAAKC,aAAa,SAACC,EAASC,GAAa,IAAAC,EAClDC,EAAW,IAAIC,IAAe,OAAZF,EAACF,EAAQK,KAAGH,EAAI,IAAK,oBAAoBC,SAE9C,MAAbA,IACFA,EAAW,eAGb,IAAMG,EAAwBH,EAASI,SAAS,KAAOC,EAAKC,KAAKN,EAAU,cAAgBA,EAErFO,EAAWF,EAAKC,KAAKd,EAAKW,GAEhC,GAAIK,EAAGC,WAAWF,GAChB,IACE,IAAMG,EAASF,EAAGG,aAAaJ,GAC/BT,EAASc,UAAU,IAAK,CACtB,8BAA+B,IAC/BC,OAAQ,WACR,gBAAiB,WACjB,eAAgBC,EAAeX,KAEjCL,EAASiB,IAAIL,EACf,CAAE,MAAAM,GACAlB,EAASmB,WAAa,IACtBnB,EAASiB,KACX,MAEAjB,EAASmB,WAAa,IACtBnB,EAASiB,KAEb,GAEArB,EAAOwB,SAEP,IAAMC,EAAUzB,EAAOyB,UACvB,IAAKA,EAAS,MAAM,IAAIC,MAAM,uCAE9B,OAAA3B,EAAA,CAAA,GACG4B,OAAOC,cAAYC,EAAAC,IAAAC,EAAG,SAAAC,IAAA,OAAAF,IAAAG,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EACQ,OAA7BnC,EAAOoC,sBAAsBF,EAAAC,EAAA,EACvB,IAAIE,QAAc,SAACC,GACvBtC,EAAOuC,MAAM,WACXD,GACF,EACF,GAAE,KAAA,EAAA,OAAAJ,EAAAM,EAAA,GAAA,EAAAR,EAAA,IACHjC,EACDS,IAAwB,iBAAZiB,EAAuBA,EAAO,oBAAAgB,OAAuBhB,EAAQiB,MAAM3C,EAC/E2C,KAAyB,WAAnBC,EAAOlB,GAAuBA,EAAQiB,UAAOE,EAAS7C,CAEhE,CAEA,IAAM8C,EAAiD,CACrD,OAAQ,WACR,QAAS,YACT,MAAO,kBACP,OAAQ,YACR,OAAQ,aACR,OAAQ,YACR,OAAQ,iBAGV,SAASzB,EAAed,GACtB,IAAA,IAAAwC,EAAA,EAAAC,EAAoCC,OAAOC,QAAQJ,GAAuBC,EAAAC,EAAAG,OAAAJ,IAAE,CAAvE,IAAAK,EAAAC,EAAAL,EAAAD,GAAA,GAAOO,EAAMF,EAAA,GAAEG,EAAWH,EAAA,GAC7B,GAAI7C,EAASI,SAAS2C,GAAS,OAAOC,CACxC,CACA,MAAO,YACT"} | ||
| {"version":3,"file":"startHttpServer.js","names":[],"sources":["../../src/helpers/startHttpServer.ts"],"sourcesContent":["import fs from 'node:fs';\nimport http from 'node:http';\nimport path from 'node:path';\n\nexport interface HttpServer {\n [Symbol.asyncDispose](): Promise<void>;\n url: string;\n port: number | undefined;\n}\n\n/**\n * Start a HTTP server for testing web pages.\n */\nexport function startHttpServer(dir: string): HttpServer {\n const server = http.createServer((request, response) => {\n let pathname = new URL(request.url ?? '/', 'http://127.0.0.1').pathname;\n\n if (pathname === '/') {\n pathname = '/index.html';\n }\n\n const pathnameWithIndexHtml = pathname.endsWith('/') ? path.join(pathname, 'index.html') : pathname;\n\n const filePath = path.join(dir, pathnameWithIndexHtml);\n\n if (fs.existsSync(filePath)) {\n try {\n const buffer = fs.readFileSync(filePath);\n response.writeHead(200, {\n 'Access-Control-Allow-Origin': '*',\n Pragma: 'no-cache',\n 'Cache-Control': 'no-cache',\n 'Content-Type': getContentType(pathnameWithIndexHtml),\n });\n response.end(buffer);\n } catch {\n response.statusCode = 500;\n response.end();\n }\n } else {\n response.statusCode = 404;\n response.end();\n }\n });\n\n server.listen();\n\n const address = server.address();\n if (!address) throw new Error('server has been unexpectedly closed');\n\n return {\n [Symbol.asyncDispose]: async () => {\n server.closeAllConnections();\n await new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n });\n },\n url: typeof address === 'string' ? address : `http://127.0.0.1:${address.port}`,\n port: typeof address === 'object' ? address.port : undefined,\n };\n}\n\nconst CONTENT_TYPE_BY_SUFFIX: Record<string, string> = {\n '.css': 'text/css',\n '.html': 'text/html',\n '.js': 'text/javascript',\n '.gif': 'image/gif',\n '.jpg': 'image/jpeg',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n};\n\nfunction getContentType(pathname: string): string {\n for (const [suffix, contentType] of Object.entries(CONTENT_TYPE_BY_SUFFIX)) {\n if (pathname.endsWith(suffix)) return contentType;\n }\n return 'text/plain';\n}\n"],"mappings":"yEAaA,SAAgB,EAAgB,EAAyB,CACvD,IAAM,EAAS,EAAK,cAAc,EAAS,IAAa,CACtD,IAAI,EAAW,IAAI,IAAI,EAAQ,KAAO,IAAK,kBAAkB,CAAC,CAAC,SAE3D,IAAa,MACf,EAAW,eAGb,IAAM,EAAwB,EAAS,SAAS,GAAG,EAAI,EAAK,KAAK,EAAU,YAAY,EAAI,EAErF,EAAW,EAAK,KAAK,EAAK,CAAqB,EAErD,GAAI,EAAG,WAAW,CAAQ,EACxB,GAAI,CACF,IAAM,EAAS,EAAG,aAAa,CAAQ,EACvC,EAAS,UAAU,IAAK,CACtB,8BAA+B,IAC/B,OAAQ,WACR,gBAAiB,WACjB,eAAgB,EAAe,CAAqB,CACtD,CAAC,EACD,EAAS,IAAI,CAAM,CACrB,MAAQ,CACN,EAAS,WAAa,IACtB,EAAS,IAAI,CACf,KAEA,GAAS,WAAa,IACtB,EAAS,IAAI,CAEjB,CAAC,EAED,EAAO,OAAO,EAEd,IAAM,EAAU,EAAO,QAAQ,EAC/B,GAAI,CAAC,EAAS,MAAU,MAAM,qCAAqC,EAEnE,MAAO,EACJ,OAAO,cAAe,SAAY,CACjC,EAAO,oBAAoB,EAC3B,MAAM,IAAI,QAAe,GAAY,CACnC,EAAO,UAAY,CACjB,EAAQ,CACV,CAAC,CACH,CAAC,CACH,EACA,IAAK,OAAO,GAAY,SAAW,EAAU,oBAAoB,EAAQ,OACzE,KAAM,OAAO,GAAY,SAAW,EAAQ,KAAO,IAAA,EACrD,CACF,CAEA,MAAM,EAAiD,CACrD,OAAQ,WACR,QAAS,YACT,MAAO,kBACP,OAAQ,YACR,OAAQ,aACR,OAAQ,YACR,OAAQ,eACV,EAEA,SAAS,EAAe,EAA0B,CAChD,IAAK,GAAM,CAAC,EAAQ,KAAgB,OAAO,QAAQ,CAAsB,EACvE,GAAI,EAAS,SAAS,CAAM,EAAG,OAAO,EAExC,MAAO,YACT"} |
+1
-2
@@ -1,2 +0,1 @@ | ||
| "use strict";var e=require("./helpers/parseArgs.cjs"),r=require("./helpers/printTestCaseResult.cjs"),s=require("./helpers/removeCommentsInSourceCode.cjs"),o=require("./helpers/runCommandInTemporaryPackageManagerProject.cjs"),t=require("./helpers/runPythonInTemporaryUvProject.cjs"),a=require("./helpers/sourceCodeGrammars.cjs"),n=require("./helpers/startHttpServer.cjs"),c=require("./types/decisionCode.cjs"),p=require("./types/testCaseResult.cjs");exports.parseArgs=e.parseArgs,exports.encodeFileForTestCaseResult=r.encodeFileForTestCaseResult,exports.printTestCaseResult=r.printTestCaseResult,exports.removeCommentsAndStringsInSourceCode=s.removeCommentsAndStringsInSourceCode,exports.removeCommentsInSourceCode=s.removeCommentsInSourceCode,exports.copyPackageManagerProjectFiles=o.copyPackageManagerProjectFiles,exports.runCommandInTemporaryPackageManagerProject=o.runCommandInTemporaryPackageManagerProject,exports.runPythonInTemporaryUvProject=t.runPythonInTemporaryUvProject,exports.languageIdToSourceCodeGrammar=a.languageIdToSourceCodeGrammar,exports.startHttpServer=n.startHttpServer,exports.DecisionCode=c.DecisionCode,exports.TEST_CASE_RESULT_PREFIX=p.TEST_CASE_RESULT_PREFIX,exports.testCaseResultSchema=p.testCaseResultSchema; | ||
| //# sourceMappingURL=index.cjs.map | ||
| "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./helpers/parseArgs.cjs"),t=require("./types/testCaseResult.cjs"),n=require("./helpers/printTestCaseResult.cjs"),r=require("./helpers/removeCommentsInSourceCode.cjs"),i=require("./helpers/runCommandInTemporaryPackageManagerProject.cjs"),a=require("./helpers/runPythonInTemporaryUvProject.cjs"),o=require("./helpers/sourceCodeGrammars.cjs"),s=require("./helpers/startHttpServer.cjs"),c=require("./types/decisionCode.cjs");exports.DecisionCode=c.DecisionCode,exports.TEST_CASE_RESULT_PREFIX=t.TEST_CASE_RESULT_PREFIX,exports.copyPackageManagerProjectFiles=i.copyPackageManagerProjectFiles,exports.encodeFileForTestCaseResult=n.encodeFileForTestCaseResult,exports.languageIdToSourceCodeGrammar=o.languageIdToSourceCodeGrammar,exports.parseArgs=e.parseArgs,exports.printTestCaseResult=n.printTestCaseResult,exports.removeCommentsAndStringsInSourceCode=r.removeCommentsAndStringsInSourceCode,exports.removeCommentsInSourceCode=r.removeCommentsInSourceCode,exports.runCommandInTemporaryPackageManagerProject=i.runCommandInTemporaryPackageManagerProject,exports.runPythonInTemporaryUvProject=a.runPythonInTemporaryUvProject,exports.startHttpServer=s.startHttpServer,exports.testCaseResultSchema=t.testCaseResultSchema; |
+1
-2
@@ -1,2 +0,1 @@ | ||
| export{parseArgs}from"./helpers/parseArgs.js";export{encodeFileForTestCaseResult,printTestCaseResult}from"./helpers/printTestCaseResult.js";export{removeCommentsAndStringsInSourceCode,removeCommentsInSourceCode}from"./helpers/removeCommentsInSourceCode.js";export{copyPackageManagerProjectFiles,runCommandInTemporaryPackageManagerProject}from"./helpers/runCommandInTemporaryPackageManagerProject.js";export{runPythonInTemporaryUvProject}from"./helpers/runPythonInTemporaryUvProject.js";export{languageIdToSourceCodeGrammar}from"./helpers/sourceCodeGrammars.js";export{startHttpServer}from"./helpers/startHttpServer.js";export{DecisionCode}from"./types/decisionCode.js";export{TEST_CASE_RESULT_PREFIX,testCaseResultSchema}from"./types/testCaseResult.js"; | ||
| //# sourceMappingURL=index.js.map | ||
| import{parseArgs as e}from"./helpers/parseArgs.js";import{TEST_CASE_RESULT_PREFIX as t,testCaseResultSchema as n}from"./types/testCaseResult.js";import{encodeFileForTestCaseResult as r,printTestCaseResult as i}from"./helpers/printTestCaseResult.js";import{removeCommentsAndStringsInSourceCode as a,removeCommentsInSourceCode as o}from"./helpers/removeCommentsInSourceCode.js";import{copyPackageManagerProjectFiles as s,runCommandInTemporaryPackageManagerProject as c}from"./helpers/runCommandInTemporaryPackageManagerProject.js";import{runPythonInTemporaryUvProject as l}from"./helpers/runPythonInTemporaryUvProject.js";import{languageIdToSourceCodeGrammar as u}from"./helpers/sourceCodeGrammars.js";import{startHttpServer as d}from"./helpers/startHttpServer.js";import{DecisionCode as f}from"./types/decisionCode.js";export{f as DecisionCode,t as TEST_CASE_RESULT_PREFIX,s as copyPackageManagerProjectFiles,r as encodeFileForTestCaseResult,u as languageIdToSourceCodeGrammar,e as parseArgs,i as printTestCaseResult,a as removeCommentsAndStringsInSourceCode,o as removeCommentsInSourceCode,c as runCommandInTemporaryPackageManagerProject,l as runPythonInTemporaryUvProject,d as startHttpServer,n as testCaseResultSchema}; |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),t=require("node:path"),r=require("zod"),n=require("../helpers/checkProblemDirIsolation.cjs"),s=require("../helpers/cleanWorkingDirectory.cjs"),i=require("../helpers/copyTestCaseFileInput.cjs"),a=require("../helpers/findEntryPointFile.cjs"),u=require("../helpers/findLanguageDefinitionByPath.cjs"),o=require("../helpers/judgeByStaticAnalysis.cjs"),c=require("../helpers/parseArgs.cjs"),d=require("../helpers/printDebugBanner.cjs"),l=require("../helpers/printTestCaseResult.cjs"),p=require("../helpers/readOutputFiles.cjs"),m=require("../helpers/readProblemMarkdownFrontMatter.cjs"),C=require("../helpers/readTestCases.cjs"),f=require("../helpers/resolveCwds.cjs"),h=require("../helpers/spawnSyncWithTimeout.cjs"),g=require("../types/decisionCode.cjs"),I=r.z.object({language:r.z.union([r.z.string(),r.z.array(r.z.string())]).optional()});function b(){return(b=e.asyncToGenerator(e.regenerator().m(function t(r,s){var i,a,u,o,l,p,m,C,h,g,b;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return i=c.parseArgs(process.argv),a=I.parse(i.params),t.n=1,f.resolveCwds(r,i.cwd);case 1:if(u=t.v,o=u.cwds,!(l=u.isDebugMode)){t.n=5;break}if(!(p=o.find(function(e){return"accepted"===e.expectedResult}))){t.n=4;break}return t.n=2,n.checkProblemDirIsolation(r,p,a);case 2:if(t.v.passed){t.n=3;break}return process.exitCode=1,t.a(2);case 3:t.n=5;break;case 4:d.printDebugBanner(["[DEBUG MODE] isolated problem directory check skipped","","No accepted model answer is available for checking that the copied judge still accepts a valid submission."]);case 5:m=e.createForOfIteratorHelper(o),t.p=6,m.s();case 7:if((C=m.n()).done){t.n=10;break}return h=C.value,l&&f.printDebugCwdBanner(r,h),t.n=8,v(r,h.cwd,a,s);case 8:g=t.v,l&&!y(h,g)&&(process.exitCode=1,f.printDebugExpectationFailureBanner(r,h));case 9:t.n=7;break;case 10:t.n=12;break;case 11:t.p=11,b=t.v,m.e(b);case 12:return t.p=12,m.f(),t.f(12);case 13:return t.a(2)}},t,null,[[6,11,12,13]])}))).apply(this,arguments)}function v(e,t,r,n){return E.apply(this,arguments)}function E(){return(E=e.asyncToGenerator(e.regenerator().m(function t(r,n,c,d){var C,f,h,I,b,v,E,y,T,O,_,w,x,M,P,B,F,j,q,A,U,N,W,G,z,X,H,Q,Y,Z,J,V,K,$,ee,te,re,ne,se,ie,ae,ue,oe,ce,de,le,pe;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return t.n=1,m.readProblemMarkdownFrontMatter(r);case 1:return _=t.v,t.n=2,(null!=(C=d.readTestCases)?C:S)(r);case 2:return w=t.v,x=null!=(f=null==(h=w[0])?void 0:h.id)?f:"prebuild",M={buildTimeoutSeconds:null!=(I=null==(b=d.limits)?void 0:b.buildTimeoutSeconds)?I:10,maxOutputLength:null!=(v=null==(E=d.limits)?void 0:E.maxOutputLength)?v:5e4},P=null!=(y=d.runTimeoutSeconds)?y:2,t.n=3,o.judgeByStaticAnalysis(n,_);case 3:if(!(B=t.v)){t.n=4;break}return l.printTestCaseResult(e.objectSpread2({testCaseId:x},B)),t.a(2,{allAccepted:!1});case 4:return t.n=5,a.findEntryPointFile(n,c.language);case 5:if(F=t.v){t.n=6;break}return l.printTestCaseResult({testCaseId:x,decisionCode:g.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(c.language?": language: ".concat(c.language):"")}),t.a(2,{allAccepted:!1});case 6:if(j=u.findLanguageDefinitionByPath(F)){t.n=7;break}return l.printTestCaseResult({testCaseId:x,decisionCode:g.DecisionCode.WRONG_ANSWER,stderr:"unsupported language"}),t.a(2,{allAccepted:!1});case 7:if(q=e.objectSpread2(e.objectSpread2({},process.env),{},{CI:"",FORCE_COLOR:"0"}),A=F,!j.prebuild){t.n=12;break}return t.p=8,t.n=9,j.prebuild(n);case 9:return t.n=10,a.findEntryPointFile(n,c.language);case 10:(U=t.v)&&(A=U),t.n=12;break;case 11:return t.p=11,oe=t.v,l.printTestCaseResult({testCaseId:x,decisionCode:g.DecisionCode.BUILD_ERROR,stderr:oe instanceof Error?oe.message:String(oe)}),t.a(2,{allAccepted:!1});case 12:if(!(N=null==(T=j.buildCommand)?void 0:T.call(j,A))){t.n=13;break}if(!(W=R(N,{cwd:n,env:q,testCaseId:x,limits:M}))){t.n=13;break}return l.printTestCaseResult(W),t.a(2,{allAccepted:!1});case 13:return t.n=14,s.snapshotWorkingDirectory(n);case 14:if(G=t.v,0!==w.length){t.n=15;break}return l.printTestCaseResult({testCaseId:"default",decisionCode:g.DecisionCode.ACCEPTED}),t.a(2,{allAccepted:!0});case 15:z=null==(O=w.shared)?void 0:O.fileInputPath,X=e.createForOfIteratorHelper(w),t.p=16,X.s();case 17:if((H=X.n()).done){t.n=36;break}if(J=H.value,!z){t.n=18;break}return t.n=18,i.copyTestCaseFileInput(z,n);case 18:if(!J.fileInputPath){t.n=19;break}return t.n=19,i.copyTestCaseFileInput(J.fileInputPath,n);case 19:if(V="number"==typeof _.timeLimitMs?_.timeLimitMs/1e3:P,K=j.command(A),$=null!=(Q=J.input)?Q:"",ee=void 0,t.p=20,!d.resolveInput){t.n=22;break}return t.n=21,d.resolveInput({testCase:J,cwd:n,env:q});case 21:$=t.v;case 22:if(!d.runCommand){t.n=24;break}return t.n=23,d.runCommand({testCase:J,command:K,stdin:$,cwd:n,env:q,timeLimitSeconds:V});case 23:ce=t.v,t.n=25;break;case 24:ce=k(K,{stdin:$,cwd:n,env:q,timeLimitSeconds:V});case 25:ee=ce,t.n=28;break;case 26:return t.p=26,de=t.v,l.printTestCaseResult({testCaseId:J.id,decisionCode:g.DecisionCode.RUNTIME_ERROR,stdin:$,stderr:D(de)}),t.n=27,s.cleanWorkingDirectory(n,G);case 27:return t.a(2,{allAccepted:!1});case 28:return t.n=29,p.readOutputFiles(n,null!=(Y=_.requiredOutputFilePaths)?Y:[]);case 29:if(te=t.v,re={timeLimitSeconds:V,outputLimitLength:M.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:_.memoryLimitByte,requiredOutputFilePaths:_.requiredOutputFilePaths}},ne=L({runResult:ee,outputFiles:te,context:re}),se=ne,ne.decisionCode!==g.DecisionCode.ACCEPTED){t.n=33;break}return t.p=30,t.n=31,null==(ie=d.test)?void 0:ie.call(d,{testCase:J,runResult:ee,outputFiles:te,context:re});case 31:(ae=t.v)&&(se={decisionCode:null!=(ue=ae.decisionCode)?ue:ne.decisionCode,feedbackMarkdown:ae.feedbackMarkdown,stderr:ae.stderr}),t.n=33;break;case 32:t.p=32,le=t.v,se={decisionCode:g.DecisionCode.RUNTIME_ERROR,stderr:D(le)};case 33:return l.printTestCaseResult(e.objectSpread2(e.objectSpread2({testCaseId:J.id},se),{},{exitStatus:ee.status,stdin:ee.stdin,stdout:ee.stdout.slice(0,M.maxOutputLength)||void 0,stderr:(null!=(Z=se.stderr)?Z:ee.stderr).slice(0,M.maxOutputLength)||void 0,timeSeconds:ee.timeSeconds,memoryBytes:ee.memoryBytes,outputFiles:te.length>0?te:void 0})),t.n=34,s.cleanWorkingDirectory(n,G);case 34:if(se.decisionCode===g.DecisionCode.ACCEPTED){t.n=35;break}return t.a(2,{allAccepted:!1});case 35:t.n=17;break;case 36:t.n=38;break;case 37:t.p=37,pe=t.v,X.e(pe);case 38:return t.p=38,X.f(),t.f(38);case 39:return t.a(2,{allAccepted:!0})}},t,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function y(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function R(e,t){var r,n=h.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),s=null!=(r=n.status)?r:void 0;return 0!==n.status?{testCaseId:t.testCaseId,decisionCode:g.DecisionCode.BUILD_ERROR,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:g.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.stdout.length>t.limits.maxOutputLength||n.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:g.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:void 0}function D(e){return e instanceof Error?e.message:String(e)}function S(e){return T.apply(this,arguments)}function T(){return(T=e.asyncToGenerator(e.regenerator().m(function r(n){var s,i,a;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,C.readTestCases(t.join(n,"test_cases"));case 1:if(i=e.v,a=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(s=i.shared)||!s.fileInputPath){e.n=2;break}return e.a(2,Object.assign(a,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,a)}},r)}))).apply(this,arguments)}function k(e,t){var r,n=h.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:n.stdout,stderr:n.stderr,status:null!=(r=n.status)?r:void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function L(e){var t,r,n;if(0!==e.runResult.status)return{decisionCode:g.DecisionCode.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:g.DecisionCode.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:g.DecisionCode.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.outputLimitExceeded||e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:g.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var s=null!=(r=null==(n=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:n.length)?r:0;return e.outputFiles.length<s?{decisionCode:g.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:g.DecisionCode.ACCEPTED}}exports.commandJudgePreset=function(e,t){return b.apply(this,arguments)}; | ||
| //# sourceMappingURL=command.cjs.map | ||
| "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/parseArgs.cjs"),n=require("../helpers/printTestCaseResult.cjs"),r=require("../types/decisionCode.cjs"),i=require("../helpers/printDebugBanner.cjs"),a=require("../helpers/checkProblemDirIsolation.cjs"),o=require("../helpers/cleanWorkingDirectory.cjs"),s=require("../helpers/copyTestCaseFileInput.cjs"),c=require("../helpers/findEntryPointFile.cjs"),l=require("../helpers/findLanguageDefinitionByPath.cjs"),u=require("../helpers/judgeByStaticAnalysis.cjs"),d=require("../helpers/readOutputFiles.cjs"),f=require("../helpers/readProblemMarkdownFrontMatter.cjs"),p=require("../helpers/readTestCases.cjs"),m=require("../helpers/resolveCwds.cjs"),h=require("../helpers/spawnSyncWithTimeout.cjs");let g=require("zod"),_=require("node:path");_=e.__toESM(_,1);const v=g.z.object({language:g.z.union([g.z.string(),g.z.array(g.z.string())]).optional()});async function y(e,n){let r=t.parseArgs(process.argv),o=v.parse(r.params),{cwds:s,isDebugMode:c}=await m.resolveCwds(e,r.cwd);if(c){let t=s.find(e=>e.expectedResult===`accepted`);if(t){if(!(await a.checkProblemDirIsolation(e,t,o)).passed){process.exitCode=1;return}}else i.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.`])}for(let t of s){c&&m.printDebugCwdBanner(e,t);let r=await b(e,t.cwd,o,n);c&&!x(t,r)&&(process.exitCode=1,m.printDebugExpectationFailureBanner(e,t))}}async function b(e,t,i,a){let p=await f.readProblemMarkdownFrontMatter(e),m=await(a.readTestCases??T)(e),h=m[0]?.id??`prebuild`,g={buildTimeoutSeconds:a.limits?.buildTimeoutSeconds??10,maxOutputLength:a.limits?.maxOutputLength??5e4},_=a.runTimeoutSeconds??2,v=await u.judgeByStaticAnalysis(t,p);if(v)return n.printTestCaseResult({testCaseId:h,...v}),{allAccepted:!1};let y=await c.findEntryPointFile(t,i.language);if(!y)return n.printTestCaseResult({testCaseId:h,decisionCode:r.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${i.language?`: language: ${i.language}`:``}`}),{allAccepted:!1};let b=l.findLanguageDefinitionByPath(y);if(!b)return n.printTestCaseResult({testCaseId:h,decisionCode:r.DecisionCode.WRONG_ANSWER,stderr:`unsupported language`}),{allAccepted:!1};let x={...process.env,CI:``,FORCE_COLOR:`0`},w=y;if(b.prebuild)try{await b.prebuild(t);let e=await c.findEntryPointFile(t,i.language);e&&(w=e)}catch(e){return n.printTestCaseResult({testCaseId:h,decisionCode:r.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)}),{allAccepted:!1}}let O=b.buildCommand?.(w);if(O){let e=S(O,{cwd:t,env:x,testCaseId:h,limits:g});if(e)return n.printTestCaseResult(e),{allAccepted:!1}}let k=await o.snapshotWorkingDirectory(t);if(m.length===0)return n.printTestCaseResult({testCaseId:`default`,decisionCode:r.DecisionCode.ACCEPTED}),{allAccepted:!0};let A=m.shared?.fileInputPath;for(let e of m){A&&await s.copyTestCaseFileInput(A,t),e.fileInputPath&&await s.copyTestCaseFileInput(e.fileInputPath,t);let i=typeof p.timeLimitMs==`number`?p.timeLimitMs/1e3:_,c=b.command(w),l=e.input??``,u;try{a.resolveInput&&(l=await a.resolveInput({testCase:e,cwd:t,env:x})),u=a.runCommand?await a.runCommand({testCase:e,command:c,stdin:l,cwd:t,env:x,timeLimitSeconds:i}):E(c,{stdin:l,cwd:t,env:x,timeLimitSeconds:i})}catch(i){return n.printTestCaseResult({testCaseId:e.id,decisionCode:r.DecisionCode.RUNTIME_ERROR,stdin:l,stderr:C(i)}),await o.cleanWorkingDirectory(t,k),{allAccepted:!1}}let f=await d.readOutputFiles(t,p.requiredOutputFilePaths??[]),m={timeLimitSeconds:i,outputLimitLength:g.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:p.memoryLimitByte,requiredOutputFilePaths:p.requiredOutputFilePaths}},h=D({runResult:u,outputFiles:f,context:m}),v=h;if(h.decisionCode===r.DecisionCode.ACCEPTED)try{let t=await a.test?.({testCase:e,runResult:u,outputFiles:f,context:m});t&&(v={decisionCode:t.decisionCode??h.decisionCode,feedbackMarkdown:t.feedbackMarkdown,stderr:t.stderr})}catch(e){v={decisionCode:r.DecisionCode.RUNTIME_ERROR,stderr:C(e)}}if(n.printTestCaseResult({testCaseId:e.id,...v,exitStatus:u.status,stdin:u.stdin,stdout:u.stdout.slice(0,g.maxOutputLength)||void 0,stderr:(v.stderr??u.stderr).slice(0,g.maxOutputLength)||void 0,timeSeconds:u.timeSeconds,memoryBytes:u.memoryBytes,outputFiles:f.length>0?f:void 0}),await o.cleanWorkingDirectory(t,k),v.decisionCode!==r.DecisionCode.ACCEPTED)return{allAccepted:!1}}return{allAccepted:!0}}function x(e,t){return t.allAccepted===(e.expectedResult===`accepted`)}function S(e,t){let n=h.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:`utf8`,env:t.env},t.limits.buildTimeoutSeconds),i=n.status??void 0;if(n.status!==0)return{testCaseId:t.testCaseId,decisionCode:r.DecisionCode.BUILD_ERROR,exitStatus:i,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes};if(n.timeSeconds>t.limits.buildTimeoutSeconds)return{testCaseId:t.testCaseId,decisionCode:r.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:i,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes};if(n.stdout.length>t.limits.maxOutputLength||n.stderr.length>t.limits.maxOutputLength)return{testCaseId:t.testCaseId,decisionCode:r.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:i,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function C(e){return e instanceof Error?e.message:String(e)}function w(e){return{id:e.id,input:e.input,fileInputPath:e.fileInputPath}}async function T(e){let t=await p.readTestCases(_.default.join(e,`test_cases`)),n=t.map(e=>w(e));return t.shared?.fileInputPath?Object.assign(n,{shared:{fileInputPath:t.shared.fileInputPath}}):n}function E(e,t){let 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:n.status??void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function D(e){if(e.runResult.status!==0)return{decisionCode:r.DecisionCode.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:r.DecisionCode.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(e.context.problemMarkdownFrontMatter.memoryLimitByte??1/0))return{decisionCode:r.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:r.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};let t=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length??0;return e.outputFiles.length<t?{decisionCode:r.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:r.DecisionCode.ACCEPTED}}exports.commandJudgePreset=y; | ||
| //# sourceMappingURL=command.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"command.cjs","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { 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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"} | ||
| {"version":3,"file":"command.cjs","names":["z","parseArgs","resolveCwds","checkProblemDirIsolation","readProblemMarkdownFrontMatter","judgeByStaticAnalysis","findEntryPointFile","DecisionCode","findLanguageDefinitionByPath","snapshotWorkingDirectory","copyTestCaseFileInput","cleanWorkingDirectory","readOutputFiles","spawnSyncWithTimeout","readFileTestCases","path"],"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"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as e,regenerator as t,createForOfIteratorHelper as r,objectSpread2 as s}from"../_virtual/_rollupPluginBabelHelpers.js";import n from"node:path";import{z as i}from"zod";import{checkProblemDirIsolation as a}from"../helpers/checkProblemDirIsolation.js";import{cleanWorkingDirectory as u,snapshotWorkingDirectory as o}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as d}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as c}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as l}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as m}from"../helpers/judgeByStaticAnalysis.js";import{parseArgs as p}from"../helpers/parseArgs.js";import{printDebugBanner as f}from"../helpers/printDebugBanner.js";import{printTestCaseResult as h}from"../helpers/printTestCaseResult.js";import{readOutputFiles as C}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as I}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as v}from"../helpers/readTestCases.js";import{resolveCwds as g,printDebugExpectationFailureBanner as E,printDebugCwdBanner as b}from"../helpers/resolveCwds.js";import{spawnSyncWithTimeout as R}from"../helpers/spawnSyncWithTimeout.js";import{DecisionCode as y}from"../types/decisionCode.js";var L=i.object({language:i.union([i.string(),i.array(i.string())]).optional()});function S(e,t){return k.apply(this,arguments)}function k(){return(k=e(t().m(function e(s,n){var i,u,o,d,c,l,m,h,C,I,v;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return i=p(process.argv),u=L.parse(i.params),e.n=1,g(s,i.cwd);case 1:if(o=e.v,d=o.cwds,!(c=o.isDebugMode)){e.n=5;break}if(!(l=d.find(function(e){return"accepted"===e.expectedResult}))){e.n=4;break}return e.n=2,a(s,l,u);case 2:if(e.v.passed){e.n=3;break}return process.exitCode=1,e.a(2);case 3:e.n=5;break;case 4:f(["[DEBUG MODE] isolated problem directory check skipped","","No accepted model answer is available for checking that the copied judge still accepts a valid submission."]);case 5:m=r(d),e.p=6,m.s();case 7:if((h=m.n()).done){e.n=10;break}return C=h.value,c&&b(s,C),e.n=8,O(s,C.cwd,u,n);case 8:I=e.v,c&&!_(C,I)&&(process.exitCode=1,E(s,C));case 9:e.n=7;break;case 10:e.n=12;break;case 11:e.p=11,v=e.v,m.e(v);case 12:return e.p=12,m.f(),e.f(12);case 13:return e.a(2)}},e,null,[[6,11,12,13]])}))).apply(this,arguments)}function O(e,t,r,s){return T.apply(this,arguments)}function T(){return(T=e(t().m(function e(n,i,a,p){var f,v,g,E,b,R,L,S,k,O,T,_,w,j,F,A,U,N,G,X,q,W,H,Q,Y,Z,z,V,J,K,$,ee,te,re,se,ne,ie,ae,ue,oe,de,ce,le,me,pe,fe,he;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.n=1,I(n);case 1:return T=e.v,e.n=2,(null!=(f=p.readTestCases)?f:D)(n);case 2:return _=e.v,w=null!=(v=null==(g=_[0])?void 0:g.id)?v:"prebuild",j={buildTimeoutSeconds:null!=(E=null==(b=p.limits)?void 0:b.buildTimeoutSeconds)?E:10,maxOutputLength:null!=(R=null==(L=p.limits)?void 0:L.maxOutputLength)?R:5e4},F=null!=(S=p.runTimeoutSeconds)?S:2,e.n=3,m(i,T);case 3:if(!(A=e.v)){e.n=4;break}return h(s({testCaseId:w},A)),e.a(2,{allAccepted:!1});case 4:return e.n=5,c(i,a.language);case 5:if(U=e.v){e.n=6;break}return h({testCaseId:w,decisionCode:y.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(a.language?": language: ".concat(a.language):"")}),e.a(2,{allAccepted:!1});case 6:if(N=l(U)){e.n=7;break}return h({testCaseId:w,decisionCode:y.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2,{allAccepted:!1});case 7:if(G=s(s({},process.env),{},{CI:"",FORCE_COLOR:"0"}),X=U,!N.prebuild){e.n=12;break}return e.p=8,e.n=9,N.prebuild(i);case 9:return e.n=10,c(i,a.language);case 10:(q=e.v)&&(X=q),e.n=12;break;case 11:return e.p=11,le=e.v,h({testCaseId:w,decisionCode:y.BUILD_ERROR,stderr:le instanceof Error?le.message:String(le)}),e.a(2,{allAccepted:!1});case 12:if(!(W=null==(k=N.buildCommand)?void 0:k.call(N,X))){e.n=13;break}if(!(H=x(W,{cwd:i,env:G,testCaseId:w,limits:j}))){e.n=13;break}return h(H),e.a(2,{allAccepted:!1});case 13:return e.n=14,o(i);case 14:if(Q=e.v,0!==_.length){e.n=15;break}return h({testCaseId:"default",decisionCode:y.ACCEPTED}),e.a(2,{allAccepted:!0});case 15:Y=null==(O=_.shared)?void 0:O.fileInputPath,Z=r(_),e.p=16,Z.s();case 17:if((z=Z.n()).done){e.n=36;break}if($=z.value,!Y){e.n=18;break}return e.n=18,d(Y,i);case 18:if(!$.fileInputPath){e.n=19;break}return e.n=19,d($.fileInputPath,i);case 19:if(ee="number"==typeof T.timeLimitMs?T.timeLimitMs/1e3:F,te=N.command(X),re=null!=(V=$.input)?V:"",se=void 0,e.p=20,!p.resolveInput){e.n=22;break}return e.n=21,p.resolveInput({testCase:$,cwd:i,env:G});case 21:re=e.v;case 22:if(!p.runCommand){e.n=24;break}return e.n=23,p.runCommand({testCase:$,command:te,stdin:re,cwd:i,env:G,timeLimitSeconds:ee});case 23:me=e.v,e.n=25;break;case 24:me=P(te,{stdin:re,cwd:i,env:G,timeLimitSeconds:ee});case 25:se=me,e.n=28;break;case 26:return e.p=26,pe=e.v,h({testCaseId:$.id,decisionCode:y.RUNTIME_ERROR,stdin:re,stderr:M(pe)}),e.n=27,u(i,Q);case 27:return e.a(2,{allAccepted:!1});case 28:return e.n=29,C(i,null!=(J=T.requiredOutputFilePaths)?J:[]);case 29:if(ne=e.v,ie={timeLimitSeconds:ee,outputLimitLength:j.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:T.memoryLimitByte,requiredOutputFilePaths:T.requiredOutputFilePaths}},ae=B({runResult:se,outputFiles:ne,context:ie}),ue=ae,ae.decisionCode!==y.ACCEPTED){e.n=33;break}return e.p=30,e.n=31,null==(oe=p.test)?void 0:oe.call(p,{testCase:$,runResult:se,outputFiles:ne,context:ie});case 31:(de=e.v)&&(ue={decisionCode:null!=(ce=de.decisionCode)?ce:ae.decisionCode,feedbackMarkdown:de.feedbackMarkdown,stderr:de.stderr}),e.n=33;break;case 32:e.p=32,fe=e.v,ue={decisionCode:y.RUNTIME_ERROR,stderr:M(fe)};case 33:return h(s(s({testCaseId:$.id},ue),{},{exitStatus:se.status,stdin:se.stdin,stdout:se.stdout.slice(0,j.maxOutputLength)||void 0,stderr:(null!=(K=ue.stderr)?K:se.stderr).slice(0,j.maxOutputLength)||void 0,timeSeconds:se.timeSeconds,memoryBytes:se.memoryBytes,outputFiles:ne.length>0?ne:void 0})),e.n=34,u(i,Q);case 34:if(ue.decisionCode===y.ACCEPTED){e.n=35;break}return e.a(2,{allAccepted:!1});case 35:e.n=17;break;case 36:e.n=38;break;case 37:e.p=37,he=e.v,Z.e(he);case 38:return e.p=38,Z.f(),e.f(38);case 39:return e.a(2,{allAccepted:!0})}},e,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function _(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function x(e,t){var r,s=R(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),n=null!=(r=s.status)?r:void 0;return 0!==s.status?{testCaseId:t.testCaseId,decisionCode:y.BUILD_ERROR,exitStatus:n,stdout:s.stdout.slice(0,t.limits.maxOutputLength),stderr:s.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}:s.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:y.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:n,stdout:s.stdout.slice(0,t.limits.maxOutputLength),stderr:s.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}:s.stdout.length>t.limits.maxOutputLength||s.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:y.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:n,stdout:s.stdout.slice(0,t.limits.maxOutputLength),stderr:s.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}:void 0}function M(e){return e instanceof Error?e.message:String(e)}function D(e){return w.apply(this,arguments)}function w(){return(w=e(t().m(function e(r){var s,i,a;return t().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,v(n.join(r,"test_cases"));case 1:if(i=e.v,a=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(s=i.shared)||!s.fileInputPath){e.n=2;break}return e.a(2,Object.assign(a,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,a)}},e)}))).apply(this,arguments)}function P(e,t){var r,s=R(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:s.stdout,stderr:s.stderr,status:null!=(r=s.status)?r:void 0,timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes}}function B(e){var t,r,s;if(0!==e.runResult.status)return{decisionCode:y.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:y.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:y.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.outputLimitExceeded||e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:y.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var n=null!=(r=null==(s=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:s.length)?r:0;return e.outputFiles.length<n?{decisionCode:y.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:y.ACCEPTED}}export{S as commandJudgePreset}; | ||
| //# sourceMappingURL=command.js.map | ||
| import{parseArgs as e}from"../helpers/parseArgs.js";import{printTestCaseResult as t}from"../helpers/printTestCaseResult.js";import{DecisionCode as n}from"../types/decisionCode.js";import{printDebugBanner as r}from"../helpers/printDebugBanner.js";import{checkProblemDirIsolation as i}from"../helpers/checkProblemDirIsolation.js";import{cleanWorkingDirectory as a,snapshotWorkingDirectory as o}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as s}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as c}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as l}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as u}from"../helpers/judgeByStaticAnalysis.js";import{readOutputFiles as d}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as f}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as p}from"../helpers/readTestCases.js";import{printDebugCwdBanner as m,printDebugExpectationFailureBanner as h,resolveCwds as g}from"../helpers/resolveCwds.js";import{spawnSyncWithTimeout as _}from"../helpers/spawnSyncWithTimeout.js";import{z as v}from"zod";import y from"node:path";const b=v.object({language:v.union([v.string(),v.array(v.string())]).optional()});async function x(t,n){let a=e(process.argv),o=b.parse(a.params),{cwds:s,isDebugMode:c}=await g(t,a.cwd);if(c){let e=s.find(e=>e.expectedResult===`accepted`);if(e){if(!(await i(t,e,o)).passed){process.exitCode=1;return}}else r([`[DEBUG MODE] isolated problem directory check skipped`,``,`No accepted model answer is available for checking that the copied judge still accepts a valid submission.`])}for(let e of s){c&&m(t,e);let r=await S(t,e.cwd,o,n);c&&!C(e,r)&&(process.exitCode=1,h(t,e))}}async function S(e,r,i,p){let m=await f(e),h=await(p.readTestCases??D)(e),g=h[0]?.id??`prebuild`,_={buildTimeoutSeconds:p.limits?.buildTimeoutSeconds??10,maxOutputLength:p.limits?.maxOutputLength??5e4},v=p.runTimeoutSeconds??2,y=await u(r,m);if(y)return t({testCaseId:g,...y}),{allAccepted:!1};let b=await c(r,i.language);if(!b)return t({testCaseId:g,decisionCode:n.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${i.language?`: language: ${i.language}`:``}`}),{allAccepted:!1};let x=l(b);if(!x)return t({testCaseId:g,decisionCode:n.WRONG_ANSWER,stderr:`unsupported language`}),{allAccepted:!1};let S={...process.env,CI:``,FORCE_COLOR:`0`},C=b;if(x.prebuild)try{await x.prebuild(r);let e=await c(r,i.language);e&&(C=e)}catch(e){return t({testCaseId:g,decisionCode:n.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)}),{allAccepted:!1}}let E=x.buildCommand?.(C);if(E){let e=w(E,{cwd:r,env:S,testCaseId:g,limits:_});if(e)return t(e),{allAccepted:!1}}let A=await o(r);if(h.length===0)return t({testCaseId:`default`,decisionCode:n.ACCEPTED}),{allAccepted:!0};let j=h.shared?.fileInputPath;for(let e of h){j&&await s(j,r),e.fileInputPath&&await s(e.fileInputPath,r);let i=typeof m.timeLimitMs==`number`?m.timeLimitMs/1e3:v,o=x.command(C),c=e.input??``,l;try{p.resolveInput&&(c=await p.resolveInput({testCase:e,cwd:r,env:S})),l=p.runCommand?await p.runCommand({testCase:e,command:o,stdin:c,cwd:r,env:S,timeLimitSeconds:i}):O(o,{stdin:c,cwd:r,env:S,timeLimitSeconds:i})}catch(i){return t({testCaseId:e.id,decisionCode:n.RUNTIME_ERROR,stdin:c,stderr:T(i)}),await a(r,A),{allAccepted:!1}}let u=await d(r,m.requiredOutputFilePaths??[]),f={timeLimitSeconds:i,outputLimitLength:_.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:m.memoryLimitByte,requiredOutputFilePaths:m.requiredOutputFilePaths}},h=k({runResult:l,outputFiles:u,context:f}),g=h;if(h.decisionCode===n.ACCEPTED)try{let t=await p.test?.({testCase:e,runResult:l,outputFiles:u,context:f});t&&(g={decisionCode:t.decisionCode??h.decisionCode,feedbackMarkdown:t.feedbackMarkdown,stderr:t.stderr})}catch(e){g={decisionCode:n.RUNTIME_ERROR,stderr:T(e)}}if(t({testCaseId:e.id,...g,exitStatus:l.status,stdin:l.stdin,stdout:l.stdout.slice(0,_.maxOutputLength)||void 0,stderr:(g.stderr??l.stderr).slice(0,_.maxOutputLength)||void 0,timeSeconds:l.timeSeconds,memoryBytes:l.memoryBytes,outputFiles:u.length>0?u:void 0}),await a(r,A),g.decisionCode!==n.ACCEPTED)return{allAccepted:!1}}return{allAccepted:!0}}function C(e,t){return t.allAccepted===(e.expectedResult===`accepted`)}function w(e,t){let r=_(e[0],e.slice(1),{cwd:t.cwd,encoding:`utf8`,env:t.env},t.limits.buildTimeoutSeconds),i=r.status??void 0;if(r.status!==0)return{testCaseId:t.testCaseId,decisionCode:n.BUILD_ERROR,exitStatus:i,stdout:r.stdout.slice(0,t.limits.maxOutputLength),stderr:r.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:r.timeSeconds,memoryBytes:r.memoryBytes};if(r.timeSeconds>t.limits.buildTimeoutSeconds)return{testCaseId:t.testCaseId,decisionCode:n.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:i,stdout:r.stdout.slice(0,t.limits.maxOutputLength),stderr:r.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:r.timeSeconds,memoryBytes:r.memoryBytes};if(r.stdout.length>t.limits.maxOutputLength||r.stderr.length>t.limits.maxOutputLength)return{testCaseId:t.testCaseId,decisionCode:n.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:i,stdout:r.stdout.slice(0,t.limits.maxOutputLength),stderr:r.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:r.timeSeconds,memoryBytes:r.memoryBytes}}function T(e){return e instanceof Error?e.message:String(e)}function E(e){return{id:e.id,input:e.input,fileInputPath:e.fileInputPath}}async function D(e){let t=await p(y.join(e,`test_cases`)),n=t.map(e=>E(e));return t.shared?.fileInputPath?Object.assign(n,{shared:{fileInputPath:t.shared.fileInputPath}}):n}function O(e,t){let n=_(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:n.status??void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function k(e){if(e.runResult.status!==0)return{decisionCode:n.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:n.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(e.context.problemMarkdownFrontMatter.memoryLimitByte??1/0))return{decisionCode:n.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:n.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};let t=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length??0;return e.outputFiles.length<t?{decisionCode:n.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:n.ACCEPTED}}export{x as commandJudgePreset}; | ||
| //# sourceMappingURL=command.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"command.js","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { 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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"} | ||
| {"version":3,"file":"command.js","names":["readFileTestCases"],"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"],"mappings":"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"} |
@@ -1,2 +0,4 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),n=require("node:child_process"),r=require("node:fs/promises"),t=require("node:os"),i=require("node:path"),s=require("node:timers/promises"),a=require("zod"),o=require("../helpers/cleanWorkingDirectory.cjs"),c=require("../helpers/copyTestCaseFileInput.cjs"),u=require("../helpers/findEntryPointFile.cjs"),d=require("../helpers/findLanguageDefinitionByPath.cjs"),l=require("../helpers/judgeByStaticAnalysis.cjs"),p=require("../helpers/parseArgs.cjs"),f=require("../helpers/printTestCaseResult.cjs"),m=require("../helpers/readOutputFiles.cjs"),h=require("../helpers/readProblemMarkdownFrontMatter.cjs"),g=require("../helpers/readTestCases.cjs"),v=require("../helpers/spawnSyncWithTimeout.cjs"),w=require("../types/decisionCode.cjs"),b=require("../types/language.cjs"),C=["darwin"===t.platform()?"gtime":"/usr/bin/time","--format","%e %M"],y=a.z.object({language:a.z.union([a.z.string(),a.z.array(a.z.string())]).optional()});function k(){return(k=e.asyncToGenerator(e.regenerator().m(function n(r,t){var i,s,a,g,v,b,C,k,R,F,P,_,L,j,q,x,B,N,A,G,W,z,X,Y,H,Q,V,K,J,$,Z,ee,ne,re,te,ie,se,ae,oe,ce,ue,de,le,pe,fe,me,he,ge,ve,we,be,Ce,ye,ke,Ie,Re,Ee,Se,Te,De,Fe,Me,Pe,_e,Le,Oe,je,qe,xe,Be,Ne,Ae;return e.regenerator().w(function(n){for(;;)switch(n.p=n.n){case 0:if((C=p.parseArgs(process.argv)).cwd){n.n=1;break}throw new Error("cwd argument required");case 1:return k=y.parse(C.params),n.n=2,h.readProblemMarkdownFrontMatter(r);case 2:return R=n.v,n.n=3,(null!=(i=t.readTestCases)?i:D)(r);case 3:return F=n.v,P=F.length>0?F:[{id:"default"}],_=null!=(s=null==(a=P[0])?void 0:a.id)?s:"prebuild",n.n=4,l.judgeByStaticAnalysis(C.cwd,R);case 4:if(!(L=n.v)){n.n=5;break}return f.printTestCaseResult(e.objectSpread2({testCaseId:_},L)),n.a(2);case 5:if(null==(g=t.mainFilePath)){n.n=6;break}Fe=g,n.n=8;break;case 6:return n.n=7,u.findEntryPointFile(C.cwd,k.language);case 7:Fe=n.v;case 8:if(j=Fe){n.n=9;break}return f.printTestCaseResult({testCaseId:_,decisionCode:w.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:t.mainFilePath?"required main file not found: ".concat(t.mainFilePath):"main file not found".concat(k.language?": language: ".concat(k.language):"")}),n.a(2);case 9:if(q=d.findLanguageDefinitionByPath(j)){n.n=10;break}return f.printTestCaseResult({testCaseId:_,decisionCode:w.DecisionCode.WRONG_ANSWER,stderr:"unsupported language"}),n.a(2);case 10:return x=e.objectSpread2(e.objectSpread2({},process.env),{},{CI:"",FORCE_COLOR:"0"}),n.n=11,I({cwd:C.cwd,language:k.language,configuredMainFilePath:t.mainFilePath});case 11:if(B=n.v,!q.prebuild){n.n=16;break}return n.p=12,n.n=13,q.prebuild(C.cwd);case 13:return n.n=14,I({cwd:C.cwd,language:null!=(N=k.language)?N:E(j),configuredMainFilePath:t.mainFilePath,allowConfiguredPathFallback:!0});case 14:(A=n.v)&&(B=A),n.n=16;break;case 15:return n.p=15,Me=n.v,f.printTestCaseResult({testCaseId:_,decisionCode:w.DecisionCode.BUILD_ERROR,stderr:U(Me)}),n.a(2);case 16:if(B){n.n=17;break}return f.printTestCaseResult({testCaseId:_,decisionCode:w.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:t.mainFilePath?"required main file not found: ".concat(t.mainFilePath):"main file not found".concat(k.language?": language: ".concat(k.language):"")}),n.a(2);case 17:return n.n=18,null==(b=t.prepare)?void 0:b.call(t,{cwd:C.cwd,env:x,mainFilePath:B,problemMarkdownFrontMatter:R});case 18:if(null==(v=n.v)){n.n=19;break}Pe=v,n.n=20;break;case 19:Pe=S({cwd:C.cwd,env:x,mainFilePath:B,languageDefinition:q});case 20:if(!(G=Pe)){n.n=21;break}return f.printTestCaseResult({testCaseId:_,decisionCode:null!=(W=G.decisionCode)?W:w.DecisionCode.BUILD_ERROR,feedbackMarkdown:G.feedbackMarkdown,stderr:G.stderr,stdout:G.stdout,outputFiles:G.outputFiles}),n.a(2);case 21:return n.n=22,o.snapshotWorkingDirectory(C.cwd);case 22:if(z=n.v,Y=_,n.p=23,!t.runCommand){n.n=24;break}_e=void 0,n.n=26;break;case 24:return n.n=25,O();case 25:_e=n.v;case 26:X=_e,V=null==(Q=F.shared)?void 0:Q.fileInputPath,K=e.createForOfIteratorHelper(P),n.p=27,K.s();case 28:if((J=K.n()).done){n.n=54;break}if(ue=J.value,Y=ue.id,!V){n.n=29;break}return n.n=29,c.copyTestCaseFileInput(V,C.cwd);case 29:if(!ue.fileInputPath){n.n=30;break}return n.n=30,c.copyTestCaseFileInput(ue.fileInputPath,C.cwd);case 30:return de="number"==typeof R.timeLimitMs?R.timeLimitMs/1e3:null!=($=t.runTimeoutSeconds)?$:5,le=X?e.objectSpread2(e.objectSpread2({},x),{},{DISPLAY:X.display}):x,n.n=31,null==(ne=t.resolveInput)?void 0:ne.call(t,{testCase:ue,cwd:C.cwd,env:le});case 31:if(null==(ee=n.v)){n.n=32;break}Le=ee,n.n=33;break;case 32:Le=ue.input;case 33:if(null==(Z=Le)){n.n=34;break}Oe=Z,n.n=35;break;case 34:Oe="";case 35:return H=pe=Oe,n.n=36,null==(te=t.command)?void 0:te.call(t,{testCase:ue,cwd:C.cwd,env:le,mainFilePath:B});case 36:if(null==(re=n.v)){n.n=37;break}je=re,n.n=38;break;case 37:je=q.command(B);case 38:if(fe=je,me=void 0,n.p=39,!t.runCommand){n.n=41;break}return n.n=40,t.runCommand({testCase:ue,command:fe,stdin:pe,cwd:C.cwd,env:le,timeLimitSeconds:de,screenshotWaitSeconds:null!=(he=t.screenshotWaitSeconds)?he:.3,stopDetectionThreshold:null!=(ge=t.stopDetectionThreshold)?ge:5});case 40:qe=n.v,n.n=43;break;case 41:return n.n=42,M({command:fe,stdin:pe,cwd:C.cwd,env:le,timeLimitSeconds:de,screenshotWaitSeconds:null!=(ve=t.screenshotWaitSeconds)?ve:.3,stopDetectionThreshold:null!=(we=t.stopDetectionThreshold)?we:5});case 42:qe=n.v;case 43:me=qe,n.n=46;break;case 44:return n.p=44,xe=n.v,f.printTestCaseResult({testCaseId:ue.id,decisionCode:w.DecisionCode.RUNTIME_ERROR,stdin:pe,stderr:U(xe)}),n.n=45,o.cleanWorkingDirectory(C.cwd,z);case 45:return n.a(2);case 46:return n.n=47,m.readOutputFiles(C.cwd,null!=(ie=R.requiredOutputFilePaths)?ie:[]);case 47:if(be=n.v,Ce={timeLimitSeconds:de,problemMarkdownFrontMatter:{memoryLimitByte:R.memoryLimitByte,requiredOutputFilePaths:R.requiredOutputFilePaths}},ye=T({runResult:me,outputFiles:be,context:Ce}),ke=ye,ye.decisionCode!==w.DecisionCode.ACCEPTED){n.n=51;break}return n.p=48,n.n=49,t.test({testCase:ue,runResult:me,outputFiles:be,context:Ce});case 49:Re=n.v,ke={decisionCode:null!=(Ie=Re.decisionCode)?Ie:ye.decisionCode,feedbackMarkdown:Re.feedbackMarkdown,stderr:Re.stderr,stdout:Re.stdout,outputFiles:Re.outputFiles},n.n=51;break;case 50:n.p=50,Be=n.v,ke={decisionCode:w.DecisionCode.RUNTIME_ERROR,stderr:U(Be)};case 51:return Ee=null!=(se=ke.decisionCode)?se:w.DecisionCode.ACCEPTED,Se=null!=(ae=ke.stdout)?ae:me.stdout,Te=null!=(oe=ke.stderr)?oe:me.stderr,f.printTestCaseResult({testCaseId:ue.id,decisionCode:Ee,exitStatus:me.status,stdin:me.stdin||void 0,stdout:Se||void 0,stderr:Te||void 0,timeSeconds:me.timeSeconds,memoryBytes:me.memoryBytes,feedbackMarkdown:ke.feedbackMarkdown,outputFiles:null!=(ce=ke.outputFiles)?ce:be.length>0?be:void 0}),n.n=52,o.cleanWorkingDirectory(C.cwd,z);case 52:if(Ee===w.DecisionCode.ACCEPTED){n.n=53;break}return n.a(3,54);case 53:n.n=28;break;case 54:n.n=56;break;case 55:n.p=55,Ne=n.v,K.e(Ne);case 56:return n.p=56,K.f(),n.f(56);case 57:n.n=59;break;case 58:return n.p=58,Ae=n.v,f.printTestCaseResult({testCaseId:Y,decisionCode:w.DecisionCode.RUNTIME_ERROR,stdin:H,stderr:U(Ae)}),n.n=59,o.cleanWorkingDirectory(C.cwd,z);case 59:return n.p=59,n.n=60,null==(De=X)?void 0:De.dispose();case 60:return n.f(59);case 61:return n.a(2)}},n,null,[[48,50],[39,44],[27,55,56,57],[23,58,59,61],[12,15]])}))).apply(this,arguments)}function I(e){return R.apply(this,arguments)}function R(){return(R=e.asyncToGenerator(e.regenerator().m(function n(r){var t;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:if(!r.configuredMainFilePath){e.n=3;break}return t=i.join(r.cwd,r.configuredMainFilePath),e.n=1,A(t);case 1:if(!e.v){e.n=2;break}return e.a(2,r.configuredMainFilePath);case 2:if(r.allowConfiguredPathFallback){e.n=3;break}return e.a(2,void 0);case 3:return e.n=4,u.findEntryPointFile(r.cwd,r.language);case 4:return e.a(2,e.v)}},n)}))).apply(this,arguments)}function E(n){var r=Object.entries(b.languageIdToDefinition).filter(function(r){return e.slicedToArray(r,2)[1].fileExtensions.some(function(e){return n.endsWith(e)})}).map(function(n){return e.slicedToArray(n,1)[0]});return r.length>0?r:void 0}function S(e){var n,r,t=null==(n=(r=e.languageDefinition).buildCommand)?void 0:n.call(r,e.mainFilePath);if(t){var i=v.spawnSyncWithTimeout(t[0],t.slice(1),{cwd:e.cwd,encoding:"utf8",env:e.env},10);return i.timeSeconds>10?{decisionCode:w.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,stderr:i.stderr||void 0}:0!==i.status?{decisionCode:w.DecisionCode.BUILD_ERROR,stderr:i.stderr||i.stdout||void 0}:void 0}}function T(e){var n,r,t;if("timeout"===e.runResult.stopReason)return{decisionCode:w.DecisionCode.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(0!==e.runResult.status)return{decisionCode:w.DecisionCode.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(n=e.context.problemMarkdownFrontMatter.memoryLimitByte)?n:Number.POSITIVE_INFINITY))return{decisionCode:w.DecisionCode.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var i=null!=(r=null==(t=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:t.length)?r:0;return e.outputFiles.length<i?{decisionCode:w.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:w.DecisionCode.ACCEPTED}}function D(e){return F.apply(this,arguments)}function F(){return(F=e.asyncToGenerator(e.regenerator().m(function n(r){return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,g.readTestCases(i.join(r,"test_cases"));case 1:return e.a(2,e.v)}},n)}))).apply(this,arguments)}function M(e){return P.apply(this,arguments)}function P(){return(P=e.asyncToGenerator(e.regenerator().m(function r(t){var i,a,o,c,u,d,l,p,f,m,h,g,v,w,b,y;return e.regenerator().w(function(r){for(;;)switch(r.n){case 0:i=["timeout",t.timeLimitSeconds.toFixed(3)].concat(C,e.toConsumableArray(t.command)),(a=n.spawn(i[0],i.slice(1),{cwd:t.cwd,env:t.env,detached:"win32"!==process.platform,stdio:["pipe","pipe","pipe"]})).stdout.setEncoding("utf8"),a.stderr.setEncoding("utf8"),o="",c="",l="process_exit",p=[],f=[],m=Date.now()/1e3,h=0,a.stdout.on("data",function(e){o+=e}),a.stderr.on("data",function(e){c+=e}),a.on("error",function(e){d=e,u=1}),a.on("close",function(e,n){return 124===e?(l="timeout",void(u=0)):n?(u=1,void(c=c?"".concat(c,"\nprocess terminated by signal: ").concat(n):"process terminated by signal: ".concat(n))):void(u=null!=e?e:1)}),t.stdin&&a.stdin.write(t.stdin),a.stdin.end(),g=e.regenerator().m(function n(){var r,i;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,s.setTimeout(1e3*t.screenshotWaitSeconds);case 1:if(h=Math.max(h,B(a.pid)),r=_(t.env.DISPLAY),!((f=r.toSorted(function(e,n){return e.data.length-n.data.length})).length>0)){e.n=2;break}if(i=f.map(function(e){return e.data}).toSorted(),p.unshift(i),p.length=Math.min(p.length,t.stopDetectionThreshold),p.length!==t.stopDetectionThreshold||!p.every(function(e){return e.length===i.length&&e.every(function(e,n){return e===i[n]})})){e.n=2;break}return l="stable_screenshot",u=0,e.a(2,0);case 2:if(!(Date.now()/1e3-m>t.timeLimitSeconds)){e.n=3;break}return l="timeout",u=0,e.a(2,0);case 3:return e.a(2)}},n)});case 1:if(void 0!==u){r.n=4;break}return r.d(e.regeneratorValues(g()),2);case 2:if(0!==r.v){r.n=3;break}return r.a(3,4);case 3:r.n=1;break;case 4:return"process_exit"!==l&&null===a.exitCode&&(a.removeAllListeners("close"),a.removeAllListeners("error")),r.n=5,q(a);case 5:if(!d){r.n=6;break}throw d;case 6:return v=L(c,m,h),w=v.memoryBytes,b=v.stderr,y=v.timeSeconds,r.a(2,{stdin:t.stdin,stdout:o.trimEnd(),stderr:b,status:u,timeSeconds:y,memoryBytes:w,screenshots:f,stopReason:l})}},r)}))).apply(this,arguments)}function _(r){var t=r?e.objectSpread2(e.objectSpread2({},process.env),{},{DISPLAY:r}):process.env,i=n.spawnSync("xwininfo",["-root","-tree"],{encoding:"utf8",env:t});if(i.error)throw i.error;if(0!==i.status||!i.stdout)return[];for(var s=[],a=0,o=function(n){var r,t=[],i=n.split("\n"),s=e.createForOfIteratorHelper(i);try{for(s.s();!(r=s.n()).done;){var a=r.value;if(!(a.includes("Root window id:")||a.includes("Parent window id:")||a.includes("()"))){var o=/^\s{5}(0x[\da-f]+) /.exec(a);null!=o&&o[1]&&t.push(Number.parseInt(o[1],16).toString())}}}catch(e){s.e(e)}finally{s.f()}return t}(i.stdout);a<o.length;a++){var c=o[a],u=n.spawnSync("maim",["-i",c],{env:t});if(u.error)throw u.error;if(0===u.status&&0!==u.stdout.length){var d=n.spawnSync("xdotool",["getwindowname",c],{encoding:"utf8",env:t});if(d.error)throw d.error;var l=d.stdout.trim().replaceAll(/[\s/]/g,"_");s.push({path:"".concat(l||"window","_").concat(c,".png"),data:u.stdout.toString("base64"),encoding:"base64"})}}return s}function L(e,n,r){var t=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(e),i=t?e.slice(0,t.index).trimEnd():e.trimEnd(),s=1024*Number(null==t?void 0:t[2])||0;return{stderr:i,timeSeconds:Number(null==t?void 0:t[1])||Date.now()/1e3-n,memoryBytes:Math.max(s,r)}}function O(){return j.apply(this,arguments)}function j(){return j=e.asyncToGenerator(e.regenerator().m(function r(){var t,i,a;return e.regenerator().w(function(r){for(;;)switch(r.n){case 0:if("linux"===process.platform){r.n=1;break}throw new Error("GUI screenshot capture is supported only on Linux.");case 1:t=e.regenerator().m(function r(){var t,i,o;return e.regenerator().w(function(r){for(;;)switch(r.n){case 0:return t=":".concat(a),(o=n.spawn("Xvfb",[t,"-screen","0","1280x1024x24","-ac"],{stdio:"ignore"})).on("error",function(e){i=e}),r.n=1,s.setTimeout(300);case 1:if(!i){r.n=2;break}throw i;case 2:if(null===o.exitCode){r.n=3;break}return r.a(2,0);case 3:return r.a(2,{v:{display:t,dispose:function(){var n=e.asyncToGenerator(e.regenerator().m(function n(){return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:if(o.killed){e.n=2;break}return o.kill("SIGTERM"),e.n=1,s.setTimeout(100);case 1:null===o.exitCode&&o.kill("SIGKILL");case 2:return e.a(2)}},n)}));return function(){return n.apply(this,arguments)}}()}})}},r)}),a=90;case 2:if(!(a<100)){r.n=6;break}return r.d(e.regeneratorValues(t()),3);case 3:if(0!==(i=r.v)){r.n=4;break}return r.a(3,5);case 4:if(!i){r.n=5;break}return r.a(2,i.v);case 5:a++,r.n=2;break;case 6:throw new Error("Xvfb could not be started.");case 7:return r.a(2)}},r)})),j.apply(this,arguments)}function q(e){return x.apply(this,arguments)}function x(){return(x=e.asyncToGenerator(e.regenerator().m(function n(r){return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:if(r.pid){e.n=1;break}return e.a(2);case 1:return N(r.pid,"SIGTERM"),e.n=2,s.setTimeout(200);case 2:null===r.exitCode&&N(r.pid,"SIGKILL");case 3:return e.a(2)}},n)}))).apply(this,arguments)}function B(e){if(!e||"linux"!==process.platform)return 0;var r=n.spawnSync("ps",["-o","rss=","--no-headers","--pgroup",String(e)],{encoding:"utf8"});return r.error||0!==r.status||!r.stdout?0:r.stdout.split("\n").map(function(e){return Number(e.trim())}).filter(function(e){return Number.isFinite(e)&&e>0}).reduce(function(e,n){return e+1024*n},0)}function N(e,n){try{if("win32"!==process.platform)return void process.kill(-e,n)}catch(e){}try{process.kill(e,n)}catch(e){}}function A(e){return G.apply(this,arguments)}function G(){return(G=e.asyncToGenerator(e.regenerator().m(function n(t){return e.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,r.access(t);case 1:return e.a(2,!0);case 2:return e.p=2,e.v,e.a(2,!1)}},n,null,[[0,2]])}))).apply(this,arguments)}function U(e){return e instanceof Error?e.message:String(e)}exports.guiCommandJudgePreset=function(e,n){return k.apply(this,arguments)}; | ||
| //# sourceMappingURL=guiCommand.cjs.map | ||
| "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/parseArgs.cjs"),n=require("../helpers/printTestCaseResult.cjs"),r=require("../types/language.cjs"),i=require("../types/decisionCode.cjs"),a=require("../helpers/cleanWorkingDirectory.cjs"),o=require("../helpers/copyTestCaseFileInput.cjs"),s=require("../helpers/findEntryPointFile.cjs"),c=require("../helpers/findLanguageDefinitionByPath.cjs"),l=require("../helpers/judgeByStaticAnalysis.cjs"),u=require("../helpers/readOutputFiles.cjs"),d=require("../helpers/readProblemMarkdownFrontMatter.cjs"),f=require("../helpers/readTestCases.cjs"),p=require("../helpers/spawnSyncWithTimeout.cjs");let m=require("zod"),h=require("node:child_process");h=e.__toESM(h,1);let g=require("node:fs/promises");g=e.__toESM(g,1);let _=require("node:os");_=e.__toESM(_,1);let v=require("node:path");v=e.__toESM(v,1);let y=require("node:timers/promises");const b=.3,x=[_.default.platform()===`darwin`?`gtime`:`/usr/bin/time`,`--format`,`%e %M`],S=m.z.object({language:m.z.union([m.z.string(),m.z.array(m.z.string())]).optional()});async function C(e,r){let f=t.parseArgs(process.argv);if(!f.cwd)throw Error(`cwd argument required`);let p=S.parse(f.params),m=await d.readProblemMarkdownFrontMatter(e),h=await(r.readTestCases??O)(e),g=h.length>0?h:[{id:`default`}],_=g[0]?.id??`prebuild`,v=await l.judgeByStaticAnalysis(f.cwd,m);if(v){n.printTestCaseResult({testCaseId:_,...v});return}let y=r.mainFilePath??await s.findEntryPointFile(f.cwd,p.language);if(!y){n.printTestCaseResult({testCaseId:_,decisionCode:i.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:r.mainFilePath?`required main file not found: ${r.mainFilePath}`:`main file not found${p.language?`: language: ${p.language}`:``}`});return}let x=c.findLanguageDefinitionByPath(y);if(!x){n.printTestCaseResult({testCaseId:_,decisionCode:i.DecisionCode.WRONG_ANSWER,stderr:`unsupported language`});return}let C={...process.env,CI:``,FORCE_COLOR:`0`},A=await w({cwd:f.cwd,language:p.language,configuredMainFilePath:r.mainFilePath});if(x.prebuild)try{await x.prebuild(f.cwd);let e=await w({cwd:f.cwd,language:p.language??T(y),configuredMainFilePath:r.mainFilePath,allowConfiguredPathFallback:!0});e&&(A=e)}catch(e){n.printTestCaseResult({testCaseId:_,decisionCode:i.DecisionCode.BUILD_ERROR,stderr:R(e)});return}if(!A){n.printTestCaseResult({testCaseId:_,decisionCode:i.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:r.mainFilePath?`required main file not found: ${r.mainFilePath}`:`main file not found${p.language?`: language: ${p.language}`:``}`});return}let j=await r.prepare?.({cwd:f.cwd,env:C,mainFilePath:A,problemMarkdownFrontMatter:m})??E({cwd:f.cwd,env:C,mainFilePath:A,languageDefinition:x});if(j){n.printTestCaseResult({testCaseId:_,decisionCode:j.decisionCode??i.DecisionCode.BUILD_ERROR,feedbackMarkdown:j.feedbackMarkdown,stderr:j.stderr,stdout:j.stdout,outputFiles:j.outputFiles});return}let M=await a.snapshotWorkingDirectory(f.cwd),P,F=_,I;try{P=r.runCommand?void 0:await N();let e=h.shared?.fileInputPath;for(let t of g){F=t.id,e&&await o.copyTestCaseFileInput(e,f.cwd),t.fileInputPath&&await o.copyTestCaseFileInput(t.fileInputPath,f.cwd);let s=typeof m.timeLimitMs==`number`?m.timeLimitMs/1e3:r.runTimeoutSeconds??5,c=P?{...C,DISPLAY:P.display}:C,l=await r.resolveInput?.({testCase:t,cwd:f.cwd,env:c})??t.input??``;I=l;let d=await r.command?.({testCase:t,cwd:f.cwd,env:c,mainFilePath:A})??x.command(A),p;try{p=r.runCommand?await r.runCommand({testCase:t,command:d,stdin:l,cwd:f.cwd,env:c,timeLimitSeconds:s,screenshotWaitSeconds:r.screenshotWaitSeconds??b,stopDetectionThreshold:r.stopDetectionThreshold??5}):await k({command:d,stdin:l,cwd:f.cwd,env:c,timeLimitSeconds:s,screenshotWaitSeconds:r.screenshotWaitSeconds??b,stopDetectionThreshold:r.stopDetectionThreshold??5})}catch(e){n.printTestCaseResult({testCaseId:t.id,decisionCode:i.DecisionCode.RUNTIME_ERROR,stdin:l,stderr:R(e)}),await a.cleanWorkingDirectory(f.cwd,M);return}let h=await u.readOutputFiles(f.cwd,m.requiredOutputFilePaths??[]),g={timeLimitSeconds:s,problemMarkdownFrontMatter:{memoryLimitByte:m.memoryLimitByte,requiredOutputFilePaths:m.requiredOutputFilePaths}},_=D({runResult:p,outputFiles:h,context:g}),v=_;if(_.decisionCode===i.DecisionCode.ACCEPTED)try{let e=await r.test({testCase:t,runResult:p,outputFiles:h,context:g});v={decisionCode:e.decisionCode??_.decisionCode,feedbackMarkdown:e.feedbackMarkdown,stderr:e.stderr,stdout:e.stdout,outputFiles:e.outputFiles}}catch(e){v={decisionCode:i.DecisionCode.RUNTIME_ERROR,stderr:R(e)}}let y=v.decisionCode??i.DecisionCode.ACCEPTED,S=v.stdout??p.stdout,w=v.stderr??p.stderr;if(n.printTestCaseResult({testCaseId:t.id,decisionCode:y,exitStatus:p.status,stdin:p.stdin||void 0,stdout:S||void 0,stderr:w||void 0,timeSeconds:p.timeSeconds,memoryBytes:p.memoryBytes,feedbackMarkdown:v.feedbackMarkdown,outputFiles:v.outputFiles??(h.length>0?h:void 0)}),await a.cleanWorkingDirectory(f.cwd,M),y!==i.DecisionCode.ACCEPTED)break}}catch(e){n.printTestCaseResult({testCaseId:F,decisionCode:i.DecisionCode.RUNTIME_ERROR,stdin:I,stderr:R(e)}),await a.cleanWorkingDirectory(f.cwd,M)}finally{await P?.dispose()}}async function w(e){if(e.configuredMainFilePath){if(await L(v.default.join(e.cwd,e.configuredMainFilePath)))return e.configuredMainFilePath;if(!e.allowConfiguredPathFallback)return}return await s.findEntryPointFile(e.cwd,e.language)}function T(e){let t=Object.entries(r.languageIdToDefinition).filter(([,t])=>t.fileExtensions.some(t=>e.endsWith(t))).map(([e])=>e);return t.length>0?t:void 0}function E(e){let t=e.languageDefinition.buildCommand?.(e.mainFilePath);if(!t)return;let n=p.spawnSyncWithTimeout(t[0],t.slice(1),{cwd:e.cwd,encoding:`utf8`,env:e.env},10);if(n.timeSeconds>10)return{decisionCode:i.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,stderr:n.stderr||void 0};if(n.status!==0)return{decisionCode:i.DecisionCode.BUILD_ERROR,stderr:n.stderr||n.stdout||void 0}}function D(e){if(e.runResult.stopReason===`timeout`)return{decisionCode:i.DecisionCode.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.status!==0)return{decisionCode:i.DecisionCode.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(e.context.problemMarkdownFrontMatter.memoryLimitByte??1/0))return{decisionCode:i.DecisionCode.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};let t=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length??0;return e.outputFiles.length<t?{decisionCode:i.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:i.DecisionCode.ACCEPTED}}async function O(e){return await f.readTestCases(v.default.join(e,`test_cases`))}async function k(e){let t=[`timeout`,e.timeLimitSeconds.toFixed(3),...x,...e.command],n=h.default.spawn(t[0],t.slice(1),{cwd:e.cwd,env:e.env,detached:process.platform!==`win32`,stdio:[`pipe`,`pipe`,`pipe`]});n.stdout.setEncoding(`utf8`),n.stderr.setEncoding(`utf8`);let r=``,i=``,a,o,s=`process_exit`,c=[],l=[],u=Date.now()/1e3,d=0;for(n.stdout.on(`data`,e=>{r+=e}),n.stderr.on(`data`,e=>{i+=e}),n.on(`error`,e=>{o=e,a=1}),n.on(`close`,(e,t)=>{if(e===124){s=`timeout`,a=0;return}if(t){a=1,i=i?`${i}\nprocess terminated by signal: ${t}`:`process terminated by signal: ${t}`;return}a=e??1}),e.stdin&&n.stdin.write(e.stdin),n.stdin.end();a===void 0;){if(await(0,y.setTimeout)(e.screenshotWaitSeconds*1e3),d=Math.max(d,F(n.pid)),l=A(e.env.DISPLAY).toSorted((e,t)=>e.data.length-t.data.length),l.length>0){let t=l.map(e=>e.data).toSorted();if(c.unshift(t),c.length=Math.min(c.length,e.stopDetectionThreshold),c.length===e.stopDetectionThreshold&&c.every(e=>e.length===t.length&&e.every((e,n)=>e===t[n]))){s=`stable_screenshot`,a=0;break}}if(Date.now()/1e3-u>e.timeLimitSeconds){s=`timeout`,a=0;break}}if(s!==`process_exit`&&n.exitCode===null&&(n.removeAllListeners(`close`),n.removeAllListeners(`error`)),await P(n),o)throw o;let{memoryBytes:f,stderr:p,timeSeconds:m}=M(i,u,d);return{stdin:e.stdin,stdout:r.trimEnd(),stderr:p,status:a,timeSeconds:m,memoryBytes:f,screenshots:l,stopReason:s}}function A(e){let t=e?{...process.env,DISPLAY:e}:process.env,n=h.default.spawnSync(`xwininfo`,[`-root`,`-tree`],{encoding:`utf8`,env:t});if(n.error)throw n.error;if(n.status!==0||!n.stdout)return[];let r=[];for(let e of j(n.stdout)){let n=h.default.spawnSync(`maim`,[`-i`,e],{env:t});if(n.error)throw n.error;if(n.status!==0||n.stdout.length===0)continue;let i=h.default.spawnSync(`xdotool`,[`getwindowname`,e],{encoding:`utf8`,env:t});if(i.error)throw i.error;let a=i.stdout.trim().replaceAll(/[\s/]/g,`_`);r.push({path:`${a||`window`}_${e}.png`,data:n.stdout.toString(`base64`),encoding:`base64`})}return r}function j(e){let t=[],n=e.split(` | ||
| `);for(let e of n){if(e.includes(`Root window id:`)||e.includes(`Parent window id:`)||e.includes(`()`))continue;let n=/^\s{5}(0x[\da-f]+) /.exec(e);n?.[1]&&t.push(Number.parseInt(n[1],16).toString())}return t}function M(e,t,n){let r=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(e),i=r?e.slice(0,r.index).trimEnd():e.trimEnd(),a=Number(r?.[2])*1024||0;return{stderr:i,timeSeconds:Number(r?.[1])||Date.now()/1e3-t,memoryBytes:Math.max(a,n)}}async function N(){if(process.platform!==`linux`)throw Error(`GUI screenshot capture is supported only on Linux.`);for(let e=90;e<100;e++){let t=`:${e}`,n,r=h.default.spawn(`Xvfb`,[t,`-screen`,`0`,`1280x1024x24`,`-ac`],{stdio:`ignore`});if(r.on(`error`,e=>{n=e}),await(0,y.setTimeout)(.3*1e3),n)throw n;if(r.exitCode===null)return{display:t,dispose:async()=>{r.killed||(r.kill(`SIGTERM`),await(0,y.setTimeout)(.1*1e3),r.exitCode===null&&r.kill(`SIGKILL`))}}}throw Error(`Xvfb could not be started.`)}async function P(e){e.pid&&(I(e.pid,`SIGTERM`),await(0,y.setTimeout)(.2*1e3),e.exitCode===null&&I(e.pid,`SIGKILL`))}function F(e){if(!e||process.platform!==`linux`)return 0;let t=h.default.spawnSync(`ps`,[`-o`,`rss=`,`--no-headers`,`--pgroup`,String(e)],{encoding:`utf8`});return t.error||t.status!==0||!t.stdout?0:t.stdout.split(` | ||
| `).map(e=>Number(e.trim())).filter(e=>Number.isFinite(e)&&e>0).reduce((e,t)=>e+t*1024,0)}function I(e,t){try{if(process.platform!==`win32`){process.kill(-e,t);return}}catch{}try{process.kill(e,t)}catch{}}async function L(e){try{return await g.default.access(e),!0}catch{return!1}}function R(e){return e instanceof Error?e.message:String(e)}exports.guiCommandJudgePreset=C; | ||
| //# sourceMappingURL=guiCommand.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"guiCommand.cjs","sources":["../../src/presets/guiCommand.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { setTimeout as wait } from 'node:timers/promises';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport { languageIdToDefinition } from '../types/language.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 = 5;\nconst SCREENSHOT_WAIT_SECONDS = 0.3;\nconst XVFB_STARTUP_WAIT_SECONDS = 0.3;\nconst XVFB_SHUTDOWN_WAIT_SECONDS = 0.1;\nconst PROCESS_SHUTDOWN_WAIT_SECONDS = 0.2;\nconst STOP_DETECTION_THRESHOLD = 5;\nconst TIME_COMMAND = [os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time', '--format', '%e %M'] as const;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ninterface BaseGuiTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\nexport interface GuiScreenshotFile {\n path: string;\n data: string;\n encoding: 'base64';\n}\n\nexport interface GuiCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n screenshots: GuiScreenshotFile[];\n stopReason: 'process_exit' | 'stable_screenshot' | 'timeout';\n}\n\ninterface GuiJudgeContext {\n timeLimitSeconds: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\ntype GuiJudgeCaseResult = Pick<\n TestCaseResult,\n 'decisionCode' | 'feedbackMarkdown' | 'stderr' | 'stdout' | 'outputFiles'\n>;\n\nexport interface GuiCommandJudgePresetOptions<TTestCase extends BaseGuiTestCase = BaseGuiTestCase> {\n mainFilePath?: string;\n runTimeoutSeconds?: number;\n screenshotWaitSeconds?: number;\n stopDetectionThreshold?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n prepare?: (context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n problemMarkdownFrontMatter: ProblemMarkdownFrontMatter;\n }) => Promise<Partial<GuiJudgeCaseResult> | undefined> | Partial<GuiJudgeCaseResult> | undefined;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n command?: (context: {\n testCase: TTestCase;\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n }) => Promise<readonly [string, ...string[]]> | readonly [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 screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n }) => Promise<GuiCommandRunResult> | GuiCommandRunResult;\n test: (context: {\n testCase: TTestCase;\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n }) => Promise<Partial<GuiJudgeCaseResult>> | Partial<GuiJudgeCaseResult>;\n}\n\n/**\n * A preset function for judging GUI programs by collecting screenshots while the program runs.\n *\n * Keep problem-specific logic in `prepare`, `command`, and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { DecisionCode } from '@exercode/problem-utils';\n * import { guiCommandJudgePreset } from '@exercode/problem-utils/presets/guiCommand';\n *\n * await guiCommandJudgePreset(import.meta.dirname, {\n * mainFilePath: 'Main.java',\n * readTestCases: async () => [{ id: 'default' }],\n * test: ({ runResult }) => {\n * return runResult.screenshots.length > 0\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n */\nexport async function guiCommandJudgePreset<TTestCase extends BaseGuiTestCase = BaseGuiTestCase>(\n problemDir: string,\n options: GuiCommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const configuredTestCases = await (options.readTestCases ?? readGuiTestCases<TTestCase>)(problemDir);\n const testCases =\n configuredTestCases.length > 0 ? configuredTestCases : ([{ id: 'default' }] as unknown as readonly TTestCase[]);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n\n const staticAnalysisResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return;\n }\n\n const initialMainFilePath = options.mainFilePath ?? (await findEntryPointFile(args.cwd, params.language));\n if (!initialMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(initialMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let resolvedMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language,\n configuredMainFilePath: options.mainFilePath,\n });\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n const prebuiltMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language ?? inferLanguageIdsByPath(initialMainFilePath),\n configuredMainFilePath: options.mainFilePath,\n allowConfiguredPathFallback: true,\n });\n if (prebuiltMainFilePath) resolvedMainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: errorToMessage(error),\n });\n return;\n }\n }\n if (!resolvedMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const prepareResult =\n (await options.prepare?.({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n problemMarkdownFrontMatter,\n })) ??\n runDefaultPrepare({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n languageDefinition,\n });\n if (prepareResult) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: prepareResult.decisionCode ?? DecisionCode.BUILD_ERROR,\n feedbackMarkdown: prepareResult.feedbackMarkdown,\n stderr: prepareResult.stderr,\n stdout: prepareResult.stdout,\n outputFiles: prepareResult.outputFiles,\n });\n return;\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n let displayServer: Awaited<ReturnType<typeof ensureDisplayServer>> | undefined;\n let currentTestCaseId = prebuildTestCaseId;\n let currentStdin: string | undefined;\n try {\n displayServer = options.runCommand ? undefined : await ensureDisplayServer();\n const sharedFileInputPath = (configuredTestCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n for (const testCase of testCases) {\n currentTestCaseId = testCase.id;\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : (options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS);\n\n const runEnv = displayServer ? { ...env, DISPLAY: displayServer.display } : env;\n const stdin = (await options.resolveInput?.({ testCase, cwd: args.cwd, env: runEnv })) ?? testCase.input ?? '';\n currentStdin = stdin;\n const command =\n (await options.command?.({ testCase, cwd: args.cwd, env: runEnv, mainFilePath: resolvedMainFilePath })) ??\n languageDefinition.command(resolvedMainFilePath);\n\n let runResult: GuiCommandRunResult;\n try {\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n })\n : await spawnGuiProgram({\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n return;\n }\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: GuiJudgeContext = {\n timeLimitSeconds,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateGuiRunResult({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test({\n testCase,\n runResult,\n outputFiles,\n context: judgeContext,\n });\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n stdout: extendedJudgeResult.stdout,\n outputFiles: extendedJudgeResult.outputFiles,\n };\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n const decisionCode = judgeResult.decisionCode ?? DecisionCode.ACCEPTED;\n const stdout = judgeResult.stdout ?? runResult.stdout;\n const stderr = judgeResult.stderr ?? runResult.stderr;\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: runResult.status,\n stdin: runResult.stdin || undefined,\n stdout: stdout || undefined,\n stderr: stderr || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n feedbackMarkdown: judgeResult.feedbackMarkdown,\n outputFiles: judgeResult.outputFiles ?? (outputFiles.length > 0 ? outputFiles : undefined),\n });\n\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n } catch (error) {\n printTestCaseResult({\n testCaseId: currentTestCaseId,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: currentStdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n } finally {\n await displayServer?.dispose();\n }\n}\n\nasync function resolveMainFilePath(context: {\n cwd: string;\n language?: string | string[];\n configuredMainFilePath?: string;\n allowConfiguredPathFallback?: boolean;\n}): Promise<string | undefined> {\n if (context.configuredMainFilePath) {\n const resolvedPath = path.join(context.cwd, context.configuredMainFilePath);\n if (await pathExists(resolvedPath)) return context.configuredMainFilePath;\n if (!context.allowConfiguredPathFallback) return undefined;\n }\n\n return await findEntryPointFile(context.cwd, context.language);\n}\n\nfunction inferLanguageIdsByPath(filePath: string): string[] | undefined {\n const languageIds = Object.entries(languageIdToDefinition)\n .filter(([, definition]) => definition.fileExtensions.some((ext) => filePath.endsWith(ext)))\n .map(([languageId]) => languageId);\n return languageIds.length > 0 ? languageIds : undefined;\n}\n\nfunction runDefaultPrepare(context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n languageDefinition: NonNullable<ReturnType<typeof findLanguageDefinitionByPath>>;\n}): Partial<GuiJudgeCaseResult> | undefined {\n const buildCommand = context.languageDefinition.buildCommand?.(context.mainFilePath);\n if (!buildCommand) return undefined;\n\n const buildResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n BUILD_TIMEOUT_SECONDS\n );\n\n if (buildResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n return {\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n stderr: buildResult.stderr || undefined,\n };\n }\n\n if (buildResult.status !== 0) {\n return {\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: buildResult.stderr || buildResult.stdout || undefined,\n };\n }\n\n return undefined;\n}\n\nfunction evaluateGuiRunResult(context: {\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n}): Partial<GuiJudgeCaseResult> {\n if (context.runResult.stopReason === 'timeout') {\n return {\n decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n if (context.runResult.status !== 0) {\n return {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: context.runResult.stderr,\n };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return {\n decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n const requiredOutputFilesCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFilesCount) {\n return {\n decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR,\n };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n\nasync function readGuiTestCases<TTestCase extends BaseGuiTestCase>(problemDir: string): Promise<readonly TTestCase[]> {\n return (await readFileTestCases(path.join(problemDir, 'test_cases'))) as unknown as readonly TTestCase[];\n}\n\nasync function spawnGuiProgram(context: {\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n}): Promise<GuiCommandRunResult> {\n const wrappedCommand = ['timeout', context.timeLimitSeconds.toFixed(3), ...TIME_COMMAND, ...context.command] as const;\n const child = childProcess.spawn(wrappedCommand[0], wrappedCommand.slice(1), {\n cwd: context.cwd,\n env: context.env,\n detached: process.platform !== 'win32',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n let spawnError: Error | undefined;\n let stopReason: GuiCommandRunResult['stopReason'] = 'process_exit';\n const screenshotSignaturesHistory: string[][] = [];\n let screenshots: GuiScreenshotFile[] = [];\n const startTimeSeconds = Date.now() / 1000;\n let sampledMemoryBytes = 0;\n\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on('data', (chunk: string) => {\n stderr += chunk;\n });\n child.on('error', (error) => {\n spawnError = error;\n exitCode = 1;\n });\n child.on('close', (code, signal) => {\n if (code === 124) {\n stopReason = 'timeout';\n exitCode = 0;\n return;\n }\n if (signal) {\n exitCode = 1;\n stderr = stderr\n ? `${stderr}\\nprocess terminated by signal: ${signal}`\n : `process terminated by signal: ${signal}`;\n return;\n }\n exitCode = code ?? 1;\n });\n\n if (context.stdin) child.stdin.write(context.stdin);\n child.stdin.end();\n\n while (exitCode === undefined) {\n await wait(context.screenshotWaitSeconds * 1000);\n sampledMemoryBytes = Math.max(sampledMemoryBytes, readProcessGroupMemoryBytes(child.pid));\n const currentScreenshots = takeScreenshots(context.env.DISPLAY);\n screenshots = currentScreenshots.toSorted((a, b) => a.data.length - b.data.length);\n\n if (screenshots.length > 0) {\n const screenshotSignatures = screenshots.map((file) => file.data).toSorted();\n screenshotSignaturesHistory.unshift(screenshotSignatures);\n screenshotSignaturesHistory.length = Math.min(screenshotSignaturesHistory.length, context.stopDetectionThreshold);\n if (\n screenshotSignaturesHistory.length === context.stopDetectionThreshold &&\n screenshotSignaturesHistory.every(\n (files) =>\n files.length === screenshotSignatures.length &&\n files.every((file, index) => file === screenshotSignatures[index])\n )\n ) {\n stopReason = 'stable_screenshot';\n exitCode = 0;\n break;\n }\n }\n\n if (Date.now() / 1000 - startTimeSeconds > context.timeLimitSeconds) {\n stopReason = 'timeout';\n exitCode = 0;\n break;\n }\n }\n\n if (stopReason !== 'process_exit' && child.exitCode === null) {\n child.removeAllListeners('close');\n child.removeAllListeners('error');\n }\n await stopProcess(child);\n if (spawnError) throw spawnError;\n const {\n memoryBytes,\n stderr: normalizedStderr,\n timeSeconds,\n } = parseTimedStderr(stderr, startTimeSeconds, sampledMemoryBytes);\n\n return {\n stdin: context.stdin,\n stdout: stdout.trimEnd(),\n stderr: normalizedStderr,\n status: exitCode,\n timeSeconds,\n memoryBytes,\n screenshots,\n stopReason,\n };\n}\n\nfunction takeScreenshots(display: string | undefined): GuiScreenshotFile[] {\n const env = display ? { ...process.env, DISPLAY: display } : process.env;\n const xwininfo = childProcess.spawnSync('xwininfo', ['-root', '-tree'], { encoding: 'utf8', env });\n if (xwininfo.error) throw xwininfo.error;\n if (xwininfo.status !== 0 || !xwininfo.stdout) return [];\n\n const screenshots: GuiScreenshotFile[] = [];\n for (const windowId of extractTopLevelWindowIds(xwininfo.stdout)) {\n const screenshot = childProcess.spawnSync('maim', ['-i', windowId], { env });\n if (screenshot.error) throw screenshot.error;\n if (screenshot.status !== 0 || screenshot.stdout.length === 0) continue;\n\n const windowNameResult = childProcess.spawnSync('xdotool', ['getwindowname', windowId], { encoding: 'utf8', env });\n if (windowNameResult.error) throw windowNameResult.error;\n const windowName = windowNameResult.stdout.trim().replaceAll(/[\\s/]/g, '_');\n\n screenshots.push({\n path: `${windowName || 'window'}_${windowId}.png`,\n data: screenshot.stdout.toString('base64'),\n encoding: 'base64',\n });\n }\n\n return screenshots;\n}\n\nfunction extractTopLevelWindowIds(stdout: string): string[] {\n const windowIds: string[] = [];\n const lines = stdout.split('\\n');\n for (const line of lines) {\n if (line.includes('Root window id:') || line.includes('Parent window id:') || line.includes('()')) continue;\n\n const match = /^\\s{5}(0x[\\da-f]+) /.exec(line);\n if (!match?.[1]) continue;\n windowIds.push(Number.parseInt(match[1], 16).toString());\n }\n return windowIds;\n}\n\nfunction parseTimedStderr(\n stderr: string,\n startTimeSeconds: number,\n sampledMemoryBytes: number\n): Pick<GuiCommandRunResult, 'stderr' | 'timeSeconds' | 'memoryBytes'> {\n const match = /(?:^|\\n)(\\d+\\.\\d+) (\\d+)\\s*$/.exec(stderr);\n const normalizedStderr = match ? stderr.slice(0, match.index).trimEnd() : stderr.trimEnd();\n const parsedMemoryBytes = Number(match?.[2]) * 1024 || 0;\n return {\n stderr: normalizedStderr,\n timeSeconds: Number(match?.[1]) || Date.now() / 1000 - startTimeSeconds,\n memoryBytes: Math.max(parsedMemoryBytes, sampledMemoryBytes),\n };\n}\n\nasync function ensureDisplayServer(): Promise<{ display: string; dispose: () => Promise<void> }> {\n if (process.platform !== 'linux') {\n throw new Error('GUI screenshot capture is supported only on Linux.');\n }\n\n for (let displayNumber = 90; displayNumber < 100; displayNumber++) {\n const display = `:${displayNumber}`;\n let spawnError: Error | undefined;\n const xvfb = childProcess.spawn('Xvfb', [display, '-screen', '0', '1280x1024x24', '-ac'], {\n stdio: 'ignore',\n });\n xvfb.on('error', (error) => {\n spawnError = error;\n });\n\n await wait(XVFB_STARTUP_WAIT_SECONDS * 1000);\n if (spawnError) throw spawnError;\n if (xvfb.exitCode !== null) continue;\n\n return {\n display,\n dispose: async () => {\n if (!xvfb.killed) {\n xvfb.kill('SIGTERM');\n await wait(XVFB_SHUTDOWN_WAIT_SECONDS * 1000);\n if (xvfb.exitCode === null) xvfb.kill('SIGKILL');\n }\n },\n };\n }\n\n throw new Error('Xvfb could not be started.');\n}\n\nasync function stopProcess(child: childProcess.ChildProcess): Promise<void> {\n if (!child.pid) return;\n killProcessGroup(child.pid, 'SIGTERM');\n await wait(PROCESS_SHUTDOWN_WAIT_SECONDS * 1000);\n if (child.exitCode === null) killProcessGroup(child.pid, 'SIGKILL');\n}\n\nfunction readProcessGroupMemoryBytes(processGroupId: number | undefined): number {\n if (!processGroupId || process.platform !== 'linux') return 0;\n\n const result = childProcess.spawnSync('ps', ['-o', 'rss=', '--no-headers', '--pgroup', String(processGroupId)], {\n encoding: 'utf8',\n });\n if (result.error || result.status !== 0 || !result.stdout) return 0;\n\n return result.stdout\n .split('\\n')\n .map((line) => Number(line.trim()))\n .filter((value) => Number.isFinite(value) && value > 0)\n .reduce((sum, value) => sum + value * 1024, 0);\n}\n\nfunction killProcessGroup(processGroupId: number, signal: NodeJS.Signals): void {\n try {\n if (process.platform !== 'win32') {\n process.kill(-processGroupId, signal);\n return;\n }\n } catch {\n // The process group may already be gone. Fall back to the direct PID below.\n }\n\n try {\n process.kill(processGroupId, signal);\n } catch {\n // The direct child may also already be gone.\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"names":["TIME_COMMAND","os","platform","judgeParamsSchema","z","object","language","union","string","array","optional","_guiCommandJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","_options$readTestCase","_testCases$0$id","_testCases$","_options$mainFilePath","_yield$options$prepar","_options$prepare","args","params","problemMarkdownFrontMatter","configuredTestCases","testCases","prebuildTestCaseId","staticAnalysisResult","initialMainFilePath","languageDefinition","env","resolvedMainFilePath","_params$language","prebuiltMainFilePath","prepareResult","_prepareResult$decisi","cwdSnapshot","displayServer","currentTestCaseId","currentStdin","_shared","sharedFileInputPath","_iterator2","_step2","_options$runTimeoutSe","_ref5","_yield$options$resolv","_options$resolveInput","_yield$options$comman","_options$command","_problemMarkdownFront","_judgeResult$decision","_judgeResult$stdout","_judgeResult$stderr","_judgeResult$outputFi","testCase","timeLimitSeconds","runEnv","stdin","command","runResult","_options$screenshotWa","_options$stopDetectio","_options$screenshotWa2","_options$stopDetectio2","outputFiles","judgeContext","baseJudgeResult","judgeResult","_extendedJudgeResult$","extendedJudgeResult","decisionCode","stdout","stderr","_displayServer","_t","_t2","_t4","_t5","_t7","_t9","_t1","_t10","_t11","_t12","_t13","_t14","w","_context","p","n","parseArgs","process","argv","cwd","Error","parse","readProblemMarkdownFrontMatter","v","readTestCases","readGuiTestCases","length","id","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","a","mainFilePath","findEntryPointFile","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","resolveMainFilePath","configuredMainFilePath","prebuild","inferLanguageIdsByPath","allowConfiguredPathFallback","BUILD_ERROR","errorToMessage","prepare","call","runDefaultPrepare","feedbackMarkdown","snapshotWorkingDirectory","runCommand","undefined","ensureDisplayServer","shared","fileInputPath","_createForOfIteratorHelper","s","done","value","copyTestCaseFileInput","timeLimitMs","runTimeoutSeconds","DISPLAY","display","resolveInput","input","screenshotWaitSeconds","stopDetectionThreshold","spawnGuiProgram","RUNTIME_ERROR","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","memoryLimitByte","evaluateGuiRunResult","context","ACCEPTED","test","exitStatus","status","timeSeconds","memoryBytes","e","f","dispose","apply","this","arguments","_x3","_resolveMainFilePath","_callee2","resolvedPath","_context2","path","join","pathExists","filePath","languageIds","Object","entries","languageIdToDefinition","filter","_ref","_slicedToArray","fileExtensions","some","ext","endsWith","map","_ref3","_context$languageDefi","_context$languageDefi2","buildCommand","buildResult","spawnSyncWithTimeout","slice","encoding","BUILD_TIME_LIMIT_EXCEEDED","_context$context$prob","_context$context$prob2","_context$context$prob3","stopReason","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","requiredOutputFilesCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x4","_readGuiTestCases","_callee3","_context3","readFileTestCases","_x5","_spawnGuiProgram","_callee4","wrappedCommand","child","exitCode","spawnError","screenshotSignaturesHistory","screenshots","startTimeSeconds","sampledMemoryBytes","_loop","_parseTimedStderr","normalizedStderr","_context5","toFixed","_toConsumableArray","childProcess","spawn","detached","stdio","setEncoding","Date","now","on","chunk","error","code","signal","write","end","currentScreenshots","screenshotSignatures","_context4","wait","Math","max","readProcessGroupMemoryBytes","pid","takeScreenshots","toSorted","b","data","file","unshift","min","every","files","index","d","_regeneratorValues","removeAllListeners","stopProcess","parseTimedStderr","trimEnd","xwininfo","spawnSync","_i","_extractTopLevelWindo","_step","windowIds","lines","split","_iterator","line","includes","match","exec","push","parseInt","toString","err","extractTopLevelWindowIds","windowId","screenshot","windowNameResult","windowName","trim","replaceAll","parsedMemoryBytes","_ensureDisplayServer","_callee6","_loop2","_ret2","displayNumber","_context8","xvfb","_context7","XVFB_STARTUP_WAIT_SECONDS","_dispose","_callee5","_context6","killed","kill","XVFB_SHUTDOWN_WAIT_SECONDS","_x6","_stopProcess","_callee7","_context9","killProcessGroup","PROCESS_SHUTDOWN_WAIT_SECONDS","processGroupId","result","String","isFinite","reduce","sum","_unused","_unused2","_x7","_pathExists","_callee8","_context0","fs","access","message","_x","_x2"],"mappings":"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"} | ||
| {"version":3,"file":"guiCommand.cjs","names":["os","z","parseArgs","readProblemMarkdownFrontMatter","judgeByStaticAnalysis","findEntryPointFile","DecisionCode","findLanguageDefinitionByPath","snapshotWorkingDirectory","copyTestCaseFileInput","cleanWorkingDirectory","readOutputFiles","path","languageIdToDefinition","spawnSyncWithTimeout","readFileTestCases","childProcess","fs"],"sources":["../../src/presets/guiCommand.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { setTimeout as wait } from 'node:timers/promises';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport { languageIdToDefinition } from '../types/language.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 = 5;\nconst SCREENSHOT_WAIT_SECONDS = 0.3;\nconst XVFB_STARTUP_WAIT_SECONDS = 0.3;\nconst XVFB_SHUTDOWN_WAIT_SECONDS = 0.1;\nconst PROCESS_SHUTDOWN_WAIT_SECONDS = 0.2;\nconst STOP_DETECTION_THRESHOLD = 5;\nconst TIME_COMMAND = [os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time', '--format', '%e %M'] as const;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ninterface BaseGuiTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\nexport interface GuiScreenshotFile {\n path: string;\n data: string;\n encoding: 'base64';\n}\n\nexport interface GuiCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n screenshots: GuiScreenshotFile[];\n stopReason: 'process_exit' | 'stable_screenshot' | 'timeout';\n}\n\ninterface GuiJudgeContext {\n timeLimitSeconds: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\ntype GuiJudgeCaseResult = Pick<\n TestCaseResult,\n 'decisionCode' | 'feedbackMarkdown' | 'stderr' | 'stdout' | 'outputFiles'\n>;\n\nexport interface GuiCommandJudgePresetOptions<TTestCase extends BaseGuiTestCase = BaseGuiTestCase> {\n mainFilePath?: string;\n runTimeoutSeconds?: number;\n screenshotWaitSeconds?: number;\n stopDetectionThreshold?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n prepare?: (context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n problemMarkdownFrontMatter: ProblemMarkdownFrontMatter;\n }) => Promise<Partial<GuiJudgeCaseResult> | undefined> | Partial<GuiJudgeCaseResult> | undefined;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n command?: (context: {\n testCase: TTestCase;\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n }) => Promise<readonly [string, ...string[]]> | readonly [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 screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n }) => Promise<GuiCommandRunResult> | GuiCommandRunResult;\n test: (context: {\n testCase: TTestCase;\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n }) => Promise<Partial<GuiJudgeCaseResult>> | Partial<GuiJudgeCaseResult>;\n}\n\n/**\n * A preset function for judging GUI programs by collecting screenshots while the program runs.\n *\n * Keep problem-specific logic in `prepare`, `command`, and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { DecisionCode } from '@exercode/problem-utils';\n * import { guiCommandJudgePreset } from '@exercode/problem-utils/presets/guiCommand';\n *\n * await guiCommandJudgePreset(import.meta.dirname, {\n * mainFilePath: 'Main.java',\n * readTestCases: async () => [{ id: 'default' }],\n * test: ({ runResult }) => {\n * return runResult.screenshots.length > 0\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n */\nexport async function guiCommandJudgePreset<TTestCase extends BaseGuiTestCase = BaseGuiTestCase>(\n problemDir: string,\n options: GuiCommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const configuredTestCases = await (options.readTestCases ?? readGuiTestCases<TTestCase>)(problemDir);\n const testCases =\n configuredTestCases.length > 0 ? configuredTestCases : ([{ id: 'default' }] as unknown as readonly TTestCase[]);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n\n const staticAnalysisResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return;\n }\n\n const initialMainFilePath = options.mainFilePath ?? (await findEntryPointFile(args.cwd, params.language));\n if (!initialMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(initialMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let resolvedMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language,\n configuredMainFilePath: options.mainFilePath,\n });\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n const prebuiltMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language ?? inferLanguageIdsByPath(initialMainFilePath),\n configuredMainFilePath: options.mainFilePath,\n allowConfiguredPathFallback: true,\n });\n if (prebuiltMainFilePath) resolvedMainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: errorToMessage(error),\n });\n return;\n }\n }\n if (!resolvedMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const prepareResult =\n (await options.prepare?.({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n problemMarkdownFrontMatter,\n })) ??\n runDefaultPrepare({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n languageDefinition,\n });\n if (prepareResult) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: prepareResult.decisionCode ?? DecisionCode.BUILD_ERROR,\n feedbackMarkdown: prepareResult.feedbackMarkdown,\n stderr: prepareResult.stderr,\n stdout: prepareResult.stdout,\n outputFiles: prepareResult.outputFiles,\n });\n return;\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n let displayServer: Awaited<ReturnType<typeof ensureDisplayServer>> | undefined;\n let currentTestCaseId = prebuildTestCaseId;\n let currentStdin: string | undefined;\n try {\n displayServer = options.runCommand ? undefined : await ensureDisplayServer();\n const sharedFileInputPath = (configuredTestCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n for (const testCase of testCases) {\n currentTestCaseId = testCase.id;\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : (options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS);\n\n const runEnv = displayServer ? { ...env, DISPLAY: displayServer.display } : env;\n const stdin = (await options.resolveInput?.({ testCase, cwd: args.cwd, env: runEnv })) ?? testCase.input ?? '';\n currentStdin = stdin;\n const command =\n (await options.command?.({ testCase, cwd: args.cwd, env: runEnv, mainFilePath: resolvedMainFilePath })) ??\n languageDefinition.command(resolvedMainFilePath);\n\n let runResult: GuiCommandRunResult;\n try {\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n })\n : await spawnGuiProgram({\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n return;\n }\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: GuiJudgeContext = {\n timeLimitSeconds,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateGuiRunResult({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test({\n testCase,\n runResult,\n outputFiles,\n context: judgeContext,\n });\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n stdout: extendedJudgeResult.stdout,\n outputFiles: extendedJudgeResult.outputFiles,\n };\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n const decisionCode = judgeResult.decisionCode ?? DecisionCode.ACCEPTED;\n const stdout = judgeResult.stdout ?? runResult.stdout;\n const stderr = judgeResult.stderr ?? runResult.stderr;\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: runResult.status,\n stdin: runResult.stdin || undefined,\n stdout: stdout || undefined,\n stderr: stderr || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n feedbackMarkdown: judgeResult.feedbackMarkdown,\n outputFiles: judgeResult.outputFiles ?? (outputFiles.length > 0 ? outputFiles : undefined),\n });\n\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n } catch (error) {\n printTestCaseResult({\n testCaseId: currentTestCaseId,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: currentStdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n } finally {\n await displayServer?.dispose();\n }\n}\n\nasync function resolveMainFilePath(context: {\n cwd: string;\n language?: string | string[];\n configuredMainFilePath?: string;\n allowConfiguredPathFallback?: boolean;\n}): Promise<string | undefined> {\n if (context.configuredMainFilePath) {\n const resolvedPath = path.join(context.cwd, context.configuredMainFilePath);\n if (await pathExists(resolvedPath)) return context.configuredMainFilePath;\n if (!context.allowConfiguredPathFallback) return undefined;\n }\n\n return await findEntryPointFile(context.cwd, context.language);\n}\n\nfunction inferLanguageIdsByPath(filePath: string): string[] | undefined {\n const languageIds = Object.entries(languageIdToDefinition)\n .filter(([, definition]) => definition.fileExtensions.some((ext) => filePath.endsWith(ext)))\n .map(([languageId]) => languageId);\n return languageIds.length > 0 ? languageIds : undefined;\n}\n\nfunction runDefaultPrepare(context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n languageDefinition: NonNullable<ReturnType<typeof findLanguageDefinitionByPath>>;\n}): Partial<GuiJudgeCaseResult> | undefined {\n const buildCommand = context.languageDefinition.buildCommand?.(context.mainFilePath);\n if (!buildCommand) return undefined;\n\n const buildResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n BUILD_TIMEOUT_SECONDS\n );\n\n if (buildResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n return {\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n stderr: buildResult.stderr || undefined,\n };\n }\n\n if (buildResult.status !== 0) {\n return {\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: buildResult.stderr || buildResult.stdout || undefined,\n };\n }\n\n return undefined;\n}\n\nfunction evaluateGuiRunResult(context: {\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n}): Partial<GuiJudgeCaseResult> {\n if (context.runResult.stopReason === 'timeout') {\n return {\n decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n if (context.runResult.status !== 0) {\n return {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: context.runResult.stderr,\n };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return {\n decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n const requiredOutputFilesCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFilesCount) {\n return {\n decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR,\n };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n\nasync function readGuiTestCases<TTestCase extends BaseGuiTestCase>(problemDir: string): Promise<readonly TTestCase[]> {\n return (await readFileTestCases(path.join(problemDir, 'test_cases'))) as unknown as readonly TTestCase[];\n}\n\nasync function spawnGuiProgram(context: {\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n}): Promise<GuiCommandRunResult> {\n const wrappedCommand = ['timeout', context.timeLimitSeconds.toFixed(3), ...TIME_COMMAND, ...context.command] as const;\n const child = childProcess.spawn(wrappedCommand[0], wrappedCommand.slice(1), {\n cwd: context.cwd,\n env: context.env,\n detached: process.platform !== 'win32',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n let spawnError: Error | undefined;\n let stopReason: GuiCommandRunResult['stopReason'] = 'process_exit';\n const screenshotSignaturesHistory: string[][] = [];\n let screenshots: GuiScreenshotFile[] = [];\n const startTimeSeconds = Date.now() / 1000;\n let sampledMemoryBytes = 0;\n\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on('data', (chunk: string) => {\n stderr += chunk;\n });\n child.on('error', (error) => {\n spawnError = error;\n exitCode = 1;\n });\n child.on('close', (code, signal) => {\n if (code === 124) {\n stopReason = 'timeout';\n exitCode = 0;\n return;\n }\n if (signal) {\n exitCode = 1;\n stderr = stderr\n ? `${stderr}\\nprocess terminated by signal: ${signal}`\n : `process terminated by signal: ${signal}`;\n return;\n }\n exitCode = code ?? 1;\n });\n\n if (context.stdin) child.stdin.write(context.stdin);\n child.stdin.end();\n\n while (exitCode === undefined) {\n await wait(context.screenshotWaitSeconds * 1000);\n sampledMemoryBytes = Math.max(sampledMemoryBytes, readProcessGroupMemoryBytes(child.pid));\n const currentScreenshots = takeScreenshots(context.env.DISPLAY);\n screenshots = currentScreenshots.toSorted((a, b) => a.data.length - b.data.length);\n\n if (screenshots.length > 0) {\n const screenshotSignatures = screenshots.map((file) => file.data).toSorted();\n screenshotSignaturesHistory.unshift(screenshotSignatures);\n screenshotSignaturesHistory.length = Math.min(screenshotSignaturesHistory.length, context.stopDetectionThreshold);\n if (\n screenshotSignaturesHistory.length === context.stopDetectionThreshold &&\n screenshotSignaturesHistory.every(\n (files) =>\n files.length === screenshotSignatures.length &&\n files.every((file, index) => file === screenshotSignatures[index])\n )\n ) {\n stopReason = 'stable_screenshot';\n exitCode = 0;\n break;\n }\n }\n\n if (Date.now() / 1000 - startTimeSeconds > context.timeLimitSeconds) {\n stopReason = 'timeout';\n exitCode = 0;\n break;\n }\n }\n\n if (stopReason !== 'process_exit' && child.exitCode === null) {\n child.removeAllListeners('close');\n child.removeAllListeners('error');\n }\n await stopProcess(child);\n if (spawnError) throw spawnError;\n const {\n memoryBytes,\n stderr: normalizedStderr,\n timeSeconds,\n } = parseTimedStderr(stderr, startTimeSeconds, sampledMemoryBytes);\n\n return {\n stdin: context.stdin,\n stdout: stdout.trimEnd(),\n stderr: normalizedStderr,\n status: exitCode,\n timeSeconds,\n memoryBytes,\n screenshots,\n stopReason,\n };\n}\n\nfunction takeScreenshots(display: string | undefined): GuiScreenshotFile[] {\n const env = display ? { ...process.env, DISPLAY: display } : process.env;\n const xwininfo = childProcess.spawnSync('xwininfo', ['-root', '-tree'], { encoding: 'utf8', env });\n if (xwininfo.error) throw xwininfo.error;\n if (xwininfo.status !== 0 || !xwininfo.stdout) return [];\n\n const screenshots: GuiScreenshotFile[] = [];\n for (const windowId of extractTopLevelWindowIds(xwininfo.stdout)) {\n const screenshot = childProcess.spawnSync('maim', ['-i', windowId], { env });\n if (screenshot.error) throw screenshot.error;\n if (screenshot.status !== 0 || screenshot.stdout.length === 0) continue;\n\n const windowNameResult = childProcess.spawnSync('xdotool', ['getwindowname', windowId], { encoding: 'utf8', env });\n if (windowNameResult.error) throw windowNameResult.error;\n const windowName = windowNameResult.stdout.trim().replaceAll(/[\\s/]/g, '_');\n\n screenshots.push({\n path: `${windowName || 'window'}_${windowId}.png`,\n data: screenshot.stdout.toString('base64'),\n encoding: 'base64',\n });\n }\n\n return screenshots;\n}\n\nfunction extractTopLevelWindowIds(stdout: string): string[] {\n const windowIds: string[] = [];\n const lines = stdout.split('\\n');\n for (const line of lines) {\n if (line.includes('Root window id:') || line.includes('Parent window id:') || line.includes('()')) continue;\n\n const match = /^\\s{5}(0x[\\da-f]+) /.exec(line);\n if (!match?.[1]) continue;\n windowIds.push(Number.parseInt(match[1], 16).toString());\n }\n return windowIds;\n}\n\nfunction parseTimedStderr(\n stderr: string,\n startTimeSeconds: number,\n sampledMemoryBytes: number\n): Pick<GuiCommandRunResult, 'stderr' | 'timeSeconds' | 'memoryBytes'> {\n const match = /(?:^|\\n)(\\d+\\.\\d+) (\\d+)\\s*$/.exec(stderr);\n const normalizedStderr = match ? stderr.slice(0, match.index).trimEnd() : stderr.trimEnd();\n const parsedMemoryBytes = Number(match?.[2]) * 1024 || 0;\n return {\n stderr: normalizedStderr,\n timeSeconds: Number(match?.[1]) || Date.now() / 1000 - startTimeSeconds,\n memoryBytes: Math.max(parsedMemoryBytes, sampledMemoryBytes),\n };\n}\n\nasync function ensureDisplayServer(): Promise<{ display: string; dispose: () => Promise<void> }> {\n if (process.platform !== 'linux') {\n throw new Error('GUI screenshot capture is supported only on Linux.');\n }\n\n for (let displayNumber = 90; displayNumber < 100; displayNumber++) {\n const display = `:${displayNumber}`;\n let spawnError: Error | undefined;\n const xvfb = childProcess.spawn('Xvfb', [display, '-screen', '0', '1280x1024x24', '-ac'], {\n stdio: 'ignore',\n });\n xvfb.on('error', (error) => {\n spawnError = error;\n });\n\n await wait(XVFB_STARTUP_WAIT_SECONDS * 1000);\n if (spawnError) throw spawnError;\n if (xvfb.exitCode !== null) continue;\n\n return {\n display,\n dispose: async () => {\n if (!xvfb.killed) {\n xvfb.kill('SIGTERM');\n await wait(XVFB_SHUTDOWN_WAIT_SECONDS * 1000);\n if (xvfb.exitCode === null) xvfb.kill('SIGKILL');\n }\n },\n };\n }\n\n throw new Error('Xvfb could not be started.');\n}\n\nasync function stopProcess(child: childProcess.ChildProcess): Promise<void> {\n if (!child.pid) return;\n killProcessGroup(child.pid, 'SIGTERM');\n await wait(PROCESS_SHUTDOWN_WAIT_SECONDS * 1000);\n if (child.exitCode === null) killProcessGroup(child.pid, 'SIGKILL');\n}\n\nfunction readProcessGroupMemoryBytes(processGroupId: number | undefined): number {\n if (!processGroupId || process.platform !== 'linux') return 0;\n\n const result = childProcess.spawnSync('ps', ['-o', 'rss=', '--no-headers', '--pgroup', String(processGroupId)], {\n encoding: 'utf8',\n });\n if (result.error || result.status !== 0 || !result.stdout) return 0;\n\n return result.stdout\n .split('\\n')\n .map((line) => Number(line.trim()))\n .filter((value) => Number.isFinite(value) && value > 0)\n .reduce((sum, value) => sum + value * 1024, 0);\n}\n\nfunction killProcessGroup(processGroupId: number, signal: NodeJS.Signals): void {\n try {\n if (process.platform !== 'win32') {\n process.kill(-processGroupId, signal);\n return;\n }\n } catch {\n // The process group may already be gone. Fall back to the direct PID below.\n }\n\n try {\n process.kill(processGroupId, signal);\n } catch {\n // The direct child may also already be gone.\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"} |
@@ -1,2 +0,4 @@ | ||
| import{asyncToGenerator as e,regenerator as n,createForOfIteratorHelper as r,objectSpread2 as t,slicedToArray as i,regeneratorValues as s,toConsumableArray as a}from"../_virtual/_rollupPluginBabelHelpers.js";import o from"node:child_process";import u from"node:fs/promises";import c from"node:os";import d from"node:path";import{setTimeout as l}from"node:timers/promises";import{z as f}from"zod";import{cleanWorkingDirectory as p,snapshotWorkingDirectory as m}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as h}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as v}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as w}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as b}from"../helpers/judgeByStaticAnalysis.js";import{parseArgs as g}from"../helpers/parseArgs.js";import{printTestCaseResult as k}from"../helpers/printTestCaseResult.js";import{readOutputFiles as C}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as I}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as y}from"../helpers/readTestCases.js";import{spawnSyncWithTimeout as E}from"../helpers/spawnSyncWithTimeout.js";import{DecisionCode as R}from"../types/decisionCode.js";import{languageIdToDefinition as S}from"../types/language.js";var F=["darwin"===c.platform()?"gtime":"/usr/bin/time","--format","%e %M"],M=f.object({language:f.union([f.string(),f.array(f.string())]).optional()});function P(e,n){return _.apply(this,arguments)}function _(){return(_=e(n().m(function e(i,s){var a,o,u,c,d,l,f,y,E,S,F,P,_,T,N,U,A,G,q,X,Y,Q,H,K,V,$,J,Z,ee,ne,re,te,ie,se,ae,oe,ue,ce,de,le,fe,pe,me,he,ve,we,be,ge,ke,Ce,Ie,ye,Ee,Re,Se,Fe,Me,Pe,_e,De,Te,Le,xe,Oe,je,Ne,Be,Ue,Ae,Ge,We,qe;return n().w(function(e){for(;;)switch(e.p=e.n){case 0:if((f=g(process.argv)).cwd){e.n=1;break}throw new Error("cwd argument required");case 1:return y=M.parse(f.params),e.n=2,I(i);case 2:return E=e.v,e.n=3,(null!=(a=s.readTestCases)?a:j)(i);case 3:return S=e.v,F=S.length>0?S:[{id:"default"}],P=null!=(o=null==(u=F[0])?void 0:u.id)?o:"prebuild",e.n=4,b(f.cwd,E);case 4:if(!(_=e.v)){e.n=5;break}return k(t({testCaseId:P},_)),e.a(2);case 5:if(null==(c=s.mainFilePath)){e.n=6;break}Te=c,e.n=8;break;case 6:return e.n=7,v(f.cwd,y.language);case 7:Te=e.v;case 8:if(T=Te){e.n=9;break}return k({testCaseId:P,decisionCode:R.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:s.mainFilePath?"required main file not found: ".concat(s.mainFilePath):"main file not found".concat(y.language?": language: ".concat(y.language):"")}),e.a(2);case 9:if(N=w(T)){e.n=10;break}return k({testCaseId:P,decisionCode:R.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2);case 10:return U=t(t({},process.env),{},{CI:"",FORCE_COLOR:"0"}),e.n=11,D({cwd:f.cwd,language:y.language,configuredMainFilePath:s.mainFilePath});case 11:if(A=e.v,!N.prebuild){e.n=16;break}return e.p=12,e.n=13,N.prebuild(f.cwd);case 13:return e.n=14,D({cwd:f.cwd,language:null!=(G=y.language)?G:L(T),configuredMainFilePath:s.mainFilePath,allowConfiguredPathFallback:!0});case 14:(q=e.v)&&(A=q),e.n=16;break;case 15:return e.p=15,Le=e.v,k({testCaseId:P,decisionCode:R.BUILD_ERROR,stderr:z(Le)}),e.a(2);case 16:if(A){e.n=17;break}return k({testCaseId:P,decisionCode:R.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:s.mainFilePath?"required main file not found: ".concat(s.mainFilePath):"main file not found".concat(y.language?": language: ".concat(y.language):"")}),e.a(2);case 17:return e.n=18,null==(l=s.prepare)?void 0:l.call(s,{cwd:f.cwd,env:U,mainFilePath:A,problemMarkdownFrontMatter:E});case 18:if(null==(d=e.v)){e.n=19;break}xe=d,e.n=20;break;case 19:xe=x({cwd:f.cwd,env:U,mainFilePath:A,languageDefinition:N});case 20:if(!(X=xe)){e.n=21;break}return k({testCaseId:P,decisionCode:null!=(Y=X.decisionCode)?Y:R.BUILD_ERROR,feedbackMarkdown:X.feedbackMarkdown,stderr:X.stderr,stdout:X.stdout,outputFiles:X.outputFiles}),e.a(2);case 21:return e.n=22,m(f.cwd);case 22:if(Q=e.v,K=P,e.p=23,!s.runCommand){e.n=24;break}Oe=void 0,e.n=26;break;case 24:return e.n=25,W();case 25:Oe=e.v;case 26:H=Oe,J=null==($=S.shared)?void 0:$.fileInputPath,Z=r(F),e.p=27,Z.s();case 28:if((ee=Z.n()).done){e.n=54;break}if(fe=ee.value,K=fe.id,!J){e.n=29;break}return e.n=29,h(J,f.cwd);case 29:if(!fe.fileInputPath){e.n=30;break}return e.n=30,h(fe.fileInputPath,f.cwd);case 30:return pe="number"==typeof E.timeLimitMs?E.timeLimitMs/1e3:null!=(ne=s.runTimeoutSeconds)?ne:5,me=H?t(t({},U),{},{DISPLAY:H.display}):U,e.n=31,null==(ie=s.resolveInput)?void 0:ie.call(s,{testCase:fe,cwd:f.cwd,env:me});case 31:if(null==(te=e.v)){e.n=32;break}je=te,e.n=33;break;case 32:je=fe.input;case 33:if(null==(re=je)){e.n=34;break}Ne=re,e.n=35;break;case 34:Ne="";case 35:return V=he=Ne,e.n=36,null==(ae=s.command)?void 0:ae.call(s,{testCase:fe,cwd:f.cwd,env:me,mainFilePath:A});case 36:if(null==(se=e.v)){e.n=37;break}Be=se,e.n=38;break;case 37:Be=N.command(A);case 38:if(ve=Be,we=void 0,e.p=39,!s.runCommand){e.n=41;break}return e.n=40,s.runCommand({testCase:fe,command:ve,stdin:he,cwd:f.cwd,env:me,timeLimitSeconds:pe,screenshotWaitSeconds:null!=(be=s.screenshotWaitSeconds)?be:.3,stopDetectionThreshold:null!=(ge=s.stopDetectionThreshold)?ge:5});case 40:Ue=e.v,e.n=43;break;case 41:return e.n=42,B({command:ve,stdin:he,cwd:f.cwd,env:me,timeLimitSeconds:pe,screenshotWaitSeconds:null!=(ke=s.screenshotWaitSeconds)?ke:.3,stopDetectionThreshold:null!=(Ce=s.stopDetectionThreshold)?Ce:5});case 42:Ue=e.v;case 43:we=Ue,e.n=46;break;case 44:return e.p=44,Ae=e.v,k({testCaseId:fe.id,decisionCode:R.RUNTIME_ERROR,stdin:he,stderr:z(Ae)}),e.n=45,p(f.cwd,Q);case 45:return e.a(2);case 46:return e.n=47,C(f.cwd,null!=(oe=E.requiredOutputFilePaths)?oe:[]);case 47:if(Ie=e.v,ye={timeLimitSeconds:pe,problemMarkdownFrontMatter:{memoryLimitByte:E.memoryLimitByte,requiredOutputFilePaths:E.requiredOutputFilePaths}},Ee=O({runResult:we,outputFiles:Ie,context:ye}),Re=Ee,Ee.decisionCode!==R.ACCEPTED){e.n=51;break}return e.p=48,e.n=49,s.test({testCase:fe,runResult:we,outputFiles:Ie,context:ye});case 49:Fe=e.v,Re={decisionCode:null!=(Se=Fe.decisionCode)?Se:Ee.decisionCode,feedbackMarkdown:Fe.feedbackMarkdown,stderr:Fe.stderr,stdout:Fe.stdout,outputFiles:Fe.outputFiles},e.n=51;break;case 50:e.p=50,Ge=e.v,Re={decisionCode:R.RUNTIME_ERROR,stderr:z(Ge)};case 51:return Me=null!=(ue=Re.decisionCode)?ue:R.ACCEPTED,Pe=null!=(ce=Re.stdout)?ce:we.stdout,_e=null!=(de=Re.stderr)?de:we.stderr,k({testCaseId:fe.id,decisionCode:Me,exitStatus:we.status,stdin:we.stdin||void 0,stdout:Pe||void 0,stderr:_e||void 0,timeSeconds:we.timeSeconds,memoryBytes:we.memoryBytes,feedbackMarkdown:Re.feedbackMarkdown,outputFiles:null!=(le=Re.outputFiles)?le:Ie.length>0?Ie:void 0}),e.n=52,p(f.cwd,Q);case 52:if(Me===R.ACCEPTED){e.n=53;break}return e.a(3,54);case 53:e.n=28;break;case 54:e.n=56;break;case 55:e.p=55,We=e.v,Z.e(We);case 56:return e.p=56,Z.f(),e.f(56);case 57:e.n=59;break;case 58:return e.p=58,qe=e.v,k({testCaseId:K,decisionCode:R.RUNTIME_ERROR,stdin:V,stderr:z(qe)}),e.n=59,p(f.cwd,Q);case 59:return e.p=59,e.n=60,null==(De=H)?void 0:De.dispose();case 60:return e.f(59);case 61:return e.a(2)}},e,null,[[48,50],[39,44],[27,55,56,57],[23,58,59,61],[12,15]])}))).apply(this,arguments)}function D(e){return T.apply(this,arguments)}function T(){return(T=e(n().m(function e(r){var t;return n().w(function(e){for(;;)switch(e.n){case 0:if(!r.configuredMainFilePath){e.n=3;break}return t=d.join(r.cwd,r.configuredMainFilePath),e.n=1,K(t);case 1:if(!e.v){e.n=2;break}return e.a(2,r.configuredMainFilePath);case 2:if(r.allowConfiguredPathFallback){e.n=3;break}return e.a(2,void 0);case 3:return e.n=4,v(r.cwd,r.language);case 4:return e.a(2,e.v)}},e)}))).apply(this,arguments)}function L(e){var n=Object.entries(S).filter(function(n){return i(n,2)[1].fileExtensions.some(function(n){return e.endsWith(n)})}).map(function(e){return i(e,1)[0]});return n.length>0?n:void 0}function x(e){var n,r,t=null==(n=(r=e.languageDefinition).buildCommand)?void 0:n.call(r,e.mainFilePath);if(t){var i=E(t[0],t.slice(1),{cwd:e.cwd,encoding:"utf8",env:e.env},10);return i.timeSeconds>10?{decisionCode:R.BUILD_TIME_LIMIT_EXCEEDED,stderr:i.stderr||void 0}:0!==i.status?{decisionCode:R.BUILD_ERROR,stderr:i.stderr||i.stdout||void 0}:void 0}}function O(e){var n,r,t;if("timeout"===e.runResult.stopReason)return{decisionCode:R.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(0!==e.runResult.status)return{decisionCode:R.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(n=e.context.problemMarkdownFrontMatter.memoryLimitByte)?n:Number.POSITIVE_INFINITY))return{decisionCode:R.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var i=null!=(r=null==(t=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:t.length)?r:0;return e.outputFiles.length<i?{decisionCode:R.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:R.ACCEPTED}}function j(e){return N.apply(this,arguments)}function N(){return(N=e(n().m(function e(r){return n().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,y(d.join(r,"test_cases"));case 1:return e.a(2,e.v)}},e)}))).apply(this,arguments)}function B(e){return U.apply(this,arguments)}function U(){return(U=e(n().m(function e(r){var t,i,u,c,d,f,p,m,h,v,w,b,g,k,C,I;return n().w(function(e){for(;;)switch(e.n){case 0:t=["timeout",r.timeLimitSeconds.toFixed(3)].concat(F,a(r.command)),(i=o.spawn(t[0],t.slice(1),{cwd:r.cwd,env:r.env,detached:"win32"!==process.platform,stdio:["pipe","pipe","pipe"]})).stdout.setEncoding("utf8"),i.stderr.setEncoding("utf8"),u="",c="",p="process_exit",m=[],h=[],v=Date.now()/1e3,w=0,i.stdout.on("data",function(e){u+=e}),i.stderr.on("data",function(e){c+=e}),i.on("error",function(e){f=e,d=1}),i.on("close",function(e,n){return 124===e?(p="timeout",void(d=0)):n?(d=1,void(c=c?"".concat(c,"\nprocess terminated by signal: ").concat(n):"process terminated by signal: ".concat(n))):void(d=null!=e?e:1)}),r.stdin&&i.stdin.write(r.stdin),i.stdin.end(),b=n().m(function e(){var t,s;return n().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,l(1e3*r.screenshotWaitSeconds);case 1:if(w=Math.max(w,Q(i.pid)),t=A(r.env.DISPLAY),!((h=t.toSorted(function(e,n){return e.data.length-n.data.length})).length>0)){e.n=2;break}if(s=h.map(function(e){return e.data}).toSorted(),m.unshift(s),m.length=Math.min(m.length,r.stopDetectionThreshold),m.length!==r.stopDetectionThreshold||!m.every(function(e){return e.length===s.length&&e.every(function(e,n){return e===s[n]})})){e.n=2;break}return p="stable_screenshot",d=0,e.a(2,0);case 2:if(!(Date.now()/1e3-v>r.timeLimitSeconds)){e.n=3;break}return p="timeout",d=0,e.a(2,0);case 3:return e.a(2)}},e)});case 1:if(void 0!==d){e.n=4;break}return e.d(s(b()),2);case 2:if(0!==e.v){e.n=3;break}return e.a(3,4);case 3:e.n=1;break;case 4:return"process_exit"!==p&&null===i.exitCode&&(i.removeAllListeners("close"),i.removeAllListeners("error")),e.n=5,X(i);case 5:if(!f){e.n=6;break}throw f;case 6:return g=G(c,v,w),k=g.memoryBytes,C=g.stderr,I=g.timeSeconds,e.a(2,{stdin:r.stdin,stdout:u.trimEnd(),stderr:C,status:d,timeSeconds:I,memoryBytes:k,screenshots:h,stopReason:p})}},e)}))).apply(this,arguments)}function A(e){var n=e?t(t({},process.env),{},{DISPLAY:e}):process.env,i=o.spawnSync("xwininfo",["-root","-tree"],{encoding:"utf8",env:n});if(i.error)throw i.error;if(0!==i.status||!i.stdout)return[];for(var s=[],a=0,u=function(e){var n,t=[],i=e.split("\n"),s=r(i);try{for(s.s();!(n=s.n()).done;){var a=n.value;if(!(a.includes("Root window id:")||a.includes("Parent window id:")||a.includes("()"))){var o=/^\s{5}(0x[\da-f]+) /.exec(a);null!=o&&o[1]&&t.push(Number.parseInt(o[1],16).toString())}}}catch(e){s.e(e)}finally{s.f()}return t}(i.stdout);a<u.length;a++){var c=u[a],d=o.spawnSync("maim",["-i",c],{env:n});if(d.error)throw d.error;if(0===d.status&&0!==d.stdout.length){var l=o.spawnSync("xdotool",["getwindowname",c],{encoding:"utf8",env:n});if(l.error)throw l.error;var f=l.stdout.trim().replaceAll(/[\s/]/g,"_");s.push({path:"".concat(f||"window","_").concat(c,".png"),data:d.stdout.toString("base64"),encoding:"base64"})}}return s}function G(e,n,r){var t=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(e),i=t?e.slice(0,t.index).trimEnd():e.trimEnd(),s=1024*Number(null==t?void 0:t[2])||0;return{stderr:i,timeSeconds:Number(null==t?void 0:t[1])||Date.now()/1e3-n,memoryBytes:Math.max(s,r)}}function W(){return q.apply(this,arguments)}function q(){return q=e(n().m(function r(){var t,i,a;return n().w(function(r){for(;;)switch(r.n){case 0:if("linux"===process.platform){r.n=1;break}throw new Error("GUI screenshot capture is supported only on Linux.");case 1:t=n().m(function r(){var t,i,s;return n().w(function(r){for(;;)switch(r.n){case 0:return t=":".concat(a),(s=o.spawn("Xvfb",[t,"-screen","0","1280x1024x24","-ac"],{stdio:"ignore"})).on("error",function(e){i=e}),r.n=1,l(300);case 1:if(!i){r.n=2;break}throw i;case 2:if(null===s.exitCode){r.n=3;break}return r.a(2,0);case 3:return r.a(2,{v:{display:t,dispose:function(){var r=e(n().m(function e(){return n().w(function(e){for(;;)switch(e.n){case 0:if(s.killed){e.n=2;break}return s.kill("SIGTERM"),e.n=1,l(100);case 1:null===s.exitCode&&s.kill("SIGKILL");case 2:return e.a(2)}},e)}));return function(){return r.apply(this,arguments)}}()}})}},r)}),a=90;case 2:if(!(a<100)){r.n=6;break}return r.d(s(t()),3);case 3:if(0!==(i=r.v)){r.n=4;break}return r.a(3,5);case 4:if(!i){r.n=5;break}return r.a(2,i.v);case 5:a++,r.n=2;break;case 6:throw new Error("Xvfb could not be started.");case 7:return r.a(2)}},r)})),q.apply(this,arguments)}function X(e){return Y.apply(this,arguments)}function Y(){return(Y=e(n().m(function e(r){return n().w(function(e){for(;;)switch(e.n){case 0:if(r.pid){e.n=1;break}return e.a(2);case 1:return H(r.pid,"SIGTERM"),e.n=2,l(200);case 2:null===r.exitCode&&H(r.pid,"SIGKILL");case 3:return e.a(2)}},e)}))).apply(this,arguments)}function Q(e){if(!e||"linux"!==process.platform)return 0;var n=o.spawnSync("ps",["-o","rss=","--no-headers","--pgroup",String(e)],{encoding:"utf8"});return n.error||0!==n.status||!n.stdout?0:n.stdout.split("\n").map(function(e){return Number(e.trim())}).filter(function(e){return Number.isFinite(e)&&e>0}).reduce(function(e,n){return e+1024*n},0)}function H(e,n){try{if("win32"!==process.platform)return void process.kill(-e,n)}catch(e){}try{process.kill(e,n)}catch(e){}}function K(e){return V.apply(this,arguments)}function V(){return(V=e(n().m(function e(r){return n().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,u.access(r);case 1:return e.a(2,!0);case 2:return e.p=2,e.v,e.a(2,!1)}},e,null,[[0,2]])}))).apply(this,arguments)}function z(e){return e instanceof Error?e.message:String(e)}export{P as guiCommandJudgePreset}; | ||
| //# sourceMappingURL=guiCommand.js.map | ||
| import{parseArgs as e}from"../helpers/parseArgs.js";import{printTestCaseResult as t}from"../helpers/printTestCaseResult.js";import{languageIdToDefinition as n}from"../types/language.js";import{DecisionCode as r}from"../types/decisionCode.js";import{cleanWorkingDirectory as i,snapshotWorkingDirectory as a}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as o}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as s}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as c}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as l}from"../helpers/judgeByStaticAnalysis.js";import{readOutputFiles as u}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as d}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as f}from"../helpers/readTestCases.js";import{spawnSyncWithTimeout as p}from"../helpers/spawnSyncWithTimeout.js";import{z as m}from"zod";import h from"node:child_process";import g from"node:fs/promises";import _ from"node:os";import v from"node:path";import{setTimeout as y}from"node:timers/promises";const b=.3,x=[_.platform()===`darwin`?`gtime`:`/usr/bin/time`,`--format`,`%e %M`],S=m.object({language:m.union([m.string(),m.array(m.string())]).optional()});async function C(n,f){let p=e(process.argv);if(!p.cwd)throw Error(`cwd argument required`);let m=S.parse(p.params),h=await d(n),g=await(f.readTestCases??O)(n),_=g.length>0?g:[{id:`default`}],v=_[0]?.id??`prebuild`,y=await l(p.cwd,h);if(y){t({testCaseId:v,...y});return}let x=f.mainFilePath??await s(p.cwd,m.language);if(!x){t({testCaseId:v,decisionCode:r.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:f.mainFilePath?`required main file not found: ${f.mainFilePath}`:`main file not found${m.language?`: language: ${m.language}`:``}`});return}let C=c(x);if(!C){t({testCaseId:v,decisionCode:r.WRONG_ANSWER,stderr:`unsupported language`});return}let A={...process.env,CI:``,FORCE_COLOR:`0`},j=await w({cwd:p.cwd,language:m.language,configuredMainFilePath:f.mainFilePath});if(C.prebuild)try{await C.prebuild(p.cwd);let e=await w({cwd:p.cwd,language:m.language??T(x),configuredMainFilePath:f.mainFilePath,allowConfiguredPathFallback:!0});e&&(j=e)}catch(e){t({testCaseId:v,decisionCode:r.BUILD_ERROR,stderr:R(e)});return}if(!j){t({testCaseId:v,decisionCode:r.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:f.mainFilePath?`required main file not found: ${f.mainFilePath}`:`main file not found${m.language?`: language: ${m.language}`:``}`});return}let M=await f.prepare?.({cwd:p.cwd,env:A,mainFilePath:j,problemMarkdownFrontMatter:h})??E({cwd:p.cwd,env:A,mainFilePath:j,languageDefinition:C});if(M){t({testCaseId:v,decisionCode:M.decisionCode??r.BUILD_ERROR,feedbackMarkdown:M.feedbackMarkdown,stderr:M.stderr,stdout:M.stdout,outputFiles:M.outputFiles});return}let P=await a(p.cwd),F,I=v,L;try{F=f.runCommand?void 0:await N();let e=g.shared?.fileInputPath;for(let n of _){I=n.id,e&&await o(e,p.cwd),n.fileInputPath&&await o(n.fileInputPath,p.cwd);let a=typeof h.timeLimitMs==`number`?h.timeLimitMs/1e3:f.runTimeoutSeconds??5,s=F?{...A,DISPLAY:F.display}:A,c=await f.resolveInput?.({testCase:n,cwd:p.cwd,env:s})??n.input??``;L=c;let l=await f.command?.({testCase:n,cwd:p.cwd,env:s,mainFilePath:j})??C.command(j),d;try{d=f.runCommand?await f.runCommand({testCase:n,command:l,stdin:c,cwd:p.cwd,env:s,timeLimitSeconds:a,screenshotWaitSeconds:f.screenshotWaitSeconds??b,stopDetectionThreshold:f.stopDetectionThreshold??5}):await k({command:l,stdin:c,cwd:p.cwd,env:s,timeLimitSeconds:a,screenshotWaitSeconds:f.screenshotWaitSeconds??b,stopDetectionThreshold:f.stopDetectionThreshold??5})}catch(e){t({testCaseId:n.id,decisionCode:r.RUNTIME_ERROR,stdin:c,stderr:R(e)}),await i(p.cwd,P);return}let m=await u(p.cwd,h.requiredOutputFilePaths??[]),g={timeLimitSeconds:a,problemMarkdownFrontMatter:{memoryLimitByte:h.memoryLimitByte,requiredOutputFilePaths:h.requiredOutputFilePaths}},_=D({runResult:d,outputFiles:m,context:g}),v=_;if(_.decisionCode===r.ACCEPTED)try{let e=await f.test({testCase:n,runResult:d,outputFiles:m,context:g});v={decisionCode:e.decisionCode??_.decisionCode,feedbackMarkdown:e.feedbackMarkdown,stderr:e.stderr,stdout:e.stdout,outputFiles:e.outputFiles}}catch(e){v={decisionCode:r.RUNTIME_ERROR,stderr:R(e)}}let y=v.decisionCode??r.ACCEPTED,x=v.stdout??d.stdout,S=v.stderr??d.stderr;if(t({testCaseId:n.id,decisionCode:y,exitStatus:d.status,stdin:d.stdin||void 0,stdout:x||void 0,stderr:S||void 0,timeSeconds:d.timeSeconds,memoryBytes:d.memoryBytes,feedbackMarkdown:v.feedbackMarkdown,outputFiles:v.outputFiles??(m.length>0?m:void 0)}),await i(p.cwd,P),y!==r.ACCEPTED)break}}catch(e){t({testCaseId:I,decisionCode:r.RUNTIME_ERROR,stdin:L,stderr:R(e)}),await i(p.cwd,P)}finally{await F?.dispose()}}async function w(e){if(e.configuredMainFilePath){if(await L(v.join(e.cwd,e.configuredMainFilePath)))return e.configuredMainFilePath;if(!e.allowConfiguredPathFallback)return}return await s(e.cwd,e.language)}function T(e){let t=Object.entries(n).filter(([,t])=>t.fileExtensions.some(t=>e.endsWith(t))).map(([e])=>e);return t.length>0?t:void 0}function E(e){let t=e.languageDefinition.buildCommand?.(e.mainFilePath);if(!t)return;let n=p(t[0],t.slice(1),{cwd:e.cwd,encoding:`utf8`,env:e.env},10);if(n.timeSeconds>10)return{decisionCode:r.BUILD_TIME_LIMIT_EXCEEDED,stderr:n.stderr||void 0};if(n.status!==0)return{decisionCode:r.BUILD_ERROR,stderr:n.stderr||n.stdout||void 0}}function D(e){if(e.runResult.stopReason===`timeout`)return{decisionCode:r.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.status!==0)return{decisionCode:r.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(e.context.problemMarkdownFrontMatter.memoryLimitByte??1/0))return{decisionCode:r.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};let t=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length??0;return e.outputFiles.length<t?{decisionCode:r.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:r.ACCEPTED}}async function O(e){return await f(v.join(e,`test_cases`))}async function k(e){let t=[`timeout`,e.timeLimitSeconds.toFixed(3),...x,...e.command],n=h.spawn(t[0],t.slice(1),{cwd:e.cwd,env:e.env,detached:process.platform!==`win32`,stdio:[`pipe`,`pipe`,`pipe`]});n.stdout.setEncoding(`utf8`),n.stderr.setEncoding(`utf8`);let r=``,i=``,a,o,s=`process_exit`,c=[],l=[],u=Date.now()/1e3,d=0;for(n.stdout.on(`data`,e=>{r+=e}),n.stderr.on(`data`,e=>{i+=e}),n.on(`error`,e=>{o=e,a=1}),n.on(`close`,(e,t)=>{if(e===124){s=`timeout`,a=0;return}if(t){a=1,i=i?`${i}\nprocess terminated by signal: ${t}`:`process terminated by signal: ${t}`;return}a=e??1}),e.stdin&&n.stdin.write(e.stdin),n.stdin.end();a===void 0;){if(await y(e.screenshotWaitSeconds*1e3),d=Math.max(d,F(n.pid)),l=A(e.env.DISPLAY).toSorted((e,t)=>e.data.length-t.data.length),l.length>0){let t=l.map(e=>e.data).toSorted();if(c.unshift(t),c.length=Math.min(c.length,e.stopDetectionThreshold),c.length===e.stopDetectionThreshold&&c.every(e=>e.length===t.length&&e.every((e,n)=>e===t[n]))){s=`stable_screenshot`,a=0;break}}if(Date.now()/1e3-u>e.timeLimitSeconds){s=`timeout`,a=0;break}}if(s!==`process_exit`&&n.exitCode===null&&(n.removeAllListeners(`close`),n.removeAllListeners(`error`)),await P(n),o)throw o;let{memoryBytes:f,stderr:p,timeSeconds:m}=M(i,u,d);return{stdin:e.stdin,stdout:r.trimEnd(),stderr:p,status:a,timeSeconds:m,memoryBytes:f,screenshots:l,stopReason:s}}function A(e){let t=e?{...process.env,DISPLAY:e}:process.env,n=h.spawnSync(`xwininfo`,[`-root`,`-tree`],{encoding:`utf8`,env:t});if(n.error)throw n.error;if(n.status!==0||!n.stdout)return[];let r=[];for(let e of j(n.stdout)){let n=h.spawnSync(`maim`,[`-i`,e],{env:t});if(n.error)throw n.error;if(n.status!==0||n.stdout.length===0)continue;let i=h.spawnSync(`xdotool`,[`getwindowname`,e],{encoding:`utf8`,env:t});if(i.error)throw i.error;let a=i.stdout.trim().replaceAll(/[\s/]/g,`_`);r.push({path:`${a||`window`}_${e}.png`,data:n.stdout.toString(`base64`),encoding:`base64`})}return r}function j(e){let t=[],n=e.split(` | ||
| `);for(let e of n){if(e.includes(`Root window id:`)||e.includes(`Parent window id:`)||e.includes(`()`))continue;let n=/^\s{5}(0x[\da-f]+) /.exec(e);n?.[1]&&t.push(Number.parseInt(n[1],16).toString())}return t}function M(e,t,n){let r=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(e),i=r?e.slice(0,r.index).trimEnd():e.trimEnd(),a=Number(r?.[2])*1024||0;return{stderr:i,timeSeconds:Number(r?.[1])||Date.now()/1e3-t,memoryBytes:Math.max(a,n)}}async function N(){if(process.platform!==`linux`)throw Error(`GUI screenshot capture is supported only on Linux.`);for(let e=90;e<100;e++){let t=`:${e}`,n,r=h.spawn(`Xvfb`,[t,`-screen`,`0`,`1280x1024x24`,`-ac`],{stdio:`ignore`});if(r.on(`error`,e=>{n=e}),await y(.3*1e3),n)throw n;if(r.exitCode===null)return{display:t,dispose:async()=>{r.killed||(r.kill(`SIGTERM`),await y(.1*1e3),r.exitCode===null&&r.kill(`SIGKILL`))}}}throw Error(`Xvfb could not be started.`)}async function P(e){e.pid&&(I(e.pid,`SIGTERM`),await y(.2*1e3),e.exitCode===null&&I(e.pid,`SIGKILL`))}function F(e){if(!e||process.platform!==`linux`)return 0;let t=h.spawnSync(`ps`,[`-o`,`rss=`,`--no-headers`,`--pgroup`,String(e)],{encoding:`utf8`});return t.error||t.status!==0||!t.stdout?0:t.stdout.split(` | ||
| `).map(e=>Number(e.trim())).filter(e=>Number.isFinite(e)&&e>0).reduce((e,t)=>e+t*1024,0)}function I(e,t){try{if(process.platform!==`win32`){process.kill(-e,t);return}}catch{}try{process.kill(e,t)}catch{}}async function L(e){try{return await g.access(e),!0}catch{return!1}}function R(e){return e instanceof Error?e.message:String(e)}export{C as guiCommandJudgePreset}; | ||
| //# sourceMappingURL=guiCommand.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"guiCommand.js","sources":["../../src/presets/guiCommand.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { setTimeout as wait } from 'node:timers/promises';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport { languageIdToDefinition } from '../types/language.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 = 5;\nconst SCREENSHOT_WAIT_SECONDS = 0.3;\nconst XVFB_STARTUP_WAIT_SECONDS = 0.3;\nconst XVFB_SHUTDOWN_WAIT_SECONDS = 0.1;\nconst PROCESS_SHUTDOWN_WAIT_SECONDS = 0.2;\nconst STOP_DETECTION_THRESHOLD = 5;\nconst TIME_COMMAND = [os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time', '--format', '%e %M'] as const;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ninterface BaseGuiTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\nexport interface GuiScreenshotFile {\n path: string;\n data: string;\n encoding: 'base64';\n}\n\nexport interface GuiCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n screenshots: GuiScreenshotFile[];\n stopReason: 'process_exit' | 'stable_screenshot' | 'timeout';\n}\n\ninterface GuiJudgeContext {\n timeLimitSeconds: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\ntype GuiJudgeCaseResult = Pick<\n TestCaseResult,\n 'decisionCode' | 'feedbackMarkdown' | 'stderr' | 'stdout' | 'outputFiles'\n>;\n\nexport interface GuiCommandJudgePresetOptions<TTestCase extends BaseGuiTestCase = BaseGuiTestCase> {\n mainFilePath?: string;\n runTimeoutSeconds?: number;\n screenshotWaitSeconds?: number;\n stopDetectionThreshold?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n prepare?: (context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n problemMarkdownFrontMatter: ProblemMarkdownFrontMatter;\n }) => Promise<Partial<GuiJudgeCaseResult> | undefined> | Partial<GuiJudgeCaseResult> | undefined;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n command?: (context: {\n testCase: TTestCase;\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n }) => Promise<readonly [string, ...string[]]> | readonly [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 screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n }) => Promise<GuiCommandRunResult> | GuiCommandRunResult;\n test: (context: {\n testCase: TTestCase;\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n }) => Promise<Partial<GuiJudgeCaseResult>> | Partial<GuiJudgeCaseResult>;\n}\n\n/**\n * A preset function for judging GUI programs by collecting screenshots while the program runs.\n *\n * Keep problem-specific logic in `prepare`, `command`, and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { DecisionCode } from '@exercode/problem-utils';\n * import { guiCommandJudgePreset } from '@exercode/problem-utils/presets/guiCommand';\n *\n * await guiCommandJudgePreset(import.meta.dirname, {\n * mainFilePath: 'Main.java',\n * readTestCases: async () => [{ id: 'default' }],\n * test: ({ runResult }) => {\n * return runResult.screenshots.length > 0\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n */\nexport async function guiCommandJudgePreset<TTestCase extends BaseGuiTestCase = BaseGuiTestCase>(\n problemDir: string,\n options: GuiCommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const configuredTestCases = await (options.readTestCases ?? readGuiTestCases<TTestCase>)(problemDir);\n const testCases =\n configuredTestCases.length > 0 ? configuredTestCases : ([{ id: 'default' }] as unknown as readonly TTestCase[]);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n\n const staticAnalysisResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return;\n }\n\n const initialMainFilePath = options.mainFilePath ?? (await findEntryPointFile(args.cwd, params.language));\n if (!initialMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(initialMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let resolvedMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language,\n configuredMainFilePath: options.mainFilePath,\n });\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n const prebuiltMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language ?? inferLanguageIdsByPath(initialMainFilePath),\n configuredMainFilePath: options.mainFilePath,\n allowConfiguredPathFallback: true,\n });\n if (prebuiltMainFilePath) resolvedMainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: errorToMessage(error),\n });\n return;\n }\n }\n if (!resolvedMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const prepareResult =\n (await options.prepare?.({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n problemMarkdownFrontMatter,\n })) ??\n runDefaultPrepare({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n languageDefinition,\n });\n if (prepareResult) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: prepareResult.decisionCode ?? DecisionCode.BUILD_ERROR,\n feedbackMarkdown: prepareResult.feedbackMarkdown,\n stderr: prepareResult.stderr,\n stdout: prepareResult.stdout,\n outputFiles: prepareResult.outputFiles,\n });\n return;\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n let displayServer: Awaited<ReturnType<typeof ensureDisplayServer>> | undefined;\n let currentTestCaseId = prebuildTestCaseId;\n let currentStdin: string | undefined;\n try {\n displayServer = options.runCommand ? undefined : await ensureDisplayServer();\n const sharedFileInputPath = (configuredTestCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n for (const testCase of testCases) {\n currentTestCaseId = testCase.id;\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : (options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS);\n\n const runEnv = displayServer ? { ...env, DISPLAY: displayServer.display } : env;\n const stdin = (await options.resolveInput?.({ testCase, cwd: args.cwd, env: runEnv })) ?? testCase.input ?? '';\n currentStdin = stdin;\n const command =\n (await options.command?.({ testCase, cwd: args.cwd, env: runEnv, mainFilePath: resolvedMainFilePath })) ??\n languageDefinition.command(resolvedMainFilePath);\n\n let runResult: GuiCommandRunResult;\n try {\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n })\n : await spawnGuiProgram({\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n return;\n }\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: GuiJudgeContext = {\n timeLimitSeconds,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateGuiRunResult({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test({\n testCase,\n runResult,\n outputFiles,\n context: judgeContext,\n });\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n stdout: extendedJudgeResult.stdout,\n outputFiles: extendedJudgeResult.outputFiles,\n };\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n const decisionCode = judgeResult.decisionCode ?? DecisionCode.ACCEPTED;\n const stdout = judgeResult.stdout ?? runResult.stdout;\n const stderr = judgeResult.stderr ?? runResult.stderr;\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: runResult.status,\n stdin: runResult.stdin || undefined,\n stdout: stdout || undefined,\n stderr: stderr || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n feedbackMarkdown: judgeResult.feedbackMarkdown,\n outputFiles: judgeResult.outputFiles ?? (outputFiles.length > 0 ? outputFiles : undefined),\n });\n\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n } catch (error) {\n printTestCaseResult({\n testCaseId: currentTestCaseId,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: currentStdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n } finally {\n await displayServer?.dispose();\n }\n}\n\nasync function resolveMainFilePath(context: {\n cwd: string;\n language?: string | string[];\n configuredMainFilePath?: string;\n allowConfiguredPathFallback?: boolean;\n}): Promise<string | undefined> {\n if (context.configuredMainFilePath) {\n const resolvedPath = path.join(context.cwd, context.configuredMainFilePath);\n if (await pathExists(resolvedPath)) return context.configuredMainFilePath;\n if (!context.allowConfiguredPathFallback) return undefined;\n }\n\n return await findEntryPointFile(context.cwd, context.language);\n}\n\nfunction inferLanguageIdsByPath(filePath: string): string[] | undefined {\n const languageIds = Object.entries(languageIdToDefinition)\n .filter(([, definition]) => definition.fileExtensions.some((ext) => filePath.endsWith(ext)))\n .map(([languageId]) => languageId);\n return languageIds.length > 0 ? languageIds : undefined;\n}\n\nfunction runDefaultPrepare(context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n languageDefinition: NonNullable<ReturnType<typeof findLanguageDefinitionByPath>>;\n}): Partial<GuiJudgeCaseResult> | undefined {\n const buildCommand = context.languageDefinition.buildCommand?.(context.mainFilePath);\n if (!buildCommand) return undefined;\n\n const buildResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n BUILD_TIMEOUT_SECONDS\n );\n\n if (buildResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n return {\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n stderr: buildResult.stderr || undefined,\n };\n }\n\n if (buildResult.status !== 0) {\n return {\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: buildResult.stderr || buildResult.stdout || undefined,\n };\n }\n\n return undefined;\n}\n\nfunction evaluateGuiRunResult(context: {\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n}): Partial<GuiJudgeCaseResult> {\n if (context.runResult.stopReason === 'timeout') {\n return {\n decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n if (context.runResult.status !== 0) {\n return {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: context.runResult.stderr,\n };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return {\n decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n const requiredOutputFilesCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFilesCount) {\n return {\n decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR,\n };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n\nasync function readGuiTestCases<TTestCase extends BaseGuiTestCase>(problemDir: string): Promise<readonly TTestCase[]> {\n return (await readFileTestCases(path.join(problemDir, 'test_cases'))) as unknown as readonly TTestCase[];\n}\n\nasync function spawnGuiProgram(context: {\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n}): Promise<GuiCommandRunResult> {\n const wrappedCommand = ['timeout', context.timeLimitSeconds.toFixed(3), ...TIME_COMMAND, ...context.command] as const;\n const child = childProcess.spawn(wrappedCommand[0], wrappedCommand.slice(1), {\n cwd: context.cwd,\n env: context.env,\n detached: process.platform !== 'win32',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n let spawnError: Error | undefined;\n let stopReason: GuiCommandRunResult['stopReason'] = 'process_exit';\n const screenshotSignaturesHistory: string[][] = [];\n let screenshots: GuiScreenshotFile[] = [];\n const startTimeSeconds = Date.now() / 1000;\n let sampledMemoryBytes = 0;\n\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on('data', (chunk: string) => {\n stderr += chunk;\n });\n child.on('error', (error) => {\n spawnError = error;\n exitCode = 1;\n });\n child.on('close', (code, signal) => {\n if (code === 124) {\n stopReason = 'timeout';\n exitCode = 0;\n return;\n }\n if (signal) {\n exitCode = 1;\n stderr = stderr\n ? `${stderr}\\nprocess terminated by signal: ${signal}`\n : `process terminated by signal: ${signal}`;\n return;\n }\n exitCode = code ?? 1;\n });\n\n if (context.stdin) child.stdin.write(context.stdin);\n child.stdin.end();\n\n while (exitCode === undefined) {\n await wait(context.screenshotWaitSeconds * 1000);\n sampledMemoryBytes = Math.max(sampledMemoryBytes, readProcessGroupMemoryBytes(child.pid));\n const currentScreenshots = takeScreenshots(context.env.DISPLAY);\n screenshots = currentScreenshots.toSorted((a, b) => a.data.length - b.data.length);\n\n if (screenshots.length > 0) {\n const screenshotSignatures = screenshots.map((file) => file.data).toSorted();\n screenshotSignaturesHistory.unshift(screenshotSignatures);\n screenshotSignaturesHistory.length = Math.min(screenshotSignaturesHistory.length, context.stopDetectionThreshold);\n if (\n screenshotSignaturesHistory.length === context.stopDetectionThreshold &&\n screenshotSignaturesHistory.every(\n (files) =>\n files.length === screenshotSignatures.length &&\n files.every((file, index) => file === screenshotSignatures[index])\n )\n ) {\n stopReason = 'stable_screenshot';\n exitCode = 0;\n break;\n }\n }\n\n if (Date.now() / 1000 - startTimeSeconds > context.timeLimitSeconds) {\n stopReason = 'timeout';\n exitCode = 0;\n break;\n }\n }\n\n if (stopReason !== 'process_exit' && child.exitCode === null) {\n child.removeAllListeners('close');\n child.removeAllListeners('error');\n }\n await stopProcess(child);\n if (spawnError) throw spawnError;\n const {\n memoryBytes,\n stderr: normalizedStderr,\n timeSeconds,\n } = parseTimedStderr(stderr, startTimeSeconds, sampledMemoryBytes);\n\n return {\n stdin: context.stdin,\n stdout: stdout.trimEnd(),\n stderr: normalizedStderr,\n status: exitCode,\n timeSeconds,\n memoryBytes,\n screenshots,\n stopReason,\n };\n}\n\nfunction takeScreenshots(display: string | undefined): GuiScreenshotFile[] {\n const env = display ? { ...process.env, DISPLAY: display } : process.env;\n const xwininfo = childProcess.spawnSync('xwininfo', ['-root', '-tree'], { encoding: 'utf8', env });\n if (xwininfo.error) throw xwininfo.error;\n if (xwininfo.status !== 0 || !xwininfo.stdout) return [];\n\n const screenshots: GuiScreenshotFile[] = [];\n for (const windowId of extractTopLevelWindowIds(xwininfo.stdout)) {\n const screenshot = childProcess.spawnSync('maim', ['-i', windowId], { env });\n if (screenshot.error) throw screenshot.error;\n if (screenshot.status !== 0 || screenshot.stdout.length === 0) continue;\n\n const windowNameResult = childProcess.spawnSync('xdotool', ['getwindowname', windowId], { encoding: 'utf8', env });\n if (windowNameResult.error) throw windowNameResult.error;\n const windowName = windowNameResult.stdout.trim().replaceAll(/[\\s/]/g, '_');\n\n screenshots.push({\n path: `${windowName || 'window'}_${windowId}.png`,\n data: screenshot.stdout.toString('base64'),\n encoding: 'base64',\n });\n }\n\n return screenshots;\n}\n\nfunction extractTopLevelWindowIds(stdout: string): string[] {\n const windowIds: string[] = [];\n const lines = stdout.split('\\n');\n for (const line of lines) {\n if (line.includes('Root window id:') || line.includes('Parent window id:') || line.includes('()')) continue;\n\n const match = /^\\s{5}(0x[\\da-f]+) /.exec(line);\n if (!match?.[1]) continue;\n windowIds.push(Number.parseInt(match[1], 16).toString());\n }\n return windowIds;\n}\n\nfunction parseTimedStderr(\n stderr: string,\n startTimeSeconds: number,\n sampledMemoryBytes: number\n): Pick<GuiCommandRunResult, 'stderr' | 'timeSeconds' | 'memoryBytes'> {\n const match = /(?:^|\\n)(\\d+\\.\\d+) (\\d+)\\s*$/.exec(stderr);\n const normalizedStderr = match ? stderr.slice(0, match.index).trimEnd() : stderr.trimEnd();\n const parsedMemoryBytes = Number(match?.[2]) * 1024 || 0;\n return {\n stderr: normalizedStderr,\n timeSeconds: Number(match?.[1]) || Date.now() / 1000 - startTimeSeconds,\n memoryBytes: Math.max(parsedMemoryBytes, sampledMemoryBytes),\n };\n}\n\nasync function ensureDisplayServer(): Promise<{ display: string; dispose: () => Promise<void> }> {\n if (process.platform !== 'linux') {\n throw new Error('GUI screenshot capture is supported only on Linux.');\n }\n\n for (let displayNumber = 90; displayNumber < 100; displayNumber++) {\n const display = `:${displayNumber}`;\n let spawnError: Error | undefined;\n const xvfb = childProcess.spawn('Xvfb', [display, '-screen', '0', '1280x1024x24', '-ac'], {\n stdio: 'ignore',\n });\n xvfb.on('error', (error) => {\n spawnError = error;\n });\n\n await wait(XVFB_STARTUP_WAIT_SECONDS * 1000);\n if (spawnError) throw spawnError;\n if (xvfb.exitCode !== null) continue;\n\n return {\n display,\n dispose: async () => {\n if (!xvfb.killed) {\n xvfb.kill('SIGTERM');\n await wait(XVFB_SHUTDOWN_WAIT_SECONDS * 1000);\n if (xvfb.exitCode === null) xvfb.kill('SIGKILL');\n }\n },\n };\n }\n\n throw new Error('Xvfb could not be started.');\n}\n\nasync function stopProcess(child: childProcess.ChildProcess): Promise<void> {\n if (!child.pid) return;\n killProcessGroup(child.pid, 'SIGTERM');\n await wait(PROCESS_SHUTDOWN_WAIT_SECONDS * 1000);\n if (child.exitCode === null) killProcessGroup(child.pid, 'SIGKILL');\n}\n\nfunction readProcessGroupMemoryBytes(processGroupId: number | undefined): number {\n if (!processGroupId || process.platform !== 'linux') return 0;\n\n const result = childProcess.spawnSync('ps', ['-o', 'rss=', '--no-headers', '--pgroup', String(processGroupId)], {\n encoding: 'utf8',\n });\n if (result.error || result.status !== 0 || !result.stdout) return 0;\n\n return result.stdout\n .split('\\n')\n .map((line) => Number(line.trim()))\n .filter((value) => Number.isFinite(value) && value > 0)\n .reduce((sum, value) => sum + value * 1024, 0);\n}\n\nfunction killProcessGroup(processGroupId: number, signal: NodeJS.Signals): void {\n try {\n if (process.platform !== 'win32') {\n process.kill(-processGroupId, signal);\n return;\n }\n } catch {\n // The process group may already be gone. Fall back to the direct PID below.\n }\n\n try {\n process.kill(processGroupId, signal);\n } catch {\n // The direct child may also already be gone.\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"names":["TIME_COMMAND","os","platform","judgeParamsSchema","z","object","language","union","string","array","optional","guiCommandJudgePreset","_x","_x2","_guiCommandJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","_options$readTestCase","_testCases$0$id","_testCases$","_options$mainFilePath","_yield$options$prepar","_options$prepare","args","params","problemMarkdownFrontMatter","configuredTestCases","testCases","prebuildTestCaseId","staticAnalysisResult","initialMainFilePath","languageDefinition","env","resolvedMainFilePath","_params$language","prebuiltMainFilePath","prepareResult","_prepareResult$decisi","cwdSnapshot","displayServer","currentTestCaseId","currentStdin","_shared","sharedFileInputPath","_iterator2","_step2","_options$runTimeoutSe","_ref5","_yield$options$resolv","_options$resolveInput","_yield$options$comman","_options$command","_problemMarkdownFront","_judgeResult$decision","_judgeResult$stdout","_judgeResult$stderr","_judgeResult$outputFi","testCase","timeLimitSeconds","runEnv","stdin","command","runResult","_options$screenshotWa","_options$stopDetectio","_options$screenshotWa2","_options$stopDetectio2","outputFiles","judgeContext","baseJudgeResult","judgeResult","_extendedJudgeResult$","extendedJudgeResult","decisionCode","stdout","stderr","_displayServer","_t","_t2","_t4","_t5","_t7","_t9","_t1","_t10","_t11","_t12","_t13","_t14","w","_context","p","n","parseArgs","process","argv","cwd","Error","parse","readProblemMarkdownFrontMatter","v","readTestCases","readGuiTestCases","length","id","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","a","mainFilePath","findEntryPointFile","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","resolveMainFilePath","configuredMainFilePath","prebuild","inferLanguageIdsByPath","allowConfiguredPathFallback","BUILD_ERROR","errorToMessage","prepare","call","runDefaultPrepare","feedbackMarkdown","snapshotWorkingDirectory","runCommand","undefined","ensureDisplayServer","shared","fileInputPath","_createForOfIteratorHelper","s","done","value","copyTestCaseFileInput","timeLimitMs","runTimeoutSeconds","DISPLAY","display","resolveInput","input","screenshotWaitSeconds","stopDetectionThreshold","spawnGuiProgram","RUNTIME_ERROR","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","memoryLimitByte","evaluateGuiRunResult","context","ACCEPTED","test","exitStatus","status","timeSeconds","memoryBytes","e","f","dispose","_x3","_resolveMainFilePath","_callee2","resolvedPath","_context2","path","join","pathExists","filePath","languageIds","Object","entries","languageIdToDefinition","filter","_ref","_slicedToArray","fileExtensions","some","ext","endsWith","map","_ref3","_context$languageDefi","_context$languageDefi2","buildCommand","buildResult","spawnSyncWithTimeout","slice","encoding","BUILD_TIME_LIMIT_EXCEEDED","_context$context$prob","_context$context$prob2","_context$context$prob3","stopReason","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","requiredOutputFilesCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x4","_readGuiTestCases","_callee3","_context3","readFileTestCases","_x5","_spawnGuiProgram","_callee4","wrappedCommand","child","exitCode","spawnError","screenshotSignaturesHistory","screenshots","startTimeSeconds","sampledMemoryBytes","_loop","_parseTimedStderr","normalizedStderr","_context5","toFixed","_toConsumableArray","childProcess","spawn","detached","stdio","setEncoding","Date","now","on","chunk","error","code","signal","write","end","currentScreenshots","screenshotSignatures","_context4","wait","Math","max","readProcessGroupMemoryBytes","pid","takeScreenshots","toSorted","b","data","file","unshift","min","every","files","index","d","_regeneratorValues","removeAllListeners","stopProcess","parseTimedStderr","trimEnd","xwininfo","spawnSync","_i","_extractTopLevelWindo","_step","windowIds","lines","split","_iterator","line","includes","match","exec","push","parseInt","toString","err","extractTopLevelWindowIds","windowId","screenshot","windowNameResult","windowName","trim","replaceAll","parsedMemoryBytes","_ensureDisplayServer","_callee6","_loop2","_ret2","displayNumber","_context8","xvfb","_context7","XVFB_STARTUP_WAIT_SECONDS","_dispose","_callee5","_context6","killed","kill","XVFB_SHUTDOWN_WAIT_SECONDS","_x6","_stopProcess","_callee7","_context9","killProcessGroup","PROCESS_SHUTDOWN_WAIT_SECONDS","processGroupId","result","String","isFinite","reduce","sum","_unused","_unused2","_x7","_pathExists","_callee8","_context0","fs","access","message"],"mappings":"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"} | ||
| {"version":3,"file":"guiCommand.js","names":["readFileTestCases","wait"],"sources":["../../src/presets/guiCommand.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { setTimeout as wait } from 'node:timers/promises';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport { languageIdToDefinition } from '../types/language.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 = 5;\nconst SCREENSHOT_WAIT_SECONDS = 0.3;\nconst XVFB_STARTUP_WAIT_SECONDS = 0.3;\nconst XVFB_SHUTDOWN_WAIT_SECONDS = 0.1;\nconst PROCESS_SHUTDOWN_WAIT_SECONDS = 0.2;\nconst STOP_DETECTION_THRESHOLD = 5;\nconst TIME_COMMAND = [os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time', '--format', '%e %M'] as const;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ninterface BaseGuiTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\nexport interface GuiScreenshotFile {\n path: string;\n data: string;\n encoding: 'base64';\n}\n\nexport interface GuiCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n screenshots: GuiScreenshotFile[];\n stopReason: 'process_exit' | 'stable_screenshot' | 'timeout';\n}\n\ninterface GuiJudgeContext {\n timeLimitSeconds: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\ntype GuiJudgeCaseResult = Pick<\n TestCaseResult,\n 'decisionCode' | 'feedbackMarkdown' | 'stderr' | 'stdout' | 'outputFiles'\n>;\n\nexport interface GuiCommandJudgePresetOptions<TTestCase extends BaseGuiTestCase = BaseGuiTestCase> {\n mainFilePath?: string;\n runTimeoutSeconds?: number;\n screenshotWaitSeconds?: number;\n stopDetectionThreshold?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n prepare?: (context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n problemMarkdownFrontMatter: ProblemMarkdownFrontMatter;\n }) => Promise<Partial<GuiJudgeCaseResult> | undefined> | Partial<GuiJudgeCaseResult> | undefined;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n command?: (context: {\n testCase: TTestCase;\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n }) => Promise<readonly [string, ...string[]]> | readonly [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 screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n }) => Promise<GuiCommandRunResult> | GuiCommandRunResult;\n test: (context: {\n testCase: TTestCase;\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n }) => Promise<Partial<GuiJudgeCaseResult>> | Partial<GuiJudgeCaseResult>;\n}\n\n/**\n * A preset function for judging GUI programs by collecting screenshots while the program runs.\n *\n * Keep problem-specific logic in `prepare`, `command`, and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { DecisionCode } from '@exercode/problem-utils';\n * import { guiCommandJudgePreset } from '@exercode/problem-utils/presets/guiCommand';\n *\n * await guiCommandJudgePreset(import.meta.dirname, {\n * mainFilePath: 'Main.java',\n * readTestCases: async () => [{ id: 'default' }],\n * test: ({ runResult }) => {\n * return runResult.screenshots.length > 0\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n */\nexport async function guiCommandJudgePreset<TTestCase extends BaseGuiTestCase = BaseGuiTestCase>(\n problemDir: string,\n options: GuiCommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const configuredTestCases = await (options.readTestCases ?? readGuiTestCases<TTestCase>)(problemDir);\n const testCases =\n configuredTestCases.length > 0 ? configuredTestCases : ([{ id: 'default' }] as unknown as readonly TTestCase[]);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n\n const staticAnalysisResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return;\n }\n\n const initialMainFilePath = options.mainFilePath ?? (await findEntryPointFile(args.cwd, params.language));\n if (!initialMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(initialMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let resolvedMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language,\n configuredMainFilePath: options.mainFilePath,\n });\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n const prebuiltMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language ?? inferLanguageIdsByPath(initialMainFilePath),\n configuredMainFilePath: options.mainFilePath,\n allowConfiguredPathFallback: true,\n });\n if (prebuiltMainFilePath) resolvedMainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: errorToMessage(error),\n });\n return;\n }\n }\n if (!resolvedMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const prepareResult =\n (await options.prepare?.({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n problemMarkdownFrontMatter,\n })) ??\n runDefaultPrepare({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n languageDefinition,\n });\n if (prepareResult) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: prepareResult.decisionCode ?? DecisionCode.BUILD_ERROR,\n feedbackMarkdown: prepareResult.feedbackMarkdown,\n stderr: prepareResult.stderr,\n stdout: prepareResult.stdout,\n outputFiles: prepareResult.outputFiles,\n });\n return;\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n let displayServer: Awaited<ReturnType<typeof ensureDisplayServer>> | undefined;\n let currentTestCaseId = prebuildTestCaseId;\n let currentStdin: string | undefined;\n try {\n displayServer = options.runCommand ? undefined : await ensureDisplayServer();\n const sharedFileInputPath = (configuredTestCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n for (const testCase of testCases) {\n currentTestCaseId = testCase.id;\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : (options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS);\n\n const runEnv = displayServer ? { ...env, DISPLAY: displayServer.display } : env;\n const stdin = (await options.resolveInput?.({ testCase, cwd: args.cwd, env: runEnv })) ?? testCase.input ?? '';\n currentStdin = stdin;\n const command =\n (await options.command?.({ testCase, cwd: args.cwd, env: runEnv, mainFilePath: resolvedMainFilePath })) ??\n languageDefinition.command(resolvedMainFilePath);\n\n let runResult: GuiCommandRunResult;\n try {\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n })\n : await spawnGuiProgram({\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n return;\n }\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: GuiJudgeContext = {\n timeLimitSeconds,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateGuiRunResult({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test({\n testCase,\n runResult,\n outputFiles,\n context: judgeContext,\n });\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n stdout: extendedJudgeResult.stdout,\n outputFiles: extendedJudgeResult.outputFiles,\n };\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n const decisionCode = judgeResult.decisionCode ?? DecisionCode.ACCEPTED;\n const stdout = judgeResult.stdout ?? runResult.stdout;\n const stderr = judgeResult.stderr ?? runResult.stderr;\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: runResult.status,\n stdin: runResult.stdin || undefined,\n stdout: stdout || undefined,\n stderr: stderr || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n feedbackMarkdown: judgeResult.feedbackMarkdown,\n outputFiles: judgeResult.outputFiles ?? (outputFiles.length > 0 ? outputFiles : undefined),\n });\n\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n } catch (error) {\n printTestCaseResult({\n testCaseId: currentTestCaseId,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: currentStdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n } finally {\n await displayServer?.dispose();\n }\n}\n\nasync function resolveMainFilePath(context: {\n cwd: string;\n language?: string | string[];\n configuredMainFilePath?: string;\n allowConfiguredPathFallback?: boolean;\n}): Promise<string | undefined> {\n if (context.configuredMainFilePath) {\n const resolvedPath = path.join(context.cwd, context.configuredMainFilePath);\n if (await pathExists(resolvedPath)) return context.configuredMainFilePath;\n if (!context.allowConfiguredPathFallback) return undefined;\n }\n\n return await findEntryPointFile(context.cwd, context.language);\n}\n\nfunction inferLanguageIdsByPath(filePath: string): string[] | undefined {\n const languageIds = Object.entries(languageIdToDefinition)\n .filter(([, definition]) => definition.fileExtensions.some((ext) => filePath.endsWith(ext)))\n .map(([languageId]) => languageId);\n return languageIds.length > 0 ? languageIds : undefined;\n}\n\nfunction runDefaultPrepare(context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n languageDefinition: NonNullable<ReturnType<typeof findLanguageDefinitionByPath>>;\n}): Partial<GuiJudgeCaseResult> | undefined {\n const buildCommand = context.languageDefinition.buildCommand?.(context.mainFilePath);\n if (!buildCommand) return undefined;\n\n const buildResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n BUILD_TIMEOUT_SECONDS\n );\n\n if (buildResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n return {\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n stderr: buildResult.stderr || undefined,\n };\n }\n\n if (buildResult.status !== 0) {\n return {\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: buildResult.stderr || buildResult.stdout || undefined,\n };\n }\n\n return undefined;\n}\n\nfunction evaluateGuiRunResult(context: {\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n}): Partial<GuiJudgeCaseResult> {\n if (context.runResult.stopReason === 'timeout') {\n return {\n decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n if (context.runResult.status !== 0) {\n return {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: context.runResult.stderr,\n };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return {\n decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n const requiredOutputFilesCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFilesCount) {\n return {\n decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR,\n };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n\nasync function readGuiTestCases<TTestCase extends BaseGuiTestCase>(problemDir: string): Promise<readonly TTestCase[]> {\n return (await readFileTestCases(path.join(problemDir, 'test_cases'))) as unknown as readonly TTestCase[];\n}\n\nasync function spawnGuiProgram(context: {\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n}): Promise<GuiCommandRunResult> {\n const wrappedCommand = ['timeout', context.timeLimitSeconds.toFixed(3), ...TIME_COMMAND, ...context.command] as const;\n const child = childProcess.spawn(wrappedCommand[0], wrappedCommand.slice(1), {\n cwd: context.cwd,\n env: context.env,\n detached: process.platform !== 'win32',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n let spawnError: Error | undefined;\n let stopReason: GuiCommandRunResult['stopReason'] = 'process_exit';\n const screenshotSignaturesHistory: string[][] = [];\n let screenshots: GuiScreenshotFile[] = [];\n const startTimeSeconds = Date.now() / 1000;\n let sampledMemoryBytes = 0;\n\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on('data', (chunk: string) => {\n stderr += chunk;\n });\n child.on('error', (error) => {\n spawnError = error;\n exitCode = 1;\n });\n child.on('close', (code, signal) => {\n if (code === 124) {\n stopReason = 'timeout';\n exitCode = 0;\n return;\n }\n if (signal) {\n exitCode = 1;\n stderr = stderr\n ? `${stderr}\\nprocess terminated by signal: ${signal}`\n : `process terminated by signal: ${signal}`;\n return;\n }\n exitCode = code ?? 1;\n });\n\n if (context.stdin) child.stdin.write(context.stdin);\n child.stdin.end();\n\n while (exitCode === undefined) {\n await wait(context.screenshotWaitSeconds * 1000);\n sampledMemoryBytes = Math.max(sampledMemoryBytes, readProcessGroupMemoryBytes(child.pid));\n const currentScreenshots = takeScreenshots(context.env.DISPLAY);\n screenshots = currentScreenshots.toSorted((a, b) => a.data.length - b.data.length);\n\n if (screenshots.length > 0) {\n const screenshotSignatures = screenshots.map((file) => file.data).toSorted();\n screenshotSignaturesHistory.unshift(screenshotSignatures);\n screenshotSignaturesHistory.length = Math.min(screenshotSignaturesHistory.length, context.stopDetectionThreshold);\n if (\n screenshotSignaturesHistory.length === context.stopDetectionThreshold &&\n screenshotSignaturesHistory.every(\n (files) =>\n files.length === screenshotSignatures.length &&\n files.every((file, index) => file === screenshotSignatures[index])\n )\n ) {\n stopReason = 'stable_screenshot';\n exitCode = 0;\n break;\n }\n }\n\n if (Date.now() / 1000 - startTimeSeconds > context.timeLimitSeconds) {\n stopReason = 'timeout';\n exitCode = 0;\n break;\n }\n }\n\n if (stopReason !== 'process_exit' && child.exitCode === null) {\n child.removeAllListeners('close');\n child.removeAllListeners('error');\n }\n await stopProcess(child);\n if (spawnError) throw spawnError;\n const {\n memoryBytes,\n stderr: normalizedStderr,\n timeSeconds,\n } = parseTimedStderr(stderr, startTimeSeconds, sampledMemoryBytes);\n\n return {\n stdin: context.stdin,\n stdout: stdout.trimEnd(),\n stderr: normalizedStderr,\n status: exitCode,\n timeSeconds,\n memoryBytes,\n screenshots,\n stopReason,\n };\n}\n\nfunction takeScreenshots(display: string | undefined): GuiScreenshotFile[] {\n const env = display ? { ...process.env, DISPLAY: display } : process.env;\n const xwininfo = childProcess.spawnSync('xwininfo', ['-root', '-tree'], { encoding: 'utf8', env });\n if (xwininfo.error) throw xwininfo.error;\n if (xwininfo.status !== 0 || !xwininfo.stdout) return [];\n\n const screenshots: GuiScreenshotFile[] = [];\n for (const windowId of extractTopLevelWindowIds(xwininfo.stdout)) {\n const screenshot = childProcess.spawnSync('maim', ['-i', windowId], { env });\n if (screenshot.error) throw screenshot.error;\n if (screenshot.status !== 0 || screenshot.stdout.length === 0) continue;\n\n const windowNameResult = childProcess.spawnSync('xdotool', ['getwindowname', windowId], { encoding: 'utf8', env });\n if (windowNameResult.error) throw windowNameResult.error;\n const windowName = windowNameResult.stdout.trim().replaceAll(/[\\s/]/g, '_');\n\n screenshots.push({\n path: `${windowName || 'window'}_${windowId}.png`,\n data: screenshot.stdout.toString('base64'),\n encoding: 'base64',\n });\n }\n\n return screenshots;\n}\n\nfunction extractTopLevelWindowIds(stdout: string): string[] {\n const windowIds: string[] = [];\n const lines = stdout.split('\\n');\n for (const line of lines) {\n if (line.includes('Root window id:') || line.includes('Parent window id:') || line.includes('()')) continue;\n\n const match = /^\\s{5}(0x[\\da-f]+) /.exec(line);\n if (!match?.[1]) continue;\n windowIds.push(Number.parseInt(match[1], 16).toString());\n }\n return windowIds;\n}\n\nfunction parseTimedStderr(\n stderr: string,\n startTimeSeconds: number,\n sampledMemoryBytes: number\n): Pick<GuiCommandRunResult, 'stderr' | 'timeSeconds' | 'memoryBytes'> {\n const match = /(?:^|\\n)(\\d+\\.\\d+) (\\d+)\\s*$/.exec(stderr);\n const normalizedStderr = match ? stderr.slice(0, match.index).trimEnd() : stderr.trimEnd();\n const parsedMemoryBytes = Number(match?.[2]) * 1024 || 0;\n return {\n stderr: normalizedStderr,\n timeSeconds: Number(match?.[1]) || Date.now() / 1000 - startTimeSeconds,\n memoryBytes: Math.max(parsedMemoryBytes, sampledMemoryBytes),\n };\n}\n\nasync function ensureDisplayServer(): Promise<{ display: string; dispose: () => Promise<void> }> {\n if (process.platform !== 'linux') {\n throw new Error('GUI screenshot capture is supported only on Linux.');\n }\n\n for (let displayNumber = 90; displayNumber < 100; displayNumber++) {\n const display = `:${displayNumber}`;\n let spawnError: Error | undefined;\n const xvfb = childProcess.spawn('Xvfb', [display, '-screen', '0', '1280x1024x24', '-ac'], {\n stdio: 'ignore',\n });\n xvfb.on('error', (error) => {\n spawnError = error;\n });\n\n await wait(XVFB_STARTUP_WAIT_SECONDS * 1000);\n if (spawnError) throw spawnError;\n if (xvfb.exitCode !== null) continue;\n\n return {\n display,\n dispose: async () => {\n if (!xvfb.killed) {\n xvfb.kill('SIGTERM');\n await wait(XVFB_SHUTDOWN_WAIT_SECONDS * 1000);\n if (xvfb.exitCode === null) xvfb.kill('SIGKILL');\n }\n },\n };\n }\n\n throw new Error('Xvfb could not be started.');\n}\n\nasync function stopProcess(child: childProcess.ChildProcess): Promise<void> {\n if (!child.pid) return;\n killProcessGroup(child.pid, 'SIGTERM');\n await wait(PROCESS_SHUTDOWN_WAIT_SECONDS * 1000);\n if (child.exitCode === null) killProcessGroup(child.pid, 'SIGKILL');\n}\n\nfunction readProcessGroupMemoryBytes(processGroupId: number | undefined): number {\n if (!processGroupId || process.platform !== 'linux') return 0;\n\n const result = childProcess.spawnSync('ps', ['-o', 'rss=', '--no-headers', '--pgroup', String(processGroupId)], {\n encoding: 'utf8',\n });\n if (result.error || result.status !== 0 || !result.stdout) return 0;\n\n return result.stdout\n .split('\\n')\n .map((line) => Number(line.trim()))\n .filter((value) => Number.isFinite(value) && value > 0)\n .reduce((sum, value) => sum + value * 1024, 0);\n}\n\nfunction killProcessGroup(processGroupId: number, signal: NodeJS.Signals): void {\n try {\n if (process.platform !== 'win32') {\n process.kill(-processGroupId, signal);\n return;\n }\n } catch {\n // The process group may already be gone. Fall back to the direct PID below.\n }\n\n try {\n process.kill(processGroupId, signal);\n } catch {\n // The direct child may also already be gone.\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:fs"),t=require("node:path"),s=require("@ai-sdk/amazon-bedrock"),n=require("@ai-sdk/google"),a=require("@ai-sdk/openai"),o=require("@ai-sdk/xai"),i=require("ai"),u=require("zod"),c=require("../helpers/parseArgs.cjs"),d=require("../helpers/printTestCaseResult.cjs"),l=require("../helpers/readTestCases.cjs"),p=require("../types/decisionCode.cjs"),C={bedrock:s.bedrock,google:n.google,openai:a.openai,xai:o.xai},m=u.z.object({model:u.z.string().min(1)});function f(){return(f=e.asyncToGenerator(e.regenerator().m(function s(n,a){var o,u,C,f,v,b,q,w,k,T,h,E,j,D,x,R,A,y,P,z;return e.regenerator().w(function(s){for(;;)switch(s.p=s.n){case 0:if((o=c.parseArgs(process.argv)).cwd){s.n=1;break}throw new Error("cwd argument required");case 1:return u=m.parse(o.params),s.n=2,l.readTestCases(t.join(n,"test_cases"));case 2:return C=s.v,s.n=3,r.promises.readFile(t.join(o.cwd,"prompt.txt"),"utf8");case 3:f=s.v,v=e.createForOfIteratorHelper(C),s.p=4,v.s();case 5:if((b=v.n()).done){s.n=12;break}return q=b.value,w=Date.now(),s.p=6,s.n=7,i.generateText({model:g(u.model),prompt:null!=(k=null==(T=a.buildPrompt)?void 0:T.call(a,{prompt:f,testCase:q}))?k:f.replaceAll("{input}",null!=(h=q.input)?h:"")});case 7:return E=s.v,j=E.text,D=Date.now(),A=e.objectSpread2,y={testCaseId:q.id,decisionCode:p.DecisionCode.ACCEPTED,stdin:q.input,stdout:j,timeSeconds:(D-w)/1e3},s.n=8,a.test({testCase:q,result:{output:j}});case 8:if(x=A(y,s.v),d.printTestCaseResult(x),x.decisionCode===p.DecisionCode.ACCEPTED){s.n=9;break}return s.a(3,12);case 9:s.n=11;break;case 10:return s.p=10,P=s.v,R=Date.now(),d.printTestCaseResult({testCaseId:q.id,decisionCode:p.DecisionCode.RUNTIME_ERROR,stdin:q.input,stderr:P instanceof Error?P.message:String(P),timeSeconds:(R-w)/1e3}),s.a(3,12);case 11:s.n=5;break;case 12:s.n=14;break;case 13:s.p=13,z=s.v,v.e(z);case 14:return s.p=14,v.f(),s.f(14);case 15:return s.a(2)}},s,null,[[6,10],[4,13,14,15]])}))).apply(this,arguments)}function g(r){var t,s=r.split("/"),n=e.slicedToArray(s,2),a=n[0],o=n[1];if(!a||!o)throw new Error("bad model: ".concat(r));var i=null==(t=C[a])?void 0:t.call(C,o);if(!i)throw new Error("model not found: ".concat(r));return i}exports.llmJudgePreset=function(e,r){return f.apply(this,arguments)}; | ||
| //# sourceMappingURL=llm.cjs.map | ||
| "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/parseArgs.cjs"),n=require("../helpers/printTestCaseResult.cjs"),r=require("../types/decisionCode.cjs"),i=require("../helpers/readTestCases.cjs");let a=require("zod"),o=require("node:path");o=e.__toESM(o,1);let s=require("node:fs");s=e.__toESM(s,1);let c=require("@ai-sdk/amazon-bedrock"),l=require("@ai-sdk/google"),u=require("@ai-sdk/openai"),d=require("@ai-sdk/xai"),f=require("ai");const p={bedrock:c.bedrock,google:l.google,openai:u.openai,xai:d.xai},m=a.z.object({model:a.z.string().min(1)});async function h(e,a){let c=t.parseArgs(process.argv);if(!c.cwd)throw Error(`cwd argument required`);let l=m.parse(c.params),u=await i.readTestCases(o.default.join(e,`test_cases`)),d=await s.default.promises.readFile(o.default.join(c.cwd,`prompt.txt`),`utf8`);for(let e of u){let t=Date.now();try{let{text:i}=await(0,f.generateText)({model:g(l.model),prompt:a.buildPrompt?.({prompt:d,testCase:e})??d.replaceAll(`{input}`,e.input??``)}),o=Date.now(),s={testCaseId:e.id,decisionCode:r.DecisionCode.ACCEPTED,stdin:e.input,stdout:i,timeSeconds:(o-t)/1e3,...await a.test({testCase:e,result:{output:i}})};if(n.printTestCaseResult(s),s.decisionCode!==r.DecisionCode.ACCEPTED)break}catch(i){let a=Date.now();n.printTestCaseResult({testCaseId:e.id,decisionCode:r.DecisionCode.RUNTIME_ERROR,stdin:e.input,stderr:i instanceof Error?i.message:String(i),timeSeconds:(a-t)/1e3});break}}}function g(e){let[t,n]=e.split(`/`);if(!t||!n)throw Error(`bad model: ${e}`);let r=p[t]?.(n);if(!r)throw Error(`model not found: ${e}`);return r}exports.llmJudgePreset=h; | ||
| //# sourceMappingURL=llm.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"llm.cjs","sources":["../../src/presets/llm.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { bedrock } from '@ai-sdk/amazon-bedrock';\nimport { google } from '@ai-sdk/google';\nimport { openai } from '@ai-sdk/openai';\nimport { xai } from '@ai-sdk/xai';\nimport type { LanguageModel, ModelMessage } from 'ai';\nimport { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst PROMPT_FILENAME = 'prompt.txt';\n\nconst providerByName: Record<string, typeof bedrock | typeof google | typeof openai | typeof xai> = {\n // requires `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`\n bedrock,\n // requires `GOOGLE_GENERATIVE_AI_API_KEY`\n google,\n // requires `OPENAI_API_KEY`\n openai,\n // requires `XAI_API_KEY`\n xai,\n} as const;\n\nconst judgeParamsSchema = z.object({\n model: z.string().min(1),\n});\n\ninterface LlmJudgePresetOptions {\n buildPrompt?: (context: {\n prompt: string;\n testCase: { id: string; input?: string; output?: string };\n }) => string | ModelMessage[];\n test: (context: {\n testCase: { id: string; input?: string; output?: string };\n result: { output: string };\n }) => Partial<TestCaseResult> | Promise<Partial<TestCaseResult>>;\n}\n\n/**\n * A preset judge function for running and testing a user prompt in LLM.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { llmJudgePreset } from '@exercode/problem-utils/presets/llm';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await llmJudgePreset(import.meta.dirname, {\n * test: (context) {\n * return { decisionCode: context.result.output ? DecisionCode.ACCEPTED : DecisionCode.WRONG_ANSWER };\n * }\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"model\": \"gemini-2.5-flash-lite\" }'\n * ```\n */\nexport async function llmJudgePreset(problemDir: string, options: LlmJudgePresetOptions): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const prompt = await fs.promises.readFile(path.join(args.cwd, PROMPT_FILENAME), 'utf8');\n\n for (const testCase of testCases) {\n const startTimeMilliseconds = Date.now();\n try {\n const { text } = await generateText({\n model: toLanguageModel(params.model),\n prompt: options.buildPrompt?.({ prompt, testCase }) ?? prompt.replaceAll('{input}', testCase.input ?? ''),\n });\n\n const stopTimeMilliseconds = Date.now();\n\n const testCaseResult = {\n testCaseId: testCase.id,\n decisionCode: DecisionCode.ACCEPTED,\n stdin: testCase.input,\n stdout: text,\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n ...(await options.test({ testCase, result: { output: text } })),\n };\n\n printTestCaseResult(testCaseResult);\n\n if (testCaseResult.decisionCode !== DecisionCode.ACCEPTED) break;\n } catch (error) {\n const stopTimeMilliseconds = Date.now();\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: testCase.input,\n stderr: error instanceof Error ? error.message : String(error),\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n });\n\n break;\n }\n }\n}\n\nfunction toLanguageModel(model: string): LanguageModel {\n const [providerId, modelId] = model.split('/');\n if (!providerId || !modelId) throw new Error(`bad model: ${model}`);\n const languageModel = providerByName[providerId]?.(modelId);\n if (!languageModel) throw new Error(`model not found: ${model}`);\n return languageModel;\n}\n"],"names":["providerByName","bedrock","google","openai","xai","judgeParamsSchema","z","object","model","string","min","_llmJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","testCases","prompt","_iterator","_step","testCase","startTimeMilliseconds","_options$buildPrompt","_options$buildPrompt2","_testCase$input","_yield$generateText","text","stopTimeMilliseconds","testCaseResult","_stopTimeMilliseconds","_t","_t2","_t3","_t4","w","_context","p","n","parseArgs","process","argv","cwd","Error","parse","readTestCases","path","join","v","fs","promises","readFile","_createForOfIteratorHelper","s","done","value","Date","now","generateText","toLanguageModel","buildPrompt","call","replaceAll","input","_objectSpread","testCaseId","id","decisionCode","DecisionCode","ACCEPTED","stdin","stdout","timeSeconds","test","result","output","printTestCaseResult","a","RUNTIME_ERROR","stderr","message","String","e","f","apply","this","arguments","_providerByName$provi","_model$split","split","_model$split2","_slicedToArray","providerId","modelId","concat","languageModel","_x","_x2"],"mappings":"ibAmBMA,EAA8F,CAElGC,QAAAA,EAAAA,QAEAC,OAAAA,EAAAA,OAEAC,OAAAA,EAAAA,OAEAC,IAAAA,EAAAA,KAGIC,EAAoBC,EAAAA,EAAEC,OAAO,CACjCC,MAAOF,EAAAA,EAAEG,SAASC,IAAI,KAgFvB,SAAAC,IAAA,OAAAA,EAAAC,EAAAA,iBAAAC,gBAAAC,EA7CM,SAAAC,EAA8BC,EAAoBC,GAA8B,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAxB,gBAAAyB,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EACjD,IAA9BvB,EAAOwB,EAAAA,UAAUC,QAAQC,OACrBC,IAAG,CAAAN,EAAAE,EAAA,EAAA,KAAA,CAAA,MAAQ,IAAIK,MAAM,yBAAwB,KAAA,EACJ,OAA7C3B,EAASd,EAAkB0C,MAAM7B,EAAKC,QAAOoB,EAAAE,EAAA,EAE3BO,EAAAA,cAAcC,EAAKC,KAAKlC,EAAY,eAAc,KAAA,EAA3D,OAATI,EAASmB,EAAAY,EAAAZ,EAAAE,EAAA,EAEMW,EAAGC,SAASC,SAASL,EAAKC,KAAKhC,EAAK2B,IAxDnC,cAwD0D,QAAO,KAAA,EAAjFxB,EAAMkB,EAAAY,EAAA7B,EAAAiC,EAAAA,0BAEWnC,GAASmB,EAAAC,EAAA,EAAAlB,EAAAkC,IAAA,KAAA,EAAA,IAAAjC,EAAAD,EAAAmB,KAAAgB,KAAA,CAAAlB,EAAAE,EAAA,GAAA,KAAA,CACU,OAD/BjB,EAAQD,EAAAmC,MACXjC,EAAwBkC,KAAKC,MAAKrB,EAAAC,EAAA,EAAAD,EAAAE,EAAA,EAEfoB,eAAa,CAClCrD,MAAOsD,EAAgB3C,EAAOX,OAC9Ba,OAAmD,OAA7CK,EAAqB,OAArBC,EAAEV,EAAQ8C,kBAAW,EAAnBpC,EAAAqC,KAAA/C,EAAsB,CAAEI,OAAAA,EAAQG,SAAAA,KAAWE,EAAIL,EAAO4C,WAAW,UAAyB,OAAhBrC,EAAEJ,EAAS0C,OAAKtC,EAAI,MACtG,KAAA,EASkE,OATlEC,EAAAU,EAAAY,EAHMrB,EAAID,EAAJC,KAKFC,EAAuB4B,KAAKC,MAAK1B,EAAAiC,EAAAA,cAAAhC,EAAA,CAGrCiC,WAAY5C,EAAS6C,GACrBC,aAAcC,EAAAA,aAAaC,SAC3BC,MAAOjD,EAAS0C,MAChBQ,OAAQ5C,EACR6C,aAAc5C,EAAuBN,GAAyB,KAAIc,EAAAE,EAAA,EACxDxB,EAAQ2D,KAAK,CAAEpD,SAAAA,EAAUqD,OAAQ,CAAEC,OAAQhD,KAAS,KAAA,EAG5B,GAT9BE,EAAcE,EAAAC,EAAAI,EAAAY,GASpB4B,EAAAA,oBAAoB/C,GAEhBA,EAAesC,eAAiBC,EAAAA,aAAaC,SAAQ,CAAAjC,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAyC,EAAA,EAAA,IAAA,KAAA,EAAAzC,EAAAE,EAAA,GAAA,MAAA,KAAA,GAUtD,OAVsDF,EAAAC,EAAA,GAAAJ,EAAAG,EAAAY,EAEnDpB,EAAuB4B,KAAKC,MAElCmB,sBAAoB,CAClBX,WAAY5C,EAAS6C,GACrBC,aAAcC,EAAAA,aAAaU,cAC3BR,MAAOjD,EAAS0C,MAChBgB,OAAQ9C,aAAiBU,MAAQV,EAAM+C,QAAUC,OAAMhD,GACvDuC,aAAc5C,EAAuBN,GAAyB,MAC7Dc,EAAAyC,EAAA,EAAA,IAAA,KAAA,GAAAzC,EAAAE,EAAA,EAAA,MAAA,KAAA,GAAAF,EAAAE,EAAA,GAAA,MAAA,KAAA,GAAAF,EAAAC,EAAA,GAAAH,EAAAE,EAAAY,EAAA7B,EAAA+D,EAAAhD,GAAA,KAAA,GAAA,OAAAE,EAAAC,EAAA,GAAAlB,EAAAgE,IAAA/C,EAAA+C,EAAA,IAAA,KAAA,GAAA,OAAA/C,EAAAyC,EAAA,GAAA,EAAAjE,EAAA,KAAA,CAAA,CAAA,EAAA,IAAA,CAAA,EAAA,GAAA,GAAA,KAAA,KAKRwE,MAAAC,KAAAC,UAAA,CAED,SAAS3B,EAAgBtD,GAA8B,IAAAkF,EACrDC,EAA8BnF,EAAMoF,MAAM,KAAIC,EAAAC,EAAAA,cAAAH,EAAA,GAAvCI,EAAUF,EAAA,GAAEG,EAAOH,EAAA,GAC1B,IAAKE,IAAeC,EAAS,MAAM,IAAIlD,MAAK,cAAAmD,OAAezF,IAC3D,IAAM0F,EAA0C,OAA7BR,EAAG1F,EAAe+F,SAAW,EAA1BL,EAAA1B,KAAAhE,EAA6BgG,GACnD,IAAKE,EAAe,MAAM,IAAIpD,MAAK,oBAAAmD,OAAqBzF,IACxD,OAAO0F,CACT,wBArDA,SAAoCC,EAAAC,GAAA,OAAAzF,EAAA4E,MAAAC,KAAAC,UAAA"} | ||
| {"version":3,"file":"llm.cjs","names":["z","parseArgs","readTestCases","path","fs","DecisionCode"],"sources":["../../src/presets/llm.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { bedrock } from '@ai-sdk/amazon-bedrock';\nimport { google } from '@ai-sdk/google';\nimport { openai } from '@ai-sdk/openai';\nimport { xai } from '@ai-sdk/xai';\nimport type { LanguageModel, ModelMessage } from 'ai';\nimport { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst PROMPT_FILENAME = 'prompt.txt';\n\nconst providerByName: Record<string, typeof bedrock | typeof google | typeof openai | typeof xai> = {\n // requires `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`\n bedrock,\n // requires `GOOGLE_GENERATIVE_AI_API_KEY`\n google,\n // requires `OPENAI_API_KEY`\n openai,\n // requires `XAI_API_KEY`\n xai,\n} as const;\n\nconst judgeParamsSchema = z.object({\n model: z.string().min(1),\n});\n\ninterface LlmJudgePresetOptions {\n buildPrompt?: (context: {\n prompt: string;\n testCase: { id: string; input?: string; output?: string };\n }) => string | ModelMessage[];\n test: (context: {\n testCase: { id: string; input?: string; output?: string };\n result: { output: string };\n }) => Partial<TestCaseResult> | Promise<Partial<TestCaseResult>>;\n}\n\n/**\n * A preset judge function for running and testing a user prompt in LLM.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { llmJudgePreset } from '@exercode/problem-utils/presets/llm';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await llmJudgePreset(import.meta.dirname, {\n * test: (context) {\n * return { decisionCode: context.result.output ? DecisionCode.ACCEPTED : DecisionCode.WRONG_ANSWER };\n * }\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"model\": \"gemini-2.5-flash-lite\" }'\n * ```\n */\nexport async function llmJudgePreset(problemDir: string, options: LlmJudgePresetOptions): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const prompt = await fs.promises.readFile(path.join(args.cwd, PROMPT_FILENAME), 'utf8');\n\n for (const testCase of testCases) {\n const startTimeMilliseconds = Date.now();\n try {\n const { text } = await generateText({\n model: toLanguageModel(params.model),\n prompt: options.buildPrompt?.({ prompt, testCase }) ?? prompt.replaceAll('{input}', testCase.input ?? ''),\n });\n\n const stopTimeMilliseconds = Date.now();\n\n const testCaseResult = {\n testCaseId: testCase.id,\n decisionCode: DecisionCode.ACCEPTED,\n stdin: testCase.input,\n stdout: text,\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n ...(await options.test({ testCase, result: { output: text } })),\n };\n\n printTestCaseResult(testCaseResult);\n\n if (testCaseResult.decisionCode !== DecisionCode.ACCEPTED) break;\n } catch (error) {\n const stopTimeMilliseconds = Date.now();\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: testCase.input,\n stderr: error instanceof Error ? error.message : String(error),\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n });\n\n break;\n }\n }\n}\n\nfunction toLanguageModel(model: string): LanguageModel {\n const [providerId, modelId] = model.split('/');\n if (!providerId || !modelId) throw new Error(`bad model: ${model}`);\n const languageModel = providerByName[providerId]?.(modelId);\n if (!languageModel) throw new Error(`model not found: ${model}`);\n return languageModel;\n}\n"],"mappings":"4hBAiBA,MAEM,EAA8F,CAElG,QAAA,EAAA,QAEA,OAAA,EAAA,OAEA,OAAA,EAAA,OAEA,IAAA,EAAA,GACF,EAEM,EAAoBA,EAAAA,EAAE,OAAO,CACjC,MAAOA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CACzB,CAAC,EAkCD,eAAsB,EAAe,EAAoB,EAA+C,CACtG,IAAM,EAAOC,EAAAA,UAAU,QAAQ,IAAI,EACnC,GAAI,CAAC,EAAK,IAAK,MAAU,MAAM,uBAAuB,EACtD,IAAM,EAAS,EAAkB,MAAM,EAAK,MAAM,EAE5C,EAAY,MAAMC,EAAAA,cAAcC,EAAAA,QAAK,KAAK,EAAY,YAAY,CAAC,EAEnE,EAAS,MAAMC,EAAAA,QAAG,SAAS,SAASD,EAAAA,QAAK,KAAK,EAAK,IAAK,YAAe,EAAG,MAAM,EAEtF,IAAK,IAAM,KAAY,EAAW,CAChC,IAAM,EAAwB,KAAK,IAAI,EACvC,GAAI,CACF,GAAM,CAAE,QAAS,MAAA,EAAA,EAAA,aAAA,CAAmB,CAClC,MAAO,EAAgB,EAAO,KAAK,EACnC,OAAQ,EAAQ,cAAc,CAAE,SAAQ,UAAS,CAAC,GAAK,EAAO,WAAW,UAAW,EAAS,OAAS,EAAE,CAC1G,CAAC,EAEK,EAAuB,KAAK,IAAI,EAEhC,EAAiB,CACrB,WAAY,EAAS,GACrB,aAAcE,EAAAA,aAAa,SAC3B,MAAO,EAAS,MAChB,OAAQ,EACR,aAAc,EAAuB,GAAyB,IAC9D,GAAI,MAAM,EAAQ,KAAK,CAAE,WAAU,OAAQ,CAAE,OAAQ,CAAK,CAAE,CAAC,CAC/D,EAIA,GAFA,EAAA,oBAAoB,CAAc,EAE9B,EAAe,eAAiBA,EAAAA,aAAa,SAAU,KAC7D,OAAS,EAAO,CACd,IAAM,EAAuB,KAAK,IAAI,EAEtC,EAAA,oBAAoB,CAClB,WAAY,EAAS,GACrB,aAAcA,EAAAA,aAAa,cAC3B,MAAO,EAAS,MAChB,OAAQ,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAC7D,aAAc,EAAuB,GAAyB,GAChE,CAAC,EAED,KACF,CACF,CACF,CAEA,SAAS,EAAgB,EAA8B,CACrD,GAAM,CAAC,EAAY,GAAW,EAAM,MAAM,GAAG,EAC7C,GAAI,CAAC,GAAc,CAAC,EAAS,MAAU,MAAM,cAAc,GAAO,EAClE,IAAM,EAAgB,EAAe,EAAW,GAAG,CAAO,EAC1D,GAAI,CAAC,EAAe,MAAU,MAAM,oBAAoB,GAAO,EAC/D,OAAO,CACT"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as e,regenerator as r,objectSpread2 as o,createForOfIteratorHelper as t,slicedToArray as a}from"../_virtual/_rollupPluginBabelHelpers.js";import s from"node:fs";import n from"node:path";import{bedrock as i}from"@ai-sdk/amazon-bedrock";import{google as p}from"@ai-sdk/google";import{openai as c}from"@ai-sdk/openai";import{xai as d}from"@ai-sdk/xai";import{generateText as m}from"ai";import{z as l}from"zod";import{parseArgs as u}from"../helpers/parseArgs.js";import{printTestCaseResult as f}from"../helpers/printTestCaseResult.js";import{readTestCases as v}from"../helpers/readTestCases.js";import{DecisionCode as w}from"../types/decisionCode.js";var C={bedrock:i,google:p,openai:c,xai:d},b=l.object({model:l.string().min(1)});function g(e,r){return k.apply(this,arguments)}function k(){return(k=e(r().m(function e(a,i){var p,c,d,l,C,g,k,E,j,T,x,y,A,D,R,I,P,S,_,z;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:if((p=u(process.argv)).cwd){e.n=1;break}throw new Error("cwd argument required");case 1:return c=b.parse(p.params),e.n=2,v(n.join(a,"test_cases"));case 2:return d=e.v,e.n=3,s.promises.readFile(n.join(p.cwd,"prompt.txt"),"utf8");case 3:l=e.v,C=t(d),e.p=4,C.s();case 5:if((g=C.n()).done){e.n=12;break}return k=g.value,E=Date.now(),e.p=6,e.n=7,m({model:h(c.model),prompt:null!=(j=null==(T=i.buildPrompt)?void 0:T.call(i,{prompt:l,testCase:k}))?j:l.replaceAll("{input}",null!=(x=k.input)?x:"")});case 7:return y=e.v,A=y.text,D=Date.now(),P=o,S={testCaseId:k.id,decisionCode:w.ACCEPTED,stdin:k.input,stdout:A,timeSeconds:(D-E)/1e3},e.n=8,i.test({testCase:k,result:{output:A}});case 8:if(R=P(S,e.v),f(R),R.decisionCode===w.ACCEPTED){e.n=9;break}return e.a(3,12);case 9:e.n=11;break;case 10:return e.p=10,_=e.v,I=Date.now(),f({testCaseId:k.id,decisionCode:w.RUNTIME_ERROR,stdin:k.input,stderr:_ instanceof Error?_.message:String(_),timeSeconds:(I-E)/1e3}),e.a(3,12);case 11:e.n=5;break;case 12:e.n=14;break;case 13:e.p=13,z=e.v,C.e(z);case 14:return e.p=14,C.f(),e.f(14);case 15:return e.a(2)}},e,null,[[6,10],[4,13,14,15]])}))).apply(this,arguments)}function h(e){var r,o=e.split("/"),t=a(o,2),s=t[0],n=t[1];if(!s||!n)throw new Error("bad model: ".concat(e));var i=null==(r=C[s])?void 0:r.call(C,n);if(!i)throw new Error("model not found: ".concat(e));return i}export{g as llmJudgePreset}; | ||
| //# sourceMappingURL=llm.js.map | ||
| import{parseArgs as e}from"../helpers/parseArgs.js";import{printTestCaseResult as t}from"../helpers/printTestCaseResult.js";import{DecisionCode as n}from"../types/decisionCode.js";import{readTestCases as r}from"../helpers/readTestCases.js";import{z as i}from"zod";import a from"node:path";import o from"node:fs";import{bedrock as s}from"@ai-sdk/amazon-bedrock";import{google as c}from"@ai-sdk/google";import{openai as l}from"@ai-sdk/openai";import{xai as u}from"@ai-sdk/xai";import{generateText as d}from"ai";const f={bedrock:s,google:c,openai:l,xai:u},p=i.object({model:i.string().min(1)});async function m(i,s){let c=e(process.argv);if(!c.cwd)throw Error(`cwd argument required`);let l=p.parse(c.params),u=await r(a.join(i,`test_cases`)),f=await o.promises.readFile(a.join(c.cwd,`prompt.txt`),`utf8`);for(let e of u){let r=Date.now();try{let{text:i}=await d({model:h(l.model),prompt:s.buildPrompt?.({prompt:f,testCase:e})??f.replaceAll(`{input}`,e.input??``)}),a=Date.now(),o={testCaseId:e.id,decisionCode:n.ACCEPTED,stdin:e.input,stdout:i,timeSeconds:(a-r)/1e3,...await s.test({testCase:e,result:{output:i}})};if(t(o),o.decisionCode!==n.ACCEPTED)break}catch(i){let a=Date.now();t({testCaseId:e.id,decisionCode:n.RUNTIME_ERROR,stdin:e.input,stderr:i instanceof Error?i.message:String(i),timeSeconds:(a-r)/1e3});break}}}function h(e){let[t,n]=e.split(`/`);if(!t||!n)throw Error(`bad model: ${e}`);let r=f[t]?.(n);if(!r)throw Error(`model not found: ${e}`);return r}export{m as llmJudgePreset}; | ||
| //# sourceMappingURL=llm.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"llm.js","sources":["../../src/presets/llm.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { bedrock } from '@ai-sdk/amazon-bedrock';\nimport { google } from '@ai-sdk/google';\nimport { openai } from '@ai-sdk/openai';\nimport { xai } from '@ai-sdk/xai';\nimport type { LanguageModel, ModelMessage } from 'ai';\nimport { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst PROMPT_FILENAME = 'prompt.txt';\n\nconst providerByName: Record<string, typeof bedrock | typeof google | typeof openai | typeof xai> = {\n // requires `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`\n bedrock,\n // requires `GOOGLE_GENERATIVE_AI_API_KEY`\n google,\n // requires `OPENAI_API_KEY`\n openai,\n // requires `XAI_API_KEY`\n xai,\n} as const;\n\nconst judgeParamsSchema = z.object({\n model: z.string().min(1),\n});\n\ninterface LlmJudgePresetOptions {\n buildPrompt?: (context: {\n prompt: string;\n testCase: { id: string; input?: string; output?: string };\n }) => string | ModelMessage[];\n test: (context: {\n testCase: { id: string; input?: string; output?: string };\n result: { output: string };\n }) => Partial<TestCaseResult> | Promise<Partial<TestCaseResult>>;\n}\n\n/**\n * A preset judge function for running and testing a user prompt in LLM.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { llmJudgePreset } from '@exercode/problem-utils/presets/llm';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await llmJudgePreset(import.meta.dirname, {\n * test: (context) {\n * return { decisionCode: context.result.output ? DecisionCode.ACCEPTED : DecisionCode.WRONG_ANSWER };\n * }\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"model\": \"gemini-2.5-flash-lite\" }'\n * ```\n */\nexport async function llmJudgePreset(problemDir: string, options: LlmJudgePresetOptions): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const prompt = await fs.promises.readFile(path.join(args.cwd, PROMPT_FILENAME), 'utf8');\n\n for (const testCase of testCases) {\n const startTimeMilliseconds = Date.now();\n try {\n const { text } = await generateText({\n model: toLanguageModel(params.model),\n prompt: options.buildPrompt?.({ prompt, testCase }) ?? prompt.replaceAll('{input}', testCase.input ?? ''),\n });\n\n const stopTimeMilliseconds = Date.now();\n\n const testCaseResult = {\n testCaseId: testCase.id,\n decisionCode: DecisionCode.ACCEPTED,\n stdin: testCase.input,\n stdout: text,\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n ...(await options.test({ testCase, result: { output: text } })),\n };\n\n printTestCaseResult(testCaseResult);\n\n if (testCaseResult.decisionCode !== DecisionCode.ACCEPTED) break;\n } catch (error) {\n const stopTimeMilliseconds = Date.now();\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: testCase.input,\n stderr: error instanceof Error ? error.message : String(error),\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n });\n\n break;\n }\n }\n}\n\nfunction toLanguageModel(model: string): LanguageModel {\n const [providerId, modelId] = model.split('/');\n if (!providerId || !modelId) throw new Error(`bad model: ${model}`);\n const languageModel = providerByName[providerId]?.(modelId);\n if (!languageModel) throw new Error(`model not found: ${model}`);\n return languageModel;\n}\n"],"names":["providerByName","bedrock","google","openai","xai","judgeParamsSchema","z","object","model","string","min","llmJudgePreset","_x","_x2","_llmJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","testCases","prompt","_iterator","_step","testCase","startTimeMilliseconds","_options$buildPrompt","_options$buildPrompt2","_testCase$input","_yield$generateText","text","stopTimeMilliseconds","testCaseResult","_stopTimeMilliseconds","_t","_t2","_t3","_t4","w","_context","p","n","parseArgs","process","argv","cwd","Error","parse","readTestCases","path","join","v","fs","promises","readFile","_createForOfIteratorHelper","s","done","value","Date","now","generateText","toLanguageModel","buildPrompt","call","replaceAll","input","_objectSpread","testCaseId","id","decisionCode","DecisionCode","ACCEPTED","stdin","stdout","timeSeconds","test","result","output","printTestCaseResult","a","RUNTIME_ERROR","stderr","message","String","e","f","_providerByName$provi","_model$split","split","_model$split2","_slicedToArray","providerId","modelId","concat","languageModel"],"mappings":"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"} | ||
| {"version":3,"file":"llm.js","names":[],"sources":["../../src/presets/llm.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { bedrock } from '@ai-sdk/amazon-bedrock';\nimport { google } from '@ai-sdk/google';\nimport { openai } from '@ai-sdk/openai';\nimport { xai } from '@ai-sdk/xai';\nimport type { LanguageModel, ModelMessage } from 'ai';\nimport { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readTestCases } from '../helpers/readTestCases.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst PROMPT_FILENAME = 'prompt.txt';\n\nconst providerByName: Record<string, typeof bedrock | typeof google | typeof openai | typeof xai> = {\n // requires `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`\n bedrock,\n // requires `GOOGLE_GENERATIVE_AI_API_KEY`\n google,\n // requires `OPENAI_API_KEY`\n openai,\n // requires `XAI_API_KEY`\n xai,\n} as const;\n\nconst judgeParamsSchema = z.object({\n model: z.string().min(1),\n});\n\ninterface LlmJudgePresetOptions {\n buildPrompt?: (context: {\n prompt: string;\n testCase: { id: string; input?: string; output?: string };\n }) => string | ModelMessage[];\n test: (context: {\n testCase: { id: string; input?: string; output?: string };\n result: { output: string };\n }) => Partial<TestCaseResult> | Promise<Partial<TestCaseResult>>;\n}\n\n/**\n * A preset judge function for running and testing a user prompt in LLM.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { llmJudgePreset } from '@exercode/problem-utils/presets/llm';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await llmJudgePreset(import.meta.dirname, {\n * test: (context) {\n * return { decisionCode: context.result.output ? DecisionCode.ACCEPTED : DecisionCode.WRONG_ANSWER };\n * }\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"model\": \"gemini-2.5-flash-lite\" }'\n * ```\n */\nexport async function llmJudgePreset(problemDir: string, options: LlmJudgePresetOptions): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const prompt = await fs.promises.readFile(path.join(args.cwd, PROMPT_FILENAME), 'utf8');\n\n for (const testCase of testCases) {\n const startTimeMilliseconds = Date.now();\n try {\n const { text } = await generateText({\n model: toLanguageModel(params.model),\n prompt: options.buildPrompt?.({ prompt, testCase }) ?? prompt.replaceAll('{input}', testCase.input ?? ''),\n });\n\n const stopTimeMilliseconds = Date.now();\n\n const testCaseResult = {\n testCaseId: testCase.id,\n decisionCode: DecisionCode.ACCEPTED,\n stdin: testCase.input,\n stdout: text,\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n ...(await options.test({ testCase, result: { output: text } })),\n };\n\n printTestCaseResult(testCaseResult);\n\n if (testCaseResult.decisionCode !== DecisionCode.ACCEPTED) break;\n } catch (error) {\n const stopTimeMilliseconds = Date.now();\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: testCase.input,\n stderr: error instanceof Error ? error.message : String(error),\n timeSeconds: (stopTimeMilliseconds - startTimeMilliseconds) / 1000,\n });\n\n break;\n }\n }\n}\n\nfunction toLanguageModel(model: string): LanguageModel {\n const [providerId, modelId] = model.split('/');\n if (!providerId || !modelId) throw new Error(`bad model: ${model}`);\n const languageModel = providerByName[providerId]?.(modelId);\n if (!languageModel) throw new Error(`model not found: ${model}`);\n return languageModel;\n}\n"],"mappings":"6fAiBA,MAEM,EAA8F,CAElG,UAEA,SAEA,SAEA,KACF,EAEM,EAAoB,EAAE,OAAO,CACjC,MAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CACzB,CAAC,EAkCD,eAAsB,EAAe,EAAoB,EAA+C,CACtG,IAAM,EAAO,EAAU,QAAQ,IAAI,EACnC,GAAI,CAAC,EAAK,IAAK,MAAU,MAAM,uBAAuB,EACtD,IAAM,EAAS,EAAkB,MAAM,EAAK,MAAM,EAE5C,EAAY,MAAM,EAAc,EAAK,KAAK,EAAY,YAAY,CAAC,EAEnE,EAAS,MAAM,EAAG,SAAS,SAAS,EAAK,KAAK,EAAK,IAAK,YAAe,EAAG,MAAM,EAEtF,IAAK,IAAM,KAAY,EAAW,CAChC,IAAM,EAAwB,KAAK,IAAI,EACvC,GAAI,CACF,GAAM,CAAE,QAAS,MAAM,EAAa,CAClC,MAAO,EAAgB,EAAO,KAAK,EACnC,OAAQ,EAAQ,cAAc,CAAE,SAAQ,UAAS,CAAC,GAAK,EAAO,WAAW,UAAW,EAAS,OAAS,EAAE,CAC1G,CAAC,EAEK,EAAuB,KAAK,IAAI,EAEhC,EAAiB,CACrB,WAAY,EAAS,GACrB,aAAc,EAAa,SAC3B,MAAO,EAAS,MAChB,OAAQ,EACR,aAAc,EAAuB,GAAyB,IAC9D,GAAI,MAAM,EAAQ,KAAK,CAAE,WAAU,OAAQ,CAAE,OAAQ,CAAK,CAAE,CAAC,CAC/D,EAIA,GAFA,EAAoB,CAAc,EAE9B,EAAe,eAAiB,EAAa,SAAU,KAC7D,OAAS,EAAO,CACd,IAAM,EAAuB,KAAK,IAAI,EAEtC,EAAoB,CAClB,WAAY,EAAS,GACrB,aAAc,EAAa,cAC3B,MAAO,EAAS,MAChB,OAAQ,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAC7D,aAAc,EAAuB,GAAyB,GAChE,CAAC,EAED,KACF,CACF,CACF,CAEA,SAAS,EAAgB,EAA8B,CACrD,GAAM,CAAC,EAAY,GAAW,EAAM,MAAM,GAAG,EAC7C,GAAI,CAAC,GAAc,CAAC,EAAS,MAAU,MAAM,cAAc,GAAO,EAClE,IAAM,EAAgB,EAAe,EAAW,GAAG,CAAO,EAC1D,GAAI,CAAC,EAAe,MAAU,MAAM,oBAAoB,GAAO,EAC/D,OAAO,CACT"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:fs"),t=require("node:path"),s=require("zod"),n=require("../helpers/cleanWorkingDirectory.cjs"),i=require("../helpers/compareStdoutAsSpaceSeparatedTokens.cjs"),a=require("../helpers/copyTestCaseFileInput.cjs"),o=require("../helpers/findEntryPointFile.cjs"),d=require("../helpers/findLanguageDefinitionByPath.cjs"),u=require("../helpers/judgeByStaticAnalysis.cjs"),c=require("../helpers/parseArgs.cjs"),l=require("../helpers/printTestCaseResult.cjs"),p=require("../helpers/readOutputFiles.cjs"),C=require("../helpers/readProblemMarkdownFrontMatter.cjs"),E=require("../helpers/readTestCases.cjs"),I=require("../helpers/spawnSyncWithTimeout.cjs"),m=require("../types/decisionCode.cjs"),D=5e4,g=s.z.object({language:s.z.union([s.z.string(),s.z.array(s.z.string())]).optional()}),b=g.extend({stdin:s.z.string().optional()});function R(){return(R=e.asyncToGenerator(e.regenerator().m(function s(b){var R,f,T,_,S,h,v,y,k,O,w,P,M,F,L,B,U,j,N,q,A,W,G,X,x,z,Q,Y,Z,H,V,J,K,$,ee,re,te,se,ne,ie,ae,oe,de,ue,ce,le,pe,Ce,Ee,Ie,me,De,ge;return e.regenerator().w(function(s){for(;;)switch(s.p=s.n){case 0:if((R=c.parseArgs(process.argv)).cwd){s.n=1;break}throw new Error("cwd argument required");case 1:return f=g.parse(R.params),s.n=2,C.readProblemMarkdownFrontMatter(b);case 2:return T=s.v,s.n=3,E.readTestCases(t.join(b,"test_cases"));case 3:return _=s.v,s.n=4,u.judgeByStaticAnalysis(R.cwd,T);case 4:if(!(S=s.v)){s.n=5;break}return l.printTestCaseResult(e.objectSpread2({testCaseId:null!=(h=null==(v=_[0])?void 0:v.id)?h:"prebuild"},S)),s.a(2);case 5:return s.n=6,o.findEntryPointFile(R.cwd,f.language);case 6:if(y=s.v){s.n=7;break}return l.printTestCaseResult({testCaseId:null!=(k=null==(O=_[0])?void 0:O.id)?k:"prebuild",decisionCode:m.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(f.language?": language: ".concat(f.language):"")}),s.a(2);case 7:if(w=d.findLanguageDefinitionByPath(y)){s.n=8;break}return l.printTestCaseResult({testCaseId:null!=(P=null==(M=_[0])?void 0:M.id)?P:"prebuild",decisionCode:m.DecisionCode.WRONG_ANSWER,stderr:"unsupported language"}),s.a(2);case 8:if(F=e.objectSpread2(e.objectSpread2({},process.env),{},{CI:"",FORCE_COLOR:"0"}),!w.prebuild){s.n=13;break}return s.p=9,s.n=10,w.prebuild(R.cwd);case 10:return s.n=11,o.findEntryPointFile(R.cwd,f.language);case 11:L=s.v,s.n=13;break;case 12:return s.p=12,Ee=s.v,console.error("prebuild error",Ee),l.printTestCaseResult({testCaseId:null!=(B=null==(U=_[0])?void 0:U.id)?B:"prebuild",decisionCode:m.DecisionCode.BUILD_ERROR,stderr:Ee instanceof Error?Ee.message:String(Ee)}),s.a(2);case 13:if(j=null!=L?L:y,!w.buildCommand){s.n=17;break}if(s.p=14,N=w.buildCommand(j),q=I.spawnSyncWithTimeout(N[0],N.slice(1),{cwd:R.cwd,encoding:"utf8",env:F},10),A=m.DecisionCode.ACCEPTED,0!==q.status?A=m.DecisionCode.BUILD_ERROR:q.timeSeconds>10?A=m.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED:(q.stdout.length>D||q.stderr.length>D)&&(A=m.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED),A===m.DecisionCode.ACCEPTED){s.n=15;break}return l.printTestCaseResult({testCaseId:null!=(W=null==(G=_[0])?void 0:G.id)?W:"build",decisionCode:A,exitStatus:null!=(X=q.status)?X:void 0,stdout:q.stdout.slice(0,D)||void 0,stderr:q.stderr.slice(0,D)||void 0,timeSeconds:q.timeSeconds,memoryBytes:q.memoryBytes}),s.a(2);case 15:s.n=17;break;case 16:return s.p=16,Ie=s.v,console.error("build error",Ie),l.printTestCaseResult({testCaseId:null!=(x=null==(z=_[0])?void 0:z.id)?x:"build",decisionCode:m.DecisionCode.BUILD_ERROR,stderr:Ie instanceof Error?Ie.message:String(Ie)}),s.a(2);case 17:return s.n=18,n.snapshotWorkingDirectory(R.cwd);case 18:Q=s.v,0===_.length&&l.printTestCaseResult({testCaseId:"default",decisionCode:m.DecisionCode.ACCEPTED}),Y=e.createForOfIteratorHelper(_),s.p=19,Y.s();case 20:if((Z=Y.n()).done){s.n=45;break}if(te=Z.value,null==(H=_.shared)||!H.fileInputPath){s.n=21;break}return s.n=21,a.copyTestCaseFileInput(_.shared.fileInputPath,R.cwd);case 21:if(!te.fileInputPath){s.n=22;break}return s.n=22,a.copyTestCaseFileInput(te.fileInputPath,R.cwd);case 22:return se="number"==typeof T.timeLimitMs?T.timeLimitMs/1e3:2,ne=w.command(j),ie=I.spawnSyncWithTimeout(ne[0],ne.slice(1),{cwd:R.cwd,encoding:"utf8",input:te.input,env:F},se),s.n=23,p.readOutputFiles(R.cwd,null!=(V=T.requiredOutputFilePaths)?V:[]);case 23:if(ae=s.v,oe=m.DecisionCode.ACCEPTED,0===ie.status){s.n=24;break}oe=m.DecisionCode.RUNTIME_ERROR,s.n=42;break;case 24:if(!(ie.timeSeconds>se)){s.n=25;break}oe=m.DecisionCode.TIME_LIMIT_EXCEEDED,s.n=42;break;case 25:if(!(ie.memoryBytes>(null!=(J=T.memoryLimitByte)?J:Number.POSITIVE_INFINITY))){s.n=26;break}oe=m.DecisionCode.MEMORY_LIMIT_EXCEEDED,s.n=42;break;case 26:if(!(ie.stdout.length>D||ie.stderr.length>D)){s.n=27;break}oe=m.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED,s.n=42;break;case 27:if(!(ae.length<(null!=(K=null==($=T.requiredOutputFilePaths)?void 0:$.length)?K:0))){s.n=28;break}oe=m.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR,s.n=42;break;case 28:if(i.compareStdoutAsSpaceSeparatedTokens(ie.stdout,null!=(ee=te.output)?ee:"")){s.n=29;break}oe=m.DecisionCode.WRONG_ANSWER,s.n=42;break;case 29:if(!te.fileOutputPath){s.n=42;break}return s.n=30,r.promises.readdir(te.fileOutputPath,{withFileTypes:!0,recursive:!0});case 30:de=s.v,ue=e.createForOfIteratorHelper(de),s.p=31,ue.s();case 32:if((ce=ue.n()).done){s.n=39;break}if((le=ce.value).isFile()){s.n=33;break}return s.a(3,38);case 33:return pe=t.relative(te.fileOutputPath,le.parentPath),s.n=34,r.promises.readFile(t.join(le.parentPath,le.name));case 34:return Ce=s.v,s.p=35,s.n=36,r.promises.readFile(t.join(R.cwd,pe,le.name));case 36:0!==s.v.compare(Ce)&&(oe=m.DecisionCode.WRONG_ANSWER),s.n=38;break;case 37:s.p=37,me=s.v,console.error(me),oe=m.DecisionCode.WRONG_ANSWER;case 38:s.n=32;break;case 39:s.n=41;break;case 40:s.p=40,De=s.v,ue.e(De);case 41:return s.p=41,ue.f(),s.f(41);case 42:return l.printTestCaseResult({testCaseId:te.id,decisionCode:oe,exitStatus:null!=(re=ie.status)?re:void 0,stdin:te.input,stdout:ie.stdout.slice(0,D)||void 0,stderr:ie.stderr.slice(0,D)||void 0,timeSeconds:ie.timeSeconds,memoryBytes:ie.memoryBytes,outputFiles:ae.length>0?ae:void 0}),s.n=43,n.cleanWorkingDirectory(R.cwd,Q);case 43:if(oe===m.DecisionCode.ACCEPTED){s.n=44;break}return s.a(3,45);case 44:s.n=20;break;case 45:s.n=47;break;case 46:s.p=46,ge=s.v,Y.e(ge);case 47:return s.p=47,Y.f(),s.f(47);case 48:return s.a(2)}},s,null,[[35,37],[31,40,41,42],[19,46,47,48],[14,16],[9,12]])}))).apply(this,arguments)}function f(){return(f=e.asyncToGenerator(e.regenerator().m(function r(t){var s,n,i,a,u,E,g,R,f,T,_,S,h,v,y,k,O,w,P,M,F,L,B,U,j;return e.regenerator().w(function(r){for(;;)switch(r.p=r.n){case 0:if((s=c.parseArgs(process.argv)).cwd){r.n=1;break}throw new Error("cwd argument required");case 1:return n=b.parse(s.params),r.n=2,C.readProblemMarkdownFrontMatter(t);case 2:return i=r.v,r.n=3,o.findEntryPointFile(s.cwd,n.language);case 3:if(a=r.v){r.n=4;break}return l.printTestCaseResult({testCaseId:"prebuild",decisionCode:m.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(n.language?": language: ".concat(n.language):"")}),r.a(2);case 4:if(u=d.findLanguageDefinitionByPath(a)){r.n=5;break}return l.printTestCaseResult({testCaseId:"prebuild",decisionCode:m.DecisionCode.WRONG_ANSWER,stderr:"unsupported language"}),r.a(2);case 5:if(E=e.objectSpread2(e.objectSpread2({},process.env),{},{CI:"",FORCE_COLOR:"0"}),!u.prebuild){r.n=10;break}return r.p=6,r.n=7,u.prebuild(s.cwd);case 7:return r.n=8,o.findEntryPointFile(s.cwd,n.language);case 8:g=r.v,r.n=10;break;case 9:return r.p=9,U=r.v,console.error("prebuild error",U),l.printTestCaseResult({testCaseId:"prebuild",decisionCode:m.DecisionCode.BUILD_ERROR,stderr:U instanceof Error?U.message:String(U)}),r.a(2);case 10:if(R=null!=g?g:a,!u.buildCommand){r.n=14;break}if(r.p=11,f=u.buildCommand(R),T=I.spawnSyncWithTimeout(f[0],f.slice(1),{cwd:s.cwd,encoding:"utf8",env:E},10),_=m.DecisionCode.ACCEPTED,0!==T.status?_=m.DecisionCode.BUILD_ERROR:T.timeSeconds>10?_=m.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED:(T.stdout.length>D||T.stderr.length>D)&&(_=m.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED),_===m.DecisionCode.ACCEPTED){r.n=12;break}return l.printTestCaseResult({testCaseId:"build",decisionCode:_,exitStatus:null!=(S=T.status)?S:void 0,stdout:T.stdout.slice(0,D)||void 0,stderr:T.stderr.slice(0,D)||void 0,timeSeconds:T.timeSeconds,memoryBytes:T.memoryBytes}),r.a(2);case 12:r.n=14;break;case 13:return r.p=13,j=r.v,console.error("build error",j),l.printTestCaseResult({testCaseId:"build",decisionCode:m.DecisionCode.BUILD_ERROR,stderr:j instanceof Error?j.message:String(j)}),r.a(2);case 14:return P=Math.max(10,(null!=(h=i.timeLimitMs)?h:0)/1e3),M=u.command(R),F=I.spawnSyncWithTimeout(M[0],M.slice(1),{cwd:s.cwd,encoding:"utf8",input:n.stdin,env:E},P),r.n=15,p.readOutputFiles(s.cwd,null!=(v=i.requiredOutputFilePaths)?v:[]);case 15:L=r.v,B=m.DecisionCode.ACCEPTED,0!==F.status?B=m.DecisionCode.RUNTIME_ERROR:F.timeSeconds>P?B=m.DecisionCode.TIME_LIMIT_EXCEEDED:F.memoryBytes>(null!=(y=i.memoryLimitByte)?y:Number.POSITIVE_INFINITY)?B=m.DecisionCode.MEMORY_LIMIT_EXCEEDED:F.stdout.length>D||F.stderr.length>D?B=m.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED:L.length<(null!=(k=null==(O=i.requiredOutputFilePaths)?void 0:O.length)?k:0)&&(B=m.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR),l.printTestCaseResult({testCaseId:"debug",decisionCode:B,exitStatus:null!=(w=F.status)?w:void 0,stdin:n.stdin,stdout:F.stdout.slice(0,D)||void 0,stderr:F.stderr.slice(0,D)||void 0,timeSeconds:F.timeSeconds,memoryBytes:F.memoryBytes,outputFiles:L.length>0?L:void 0});case 16:return r.a(2)}},r,null,[[11,13],[6,9]])}))).apply(this,arguments)}exports.stdioDebugPreset=function(e){return f.apply(this,arguments)},exports.stdioJudgePreset=function(e){return R.apply(this,arguments)}; | ||
| //# sourceMappingURL=stdio.cjs.map | ||
| "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/parseArgs.cjs"),n=require("../helpers/printTestCaseResult.cjs"),r=require("../types/decisionCode.cjs"),i=require("../helpers/cleanWorkingDirectory.cjs"),a=require("../helpers/copyTestCaseFileInput.cjs"),o=require("../helpers/findEntryPointFile.cjs"),s=require("../helpers/findLanguageDefinitionByPath.cjs"),c=require("../helpers/judgeByStaticAnalysis.cjs"),l=require("../helpers/readOutputFiles.cjs"),u=require("../helpers/readProblemMarkdownFrontMatter.cjs"),d=require("../helpers/readTestCases.cjs"),f=require("../helpers/spawnSyncWithTimeout.cjs"),p=require("../helpers/compareStdoutAsSpaceSeparatedTokens.cjs");let m=require("zod"),h=require("node:path");h=e.__toESM(h,1);let g=require("node:fs");g=e.__toESM(g,1);const _=5e4,v=m.z.object({language:m.z.union([m.z.string(),m.z.array(m.z.string())]).optional()}),y=v.extend({stdin:m.z.string().optional()});async function b(e){let m=t.parseArgs(process.argv);if(!m.cwd)throw Error(`cwd argument required`);let y=v.parse(m.params),b=await u.readProblemMarkdownFrontMatter(e),x=await d.readTestCases(h.default.join(e,`test_cases`)),S=await c.judgeByStaticAnalysis(m.cwd,b);if(S){n.printTestCaseResult({testCaseId:x[0]?.id??`prebuild`,...S});return}let C=await o.findEntryPointFile(m.cwd,y.language);if(!C){n.printTestCaseResult({testCaseId:x[0]?.id??`prebuild`,decisionCode:r.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${y.language?`: language: ${y.language}`:``}`});return}let w=s.findLanguageDefinitionByPath(C);if(!w){n.printTestCaseResult({testCaseId:x[0]?.id??`prebuild`,decisionCode:r.DecisionCode.WRONG_ANSWER,stderr:`unsupported language`});return}let T={...process.env,CI:``,FORCE_COLOR:`0`},E;if(w.prebuild)try{await w.prebuild(m.cwd),E=await o.findEntryPointFile(m.cwd,y.language)}catch(e){console.error(`prebuild error`,e),n.printTestCaseResult({testCaseId:x[0]?.id??`prebuild`,decisionCode:r.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let D=E??C;if(w.buildCommand)try{let e=w.buildCommand(D),t=f.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:m.cwd,encoding:`utf8`,env:T},10),i=r.DecisionCode.ACCEPTED;if(t.status===0?t.timeSeconds>10?i=r.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED:(t.stdout.length>_||t.stderr.length>_)&&(i=r.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):i=r.DecisionCode.BUILD_ERROR,i!==r.DecisionCode.ACCEPTED){n.printTestCaseResult({testCaseId:x[0]?.id??`build`,decisionCode:i,exitStatus:t.status??void 0,stdout:t.stdout.slice(0,_)||void 0,stderr:t.stderr.slice(0,_)||void 0,timeSeconds:t.timeSeconds,memoryBytes:t.memoryBytes});return}}catch(e){console.error(`build error`,e),n.printTestCaseResult({testCaseId:x[0]?.id??`build`,decisionCode:r.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let O=await i.snapshotWorkingDirectory(m.cwd);x.length===0&&n.printTestCaseResult({testCaseId:`default`,decisionCode:r.DecisionCode.ACCEPTED});for(let e of x){x.shared?.fileInputPath&&await a.copyTestCaseFileInput(x.shared.fileInputPath,m.cwd),e.fileInputPath&&await a.copyTestCaseFileInput(e.fileInputPath,m.cwd);let t=typeof b.timeLimitMs==`number`?b.timeLimitMs/1e3:2,o=w.command(D),s=f.spawnSyncWithTimeout(o[0],o.slice(1),{cwd:m.cwd,encoding:`utf8`,input:e.input,env:T},t),c=await l.readOutputFiles(m.cwd,b.requiredOutputFilePaths??[]),u=r.DecisionCode.ACCEPTED;if(s.status!==0)u=r.DecisionCode.RUNTIME_ERROR;else if(s.timeSeconds>t)u=r.DecisionCode.TIME_LIMIT_EXCEEDED;else if(s.memoryBytes>(b.memoryLimitByte??1/0))u=r.DecisionCode.MEMORY_LIMIT_EXCEEDED;else if(s.stdout.length>_||s.stderr.length>_)u=r.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;else if(c.length<(b.requiredOutputFilePaths?.length??0))u=r.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;else if(!p.compareStdoutAsSpaceSeparatedTokens(s.stdout,e.output??``))u=r.DecisionCode.WRONG_ANSWER;else if(e.fileOutputPath){let t=await g.default.promises.readdir(e.fileOutputPath,{withFileTypes:!0,recursive:!0});for(let n of t){if(!n.isFile())continue;let t=h.default.relative(e.fileOutputPath,n.parentPath),i=await g.default.promises.readFile(h.default.join(n.parentPath,n.name));try{(await g.default.promises.readFile(h.default.join(m.cwd,t,n.name))).compare(i)!==0&&(u=r.DecisionCode.WRONG_ANSWER)}catch(e){console.error(e),u=r.DecisionCode.WRONG_ANSWER}}}if(n.printTestCaseResult({testCaseId:e.id,decisionCode:u,exitStatus:s.status??void 0,stdin:e.input,stdout:s.stdout.slice(0,_)||void 0,stderr:s.stderr.slice(0,_)||void 0,timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes,outputFiles:c.length>0?c:void 0}),await i.cleanWorkingDirectory(m.cwd,O),u!==r.DecisionCode.ACCEPTED)break}}async function x(e){let i=t.parseArgs(process.argv);if(!i.cwd)throw Error(`cwd argument required`);let a=y.parse(i.params),c=await u.readProblemMarkdownFrontMatter(e),d=await o.findEntryPointFile(i.cwd,a.language);if(!d){n.printTestCaseResult({testCaseId:`prebuild`,decisionCode:r.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${a.language?`: language: ${a.language}`:``}`});return}let p=s.findLanguageDefinitionByPath(d);if(!p){n.printTestCaseResult({testCaseId:`prebuild`,decisionCode:r.DecisionCode.WRONG_ANSWER,stderr:`unsupported language`});return}let m={...process.env,CI:``,FORCE_COLOR:`0`},h;if(p.prebuild)try{await p.prebuild(i.cwd),h=await o.findEntryPointFile(i.cwd,a.language)}catch(e){console.error(`prebuild error`,e),n.printTestCaseResult({testCaseId:`prebuild`,decisionCode:r.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let g=h??d;if(p.buildCommand)try{let e=p.buildCommand(g),t=f.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:i.cwd,encoding:`utf8`,env:m},10),a=r.DecisionCode.ACCEPTED;if(t.status===0?t.timeSeconds>10?a=r.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED:(t.stdout.length>_||t.stderr.length>_)&&(a=r.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):a=r.DecisionCode.BUILD_ERROR,a!==r.DecisionCode.ACCEPTED){n.printTestCaseResult({testCaseId:`build`,decisionCode:a,exitStatus:t.status??void 0,stdout:t.stdout.slice(0,_)||void 0,stderr:t.stderr.slice(0,_)||void 0,timeSeconds:t.timeSeconds,memoryBytes:t.memoryBytes});return}}catch(e){console.error(`build error`,e),n.printTestCaseResult({testCaseId:`build`,decisionCode:r.DecisionCode.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}{let e=Math.max(10,(c.timeLimitMs??0)/1e3),t=p.command(g),o=f.spawnSyncWithTimeout(t[0],t.slice(1),{cwd:i.cwd,encoding:`utf8`,input:a.stdin,env:m},e),s=await l.readOutputFiles(i.cwd,c.requiredOutputFilePaths??[]),u=r.DecisionCode.ACCEPTED;o.status===0?o.timeSeconds>e?u=r.DecisionCode.TIME_LIMIT_EXCEEDED:o.memoryBytes>(c.memoryLimitByte??1/0)?u=r.DecisionCode.MEMORY_LIMIT_EXCEEDED:o.stdout.length>_||o.stderr.length>_?u=r.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED:s.length<(c.requiredOutputFilePaths?.length??0)&&(u=r.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR):u=r.DecisionCode.RUNTIME_ERROR,n.printTestCaseResult({testCaseId:`debug`,decisionCode:u,exitStatus:o.status??void 0,stdin:a.stdin,stdout:o.stdout.slice(0,_)||void 0,stderr:o.stderr.slice(0,_)||void 0,timeSeconds:o.timeSeconds,memoryBytes:o.memoryBytes,outputFiles:s.length>0?s:void 0})}}exports.stdioDebugPreset=x,exports.stdioJudgePreset=b; | ||
| //# sourceMappingURL=stdio.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"stdio.cjs","sources":["../../src/presets/stdio.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { compareStdoutAsSpaceSeparatedTokens } from '../helpers/compareStdoutAsSpaceSeparatedTokens.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 } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst DEBUG_DEFAULT_TIMEOUT_SECONDS = 10;\n\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nconst debugParamsSchema = judgeParamsSchema.extend({\n stdin: z.string().optional(),\n});\n\n/**\n * A preset judge function using stdin and stdout as test cases.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { stdioJudgePreset } from 'judge-utils/presets/stdio';\n *\n * await stdioJudgePreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java\n * ```\n *\n * Run with the optional parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"language\": \"javascript\" }'\n * ```\n */\nexport async function stdioJudgePreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const staticAnalysisTestCaseResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisTestCaseResult) {\n printTestCaseResult({ testCaseId: testCases[0]?.id ?? 'prebuild', ...staticAnalysisTestCaseResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n }\n\n for (const testCase of testCases) {\n // prepare test case\n if (testCases.shared?.fileInputPath) await copyTestCaseFileInput(testCases.shared.fileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n // run\n const timeoutSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: testCase.input, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n // calculate decision\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n } else if (!compareStdoutAsSpaceSeparatedTokens(spawnResult.stdout, testCase.output ?? '')) {\n decisionCode = DecisionCode.WRONG_ANSWER;\n } else if (testCase.fileOutputPath) {\n const dirents = await fs.promises.readdir(testCase.fileOutputPath, { withFileTypes: true, recursive: true });\n for (const dirent of dirents) {\n if (!dirent.isFile()) continue;\n const direntRelativePath = path.relative(testCase.fileOutputPath, dirent.parentPath);\n const expected = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name));\n try {\n const received = await fs.promises.readFile(path.join(args.cwd, direntRelativePath, dirent.name));\n if (received.compare(expected) !== 0) decisionCode = DecisionCode.WRONG_ANSWER;\n } catch (error) {\n console.error(error);\n decisionCode = DecisionCode.WRONG_ANSWER;\n }\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: testCase.input,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n // clean up\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n}\n\n/**\n * A preset debug function using stdin and stdout as test cases.\n *\n * @example\n * Create `debug.ts`:\n * ```ts\n * import { stdioDebugPreset } from 'judge-utils/presets/stdio';\n *\n * await stdioDebugPreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun debug.ts model_answers/java '{ \"stdin\": \"1 2\" }'\n * ```\n */\nexport async function stdioDebugPreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = debugParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n {\n const timeoutSeconds = Math.max(\n DEBUG_DEFAULT_TIMEOUT_SECONDS,\n (problemMarkdownFrontMatter.timeLimitMs ?? 0) / 1000\n );\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: params.stdin, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n }\n\n printTestCaseResult({\n testCaseId: 'debug',\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: params.stdin,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n }\n}\n"],"names":["MAX_STDOUT_LENGTH","judgeParamsSchema","z","object","language","union","string","array","optional","debugParamsSchema","extend","stdin","_stdioJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","args","params","problemMarkdownFrontMatter","testCases","staticAnalysisTestCaseResult","_testCases$0$id","_testCases$","originalMainFilePath","_testCases$0$id2","_testCases$2","languageDefinition","_testCases$0$id3","_testCases$3","env","prebuiltMainFilePath","_testCases$0$id4","_testCases$4","mainFilePath","buildCommand","buildSpawnResult","decisionCode","_testCases$0$id5","_testCases$5","_buildSpawnResult$sta","_testCases$0$id6","_testCases$6","cwdSnapshot","_iterator","_step","_testCases$shared","_problemMarkdownFront","_problemMarkdownFront2","_problemMarkdownFront3","_problemMarkdownFront4","_testCase$output","_spawnResult$status","testCase","timeoutSeconds","command","spawnResult","outputFiles","_decisionCode","dirents","_iterator2","_step2","dirent","direntRelativePath","expected","_t","_t2","_t3","_t4","_t5","w","_context","p","n","parseArgs","process","argv","cwd","Error","parse","readProblemMarkdownFrontMatter","v","readTestCases","path","join","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","id","a","findEntryPointFile","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","console","error","BUILD_ERROR","message","String","spawnSyncWithTimeout","slice","encoding","ACCEPTED","status","timeSeconds","BUILD_TIME_LIMIT_EXCEEDED","stdout","length","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","exitStatus","undefined","memoryBytes","snapshotWorkingDirectory","_createForOfIteratorHelper","s","done","value","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","readOutputFiles","requiredOutputFilePaths","RUNTIME_ERROR","TIME_LIMIT_EXCEEDED","memoryLimitByte","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","OUTPUT_SIZE_LIMIT_EXCEEDED","MISSING_REQUIRED_OUTPUT_FILE_ERROR","compareStdoutAsSpaceSeparatedTokens","output","fileOutputPath","fs","promises","readdir","withFileTypes","recursive","isFile","relative","parentPath","readFile","name","compare","e","f","cleanWorkingDirectory","apply","this","arguments","_stdioDebugPreset","_callee2","_buildSpawnResult$sta2","_problemMarkdownFront5","_problemMarkdownFront6","_problemMarkdownFront7","_problemMarkdownFront8","_problemMarkdownFront9","_spawnResult$status2","_decisionCode2","_t6","_t7","_context2","Math","max","_x2","_x"],"mappings":"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"} | ||
| {"version":3,"file":"stdio.cjs","names":["z","parseArgs","readProblemMarkdownFrontMatter","readTestCases","path","judgeByStaticAnalysis","findEntryPointFile","DecisionCode","findLanguageDefinitionByPath","spawnSyncWithTimeout","snapshotWorkingDirectory","copyTestCaseFileInput","readOutputFiles","compareStdoutAsSpaceSeparatedTokens","fs","cleanWorkingDirectory"],"sources":["../../src/presets/stdio.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { compareStdoutAsSpaceSeparatedTokens } from '../helpers/compareStdoutAsSpaceSeparatedTokens.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 } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst DEBUG_DEFAULT_TIMEOUT_SECONDS = 10;\n\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nconst debugParamsSchema = judgeParamsSchema.extend({\n stdin: z.string().optional(),\n});\n\n/**\n * A preset judge function using stdin and stdout as test cases.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { stdioJudgePreset } from 'judge-utils/presets/stdio';\n *\n * await stdioJudgePreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java\n * ```\n *\n * Run with the optional parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"language\": \"javascript\" }'\n * ```\n */\nexport async function stdioJudgePreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const staticAnalysisTestCaseResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisTestCaseResult) {\n printTestCaseResult({ testCaseId: testCases[0]?.id ?? 'prebuild', ...staticAnalysisTestCaseResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n }\n\n for (const testCase of testCases) {\n // prepare test case\n if (testCases.shared?.fileInputPath) await copyTestCaseFileInput(testCases.shared.fileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n // run\n const timeoutSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: testCase.input, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n // calculate decision\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n } else if (!compareStdoutAsSpaceSeparatedTokens(spawnResult.stdout, testCase.output ?? '')) {\n decisionCode = DecisionCode.WRONG_ANSWER;\n } else if (testCase.fileOutputPath) {\n const dirents = await fs.promises.readdir(testCase.fileOutputPath, { withFileTypes: true, recursive: true });\n for (const dirent of dirents) {\n if (!dirent.isFile()) continue;\n const direntRelativePath = path.relative(testCase.fileOutputPath, dirent.parentPath);\n const expected = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name));\n try {\n const received = await fs.promises.readFile(path.join(args.cwd, direntRelativePath, dirent.name));\n if (received.compare(expected) !== 0) decisionCode = DecisionCode.WRONG_ANSWER;\n } catch (error) {\n console.error(error);\n decisionCode = DecisionCode.WRONG_ANSWER;\n }\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: testCase.input,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n // clean up\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n}\n\n/**\n * A preset debug function using stdin and stdout as test cases.\n *\n * @example\n * Create `debug.ts`:\n * ```ts\n * import { stdioDebugPreset } from 'judge-utils/presets/stdio';\n *\n * await stdioDebugPreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun debug.ts model_answers/java '{ \"stdin\": \"1 2\" }'\n * ```\n */\nexport async function stdioDebugPreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = debugParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n {\n const timeoutSeconds = Math.max(\n DEBUG_DEFAULT_TIMEOUT_SECONDS,\n (problemMarkdownFrontMatter.timeLimitMs ?? 0) / 1000\n );\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: params.stdin, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n }\n\n printTestCaseResult({\n testCaseId: 'debug',\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: params.stdin,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n }\n}\n"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| import{asyncToGenerator as e,regenerator as r,objectSpread2 as t,createForOfIteratorHelper as n}from"../_virtual/_rollupPluginBabelHelpers.js";import s from"node:fs";import a from"node:path";import{z as i}from"zod";import{cleanWorkingDirectory as o,snapshotWorkingDirectory as d}from"../helpers/cleanWorkingDirectory.js";import{compareStdoutAsSpaceSeparatedTokens as u}from"../helpers/compareStdoutAsSpaceSeparatedTokens.js";import{copyTestCaseFileInput as l}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as c}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as p}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as m}from"../helpers/judgeByStaticAnalysis.js";import{parseArgs as E}from"../helpers/parseArgs.js";import{printTestCaseResult as I}from"../helpers/printTestCaseResult.js";import{readOutputFiles as f}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as b}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as g}from"../helpers/readTestCases.js";import{spawnSyncWithTimeout as C}from"../helpers/spawnSyncWithTimeout.js";import{DecisionCode as _}from"../types/decisionCode.js";var R=5e4,v=i.object({language:i.union([i.string(),i.array(i.string())]).optional()}),h=v.extend({stdin:i.string().optional()});function S(e){return T.apply(this,arguments)}function T(){return(T=e(r().m(function e(i){var h,S,T,k,D,O,y,w,P,L,M,U,B,N,F,j,A,W,G,X,x,q,Q,Y,Z,H,V,z,J,K,$,ee,re,te,ne,se,ae,ie,oe,de,ue,le,ce,pe,me,Ee,Ie,fe,be,ge,Ce,_e,Re;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:if((h=E(process.argv)).cwd){e.n=1;break}throw new Error("cwd argument required");case 1:return S=v.parse(h.params),e.n=2,b(i);case 2:return T=e.v,e.n=3,g(a.join(i,"test_cases"));case 3:return k=e.v,e.n=4,m(h.cwd,T);case 4:if(!(D=e.v)){e.n=5;break}return I(t({testCaseId:null!=(O=null==(y=k[0])?void 0:y.id)?O:"prebuild"},D)),e.a(2);case 5:return e.n=6,c(h.cwd,S.language);case 6:if(w=e.v){e.n=7;break}return I({testCaseId:null!=(P=null==(L=k[0])?void 0:L.id)?P:"prebuild",decisionCode:_.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(S.language?": language: ".concat(S.language):"")}),e.a(2);case 7:if(M=p(w)){e.n=8;break}return I({testCaseId:null!=(U=null==(B=k[0])?void 0:B.id)?U:"prebuild",decisionCode:_.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2);case 8:if(N=t(t({},process.env),{},{CI:"",FORCE_COLOR:"0"}),!M.prebuild){e.n=13;break}return e.p=9,e.n=10,M.prebuild(h.cwd);case 10:return e.n=11,c(h.cwd,S.language);case 11:F=e.v,e.n=13;break;case 12:return e.p=12,be=e.v,console.error("prebuild error",be),I({testCaseId:null!=(j=null==(A=k[0])?void 0:A.id)?j:"prebuild",decisionCode:_.BUILD_ERROR,stderr:be instanceof Error?be.message:String(be)}),e.a(2);case 13:if(W=null!=F?F:w,!M.buildCommand){e.n=17;break}if(e.p=14,G=M.buildCommand(W),X=C(G[0],G.slice(1),{cwd:h.cwd,encoding:"utf8",env:N},10),x=_.ACCEPTED,0!==X.status?x=_.BUILD_ERROR:X.timeSeconds>10?x=_.BUILD_TIME_LIMIT_EXCEEDED:(X.stdout.length>R||X.stderr.length>R)&&(x=_.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED),x===_.ACCEPTED){e.n=15;break}return I({testCaseId:null!=(q=null==(Q=k[0])?void 0:Q.id)?q:"build",decisionCode:x,exitStatus:null!=(Y=X.status)?Y:void 0,stdout:X.stdout.slice(0,R)||void 0,stderr:X.stderr.slice(0,R)||void 0,timeSeconds:X.timeSeconds,memoryBytes:X.memoryBytes}),e.a(2);case 15:e.n=17;break;case 16:return e.p=16,ge=e.v,console.error("build error",ge),I({testCaseId:null!=(Z=null==(H=k[0])?void 0:H.id)?Z:"build",decisionCode:_.BUILD_ERROR,stderr:ge instanceof Error?ge.message:String(ge)}),e.a(2);case 17:return e.n=18,d(h.cwd);case 18:V=e.v,0===k.length&&I({testCaseId:"default",decisionCode:_.ACCEPTED}),z=n(k),e.p=19,z.s();case 20:if((J=z.n()).done){e.n=45;break}if(ae=J.value,null==(K=k.shared)||!K.fileInputPath){e.n=21;break}return e.n=21,l(k.shared.fileInputPath,h.cwd);case 21:if(!ae.fileInputPath){e.n=22;break}return e.n=22,l(ae.fileInputPath,h.cwd);case 22:return ie="number"==typeof T.timeLimitMs?T.timeLimitMs/1e3:2,oe=M.command(W),de=C(oe[0],oe.slice(1),{cwd:h.cwd,encoding:"utf8",input:ae.input,env:N},ie),e.n=23,f(h.cwd,null!=($=T.requiredOutputFilePaths)?$:[]);case 23:if(ue=e.v,le=_.ACCEPTED,0===de.status){e.n=24;break}le=_.RUNTIME_ERROR,e.n=42;break;case 24:if(!(de.timeSeconds>ie)){e.n=25;break}le=_.TIME_LIMIT_EXCEEDED,e.n=42;break;case 25:if(!(de.memoryBytes>(null!=(ee=T.memoryLimitByte)?ee:Number.POSITIVE_INFINITY))){e.n=26;break}le=_.MEMORY_LIMIT_EXCEEDED,e.n=42;break;case 26:if(!(de.stdout.length>R||de.stderr.length>R)){e.n=27;break}le=_.OUTPUT_SIZE_LIMIT_EXCEEDED,e.n=42;break;case 27:if(!(ue.length<(null!=(re=null==(te=T.requiredOutputFilePaths)?void 0:te.length)?re:0))){e.n=28;break}le=_.MISSING_REQUIRED_OUTPUT_FILE_ERROR,e.n=42;break;case 28:if(u(de.stdout,null!=(ne=ae.output)?ne:"")){e.n=29;break}le=_.WRONG_ANSWER,e.n=42;break;case 29:if(!ae.fileOutputPath){e.n=42;break}return e.n=30,s.promises.readdir(ae.fileOutputPath,{withFileTypes:!0,recursive:!0});case 30:ce=e.v,pe=n(ce),e.p=31,pe.s();case 32:if((me=pe.n()).done){e.n=39;break}if((Ee=me.value).isFile()){e.n=33;break}return e.a(3,38);case 33:return Ie=a.relative(ae.fileOutputPath,Ee.parentPath),e.n=34,s.promises.readFile(a.join(Ee.parentPath,Ee.name));case 34:return fe=e.v,e.p=35,e.n=36,s.promises.readFile(a.join(h.cwd,Ie,Ee.name));case 36:0!==e.v.compare(fe)&&(le=_.WRONG_ANSWER),e.n=38;break;case 37:e.p=37,Ce=e.v,console.error(Ce),le=_.WRONG_ANSWER;case 38:e.n=32;break;case 39:e.n=41;break;case 40:e.p=40,_e=e.v,pe.e(_e);case 41:return e.p=41,pe.f(),e.f(41);case 42:return I({testCaseId:ae.id,decisionCode:le,exitStatus:null!=(se=de.status)?se:void 0,stdin:ae.input,stdout:de.stdout.slice(0,R)||void 0,stderr:de.stderr.slice(0,R)||void 0,timeSeconds:de.timeSeconds,memoryBytes:de.memoryBytes,outputFiles:ue.length>0?ue:void 0}),e.n=43,o(h.cwd,V);case 43:if(le===_.ACCEPTED){e.n=44;break}return e.a(3,45);case 44:e.n=20;break;case 45:e.n=47;break;case 46:e.p=46,Re=e.v,z.e(Re);case 47:return e.p=47,z.f(),e.f(47);case 48:return e.a(2)}},e,null,[[35,37],[31,40,41,42],[19,46,47,48],[14,16],[9,12]])}))).apply(this,arguments)}function k(e){return D.apply(this,arguments)}function D(){return(D=e(r().m(function e(n){var s,a,i,o,d,u,l,m,g,v,S,T,k,D,O,y,w,P,L,M,U,B,N,F,j;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:if((s=E(process.argv)).cwd){e.n=1;break}throw new Error("cwd argument required");case 1:return a=h.parse(s.params),e.n=2,b(n);case 2:return i=e.v,e.n=3,c(s.cwd,a.language);case 3:if(o=e.v){e.n=4;break}return I({testCaseId:"prebuild",decisionCode:_.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(a.language?": language: ".concat(a.language):"")}),e.a(2);case 4:if(d=p(o)){e.n=5;break}return I({testCaseId:"prebuild",decisionCode:_.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2);case 5:if(u=t(t({},process.env),{},{CI:"",FORCE_COLOR:"0"}),!d.prebuild){e.n=10;break}return e.p=6,e.n=7,d.prebuild(s.cwd);case 7:return e.n=8,c(s.cwd,a.language);case 8:l=e.v,e.n=10;break;case 9:return e.p=9,F=e.v,console.error("prebuild error",F),I({testCaseId:"prebuild",decisionCode:_.BUILD_ERROR,stderr:F instanceof Error?F.message:String(F)}),e.a(2);case 10:if(m=null!=l?l:o,!d.buildCommand){e.n=14;break}if(e.p=11,g=d.buildCommand(m),v=C(g[0],g.slice(1),{cwd:s.cwd,encoding:"utf8",env:u},10),S=_.ACCEPTED,0!==v.status?S=_.BUILD_ERROR:v.timeSeconds>10?S=_.BUILD_TIME_LIMIT_EXCEEDED:(v.stdout.length>R||v.stderr.length>R)&&(S=_.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED),S===_.ACCEPTED){e.n=12;break}return I({testCaseId:"build",decisionCode:S,exitStatus:null!=(T=v.status)?T:void 0,stdout:v.stdout.slice(0,R)||void 0,stderr:v.stderr.slice(0,R)||void 0,timeSeconds:v.timeSeconds,memoryBytes:v.memoryBytes}),e.a(2);case 12:e.n=14;break;case 13:return e.p=13,j=e.v,console.error("build error",j),I({testCaseId:"build",decisionCode:_.BUILD_ERROR,stderr:j instanceof Error?j.message:String(j)}),e.a(2);case 14:return L=Math.max(10,(null!=(k=i.timeLimitMs)?k:0)/1e3),M=d.command(m),U=C(M[0],M.slice(1),{cwd:s.cwd,encoding:"utf8",input:a.stdin,env:u},L),e.n=15,f(s.cwd,null!=(D=i.requiredOutputFilePaths)?D:[]);case 15:B=e.v,N=_.ACCEPTED,0!==U.status?N=_.RUNTIME_ERROR:U.timeSeconds>L?N=_.TIME_LIMIT_EXCEEDED:U.memoryBytes>(null!=(O=i.memoryLimitByte)?O:Number.POSITIVE_INFINITY)?N=_.MEMORY_LIMIT_EXCEEDED:U.stdout.length>R||U.stderr.length>R?N=_.OUTPUT_SIZE_LIMIT_EXCEEDED:B.length<(null!=(y=null==(w=i.requiredOutputFilePaths)?void 0:w.length)?y:0)&&(N=_.MISSING_REQUIRED_OUTPUT_FILE_ERROR),I({testCaseId:"debug",decisionCode:N,exitStatus:null!=(P=U.status)?P:void 0,stdin:a.stdin,stdout:U.stdout.slice(0,R)||void 0,stderr:U.stderr.slice(0,R)||void 0,timeSeconds:U.timeSeconds,memoryBytes:U.memoryBytes,outputFiles:B.length>0?B:void 0});case 16:return e.a(2)}},e,null,[[11,13],[6,9]])}))).apply(this,arguments)}export{k as stdioDebugPreset,S as stdioJudgePreset}; | ||
| //# sourceMappingURL=stdio.js.map | ||
| import{parseArgs as e}from"../helpers/parseArgs.js";import{printTestCaseResult as t}from"../helpers/printTestCaseResult.js";import{DecisionCode as n}from"../types/decisionCode.js";import{cleanWorkingDirectory as r,snapshotWorkingDirectory as i}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as a}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as o}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as s}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as c}from"../helpers/judgeByStaticAnalysis.js";import{readOutputFiles as l}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as u}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as d}from"../helpers/readTestCases.js";import{spawnSyncWithTimeout as f}from"../helpers/spawnSyncWithTimeout.js";import{compareStdoutAsSpaceSeparatedTokens as p}from"../helpers/compareStdoutAsSpaceSeparatedTokens.js";import{z as m}from"zod";import h from"node:path";import g from"node:fs";const _=5e4,v=m.object({language:m.union([m.string(),m.array(m.string())]).optional()}),y=v.extend({stdin:m.string().optional()});async function b(m){let y=e(process.argv);if(!y.cwd)throw Error(`cwd argument required`);let b=v.parse(y.params),x=await u(m),S=await d(h.join(m,`test_cases`)),C=await c(y.cwd,x);if(C){t({testCaseId:S[0]?.id??`prebuild`,...C});return}let w=await o(y.cwd,b.language);if(!w){t({testCaseId:S[0]?.id??`prebuild`,decisionCode:n.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${b.language?`: language: ${b.language}`:``}`});return}let T=s(w);if(!T){t({testCaseId:S[0]?.id??`prebuild`,decisionCode:n.WRONG_ANSWER,stderr:`unsupported language`});return}let E={...process.env,CI:``,FORCE_COLOR:`0`},D;if(T.prebuild)try{await T.prebuild(y.cwd),D=await o(y.cwd,b.language)}catch(e){console.error(`prebuild error`,e),t({testCaseId:S[0]?.id??`prebuild`,decisionCode:n.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let O=D??w;if(T.buildCommand)try{let e=T.buildCommand(O),r=f(e[0],e.slice(1),{cwd:y.cwd,encoding:`utf8`,env:E},10),i=n.ACCEPTED;if(r.status===0?r.timeSeconds>10?i=n.BUILD_TIME_LIMIT_EXCEEDED:(r.stdout.length>_||r.stderr.length>_)&&(i=n.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):i=n.BUILD_ERROR,i!==n.ACCEPTED){t({testCaseId:S[0]?.id??`build`,decisionCode:i,exitStatus:r.status??void 0,stdout:r.stdout.slice(0,_)||void 0,stderr:r.stderr.slice(0,_)||void 0,timeSeconds:r.timeSeconds,memoryBytes:r.memoryBytes});return}}catch(e){console.error(`build error`,e),t({testCaseId:S[0]?.id??`build`,decisionCode:n.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let k=await i(y.cwd);S.length===0&&t({testCaseId:`default`,decisionCode:n.ACCEPTED});for(let e of S){S.shared?.fileInputPath&&await a(S.shared.fileInputPath,y.cwd),e.fileInputPath&&await a(e.fileInputPath,y.cwd);let i=typeof x.timeLimitMs==`number`?x.timeLimitMs/1e3:2,o=T.command(O),s=f(o[0],o.slice(1),{cwd:y.cwd,encoding:`utf8`,input:e.input,env:E},i),c=await l(y.cwd,x.requiredOutputFilePaths??[]),u=n.ACCEPTED;if(s.status!==0)u=n.RUNTIME_ERROR;else if(s.timeSeconds>i)u=n.TIME_LIMIT_EXCEEDED;else if(s.memoryBytes>(x.memoryLimitByte??1/0))u=n.MEMORY_LIMIT_EXCEEDED;else if(s.stdout.length>_||s.stderr.length>_)u=n.OUTPUT_SIZE_LIMIT_EXCEEDED;else if(c.length<(x.requiredOutputFilePaths?.length??0))u=n.MISSING_REQUIRED_OUTPUT_FILE_ERROR;else if(!p(s.stdout,e.output??``))u=n.WRONG_ANSWER;else if(e.fileOutputPath){let t=await g.promises.readdir(e.fileOutputPath,{withFileTypes:!0,recursive:!0});for(let r of t){if(!r.isFile())continue;let t=h.relative(e.fileOutputPath,r.parentPath),i=await g.promises.readFile(h.join(r.parentPath,r.name));try{(await g.promises.readFile(h.join(y.cwd,t,r.name))).compare(i)!==0&&(u=n.WRONG_ANSWER)}catch(e){console.error(e),u=n.WRONG_ANSWER}}}if(t({testCaseId:e.id,decisionCode:u,exitStatus:s.status??void 0,stdin:e.input,stdout:s.stdout.slice(0,_)||void 0,stderr:s.stderr.slice(0,_)||void 0,timeSeconds:s.timeSeconds,memoryBytes:s.memoryBytes,outputFiles:c.length>0?c:void 0}),await r(y.cwd,k),u!==n.ACCEPTED)break}}async function x(r){let i=e(process.argv);if(!i.cwd)throw Error(`cwd argument required`);let a=y.parse(i.params),c=await u(r),d=await o(i.cwd,a.language);if(!d){t({testCaseId:`prebuild`,decisionCode:n.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:`main file not found${a.language?`: language: ${a.language}`:``}`});return}let p=s(d);if(!p){t({testCaseId:`prebuild`,decisionCode:n.WRONG_ANSWER,stderr:`unsupported language`});return}let m={...process.env,CI:``,FORCE_COLOR:`0`},h;if(p.prebuild)try{await p.prebuild(i.cwd),h=await o(i.cwd,a.language)}catch(e){console.error(`prebuild error`,e),t({testCaseId:`prebuild`,decisionCode:n.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}let g=h??d;if(p.buildCommand)try{let e=p.buildCommand(g),r=f(e[0],e.slice(1),{cwd:i.cwd,encoding:`utf8`,env:m},10),a=n.ACCEPTED;if(r.status===0?r.timeSeconds>10?a=n.BUILD_TIME_LIMIT_EXCEEDED:(r.stdout.length>_||r.stderr.length>_)&&(a=n.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED):a=n.BUILD_ERROR,a!==n.ACCEPTED){t({testCaseId:`build`,decisionCode:a,exitStatus:r.status??void 0,stdout:r.stdout.slice(0,_)||void 0,stderr:r.stderr.slice(0,_)||void 0,timeSeconds:r.timeSeconds,memoryBytes:r.memoryBytes});return}}catch(e){console.error(`build error`,e),t({testCaseId:`build`,decisionCode:n.BUILD_ERROR,stderr:e instanceof Error?e.message:String(e)});return}{let e=Math.max(10,(c.timeLimitMs??0)/1e3),r=p.command(g),o=f(r[0],r.slice(1),{cwd:i.cwd,encoding:`utf8`,input:a.stdin,env:m},e),s=await l(i.cwd,c.requiredOutputFilePaths??[]),u=n.ACCEPTED;o.status===0?o.timeSeconds>e?u=n.TIME_LIMIT_EXCEEDED:o.memoryBytes>(c.memoryLimitByte??1/0)?u=n.MEMORY_LIMIT_EXCEEDED:o.stdout.length>_||o.stderr.length>_?u=n.OUTPUT_SIZE_LIMIT_EXCEEDED:s.length<(c.requiredOutputFilePaths?.length??0)&&(u=n.MISSING_REQUIRED_OUTPUT_FILE_ERROR):u=n.RUNTIME_ERROR,t({testCaseId:`debug`,decisionCode:u,exitStatus:o.status??void 0,stdin:a.stdin,stdout:o.stdout.slice(0,_)||void 0,stderr:o.stderr.slice(0,_)||void 0,timeSeconds:o.timeSeconds,memoryBytes:o.memoryBytes,outputFiles:s.length>0?s:void 0})}}export{x as stdioDebugPreset,b as stdioJudgePreset}; | ||
| //# sourceMappingURL=stdio.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"stdio.js","sources":["../../src/presets/stdio.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { compareStdoutAsSpaceSeparatedTokens } from '../helpers/compareStdoutAsSpaceSeparatedTokens.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 } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst DEBUG_DEFAULT_TIMEOUT_SECONDS = 10;\n\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nconst debugParamsSchema = judgeParamsSchema.extend({\n stdin: z.string().optional(),\n});\n\n/**\n * A preset judge function using stdin and stdout as test cases.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { stdioJudgePreset } from 'judge-utils/presets/stdio';\n *\n * await stdioJudgePreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java\n * ```\n *\n * Run with the optional parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"language\": \"javascript\" }'\n * ```\n */\nexport async function stdioJudgePreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const staticAnalysisTestCaseResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisTestCaseResult) {\n printTestCaseResult({ testCaseId: testCases[0]?.id ?? 'prebuild', ...staticAnalysisTestCaseResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n }\n\n for (const testCase of testCases) {\n // prepare test case\n if (testCases.shared?.fileInputPath) await copyTestCaseFileInput(testCases.shared.fileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n // run\n const timeoutSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: testCase.input, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n // calculate decision\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n } else if (!compareStdoutAsSpaceSeparatedTokens(spawnResult.stdout, testCase.output ?? '')) {\n decisionCode = DecisionCode.WRONG_ANSWER;\n } else if (testCase.fileOutputPath) {\n const dirents = await fs.promises.readdir(testCase.fileOutputPath, { withFileTypes: true, recursive: true });\n for (const dirent of dirents) {\n if (!dirent.isFile()) continue;\n const direntRelativePath = path.relative(testCase.fileOutputPath, dirent.parentPath);\n const expected = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name));\n try {\n const received = await fs.promises.readFile(path.join(args.cwd, direntRelativePath, dirent.name));\n if (received.compare(expected) !== 0) decisionCode = DecisionCode.WRONG_ANSWER;\n } catch (error) {\n console.error(error);\n decisionCode = DecisionCode.WRONG_ANSWER;\n }\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: testCase.input,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n // clean up\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n}\n\n/**\n * A preset debug function using stdin and stdout as test cases.\n *\n * @example\n * Create `debug.ts`:\n * ```ts\n * import { stdioDebugPreset } from 'judge-utils/presets/stdio';\n *\n * await stdioDebugPreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun debug.ts model_answers/java '{ \"stdin\": \"1 2\" }'\n * ```\n */\nexport async function stdioDebugPreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = debugParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n {\n const timeoutSeconds = Math.max(\n DEBUG_DEFAULT_TIMEOUT_SECONDS,\n (problemMarkdownFrontMatter.timeLimitMs ?? 0) / 1000\n );\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: params.stdin, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n }\n\n printTestCaseResult({\n testCaseId: 'debug',\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: params.stdin,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n }\n}\n"],"names":["MAX_STDOUT_LENGTH","judgeParamsSchema","z","object","language","union","string","array","optional","debugParamsSchema","extend","stdin","stdioJudgePreset","_x","_stdioJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","args","params","problemMarkdownFrontMatter","testCases","staticAnalysisTestCaseResult","_testCases$0$id","_testCases$","originalMainFilePath","_testCases$0$id2","_testCases$2","languageDefinition","_testCases$0$id3","_testCases$3","env","prebuiltMainFilePath","_testCases$0$id4","_testCases$4","mainFilePath","buildCommand","buildSpawnResult","decisionCode","_testCases$0$id5","_testCases$5","_buildSpawnResult$sta","_testCases$0$id6","_testCases$6","cwdSnapshot","_iterator","_step","_testCases$shared","_problemMarkdownFront","_problemMarkdownFront2","_problemMarkdownFront3","_problemMarkdownFront4","_testCase$output","_spawnResult$status","testCase","timeoutSeconds","command","spawnResult","outputFiles","_decisionCode","dirents","_iterator2","_step2","dirent","direntRelativePath","expected","_t","_t2","_t3","_t4","_t5","w","_context","p","n","parseArgs","process","argv","cwd","Error","parse","readProblemMarkdownFrontMatter","v","readTestCases","path","join","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","id","a","findEntryPointFile","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","console","error","BUILD_ERROR","message","String","spawnSyncWithTimeout","slice","encoding","ACCEPTED","status","timeSeconds","BUILD_TIME_LIMIT_EXCEEDED","stdout","length","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","exitStatus","undefined","memoryBytes","snapshotWorkingDirectory","_createForOfIteratorHelper","s","done","value","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","readOutputFiles","requiredOutputFilePaths","RUNTIME_ERROR","TIME_LIMIT_EXCEEDED","memoryLimitByte","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","OUTPUT_SIZE_LIMIT_EXCEEDED","MISSING_REQUIRED_OUTPUT_FILE_ERROR","compareStdoutAsSpaceSeparatedTokens","output","fileOutputPath","fs","promises","readdir","withFileTypes","recursive","isFile","relative","parentPath","readFile","name","compare","e","f","cleanWorkingDirectory","stdioDebugPreset","_x2","_stdioDebugPreset","_callee2","_buildSpawnResult$sta2","_problemMarkdownFront5","_problemMarkdownFront6","_problemMarkdownFront7","_problemMarkdownFront8","_problemMarkdownFront9","_spawnResult$status2","_decisionCode2","_t6","_t7","_context2","Math","max"],"mappings":"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"} | ||
| {"version":3,"file":"stdio.js","names":[],"sources":["../../src/presets/stdio.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { compareStdoutAsSpaceSeparatedTokens } from '../helpers/compareStdoutAsSpaceSeparatedTokens.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 } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst DEBUG_DEFAULT_TIMEOUT_SECONDS = 10;\n\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nconst debugParamsSchema = judgeParamsSchema.extend({\n stdin: z.string().optional(),\n});\n\n/**\n * A preset judge function using stdin and stdout as test cases.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { stdioJudgePreset } from 'judge-utils/presets/stdio';\n *\n * await stdioJudgePreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/java\n * ```\n *\n * Run with the optional parameters:\n * ```bash\n * bun judge.ts model_answers/java '{ \"language\": \"javascript\" }'\n * ```\n */\nexport async function stdioJudgePreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await readTestCases(path.join(problemDir, 'test_cases'));\n\n const staticAnalysisTestCaseResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisTestCaseResult) {\n printTestCaseResult({ testCaseId: testCases[0]?.id ?? 'prebuild', ...staticAnalysisTestCaseResult });\n return;\n }\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: testCases[0]?.id ?? 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n }\n\n for (const testCase of testCases) {\n // prepare test case\n if (testCases.shared?.fileInputPath) await copyTestCaseFileInput(testCases.shared.fileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n // run\n const timeoutSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: testCase.input, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n // calculate decision\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n } else if (!compareStdoutAsSpaceSeparatedTokens(spawnResult.stdout, testCase.output ?? '')) {\n decisionCode = DecisionCode.WRONG_ANSWER;\n } else if (testCase.fileOutputPath) {\n const dirents = await fs.promises.readdir(testCase.fileOutputPath, { withFileTypes: true, recursive: true });\n for (const dirent of dirents) {\n if (!dirent.isFile()) continue;\n const direntRelativePath = path.relative(testCase.fileOutputPath, dirent.parentPath);\n const expected = await fs.promises.readFile(path.join(dirent.parentPath, dirent.name));\n try {\n const received = await fs.promises.readFile(path.join(args.cwd, direntRelativePath, dirent.name));\n if (received.compare(expected) !== 0) decisionCode = DecisionCode.WRONG_ANSWER;\n } catch (error) {\n console.error(error);\n decisionCode = DecisionCode.WRONG_ANSWER;\n }\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: testCase.input,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n // clean up\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n}\n\n/**\n * A preset debug function using stdin and stdout as test cases.\n *\n * @example\n * Create `debug.ts`:\n * ```ts\n * import { stdioDebugPreset } from 'judge-utils/presets/stdio';\n *\n * await stdioDebugPreset(import.meta.dirname);\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun debug.ts model_answers/java '{ \"stdin\": \"1 2\" }'\n * ```\n */\nexport async function stdioDebugPreset(problemDir: string): Promise<void> {\n const args = parseArgs(process.argv);\n if (!args.cwd) throw new Error('cwd argument required');\n const params = debugParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n\n const originalMainFilePath = await findEntryPointFile(args.cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let prebuiltMainFilePath: string | undefined;\n\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n prebuiltMainFilePath = await findEntryPointFile(args.cwd, params.language);\n } catch (error) {\n console.error('prebuild error', error);\n\n printTestCaseResult({\n testCaseId: 'prebuild',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n const mainFilePath = prebuiltMainFilePath ?? originalMainFilePath;\n\n if (languageDefinition.buildCommand) {\n try {\n const buildCommand = languageDefinition.buildCommand(mainFilePath);\n\n const buildSpawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: args.cwd, encoding: 'utf8', env },\n BUILD_TIMEOUT_SECONDS\n );\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (buildSpawnResult.status !== 0) {\n decisionCode = DecisionCode.BUILD_ERROR;\n } else if (buildSpawnResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n decisionCode = DecisionCode.BUILD_TIME_LIMIT_EXCEEDED;\n } else if (\n buildSpawnResult.stdout.length > MAX_STDOUT_LENGTH ||\n buildSpawnResult.stderr.length > MAX_STDOUT_LENGTH\n ) {\n decisionCode = DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED;\n }\n\n if (decisionCode !== DecisionCode.ACCEPTED) {\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode,\n exitStatus: buildSpawnResult.status ?? undefined,\n stdout: buildSpawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: buildSpawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: buildSpawnResult.timeSeconds,\n memoryBytes: buildSpawnResult.memoryBytes,\n });\n return;\n }\n } catch (error) {\n console.error('build error', error);\n\n printTestCaseResult({\n testCaseId: 'build',\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n {\n const timeoutSeconds = Math.max(\n DEBUG_DEFAULT_TIMEOUT_SECONDS,\n (problemMarkdownFrontMatter.timeLimitMs ?? 0) / 1000\n );\n\n const command = languageDefinition.command(mainFilePath);\n\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: args.cwd, encoding: 'utf8', input: params.stdin, env },\n timeoutSeconds\n );\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n\n let decisionCode: DecisionCode = DecisionCode.ACCEPTED;\n\n if (spawnResult.status !== 0) {\n decisionCode = DecisionCode.RUNTIME_ERROR;\n } else if (spawnResult.timeSeconds > timeoutSeconds) {\n decisionCode = DecisionCode.TIME_LIMIT_EXCEEDED;\n } else if (spawnResult.memoryBytes > (problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)) {\n decisionCode = DecisionCode.MEMORY_LIMIT_EXCEEDED;\n } else if (spawnResult.stdout.length > MAX_STDOUT_LENGTH || spawnResult.stderr.length > MAX_STDOUT_LENGTH) {\n decisionCode = DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED;\n } else if (outputFiles.length < (problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0)) {\n decisionCode = DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR;\n }\n\n printTestCaseResult({\n testCaseId: 'debug',\n decisionCode,\n exitStatus: spawnResult.status ?? undefined,\n stdin: params.stdin,\n stdout: spawnResult.stdout.slice(0, MAX_STDOUT_LENGTH) || undefined,\n stderr: spawnResult.stderr.slice(0, MAX_STDOUT_LENGTH) || undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n }\n}\n"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";exports.DecisionCode={WAITING_JUDGE:0,JUDGE_NOT_AVAILABLE:1,WRONG_ANSWER:1e3,RUNTIME_ERROR:1001,TIME_LIMIT_EXCEEDED:1002,MEMORY_LIMIT_EXCEEDED:1003,OUTPUT_SIZE_LIMIT_EXCEEDED:1004,PRESENTATION_ERROR:1005,FORBIDDEN_PATTERNS_IN_CODE_ERROR:1006,REQUIRED_PATTERNS_IN_CODE_ERROR:1007,BUILD_ERROR:1100,BUILD_TIME_LIMIT_EXCEEDED:1101,BUILD_MEMORY_LIMIT_EXCEEDED:1102,BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED:1103,MISSING_REQUIRED_SUBMISSION_FILE_ERROR:1201,MISSING_REQUIRED_OUTPUT_FILE_ERROR:1202,ACCEPTED:2e3}; | ||
| //# sourceMappingURL=decisionCode.cjs.map | ||
| "use strict";const e={WAITING_JUDGE:0,JUDGE_NOT_AVAILABLE:1,WRONG_ANSWER:1e3,RUNTIME_ERROR:1001,TIME_LIMIT_EXCEEDED:1002,MEMORY_LIMIT_EXCEEDED:1003,OUTPUT_SIZE_LIMIT_EXCEEDED:1004,PRESENTATION_ERROR:1005,FORBIDDEN_PATTERNS_IN_CODE_ERROR:1006,REQUIRED_PATTERNS_IN_CODE_ERROR:1007,BUILD_ERROR:1100,BUILD_TIME_LIMIT_EXCEEDED:1101,BUILD_MEMORY_LIMIT_EXCEEDED:1102,BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED:1103,MISSING_REQUIRED_SUBMISSION_FILE_ERROR:1201,MISSING_REQUIRED_OUTPUT_FILE_ERROR:1202,ACCEPTED:2e3};exports.DecisionCode=e; | ||
| //# sourceMappingURL=decisionCode.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"decisionCode.cjs","sources":["../../src/types/decisionCode.ts"],"sourcesContent":["export const DecisionCode = {\n /** ジャッジ待ち */\n WAITING_JUDGE: 0,\n\n /** ジャッジ利用不可 */\n JUDGE_NOT_AVAILABLE: 1,\n\n /** 不正解 */\n WRONG_ANSWER: 1000,\n\n /** 実行時エラー */\n RUNTIME_ERROR: 1001,\n\n /** 時間制限超過 */\n TIME_LIMIT_EXCEEDED: 1002,\n\n /** メモリ制限超過 */\n MEMORY_LIMIT_EXCEEDED: 1003,\n\n /** 出力サイズ制限超過 */\n OUTPUT_SIZE_LIMIT_EXCEEDED: 1004,\n\n /** 出力形式エラー */\n PRESENTATION_ERROR: 1005,\n\n /** コード中の禁止された表現 */\n FORBIDDEN_PATTERNS_IN_CODE_ERROR: 1006,\n\n /** コード中の必要な表現 */\n REQUIRED_PATTERNS_IN_CODE_ERROR: 1007,\n\n /** ビルドエラー */\n BUILD_ERROR: 1100,\n\n /** ビルド時間制限超過 */\n BUILD_TIME_LIMIT_EXCEEDED: 1101,\n\n /** ビルドメモリ制限超過 */\n BUILD_MEMORY_LIMIT_EXCEEDED: 1102,\n\n /** ビルド時の出力サイズ制限超過 */\n BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED: 1103,\n\n /** 必須ファイル不足 */\n MISSING_REQUIRED_SUBMISSION_FILE_ERROR: 1201,\n\n /** 必須出力ファイル不足 */\n MISSING_REQUIRED_OUTPUT_FILE_ERROR: 1202,\n\n /**\n * 受理\n *\n * 最大の値であり、降順で取得したときに最初に見つかることが保証されている。\n */\n ACCEPTED: 2000,\n} as const;\n\nexport type DecisionCode = (typeof DecisionCode)[keyof typeof DecisionCode];\n"],"names":["WAITING_JUDGE","JUDGE_NOT_AVAILABLE","WRONG_ANSWER","RUNTIME_ERROR","TIME_LIMIT_EXCEEDED","MEMORY_LIMIT_EXCEEDED","OUTPUT_SIZE_LIMIT_EXCEEDED","PRESENTATION_ERROR","FORBIDDEN_PATTERNS_IN_CODE_ERROR","REQUIRED_PATTERNS_IN_CODE_ERROR","BUILD_ERROR","BUILD_TIME_LIMIT_EXCEEDED","BUILD_MEMORY_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","MISSING_REQUIRED_OUTPUT_FILE_ERROR","ACCEPTED"],"mappings":"kCAA4B,CAE1BA,cAAe,EAGfC,oBAAqB,EAGrBC,aAAc,IAGdC,cAAe,KAGfC,oBAAqB,KAGrBC,sBAAuB,KAGvBC,2BAA4B,KAG5BC,mBAAoB,KAGpBC,iCAAkC,KAGlCC,gCAAiC,KAGjCC,YAAa,KAGbC,0BAA2B,KAG3BC,4BAA6B,KAG7BC,iCAAkC,KAGlCC,uCAAwC,KAGxCC,mCAAoC,KAOpCC,SAAU"} | ||
| {"version":3,"file":"decisionCode.cjs","names":[],"sources":["../../src/types/decisionCode.ts"],"sourcesContent":["export const DecisionCode = {\n /** ジャッジ待ち */\n WAITING_JUDGE: 0,\n\n /** ジャッジ利用不可 */\n JUDGE_NOT_AVAILABLE: 1,\n\n /** 不正解 */\n WRONG_ANSWER: 1000,\n\n /** 実行時エラー */\n RUNTIME_ERROR: 1001,\n\n /** 時間制限超過 */\n TIME_LIMIT_EXCEEDED: 1002,\n\n /** メモリ制限超過 */\n MEMORY_LIMIT_EXCEEDED: 1003,\n\n /** 出力サイズ制限超過 */\n OUTPUT_SIZE_LIMIT_EXCEEDED: 1004,\n\n /** 出力形式エラー */\n PRESENTATION_ERROR: 1005,\n\n /** コード中の禁止された表現 */\n FORBIDDEN_PATTERNS_IN_CODE_ERROR: 1006,\n\n /** コード中の必要な表現 */\n REQUIRED_PATTERNS_IN_CODE_ERROR: 1007,\n\n /** ビルドエラー */\n BUILD_ERROR: 1100,\n\n /** ビルド時間制限超過 */\n BUILD_TIME_LIMIT_EXCEEDED: 1101,\n\n /** ビルドメモリ制限超過 */\n BUILD_MEMORY_LIMIT_EXCEEDED: 1102,\n\n /** ビルド時の出力サイズ制限超過 */\n BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED: 1103,\n\n /** 必須ファイル不足 */\n MISSING_REQUIRED_SUBMISSION_FILE_ERROR: 1201,\n\n /** 必須出力ファイル不足 */\n MISSING_REQUIRED_OUTPUT_FILE_ERROR: 1202,\n\n /**\n * 受理\n *\n * 最大の値であり、降順で取得したときに最初に見つかることが保証されている。\n */\n ACCEPTED: 2000,\n} as const;\n\nexport type DecisionCode = (typeof DecisionCode)[keyof typeof DecisionCode];\n"],"mappings":"aAAA,MAAa,EAAe,CAE1B,cAAe,EAGf,oBAAqB,EAGrB,aAAc,IAGd,cAAe,KAGf,oBAAqB,KAGrB,sBAAuB,KAGvB,2BAA4B,KAG5B,mBAAoB,KAGpB,iCAAkC,KAGlC,gCAAiC,KAGjC,YAAa,KAGb,0BAA2B,KAG3B,4BAA6B,KAG7B,iCAAkC,KAGlC,uCAAwC,KAGxC,mCAAoC,KAOpC,SAAU,GACZ"} |
@@ -1,2 +0,2 @@ | ||
| var E={WAITING_JUDGE:0,JUDGE_NOT_AVAILABLE:1,WRONG_ANSWER:1e3,RUNTIME_ERROR:1001,TIME_LIMIT_EXCEEDED:1002,MEMORY_LIMIT_EXCEEDED:1003,OUTPUT_SIZE_LIMIT_EXCEEDED:1004,PRESENTATION_ERROR:1005,FORBIDDEN_PATTERNS_IN_CODE_ERROR:1006,REQUIRED_PATTERNS_IN_CODE_ERROR:1007,BUILD_ERROR:1100,BUILD_TIME_LIMIT_EXCEEDED:1101,BUILD_MEMORY_LIMIT_EXCEEDED:1102,BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED:1103,MISSING_REQUIRED_SUBMISSION_FILE_ERROR:1201,MISSING_REQUIRED_OUTPUT_FILE_ERROR:1202,ACCEPTED:2e3};export{E as DecisionCode}; | ||
| //# sourceMappingURL=decisionCode.js.map | ||
| const e={WAITING_JUDGE:0,JUDGE_NOT_AVAILABLE:1,WRONG_ANSWER:1e3,RUNTIME_ERROR:1001,TIME_LIMIT_EXCEEDED:1002,MEMORY_LIMIT_EXCEEDED:1003,OUTPUT_SIZE_LIMIT_EXCEEDED:1004,PRESENTATION_ERROR:1005,FORBIDDEN_PATTERNS_IN_CODE_ERROR:1006,REQUIRED_PATTERNS_IN_CODE_ERROR:1007,BUILD_ERROR:1100,BUILD_TIME_LIMIT_EXCEEDED:1101,BUILD_MEMORY_LIMIT_EXCEEDED:1102,BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED:1103,MISSING_REQUIRED_SUBMISSION_FILE_ERROR:1201,MISSING_REQUIRED_OUTPUT_FILE_ERROR:1202,ACCEPTED:2e3};export{e as DecisionCode}; | ||
| //# sourceMappingURL=decisionCode.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"decisionCode.js","sources":["../../src/types/decisionCode.ts"],"sourcesContent":["export const DecisionCode = {\n /** ジャッジ待ち */\n WAITING_JUDGE: 0,\n\n /** ジャッジ利用不可 */\n JUDGE_NOT_AVAILABLE: 1,\n\n /** 不正解 */\n WRONG_ANSWER: 1000,\n\n /** 実行時エラー */\n RUNTIME_ERROR: 1001,\n\n /** 時間制限超過 */\n TIME_LIMIT_EXCEEDED: 1002,\n\n /** メモリ制限超過 */\n MEMORY_LIMIT_EXCEEDED: 1003,\n\n /** 出力サイズ制限超過 */\n OUTPUT_SIZE_LIMIT_EXCEEDED: 1004,\n\n /** 出力形式エラー */\n PRESENTATION_ERROR: 1005,\n\n /** コード中の禁止された表現 */\n FORBIDDEN_PATTERNS_IN_CODE_ERROR: 1006,\n\n /** コード中の必要な表現 */\n REQUIRED_PATTERNS_IN_CODE_ERROR: 1007,\n\n /** ビルドエラー */\n BUILD_ERROR: 1100,\n\n /** ビルド時間制限超過 */\n BUILD_TIME_LIMIT_EXCEEDED: 1101,\n\n /** ビルドメモリ制限超過 */\n BUILD_MEMORY_LIMIT_EXCEEDED: 1102,\n\n /** ビルド時の出力サイズ制限超過 */\n BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED: 1103,\n\n /** 必須ファイル不足 */\n MISSING_REQUIRED_SUBMISSION_FILE_ERROR: 1201,\n\n /** 必須出力ファイル不足 */\n MISSING_REQUIRED_OUTPUT_FILE_ERROR: 1202,\n\n /**\n * 受理\n *\n * 最大の値であり、降順で取得したときに最初に見つかることが保証されている。\n */\n ACCEPTED: 2000,\n} as const;\n\nexport type DecisionCode = (typeof DecisionCode)[keyof typeof DecisionCode];\n"],"names":["DecisionCode","WAITING_JUDGE","JUDGE_NOT_AVAILABLE","WRONG_ANSWER","RUNTIME_ERROR","TIME_LIMIT_EXCEEDED","MEMORY_LIMIT_EXCEEDED","OUTPUT_SIZE_LIMIT_EXCEEDED","PRESENTATION_ERROR","FORBIDDEN_PATTERNS_IN_CODE_ERROR","REQUIRED_PATTERNS_IN_CODE_ERROR","BUILD_ERROR","BUILD_TIME_LIMIT_EXCEEDED","BUILD_MEMORY_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","MISSING_REQUIRED_OUTPUT_FILE_ERROR","ACCEPTED"],"mappings":"AAAO,IAAMA,EAAe,CAE1BC,cAAe,EAGfC,oBAAqB,EAGrBC,aAAc,IAGdC,cAAe,KAGfC,oBAAqB,KAGrBC,sBAAuB,KAGvBC,2BAA4B,KAG5BC,mBAAoB,KAGpBC,iCAAkC,KAGlCC,gCAAiC,KAGjCC,YAAa,KAGbC,0BAA2B,KAG3BC,4BAA6B,KAG7BC,iCAAkC,KAGlCC,uCAAwC,KAGxCC,mCAAoC,KAOpCC,SAAU"} | ||
| {"version":3,"file":"decisionCode.js","names":[],"sources":["../../src/types/decisionCode.ts"],"sourcesContent":["export const DecisionCode = {\n /** ジャッジ待ち */\n WAITING_JUDGE: 0,\n\n /** ジャッジ利用不可 */\n JUDGE_NOT_AVAILABLE: 1,\n\n /** 不正解 */\n WRONG_ANSWER: 1000,\n\n /** 実行時エラー */\n RUNTIME_ERROR: 1001,\n\n /** 時間制限超過 */\n TIME_LIMIT_EXCEEDED: 1002,\n\n /** メモリ制限超過 */\n MEMORY_LIMIT_EXCEEDED: 1003,\n\n /** 出力サイズ制限超過 */\n OUTPUT_SIZE_LIMIT_EXCEEDED: 1004,\n\n /** 出力形式エラー */\n PRESENTATION_ERROR: 1005,\n\n /** コード中の禁止された表現 */\n FORBIDDEN_PATTERNS_IN_CODE_ERROR: 1006,\n\n /** コード中の必要な表現 */\n REQUIRED_PATTERNS_IN_CODE_ERROR: 1007,\n\n /** ビルドエラー */\n BUILD_ERROR: 1100,\n\n /** ビルド時間制限超過 */\n BUILD_TIME_LIMIT_EXCEEDED: 1101,\n\n /** ビルドメモリ制限超過 */\n BUILD_MEMORY_LIMIT_EXCEEDED: 1102,\n\n /** ビルド時の出力サイズ制限超過 */\n BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED: 1103,\n\n /** 必須ファイル不足 */\n MISSING_REQUIRED_SUBMISSION_FILE_ERROR: 1201,\n\n /** 必須出力ファイル不足 */\n MISSING_REQUIRED_OUTPUT_FILE_ERROR: 1202,\n\n /**\n * 受理\n *\n * 最大の値であり、降順で取得したときに最初に見つかることが保証されている。\n */\n ACCEPTED: 2000,\n} as const;\n\nexport type DecisionCode = (typeof DecisionCode)[keyof typeof DecisionCode];\n"],"mappings":"AAAA,MAAa,EAAe,CAE1B,cAAe,EAGf,oBAAqB,EAGrB,aAAc,IAGd,cAAe,KAGf,oBAAqB,KAGrB,sBAAuB,KAGvB,2BAA4B,KAG5B,mBAAoB,KAGpB,iCAAkC,KAGlC,gCAAiC,KAGjC,YAAa,KAGb,0BAA2B,KAG3B,4BAA6B,KAG7B,iCAAkC,KAGlC,uCAAwC,KAGxC,mCAAoC,KAOpC,SAAU,GACZ"} |
@@ -1,2 +0,11 @@ | ||
| "use strict";var n,e,o=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("node:fs"),t=require("node:path"),s=require("../helpers/removeCommentsInSourceCode.cjs"),i={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},c={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/},{open:/`/,close:/(?<!\\)(?:\\{2})*`/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},a={c:{fileExtensions:[".c"],buildCommand:function(n){return["gcc","--std=c17","-O2",n,"-o","main"]},command:function(){return["./main"]},grammer:i},cpp:{fileExtensions:[".cpp"],buildCommand:function(n){return["g++","--std=c++20","-O2",n,"-o","main"]},command:function(){return["./main"]},grammer:i},csharp:{fileExtensions:[".cs"],prebuild:(e=o.asyncToGenerator(o.regenerator().m(function n(e){return o.regenerator().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,r.promises.writeFile(t.join(e,"Main.csproj"),'<Project Sdk="Microsoft.NET.Sdk">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>');case 1:return n.a(2)}},n)})),function(n){return e.apply(this,arguments)}),buildCommand:function(){return["dotnet","build","Main.csproj","--configuration","Release","--verbosity","quiet"]},command:function(){return["dotnet","bin/Release/net8.0/Main.dll"]},grammer:i},css:{fileExtensions:[".css"],command:function(){return["echo",""]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//}]}},dart:{fileExtensions:[".dart"],buildCommand:function(n){return["dart","compile","exe",n,"-o","main"]},command:function(){return["./main"]},grammer:i},java:{fileExtensions:[".java"],prebuild:(n=o.asyncToGenerator(o.regenerator().m(function n(e){var c,a,m,u,l,p,f,d,g,b,x;return o.regenerator().w(function(n){for(;;)switch(n.p=n.n){case 0:return c=/\bpublic\s+class\s+(\w+)\b/,b=o.createForOfIteratorHelper,n.n=1,r.promises.readdir(e,{withFileTypes:!0});case 1:a=b(n.v),n.p=2,a.s();case 3:if((m=a.n()).done){n.n=7;break}if((l=m.value).isFile()&&l.name.endsWith(".java")){n.n=4;break}return n.a(3,6);case 4:return n.n=5,r.promises.readFile(t.join(e,l.name),"utf8");case 5:if(p=n.v,f=null!=(u=c.exec(s.removeCommentsInSourceCode(i,p)))?u:[],d=o.slicedToArray(f,2),!(g=d[1])){n.n=6;break}return n.n=6,r.promises.rename(t.join(e,l.name),t.join(e,"".concat(g,".java")));case 6:n.n=3;break;case 7:n.n=9;break;case 8:n.p=8,x=n.v,a.e(x);case 9:return n.p=9,a.f(),n.f(9);case 10:return n.a(2)}},n,null,[[2,8,9,10]])})),function(e){return n.apply(this,arguments)}),buildCommand:function(n){return["javac",n]},command:function(n){return["java","-Xmx1024m",n.replace(/\.java$/,"")]},grammer:i},javascript:{fileExtensions:[".js",".cjs",".mjs"],command:function(n){return["bun",n]},grammer:c},jsp:{fileExtensions:[".jsp"],command:function(){return["echo",""]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/},{open:/\n?[ \t]*<%--/,close:/--%>/},{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]}},haskell:{fileExtensions:[".hs"],buildCommand:function(n){return["ghc","-o","main",n]},command:function(){return["./main"]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\{-/,close:/-\}/},{open:/\n?[ \t]*--/}]}},html:{fileExtensions:[".html"],command:function(){return["echo",""]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/}]}},php:{fileExtensions:[".php"],command:function(n){return["php",n]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//},{open:/\n?[ \t]*#/}]}},python:{fileExtensions:[".py"],command:function(n){return["python3",n]},grammer:{strings:[{open:/'''/,close:/(?<!\\)(?:\\{2})*'''/},{open:/"""/,close:/(?<!\\)(?:\\{2})*"""/},{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*'''/,close:/'''/},{open:/\n?[ \t]*"""/,close:/"""/},{open:/\n?[ \t]*#/}]}},ruby:{fileExtensions:[".rb"],buildCommand:function(n){return["ruby","-c",n]},command:function(n){return["ruby","--jit",n]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*=begin/,close:/=end/},{open:/\n?[ \t]*#/}]}},rust:{fileExtensions:[".rs"],buildCommand:function(n){return["rustc",n,"-o","main"]},command:function(){return["./main"]},grammer:i},zig:{fileExtensions:[".zig"],buildCommand:function(n){return["zig","build-exe",n]},command:function(n){return["./"+n.replace(/\.zig$/,"")]},grammer:i},typescript:{fileExtensions:[".ts",".cts",".mts"],command:function(n){return["bun",n]},grammer:c},text:{fileExtensions:[".txt"],command:function(n){return["cat",n]}}};exports.languageIdToDefinition=a; | ||
| //# sourceMappingURL=language.cjs.map | ||
| "use strict";const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../helpers/removeCommentsInSourceCode.cjs");let n=require("node:path");n=e.__toESM(n,1);let r=require("node:fs");r=e.__toESM(r,1);const i={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},a={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/},{open:/`/,close:/(?<!\\)(?:\\{2})*`/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},o={c:{fileExtensions:[`.c`],buildCommand:e=>[`gcc`,`--std=c17`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},cpp:{fileExtensions:[`.cpp`],buildCommand:e=>[`g++`,`--std=c++20`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},csharp:{fileExtensions:[`.cs`],prebuild:async e=>{await r.default.promises.writeFile(n.default.join(e,`Main.csproj`),`<Project Sdk="Microsoft.NET.Sdk"> | ||
| <PropertyGroup> | ||
| <OutputType>Exe</OutputType> | ||
| <TargetFramework>net8.0</TargetFramework> | ||
| <ImplicitUsings>enable</ImplicitUsings> | ||
| <Nullable>enable</Nullable> | ||
| <AllowUnsafeBlocks>true</AllowUnsafeBlocks> | ||
| <AssemblyName>Main</AssemblyName> | ||
| </PropertyGroup> | ||
| </Project>`)},buildCommand:()=>[`dotnet`,`build`,`Main.csproj`,`--configuration`,`Release`,`--verbosity`,`quiet`],command:()=>[`dotnet`,`bin/Release/net8.0/Main.dll`],grammer:i},css:{fileExtensions:[`.css`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//}]}},dart:{fileExtensions:[`.dart`],buildCommand:e=>[`dart`,`compile`,`exe`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},java:{fileExtensions:[`.java`],prebuild:async e=>{let a=/\bpublic\s+class\s+(\w+)\b/;for(let o of await r.default.promises.readdir(e,{withFileTypes:!0})){if(!o.isFile()||!o.name.endsWith(`.java`))continue;let s=await r.default.promises.readFile(n.default.join(e,o.name),`utf8`),[,c]=a.exec(t.removeCommentsInSourceCode(i,s))??[];c&&await r.default.promises.rename(n.default.join(e,o.name),n.default.join(e,`${c}.java`))}},buildCommand:e=>[`javac`,e],command:e=>[`java`,`-Xmx1024m`,e.replace(/\.java$/,``)],grammer:i},javascript:{fileExtensions:[`.js`,`.cjs`,`.mjs`],command:e=>[`bun`,e],grammer:a},jsp:{fileExtensions:[`.jsp`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/},{open:/\n?[ \t]*<%--/,close:/--%>/},{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]}},haskell:{fileExtensions:[`.hs`],buildCommand:e=>[`ghc`,`-o`,`main`,e],command:()=>[`./main`],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\{-/,close:/-\}/},{open:/\n?[ \t]*--/}]}},html:{fileExtensions:[`.html`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/}]}},php:{fileExtensions:[`.php`],command:e=>[`php`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//},{open:/\n?[ \t]*#/}]}},python:{fileExtensions:[`.py`],command:e=>[`python3`,e],grammer:{strings:[{open:/'''/,close:/(?<!\\)(?:\\{2})*'''/},{open:/"""/,close:/(?<!\\)(?:\\{2})*"""/},{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*'''/,close:/'''/},{open:/\n?[ \t]*"""/,close:/"""/},{open:/\n?[ \t]*#/}]}},ruby:{fileExtensions:[`.rb`],buildCommand:e=>[`ruby`,`-c`,e],command:e=>[`ruby`,`--jit`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*=begin/,close:/=end/},{open:/\n?[ \t]*#/}]}},rust:{fileExtensions:[`.rs`],buildCommand:e=>[`rustc`,e,`-o`,`main`],command:()=>[`./main`],grammer:i},zig:{fileExtensions:[`.zig`],buildCommand:e=>[`zig`,`build-exe`,e],command:e=>[`./`+e.replace(/\.zig$/,``)],grammer:i},typescript:{fileExtensions:[`.ts`,`.cts`,`.mts`],command:e=>[`bun`,e],grammer:a},text:{fileExtensions:[`.txt`],command:e=>[`cat`,e]}};exports.languageIdToDefinition=o; | ||
| //# sourceMappingURL=language.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"language.cjs","sources":["../../src/types/language.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { removeCommentsInSourceCode } from '../helpers/removeCommentsInSourceCode.js';\n\nexport interface LanguageDefinition {\n /** File extensions to judge with this config. */\n fileExtensions: readonly string[];\n\n /** Function executed before the build. */\n prebuild?(cwd: string): Promise<void>;\n\n /** Returns the command to build a user program. */\n buildCommand?(filePath: string): [string, ...string[]];\n\n /** Returns the command to run a user program. */\n command(filePath: string): [string, ...string[]];\n\n /** Grammer definition for static analysis. */\n grammer?: {\n strings?: readonly { open: RegExp; close: RegExp }[];\n comments?: readonly { open: RegExp; close?: RegExp }[];\n };\n}\n\nconst cLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nconst javaScriptLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n { open: /`/, close: /(?<!\\\\)(?:\\\\{2})*`/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nexport const languageIdToDefinition: Readonly<Record<string, Readonly<LanguageDefinition>>> = {\n c: {\n fileExtensions: ['.c'],\n buildCommand: (filePath) => ['gcc', '--std=c17', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n cpp: {\n fileExtensions: ['.cpp'],\n buildCommand: (filePath) => ['g++', '--std=c++20', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n csharp: {\n fileExtensions: ['.cs'],\n prebuild: async (cwd) => {\n await fs.promises.writeFile(\n path.join(cwd, 'Main.csproj'),\n `<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>`\n );\n },\n buildCommand: () => ['dotnet', 'build', 'Main.csproj', '--configuration', 'Release', '--verbosity', 'quiet'],\n command: () => ['dotnet', 'bin/Release/net8.0/Main.dll'],\n grammer: cLikeGrammer,\n },\n\n css: {\n fileExtensions: ['.css'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }],\n },\n },\n\n dart: {\n fileExtensions: ['.dart'],\n buildCommand: (filePath) => ['dart', 'compile', 'exe', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n java: {\n fileExtensions: ['.java'],\n prebuild: async (cwd) => {\n const publicClassRegex = /\\bpublic\\s+class\\s+(\\w+)\\b/;\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile() || !dirent.name.endsWith('.java')) continue;\n const data = await fs.promises.readFile(path.join(cwd, dirent.name), 'utf8');\n const [, className] = publicClassRegex.exec(removeCommentsInSourceCode(cLikeGrammer, data)) ?? [];\n if (className) await fs.promises.rename(path.join(cwd, dirent.name), path.join(cwd, `${className}.java`));\n }\n },\n buildCommand: (fileName) => ['javac', fileName],\n // For example, Problem 7-3 in WillBooster's Java lecture uses at least 256MB.\n command: (fileName) => ['java', '-Xmx1024m', fileName.replace(/\\.java$/, '')],\n grammer: cLikeGrammer,\n },\n\n javascript: {\n fileExtensions: ['.js', '.cjs', '.mjs'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n jsp: {\n fileExtensions: ['.jsp'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*<!--/, close: /-->/ },\n { open: /\\n?[ \\t]*<%--/, close: /--%>/ },\n { open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// },\n { open: /\\n?[ \\t]*\\/\\// },\n ],\n },\n },\n\n haskell: {\n fileExtensions: ['.hs'],\n buildCommand: (filePath) => ['ghc', '-o', 'main', filePath],\n command: () => ['./main'],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\{-/, close: /-\\}/ }, { open: /\\n?[ \\t]*--/ }],\n },\n },\n\n html: {\n fileExtensions: ['.html'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*<!--/, close: /-->/ }],\n },\n },\n\n php: {\n fileExtensions: ['.php'],\n command: (fileName) => ['php', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n python: {\n fileExtensions: ['.py'],\n command: (fileName) => ['python3', fileName],\n grammer: {\n strings: [\n { open: /'''/, close: /(?<!\\\\)(?:\\\\{2})*'''/ },\n { open: /\"\"\"/, close: /(?<!\\\\)(?:\\\\{2})*\"\"\"/ },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*'''/, close: /'''/ },\n { open: /\\n?[ \\t]*\"\"\"/, close: /\"\"\"/ },\n { open: /\\n?[ \\t]*#/ },\n ],\n },\n },\n\n ruby: {\n fileExtensions: ['.rb'],\n buildCommand: (fileName) => ['ruby', '-c', fileName],\n command: (fileName) => ['ruby', '--jit', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*=begin/, close: /=end/ }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n rust: {\n fileExtensions: ['.rs'],\n buildCommand: (filePath) => ['rustc', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n zig: {\n fileExtensions: ['.zig'],\n buildCommand: (filePath) => ['zig', 'build-exe', filePath],\n command: (filePath) => ['./' + filePath.replace(/\\.zig$/, '')],\n grammer: cLikeGrammer,\n },\n\n typescript: {\n fileExtensions: ['.ts', '.cts', '.mts'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n text: {\n fileExtensions: ['.txt'],\n command: (fileName) => ['cat', fileName],\n },\n} as const;\n"],"names":["_prebuild2","_prebuild","cLikeGrammer","strings","open","close","comments","javaScriptLikeGrammer","languageIdToDefinition","c","fileExtensions","buildCommand","filePath","command","grammer","cpp","csharp","prebuild","_asyncToGenerator","_regenerator","m","_callee","cwd","w","_context","n","fs","promises","writeFile","path","join","a","_x","apply","this","arguments","css","dart","java","_callee2","publicClassRegex","_iterator","_step","_publicClassRegex$exe","dirent","data","_ref","_ref2","className","_t","_t2","_context2","p","_createForOfIteratorHelper","readdir","withFileTypes","v","s","done","value","isFile","name","endsWith","readFile","exec","removeCommentsInSourceCode","_slicedToArray","rename","concat","e","f","_x2","fileName","replace","javascript","jsp","haskell","html","php","python","ruby","rust","zig","typescript","text"],"mappings":"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"} | ||
| {"version":3,"file":"language.cjs","names":["fs","path","removeCommentsInSourceCode"],"sources":["../../src/types/language.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { removeCommentsInSourceCode } from '../helpers/removeCommentsInSourceCode.js';\n\nexport interface LanguageDefinition {\n /** File extensions to judge with this config. */\n fileExtensions: readonly string[];\n\n /** Function executed before the build. */\n prebuild?(cwd: string): Promise<void>;\n\n /** Returns the command to build a user program. */\n buildCommand?(filePath: string): [string, ...string[]];\n\n /** Returns the command to run a user program. */\n command(filePath: string): [string, ...string[]];\n\n /** Grammer definition for static analysis. */\n grammer?: {\n strings?: readonly { open: RegExp; close: RegExp }[];\n comments?: readonly { open: RegExp; close?: RegExp }[];\n };\n}\n\nconst cLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nconst javaScriptLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n { open: /`/, close: /(?<!\\\\)(?:\\\\{2})*`/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nexport const languageIdToDefinition: Readonly<Record<string, Readonly<LanguageDefinition>>> = {\n c: {\n fileExtensions: ['.c'],\n buildCommand: (filePath) => ['gcc', '--std=c17', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n cpp: {\n fileExtensions: ['.cpp'],\n buildCommand: (filePath) => ['g++', '--std=c++20', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n csharp: {\n fileExtensions: ['.cs'],\n prebuild: async (cwd) => {\n await fs.promises.writeFile(\n path.join(cwd, 'Main.csproj'),\n `<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>`\n );\n },\n buildCommand: () => ['dotnet', 'build', 'Main.csproj', '--configuration', 'Release', '--verbosity', 'quiet'],\n command: () => ['dotnet', 'bin/Release/net8.0/Main.dll'],\n grammer: cLikeGrammer,\n },\n\n css: {\n fileExtensions: ['.css'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }],\n },\n },\n\n dart: {\n fileExtensions: ['.dart'],\n buildCommand: (filePath) => ['dart', 'compile', 'exe', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n java: {\n fileExtensions: ['.java'],\n prebuild: async (cwd) => {\n const publicClassRegex = /\\bpublic\\s+class\\s+(\\w+)\\b/;\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile() || !dirent.name.endsWith('.java')) continue;\n const data = await fs.promises.readFile(path.join(cwd, dirent.name), 'utf8');\n const [, className] = publicClassRegex.exec(removeCommentsInSourceCode(cLikeGrammer, data)) ?? [];\n if (className) await fs.promises.rename(path.join(cwd, dirent.name), path.join(cwd, `${className}.java`));\n }\n },\n buildCommand: (fileName) => ['javac', fileName],\n // For example, Problem 7-3 in WillBooster's Java lecture uses at least 256MB.\n command: (fileName) => ['java', '-Xmx1024m', fileName.replace(/\\.java$/, '')],\n grammer: cLikeGrammer,\n },\n\n javascript: {\n fileExtensions: ['.js', '.cjs', '.mjs'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n jsp: {\n fileExtensions: ['.jsp'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*<!--/, close: /-->/ },\n { open: /\\n?[ \\t]*<%--/, close: /--%>/ },\n { open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// },\n { open: /\\n?[ \\t]*\\/\\// },\n ],\n },\n },\n\n haskell: {\n fileExtensions: ['.hs'],\n buildCommand: (filePath) => ['ghc', '-o', 'main', filePath],\n command: () => ['./main'],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\{-/, close: /-\\}/ }, { open: /\\n?[ \\t]*--/ }],\n },\n },\n\n html: {\n fileExtensions: ['.html'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*<!--/, close: /-->/ }],\n },\n },\n\n php: {\n fileExtensions: ['.php'],\n command: (fileName) => ['php', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n python: {\n fileExtensions: ['.py'],\n command: (fileName) => ['python3', fileName],\n grammer: {\n strings: [\n { open: /'''/, close: /(?<!\\\\)(?:\\\\{2})*'''/ },\n { open: /\"\"\"/, close: /(?<!\\\\)(?:\\\\{2})*\"\"\"/ },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*'''/, close: /'''/ },\n { open: /\\n?[ \\t]*\"\"\"/, close: /\"\"\"/ },\n { open: /\\n?[ \\t]*#/ },\n ],\n },\n },\n\n ruby: {\n fileExtensions: ['.rb'],\n buildCommand: (fileName) => ['ruby', '-c', fileName],\n command: (fileName) => ['ruby', '--jit', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*=begin/, close: /=end/ }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n rust: {\n fileExtensions: ['.rs'],\n buildCommand: (filePath) => ['rustc', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n zig: {\n fileExtensions: ['.zig'],\n buildCommand: (filePath) => ['zig', 'build-exe', filePath],\n command: (filePath) => ['./' + filePath.replace(/\\.zig$/, '')],\n grammer: cLikeGrammer,\n },\n\n typescript: {\n fileExtensions: ['.ts', '.cts', '.mts'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n text: {\n fileExtensions: ['.txt'],\n command: (fileName) => ['cat', fileName],\n },\n} as const;\n"],"mappings":"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"} |
@@ -1,2 +0,11 @@ | ||
| import{asyncToGenerator as n,regenerator as e,slicedToArray as o,createForOfIteratorHelper as r}from"../_virtual/_rollupPluginBabelHelpers.js";import t from"node:fs";import s from"node:path";import{removeCommentsInSourceCode as i}from"../helpers/removeCommentsInSourceCode.js";var c,m,a={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},l={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/},{open:/`/,close:/(?<!\\)(?:\\{2})*`/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},u={c:{fileExtensions:[".c"],buildCommand:function(n){return["gcc","--std=c17","-O2",n,"-o","main"]},command:function(){return["./main"]},grammer:a},cpp:{fileExtensions:[".cpp"],buildCommand:function(n){return["g++","--std=c++20","-O2",n,"-o","main"]},command:function(){return["./main"]},grammer:a},csharp:{fileExtensions:[".cs"],prebuild:(m=n(e().m(function n(o){return e().w(function(n){for(;;)switch(n.n){case 0:return n.n=1,t.promises.writeFile(s.join(o,"Main.csproj"),'<Project Sdk="Microsoft.NET.Sdk">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>');case 1:return n.a(2)}},n)})),function(n){return m.apply(this,arguments)}),buildCommand:function(){return["dotnet","build","Main.csproj","--configuration","Release","--verbosity","quiet"]},command:function(){return["dotnet","bin/Release/net8.0/Main.dll"]},grammer:a},css:{fileExtensions:[".css"],command:function(){return["echo",""]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//}]}},dart:{fileExtensions:[".dart"],buildCommand:function(n){return["dart","compile","exe",n,"-o","main"]},command:function(){return["./main"]},grammer:a},java:{fileExtensions:[".java"],prebuild:(c=n(e().m(function n(c){var m,l,u,p,f,d,g,b,x,j,h;return e().w(function(n){for(;;)switch(n.p=n.n){case 0:return m=/\bpublic\s+class\s+(\w+)\b/,j=r,n.n=1,t.promises.readdir(c,{withFileTypes:!0});case 1:l=j(n.v),n.p=2,l.s();case 3:if((u=l.n()).done){n.n=7;break}if((f=u.value).isFile()&&f.name.endsWith(".java")){n.n=4;break}return n.a(3,6);case 4:return n.n=5,t.promises.readFile(s.join(c,f.name),"utf8");case 5:if(d=n.v,g=null!=(p=m.exec(i(a,d)))?p:[],b=o(g,2),!(x=b[1])){n.n=6;break}return n.n=6,t.promises.rename(s.join(c,f.name),s.join(c,"".concat(x,".java")));case 6:n.n=3;break;case 7:n.n=9;break;case 8:n.p=8,h=n.v,l.e(h);case 9:return n.p=9,l.f(),n.f(9);case 10:return n.a(2)}},n,null,[[2,8,9,10]])})),function(n){return c.apply(this,arguments)}),buildCommand:function(n){return["javac",n]},command:function(n){return["java","-Xmx1024m",n.replace(/\.java$/,"")]},grammer:a},javascript:{fileExtensions:[".js",".cjs",".mjs"],command:function(n){return["bun",n]},grammer:l},jsp:{fileExtensions:[".jsp"],command:function(){return["echo",""]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/},{open:/\n?[ \t]*<%--/,close:/--%>/},{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]}},haskell:{fileExtensions:[".hs"],buildCommand:function(n){return["ghc","-o","main",n]},command:function(){return["./main"]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\{-/,close:/-\}/},{open:/\n?[ \t]*--/}]}},html:{fileExtensions:[".html"],command:function(){return["echo",""]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/}]}},php:{fileExtensions:[".php"],command:function(n){return["php",n]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//},{open:/\n?[ \t]*#/}]}},python:{fileExtensions:[".py"],command:function(n){return["python3",n]},grammer:{strings:[{open:/'''/,close:/(?<!\\)(?:\\{2})*'''/},{open:/"""/,close:/(?<!\\)(?:\\{2})*"""/},{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*'''/,close:/'''/},{open:/\n?[ \t]*"""/,close:/"""/},{open:/\n?[ \t]*#/}]}},ruby:{fileExtensions:[".rb"],buildCommand:function(n){return["ruby","-c",n]},command:function(n){return["ruby","--jit",n]},grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*=begin/,close:/=end/},{open:/\n?[ \t]*#/}]}},rust:{fileExtensions:[".rs"],buildCommand:function(n){return["rustc",n,"-o","main"]},command:function(){return["./main"]},grammer:a},zig:{fileExtensions:[".zig"],buildCommand:function(n){return["zig","build-exe",n]},command:function(n){return["./"+n.replace(/\.zig$/,"")]},grammer:a},typescript:{fileExtensions:[".ts",".cts",".mts"],command:function(n){return["bun",n]},grammer:l},text:{fileExtensions:[".txt"],command:function(n){return["cat",n]}}};export{u as languageIdToDefinition}; | ||
| //# sourceMappingURL=language.js.map | ||
| import{removeCommentsInSourceCode as e}from"../helpers/removeCommentsInSourceCode.js";import t from"node:path";import n from"node:fs";const r={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},i={strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/},{open:/`/,close:/(?<!\\)(?:\\{2})*`/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]},a={c:{fileExtensions:[`.c`],buildCommand:e=>[`gcc`,`--std=c17`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:r},cpp:{fileExtensions:[`.cpp`],buildCommand:e=>[`g++`,`--std=c++20`,`-O2`,e,`-o`,`main`],command:()=>[`./main`],grammer:r},csharp:{fileExtensions:[`.cs`],prebuild:async e=>{await n.promises.writeFile(t.join(e,`Main.csproj`),`<Project Sdk="Microsoft.NET.Sdk"> | ||
| <PropertyGroup> | ||
| <OutputType>Exe</OutputType> | ||
| <TargetFramework>net8.0</TargetFramework> | ||
| <ImplicitUsings>enable</ImplicitUsings> | ||
| <Nullable>enable</Nullable> | ||
| <AllowUnsafeBlocks>true</AllowUnsafeBlocks> | ||
| <AssemblyName>Main</AssemblyName> | ||
| </PropertyGroup> | ||
| </Project>`)},buildCommand:()=>[`dotnet`,`build`,`Main.csproj`,`--configuration`,`Release`,`--verbosity`,`quiet`],command:()=>[`dotnet`,`bin/Release/net8.0/Main.dll`],grammer:r},css:{fileExtensions:[`.css`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//}]}},dart:{fileExtensions:[`.dart`],buildCommand:e=>[`dart`,`compile`,`exe`,e,`-o`,`main`],command:()=>[`./main`],grammer:r},java:{fileExtensions:[`.java`],prebuild:async i=>{let a=/\bpublic\s+class\s+(\w+)\b/;for(let o of await n.promises.readdir(i,{withFileTypes:!0})){if(!o.isFile()||!o.name.endsWith(`.java`))continue;let s=await n.promises.readFile(t.join(i,o.name),`utf8`),[,c]=a.exec(e(r,s))??[];c&&await n.promises.rename(t.join(i,o.name),t.join(i,`${c}.java`))}},buildCommand:e=>[`javac`,e],command:e=>[`java`,`-Xmx1024m`,e.replace(/\.java$/,``)],grammer:r},javascript:{fileExtensions:[`.js`,`.cjs`,`.mjs`],command:e=>[`bun`,e],grammer:i},jsp:{fileExtensions:[`.jsp`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/},{open:/\n?[ \t]*<%--/,close:/--%>/},{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//}]}},haskell:{fileExtensions:[`.hs`],buildCommand:e=>[`ghc`,`-o`,`main`,e],command:()=>[`./main`],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\{-/,close:/-\}/},{open:/\n?[ \t]*--/}]}},html:{fileExtensions:[`.html`],command:()=>[`echo`,``],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*<!--/,close:/-->/}]}},php:{fileExtensions:[`.php`],command:e=>[`php`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*\/\*/,close:/\*\//},{open:/\n?[ \t]*\/\//},{open:/\n?[ \t]*#/}]}},python:{fileExtensions:[`.py`],command:e=>[`python3`,e],grammer:{strings:[{open:/'''/,close:/(?<!\\)(?:\\{2})*'''/},{open:/"""/,close:/(?<!\\)(?:\\{2})*"""/},{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*'''/,close:/'''/},{open:/\n?[ \t]*"""/,close:/"""/},{open:/\n?[ \t]*#/}]}},ruby:{fileExtensions:[`.rb`],buildCommand:e=>[`ruby`,`-c`,e],command:e=>[`ruby`,`--jit`,e],grammer:{strings:[{open:/'/,close:/(?<!\\)(?:\\{2})*'/},{open:/"/,close:/(?<!\\)(?:\\{2})*"/}],comments:[{open:/\n?[ \t]*=begin/,close:/=end/},{open:/\n?[ \t]*#/}]}},rust:{fileExtensions:[`.rs`],buildCommand:e=>[`rustc`,e,`-o`,`main`],command:()=>[`./main`],grammer:r},zig:{fileExtensions:[`.zig`],buildCommand:e=>[`zig`,`build-exe`,e],command:e=>[`./`+e.replace(/\.zig$/,``)],grammer:r},typescript:{fileExtensions:[`.ts`,`.cts`,`.mts`],command:e=>[`bun`,e],grammer:i},text:{fileExtensions:[`.txt`],command:e=>[`cat`,e]}};export{a as languageIdToDefinition}; | ||
| //# sourceMappingURL=language.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"language.js","sources":["../../src/types/language.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { removeCommentsInSourceCode } from '../helpers/removeCommentsInSourceCode.js';\n\nexport interface LanguageDefinition {\n /** File extensions to judge with this config. */\n fileExtensions: readonly string[];\n\n /** Function executed before the build. */\n prebuild?(cwd: string): Promise<void>;\n\n /** Returns the command to build a user program. */\n buildCommand?(filePath: string): [string, ...string[]];\n\n /** Returns the command to run a user program. */\n command(filePath: string): [string, ...string[]];\n\n /** Grammer definition for static analysis. */\n grammer?: {\n strings?: readonly { open: RegExp; close: RegExp }[];\n comments?: readonly { open: RegExp; close?: RegExp }[];\n };\n}\n\nconst cLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nconst javaScriptLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n { open: /`/, close: /(?<!\\\\)(?:\\\\{2})*`/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nexport const languageIdToDefinition: Readonly<Record<string, Readonly<LanguageDefinition>>> = {\n c: {\n fileExtensions: ['.c'],\n buildCommand: (filePath) => ['gcc', '--std=c17', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n cpp: {\n fileExtensions: ['.cpp'],\n buildCommand: (filePath) => ['g++', '--std=c++20', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n csharp: {\n fileExtensions: ['.cs'],\n prebuild: async (cwd) => {\n await fs.promises.writeFile(\n path.join(cwd, 'Main.csproj'),\n `<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>`\n );\n },\n buildCommand: () => ['dotnet', 'build', 'Main.csproj', '--configuration', 'Release', '--verbosity', 'quiet'],\n command: () => ['dotnet', 'bin/Release/net8.0/Main.dll'],\n grammer: cLikeGrammer,\n },\n\n css: {\n fileExtensions: ['.css'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }],\n },\n },\n\n dart: {\n fileExtensions: ['.dart'],\n buildCommand: (filePath) => ['dart', 'compile', 'exe', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n java: {\n fileExtensions: ['.java'],\n prebuild: async (cwd) => {\n const publicClassRegex = /\\bpublic\\s+class\\s+(\\w+)\\b/;\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile() || !dirent.name.endsWith('.java')) continue;\n const data = await fs.promises.readFile(path.join(cwd, dirent.name), 'utf8');\n const [, className] = publicClassRegex.exec(removeCommentsInSourceCode(cLikeGrammer, data)) ?? [];\n if (className) await fs.promises.rename(path.join(cwd, dirent.name), path.join(cwd, `${className}.java`));\n }\n },\n buildCommand: (fileName) => ['javac', fileName],\n // For example, Problem 7-3 in WillBooster's Java lecture uses at least 256MB.\n command: (fileName) => ['java', '-Xmx1024m', fileName.replace(/\\.java$/, '')],\n grammer: cLikeGrammer,\n },\n\n javascript: {\n fileExtensions: ['.js', '.cjs', '.mjs'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n jsp: {\n fileExtensions: ['.jsp'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*<!--/, close: /-->/ },\n { open: /\\n?[ \\t]*<%--/, close: /--%>/ },\n { open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// },\n { open: /\\n?[ \\t]*\\/\\// },\n ],\n },\n },\n\n haskell: {\n fileExtensions: ['.hs'],\n buildCommand: (filePath) => ['ghc', '-o', 'main', filePath],\n command: () => ['./main'],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\{-/, close: /-\\}/ }, { open: /\\n?[ \\t]*--/ }],\n },\n },\n\n html: {\n fileExtensions: ['.html'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*<!--/, close: /-->/ }],\n },\n },\n\n php: {\n fileExtensions: ['.php'],\n command: (fileName) => ['php', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n python: {\n fileExtensions: ['.py'],\n command: (fileName) => ['python3', fileName],\n grammer: {\n strings: [\n { open: /'''/, close: /(?<!\\\\)(?:\\\\{2})*'''/ },\n { open: /\"\"\"/, close: /(?<!\\\\)(?:\\\\{2})*\"\"\"/ },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*'''/, close: /'''/ },\n { open: /\\n?[ \\t]*\"\"\"/, close: /\"\"\"/ },\n { open: /\\n?[ \\t]*#/ },\n ],\n },\n },\n\n ruby: {\n fileExtensions: ['.rb'],\n buildCommand: (fileName) => ['ruby', '-c', fileName],\n command: (fileName) => ['ruby', '--jit', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*=begin/, close: /=end/ }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n rust: {\n fileExtensions: ['.rs'],\n buildCommand: (filePath) => ['rustc', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n zig: {\n fileExtensions: ['.zig'],\n buildCommand: (filePath) => ['zig', 'build-exe', filePath],\n command: (filePath) => ['./' + filePath.replace(/\\.zig$/, '')],\n grammer: cLikeGrammer,\n },\n\n typescript: {\n fileExtensions: ['.ts', '.cts', '.mts'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n text: {\n fileExtensions: ['.txt'],\n command: (fileName) => ['cat', fileName],\n },\n} as const;\n"],"names":["_prebuild2","_prebuild","cLikeGrammer","strings","open","close","comments","javaScriptLikeGrammer","languageIdToDefinition","c","fileExtensions","buildCommand","filePath","command","grammer","cpp","csharp","prebuild","_asyncToGenerator","_regenerator","m","_callee","cwd","w","_context","n","fs","promises","writeFile","path","join","a","_x","apply","this","arguments","css","dart","java","_callee2","publicClassRegex","_iterator","_step","_publicClassRegex$exe","dirent","data","_ref","_ref2","className","_t","_t2","_context2","p","_createForOfIteratorHelper","readdir","withFileTypes","v","s","done","value","isFile","name","endsWith","readFile","exec","removeCommentsInSourceCode","_slicedToArray","rename","concat","e","f","_x2","fileName","replace","javascript","jsp","haskell","html","php","python","ruby","rust","zig","typescript","text"],"mappings":"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"} | ||
| {"version":3,"file":"language.js","names":[],"sources":["../../src/types/language.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { removeCommentsInSourceCode } from '../helpers/removeCommentsInSourceCode.js';\n\nexport interface LanguageDefinition {\n /** File extensions to judge with this config. */\n fileExtensions: readonly string[];\n\n /** Function executed before the build. */\n prebuild?(cwd: string): Promise<void>;\n\n /** Returns the command to build a user program. */\n buildCommand?(filePath: string): [string, ...string[]];\n\n /** Returns the command to run a user program. */\n command(filePath: string): [string, ...string[]];\n\n /** Grammer definition for static analysis. */\n grammer?: {\n strings?: readonly { open: RegExp; close: RegExp }[];\n comments?: readonly { open: RegExp; close?: RegExp }[];\n };\n}\n\nconst cLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nconst javaScriptLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n { open: /`/, close: /(?<!\\\\)(?:\\\\{2})*`/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nexport const languageIdToDefinition: Readonly<Record<string, Readonly<LanguageDefinition>>> = {\n c: {\n fileExtensions: ['.c'],\n buildCommand: (filePath) => ['gcc', '--std=c17', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n cpp: {\n fileExtensions: ['.cpp'],\n buildCommand: (filePath) => ['g++', '--std=c++20', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n csharp: {\n fileExtensions: ['.cs'],\n prebuild: async (cwd) => {\n await fs.promises.writeFile(\n path.join(cwd, 'Main.csproj'),\n `<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>`\n );\n },\n buildCommand: () => ['dotnet', 'build', 'Main.csproj', '--configuration', 'Release', '--verbosity', 'quiet'],\n command: () => ['dotnet', 'bin/Release/net8.0/Main.dll'],\n grammer: cLikeGrammer,\n },\n\n css: {\n fileExtensions: ['.css'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }],\n },\n },\n\n dart: {\n fileExtensions: ['.dart'],\n buildCommand: (filePath) => ['dart', 'compile', 'exe', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n java: {\n fileExtensions: ['.java'],\n prebuild: async (cwd) => {\n const publicClassRegex = /\\bpublic\\s+class\\s+(\\w+)\\b/;\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile() || !dirent.name.endsWith('.java')) continue;\n const data = await fs.promises.readFile(path.join(cwd, dirent.name), 'utf8');\n const [, className] = publicClassRegex.exec(removeCommentsInSourceCode(cLikeGrammer, data)) ?? [];\n if (className) await fs.promises.rename(path.join(cwd, dirent.name), path.join(cwd, `${className}.java`));\n }\n },\n buildCommand: (fileName) => ['javac', fileName],\n // For example, Problem 7-3 in WillBooster's Java lecture uses at least 256MB.\n command: (fileName) => ['java', '-Xmx1024m', fileName.replace(/\\.java$/, '')],\n grammer: cLikeGrammer,\n },\n\n javascript: {\n fileExtensions: ['.js', '.cjs', '.mjs'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n jsp: {\n fileExtensions: ['.jsp'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*<!--/, close: /-->/ },\n { open: /\\n?[ \\t]*<%--/, close: /--%>/ },\n { open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// },\n { open: /\\n?[ \\t]*\\/\\// },\n ],\n },\n },\n\n haskell: {\n fileExtensions: ['.hs'],\n buildCommand: (filePath) => ['ghc', '-o', 'main', filePath],\n command: () => ['./main'],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\{-/, close: /-\\}/ }, { open: /\\n?[ \\t]*--/ }],\n },\n },\n\n html: {\n fileExtensions: ['.html'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*<!--/, close: /-->/ }],\n },\n },\n\n php: {\n fileExtensions: ['.php'],\n command: (fileName) => ['php', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n python: {\n fileExtensions: ['.py'],\n command: (fileName) => ['python3', fileName],\n grammer: {\n strings: [\n { open: /'''/, close: /(?<!\\\\)(?:\\\\{2})*'''/ },\n { open: /\"\"\"/, close: /(?<!\\\\)(?:\\\\{2})*\"\"\"/ },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*'''/, close: /'''/ },\n { open: /\\n?[ \\t]*\"\"\"/, close: /\"\"\"/ },\n { open: /\\n?[ \\t]*#/ },\n ],\n },\n },\n\n ruby: {\n fileExtensions: ['.rb'],\n buildCommand: (fileName) => ['ruby', '-c', fileName],\n command: (fileName) => ['ruby', '--jit', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*=begin/, close: /=end/ }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n rust: {\n fileExtensions: ['.rs'],\n buildCommand: (filePath) => ['rustc', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n zig: {\n fileExtensions: ['.zig'],\n buildCommand: (filePath) => ['zig', 'build-exe', filePath],\n command: (filePath) => ['./' + filePath.replace(/\\.zig$/, '')],\n grammer: cLikeGrammer,\n },\n\n typescript: {\n fileExtensions: ['.ts', '.cts', '.mts'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n text: {\n fileExtensions: ['.txt'],\n command: (fileName) => ['cat', fileName],\n },\n} as const;\n"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var i=require("zod"),r=i.z.object({timeLimitMs:i.z.number().int().min(0).optional(),memoryLimitByte:i.z.number().int().min(0).optional(),requiredRegExpsInCode:i.z.array(i.z.string().min(1)).optional(),forbiddenRegExpsInCode:i.z.array(i.z.string().min(1)).optional(),forbiddenTextsInCode:i.z.array(i.z.string().min(1)).optional(),isManualScoringRequired:i.z.boolean().optional(),requiredEnvironmentVariables:i.z.array(i.z.string().min(1)).optional(),requiredOutputFilePaths:i.z.array(i.z.string().min(1)).optional(),requiredSubmissionFilePaths:i.z.array(i.z.string().min(1)).optional()});exports.problemMarkdownFrontMatterSchema=r; | ||
| //# sourceMappingURL=problem.cjs.map | ||
| "use strict";let e=require("zod");const t=e.z.object({timeLimitMs:e.z.number().int().min(0).optional(),memoryLimitByte:e.z.number().int().min(0).optional(),requiredRegExpsInCode:e.z.array(e.z.string().min(1)).optional(),forbiddenRegExpsInCode:e.z.array(e.z.string().min(1)).optional(),forbiddenTextsInCode:e.z.array(e.z.string().min(1)).optional(),isManualScoringRequired:e.z.boolean().optional(),requiredEnvironmentVariables:e.z.array(e.z.string().min(1)).optional(),requiredOutputFilePaths:e.z.array(e.z.string().min(1)).optional(),requiredSubmissionFilePaths:e.z.array(e.z.string().min(1)).optional()});exports.problemMarkdownFrontMatterSchema=t; | ||
| //# sourceMappingURL=problem.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"problem.cjs","sources":["../../src/types/problem.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const problemMarkdownFrontMatterSchema = z.object({\n timeLimitMs: z.number().int().min(0).optional(),\n memoryLimitByte: z.number().int().min(0).optional(),\n requiredRegExpsInCode: z.array(z.string().min(1)).optional(),\n forbiddenRegExpsInCode: z.array(z.string().min(1)).optional(),\n forbiddenTextsInCode: z.array(z.string().min(1)).optional(),\n isManualScoringRequired: z.boolean().optional(),\n requiredEnvironmentVariables: z.array(z.string().min(1)).optional(),\n requiredOutputFilePaths: z.array(z.string().min(1)).optional(),\n requiredSubmissionFilePaths: z.array(z.string().min(1)).optional(),\n});\n\nexport type ProblemMarkdownFrontMatter = z.infer<typeof problemMarkdownFrontMatterSchema>;\n"],"names":["problemMarkdownFrontMatterSchema","z","object","timeLimitMs","number","min","optional","memoryLimitByte","requiredRegExpsInCode","array","string","forbiddenRegExpsInCode","forbiddenTextsInCode","isManualScoringRequired","requiredEnvironmentVariables","requiredOutputFilePaths","requiredSubmissionFilePaths"],"mappings":"kCAEaA,EAAmCC,EAAAA,EAAEC,OAAO,CACvDC,YAAaF,EAAAA,EAAEG,SAAQ,MAAOC,IAAI,GAAGC,WACrCC,gBAAiBN,EAAAA,EAAEG,SAAQ,MAAOC,IAAI,GAAGC,WACzCE,sBAAuBP,EAAAA,EAAEQ,MAAMR,IAAES,SAASL,IAAI,IAAIC,WAClDK,uBAAwBV,EAAAA,EAAEQ,MAAMR,IAAES,SAASL,IAAI,IAAIC,WACnDM,qBAAsBX,EAAAA,EAAEQ,MAAMR,IAAES,SAASL,IAAI,IAAIC,WACjDO,wBAAyBZ,EAAAA,EAAC,UAAWK,WACrCQ,6BAA8Bb,EAAAA,EAAEQ,MAAMR,IAAES,SAASL,IAAI,IAAIC,WACzDS,wBAAyBd,EAAAA,EAAEQ,MAAMR,IAAES,SAASL,IAAI,IAAIC,WACpDU,4BAA6Bf,EAAAA,EAAEQ,MAAMR,EAAAA,EAAES,SAASL,IAAI,IAAIC"} | ||
| {"version":3,"file":"problem.cjs","names":["z"],"sources":["../../src/types/problem.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const problemMarkdownFrontMatterSchema = z.object({\n timeLimitMs: z.number().int().min(0).optional(),\n memoryLimitByte: z.number().int().min(0).optional(),\n requiredRegExpsInCode: z.array(z.string().min(1)).optional(),\n forbiddenRegExpsInCode: z.array(z.string().min(1)).optional(),\n forbiddenTextsInCode: z.array(z.string().min(1)).optional(),\n isManualScoringRequired: z.boolean().optional(),\n requiredEnvironmentVariables: z.array(z.string().min(1)).optional(),\n requiredOutputFilePaths: z.array(z.string().min(1)).optional(),\n requiredSubmissionFilePaths: z.array(z.string().min(1)).optional(),\n});\n\nexport type ProblemMarkdownFrontMatter = z.infer<typeof problemMarkdownFrontMatterSchema>;\n"],"mappings":"kCAEA,MAAa,EAAmCA,EAAAA,EAAE,OAAO,CACvD,YAAaA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC9C,gBAAiBA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAClD,sBAAuBA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC3D,uBAAwBA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC5D,qBAAsBA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC1D,wBAAyBA,EAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS,EAC9C,6BAA8BA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAClE,wBAAyBA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC7D,4BAA6BA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CACnE,CAAC"} |
@@ -1,2 +0,2 @@ | ||
| import{z as i}from"zod";var n=i.object({timeLimitMs:i.number().int().min(0).optional(),memoryLimitByte:i.number().int().min(0).optional(),requiredRegExpsInCode:i.array(i.string().min(1)).optional(),forbiddenRegExpsInCode:i.array(i.string().min(1)).optional(),forbiddenTextsInCode:i.array(i.string().min(1)).optional(),isManualScoringRequired:i.boolean().optional(),requiredEnvironmentVariables:i.array(i.string().min(1)).optional(),requiredOutputFilePaths:i.array(i.string().min(1)).optional(),requiredSubmissionFilePaths:i.array(i.string().min(1)).optional()});export{n as problemMarkdownFrontMatterSchema}; | ||
| //# sourceMappingURL=problem.js.map | ||
| import{z as e}from"zod";const t=e.object({timeLimitMs:e.number().int().min(0).optional(),memoryLimitByte:e.number().int().min(0).optional(),requiredRegExpsInCode:e.array(e.string().min(1)).optional(),forbiddenRegExpsInCode:e.array(e.string().min(1)).optional(),forbiddenTextsInCode:e.array(e.string().min(1)).optional(),isManualScoringRequired:e.boolean().optional(),requiredEnvironmentVariables:e.array(e.string().min(1)).optional(),requiredOutputFilePaths:e.array(e.string().min(1)).optional(),requiredSubmissionFilePaths:e.array(e.string().min(1)).optional()});export{t as problemMarkdownFrontMatterSchema}; | ||
| //# sourceMappingURL=problem.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"problem.js","sources":["../../src/types/problem.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const problemMarkdownFrontMatterSchema = z.object({\n timeLimitMs: z.number().int().min(0).optional(),\n memoryLimitByte: z.number().int().min(0).optional(),\n requiredRegExpsInCode: z.array(z.string().min(1)).optional(),\n forbiddenRegExpsInCode: z.array(z.string().min(1)).optional(),\n forbiddenTextsInCode: z.array(z.string().min(1)).optional(),\n isManualScoringRequired: z.boolean().optional(),\n requiredEnvironmentVariables: z.array(z.string().min(1)).optional(),\n requiredOutputFilePaths: z.array(z.string().min(1)).optional(),\n requiredSubmissionFilePaths: z.array(z.string().min(1)).optional(),\n});\n\nexport type ProblemMarkdownFrontMatter = z.infer<typeof problemMarkdownFrontMatterSchema>;\n"],"names":["problemMarkdownFrontMatterSchema","z","object","timeLimitMs","number","min","optional","memoryLimitByte","requiredRegExpsInCode","array","string","forbiddenRegExpsInCode","forbiddenTextsInCode","isManualScoringRequired","requiredEnvironmentVariables","requiredOutputFilePaths","requiredSubmissionFilePaths"],"mappings":"4BAEaA,EAAmCC,EAAEC,OAAO,CACvDC,YAAaF,EAAEG,SAAQ,MAAOC,IAAI,GAAGC,WACrCC,gBAAiBN,EAAEG,SAAQ,MAAOC,IAAI,GAAGC,WACzCE,sBAAuBP,EAAEQ,MAAMR,EAAES,SAASL,IAAI,IAAIC,WAClDK,uBAAwBV,EAAEQ,MAAMR,EAAES,SAASL,IAAI,IAAIC,WACnDM,qBAAsBX,EAAEQ,MAAMR,EAAES,SAASL,IAAI,IAAIC,WACjDO,wBAAyBZ,EAAC,UAAWK,WACrCQ,6BAA8Bb,EAAEQ,MAAMR,EAAES,SAASL,IAAI,IAAIC,WACzDS,wBAAyBd,EAAEQ,MAAMR,EAAES,SAASL,IAAI,IAAIC,WACpDU,4BAA6Bf,EAAEQ,MAAMR,EAAES,SAASL,IAAI,IAAIC"} | ||
| {"version":3,"file":"problem.js","names":[],"sources":["../../src/types/problem.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const problemMarkdownFrontMatterSchema = z.object({\n timeLimitMs: z.number().int().min(0).optional(),\n memoryLimitByte: z.number().int().min(0).optional(),\n requiredRegExpsInCode: z.array(z.string().min(1)).optional(),\n forbiddenRegExpsInCode: z.array(z.string().min(1)).optional(),\n forbiddenTextsInCode: z.array(z.string().min(1)).optional(),\n isManualScoringRequired: z.boolean().optional(),\n requiredEnvironmentVariables: z.array(z.string().min(1)).optional(),\n requiredOutputFilePaths: z.array(z.string().min(1)).optional(),\n requiredSubmissionFilePaths: z.array(z.string().min(1)).optional(),\n});\n\nexport type ProblemMarkdownFrontMatter = z.infer<typeof problemMarkdownFrontMatterSchema>;\n"],"mappings":"wBAEA,MAAa,EAAmC,EAAE,OAAO,CACvD,YAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC9C,gBAAiB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAClD,sBAAuB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC3D,uBAAwB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC5D,qBAAsB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC1D,wBAAyB,EAAE,QAAQ,CAAC,CAAC,SAAS,EAC9C,6BAA8B,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAClE,wBAAyB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC7D,4BAA6B,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CACnE,CAAC"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";var t=require("zod"),e=t.z.object({path:t.z.string(),data:t.z.string(),encoding:t.z.literal("base64").optional()}),o=t.z.object({testCaseId:t.z.string(),decisionCode:t.z.number().int(),exitStatus:t.z.number().int().optional(),stdin:t.z.string().optional(),stdout:t.z.string().optional(),stderr:t.z.string().optional(),timeSeconds:t.z.number().optional(),memoryBytes:t.z.number().optional(),feedbackMarkdown:t.z.string().optional(),outputFiles:t.z.array(e).optional()});exports.TEST_CASE_RESULT_PREFIX="TEST_CASE_RESULT ",exports.testCaseResultSchema=o; | ||
| //# sourceMappingURL=testCaseResult.cjs.map | ||
| "use strict";let e=require("zod");const t=e.z.object({path:e.z.string(),data:e.z.string(),encoding:e.z.literal(`base64`).optional()}),n=e.z.object({testCaseId:e.z.string(),decisionCode:e.z.number().int(),exitStatus:e.z.number().int().optional(),stdin:e.z.string().optional(),stdout:e.z.string().optional(),stderr:e.z.string().optional(),timeSeconds:e.z.number().optional(),memoryBytes:e.z.number().optional(),feedbackMarkdown:e.z.string().optional(),outputFiles:e.z.array(t).optional()});exports.TEST_CASE_RESULT_PREFIX=`TEST_CASE_RESULT `,exports.testCaseResultSchema=n; | ||
| //# sourceMappingURL=testCaseResult.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"testCaseResult.cjs","sources":["../../src/types/testCaseResult.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TEST_CASE_RESULT_PREFIX = 'TEST_CASE_RESULT ';\n\nconst testCaseResultOutputFileSchema = z.object({\n path: z.string(),\n data: z.string(),\n encoding: z.literal('base64').optional(),\n});\n\nexport const testCaseResultSchema = z.object({\n testCaseId: z.string(),\n decisionCode: z.number().int(),\n exitStatus: z.number().int().optional(),\n stdin: z.string().optional(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n timeSeconds: z.number().optional(),\n memoryBytes: z.number().optional(),\n feedbackMarkdown: z.string().optional(),\n outputFiles: z.array(testCaseResultOutputFileSchema).optional(),\n});\n\nexport type TestCaseResult = z.infer<typeof testCaseResultSchema>;\n"],"names":["testCaseResultOutputFileSchema","z","object","path","string","data","encoding","literal","optional","testCaseResultSchema","testCaseId","decisionCode","number","exitStatus","stdin","stdout","stderr","timeSeconds","memoryBytes","feedbackMarkdown","outputFiles","array"],"mappings":"kCAIMA,EAAiCC,EAAAA,EAAEC,OAAO,CAC9CC,KAAMF,EAAAA,EAAEG,SACRC,KAAMJ,EAAAA,EAAEG,SACRE,SAAUL,EAAAA,EAAEM,QAAQ,UAAUC,aAGnBC,EAAuBR,EAAAA,EAAEC,OAAO,CAC3CQ,WAAYT,EAAAA,EAAEG,SACdO,aAAcV,EAAAA,EAAEW,SAAQ,MACxBC,WAAYZ,EAAAA,EAAEW,SAAQ,MAAOJ,WAC7BM,MAAOb,EAAAA,EAAEG,SAASI,WAClBO,OAAQd,EAAAA,EAAEG,SAASI,WACnBQ,OAAQf,EAAAA,EAAEG,SAASI,WACnBS,YAAahB,EAAAA,EAAEW,SAASJ,WACxBU,YAAajB,EAAAA,EAAEW,SAASJ,WACxBW,iBAAkBlB,EAAAA,EAAEG,SAASI,WAC7BY,YAAanB,EAAAA,EAAEoB,MAAMrB,GAAgCQ,6CAlBhB"} | ||
| {"version":3,"file":"testCaseResult.cjs","names":["z"],"sources":["../../src/types/testCaseResult.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TEST_CASE_RESULT_PREFIX = 'TEST_CASE_RESULT ';\n\nconst testCaseResultOutputFileSchema = z.object({\n path: z.string(),\n data: z.string(),\n encoding: z.literal('base64').optional(),\n});\n\nexport const testCaseResultSchema = z.object({\n testCaseId: z.string(),\n decisionCode: z.number().int(),\n exitStatus: z.number().int().optional(),\n stdin: z.string().optional(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n timeSeconds: z.number().optional(),\n memoryBytes: z.number().optional(),\n feedbackMarkdown: z.string().optional(),\n outputFiles: z.array(testCaseResultOutputFileSchema).optional(),\n});\n\nexport type TestCaseResult = z.infer<typeof testCaseResultSchema>;\n"],"mappings":"kCAEA,MAEM,EAAiCA,EAAAA,EAAE,OAAO,CAC9C,KAAMA,EAAAA,EAAE,OAAO,EACf,KAAMA,EAAAA,EAAE,OAAO,EACf,SAAUA,EAAAA,EAAE,QAAQ,QAAQ,CAAC,CAAC,SAAS,CACzC,CAAC,EAEY,EAAuBA,EAAAA,EAAE,OAAO,CAC3C,WAAYA,EAAAA,EAAE,OAAO,EACrB,aAAcA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,EAC7B,WAAYA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EACtC,MAAOA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC3B,OAAQA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC5B,OAAQA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC5B,YAAaA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EACjC,YAAaA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EACjC,iBAAkBA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EACtC,YAAaA,EAAAA,EAAE,MAAM,CAA8B,CAAC,CAAC,SAAS,CAChE,CAAC"} |
@@ -1,2 +0,2 @@ | ||
| import{z as t}from"zod";var o="TEST_CASE_RESULT ",n=t.object({path:t.string(),data:t.string(),encoding:t.literal("base64").optional()}),i=t.object({testCaseId:t.string(),decisionCode:t.number().int(),exitStatus:t.number().int().optional(),stdin:t.string().optional(),stdout:t.string().optional(),stderr:t.string().optional(),timeSeconds:t.number().optional(),memoryBytes:t.number().optional(),feedbackMarkdown:t.string().optional(),outputFiles:t.array(n).optional()});export{o as TEST_CASE_RESULT_PREFIX,i as testCaseResultSchema}; | ||
| //# sourceMappingURL=testCaseResult.js.map | ||
| import{z as e}from"zod";const t=`TEST_CASE_RESULT `,n=e.object({path:e.string(),data:e.string(),encoding:e.literal(`base64`).optional()}),r=e.object({testCaseId:e.string(),decisionCode:e.number().int(),exitStatus:e.number().int().optional(),stdin:e.string().optional(),stdout:e.string().optional(),stderr:e.string().optional(),timeSeconds:e.number().optional(),memoryBytes:e.number().optional(),feedbackMarkdown:e.string().optional(),outputFiles:e.array(n).optional()});export{t as TEST_CASE_RESULT_PREFIX,r as testCaseResultSchema}; | ||
| //# sourceMappingURL=testCaseResult.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"testCaseResult.js","sources":["../../src/types/testCaseResult.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TEST_CASE_RESULT_PREFIX = 'TEST_CASE_RESULT ';\n\nconst testCaseResultOutputFileSchema = z.object({\n path: z.string(),\n data: z.string(),\n encoding: z.literal('base64').optional(),\n});\n\nexport const testCaseResultSchema = z.object({\n testCaseId: z.string(),\n decisionCode: z.number().int(),\n exitStatus: z.number().int().optional(),\n stdin: z.string().optional(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n timeSeconds: z.number().optional(),\n memoryBytes: z.number().optional(),\n feedbackMarkdown: z.string().optional(),\n outputFiles: z.array(testCaseResultOutputFileSchema).optional(),\n});\n\nexport type TestCaseResult = z.infer<typeof testCaseResultSchema>;\n"],"names":["TEST_CASE_RESULT_PREFIX","testCaseResultOutputFileSchema","z","object","path","string","data","encoding","literal","optional","testCaseResultSchema","testCaseId","decisionCode","number","exitStatus","stdin","stdout","stderr","timeSeconds","memoryBytes","feedbackMarkdown","outputFiles","array"],"mappings":"wBAEO,IAAMA,EAA0B,oBAEjCC,EAAiCC,EAAEC,OAAO,CAC9CC,KAAMF,EAAEG,SACRC,KAAMJ,EAAEG,SACRE,SAAUL,EAAEM,QAAQ,UAAUC,aAGnBC,EAAuBR,EAAEC,OAAO,CAC3CQ,WAAYT,EAAEG,SACdO,aAAcV,EAAEW,SAAQ,MACxBC,WAAYZ,EAAEW,SAAQ,MAAOJ,WAC7BM,MAAOb,EAAEG,SAASI,WAClBO,OAAQd,EAAEG,SAASI,WACnBQ,OAAQf,EAAEG,SAASI,WACnBS,YAAahB,EAAEW,SAASJ,WACxBU,YAAajB,EAAEW,SAASJ,WACxBW,iBAAkBlB,EAAEG,SAASI,WAC7BY,YAAanB,EAAEoB,MAAMrB,GAAgCQ"} | ||
| {"version":3,"file":"testCaseResult.js","names":[],"sources":["../../src/types/testCaseResult.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TEST_CASE_RESULT_PREFIX = 'TEST_CASE_RESULT ';\n\nconst testCaseResultOutputFileSchema = z.object({\n path: z.string(),\n data: z.string(),\n encoding: z.literal('base64').optional(),\n});\n\nexport const testCaseResultSchema = z.object({\n testCaseId: z.string(),\n decisionCode: z.number().int(),\n exitStatus: z.number().int().optional(),\n stdin: z.string().optional(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n timeSeconds: z.number().optional(),\n memoryBytes: z.number().optional(),\n feedbackMarkdown: z.string().optional(),\n outputFiles: z.array(testCaseResultOutputFileSchema).optional(),\n});\n\nexport type TestCaseResult = z.infer<typeof testCaseResultSchema>;\n"],"mappings":"wBAEA,MAAa,EAA0B,oBAEjC,EAAiC,EAAE,OAAO,CAC9C,KAAM,EAAE,OAAO,EACf,KAAM,EAAE,OAAO,EACf,SAAU,EAAE,QAAQ,QAAQ,CAAC,CAAC,SAAS,CACzC,CAAC,EAEY,EAAuB,EAAE,OAAO,CAC3C,WAAY,EAAE,OAAO,EACrB,aAAc,EAAE,OAAO,CAAC,CAAC,IAAI,EAC7B,WAAY,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EACtC,MAAO,EAAE,OAAO,CAAC,CAAC,SAAS,EAC3B,OAAQ,EAAE,OAAO,CAAC,CAAC,SAAS,EAC5B,OAAQ,EAAE,OAAO,CAAC,CAAC,SAAS,EAC5B,YAAa,EAAE,OAAO,CAAC,CAAC,SAAS,EACjC,YAAa,EAAE,OAAO,CAAC,CAAC,SAAS,EACjC,iBAAkB,EAAE,OAAO,CAAC,CAAC,SAAS,EACtC,YAAa,EAAE,MAAM,CAA8B,CAAC,CAAC,SAAS,CAChE,CAAC"} |
+14
-14
| { | ||
| "name": "@exercode/problem-utils", | ||
| "version": "1.16.6", | ||
| "version": "1.16.7", | ||
| "description": ":100: A set of utilities for judging programs on Exercode (https://exercode.willbooster.com/).", | ||
@@ -53,7 +53,7 @@ "keywords": [ | ||
| "dependencies": { | ||
| "@ai-sdk/amazon-bedrock": "4.0.120", | ||
| "@ai-sdk/google": "3.0.83", | ||
| "@ai-sdk/openai": "3.0.74", | ||
| "@ai-sdk/xai": "3.0.96", | ||
| "ai": "6.0.208", | ||
| "@ai-sdk/amazon-bedrock": "4.0.124", | ||
| "@ai-sdk/google": "3.0.86", | ||
| "@ai-sdk/openai": "3.0.77", | ||
| "@ai-sdk/xai": "3.0.100", | ||
| "ai": "6.0.214", | ||
| "front-matter": "4.0.2", | ||
@@ -67,15 +67,15 @@ "zod": "4.4.3" | ||
| "@types/node": "24.13.2", | ||
| "@typescript/native-preview": "7.0.0-dev.20260622.1", | ||
| "@typescript/native-preview": "7.0.0-dev.20260628.1", | ||
| "@willbooster/oxfmt-config": "1.2.2", | ||
| "@willbooster/oxlint-config": "1.4.8", | ||
| "@willbooster/prettier-config": "10.4.0", | ||
| "@willbooster/wb": "13.22.18", | ||
| "build-ts": "17.1.26", | ||
| "@willbooster/wb": "13.22.19", | ||
| "build-ts": "17.1.30", | ||
| "conventional-changelog-conventionalcommits": "9.3.1", | ||
| "lefthook": "2.1.9", | ||
| "oxfmt": "0.56.0", | ||
| "oxlint": "1.71.0", | ||
| "oxlint-tsgolint": "0.23.0", | ||
| "prettier": "3.8.4", | ||
| "prettier-plugin-java": "2.9.7", | ||
| "oxfmt": "0.57.0", | ||
| "oxlint": "1.72.0", | ||
| "oxlint-tsgolint": "0.24.0", | ||
| "prettier": "3.9.1", | ||
| "prettier-plugin-java": "2.10.1", | ||
| "puppeteer": "24.43.1", | ||
@@ -82,0 +82,0 @@ "semantic-release": "25.0.5", |
| "use strict";function r(r,t){(null==t||t>r.length)&&(t=r.length);for(var e=0,n=Array(t);e<t;e++)n[e]=r[e];return n}function t(r){if(Array.isArray(r))return r}function e(t){if(Array.isArray(t))return r(t)}function n(r,t,e,n,o,i,a){try{var u=r[i](a),f=u.value}catch(r){return void e(r)}u.done?t(f):Promise.resolve(f).then(n,o)}function o(r,t,e){return(t=b(t))in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}function i(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function a(r,t){var e=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=e){var n,o,i,a,u=[],f=!0,c=!1;try{if(i=(e=e.call(r)).next,0===t){if(Object(e)!==e)return;f=!1}else for(;!(f=(n=i.call(e)).done)&&(u.push(n.value),u.length!==t);f=!0);}catch(r){c=!0,o=r}finally{try{if(!f&&null!=e.return&&(a=e.return(),Object(a)!==a))return}finally{if(c)throw o}}return u}}function u(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function f(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(r,t){var e=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})),e.push.apply(e,n)}return e}function l(r,t){if(null==r)return{};var e={};for(var n in r)if({}.hasOwnProperty.call(r,n)){if(-1!==t.indexOf(n))continue;e[n]=r[n]}return e}function y(){ | ||
| /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ | ||
| var r,t,e="function"==typeof Symbol?Symbol:{},n=e.iterator||"@@iterator",o=e.toStringTag||"@@toStringTag";function i(e,n,o,i){var f=n&&n.prototype instanceof u?n:u,c=Object.create(f.prototype);return p(c,"_invoke",function(e,n,o){var i,u,f,c=0,l=o||[],y=!1,p={p:0,n:0,v:r,a:s,f:s.bind(r,4),d:function(t,e){return i=t,u=0,f=r,p.n=e,a}};function s(e,n){for(u=e,f=n,t=0;!y&&c&&!o&&t<l.length;t++){var o,i=l[t],s=p.p,b=i[2];e>3?(o=b===n)&&(f=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=r):i[0]<=s&&((o=e<2&&s<i[1])?(u=0,p.v=n,p.n=i[1]):s<b&&(o=e<3||i[0]>n||n>b)&&(i[4]=e,i[5]=n,p.n=b,u=0))}if(o||e>1)return a;throw y=!0,n}return function(o,l,b){if(c>1)throw TypeError("Generator is already running");for(y&&1===l&&s(l,b),u=l,f=b;(t=u<2?r:f)||!y;){i||(u?u<3?(u>1&&(p.n=-1),s(u,f)):p.n=f:p.v=f);try{if(c=2,i){if(u||(o="next"),t=i[o]){if(!(t=t.call(i,f)))throw TypeError("iterator result is not an object");if(!t.done)return t;f=t.value,u<2&&(u=0)}else 1===u&&(t=i.return)&&t.call(i),u<2&&(f=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=r}else if((t=(y=p.n<0)?f:e.call(n,p))!==a)break}catch(t){i=r,u=1,f=t}finally{c=1}}return{value:t,done:y}}}(e,o,i),!0),c}var a={};function u(){}function f(){}function c(){}t=Object.getPrototypeOf;var l=[][n]?t(t([][n]())):(p(t={},n,function(){return this}),t),s=c.prototype=u.prototype=Object.create(l);function b(r){return Object.setPrototypeOf?Object.setPrototypeOf(r,c):(r.__proto__=c,p(r,o,"GeneratorFunction")),r.prototype=Object.create(s),r}return f.prototype=c,p(s,"constructor",c),p(c,"constructor",f),f.displayName="GeneratorFunction",p(c,o,"GeneratorFunction"),p(s),p(s,o,"Generator"),p(s,n,function(){return this}),p(s,"toString",function(){return"[object Generator]"}),(y=function(){return{w:i,m:b}})()}function p(r,t,e,n){var o=Object.defineProperty;try{o({},"",{})}catch(r){o=0}p=function(r,t,e,n){function i(t,e){p(r,t,function(r){return this._invoke(t,e,r)})}t?o?o(r,t,{value:e,enumerable:!n,configurable:!n,writable:!n}):r[t]=e:(i("next",0),i("throw",1),i("return",2))},p(r,t,e,n)}function s(r,t){if("object"!=typeof r||!r)return r;var e=r[Symbol.toPrimitive];if(void 0!==e){var n=e.call(r,t);if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(r)}function b(r){var t=s(r,"string");return"symbol"==typeof t?t:t+""}function v(r){"@babel/helpers - typeof";return v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(r){return typeof r}:function(r){return r&&"function"==typeof Symbol&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},v(r)}function m(t,e){if(t){if("string"==typeof t)return r(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}}exports.arrayLikeToArray=r,exports.arrayWithHoles=t,exports.arrayWithoutHoles=e,exports.asyncToGenerator=function(r){return function(){var t=this,e=arguments;return new Promise(function(o,i){var a=r.apply(t,e);function u(r){n(a,o,i,u,f,"next",r)}function f(r){n(a,o,i,u,f,"throw",r)}u(void 0)})}},exports.createForOfIteratorHelper=function(r,t){var e="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!e){if(Array.isArray(r)||(e=m(r))||t&&r&&"number"==typeof r.length){e&&(r=e);var n=0,o=function(){};return{s:o,n:function(){return n>=r.length?{done:!0}:{done:!1,value:r[n++]}},e:function(r){throw r},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){e=e.call(r)},n:function(){var r=e.next();return a=r.done,r},e:function(r){u=!0,i=r},f:function(){try{a||null==e.return||e.return()}finally{if(u)throw i}}}},exports.defineProperty=o,exports.iterableToArray=i,exports.iterableToArrayLimit=a,exports.nonIterableRest=u,exports.nonIterableSpread=f,exports.objectSpread2=function(r){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{};t%2?c(Object(e),!0).forEach(function(t){o(r,t,e[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(e)):c(Object(e)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(e,t))})}return r},exports.objectWithoutProperties=function(r,t){if(null==r)return{};var e,n,o=l(r,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);for(n=0;n<i.length;n++)e=i[n],-1===t.indexOf(e)&&{}.propertyIsEnumerable.call(r,e)&&(o[e]=r[e])}return o},exports.objectWithoutPropertiesLoose=l,exports.regenerator=y,exports.regeneratorDefine=p,exports.regeneratorValues=function(r){if(null!=r){var t=r["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],e=0;if(t)return t.call(r);if("function"==typeof r.next)return r;if(!isNaN(r.length))return{next:function(){return r&&e>=r.length&&(r=void 0),{value:r&&r[e++],done:!r}}}}throw new TypeError(typeof r+" is not iterable")},exports.slicedToArray=function(r,e){return t(r)||a(r,e)||m(r,e)||u()},exports.toConsumableArray=function(r){return e(r)||i(r)||m(r)||f()},exports.toPrimitive=s,exports.toPropertyKey=b,exports.typeof=v,exports.unsupportedIterableToArray=m; | ||
| //# sourceMappingURL=_rollupPluginBabelHelpers.cjs.map |
| {"version":3,"file":"_rollupPluginBabelHelpers.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"} |
| function r(r,t){(null==t||t>r.length)&&(t=r.length);for(var e=0,n=Array(t);e<t;e++)n[e]=r[e];return n}function t(r){if(Array.isArray(r))return r}function e(t){if(Array.isArray(t))return r(t)}function n(r,t,e,n,o,i,a){try{var u=r[i](a),f=u.value}catch(r){return void e(r)}u.done?t(f):Promise.resolve(f).then(n,o)}function o(r){return function(){var t=this,e=arguments;return new Promise(function(o,i){var a=r.apply(t,e);function u(r){n(a,o,i,u,f,"next",r)}function f(r){n(a,o,i,u,f,"throw",r)}u(void 0)})}}function i(r,t){var e="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!e){if(Array.isArray(r)||(e=S(r))||t&&r&&"number"==typeof r.length){e&&(r=e);var n=0,o=function(){};return{s:o,n:function(){return n>=r.length?{done:!0}:{done:!1,value:r[n++]}},e:function(r){throw r},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){e=e.call(r)},n:function(){var r=e.next();return a=r.done,r},e:function(r){u=!0,i=r},f:function(){try{a||null==e.return||e.return()}finally{if(u)throw i}}}}function a(r,t,e){return(t=j(t))in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}function u(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function f(r,t){var e=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=e){var n,o,i,a,u=[],f=!0,c=!1;try{if(i=(e=e.call(r)).next,0===t){if(Object(e)!==e)return;f=!1}else for(;!(f=(n=i.call(e)).done)&&(u.push(n.value),u.length!==t);f=!0);}catch(r){c=!0,o=r}finally{try{if(!f&&null!=e.return&&(a=e.return(),Object(a)!==a))return}finally{if(c)throw o}}return u}}function c(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function l(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function y(r,t){var e=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})),e.push.apply(e,n)}return e}function s(r){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{};t%2?y(Object(e),!0).forEach(function(t){a(r,t,e[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(e)):y(Object(e)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(e,t))})}return r}function p(r,t){if(null==r)return{};var e,n,o=b(r,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);for(n=0;n<i.length;n++)e=i[n],-1===t.indexOf(e)&&{}.propertyIsEnumerable.call(r,e)&&(o[e]=r[e])}return o}function b(r,t){if(null==r)return{};var e={};for(var n in r)if({}.hasOwnProperty.call(r,n)){if(-1!==t.indexOf(n))continue;e[n]=r[n]}return e}function v(){ | ||
| /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ | ||
| var r,t,e="function"==typeof Symbol?Symbol:{},n=e.iterator||"@@iterator",o=e.toStringTag||"@@toStringTag";function i(e,n,o,i){var f=n&&n.prototype instanceof u?n:u,c=Object.create(f.prototype);return m(c,"_invoke",function(e,n,o){var i,u,f,c=0,l=o||[],y=!1,s={p:0,n:0,v:r,a:p,f:p.bind(r,4),d:function(t,e){return i=t,u=0,f=r,s.n=e,a}};function p(e,n){for(u=e,f=n,t=0;!y&&c&&!o&&t<l.length;t++){var o,i=l[t],p=s.p,b=i[2];e>3?(o=b===n)&&(f=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=r):i[0]<=p&&((o=e<2&&p<i[1])?(u=0,s.v=n,s.n=i[1]):p<b&&(o=e<3||i[0]>n||n>b)&&(i[4]=e,i[5]=n,s.n=b,u=0))}if(o||e>1)return a;throw y=!0,n}return function(o,l,b){if(c>1)throw TypeError("Generator is already running");for(y&&1===l&&p(l,b),u=l,f=b;(t=u<2?r:f)||!y;){i||(u?u<3?(u>1&&(s.n=-1),p(u,f)):s.n=f:s.v=f);try{if(c=2,i){if(u||(o="next"),t=i[o]){if(!(t=t.call(i,f)))throw TypeError("iterator result is not an object");if(!t.done)return t;f=t.value,u<2&&(u=0)}else 1===u&&(t=i.return)&&t.call(i),u<2&&(f=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=r}else if((t=(y=s.n<0)?f:e.call(n,s))!==a)break}catch(t){i=r,u=1,f=t}finally{c=1}}return{value:t,done:y}}}(e,o,i),!0),c}var a={};function u(){}function f(){}function c(){}t=Object.getPrototypeOf;var l=[][n]?t(t([][n]())):(m(t={},n,function(){return this}),t),y=c.prototype=u.prototype=Object.create(l);function s(r){return Object.setPrototypeOf?Object.setPrototypeOf(r,c):(r.__proto__=c,m(r,o,"GeneratorFunction")),r.prototype=Object.create(y),r}return f.prototype=c,m(y,"constructor",c),m(c,"constructor",f),f.displayName="GeneratorFunction",m(c,o,"GeneratorFunction"),m(y),m(y,o,"Generator"),m(y,n,function(){return this}),m(y,"toString",function(){return"[object Generator]"}),(v=function(){return{w:i,m:s}})()}function m(r,t,e,n){var o=Object.defineProperty;try{o({},"",{})}catch(r){o=0}m=function(r,t,e,n){function i(t,e){m(r,t,function(r){return this._invoke(t,e,r)})}t?o?o(r,t,{value:e,enumerable:!n,configurable:!n,writable:!n}):r[t]=e:(i("next",0),i("throw",1),i("return",2))},m(r,t,e,n)}function h(r){if(null!=r){var t=r["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],e=0;if(t)return t.call(r);if("function"==typeof r.next)return r;if(!isNaN(r.length))return{next:function(){return r&&e>=r.length&&(r=void 0),{value:r&&r[e++],done:!r}}}}throw new TypeError(typeof r+" is not iterable")}function d(r,e){return t(r)||f(r,e)||S(r,e)||c()}function O(r){return e(r)||u(r)||S(r)||l()}function g(r,t){if("object"!=typeof r||!r)return r;var e=r[Symbol.toPrimitive];if(void 0!==e){var n=e.call(r,t);if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(r)}function j(r){var t=g(r,"string");return"symbol"==typeof t?t:t+""}function w(r){"@babel/helpers - typeof";return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(r){return typeof r}:function(r){return r&&"function"==typeof Symbol&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},w(r)}function S(t,e){if(t){if("string"==typeof t)return r(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}}export{r as arrayLikeToArray,t as arrayWithHoles,e as arrayWithoutHoles,o as asyncToGenerator,i as createForOfIteratorHelper,a as defineProperty,u as iterableToArray,f as iterableToArrayLimit,c as nonIterableRest,l as nonIterableSpread,s as objectSpread2,p as objectWithoutProperties,b as objectWithoutPropertiesLoose,v as regenerator,m as regeneratorDefine,h as regeneratorValues,d as slicedToArray,O as toConsumableArray,g as toPrimitive,j as toPropertyKey,w as typeof,S as unsupportedIterableToArray}; | ||
| //# sourceMappingURL=_rollupPluginBabelHelpers.js.map |
| {"version":3,"file":"_rollupPluginBabelHelpers.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"} |
| {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""} |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 7 instances
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 6 instances
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
543089
-27.61%152
-3.18%1037
-21.68%52
6.12%1
Infinity%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
Updated
Updated
Updated
Updated