@exercode/problem-utils 1.16.6 → 1.16.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.cjs +1 -0
- package/dist/helpers/checkProblemDirIsolation.cjs +2 -2
- package/dist/helpers/checkProblemDirIsolation.cjs.map +1 -1
- package/dist/helpers/checkProblemDirIsolation.js +2 -2
- package/dist/helpers/checkProblemDirIsolation.js.map +1 -1
- package/dist/helpers/cleanWorkingDirectory.cjs +2 -2
- package/dist/helpers/cleanWorkingDirectory.cjs.map +1 -1
- package/dist/helpers/cleanWorkingDirectory.js +2 -2
- package/dist/helpers/cleanWorkingDirectory.js.map +1 -1
- package/dist/helpers/compareStdoutAsSpaceSeparatedTokens.cjs +2 -2
- package/dist/helpers/compareStdoutAsSpaceSeparatedTokens.cjs.map +1 -1
- package/dist/helpers/compareStdoutAsSpaceSeparatedTokens.js +2 -2
- package/dist/helpers/compareStdoutAsSpaceSeparatedTokens.js.map +1 -1
- package/dist/helpers/copyTestCaseFileInput.cjs +2 -2
- package/dist/helpers/copyTestCaseFileInput.cjs.map +1 -1
- package/dist/helpers/copyTestCaseFileInput.js +2 -2
- package/dist/helpers/copyTestCaseFileInput.js.map +1 -1
- package/dist/helpers/findEntryPointFile.cjs +2 -2
- package/dist/helpers/findEntryPointFile.cjs.map +1 -1
- package/dist/helpers/findEntryPointFile.js +2 -2
- package/dist/helpers/findEntryPointFile.js.map +1 -1
- package/dist/helpers/findLanguageDefinitionByPath.cjs +2 -2
- package/dist/helpers/findLanguageDefinitionByPath.cjs.map +1 -1
- package/dist/helpers/findLanguageDefinitionByPath.js +2 -2
- package/dist/helpers/findLanguageDefinitionByPath.js.map +1 -1
- package/dist/helpers/findModelAnswerDirs.cjs +2 -2
- package/dist/helpers/findModelAnswerDirs.cjs.map +1 -1
- package/dist/helpers/findModelAnswerDirs.js +2 -2
- package/dist/helpers/findModelAnswerDirs.js.map +1 -1
- package/dist/helpers/judgeByStaticAnalysis.cjs +19 -2
- package/dist/helpers/judgeByStaticAnalysis.cjs.map +1 -1
- package/dist/helpers/judgeByStaticAnalysis.js +19 -2
- package/dist/helpers/judgeByStaticAnalysis.js.map +1 -1
- package/dist/helpers/parseArgs.cjs +2 -2
- package/dist/helpers/parseArgs.cjs.map +1 -1
- package/dist/helpers/parseArgs.js +2 -2
- package/dist/helpers/parseArgs.js.map +1 -1
- package/dist/helpers/printDebugBanner.cjs +3 -2
- package/dist/helpers/printDebugBanner.cjs.map +1 -1
- package/dist/helpers/printDebugBanner.js +3 -2
- package/dist/helpers/printDebugBanner.js.map +1 -1
- package/dist/helpers/printTestCaseResult.cjs +2 -2
- package/dist/helpers/printTestCaseResult.cjs.map +1 -1
- package/dist/helpers/printTestCaseResult.js +2 -2
- package/dist/helpers/printTestCaseResult.js.map +1 -1
- package/dist/helpers/readOutputFiles.cjs +2 -2
- package/dist/helpers/readOutputFiles.cjs.map +1 -1
- package/dist/helpers/readOutputFiles.js +2 -2
- package/dist/helpers/readOutputFiles.js.map +1 -1
- package/dist/helpers/readProblemMarkdownFrontMatter.cjs +2 -2
- package/dist/helpers/readProblemMarkdownFrontMatter.cjs.map +1 -1
- package/dist/helpers/readProblemMarkdownFrontMatter.js +2 -2
- package/dist/helpers/readProblemMarkdownFrontMatter.js.map +1 -1
- package/dist/helpers/readTestCases.cjs +2 -2
- package/dist/helpers/readTestCases.cjs.map +1 -1
- package/dist/helpers/readTestCases.js +2 -2
- package/dist/helpers/readTestCases.js.map +1 -1
- package/dist/helpers/removeCommentsInSourceCode.cjs +6 -2
- package/dist/helpers/removeCommentsInSourceCode.cjs.map +1 -1
- package/dist/helpers/removeCommentsInSourceCode.js +6 -2
- package/dist/helpers/removeCommentsInSourceCode.js.map +1 -1
- package/dist/helpers/resolveCwds.cjs +2 -2
- package/dist/helpers/resolveCwds.cjs.map +1 -1
- package/dist/helpers/resolveCwds.js +2 -2
- package/dist/helpers/resolveCwds.js.map +1 -1
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.cjs +2 -2
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.cjs.map +1 -1
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.js +2 -2
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.js.map +1 -1
- package/dist/helpers/runPythonInTemporaryUvProject.cjs +2 -2
- package/dist/helpers/runPythonInTemporaryUvProject.cjs.map +1 -1
- package/dist/helpers/runPythonInTemporaryUvProject.js +2 -2
- package/dist/helpers/runPythonInTemporaryUvProject.js.map +1 -1
- package/dist/helpers/sourceCodeGrammars.cjs +2 -2
- package/dist/helpers/sourceCodeGrammars.cjs.map +1 -1
- package/dist/helpers/sourceCodeGrammars.js +2 -2
- package/dist/helpers/sourceCodeGrammars.js.map +1 -1
- package/dist/helpers/spawnSyncWithTimeout.cjs +2 -2
- package/dist/helpers/spawnSyncWithTimeout.cjs.map +1 -1
- package/dist/helpers/spawnSyncWithTimeout.js +2 -2
- package/dist/helpers/spawnSyncWithTimeout.js.map +1 -1
- package/dist/helpers/startHttpServer.cjs +2 -2
- package/dist/helpers/startHttpServer.cjs.map +1 -1
- package/dist/helpers/startHttpServer.js +2 -2
- package/dist/helpers/startHttpServer.js.map +1 -1
- package/dist/index.cjs +1 -2
- package/dist/index.js +1 -2
- package/dist/presets/command.cjs +2 -2
- package/dist/presets/command.cjs.map +1 -1
- package/dist/presets/command.js +2 -2
- package/dist/presets/command.js.map +1 -1
- package/dist/presets/guiCommand.cjs +4 -2
- package/dist/presets/guiCommand.cjs.map +1 -1
- package/dist/presets/guiCommand.js +4 -2
- package/dist/presets/guiCommand.js.map +1 -1
- package/dist/presets/llm.cjs +2 -2
- package/dist/presets/llm.cjs.map +1 -1
- package/dist/presets/llm.js +2 -2
- package/dist/presets/llm.js.map +1 -1
- package/dist/presets/stdio.cjs +2 -2
- package/dist/presets/stdio.cjs.map +1 -1
- package/dist/presets/stdio.js +2 -2
- package/dist/presets/stdio.js.map +1 -1
- package/dist/types/decisionCode.cjs +2 -2
- package/dist/types/decisionCode.cjs.map +1 -1
- package/dist/types/decisionCode.js +2 -2
- package/dist/types/decisionCode.js.map +1 -1
- package/dist/types/language.cjs +11 -2
- package/dist/types/language.cjs.map +1 -1
- package/dist/types/language.js +11 -2
- package/dist/types/language.js.map +1 -1
- package/dist/types/problem.cjs +2 -2
- package/dist/types/problem.cjs.map +1 -1
- package/dist/types/problem.js +2 -2
- package/dist/types/problem.js.map +1 -1
- package/dist/types/testCaseResult.cjs +2 -2
- package/dist/types/testCaseResult.cjs.map +1 -1
- package/dist/types/testCaseResult.js +2 -2
- package/dist/types/testCaseResult.js.map +1 -1
- package/package.json +14 -14
- package/dist/_virtual/_rollupPluginBabelHelpers.cjs +0 -4
- package/dist/_virtual/_rollupPluginBabelHelpers.cjs.map +0 -1
- package/dist/_virtual/_rollupPluginBabelHelpers.js +0 -4
- package/dist/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/presets/llm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"],"
|
|
1
|
+
{"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"}
|
package/dist/presets/stdio.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
//# sourceMappingURL=stdio.cjs.map
|
|
1
|
+
"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;
|
|
2
|
+
//# sourceMappingURL=stdio.cjs.map
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"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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"}
|
package/dist/presets/stdio.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=stdio.js.map
|
|
1
|
+
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};
|
|
2
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"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 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
//# sourceMappingURL=decisionCode.cjs.map
|
|
1
|
+
"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;
|
|
2
|
+
//# sourceMappingURL=decisionCode.cjs.map
|
|
@@ -1 +1 @@
|
|
|
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"],"
|
|
1
|
+
{"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 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
//# sourceMappingURL=decisionCode.js.map
|
|
1
|
+
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};
|
|
2
|
+
//# sourceMappingURL=decisionCode.js.map
|
|
@@ -1 +1 @@
|
|
|
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"],"
|
|
1
|
+
{"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"}
|
package/dist/types/language.cjs
CHANGED
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
1
|
+
"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">
|
|
2
|
+
<PropertyGroup>
|
|
3
|
+
<OutputType>Exe</OutputType>
|
|
4
|
+
<TargetFramework>net8.0</TargetFramework>
|
|
5
|
+
<ImplicitUsings>enable</ImplicitUsings>
|
|
6
|
+
<Nullable>enable</Nullable>
|
|
7
|
+
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
8
|
+
<AssemblyName>Main</AssemblyName>
|
|
9
|
+
</PropertyGroup>
|
|
10
|
+
</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;
|
|
11
|
+
//# sourceMappingURL=language.cjs.map
|