@exercode/problem-utils 4.3.6 → 5.0.0
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/cli/checkAllProblems.cjs +1 -1
- package/dist/cli/checkAllProblems.cjs.map +1 -1
- package/dist/cli/checkAllProblems.d.ts +2 -1
- package/dist/cli/checkAllProblems.js +1 -1
- package/dist/cli/checkAllProblems.js.map +1 -1
- package/dist/cli/exercodeProblem.cjs.map +1 -1
- package/dist/cli/exercodeProblem.js.map +1 -1
- package/dist/cli/runSingleHarness.cjs.map +1 -1
- package/dist/cli/runSingleHarness.js.map +1 -1
- package/dist/cli/validateLearningMaterial.cjs.map +1 -1
- package/dist/cli/validateLearningMaterial.js.map +1 -1
- package/dist/helpers/checkProblemDirIsolation.cjs.map +1 -1
- package/dist/helpers/checkProblemDirIsolation.js.map +1 -1
- package/dist/helpers/cleanWorkingDirectory.cjs.map +1 -1
- package/dist/helpers/cleanWorkingDirectory.js.map +1 -1
- package/dist/helpers/compareExpectedOutputFiles.cjs.map +1 -1
- package/dist/helpers/compareExpectedOutputFiles.js.map +1 -1
- package/dist/helpers/compareStdoutAsSpaceSeparatedTokens.cjs.map +1 -1
- package/dist/helpers/compareStdoutAsSpaceSeparatedTokens.js.map +1 -1
- package/dist/helpers/copyTestCaseFileInput.cjs.map +1 -1
- package/dist/helpers/copyTestCaseFileInput.js.map +1 -1
- package/dist/helpers/defaultStdioHarness.cjs.map +1 -1
- package/dist/helpers/defaultStdioHarness.js.map +1 -1
- package/dist/helpers/findEntryPointFile.cjs.map +1 -1
- package/dist/helpers/findEntryPointFile.js.map +1 -1
- package/dist/helpers/findLanguageDefinitionByPath.cjs.map +1 -1
- package/dist/helpers/findLanguageDefinitionByPath.js.map +1 -1
- package/dist/helpers/findModelAnswerDirs.cjs.map +1 -1
- package/dist/helpers/findModelAnswerDirs.js.map +1 -1
- package/dist/helpers/guiRecording.cjs.map +1 -1
- package/dist/helpers/guiRecording.js.map +1 -1
- package/dist/helpers/javaJudge.cjs.map +1 -1
- package/dist/helpers/javaJudge.js.map +1 -1
- package/dist/helpers/judgeByStaticAnalysis.cjs.map +1 -1
- package/dist/helpers/judgeByStaticAnalysis.js.map +1 -1
- package/dist/helpers/parseArgs.cjs.map +1 -1
- package/dist/helpers/parseArgs.js.map +1 -1
- package/dist/helpers/parseCsv.cjs.map +1 -1
- package/dist/helpers/parseCsv.js.map +1 -1
- package/dist/helpers/printDebugBanner.cjs.map +1 -1
- package/dist/helpers/printDebugBanner.js.map +1 -1
- package/dist/helpers/printTestCaseResult.cjs.map +1 -1
- package/dist/helpers/printTestCaseResult.js.map +1 -1
- package/dist/helpers/readOutputFiles.cjs.map +1 -1
- package/dist/helpers/readOutputFiles.js.map +1 -1
- package/dist/helpers/readProblemMarkdownFrontMatter.cjs.map +1 -1
- package/dist/helpers/readProblemMarkdownFrontMatter.js.map +1 -1
- package/dist/helpers/readTestCases.cjs.map +1 -1
- package/dist/helpers/readTestCases.js.map +1 -1
- package/dist/helpers/removeCommentsInSourceCode.cjs.map +1 -1
- package/dist/helpers/removeCommentsInSourceCode.js.map +1 -1
- package/dist/helpers/resolveCwds.cjs.map +1 -1
- package/dist/helpers/resolveCwds.js.map +1 -1
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.cjs.map +1 -1
- package/dist/helpers/runCommandInTemporaryPackageManagerProject.js.map +1 -1
- package/dist/helpers/runHarnessProcess.cjs.map +1 -1
- package/dist/helpers/runHarnessProcess.js.map +1 -1
- package/dist/helpers/runIsolationCheckInDebugMode.cjs.map +1 -1
- package/dist/helpers/runIsolationCheckInDebugMode.js.map +1 -1
- package/dist/helpers/runPythonInTemporaryUvProject.cjs.map +1 -1
- package/dist/helpers/runPythonInTemporaryUvProject.js.map +1 -1
- package/dist/helpers/sourceCodeGrammars.cjs.map +1 -1
- package/dist/helpers/sourceCodeGrammars.js.map +1 -1
- package/dist/helpers/spawnWithLimits.cjs.map +1 -1
- package/dist/helpers/spawnWithLimits.js.map +1 -1
- package/dist/helpers/spawnWithTimeout.cjs.map +1 -1
- package/dist/helpers/spawnWithTimeout.js.map +1 -1
- package/dist/helpers/startHttpServer.cjs.map +1 -1
- package/dist/helpers/startHttpServer.js.map +1 -1
- package/dist/helpers/stdioJudgeRules.cjs.map +1 -1
- package/dist/helpers/stdioJudgeRules.js.map +1 -1
- package/dist/helpers/temporaryProblemDirCopy.cjs.map +1 -1
- package/dist/helpers/temporaryProblemDirCopy.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/learningMaterial/frontmatter.cjs.map +1 -1
- package/dist/learningMaterial/frontmatter.js.map +1 -1
- package/dist/learningMaterial/fsHelpers.cjs.map +1 -1
- package/dist/learningMaterial/fsHelpers.js.map +1 -1
- package/dist/learningMaterial/schemas.cjs +1 -1
- package/dist/learningMaterial/schemas.cjs.map +1 -1
- package/dist/learningMaterial/schemas.d.ts +43 -3
- package/dist/learningMaterial/schemas.js +1 -1
- package/dist/learningMaterial/schemas.js.map +1 -1
- package/dist/learningMaterial/validateContest.cjs +1 -1
- package/dist/learningMaterial/validateContest.cjs.map +1 -1
- package/dist/learningMaterial/validateContest.d.ts +0 -2
- package/dist/learningMaterial/validateContest.js +1 -1
- package/dist/learningMaterial/validateContest.js.map +1 -1
- package/dist/learningMaterial/validateCourse.cjs +1 -1
- package/dist/learningMaterial/validateCourse.cjs.map +1 -1
- package/dist/learningMaterial/validateCourse.js +1 -1
- package/dist/learningMaterial/validateCourse.js.map +1 -1
- package/dist/learningMaterial/validateMaterial.cjs +3 -3
- package/dist/learningMaterial/validateMaterial.cjs.map +1 -1
- package/dist/learningMaterial/validateMaterial.d.ts +0 -7
- package/dist/learningMaterial/validateMaterial.js +3 -3
- package/dist/learningMaterial/validateMaterial.js.map +1 -1
- package/dist/learningMaterial/validateProblem.cjs +1 -1
- package/dist/learningMaterial/validateProblem.cjs.map +1 -1
- package/dist/learningMaterial/validateProblem.js +1 -1
- package/dist/learningMaterial/validateProblem.js.map +1 -1
- package/dist/learningMaterial/validationResult.cjs.map +1 -1
- package/dist/learningMaterial/validationResult.js.map +1 -1
- package/dist/presets/command.cjs.map +1 -1
- package/dist/presets/command.js.map +1 -1
- package/dist/presets/evaluation.cjs.map +1 -1
- package/dist/presets/evaluation.js.map +1 -1
- package/dist/presets/guiCommand.cjs.map +1 -1
- package/dist/presets/guiCommand.js.map +1 -1
- package/dist/presets/springBoot.cjs.map +1 -1
- package/dist/presets/springBoot.js.map +1 -1
- package/dist/presets/stdio.cjs.map +1 -1
- package/dist/presets/stdio.js.map +1 -1
- package/dist/presets/tomcat.cjs.map +1 -1
- package/dist/presets/tomcat.js.map +1 -1
- package/dist/types/decisionCode.cjs.map +1 -1
- package/dist/types/decisionCode.js.map +1 -1
- package/dist/types/language.cjs.map +1 -1
- package/dist/types/language.js.map +1 -1
- package/dist/types/problem.cjs +1 -1
- package/dist/types/problem.cjs.map +1 -1
- package/dist/types/problem.d.ts +1 -0
- package/dist/types/problem.js +1 -1
- package/dist/types/problem.js.map +1 -1
- package/dist/types/testCaseResult.cjs.map +1 -1
- package/dist/types/testCaseResult.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tomcat.js","names":["sleep","fs","path","http","APPLICATION_NAME","TOMCAT_BASE_URL","SOURCE_FILE_EXTENSIONS","tomcatJudgePreset","options","error","getErrorMessage","submissionDir","parseArgs","testCaseId","staticAnalysisResult","judgeByStaticAnalysis","printTestCaseResult","runRootDir","tmpdir","buildDir","catalinaBaseDir","catalinaHome","prepareBuildDirectory","buildResult","buildWithMaven","getCatalinaHome","createCatalinaBaseDir","ensureTomcatStopped","deployWarFile","startTomcat","judgeResult","runJudgeScript","DecisionCode","submissionFiles","listSubmissionFiles","relativePath","sourcePath","targetPath","resolveTargetPath","normalizedRelativePath","extension","resolveJavaRelativePath","jspDirectory","forbiddenMatches","sourceCode","forbiddenText","forbiddenTexts","match","commandResult","runCommand","truncateOutput","formatMavenBuildError","stdout","stderr","directoryName","serverXmlPath","serverXml","warFilePath","webappsDir","deployedDirectoryPath","deployedWarPath","startupResult","waitForTomcatState","problemDirectoryPath","outputFiles","readOutputFiles","startAt","timeCommand","timedResult","spawnSync","timeoutSeconds","command","elapsedSeconds","stderrWithError","memoryMatch","timeSeconds","memoryBytes","isTomcatRunning","startedAt","timeoutMs","expectedRunning","setTimeout","request","response","status","resolve","validateCatalinaHome","buildTomcatUrl","urlPath"],"sources":["../../src/presets/tomcat.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport http from 'node:http';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { setTimeout as sleep } from 'node:timers/promises';\n\nimport { getErrorMessage } from '@willbooster/shared-lib';\n\nimport {\n listSubmissionFiles,\n MAX_OUTPUT_LENGTH,\n readOutputFiles,\n resolveJavaRelativePath,\n truncateOutput,\n} from '../helpers/javaJudge.js';\nimport { DecisionCode, parseArgs, printTestCaseResult, type TestCaseResult } from '../index.js';\n\nexport interface TomcatJudgePresetOptions {\n problemDirectoryPath: string;\n jspDirectory: '' | 'WEB-INF/jsp';\n forbiddenTexts?: readonly string[];\n evaluate: () => Promise<void>;\n}\n\ntype JudgeResult = Omit<TestCaseResult, 'testCaseId'>;\ninterface CommandResult {\n status: number | undefined;\n stdout: string;\n stderr: string;\n timeSeconds: number;\n memoryBytes: number;\n}\nconst APPLICATION_NAME = 'judge';\nconst BUILD_TIMEOUT_SECONDS = 60;\nconst EVALUATE_TIMEOUT_SECONDS = 30;\nconst TOMCAT_BASE_URL = 'http://localhost:59000';\nconst SOURCE_FILE_EXTENSIONS = new Set(['.java', '.jsp', '.html', '.htm', '.xml', '.js', '.css']);\n\nexport async function tomcatJudgePreset(options: TomcatJudgePresetOptions): Promise<void> {\n if (process.argv.includes('--evaluate')) {\n try {\n await options.evaluate();\n } catch (error) {\n console.error(getErrorMessage(error));\n process.exitCode = 1;\n }\n return;\n }\n\n const { cwd: submissionDir } = parseArgs(process.argv);\n if (!submissionDir) throw new Error('cwd argument required');\n const testCaseId = 'test1';\n const staticAnalysisResult = await judgeByStaticAnalysis(submissionDir, options.forbiddenTexts ?? []);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId, ...staticAnalysisResult });\n return;\n }\n\n const runRootDir = await fs.promises.mkdtemp(path.join(tmpdir(), 'tomcat_judge_'));\n const buildDir = path.join(runRootDir, 'build');\n let catalinaBaseDir: string | undefined;\n let catalinaHome: string | undefined;\n\n try {\n await fs.promises.mkdir(buildDir, { recursive: true });\n await prepareBuildDirectory(buildDir, submissionDir, options);\n\n const buildResult = buildWithMaven(buildDir);\n if (buildResult) {\n printTestCaseResult({ testCaseId, ...buildResult });\n return;\n }\n\n catalinaHome = getCatalinaHome();\n catalinaBaseDir = await createCatalinaBaseDir(catalinaHome, runRootDir);\n await ensureTomcatStopped(catalinaHome, catalinaBaseDir);\n await deployWarFile(buildDir, catalinaBaseDir);\n await startTomcat(catalinaHome, catalinaBaseDir);\n\n const judgeResult = runJudgeScript(buildDir, options.problemDirectoryPath);\n printTestCaseResult({ testCaseId, ...judgeResult });\n } catch (error) {\n printTestCaseResult({\n testCaseId,\n decisionCode: DecisionCode.JUDGE_NOT_AVAILABLE,\n stderr: getErrorMessage(error),\n });\n } finally {\n try {\n if (catalinaHome && catalinaBaseDir) {\n await ensureTomcatStopped(catalinaHome, catalinaBaseDir);\n }\n } catch {\n // 判定結果を優先し、後始末の失敗は握りつぶす。\n }\n await fs.promises.rm(runRootDir, { recursive: true, force: true });\n }\n}\n\nasync function prepareBuildDirectory(\n buildDir: string,\n submissionDir: string,\n options: TomcatJudgePresetOptions\n): Promise<void> {\n await fs.promises.mkdir(path.join(buildDir, 'src/main/java'), { recursive: true });\n await fs.promises.mkdir(path.join(buildDir, 'src/main/webapp/WEB-INF/jsp'), { recursive: true });\n await fs.promises.copyFile(path.join(options.problemDirectoryPath, 'pom.xml'), path.join(buildDir, 'pom.xml'));\n\n const submissionFiles = await listSubmissionFiles(submissionDir);\n for (const relativePath of submissionFiles) {\n const sourcePath = path.join(submissionDir, relativePath);\n const targetPath = await resolveTargetPath(buildDir, relativePath, sourcePath, options.jspDirectory);\n await fs.promises.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.promises.copyFile(sourcePath, targetPath);\n }\n}\n\nasync function resolveTargetPath(\n buildDir: string,\n relativePath: string,\n sourcePath: string,\n jspDirectory: string\n): Promise<string> {\n const normalizedRelativePath = relativePath.replaceAll('\\\\', '/');\n if (normalizedRelativePath.startsWith('src/main/')) {\n return path.join(buildDir, normalizedRelativePath);\n }\n if (normalizedRelativePath.startsWith('WEB-INF/') || normalizedRelativePath.startsWith('META-INF/')) {\n return path.join(buildDir, 'src/main/webapp', normalizedRelativePath);\n }\n\n const extension = path.extname(relativePath).toLowerCase();\n if (extension === '.java') {\n return path.join(buildDir, 'src/main/java', await resolveJavaRelativePath(sourcePath, relativePath));\n }\n if (extension === '.jsp') {\n return path.join(buildDir, 'src/main/webapp', jspDirectory, path.basename(relativePath));\n }\n\n return path.join(buildDir, 'src/main/webapp', normalizedRelativePath);\n}\n\nasync function judgeByStaticAnalysis(\n submissionDir: string,\n forbiddenTexts: readonly string[]\n): Promise<Pick<JudgeResult, 'decisionCode' | 'feedbackMarkdown'> | undefined> {\n const forbiddenMatches: { path: string; pattern: string }[] = [];\n for (const relativePath of await listSubmissionFiles(submissionDir)) {\n if (!SOURCE_FILE_EXTENSIONS.has(path.extname(relativePath).toLowerCase())) {\n continue;\n }\n\n const sourceCode = await fs.promises.readFile(path.join(submissionDir, relativePath), 'utf8');\n for (const forbiddenText of forbiddenTexts) {\n if (sourceCode.includes(forbiddenText)) {\n forbiddenMatches.push({ path: relativePath, pattern: forbiddenText });\n }\n }\n }\n\n if (forbiddenMatches.length === 0) {\n return undefined;\n }\n\n return {\n decisionCode: DecisionCode.FORBIDDEN_PATTERNS_IN_CODE_ERROR,\n feedbackMarkdown:\n 'ソースコード中に禁止された文字列が含まれています。\\nソースコードを修正してから再度提出してください。\\n\\n| ファイル | 禁止パターン |\\n| -------- | ------------ |\\n' +\n forbiddenMatches.map((match) => `| \\`${match.path}\\` | \\`${match.pattern}\\` |`).join('\\n'),\n };\n}\n\nfunction buildWithMaven(buildDir: string): JudgeResult | undefined {\n const commandResult = runCommand(\n ['mvn', 'clean', 'package', '--quiet', '--batch-mode', '--offline'],\n buildDir,\n BUILD_TIMEOUT_SECONDS\n );\n if (commandResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n return {\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n stderr: truncateOutput(commandResult.stderr),\n stdout: truncateOutput(commandResult.stdout),\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n };\n }\n if (commandResult.status === 0) {\n return undefined;\n }\n\n return {\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: formatMavenBuildError(commandResult.stdout, commandResult.stderr),\n stdout: truncateOutput(commandResult.stdout),\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n };\n}\n\nfunction formatMavenBuildError(stdout: string, stderr: string): string {\n return truncateOutput(\n `${stdout}\n${stderr}`.trim()\n );\n}\n\nasync function createCatalinaBaseDir(catalinaHome: string, runRootDir: string): Promise<string> {\n const catalinaBaseDir = path.join(runRootDir, 'catalina-base');\n await fs.promises.cp(path.join(catalinaHome, 'conf'), path.join(catalinaBaseDir, 'conf'), {\n recursive: true,\n dereference: true,\n });\n for (const directoryName of ['logs', 'temp', 'webapps', 'work']) {\n await fs.promises.mkdir(path.join(catalinaBaseDir, directoryName), { recursive: true });\n }\n\n const serverXmlPath = path.join(catalinaBaseDir, 'conf', 'server.xml');\n const serverXml = await fs.promises.readFile(serverXmlPath, 'utf8');\n await fs.promises.writeFile(serverXmlPath, serverXml.replaceAll('port=\"8080\"', 'port=\"59000\"'), 'utf8');\n return catalinaBaseDir;\n}\n\nasync function deployWarFile(buildDir: string, catalinaBaseDir: string): Promise<void> {\n const warFilePath = path.join(buildDir, 'target', `${APPLICATION_NAME}.war`);\n const webappsDir = path.join(catalinaBaseDir, 'webapps');\n const deployedDirectoryPath = path.join(webappsDir, APPLICATION_NAME);\n const deployedWarPath = path.join(webappsDir, `${APPLICATION_NAME}.war`);\n await fs.promises.mkdir(webappsDir, { recursive: true });\n await fs.promises.rm(deployedDirectoryPath, { recursive: true, force: true });\n await fs.promises.rm(deployedWarPath, { force: true });\n await fs.promises.copyFile(warFilePath, deployedWarPath);\n}\n\nasync function startTomcat(catalinaHome: string, catalinaBaseDir: string): Promise<void> {\n const startupScriptPath = path.join(catalinaHome, 'bin', 'startup.sh');\n const startupResult = runCommand([startupScriptPath], undefined, 10, {\n ...process.env,\n CATALINA_BASE: catalinaBaseDir,\n CATALINA_HOME: catalinaHome,\n });\n if (startupResult.status !== 0) {\n throw new Error(`Failed to start Tomcat: ${startupResult.stderr.trim() || startupResult.stdout.trim()}`);\n }\n\n const started = await waitForTomcatState(true, 10_000);\n if (!started) {\n throw new Error('Tomcat failed to start within 10 seconds');\n }\n}\n\nfunction runJudgeScript(buildDir: string, problemDirectoryPath: string): JudgeResult {\n const commandResult = runCommand(\n ['bun', 'run', './judge.ts', '--evaluate'],\n problemDirectoryPath,\n EVALUATE_TIMEOUT_SECONDS,\n {\n ...process.env,\n WORKING_DIRECTORY_PATH: buildDir,\n }\n );\n\n const outputFiles = readOutputFiles(path.join(buildDir, '__SCREENSHOTS.json'));\n if (commandResult.timeSeconds > EVALUATE_TIMEOUT_SECONDS) {\n return {\n decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED,\n stderr: truncateOutput(commandResult.stderr),\n stdout: truncateOutput(commandResult.stdout),\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n outputFiles,\n };\n }\n if (commandResult.stdout.length > MAX_OUTPUT_LENGTH || commandResult.stderr.length > MAX_OUTPUT_LENGTH) {\n return {\n decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED,\n stderr: truncateOutput(commandResult.stderr),\n stdout: truncateOutput(commandResult.stdout),\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n outputFiles,\n };\n }\n if (commandResult.status !== 0) {\n return {\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: truncateOutput(commandResult.stderr),\n stdout: truncateOutput(commandResult.stdout),\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n outputFiles,\n };\n }\n\n return {\n decisionCode: DecisionCode.ACCEPTED,\n stderr: truncateOutput(commandResult.stderr) || undefined,\n stdout: truncateOutput(commandResult.stdout) || undefined,\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n outputFiles,\n };\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n cwd: string | undefined,\n timeoutSeconds: number,\n env: NodeJS.ProcessEnv = process.env\n): CommandResult {\n const startAt = Date.now();\n const timeCommand = process.platform === 'darwin' ? 'gtime' : '/usr/bin/time';\n // Hosts provide GNU timeout on PATH; Homebrew coreutils also installs the unprefixed command.\n const timedResult = spawnSync('timeout', [timeoutSeconds.toFixed(3), timeCommand, '--format', '%e %M', ...command], {\n cwd,\n env,\n encoding: 'utf8',\n });\n const elapsedSeconds = (Date.now() - startAt) / 1000;\n const stderrWithError = [timedResult.stderr, timedResult.error?.message].filter(Boolean).join('\\n');\n const memoryMatch = /(?:^|\\n)(\\d+(?:\\.\\d+)?) (\\d+)\\s*$/u.exec(stderrWithError);\n const stderr = memoryMatch ? stderrWithError.slice(0, memoryMatch.index) : stderrWithError;\n const timeSeconds = Number(memoryMatch?.[1]) || elapsedSeconds;\n const memoryBytes = 1024 * Number(memoryMatch?.[2] ?? 0);\n\n return {\n status: timedResult.status === 124 ? 0 : (timedResult.status ?? undefined),\n stdout: timedResult.stdout,\n stderr,\n timeSeconds: timedResult.status === 124 ? timeoutSeconds + 0.001 : timeSeconds,\n memoryBytes,\n };\n}\n\nasync function ensureTomcatStopped(catalinaHome: string, catalinaBaseDir: string): Promise<void> {\n if (!(await isTomcatRunning())) {\n return;\n }\n\n runCommand([path.join(catalinaHome, 'bin', 'catalina.sh'), 'stop'], undefined, 10, {\n ...process.env,\n CATALINA_BASE: catalinaBaseDir,\n CATALINA_HOME: catalinaHome,\n });\n await waitForTomcatState(false, 10_000);\n}\n\nasync function waitForTomcatState(expectedRunning: boolean, timeoutMs: number): Promise<boolean> {\n const startedAt = Date.now();\n while (Date.now() - startedAt < timeoutMs) {\n if ((await isTomcatRunning()) === expectedRunning) {\n return true;\n }\n await sleep(200);\n }\n return (await isTomcatRunning()) === expectedRunning;\n}\n\nasync function isTomcatRunning(): Promise<boolean> {\n return await new Promise<boolean>((resolve) => {\n const request = http.get(TOMCAT_BASE_URL, (response) => {\n response.resume();\n const status = response.statusCode ?? 0;\n resolve((status >= 200 && status < 300) || status === 404);\n });\n request.on('error', () => resolve(false));\n request.setTimeout(1000, () => request.destroy());\n });\n}\n\nfunction getCatalinaHome(): string {\n const catalinaHome = process.env.CATALINA_HOME;\n if (!catalinaHome) {\n throw new Error('CATALINA_HOME is not set');\n }\n\n validateCatalinaHome(catalinaHome);\n return path.resolve(catalinaHome);\n}\n\nfunction validateCatalinaHome(catalinaHome: string): void {\n if (\n !fs.existsSync(path.join(catalinaHome, 'bin', 'catalina.sh')) ||\n !fs.existsSync(path.join(catalinaHome, 'conf', 'server.xml'))\n ) {\n throw new Error('Invalid CATALINA_HOME path');\n }\n}\n\nexport function buildTomcatUrl(urlPath: string): string {\n return `${TOMCAT_BASE_URL}/${APPLICATION_NAME}${urlPath.startsWith('/') ? urlPath : `/${urlPath}`}`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tomcat.js","names":["sleep","fs","path","http","APPLICATION_NAME","TOMCAT_BASE_URL","SOURCE_FILE_EXTENSIONS","tomcatJudgePreset","options","error","getErrorMessage","submissionDir","parseArgs","testCaseId","staticAnalysisResult","judgeByStaticAnalysis","printTestCaseResult","runRootDir","tmpdir","buildDir","catalinaBaseDir","catalinaHome","prepareBuildDirectory","buildResult","buildWithMaven","getCatalinaHome","createCatalinaBaseDir","ensureTomcatStopped","deployWarFile","startTomcat","judgeResult","runJudgeScript","DecisionCode","submissionFiles","listSubmissionFiles","relativePath","sourcePath","targetPath","resolveTargetPath","normalizedRelativePath","extension","resolveJavaRelativePath","jspDirectory","forbiddenMatches","sourceCode","forbiddenText","forbiddenTexts","match","commandResult","runCommand","truncateOutput","formatMavenBuildError","stdout","stderr","directoryName","serverXmlPath","serverXml","warFilePath","webappsDir","deployedDirectoryPath","deployedWarPath","startupResult","waitForTomcatState","problemDirectoryPath","outputFiles","readOutputFiles","startAt","timeCommand","timedResult","spawnSync","timeoutSeconds","command","elapsedSeconds","stderrWithError","memoryMatch","timeSeconds","memoryBytes","isTomcatRunning","startedAt","timeoutMs","expectedRunning","setTimeout","request","response","status","resolve","validateCatalinaHome","buildTomcatUrl","urlPath"],"sources":["../../src/presets/tomcat.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport http from 'node:http';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { setTimeout as sleep } from 'node:timers/promises';\n\nimport { getErrorMessage } from '@willbooster/shared-lib';\n\nimport {\n listSubmissionFiles,\n MAX_OUTPUT_LENGTH,\n readOutputFiles,\n resolveJavaRelativePath,\n truncateOutput,\n} from '../helpers/javaJudge.js';\nimport { DecisionCode, parseArgs, printTestCaseResult, type TestCaseResult } from '../index.js';\n\nexport interface TomcatJudgePresetOptions {\n problemDirectoryPath: string;\n jspDirectory: '' | 'WEB-INF/jsp';\n forbiddenTexts?: readonly string[];\n evaluate: () => Promise<void>;\n}\n\ntype JudgeResult = Omit<TestCaseResult, 'testCaseId'>;\ninterface CommandResult {\n status: number | undefined;\n stdout: string;\n stderr: string;\n timeSeconds: number;\n memoryBytes: number;\n}\nconst APPLICATION_NAME = 'judge';\nconst BUILD_TIMEOUT_SECONDS = 60;\nconst EVALUATE_TIMEOUT_SECONDS = 30;\nconst TOMCAT_BASE_URL = 'http://localhost:59000';\nconst SOURCE_FILE_EXTENSIONS = new Set(['.java', '.jsp', '.html', '.htm', '.xml', '.js', '.css']);\n\nexport async function tomcatJudgePreset(options: TomcatJudgePresetOptions): Promise<void> {\n if (process.argv.includes('--evaluate')) {\n try {\n await options.evaluate();\n } catch (error) {\n console.error(getErrorMessage(error));\n process.exitCode = 1;\n }\n return;\n }\n\n const { cwd: submissionDir } = parseArgs(process.argv);\n if (!submissionDir) throw new Error('cwd argument required');\n const testCaseId = 'test1';\n const staticAnalysisResult = await judgeByStaticAnalysis(submissionDir, options.forbiddenTexts ?? []);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId, ...staticAnalysisResult });\n return;\n }\n\n const runRootDir = await fs.promises.mkdtemp(path.join(tmpdir(), 'tomcat_judge_'));\n const buildDir = path.join(runRootDir, 'build');\n let catalinaBaseDir: string | undefined;\n let catalinaHome: string | undefined;\n\n try {\n await fs.promises.mkdir(buildDir, { recursive: true });\n await prepareBuildDirectory(buildDir, submissionDir, options);\n\n const buildResult = buildWithMaven(buildDir);\n if (buildResult) {\n printTestCaseResult({ testCaseId, ...buildResult });\n return;\n }\n\n catalinaHome = getCatalinaHome();\n catalinaBaseDir = await createCatalinaBaseDir(catalinaHome, runRootDir);\n await ensureTomcatStopped(catalinaHome, catalinaBaseDir);\n await deployWarFile(buildDir, catalinaBaseDir);\n await startTomcat(catalinaHome, catalinaBaseDir);\n\n const judgeResult = runJudgeScript(buildDir, options.problemDirectoryPath);\n printTestCaseResult({ testCaseId, ...judgeResult });\n } catch (error) {\n printTestCaseResult({\n testCaseId,\n decisionCode: DecisionCode.JUDGE_NOT_AVAILABLE,\n stderr: getErrorMessage(error),\n });\n } finally {\n try {\n if (catalinaHome && catalinaBaseDir) {\n await ensureTomcatStopped(catalinaHome, catalinaBaseDir);\n }\n } catch {\n // 判定結果を優先し、後始末の失敗は握りつぶす。\n }\n await fs.promises.rm(runRootDir, { recursive: true, force: true });\n }\n}\n\nasync function prepareBuildDirectory(\n buildDir: string,\n submissionDir: string,\n options: TomcatJudgePresetOptions\n): Promise<void> {\n await fs.promises.mkdir(path.join(buildDir, 'src/main/java'), { recursive: true });\n await fs.promises.mkdir(path.join(buildDir, 'src/main/webapp/WEB-INF/jsp'), { recursive: true });\n await fs.promises.copyFile(path.join(options.problemDirectoryPath, 'pom.xml'), path.join(buildDir, 'pom.xml'));\n\n const submissionFiles = await listSubmissionFiles(submissionDir);\n for (const relativePath of submissionFiles) {\n const sourcePath = path.join(submissionDir, relativePath);\n const targetPath = await resolveTargetPath(buildDir, relativePath, sourcePath, options.jspDirectory);\n await fs.promises.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.promises.copyFile(sourcePath, targetPath);\n }\n}\n\nasync function resolveTargetPath(\n buildDir: string,\n relativePath: string,\n sourcePath: string,\n jspDirectory: string\n): Promise<string> {\n const normalizedRelativePath = relativePath.replaceAll('\\\\', '/');\n if (normalizedRelativePath.startsWith('src/main/')) {\n return path.join(buildDir, normalizedRelativePath);\n }\n if (normalizedRelativePath.startsWith('WEB-INF/') || normalizedRelativePath.startsWith('META-INF/')) {\n return path.join(buildDir, 'src/main/webapp', normalizedRelativePath);\n }\n\n const extension = path.extname(relativePath).toLowerCase();\n if (extension === '.java') {\n return path.join(buildDir, 'src/main/java', await resolveJavaRelativePath(sourcePath, relativePath));\n }\n if (extension === '.jsp') {\n return path.join(buildDir, 'src/main/webapp', jspDirectory, path.basename(relativePath));\n }\n\n return path.join(buildDir, 'src/main/webapp', normalizedRelativePath);\n}\n\nasync function judgeByStaticAnalysis(\n submissionDir: string,\n forbiddenTexts: readonly string[]\n): Promise<Pick<JudgeResult, 'decisionCode' | 'feedbackMarkdown'> | undefined> {\n const forbiddenMatches: { path: string; pattern: string }[] = [];\n for (const relativePath of await listSubmissionFiles(submissionDir)) {\n if (!SOURCE_FILE_EXTENSIONS.has(path.extname(relativePath).toLowerCase())) {\n continue;\n }\n\n const sourceCode = await fs.promises.readFile(path.join(submissionDir, relativePath), 'utf8');\n for (const forbiddenText of forbiddenTexts) {\n if (sourceCode.includes(forbiddenText)) {\n forbiddenMatches.push({ path: relativePath, pattern: forbiddenText });\n }\n }\n }\n\n if (forbiddenMatches.length === 0) {\n return undefined;\n }\n\n return {\n decisionCode: DecisionCode.FORBIDDEN_PATTERNS_IN_CODE_ERROR,\n feedbackMarkdown:\n 'ソースコード中に禁止された文字列が含まれています。\\nソースコードを修正してから再度提出してください。\\n\\n| ファイル | 禁止パターン |\\n| -------- | ------------ |\\n' +\n forbiddenMatches.map((match) => `| \\`${match.path}\\` | \\`${match.pattern}\\` |`).join('\\n'),\n };\n}\n\nfunction buildWithMaven(buildDir: string): JudgeResult | undefined {\n const commandResult = runCommand(\n ['mvn', 'clean', 'package', '--quiet', '--batch-mode', '--offline'],\n buildDir,\n BUILD_TIMEOUT_SECONDS\n );\n if (commandResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n return {\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n stderr: truncateOutput(commandResult.stderr),\n stdout: truncateOutput(commandResult.stdout),\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n };\n }\n if (commandResult.status === 0) {\n return undefined;\n }\n\n return {\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: formatMavenBuildError(commandResult.stdout, commandResult.stderr),\n stdout: truncateOutput(commandResult.stdout),\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n };\n}\n\nfunction formatMavenBuildError(stdout: string, stderr: string): string {\n return truncateOutput(\n `${stdout}\n${stderr}`.trim()\n );\n}\n\nasync function createCatalinaBaseDir(catalinaHome: string, runRootDir: string): Promise<string> {\n const catalinaBaseDir = path.join(runRootDir, 'catalina-base');\n await fs.promises.cp(path.join(catalinaHome, 'conf'), path.join(catalinaBaseDir, 'conf'), {\n recursive: true,\n dereference: true,\n });\n for (const directoryName of ['logs', 'temp', 'webapps', 'work']) {\n await fs.promises.mkdir(path.join(catalinaBaseDir, directoryName), { recursive: true });\n }\n\n const serverXmlPath = path.join(catalinaBaseDir, 'conf', 'server.xml');\n const serverXml = await fs.promises.readFile(serverXmlPath, 'utf8');\n await fs.promises.writeFile(serverXmlPath, serverXml.replaceAll('port=\"8080\"', 'port=\"59000\"'), 'utf8');\n return catalinaBaseDir;\n}\n\nasync function deployWarFile(buildDir: string, catalinaBaseDir: string): Promise<void> {\n const warFilePath = path.join(buildDir, 'target', `${APPLICATION_NAME}.war`);\n const webappsDir = path.join(catalinaBaseDir, 'webapps');\n const deployedDirectoryPath = path.join(webappsDir, APPLICATION_NAME);\n const deployedWarPath = path.join(webappsDir, `${APPLICATION_NAME}.war`);\n await fs.promises.mkdir(webappsDir, { recursive: true });\n await fs.promises.rm(deployedDirectoryPath, { recursive: true, force: true });\n await fs.promises.rm(deployedWarPath, { force: true });\n await fs.promises.copyFile(warFilePath, deployedWarPath);\n}\n\nasync function startTomcat(catalinaHome: string, catalinaBaseDir: string): Promise<void> {\n const startupScriptPath = path.join(catalinaHome, 'bin', 'startup.sh');\n const startupResult = runCommand([startupScriptPath], undefined, 10, {\n ...process.env,\n CATALINA_BASE: catalinaBaseDir,\n CATALINA_HOME: catalinaHome,\n });\n if (startupResult.status !== 0) {\n throw new Error(`Failed to start Tomcat: ${startupResult.stderr.trim() || startupResult.stdout.trim()}`);\n }\n\n const started = await waitForTomcatState(true, 10_000);\n if (!started) {\n throw new Error('Tomcat failed to start within 10 seconds');\n }\n}\n\nfunction runJudgeScript(buildDir: string, problemDirectoryPath: string): JudgeResult {\n const commandResult = runCommand(\n ['bun', 'run', './judge.ts', '--evaluate'],\n problemDirectoryPath,\n EVALUATE_TIMEOUT_SECONDS,\n {\n ...process.env,\n WORKING_DIRECTORY_PATH: buildDir,\n }\n );\n\n const outputFiles = readOutputFiles(path.join(buildDir, '__SCREENSHOTS.json'));\n if (commandResult.timeSeconds > EVALUATE_TIMEOUT_SECONDS) {\n return {\n decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED,\n stderr: truncateOutput(commandResult.stderr),\n stdout: truncateOutput(commandResult.stdout),\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n outputFiles,\n };\n }\n if (commandResult.stdout.length > MAX_OUTPUT_LENGTH || commandResult.stderr.length > MAX_OUTPUT_LENGTH) {\n return {\n decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED,\n stderr: truncateOutput(commandResult.stderr),\n stdout: truncateOutput(commandResult.stdout),\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n outputFiles,\n };\n }\n if (commandResult.status !== 0) {\n return {\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: truncateOutput(commandResult.stderr),\n stdout: truncateOutput(commandResult.stdout),\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n outputFiles,\n };\n }\n\n return {\n decisionCode: DecisionCode.ACCEPTED,\n stderr: truncateOutput(commandResult.stderr) || undefined,\n stdout: truncateOutput(commandResult.stdout) || undefined,\n exitStatus: commandResult.status,\n timeSeconds: commandResult.timeSeconds,\n memoryBytes: commandResult.memoryBytes,\n outputFiles,\n };\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n cwd: string | undefined,\n timeoutSeconds: number,\n env: NodeJS.ProcessEnv = process.env\n): CommandResult {\n const startAt = Date.now();\n const timeCommand = process.platform === 'darwin' ? 'gtime' : '/usr/bin/time';\n // Hosts provide GNU timeout on PATH; Homebrew coreutils also installs the unprefixed command.\n const timedResult = spawnSync('timeout', [timeoutSeconds.toFixed(3), timeCommand, '--format', '%e %M', ...command], {\n cwd,\n env,\n encoding: 'utf8',\n });\n const elapsedSeconds = (Date.now() - startAt) / 1000;\n const stderrWithError = [timedResult.stderr, timedResult.error?.message].filter(Boolean).join('\\n');\n const memoryMatch = /(?:^|\\n)(\\d+(?:\\.\\d+)?) (\\d+)\\s*$/u.exec(stderrWithError);\n const stderr = memoryMatch ? stderrWithError.slice(0, memoryMatch.index) : stderrWithError;\n const timeSeconds = Number(memoryMatch?.[1]) || elapsedSeconds;\n const memoryBytes = 1024 * Number(memoryMatch?.[2] ?? 0);\n\n return {\n status: timedResult.status === 124 ? 0 : (timedResult.status ?? undefined),\n stdout: timedResult.stdout,\n stderr,\n timeSeconds: timedResult.status === 124 ? timeoutSeconds + 0.001 : timeSeconds,\n memoryBytes,\n };\n}\n\nasync function ensureTomcatStopped(catalinaHome: string, catalinaBaseDir: string): Promise<void> {\n if (!(await isTomcatRunning())) {\n return;\n }\n\n runCommand([path.join(catalinaHome, 'bin', 'catalina.sh'), 'stop'], undefined, 10, {\n ...process.env,\n CATALINA_BASE: catalinaBaseDir,\n CATALINA_HOME: catalinaHome,\n });\n await waitForTomcatState(false, 10_000);\n}\n\nasync function waitForTomcatState(expectedRunning: boolean, timeoutMs: number): Promise<boolean> {\n const startedAt = Date.now();\n while (Date.now() - startedAt < timeoutMs) {\n if ((await isTomcatRunning()) === expectedRunning) {\n return true;\n }\n await sleep(200);\n }\n return (await isTomcatRunning()) === expectedRunning;\n}\n\nasync function isTomcatRunning(): Promise<boolean> {\n return await new Promise<boolean>((resolve) => {\n const request = http.get(TOMCAT_BASE_URL, (response) => {\n response.resume();\n const status = response.statusCode ?? 0;\n resolve((status >= 200 && status < 300) || status === 404);\n });\n request.on('error', () => resolve(false));\n request.setTimeout(1000, () => request.destroy());\n });\n}\n\nfunction getCatalinaHome(): string {\n const catalinaHome = process.env.CATALINA_HOME;\n if (!catalinaHome) {\n throw new Error('CATALINA_HOME is not set');\n }\n\n validateCatalinaHome(catalinaHome);\n return path.resolve(catalinaHome);\n}\n\nfunction validateCatalinaHome(catalinaHome: string): void {\n if (\n !fs.existsSync(path.join(catalinaHome, 'bin', 'catalina.sh')) ||\n !fs.existsSync(path.join(catalinaHome, 'conf', 'server.xml'))\n ) {\n throw new Error('Invalid CATALINA_HOME path');\n }\n}\n\nexport function buildTomcatUrl(urlPath: string): string {\n return `${TOMCAT_BASE_URL}/${APPLICATION_NAME}${urlPath.startsWith('/') ? urlPath : `/${urlPath}`}`;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decisionCode.cjs","names":["DecisionCode"],"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,MAAaA,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
|
+
{"version":3,"file":"decisionCode.cjs","names":["DecisionCode"],"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":"A,aAAA,MAAaA,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,E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decisionCode.js","names":["DecisionCode"],"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,MAAaA,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
|
+
{"version":3,"file":"decisionCode.js","names":["DecisionCode"],"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,MAAaA,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,E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.cjs","names":["fs","path","removeCommentsInSourceCode","require_runtime","require_removeCommentsInSourceCode","node_fs","node_path","cLikeGrammer","javaScriptLikeGrammer","languageIdToDefinition","filePath","cwd","publicClassRegex","dirent","data","className","fileName"],"sources":["../../src/types/language.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { removeCommentsInSourceCode } from '../helpers/removeCommentsInSourceCode.js';\n\nexport interface LanguageDefinition {\n /** File extensions to judge with this config. */\n fileExtensions: readonly string[];\n\n /** Function executed before the build. */\n prebuild?(cwd: string): Promise<void>;\n\n /** Returns the command to build a user program. */\n buildCommand?(filePath: string): [string, ...string[]];\n\n /** Returns the command to run a user program. */\n command(filePath: string): [string, ...string[]];\n\n /** Grammer definition for static analysis. */\n grammer?: {\n strings?: readonly { open: RegExp; close: RegExp; templateSyntax?: 'kotlin' }[];\n comments?: readonly { open: RegExp; close?: RegExp }[];\n };\n}\n\nconst cLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nconst javaScriptLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n { open: /`/, close: /(?<!\\\\)(?:\\\\{2})*`/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nexport const languageIdToDefinition: Readonly<Record<string, Readonly<LanguageDefinition>>> = {\n c: {\n fileExtensions: ['.c'],\n buildCommand: (filePath) => ['gcc', '--std=c17', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n cpp: {\n fileExtensions: ['.cpp'],\n buildCommand: (filePath) => ['g++', '--std=c++20', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n csharp: {\n fileExtensions: ['.cs'],\n prebuild: async (cwd) => {\n await fs.promises.writeFile(\n path.join(cwd, 'Main.csproj'),\n `<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>`\n );\n },\n buildCommand: () => ['dotnet', 'build', 'Main.csproj', '--configuration', 'Release', '--verbosity', 'quiet'],\n command: () => ['dotnet', 'bin/Release/net8.0/Main.dll'],\n grammer: cLikeGrammer,\n },\n\n css: {\n fileExtensions: ['.css'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }],\n },\n },\n\n dart: {\n fileExtensions: ['.dart'],\n buildCommand: (filePath) => ['dart', 'compile', 'exe', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n java: {\n fileExtensions: ['.java'],\n prebuild: async (cwd) => {\n const publicClassRegex = /\\bpublic\\s+class\\s+(\\w+)\\b/;\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile() || !dirent.name.endsWith('.java')) continue;\n const data = await fs.promises.readFile(path.join(cwd, dirent.name), 'utf8');\n const [, className] = publicClassRegex.exec(removeCommentsInSourceCode(cLikeGrammer, data)) ?? [];\n if (className) await fs.promises.rename(path.join(cwd, dirent.name), path.join(cwd, `${className}.java`));\n }\n },\n buildCommand: (fileName) => ['javac', fileName],\n // For example, Problem 7-3 in WillBooster's Java lecture uses at least 256MB.\n command: (fileName) => ['java', '-Xmx1024m', fileName.replace(/\\.java$/, '')],\n grammer: cLikeGrammer,\n },\n\n kotlin: {\n fileExtensions: ['.kt'],\n buildCommand: (filePath) => ['kotlinc', filePath, '-include-runtime', '-d', 'main.jar'],\n command: () => ['java', '-Xmx1024m', '-jar', 'main.jar'],\n grammer: {\n strings: [\n { open: /\"\"\"/, close: /\"\"\"/, templateSyntax: 'kotlin' },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/, templateSyntax: 'kotlin' },\n ],\n comments: cLikeGrammer.comments,\n },\n },\n\n javascript: {\n fileExtensions: ['.js', '.cjs', '.mjs'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n jsp: {\n fileExtensions: ['.jsp'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*<!--/, close: /-->/ },\n { open: /\\n?[ \\t]*<%--/, close: /--%>/ },\n { open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// },\n { open: /\\n?[ \\t]*\\/\\// },\n ],\n },\n },\n\n haskell: {\n fileExtensions: ['.hs'],\n buildCommand: (filePath) => ['ghc', '-o', 'main', filePath],\n command: () => ['./main'],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\{-/, close: /-\\}/ }, { open: /\\n?[ \\t]*--/ }],\n },\n },\n\n html: {\n fileExtensions: ['.html'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*<!--/, close: /-->/ }],\n },\n },\n\n php: {\n fileExtensions: ['.php'],\n command: (fileName) => ['php', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n python: {\n fileExtensions: ['.py'],\n command: (fileName) => ['python3', fileName],\n grammer: {\n strings: [\n { open: /'''/, close: /(?<!\\\\)(?:\\\\{2})*'''/ },\n { open: /\"\"\"/, close: /(?<!\\\\)(?:\\\\{2})*\"\"\"/ },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*'''/, close: /'''/ },\n { open: /\\n?[ \\t]*\"\"\"/, close: /\"\"\"/ },\n { open: /\\n?[ \\t]*#/ },\n ],\n },\n },\n\n ruby: {\n fileExtensions: ['.rb'],\n buildCommand: (fileName) => ['ruby', '-c', fileName],\n command: (fileName) => ['ruby', '--jit', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*=begin/, close: /=end/ }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n rust: {\n fileExtensions: ['.rs'],\n buildCommand: (filePath) => ['rustc', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n zig: {\n fileExtensions: ['.zig'],\n buildCommand: (filePath) => ['zig', 'build-exe', filePath],\n command: (filePath) => ['./' + filePath.replace(/\\.zig$/, '')],\n grammer: cLikeGrammer,\n },\n\n typescript: {\n fileExtensions: ['.ts', '.cts', '.mts'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n text: {\n fileExtensions: ['.txt'],\n command: (fileName) => ['cat', fileName],\n },\n} as const;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"language.cjs","names":["fs","path","removeCommentsInSourceCode","require_runtime","require_removeCommentsInSourceCode","node_fs","node_path","cLikeGrammer","javaScriptLikeGrammer","languageIdToDefinition","filePath","cwd","publicClassRegex","dirent","data","className","fileName"],"sources":["../../src/types/language.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { removeCommentsInSourceCode } from '../helpers/removeCommentsInSourceCode.js';\n\nexport interface LanguageDefinition {\n /** File extensions to judge with this config. */\n fileExtensions: readonly string[];\n\n /** Function executed before the build. */\n prebuild?(cwd: string): Promise<void>;\n\n /** Returns the command to build a user program. */\n buildCommand?(filePath: string): [string, ...string[]];\n\n /** Returns the command to run a user program. */\n command(filePath: string): [string, ...string[]];\n\n /** Grammer definition for static analysis. */\n grammer?: {\n strings?: readonly { open: RegExp; close: RegExp; templateSyntax?: 'kotlin' }[];\n comments?: readonly { open: RegExp; close?: RegExp }[];\n };\n}\n\nconst cLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nconst javaScriptLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n { open: /`/, close: /(?<!\\\\)(?:\\\\{2})*`/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nexport const languageIdToDefinition: Readonly<Record<string, Readonly<LanguageDefinition>>> = {\n c: {\n fileExtensions: ['.c'],\n buildCommand: (filePath) => ['gcc', '--std=c17', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n cpp: {\n fileExtensions: ['.cpp'],\n buildCommand: (filePath) => ['g++', '--std=c++20', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n csharp: {\n fileExtensions: ['.cs'],\n prebuild: async (cwd) => {\n await fs.promises.writeFile(\n path.join(cwd, 'Main.csproj'),\n `<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>`\n );\n },\n buildCommand: () => ['dotnet', 'build', 'Main.csproj', '--configuration', 'Release', '--verbosity', 'quiet'],\n command: () => ['dotnet', 'bin/Release/net8.0/Main.dll'],\n grammer: cLikeGrammer,\n },\n\n css: {\n fileExtensions: ['.css'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }],\n },\n },\n\n dart: {\n fileExtensions: ['.dart'],\n buildCommand: (filePath) => ['dart', 'compile', 'exe', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n java: {\n fileExtensions: ['.java'],\n prebuild: async (cwd) => {\n const publicClassRegex = /\\bpublic\\s+class\\s+(\\w+)\\b/;\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile() || !dirent.name.endsWith('.java')) continue;\n const data = await fs.promises.readFile(path.join(cwd, dirent.name), 'utf8');\n const [, className] = publicClassRegex.exec(removeCommentsInSourceCode(cLikeGrammer, data)) ?? [];\n if (className) await fs.promises.rename(path.join(cwd, dirent.name), path.join(cwd, `${className}.java`));\n }\n },\n buildCommand: (fileName) => ['javac', fileName],\n // For example, Problem 7-3 in WillBooster's Java lecture uses at least 256MB.\n command: (fileName) => ['java', '-Xmx1024m', fileName.replace(/\\.java$/, '')],\n grammer: cLikeGrammer,\n },\n\n kotlin: {\n fileExtensions: ['.kt'],\n buildCommand: (filePath) => ['kotlinc', filePath, '-include-runtime', '-d', 'main.jar'],\n command: () => ['java', '-Xmx1024m', '-jar', 'main.jar'],\n grammer: {\n strings: [\n { open: /\"\"\"/, close: /\"\"\"/, templateSyntax: 'kotlin' },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/, templateSyntax: 'kotlin' },\n ],\n comments: cLikeGrammer.comments,\n },\n },\n\n javascript: {\n fileExtensions: ['.js', '.cjs', '.mjs'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n jsp: {\n fileExtensions: ['.jsp'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*<!--/, close: /-->/ },\n { open: /\\n?[ \\t]*<%--/, close: /--%>/ },\n { open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// },\n { open: /\\n?[ \\t]*\\/\\// },\n ],\n },\n },\n\n haskell: {\n fileExtensions: ['.hs'],\n buildCommand: (filePath) => ['ghc', '-o', 'main', filePath],\n command: () => ['./main'],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\{-/, close: /-\\}/ }, { open: /\\n?[ \\t]*--/ }],\n },\n },\n\n html: {\n fileExtensions: ['.html'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*<!--/, close: /-->/ }],\n },\n },\n\n php: {\n fileExtensions: ['.php'],\n command: (fileName) => ['php', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n python: {\n fileExtensions: ['.py'],\n command: (fileName) => ['python3', fileName],\n grammer: {\n strings: [\n { open: /'''/, close: /(?<!\\\\)(?:\\\\{2})*'''/ },\n { open: /\"\"\"/, close: /(?<!\\\\)(?:\\\\{2})*\"\"\"/ },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*'''/, close: /'''/ },\n { open: /\\n?[ \\t]*\"\"\"/, close: /\"\"\"/ },\n { open: /\\n?[ \\t]*#/ },\n ],\n },\n },\n\n ruby: {\n fileExtensions: ['.rb'],\n buildCommand: (fileName) => ['ruby', '-c', fileName],\n command: (fileName) => ['ruby', '--jit', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*=begin/, close: /=end/ }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n rust: {\n fileExtensions: ['.rs'],\n buildCommand: (filePath) => ['rustc', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n zig: {\n fileExtensions: ['.zig'],\n buildCommand: (filePath) => ['zig', 'build-exe', filePath],\n command: (filePath) => ['./' + filePath.replace(/\\.zig$/, '')],\n grammer: cLikeGrammer,\n },\n\n typescript: {\n fileExtensions: ['.ts', '.cts', '.mts'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n text: {\n fileExtensions: ['.txt'],\n command: (fileName) => ['cat', fileName],\n },\n} as const;\n"],"mappings":"A,+MAyBA,MAAMO,EAAe,CACnB,QAAS,CACP,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,oBAAqB,CAC3C,EACA,SAAU,CAAC,CAAE,KAAM,gBAAiB,MAAO,MAAO,EAAG,CAAE,KAAM,eAAgB,CAAC,CAChF,EAEMC,EAAwB,CAC5B,QAAS,CACP,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,oBAAqB,CAC3C,EACA,SAAU,CAAC,CAAE,KAAM,gBAAiB,MAAO,MAAO,EAAG,CAAE,KAAM,eAAgB,CAAC,CAChF,EAEaC,EAAiF,CAC5F,EAAG,CACD,eAAgB,CAAC,IAAI,EACrB,aAAe,GAAa,CAAC,MAAO,YAAa,MAAOC,EAAU,KAAM,MAAM,EAC9E,YAAe,CAAC,QAAQ,EACxB,QAASH,CACX,EAEA,IAAK,CACH,eAAgB,CAAC,MAAM,EACvB,aAAe,GAAa,CAAC,MAAO,cAAe,MAAOG,EAAU,KAAM,MAAM,EAChF,YAAe,CAAC,QAAQ,EACxB,QAASH,CACX,EAEA,OAAQ,CACN,eAAgB,CAAC,KAAK,EACtB,SAAU,KAAO,IAAQ,CACvB,MAAMP,EAAAA,QAAG,SAAS,UAChBC,EAAAA,QAAK,KAAKU,EAAK,aAAa,EAC5B;;;;;;;;;WAUF,CACF,EACA,iBAAoB,CAAC,SAAU,QAAS,cAAe,kBAAmB,UAAW,cAAe,OAAO,EAC3G,YAAe,CAAC,SAAU,6BAA6B,EACvD,QAASJ,CACX,EAEA,IAAK,CACH,eAAgB,CAAC,MAAM,EACvB,YAAe,CAAC,OAAQ,EAAE,EAC1B,QAAS,CACP,QAAS,CACP,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,oBAAqB,CAC3C,EACA,SAAU,CAAC,CAAE,KAAM,gBAAiB,MAAO,MAAO,CAAC,CACrD,CACF,EAEA,KAAM,CACJ,eAAgB,CAAC,OAAO,EACxB,aAAe,GAAa,CAAC,OAAQ,UAAW,MAAOG,EAAU,KAAM,MAAM,EAC7E,YAAe,CAAC,QAAQ,EACxB,QAASH,CACX,EAEA,KAAM,CACJ,eAAgB,CAAC,OAAO,EACxB,SAAU,KAAO,IAAQ,CACvB,IAAMK,EAAmB,6BACzB,IAAK,IAAMC,KAAU,MAAMb,EAAAA,QAAG,SAAS,QAAQW,EAAK,CAAE,cAAe,EAAK,CAAC,EAAG,CAC5E,GAAI,CAACE,EAAO,OAAO,GAAK,CAACA,EAAO,KAAK,SAAS,OAAO,EAAG,SACxD,IAAMC,EAAO,MAAMd,EAAAA,QAAG,SAAS,SAASC,EAAAA,QAAK,KAAKU,EAAKE,EAAO,IAAI,EAAG,MAAM,EACrE,EAAGE,GAAaH,EAAiB,KAAKV,EAAAA,2BAA2BK,EAAcO,CAAI,CAAC,GAAK,CAAC,EAC5FC,GAAW,MAAMf,EAAAA,QAAG,SAAS,OAAOC,EAAAA,QAAK,KAAKU,EAAKE,EAAO,IAAI,EAAGZ,EAAAA,QAAK,KAAKU,EAAK,GAAGI,EAAU,MAAM,CAAC,CAC1G,CACF,EACA,aAAe,GAAa,CAAC,QAASC,CAAQ,EAE9C,QAAU,GAAa,CAAC,OAAQ,YAAaA,EAAS,QAAQ,UAAW,EAAE,CAAC,EAC5E,QAAST,CACX,EAEA,OAAQ,CACN,eAAgB,CAAC,KAAK,EACtB,aAAe,GAAa,CAAC,UAAWG,EAAU,mBAAoB,KAAM,UAAU,EACtF,YAAe,CAAC,OAAQ,YAAa,OAAQ,UAAU,EACvD,QAAS,CACP,QAAS,CACP,CAAE,KAAM,MAAO,MAAO,MAAO,eAAgB,QAAS,EACtD,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,qBAAsB,eAAgB,QAAS,CACrE,EACA,SAAUH,EAAa,QACzB,CACF,EAEA,WAAY,CACV,eAAgB,CAAC,MAAO,OAAQ,MAAM,EACtC,QAAU,GAAa,CAAC,MAAOS,CAAQ,EACvC,QAASR,CACX,EAEA,IAAK,CACH,eAAgB,CAAC,MAAM,EACvB,YAAe,CAAC,OAAQ,EAAE,EAC1B,QAAS,CACP,QAAS,CACP,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,oBAAqB,CAC3C,EACA,SAAU,CACR,CAAE,KAAM,gBAAiB,MAAO,KAAM,EACtC,CAAE,KAAM,gBAAiB,MAAO,MAAO,EACvC,CAAE,KAAM,gBAAiB,MAAO,MAAO,EACvC,CAAE,KAAM,eAAgB,CAC1B,CACF,CACF,EAEA,QAAS,CACP,eAAgB,CAAC,KAAK,EACtB,aAAe,GAAa,CAAC,MAAO,KAAM,OAAQE,CAAQ,EAC1D,YAAe,CAAC,QAAQ,EACxB,QAAS,CACP,QAAS,CACP,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,oBAAqB,CAC3C,EACA,SAAU,CAAC,CAAE,KAAM,eAAgB,MAAO,KAAM,EAAG,CAAE,KAAM,aAAc,CAAC,CAC5E,CACF,EAEA,KAAM,CACJ,eAAgB,CAAC,OAAO,EACxB,YAAe,CAAC,OAAQ,EAAE,EAC1B,QAAS,CACP,QAAS,CACP,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,oBAAqB,CAC3C,EACA,SAAU,CAAC,CAAE,KAAM,gBAAiB,MAAO,KAAM,CAAC,CACpD,CACF,EAEA,IAAK,CACH,eAAgB,CAAC,MAAM,EACvB,QAAU,GAAa,CAAC,MAAOM,CAAQ,EACvC,QAAS,CACP,QAAS,CACP,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,oBAAqB,CAC3C,EACA,SAAU,CAAC,CAAE,KAAM,gBAAiB,MAAO,MAAO,EAAG,CAAE,KAAM,eAAgB,EAAG,CAAE,KAAM,YAAa,CAAC,CACxG,CACF,EAEA,OAAQ,CACN,eAAgB,CAAC,KAAK,EACtB,QAAU,GAAa,CAAC,UAAWA,CAAQ,EAC3C,QAAS,CACP,QAAS,CACP,CAAE,KAAM,MAAO,MAAO,sBAAuB,EAC7C,CAAE,KAAM,MAAO,MAAO,sBAAuB,EAC7C,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,oBAAqB,CAC3C,EACA,SAAU,CACR,CAAE,KAAM,eAAgB,MAAO,KAAM,EACrC,CAAE,KAAM,eAAgB,MAAO,KAAM,EACrC,CAAE,KAAM,YAAa,CACvB,CACF,CACF,EAEA,KAAM,CACJ,eAAgB,CAAC,KAAK,EACtB,aAAe,GAAa,CAAC,OAAQ,KAAMA,CAAQ,EACnD,QAAU,GAAa,CAAC,OAAQ,QAASA,CAAQ,EACjD,QAAS,CACP,QAAS,CACP,CAAE,KAAM,IAAK,MAAO,oBAAqB,EACzC,CAAE,KAAM,IAAK,MAAO,oBAAqB,CAC3C,EACA,SAAU,CAAC,CAAE,KAAM,kBAAmB,MAAO,MAAO,EAAG,CAAE,KAAM,YAAa,CAAC,CAC/E,CACF,EAEA,KAAM,CACJ,eAAgB,CAAC,KAAK,EACtB,aAAe,GAAa,CAAC,QAASN,EAAU,KAAM,MAAM,EAC5D,YAAe,CAAC,QAAQ,EACxB,QAASH,CACX,EAEA,IAAK,CACH,eAAgB,CAAC,MAAM,EACvB,aAAe,GAAa,CAAC,MAAO,YAAaG,CAAQ,EACzD,QAAU,GAAa,CAAC,KAAOA,EAAS,QAAQ,SAAU,EAAE,CAAC,EAC7D,QAASH,CACX,EAEA,WAAY,CACV,eAAgB,CAAC,MAAO,OAAQ,MAAM,EACtC,QAAU,GAAa,CAAC,MAAOS,CAAQ,EACvC,QAASR,CACX,EAEA,KAAM,CACJ,eAAgB,CAAC,MAAM,EACvB,QAAU,GAAa,CAAC,MAAOQ,CAAQ,CACzC,CACF,E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.js","names":["fs","path","cLikeGrammer","javaScriptLikeGrammer","languageIdToDefinition","filePath","cwd","publicClassRegex","dirent","data","className","removeCommentsInSourceCode","fileName"],"sources":["../../src/types/language.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { removeCommentsInSourceCode } from '../helpers/removeCommentsInSourceCode.js';\n\nexport interface LanguageDefinition {\n /** File extensions to judge with this config. */\n fileExtensions: readonly string[];\n\n /** Function executed before the build. */\n prebuild?(cwd: string): Promise<void>;\n\n /** Returns the command to build a user program. */\n buildCommand?(filePath: string): [string, ...string[]];\n\n /** Returns the command to run a user program. */\n command(filePath: string): [string, ...string[]];\n\n /** Grammer definition for static analysis. */\n grammer?: {\n strings?: readonly { open: RegExp; close: RegExp; templateSyntax?: 'kotlin' }[];\n comments?: readonly { open: RegExp; close?: RegExp }[];\n };\n}\n\nconst cLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nconst javaScriptLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n { open: /`/, close: /(?<!\\\\)(?:\\\\{2})*`/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nexport const languageIdToDefinition: Readonly<Record<string, Readonly<LanguageDefinition>>> = {\n c: {\n fileExtensions: ['.c'],\n buildCommand: (filePath) => ['gcc', '--std=c17', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n cpp: {\n fileExtensions: ['.cpp'],\n buildCommand: (filePath) => ['g++', '--std=c++20', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n csharp: {\n fileExtensions: ['.cs'],\n prebuild: async (cwd) => {\n await fs.promises.writeFile(\n path.join(cwd, 'Main.csproj'),\n `<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>`\n );\n },\n buildCommand: () => ['dotnet', 'build', 'Main.csproj', '--configuration', 'Release', '--verbosity', 'quiet'],\n command: () => ['dotnet', 'bin/Release/net8.0/Main.dll'],\n grammer: cLikeGrammer,\n },\n\n css: {\n fileExtensions: ['.css'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }],\n },\n },\n\n dart: {\n fileExtensions: ['.dart'],\n buildCommand: (filePath) => ['dart', 'compile', 'exe', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n java: {\n fileExtensions: ['.java'],\n prebuild: async (cwd) => {\n const publicClassRegex = /\\bpublic\\s+class\\s+(\\w+)\\b/;\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile() || !dirent.name.endsWith('.java')) continue;\n const data = await fs.promises.readFile(path.join(cwd, dirent.name), 'utf8');\n const [, className] = publicClassRegex.exec(removeCommentsInSourceCode(cLikeGrammer, data)) ?? [];\n if (className) await fs.promises.rename(path.join(cwd, dirent.name), path.join(cwd, `${className}.java`));\n }\n },\n buildCommand: (fileName) => ['javac', fileName],\n // For example, Problem 7-3 in WillBooster's Java lecture uses at least 256MB.\n command: (fileName) => ['java', '-Xmx1024m', fileName.replace(/\\.java$/, '')],\n grammer: cLikeGrammer,\n },\n\n kotlin: {\n fileExtensions: ['.kt'],\n buildCommand: (filePath) => ['kotlinc', filePath, '-include-runtime', '-d', 'main.jar'],\n command: () => ['java', '-Xmx1024m', '-jar', 'main.jar'],\n grammer: {\n strings: [\n { open: /\"\"\"/, close: /\"\"\"/, templateSyntax: 'kotlin' },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/, templateSyntax: 'kotlin' },\n ],\n comments: cLikeGrammer.comments,\n },\n },\n\n javascript: {\n fileExtensions: ['.js', '.cjs', '.mjs'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n jsp: {\n fileExtensions: ['.jsp'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*<!--/, close: /-->/ },\n { open: /\\n?[ \\t]*<%--/, close: /--%>/ },\n { open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// },\n { open: /\\n?[ \\t]*\\/\\// },\n ],\n },\n },\n\n haskell: {\n fileExtensions: ['.hs'],\n buildCommand: (filePath) => ['ghc', '-o', 'main', filePath],\n command: () => ['./main'],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\{-/, close: /-\\}/ }, { open: /\\n?[ \\t]*--/ }],\n },\n },\n\n html: {\n fileExtensions: ['.html'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*<!--/, close: /-->/ }],\n },\n },\n\n php: {\n fileExtensions: ['.php'],\n command: (fileName) => ['php', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n python: {\n fileExtensions: ['.py'],\n command: (fileName) => ['python3', fileName],\n grammer: {\n strings: [\n { open: /'''/, close: /(?<!\\\\)(?:\\\\{2})*'''/ },\n { open: /\"\"\"/, close: /(?<!\\\\)(?:\\\\{2})*\"\"\"/ },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*'''/, close: /'''/ },\n { open: /\\n?[ \\t]*\"\"\"/, close: /\"\"\"/ },\n { open: /\\n?[ \\t]*#/ },\n ],\n },\n },\n\n ruby: {\n fileExtensions: ['.rb'],\n buildCommand: (fileName) => ['ruby', '-c', fileName],\n command: (fileName) => ['ruby', '--jit', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*=begin/, close: /=end/ }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n rust: {\n fileExtensions: ['.rs'],\n buildCommand: (filePath) => ['rustc', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n zig: {\n fileExtensions: ['.zig'],\n buildCommand: (filePath) => ['zig', 'build-exe', filePath],\n command: (filePath) => ['./' + filePath.replace(/\\.zig$/, '')],\n grammer: cLikeGrammer,\n },\n\n typescript: {\n fileExtensions: ['.ts', '.cts', '.mts'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n text: {\n fileExtensions: ['.txt'],\n command: (fileName) => ['cat', fileName],\n },\n} as const;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"language.js","names":["fs","path","cLikeGrammer","javaScriptLikeGrammer","languageIdToDefinition","filePath","cwd","publicClassRegex","dirent","data","className","removeCommentsInSourceCode","fileName"],"sources":["../../src/types/language.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { removeCommentsInSourceCode } from '../helpers/removeCommentsInSourceCode.js';\n\nexport interface LanguageDefinition {\n /** File extensions to judge with this config. */\n fileExtensions: readonly string[];\n\n /** Function executed before the build. */\n prebuild?(cwd: string): Promise<void>;\n\n /** Returns the command to build a user program. */\n buildCommand?(filePath: string): [string, ...string[]];\n\n /** Returns the command to run a user program. */\n command(filePath: string): [string, ...string[]];\n\n /** Grammer definition for static analysis. */\n grammer?: {\n strings?: readonly { open: RegExp; close: RegExp; templateSyntax?: 'kotlin' }[];\n comments?: readonly { open: RegExp; close?: RegExp }[];\n };\n}\n\nconst cLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nconst javaScriptLikeGrammer = {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n { open: /`/, close: /(?<!\\\\)(?:\\\\{2})*`/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }],\n} as const satisfies LanguageDefinition['grammer'];\n\nexport const languageIdToDefinition: Readonly<Record<string, Readonly<LanguageDefinition>>> = {\n c: {\n fileExtensions: ['.c'],\n buildCommand: (filePath) => ['gcc', '--std=c17', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n cpp: {\n fileExtensions: ['.cpp'],\n buildCommand: (filePath) => ['g++', '--std=c++20', '-O2', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n csharp: {\n fileExtensions: ['.cs'],\n prebuild: async (cwd) => {\n await fs.promises.writeFile(\n path.join(cwd, 'Main.csproj'),\n `<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <ImplicitUsings>enable</ImplicitUsings>\n <Nullable>enable</Nullable>\n <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n <AssemblyName>Main</AssemblyName>\n </PropertyGroup>\n</Project>`\n );\n },\n buildCommand: () => ['dotnet', 'build', 'Main.csproj', '--configuration', 'Release', '--verbosity', 'quiet'],\n command: () => ['dotnet', 'bin/Release/net8.0/Main.dll'],\n grammer: cLikeGrammer,\n },\n\n css: {\n fileExtensions: ['.css'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }],\n },\n },\n\n dart: {\n fileExtensions: ['.dart'],\n buildCommand: (filePath) => ['dart', 'compile', 'exe', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n java: {\n fileExtensions: ['.java'],\n prebuild: async (cwd) => {\n const publicClassRegex = /\\bpublic\\s+class\\s+(\\w+)\\b/;\n for (const dirent of await fs.promises.readdir(cwd, { withFileTypes: true })) {\n if (!dirent.isFile() || !dirent.name.endsWith('.java')) continue;\n const data = await fs.promises.readFile(path.join(cwd, dirent.name), 'utf8');\n const [, className] = publicClassRegex.exec(removeCommentsInSourceCode(cLikeGrammer, data)) ?? [];\n if (className) await fs.promises.rename(path.join(cwd, dirent.name), path.join(cwd, `${className}.java`));\n }\n },\n buildCommand: (fileName) => ['javac', fileName],\n // For example, Problem 7-3 in WillBooster's Java lecture uses at least 256MB.\n command: (fileName) => ['java', '-Xmx1024m', fileName.replace(/\\.java$/, '')],\n grammer: cLikeGrammer,\n },\n\n kotlin: {\n fileExtensions: ['.kt'],\n buildCommand: (filePath) => ['kotlinc', filePath, '-include-runtime', '-d', 'main.jar'],\n command: () => ['java', '-Xmx1024m', '-jar', 'main.jar'],\n grammer: {\n strings: [\n { open: /\"\"\"/, close: /\"\"\"/, templateSyntax: 'kotlin' },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/, templateSyntax: 'kotlin' },\n ],\n comments: cLikeGrammer.comments,\n },\n },\n\n javascript: {\n fileExtensions: ['.js', '.cjs', '.mjs'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n jsp: {\n fileExtensions: ['.jsp'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*<!--/, close: /-->/ },\n { open: /\\n?[ \\t]*<%--/, close: /--%>/ },\n { open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// },\n { open: /\\n?[ \\t]*\\/\\// },\n ],\n },\n },\n\n haskell: {\n fileExtensions: ['.hs'],\n buildCommand: (filePath) => ['ghc', '-o', 'main', filePath],\n command: () => ['./main'],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\{-/, close: /-\\}/ }, { open: /\\n?[ \\t]*--/ }],\n },\n },\n\n html: {\n fileExtensions: ['.html'],\n command: () => ['echo', ''],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*<!--/, close: /-->/ }],\n },\n },\n\n php: {\n fileExtensions: ['.php'],\n command: (fileName) => ['php', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*\\/\\*/, close: /\\*\\// }, { open: /\\n?[ \\t]*\\/\\// }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n python: {\n fileExtensions: ['.py'],\n command: (fileName) => ['python3', fileName],\n grammer: {\n strings: [\n { open: /'''/, close: /(?<!\\\\)(?:\\\\{2})*'''/ },\n { open: /\"\"\"/, close: /(?<!\\\\)(?:\\\\{2})*\"\"\"/ },\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [\n { open: /\\n?[ \\t]*'''/, close: /'''/ },\n { open: /\\n?[ \\t]*\"\"\"/, close: /\"\"\"/ },\n { open: /\\n?[ \\t]*#/ },\n ],\n },\n },\n\n ruby: {\n fileExtensions: ['.rb'],\n buildCommand: (fileName) => ['ruby', '-c', fileName],\n command: (fileName) => ['ruby', '--jit', fileName],\n grammer: {\n strings: [\n { open: /'/, close: /(?<!\\\\)(?:\\\\{2})*'/ },\n { open: /\"/, close: /(?<!\\\\)(?:\\\\{2})*\"/ },\n ],\n comments: [{ open: /\\n?[ \\t]*=begin/, close: /=end/ }, { open: /\\n?[ \\t]*#/ }],\n },\n },\n\n rust: {\n fileExtensions: ['.rs'],\n buildCommand: (filePath) => ['rustc', filePath, '-o', 'main'],\n command: () => ['./main'],\n grammer: cLikeGrammer,\n },\n\n zig: {\n fileExtensions: ['.zig'],\n buildCommand: (filePath) => ['zig', 'build-exe', filePath],\n command: (filePath) => ['./' + filePath.replace(/\\.zig$/, '')],\n grammer: cLikeGrammer,\n },\n\n typescript: {\n fileExtensions: ['.ts', '.cts', '.mts'],\n command: (fileName) => ['bun', fileName],\n grammer: javaScriptLikeGrammer,\n },\n\n text: {\n fileExtensions: ['.txt'],\n command: (fileName) => ['cat', fileName],\n },\n} as const;\n"],"mappings":"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"}
|
package/dist/types/problem.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";let e=require("zod");const t=e.z.union([e.z.string().min(1),e.z.object({pattern:e.z.string().min(1),message:e.z.string().min(1).refine(e=>!/[\r\n]/.test(e),`message must be a single line`)})]),n=e.z.object({timeLimitMs:e.z.number().int().min(0).optional(),memoryLimitByte:e.z.number().int().min(0).optional(),requiredRegExpsInCode:e.z.array(t).optional(),forbiddenRegExpsInCode:e.z.array(t).optional(),forbiddenTextsInCode:e.z.array(t).optional(),isManualScoringRequired:e.z.boolean().optional(),requiredEnvironmentVariables:e.z.array(e.z.string().min(1)).optional(),requiredOutputFilePaths:e.z.array(e.z.string().min(1)).optional(),requiredSubmissionFilePaths:e.z.array(e.z.string().min(1)).optional()});function r(e){return typeof e==`string`?{pattern:e}:e}exports.codeRuleSchema=t,exports.normalizeCodeRule=r,exports.problemMarkdownFrontMatterSchema=n;
|
|
1
|
+
"use strict";let e=require("zod");const t=e.z.union([e.z.string().min(1),e.z.object({pattern:e.z.string().min(1),message:e.z.string().min(1).refine(e=>!/[\r\n]/.test(e),`message must be a single line`)})]),n=e.z.object({timeLimitMs:e.z.number().int().min(0).optional(),memoryLimitByte:e.z.number().int().min(0).optional(),requiredRegExpsInCode:e.z.array(t).optional(),forbiddenRegExpsInCode:e.z.array(t).optional(),forbiddenTextsInCode:e.z.array(t).optional(),isManualScoringRequired:e.z.boolean().optional(),requiredEnvironmentVariables:e.z.array(e.z.string().min(1)).optional(),requiredOutputFilePaths:e.z.array(e.z.string().min(1)).optional(),requiredSubmissionFilePaths:e.z.array(e.z.string().min(1)).optional(),agentChallenge:e.z.unknown().optional()});function r(e){return typeof e==`string`?{pattern:e}:e}exports.codeRuleSchema=t,exports.normalizeCodeRule=r,exports.problemMarkdownFrontMatterSchema=n;
|
|
2
2
|
//# sourceMappingURL=problem.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"problem.cjs","names":["z","zod","codeRuleSchema","message","problemMarkdownFrontMatterSchema","normalizeCodeRule","rule"],"sources":["../../src/types/problem.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * A static-analysis rule on submitted code: either a bare pattern (its regular expression or text\n * is shown to learners on violation) or a pattern with a learner-facing message that replaces it.\n * The message is rendered as one Markdown list item, so it must be a single line.\n */\nexport const codeRuleSchema = z.union([\n z.string().min(1),\n z.object({\n pattern: z.string().min(1),\n message: z\n .string()\n .min(1)\n .refine((message) => !/[\\r\\n]/.test(message), 'message must be a single line'),\n }),\n]);\n\nexport type CodeRule = z.infer<typeof codeRuleSchema>;\n\nexport const problemMarkdownFrontMatterSchema = z.object({\n timeLimitMs: z.number().int().min(0).optional(),\n memoryLimitByte: z.number().int().min(0).optional(),\n requiredRegExpsInCode: z.array(codeRuleSchema).optional(),\n forbiddenRegExpsInCode: z.array(codeRuleSchema).optional(),\n forbiddenTextsInCode: z.array(codeRuleSchema).optional(),\n isManualScoringRequired: z.boolean().optional(),\n requiredEnvironmentVariables: z.array(z.string().min(1)).optional(),\n requiredOutputFilePaths: z.array(z.string().min(1)).optional(),\n requiredSubmissionFilePaths: z.array(z.string().min(1)).optional(),\n});\n\nexport type ProblemMarkdownFrontMatter = z.infer<typeof problemMarkdownFrontMatterSchema>;\n\nexport function normalizeCodeRule(rule: CodeRule): { pattern: string; message?: string } {\n return typeof rule === 'string' ? { pattern: rule } : rule;\n}\n"],"mappings":"kCAOA,MAAaE,EAAiBF,EAAAA,EAAE,MAAM,CACpCA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAChBA,EAAAA,EAAE,OAAO,CACP,QAASA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EACzB,QAASA,EAAAA,EACN,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,OAAQ,GAAY,CAAC,SAAS,KAAKG,CAAO,EAAG,+BAA+B,CACjF,CAAC,CACH,CAAC,EAIYC,EAAmCJ,EAAAA,EAAE,OAAO,CACvD,YAAaA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC9C,gBAAiBA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAClD,sBAAuBA,EAAAA,EAAE,MAAME,CAAc,CAAC,CAAC,SAAS,EACxD,uBAAwBF,EAAAA,EAAE,MAAME,CAAc,CAAC,CAAC,SAAS,EACzD,qBAAsBF,EAAAA,EAAE,MAAME,CAAc,CAAC,CAAC,SAAS,EACvD,wBAAyBF,EAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS,EAC9C,6BAA8BA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAClE,wBAAyBA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC7D,4BAA6BA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"problem.cjs","names":["z","zod","codeRuleSchema","message","problemMarkdownFrontMatterSchema","normalizeCodeRule","rule"],"sources":["../../src/types/problem.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * A static-analysis rule on submitted code: either a bare pattern (its regular expression or text\n * is shown to learners on violation) or a pattern with a learner-facing message that replaces it.\n * The message is rendered as one Markdown list item, so it must be a single line.\n */\nexport const codeRuleSchema = z.union([\n z.string().min(1),\n z.object({\n pattern: z.string().min(1),\n message: z\n .string()\n .min(1)\n .refine((message) => !/[\\r\\n]/.test(message), 'message must be a single line'),\n }),\n]);\n\nexport type CodeRule = z.infer<typeof codeRuleSchema>;\n\nexport const problemMarkdownFrontMatterSchema = z.object({\n timeLimitMs: z.number().int().min(0).optional(),\n memoryLimitByte: z.number().int().min(0).optional(),\n requiredRegExpsInCode: z.array(codeRuleSchema).optional(),\n forbiddenRegExpsInCode: z.array(codeRuleSchema).optional(),\n forbiddenTextsInCode: z.array(codeRuleSchema).optional(),\n isManualScoringRequired: z.boolean().optional(),\n requiredEnvironmentVariables: z.array(z.string().min(1)).optional(),\n requiredOutputFilePaths: z.array(z.string().min(1)).optional(),\n requiredSubmissionFilePaths: z.array(z.string().min(1)).optional(),\n /** Exercode judges an agent challenge from playground requests, so no harness runs it. */\n agentChallenge: z.unknown().optional(),\n});\n\nexport type ProblemMarkdownFrontMatter = z.infer<typeof problemMarkdownFrontMatterSchema>;\n\nexport function normalizeCodeRule(rule: CodeRule): { pattern: string; message?: string } {\n return typeof rule === 'string' ? { pattern: rule } : rule;\n}\n"],"mappings":"A,kCAOA,MAAaE,EAAiBF,EAAAA,EAAE,MAAM,CACpCA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAChBA,EAAAA,EAAE,OAAO,CACP,QAASA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EACzB,QAASA,EAAAA,EACN,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,OAAQ,GAAY,CAAC,SAAS,KAAKG,CAAO,EAAG,+BAA+B,CACjF,CAAC,CACH,CAAC,EAIYC,EAAmCJ,EAAAA,EAAE,OAAO,CACvD,YAAaA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC9C,gBAAiBA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAClD,sBAAuBA,EAAAA,EAAE,MAAME,CAAc,CAAC,CAAC,SAAS,EACxD,uBAAwBF,EAAAA,EAAE,MAAME,CAAc,CAAC,CAAC,SAAS,EACzD,qBAAsBF,EAAAA,EAAE,MAAME,CAAc,CAAC,CAAC,SAAS,EACvD,wBAAyBF,EAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS,EAC9C,6BAA8BA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAClE,wBAAyBA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC7D,4BAA6BA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAEjE,eAAgBA,EAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS,CACvC,CAAC,EAID,SAAgBK,EAAkB,EAAuD,CACvF,OAAO,OAAOC,GAAS,SAAW,CAAE,QAASA,CAAK,EAAIA,CACxD,C"}
|
package/dist/types/problem.d.ts
CHANGED
|
@@ -28,6 +28,7 @@ export declare const problemMarkdownFrontMatterSchema: z.ZodObject<{
|
|
|
28
28
|
requiredEnvironmentVariables: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
29
29
|
requiredOutputFilePaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
30
30
|
requiredSubmissionFilePaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
31
|
+
agentChallenge: z.ZodOptional<z.ZodUnknown>;
|
|
31
32
|
}, z.core.$strip>;
|
|
32
33
|
export type ProblemMarkdownFrontMatter = z.infer<typeof problemMarkdownFrontMatterSchema>;
|
|
33
34
|
export declare function normalizeCodeRule(rule: CodeRule): {
|
package/dist/types/problem.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{z as e}from"zod";const t=e.union([e.string().min(1),e.object({pattern:e.string().min(1),message:e.string().min(1).refine(e=>!/[\r\n]/.test(e),`message must be a single line`)})]),n=e.object({timeLimitMs:e.number().int().min(0).optional(),memoryLimitByte:e.number().int().min(0).optional(),requiredRegExpsInCode:e.array(t).optional(),forbiddenRegExpsInCode:e.array(t).optional(),forbiddenTextsInCode:e.array(t).optional(),isManualScoringRequired:e.boolean().optional(),requiredEnvironmentVariables:e.array(e.string().min(1)).optional(),requiredOutputFilePaths:e.array(e.string().min(1)).optional(),requiredSubmissionFilePaths:e.array(e.string().min(1)).optional()});function r(e){return typeof e==`string`?{pattern:e}:e}export{t as codeRuleSchema,r as normalizeCodeRule,n as problemMarkdownFrontMatterSchema};
|
|
1
|
+
import{z as e}from"zod";const t=e.union([e.string().min(1),e.object({pattern:e.string().min(1),message:e.string().min(1).refine(e=>!/[\r\n]/.test(e),`message must be a single line`)})]),n=e.object({timeLimitMs:e.number().int().min(0).optional(),memoryLimitByte:e.number().int().min(0).optional(),requiredRegExpsInCode:e.array(t).optional(),forbiddenRegExpsInCode:e.array(t).optional(),forbiddenTextsInCode:e.array(t).optional(),isManualScoringRequired:e.boolean().optional(),requiredEnvironmentVariables:e.array(e.string().min(1)).optional(),requiredOutputFilePaths:e.array(e.string().min(1)).optional(),requiredSubmissionFilePaths:e.array(e.string().min(1)).optional(),agentChallenge:e.unknown().optional()});function r(e){return typeof e==`string`?{pattern:e}:e}export{t as codeRuleSchema,r as normalizeCodeRule,n as problemMarkdownFrontMatterSchema};
|
|
2
2
|
//# sourceMappingURL=problem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"problem.js","names":["codeRuleSchema","z","message","problemMarkdownFrontMatterSchema","normalizeCodeRule","rule"],"sources":["../../src/types/problem.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * A static-analysis rule on submitted code: either a bare pattern (its regular expression or text\n * is shown to learners on violation) or a pattern with a learner-facing message that replaces it.\n * The message is rendered as one Markdown list item, so it must be a single line.\n */\nexport const codeRuleSchema = z.union([\n z.string().min(1),\n z.object({\n pattern: z.string().min(1),\n message: z\n .string()\n .min(1)\n .refine((message) => !/[\\r\\n]/.test(message), 'message must be a single line'),\n }),\n]);\n\nexport type CodeRule = z.infer<typeof codeRuleSchema>;\n\nexport const problemMarkdownFrontMatterSchema = z.object({\n timeLimitMs: z.number().int().min(0).optional(),\n memoryLimitByte: z.number().int().min(0).optional(),\n requiredRegExpsInCode: z.array(codeRuleSchema).optional(),\n forbiddenRegExpsInCode: z.array(codeRuleSchema).optional(),\n forbiddenTextsInCode: z.array(codeRuleSchema).optional(),\n isManualScoringRequired: z.boolean().optional(),\n requiredEnvironmentVariables: z.array(z.string().min(1)).optional(),\n requiredOutputFilePaths: z.array(z.string().min(1)).optional(),\n requiredSubmissionFilePaths: z.array(z.string().min(1)).optional(),\n});\n\nexport type ProblemMarkdownFrontMatter = z.infer<typeof problemMarkdownFrontMatterSchema>;\n\nexport function normalizeCodeRule(rule: CodeRule): { pattern: string; message?: string } {\n return typeof rule === 'string' ? { pattern: rule } : rule;\n}\n"],"mappings":"wBAOA,MAAaA,EAAiBC,EAAE,MAAM,CACpCA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAChBA,EAAE,OAAO,CACP,QAASA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EACzB,QAASA,EACN,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,OAAQ,GAAY,CAAC,SAAS,KAAKC,CAAO,EAAG,+BAA+B,CACjF,CAAC,CACH,CAAC,EAIYC,EAAmCF,EAAE,OAAO,CACvD,YAAaA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC9C,gBAAiBA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAClD,sBAAuBA,EAAE,MAAMD,CAAc,CAAC,CAAC,SAAS,EACxD,uBAAwBC,EAAE,MAAMD,CAAc,CAAC,CAAC,SAAS,EACzD,qBAAsBC,EAAE,MAAMD,CAAc,CAAC,CAAC,SAAS,EACvD,wBAAyBC,EAAE,QAAQ,CAAC,CAAC,SAAS,EAC9C,6BAA8BA,EAAE,MAAMA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAClE,wBAAyBA,EAAE,MAAMA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC7D,4BAA6BA,EAAE,MAAMA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"problem.js","names":["codeRuleSchema","z","message","problemMarkdownFrontMatterSchema","normalizeCodeRule","rule"],"sources":["../../src/types/problem.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * A static-analysis rule on submitted code: either a bare pattern (its regular expression or text\n * is shown to learners on violation) or a pattern with a learner-facing message that replaces it.\n * The message is rendered as one Markdown list item, so it must be a single line.\n */\nexport const codeRuleSchema = z.union([\n z.string().min(1),\n z.object({\n pattern: z.string().min(1),\n message: z\n .string()\n .min(1)\n .refine((message) => !/[\\r\\n]/.test(message), 'message must be a single line'),\n }),\n]);\n\nexport type CodeRule = z.infer<typeof codeRuleSchema>;\n\nexport const problemMarkdownFrontMatterSchema = z.object({\n timeLimitMs: z.number().int().min(0).optional(),\n memoryLimitByte: z.number().int().min(0).optional(),\n requiredRegExpsInCode: z.array(codeRuleSchema).optional(),\n forbiddenRegExpsInCode: z.array(codeRuleSchema).optional(),\n forbiddenTextsInCode: z.array(codeRuleSchema).optional(),\n isManualScoringRequired: z.boolean().optional(),\n requiredEnvironmentVariables: z.array(z.string().min(1)).optional(),\n requiredOutputFilePaths: z.array(z.string().min(1)).optional(),\n requiredSubmissionFilePaths: z.array(z.string().min(1)).optional(),\n /** Exercode judges an agent challenge from playground requests, so no harness runs it. */\n agentChallenge: z.unknown().optional(),\n});\n\nexport type ProblemMarkdownFrontMatter = z.infer<typeof problemMarkdownFrontMatterSchema>;\n\nexport function normalizeCodeRule(rule: CodeRule): { pattern: string; message?: string } {\n return typeof rule === 'string' ? { pattern: rule } : rule;\n}\n"],"mappings":"A,wBAOA,MAAaA,EAAiBC,EAAE,MAAM,CACpCA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAChBA,EAAE,OAAO,CACP,QAASA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EACzB,QAASA,EACN,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,OAAQ,GAAY,CAAC,SAAS,KAAKC,CAAO,EAAG,+BAA+B,CACjF,CAAC,CACH,CAAC,EAIYC,EAAmCF,EAAE,OAAO,CACvD,YAAaA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC9C,gBAAiBA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAClD,sBAAuBA,EAAE,MAAMD,CAAc,CAAC,CAAC,SAAS,EACxD,uBAAwBC,EAAE,MAAMD,CAAc,CAAC,CAAC,SAAS,EACzD,qBAAsBC,EAAE,MAAMD,CAAc,CAAC,CAAC,SAAS,EACvD,wBAAyBC,EAAE,QAAQ,CAAC,CAAC,SAAS,EAC9C,6BAA8BA,EAAE,MAAMA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAClE,wBAAyBA,EAAE,MAAMA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC7D,4BAA6BA,EAAE,MAAMA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAEjE,eAAgBA,EAAE,QAAQ,CAAC,CAAC,SAAS,CACvC,CAAC,EAID,SAAgBG,EAAkB,EAAuD,CACvF,OAAO,OAAOC,GAAS,SAAW,CAAE,QAASA,CAAK,EAAIA,CACxD,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testCaseResult.cjs","names":["z","zod","testCaseResultOutputFileSchema","testCaseResultSchema"],"sources":["../../src/types/testCaseResult.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TEST_CASE_RESULT_PREFIX = 'TEST_CASE_RESULT ';\n\nconst testCaseResultOutputFileSchema = z.object({\n path: z.string(),\n data: z.string(),\n encoding: z.literal('base64').optional(),\n});\n\nexport const testCaseResultSchema = z.object({\n testCaseId: z.string(),\n decisionCode: z.number().int(),\n exitStatus: z.number().int().optional(),\n stdin: z.string().optional(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n /** Wall time of the run; time limits are judged by it. */\n timeSeconds: z.number().optional(),\n /**\n * User plus system CPU time of the run, summed over its threads and the processes it waited for.\n * A time limit exceeded whose CPU time reaches the limit would be exceeded on any single CPU,\n * while one whose CPU time stays below it may stem from waiting for a CPU shared with other\n * programs.\n */\n cpuTimeSeconds: z.number().optional(),\n memoryBytes: z.number().optional(),\n feedbackMarkdown: z.string().optional(),\n /** Numeric score of a model-evaluation submission (e.g. an RMSLE value). */\n score: z.number().optional(),\n /** Label of `score` shown to learners (e.g. `RMSLE`). */\n scoreLabel: z.string().optional(),\n outputFiles: z.array(testCaseResultOutputFileSchema).optional(),\n});\n\nexport type TestCaseResult = z.infer<typeof testCaseResultSchema>;\n"],"mappings":"kCAEA,MAEME,EAAiCF,EAAAA,EAAE,OAAO,CAC9C,KAAMA,EAAAA,EAAE,OAAO,EACf,KAAMA,EAAAA,EAAE,OAAO,EACf,SAAUA,EAAAA,EAAE,QAAQ,QAAQ,CAAC,CAAC,SAAS,CACzC,CAAC,EAEYG,EAAuBH,EAAAA,EAAE,OAAO,CAC3C,WAAYA,EAAAA,EAAE,OAAO,EACrB,aAAcA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,EAC7B,WAAYA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EACtC,MAAOA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC3B,OAAQA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC5B,OAAQA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAE5B,YAAaA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAOjC,eAAgBA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EACpC,YAAaA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EACjC,iBAAkBA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAEtC,MAAOA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAE3B,WAAYA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAChC,YAAaA,EAAAA,EAAE,MAAME,CAA8B,CAAC,CAAC,SAAS,CAChE,CAAC"}
|
|
1
|
+
{"version":3,"file":"testCaseResult.cjs","names":["z","zod","testCaseResultOutputFileSchema","testCaseResultSchema"],"sources":["../../src/types/testCaseResult.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TEST_CASE_RESULT_PREFIX = 'TEST_CASE_RESULT ';\n\nconst testCaseResultOutputFileSchema = z.object({\n path: z.string(),\n data: z.string(),\n encoding: z.literal('base64').optional(),\n});\n\nexport const testCaseResultSchema = z.object({\n testCaseId: z.string(),\n decisionCode: z.number().int(),\n exitStatus: z.number().int().optional(),\n stdin: z.string().optional(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n /** Wall time of the run; time limits are judged by it. */\n timeSeconds: z.number().optional(),\n /**\n * User plus system CPU time of the run, summed over its threads and the processes it waited for.\n * A time limit exceeded whose CPU time reaches the limit would be exceeded on any single CPU,\n * while one whose CPU time stays below it may stem from waiting for a CPU shared with other\n * programs.\n */\n cpuTimeSeconds: z.number().optional(),\n memoryBytes: z.number().optional(),\n feedbackMarkdown: z.string().optional(),\n /** Numeric score of a model-evaluation submission (e.g. an RMSLE value). */\n score: z.number().optional(),\n /** Label of `score` shown to learners (e.g. `RMSLE`). */\n scoreLabel: z.string().optional(),\n outputFiles: z.array(testCaseResultOutputFileSchema).optional(),\n});\n\nexport type TestCaseResult = z.infer<typeof testCaseResultSchema>;\n"],"mappings":"A,kCAEA,MAEME,EAAiCF,EAAAA,EAAE,OAAO,CAC9C,KAAMA,EAAAA,EAAE,OAAO,EACf,KAAMA,EAAAA,EAAE,OAAO,EACf,SAAUA,EAAAA,EAAE,QAAQ,QAAQ,CAAC,CAAC,SAAS,CACzC,CAAC,EAEYG,EAAuBH,EAAAA,EAAE,OAAO,CAC3C,WAAYA,EAAAA,EAAE,OAAO,EACrB,aAAcA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,EAC7B,WAAYA,EAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EACtC,MAAOA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC3B,OAAQA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC5B,OAAQA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAE5B,YAAaA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAOjC,eAAgBA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EACpC,YAAaA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EACjC,iBAAkBA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAEtC,MAAOA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAE3B,WAAYA,EAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAChC,YAAaA,EAAAA,EAAE,MAAME,CAA8B,CAAC,CAAC,SAAS,CAChE,CAAC,E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testCaseResult.js","names":["TEST_CASE_RESULT_PREFIX","testCaseResultOutputFileSchema","z","testCaseResultSchema"],"sources":["../../src/types/testCaseResult.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TEST_CASE_RESULT_PREFIX = 'TEST_CASE_RESULT ';\n\nconst testCaseResultOutputFileSchema = z.object({\n path: z.string(),\n data: z.string(),\n encoding: z.literal('base64').optional(),\n});\n\nexport const testCaseResultSchema = z.object({\n testCaseId: z.string(),\n decisionCode: z.number().int(),\n exitStatus: z.number().int().optional(),\n stdin: z.string().optional(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n /** Wall time of the run; time limits are judged by it. */\n timeSeconds: z.number().optional(),\n /**\n * User plus system CPU time of the run, summed over its threads and the processes it waited for.\n * A time limit exceeded whose CPU time reaches the limit would be exceeded on any single CPU,\n * while one whose CPU time stays below it may stem from waiting for a CPU shared with other\n * programs.\n */\n cpuTimeSeconds: z.number().optional(),\n memoryBytes: z.number().optional(),\n feedbackMarkdown: z.string().optional(),\n /** Numeric score of a model-evaluation submission (e.g. an RMSLE value). */\n score: z.number().optional(),\n /** Label of `score` shown to learners (e.g. `RMSLE`). */\n scoreLabel: z.string().optional(),\n outputFiles: z.array(testCaseResultOutputFileSchema).optional(),\n});\n\nexport type TestCaseResult = z.infer<typeof testCaseResultSchema>;\n"],"mappings":"wBAEA,MAAaA,EAA0B,oBAEjCC,EAAiCC,EAAE,OAAO,CAC9C,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,OAAO,EACf,SAAUA,EAAE,QAAQ,QAAQ,CAAC,CAAC,SAAS,CACzC,CAAC,EAEYC,EAAuBD,EAAE,OAAO,CAC3C,WAAYA,EAAE,OAAO,EACrB,aAAcA,EAAE,OAAO,CAAC,CAAC,IAAI,EAC7B,WAAYA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EACtC,MAAOA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC3B,OAAQA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC5B,OAAQA,EAAE,OAAO,CAAC,CAAC,SAAS,EAE5B,YAAaA,EAAE,OAAO,CAAC,CAAC,SAAS,EAOjC,eAAgBA,EAAE,OAAO,CAAC,CAAC,SAAS,EACpC,YAAaA,EAAE,OAAO,CAAC,CAAC,SAAS,EACjC,iBAAkBA,EAAE,OAAO,CAAC,CAAC,SAAS,EAEtC,MAAOA,EAAE,OAAO,CAAC,CAAC,SAAS,EAE3B,WAAYA,EAAE,OAAO,CAAC,CAAC,SAAS,EAChC,YAAaA,EAAE,MAAMD,CAA8B,CAAC,CAAC,SAAS,CAChE,CAAC"}
|
|
1
|
+
{"version":3,"file":"testCaseResult.js","names":["TEST_CASE_RESULT_PREFIX","testCaseResultOutputFileSchema","z","testCaseResultSchema"],"sources":["../../src/types/testCaseResult.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TEST_CASE_RESULT_PREFIX = 'TEST_CASE_RESULT ';\n\nconst testCaseResultOutputFileSchema = z.object({\n path: z.string(),\n data: z.string(),\n encoding: z.literal('base64').optional(),\n});\n\nexport const testCaseResultSchema = z.object({\n testCaseId: z.string(),\n decisionCode: z.number().int(),\n exitStatus: z.number().int().optional(),\n stdin: z.string().optional(),\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n /** Wall time of the run; time limits are judged by it. */\n timeSeconds: z.number().optional(),\n /**\n * User plus system CPU time of the run, summed over its threads and the processes it waited for.\n * A time limit exceeded whose CPU time reaches the limit would be exceeded on any single CPU,\n * while one whose CPU time stays below it may stem from waiting for a CPU shared with other\n * programs.\n */\n cpuTimeSeconds: z.number().optional(),\n memoryBytes: z.number().optional(),\n feedbackMarkdown: z.string().optional(),\n /** Numeric score of a model-evaluation submission (e.g. an RMSLE value). */\n score: z.number().optional(),\n /** Label of `score` shown to learners (e.g. `RMSLE`). */\n scoreLabel: z.string().optional(),\n outputFiles: z.array(testCaseResultOutputFileSchema).optional(),\n});\n\nexport type TestCaseResult = z.infer<typeof testCaseResultSchema>;\n"],"mappings":"A,wBAEA,MAAaA,EAA0B,oBAEjCC,EAAiCC,EAAE,OAAO,CAC9C,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,OAAO,EACf,SAAUA,EAAE,QAAQ,QAAQ,CAAC,CAAC,SAAS,CACzC,CAAC,EAEYC,EAAuBD,EAAE,OAAO,CAC3C,WAAYA,EAAE,OAAO,EACrB,aAAcA,EAAE,OAAO,CAAC,CAAC,IAAI,EAC7B,WAAYA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EACtC,MAAOA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC3B,OAAQA,EAAE,OAAO,CAAC,CAAC,SAAS,EAC5B,OAAQA,EAAE,OAAO,CAAC,CAAC,SAAS,EAE5B,YAAaA,EAAE,OAAO,CAAC,CAAC,SAAS,EAOjC,eAAgBA,EAAE,OAAO,CAAC,CAAC,SAAS,EACpC,YAAaA,EAAE,OAAO,CAAC,CAAC,SAAS,EACjC,iBAAkBA,EAAE,OAAO,CAAC,CAAC,SAAS,EAEtC,MAAOA,EAAE,OAAO,CAAC,CAAC,SAAS,EAE3B,WAAYA,EAAE,OAAO,CAAC,CAAC,SAAS,EAChC,YAAaA,EAAE,MAAMD,CAA8B,CAAC,CAAC,SAAS,CAChE,CAAC,E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exercode/problem-utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": ":100: A set of utilities for judging programs on Exercode (https://exercode.willbooster.com/).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"exercode",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"@types/bun": "1.4.3",
|
|
64
64
|
"@willbooster/oxlint-config": "1.4.9",
|
|
65
65
|
"@willbooster/wb": "22.29.3",
|
|
66
|
-
"build-ts": "21.0.
|
|
66
|
+
"build-ts": "21.0.29",
|
|
67
67
|
"oxlint": "1.88.0",
|
|
68
68
|
"oxlint-tsgolint": "7.0.2004",
|
|
69
69
|
"undici-types": "8.12.2"
|