@exercode/problem-utils
Advanced tools
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"command.cjs","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\n printDebugCwdBanner,\n printDebugExpectationFailureBanner,\n resolveCwds,\n type ResolvedCwd,\n} from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n outputLimitExceeded?: boolean;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<CommandRunResult> | CommandRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n for (const resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase>(problemDir, resolvedCwd.cwd, params, options);\n if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n process.exitCode = 1;\n printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n }\n }\n}\n\nasync function runCommandJudgeForCwd<TTestCase extends BaseCommandTestCase>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<{ allAccepted: boolean }> {\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return { allAccepted: false };\n }\n\n const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return { allAccepted: false };\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return { allAccepted: false };\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(cwd);\n const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return { allAccepted: false };\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\n return { allAccepted: false };\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return { allAccepted: true };\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: CommandRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n })\n : runCommand(command, {\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n return { allAccepted: false };\n }\n\n const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return { allAccepted: false };\n }\n\n return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.outputLimitExceeded ||\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","_commandJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","_yield$resolveCwds","cwds","isDebugMode","_iterator","_step","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","exitCode","printDebugExpectationFailureBanner","e","f","a","apply","this","arguments","_x3","_x4","_x5","_x6","_runCommandJudgeForCwd","_callee2","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator2","_step2","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t2","_t3","_t4","_t5","_t6","_context2","readProblemMarkdownFrontMatter","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","allAccepted","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","expectedResult","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x7","_readCommandTestCases","_callee3","_fileTestCases$shared","fileTestCases","commandTestCases","_context3","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","outputLimitExceeded","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x","_x2"],"mappings":"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"} | ||
| {"version":3,"file":"command.cjs","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\n printDebugCwdBanner,\n printDebugExpectationFailureBanner,\n resolveCwds,\n type ResolvedCwd,\n} from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n outputLimitExceeded?: boolean;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<TRunResult> | TRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: TRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(problemDir: string, options: CommandJudgePresetOptions<TTestCase, TRunResult>): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n for (const resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase, TRunResult>(problemDir, resolvedCwd.cwd, params, options);\n if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n process.exitCode = 1;\n printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n }\n }\n}\n\nasync function runCommandJudgeForCwd<\n TTestCase extends BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase, TRunResult>\n): Promise<{ allAccepted: boolean }> {\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return { allAccepted: false };\n }\n\n const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return { allAccepted: false };\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return { allAccepted: false };\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(cwd);\n const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return { allAccepted: false };\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\n return { allAccepted: false };\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return { allAccepted: true };\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: TRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n })\n : (runCommand(command, {\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n }) as TRunResult);\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n return { allAccepted: false };\n }\n\n const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return { allAccepted: false };\n }\n\n return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.outputLimitExceeded ||\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","_commandJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","_yield$resolveCwds","cwds","isDebugMode","_iterator","_step","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","exitCode","printDebugExpectationFailureBanner","e","f","a","apply","this","arguments","_x3","_x4","_x5","_x6","_runCommandJudgeForCwd","_callee2","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator2","_step2","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t2","_t3","_t4","_t5","_t6","_context2","readProblemMarkdownFrontMatter","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","allAccepted","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","expectedResult","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x7","_readCommandTestCases","_callee3","_fileTestCases$shared","fileTestCases","commandTestCases","_context3","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","outputLimitExceeded","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x","_x2"],"mappings":"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"} |
@@ -27,3 +27,3 @@ import type { ProblemMarkdownFrontMatter } from '../types/problem.js'; | ||
| } | ||
| export interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> { | ||
| export interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase, TRunResult extends CommandRunResult = CommandRunResult> { | ||
| limits?: CommandJudgeLimits; | ||
@@ -44,6 +44,6 @@ runTimeoutSeconds?: number; | ||
| timeLimitSeconds: number; | ||
| }) => Promise<CommandRunResult> | CommandRunResult; | ||
| }) => Promise<TRunResult> | TRunResult; | ||
| test?: (context: { | ||
| testCase: TTestCase; | ||
| runResult: CommandRunResult; | ||
| runResult: TRunResult; | ||
| outputFiles: NonNullable<TestCaseResult['outputFiles']>; | ||
@@ -87,3 +87,3 @@ context: CommandJudgeContext; | ||
| */ | ||
| export declare function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(problemDir: string, options: CommandJudgePresetOptions<TTestCase>): Promise<void>; | ||
| export declare function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase, TRunResult extends CommandRunResult = CommandRunResult>(problemDir: string, options: CommandJudgePresetOptions<TTestCase, TRunResult>): Promise<void>; | ||
| export {}; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"command.js","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\n printDebugCwdBanner,\n printDebugExpectationFailureBanner,\n resolveCwds,\n type ResolvedCwd,\n} from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n outputLimitExceeded?: boolean;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<CommandRunResult> | CommandRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n for (const resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase>(problemDir, resolvedCwd.cwd, params, options);\n if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n process.exitCode = 1;\n printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n }\n }\n}\n\nasync function runCommandJudgeForCwd<TTestCase extends BaseCommandTestCase>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<{ allAccepted: boolean }> {\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return { allAccepted: false };\n }\n\n const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return { allAccepted: false };\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return { allAccepted: false };\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(cwd);\n const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return { allAccepted: false };\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\n return { allAccepted: false };\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return { allAccepted: true };\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: CommandRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n })\n : runCommand(command, {\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n return { allAccepted: false };\n }\n\n const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return { allAccepted: false };\n }\n\n return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.outputLimitExceeded ||\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","commandJudgePreset","_x","_x2","_commandJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","_yield$resolveCwds","cwds","isDebugMode","_iterator","_step","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","exitCode","printDebugExpectationFailureBanner","e","f","a","_x3","_x4","_x5","_x6","_runCommandJudgeForCwd","_callee2","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator2","_step2","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t2","_t3","_t4","_t5","_t6","_context2","readProblemMarkdownFrontMatter","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","allAccepted","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","expectedResult","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x7","_readCommandTestCases","_callee3","_fileTestCases$shared","fileTestCases","commandTestCases","_context3","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","outputLimitExceeded","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR"],"mappings":"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"} | ||
| {"version":3,"file":"command.js","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\n printDebugCwdBanner,\n printDebugExpectationFailureBanner,\n resolveCwds,\n type ResolvedCwd,\n} from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n outputLimitExceeded?: boolean;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<TRunResult> | TRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: TRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<\n TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(problemDir: string, options: CommandJudgePresetOptions<TTestCase, TRunResult>): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n for (const resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase, TRunResult>(problemDir, resolvedCwd.cwd, params, options);\n if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n process.exitCode = 1;\n printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n }\n }\n}\n\nasync function runCommandJudgeForCwd<\n TTestCase extends BaseCommandTestCase,\n TRunResult extends CommandRunResult = CommandRunResult,\n>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase, TRunResult>\n): Promise<{ allAccepted: boolean }> {\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return { allAccepted: false };\n }\n\n const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return { allAccepted: false };\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return { allAccepted: false };\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(cwd);\n const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return { allAccepted: false };\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\n return { allAccepted: false };\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return { allAccepted: true };\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: TRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n })\n : (runCommand(command, {\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n }) as TRunResult);\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n return { allAccepted: false };\n }\n\n const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return { allAccepted: false };\n }\n\n return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.outputLimitExceeded ||\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","commandJudgePreset","_x","_x2","_commandJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","_yield$resolveCwds","cwds","isDebugMode","_iterator","_step","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","exitCode","printDebugExpectationFailureBanner","e","f","a","_x3","_x4","_x5","_x6","_runCommandJudgeForCwd","_callee2","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator2","_step2","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t2","_t3","_t4","_t5","_t6","_context2","readProblemMarkdownFrontMatter","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","allAccepted","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","expectedResult","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x7","_readCommandTestCases","_callee3","_fileTestCases$shared","fileTestCases","commandTestCases","_context3","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","outputLimitExceeded","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR"],"mappings":"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"} |
+2
-2
| { | ||
| "name": "@exercode/problem-utils", | ||
| "version": "1.13.1", | ||
| "version": "1.14.0", | ||
| "description": ":100: A set of utilities for judging programs on Exercode (https://exercode.willbooster.com/).", | ||
@@ -79,3 +79,3 @@ "keywords": [ | ||
| "prettier": "3.8.3", | ||
| "prettier-plugin-java": "2.8.1", | ||
| "prettier-plugin-java": "2.9.2", | ||
| "puppeteer": "24.43.1", | ||
@@ -82,0 +82,0 @@ "semantic-release": "25.0.3", |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
647142
0.08%