@exercode/problem-utils 1.11.4 → 1.13.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.
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs");exports.removeCommentsInSourceCode=function(n,t){var r;if(null==(r=n.comments)||!r.length)return t;for(var l=[],o=0;o<t.length;){for(var s=void 0,a=0,i=[].concat(e.toConsumableArray(n.comments.map(function(n){return e.objectSpread2({isComment:!0},n)})),e.toConsumableArray(null!=(m=null==(c=n.strings)?void 0:c.map(function(n){return e.objectSpread2({isComment:!1},n)}))?m:[]));a<i.length;a++){var m,c,u=i[a],g=new RegExp(u.open,"g");g.lastIndex=o;var h=g.exec(t);h&&(!s||h.index<s.match.index)&&(s={match:h,closeRegExp:u.close,isComment:u.isComment})}if(s){var p;l.push(t.slice(o,s.match.index));var x=new RegExp(null!=(p=s.closeRegExp)?p:/(?=\n)/g,"g");x.lastIndex=s.match.index+s.match[0].length;var d=x.exec(t);o=d?d.index+d[0].length:t.length,s.isComment||l.push(t.slice(s.match.index,o))}else l.push(t.slice(o)),o=t.length}return l.join("")};
1
+ "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs");function n(n,i,a,u){var c,f;if(void 0===u&&(u=function(n){var r,l,i,s;return[].concat(e.toConsumableArray(null!=(r=null==(l=n.comments)?void 0:l.map(function(e){var n;return{closeRegExp:t(null!=(n=e.close)?n:/(?=\n)/g),isComment:!0,openRegExp:t(e.open)}}))?r:[]),e.toConsumableArray(null!=(i=null==(s=n.strings)?void 0:s.map(function(e){return{closeRegExp:t(e.close),isComment:!1,openRegExp:t(e.open)}}))?i:[]))}(n)),!(null!=(c=n.comments)&&c.length||a.removeStrings&&null!=(f=n.strings)&&f.length))return i;for(var g=[],m=0;m<i.length;){var h,v=void 0,x=e.createForOfIteratorHelper(u);try{for(x.s();!(h=x.n()).done;){var d=h.value,p=d.openRegExp;p.lastIndex=m;var S=p.exec(i);S&&r(S,d,v,a)&&(v={grammar:d,match:S})}}catch(e){x.e(e)}finally{x.f()}if(v){var E=v.match.index;if(!v.grammar.isComment&&a.removeStrings&&(E=s(i,v.match.index)),g.push(i.slice(m,E)),v.grammar.isComment){var R=v.grammar.closeRegExp;R.lastIndex=v.match.index+v.match[0].length;var C=R.exec(i);m=C?C.index+C[0].length:i.length}else{m=l(i,v.match.index,v.grammar);var I=i.slice(v.match.index,m);a.removeStrings?g.push(o(n,u,i,v.match.index,I)):g.push(I)}}else g.push(i.slice(m)),m=i.length}return g.join("")}function r(e,n,r,t){return!r||(e.index<r.match.index||!(e.index>r.match.index)&&(t.removeStrings&&r.grammar.isComment&&!n.isComment))}function t(e){return new RegExp(e,e.flags.includes("g")?e.flags:"".concat(e.flags,"g"))}function l(e,n,r){if("`"===e[n])return function(e,n){var r=n+1;for(;r<e.length;)if("\\"!==e[r]){if("`"===e[r])return r+1;"$"!==e[r]||"{"!==e[r+1]?r+=1:r=c(e,r+2,"}",{slashStartsRegExp:!0}).endIndex+1}else r+=2;return e.length}(e,n);if(u(e,n))return function(e,n){var r=i(e,n),t=n+r.length;for(;t<e.length;){if(e.startsWith(r,t))return t+r.length;"{"!==e[t]||"{"!==e[t+1]?"{"!==e[t]?t+="\\"===e[t]?2:1:t=c(e,t+1,"}",{slashStartsRegExp:!1}).endIndex+1:t+=2}return e.length}(e,n);var t=r.closeRegExp;t.lastIndex=n+1;var l=t.exec(e);return l?l.index+l[0].length:e.length}function i(e,n){var r,t=e.slice(n,n+3);return"'''"===t||'"""'===t?t:null!=(r=e[n])?r:""}function s(e,n){var r=a(e,n);return r?n-r.length:n}function a(e,n){var r;if('"'===e[n]||"'"===e[n]){for(var t=n-1;t>=0&&/[A-Za-z]/.test(null!=(l=e[t])?l:"");){var l;t-=1}var i=e.slice(t+1,n);if(i&&/^[bfru]+$/i.test(i)&&!(t>=0&&/[\dA-Za-z_]/.test(null!=(r=e[t])?r:"")))return i}}function o(e,r,t,l,s){return s.startsWith("`")?function(e,r,t){var l=[],i=1;for(;i<t.length-1;)if("\\"!==t[i])if("$"!==t[i]||"{"!==t[i+1])i+=1;else{var s=c(t,i+2,"}",{slashStartsRegExp:!0});l.push(n(e,s.content,{removeStrings:!0},r)),i=s.endIndex+1}else i+=2;return l.join("\n")}(e,r,s):u(t,l)?function(e,r,t){var l=i(t,0).length,s=[],a=l;for(;a<t.length-l;)if("{"!==t[a]||"{"!==t[a+1])if("{"!==t[a])a+="\\"===t[a]?2:1;else{var o=c(t,a+1,"}",{slashStartsRegExp:!1});s.push(n(e,o.content,{removeStrings:!0},r)),a=o.endIndex+1}else a+=2;return s.join("\n")}(e,r,s):""}function u(e,n){var r,t;return null!=(r=null==(t=a(e,n))?void 0:t.toLowerCase().includes("f"))&&r}function c(e,n,r,t){for(var l=1,i=n;i<e.length;){var s=e[i];if('"'!==s&&"'"!==s&&"`"!==s)if(t.slashStartsRegExp&&"/"===e[i]&&"/"===e[i+1])i=m(e,i);else if(t.slashStartsRegExp&&"/"===e[i]&&"*"===e[i+1])i=h(e,i);else if(t.slashStartsRegExp&&"/"===s)i=g(e,i);else{if("{"===s&&(l+=1),s===r&&0===(l-=1))return{content:e.slice(n,i),endIndex:i};i+=1}else i=f(e,i)}return{content:e.slice(n),endIndex:e.length}}function f(e,n){for(var r=i(e,n),t=n+r.length;t<e.length;)if("\\"!==e[t]){if(e.startsWith(r,t))return t+r.length;t+=1}else t+=2;return t}function g(e,n){for(var r=n+1,t=!1;r<e.length;)if("\\"!==e[r]){if("["===e[r]&&(t=!0),"]"===e[r]&&(t=!1),"/"===e[r]&&!t){for(r+=1;/[A-Za-z]/.test(null!=(l=e[r])?l:"");){var l;r+=1}return r}if("\n"===e[r])return n+1;r+=1}else r+=2;return n+1}function m(e,n){var r=e.indexOf("\n",n+2);return-1===r?e.length:r}function h(e,n){var r=e.indexOf("*/",n+2);return-1===r?e.length:r+2}exports.removeCommentsAndStringsInSourceCode=function(e,r){return n(e,r,{removeStrings:!0})},exports.removeCommentsInSourceCode=function(e,r){return n(e,r,{removeStrings:!1})};
2
2
  //# sourceMappingURL=removeCommentsInSourceCode.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"removeCommentsInSourceCode.cjs","sources":["../../src/helpers/removeCommentsInSourceCode.ts"],"sourcesContent":["import type { LanguageDefinition } from '../types/language.js';\n\nexport function removeCommentsInSourceCode(\n grammer: NonNullable<LanguageDefinition['grammer']>,\n sourceCode: string\n): string {\n if (!grammer.comments?.length) return sourceCode;\n\n const newSourceCodeSlices: string[] = [];\n\n let lastIndex = 0;\n\n while (lastIndex < sourceCode.length) {\n let first: { match: RegExpExecArray; closeRegExp: RegExp | undefined; isComment: boolean } | undefined;\n\n for (const commentOrStringGrammer of [\n ...grammer.comments.map((v) => ({ isComment: true, ...v })),\n ...(grammer.strings?.map((v) => ({ isComment: false, ...v })) ?? []),\n ]) {\n const startRegExp = new RegExp(commentOrStringGrammer.open, 'g');\n startRegExp.lastIndex = lastIndex;\n\n const match = startRegExp.exec(sourceCode);\n\n if (match && (!first || match.index < first.match.index)) {\n first = { match, closeRegExp: commentOrStringGrammer.close, isComment: commentOrStringGrammer.isComment };\n }\n }\n\n if (first) {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex, first.match.index));\n\n const closeRegExp = new RegExp(first.closeRegExp ?? /(?=\\n)/g, 'g');\n closeRegExp.lastIndex = first.match.index + first.match[0].length;\n\n const match = closeRegExp.exec(sourceCode);\n\n lastIndex = match ? match.index + match[0].length : sourceCode.length;\n if (!first.isComment) newSourceCodeSlices.push(sourceCode.slice(first.match.index, lastIndex));\n } else {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex));\n lastIndex = sourceCode.length;\n }\n }\n\n return newSourceCodeSlices.join('');\n}\n"],"names":["grammer","sourceCode","_grammer$comments","comments","length","newSourceCodeSlices","lastIndex","first","_i","_arr","concat","_toConsumableArray","map","v","_objectSpread","isComment","_grammer$strings$map","_grammer$strings","strings","commentOrStringGrammer","startRegExp","RegExp","open","match","exec","index","closeRegExp","close","_first$closeRegExp","push","slice","join"],"mappings":"2GAEO,SACLA,EACAC,GACQ,IAAAC,EACR,GAAqB,OAAjBA,EAACF,EAAQG,YAARD,EAAkBE,OAAQ,OAAOH,EAMtC,IAJA,IAAMI,EAAgC,GAElCC,EAAY,EAETA,EAAYL,EAAWG,QAAQ,CAGpC,IAFA,IAAIG,OAAkG,EAEtGC,EAAA,EAAAC,EAAA,GAAAC,OAAAC,EAAAA,kBACKX,EAAQG,SAASS,IAAI,SAACC,GAAC,OAAAC,gBAAA,CAAQC,WAAW,GAASF,EAAC,IAAIF,EAAAA,kBACE,OADFK,EACxC,OADwCC,EACvDjB,EAAQkB,cAAO,EAAfD,EAAiBL,IAAI,SAACC,GAAC,OAAAC,gBAAA,CAAQC,WAAW,GAAUF,EAAC,IAAIG,EAAI,KAAER,EAAAC,EAAAL,OAAAI,IAClE,CAAA,IAAAQ,EAAAC,EAHQE,EAAsBV,EAAAD,GAIzBY,EAAc,IAAIC,OAAOF,EAAuBG,KAAM,KAC5DF,EAAYd,UAAYA,EAExB,IAAMiB,EAAQH,EAAYI,KAAKvB,GAE3BsB,KAAWhB,GAASgB,EAAME,MAAQlB,EAAMgB,MAAME,SAChDlB,EAAQ,CAAEgB,MAAAA,EAAOG,YAAaP,EAAuBQ,MAAOZ,UAAWI,EAAuBJ,WAElG,CAEA,GAAIR,EAAO,CAAA,IAAAqB,EACTvB,EAAoBwB,KAAK5B,EAAW6B,MAAMxB,EAAWC,EAAMgB,MAAME,QAEjE,IAAMC,EAAc,IAAIL,cAAMO,EAACrB,EAAMmB,aAAWE,EAAI,UAAW,KAC/DF,EAAYpB,UAAYC,EAAMgB,MAAME,MAAQlB,EAAMgB,MAAM,GAAGnB,OAE3D,IAAMmB,EAAQG,EAAYF,KAAKvB,GAE/BK,EAAYiB,EAAQA,EAAME,MAAQF,EAAM,GAAGnB,OAASH,EAAWG,OAC1DG,EAAMQ,WAAWV,EAAoBwB,KAAK5B,EAAW6B,MAAMvB,EAAMgB,MAAME,MAAOnB,GACrF,MACED,EAAoBwB,KAAK5B,EAAW6B,MAAMxB,IAC1CA,EAAYL,EAAWG,MAE3B,CAEA,OAAOC,EAAoB0B,KAAK,GAClC"}
1
+ {"version":3,"file":"removeCommentsInSourceCode.cjs","sources":["../../src/helpers/removeCommentsInSourceCode.ts"],"sourcesContent":["import type { LanguageDefinition } from '../types/language.js';\n\nexport type SourceCodeGrammar = NonNullable<LanguageDefinition['grammer']>;\n\n/** Removes comments from source code according to the provided language grammar. */\nexport function removeCommentsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: false });\n}\n\n/** Removes comments and string literal contents while preserving executable interpolation expressions. */\nexport function removeCommentsAndStringsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: true });\n}\n\ninterface CommentOrStringGrammar {\n closeRegExp: RegExp;\n isComment: boolean;\n openRegExp: RegExp;\n}\n\nfunction removeCommentsAndMaybeStringsInSourceCode(\n grammar: SourceCodeGrammar,\n sourceCode: string,\n options: { removeStrings: boolean },\n commentOrStringGrammars = compileCommentOrStringGrammars(grammar)\n): string {\n if (!grammar.comments?.length && (!options.removeStrings || !grammar.strings?.length)) return sourceCode;\n\n const newSourceCodeSlices: string[] = [];\n\n let lastIndex = 0;\n\n while (lastIndex < sourceCode.length) {\n let first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined;\n\n for (const commentOrStringGrammer of commentOrStringGrammars) {\n const startRegExp = commentOrStringGrammer.openRegExp;\n startRegExp.lastIndex = lastIndex;\n\n const match = startRegExp.exec(sourceCode);\n\n if (match && shouldPreferMatch(match, commentOrStringGrammer, first, options)) {\n first = { grammar: commentOrStringGrammer, match };\n }\n }\n\n if (first) {\n let stringPrefixStartIndex = first.match.index;\n if (!first.grammar.isComment && options.removeStrings) {\n stringPrefixStartIndex = getPythonStringPrefixStartIndex(sourceCode, first.match.index);\n }\n newSourceCodeSlices.push(sourceCode.slice(lastIndex, stringPrefixStartIndex));\n\n if (!first.grammar.isComment) {\n lastIndex = findStringEndIndex(sourceCode, first.match.index, first.grammar);\n const stringLiteral = sourceCode.slice(first.match.index, lastIndex);\n if (options.removeStrings) {\n newSourceCodeSlices.push(\n preserveStringInterpolationExpressions(\n grammar,\n commentOrStringGrammars,\n sourceCode,\n first.match.index,\n stringLiteral\n )\n );\n } else {\n newSourceCodeSlices.push(stringLiteral);\n }\n } else {\n const closeRegExp = first.grammar.closeRegExp;\n closeRegExp.lastIndex = first.match.index + first.match[0].length;\n\n const match = closeRegExp.exec(sourceCode);\n\n lastIndex = match ? match.index + match[0].length : sourceCode.length;\n }\n } else {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex));\n lastIndex = sourceCode.length;\n }\n }\n\n return newSourceCodeSlices.join('');\n}\n\nfunction compileCommentOrStringGrammars(grammar: SourceCodeGrammar): readonly CommentOrStringGrammar[] {\n return [\n ...(grammar.comments?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close ?? /(?=\\n)/g),\n isComment: true,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ...(grammar.strings?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close),\n isComment: false,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ] satisfies CommentOrStringGrammar[];\n}\n\nfunction shouldPreferMatch(\n match: RegExpExecArray,\n grammar: CommentOrStringGrammar,\n first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined,\n options: { removeStrings: boolean }\n): boolean {\n if (!first) return true;\n if (match.index < first.match.index) return true;\n if (match.index > first.match.index) return false;\n return options.removeStrings && first.grammar.isComment && !grammar.isComment;\n}\n\nfunction makeGlobalRegExp(regExp: RegExp): RegExp {\n return new RegExp(regExp, regExp.flags.includes('g') ? regExp.flags : `${regExp.flags}g`);\n}\n\nfunction findStringEndIndex(sourceCode: string, stringStartIndex: number, grammar: CommentOrStringGrammar): number {\n if (sourceCode[stringStartIndex] === '`') return findJavaScriptTemplateEndIndex(sourceCode, stringStartIndex);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return findPythonFStringEndIndex(sourceCode, stringStartIndex);\n\n const closeRegExp = grammar.closeRegExp;\n closeRegExp.lastIndex = stringStartIndex + 1;\n const match = closeRegExp.exec(sourceCode);\n return match ? match.index + match[0].length : sourceCode.length;\n}\n\nfunction findJavaScriptTemplateEndIndex(sourceCode: string, stringStartIndex: number): number {\n let index = stringStartIndex + 1;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '`') return index + 1;\n if (sourceCode[index] === '$' && sourceCode[index + 1] === '{') {\n index = readBalancedExpression(sourceCode, index + 2, '}', { slashStartsRegExp: true }).endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return sourceCode.length;\n}\n\nfunction findPythonFStringEndIndex(sourceCode: string, stringStartIndex: number): number {\n const quote = getStringQuote(sourceCode, stringStartIndex);\n let index = stringStartIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n if (sourceCode[index] === '{' && sourceCode[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '{') {\n index = readBalancedExpression(sourceCode, index + 1, '}', { slashStartsRegExp: false }).endIndex + 1;\n continue;\n }\n index += sourceCode[index] === '\\\\' ? 2 : 1;\n }\n\n return sourceCode.length;\n}\n\nfunction getStringQuote(sourceCode: string, stringStartIndex: number): string {\n const threeCharacterQuote = sourceCode.slice(stringStartIndex, stringStartIndex + 3);\n if (threeCharacterQuote === \"'''\" || threeCharacterQuote === '\"\"\"') return threeCharacterQuote;\n return sourceCode[stringStartIndex] ?? '';\n}\n\nfunction getPythonStringPrefixStartIndex(sourceCode: string, stringStartIndex: number): number {\n const prefix = getPythonStringPrefix(sourceCode, stringStartIndex);\n return prefix ? stringStartIndex - prefix.length : stringStartIndex;\n}\n\nfunction getPythonStringPrefix(sourceCode: string, stringStartIndex: number): string | undefined {\n if (sourceCode[stringStartIndex] !== '\"' && sourceCode[stringStartIndex] !== \"'\") return undefined;\n let index = stringStartIndex - 1;\n while (index >= 0 && /[A-Za-z]/.test(sourceCode[index] ?? '')) index -= 1;\n\n const prefix = sourceCode.slice(index + 1, stringStartIndex);\n if (!prefix || !/^[bfru]+$/i.test(prefix)) return undefined;\n if (index >= 0 && /[\\dA-Za-z_]/.test(sourceCode[index] ?? '')) return undefined;\n\n return prefix;\n}\n\nfunction preserveStringInterpolationExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n sourceCode: string,\n stringStartIndex: number,\n stringLiteral: string\n): string {\n if (stringLiteral.startsWith('`'))\n return preserveJavaScriptTemplateExpressions(grammar, commentOrStringGrammars, stringLiteral);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return preservePythonFStringExpressions(grammar, commentOrStringGrammars, stringLiteral);\n return '';\n}\n\nfunction hasPythonFStringPrefix(sourceCode: string, stringStartIndex: number): boolean {\n return getPythonStringPrefix(sourceCode, stringStartIndex)?.toLowerCase().includes('f') ?? false;\n}\n\nfunction preserveJavaScriptTemplateExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const expressions: string[] = [];\n let index = 1;\n\n while (index < stringLiteral.length - 1) {\n if (stringLiteral[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '$' && stringLiteral[index + 1] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 2, '}', { slashStartsRegExp: true });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction preservePythonFStringExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const quoteLength = getStringQuote(stringLiteral, 0).length;\n const expressions: string[] = [];\n let index = quoteLength;\n\n while (index < stringLiteral.length - quoteLength) {\n if (stringLiteral[index] === '{' && stringLiteral[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 1, '}', { slashStartsRegExp: false });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += stringLiteral[index] === '\\\\' ? 2 : 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction readBalancedExpression(\n sourceCode: string,\n startIndex: number,\n closeChar: string,\n options: { slashStartsRegExp: boolean }\n): { content: string; endIndex: number } {\n let depth = 1;\n let index = startIndex;\n\n while (index < sourceCode.length) {\n const char = sourceCode[index];\n if (char === '\"' || char === \"'\" || char === '`') {\n index = skipQuotedSpan(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '/') {\n index = skipJavaScriptSingleLineComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '*') {\n index = skipJavaScriptBlockComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && char === '/') {\n index = skipJavaScriptRegExpLiteral(sourceCode, index);\n continue;\n }\n if (char === '{') depth += 1;\n if (char === closeChar) {\n depth -= 1;\n if (depth === 0) return { content: sourceCode.slice(startIndex, index), endIndex: index };\n }\n index += 1;\n }\n\n return { content: sourceCode.slice(startIndex), endIndex: sourceCode.length };\n}\n\nfunction skipQuotedSpan(sourceCode: string, startIndex: number): number {\n const quote = getStringQuote(sourceCode, startIndex);\n let index = startIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n index += 1;\n }\n\n return index;\n}\n\nfunction skipJavaScriptRegExpLiteral(sourceCode: string, startIndex: number): number {\n let index = startIndex + 1;\n let inCharacterClass = false;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '[') inCharacterClass = true;\n if (sourceCode[index] === ']') inCharacterClass = false;\n if (sourceCode[index] === '/' && !inCharacterClass) {\n index += 1;\n while (/[A-Za-z]/.test(sourceCode[index] ?? '')) index += 1;\n return index;\n }\n if (sourceCode[index] === '\\n') return startIndex + 1;\n index += 1;\n }\n\n return startIndex + 1;\n}\n\nfunction skipJavaScriptSingleLineComment(sourceCode: string, startIndex: number): number {\n const newLineIndex = sourceCode.indexOf('\\n', startIndex + 2);\n return newLineIndex === -1 ? sourceCode.length : newLineIndex;\n}\n\nfunction skipJavaScriptBlockComment(sourceCode: string, startIndex: number): number {\n const endIndex = sourceCode.indexOf('*/', startIndex + 2);\n return endIndex === -1 ? sourceCode.length : endIndex + 2;\n}\n"],"names":["removeCommentsAndMaybeStringsInSourceCode","grammar","sourceCode","options","commentOrStringGrammars","_grammar$comments","_grammar$strings","_grammar$comments$map","_grammar$comments2","_grammar$strings$map","_grammar$strings2","concat","_toConsumableArray","comments","map","v","_v$close","closeRegExp","makeGlobalRegExp","close","isComment","openRegExp","open","strings","compileCommentOrStringGrammars","length","removeStrings","newSourceCodeSlices","lastIndex","_step","first","_iterator","_createForOfIteratorHelper","s","n","done","commentOrStringGrammer","value","startRegExp","match","exec","shouldPreferMatch","err","e","f","stringPrefixStartIndex","index","getPythonStringPrefixStartIndex","push","slice","findStringEndIndex","stringLiteral","preserveStringInterpolationExpressions","join","regExp","RegExp","flags","includes","stringStartIndex","readBalancedExpression","slashStartsRegExp","endIndex","findJavaScriptTemplateEndIndex","hasPythonFStringPrefix","quote","getStringQuote","startsWith","findPythonFStringEndIndex","_sourceCode$stringSta","threeCharacterQuote","prefix","getPythonStringPrefix","_sourceCode$index2","test","_sourceCode$index","expressions","expression","content","preserveJavaScriptTemplateExpressions","quoteLength","preservePythonFStringExpressions","_getPythonStringPrefi","_getPythonStringPrefi2","toLowerCase","startIndex","closeChar","depth","char","skipJavaScriptSingleLineComment","skipJavaScriptBlockComment","skipJavaScriptRegExpLiteral","skipQuotedSpan","inCharacterClass","_sourceCode$index3","newLineIndex","indexOf"],"mappings":"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"}
@@ -1,2 +1,6 @@
1
1
  import type { LanguageDefinition } from '../types/language.js';
2
- export declare function removeCommentsInSourceCode(grammer: NonNullable<LanguageDefinition['grammer']>, sourceCode: string): string;
2
+ export type SourceCodeGrammar = NonNullable<LanguageDefinition['grammer']>;
3
+ /** Removes comments from source code according to the provided language grammar. */
4
+ export declare function removeCommentsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string;
5
+ /** Removes comments and string literal contents while preserving executable interpolation expressions. */
6
+ export declare function removeCommentsAndStringsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string;
@@ -1,2 +1,2 @@
1
- import{toConsumableArray as e,objectSpread2 as n}from"../_virtual/_rollupPluginBabelHelpers.js";function t(t,l){var r;if(null==(r=t.comments)||!r.length)return l;for(var o=[],a=0;a<l.length;){for(var i=void 0,s=0,m=[].concat(e(t.comments.map(function(e){return n({isComment:!0},e)})),e(null!=(c=null==(u=t.strings)?void 0:u.map(function(e){return n({isComment:!1},e)}))?c:[]));s<m.length;s++){var c,u,g=m[s],h=new RegExp(g.open,"g");h.lastIndex=a;var p=h.exec(l);p&&(!i||p.index<i.match.index)&&(i={match:p,closeRegExp:g.close,isComment:g.isComment})}if(i){var x;o.push(l.slice(a,i.match.index));var d=new RegExp(null!=(x=i.closeRegExp)?x:/(?=\n)/g,"g");d.lastIndex=i.match.index+i.match[0].length;var v=d.exec(l);a=v?v.index+v[0].length:l.length,i.isComment||o.push(l.slice(i.match.index,a))}else o.push(l.slice(a)),a=l.length}return o.join("")}export{t as removeCommentsInSourceCode};
1
+ import{createForOfIteratorHelper as e,toConsumableArray as n}from"../_virtual/_rollupPluginBabelHelpers.js";function r(e,n){return l(e,n,{removeStrings:!1})}function t(e,n){return l(e,n,{removeStrings:!0})}function l(r,t,l,o){var f,c;if(void 0===o&&(o=function(e){var r,t,l,i;return[].concat(n(null!=(r=null==(t=e.comments)?void 0:t.map(function(e){var n;return{closeRegExp:s(null!=(n=e.close)?n:/(?=\n)/g),isComment:!0,openRegExp:s(e.open)}}))?r:[]),n(null!=(l=null==(i=e.strings)?void 0:i.map(function(e){return{closeRegExp:s(e.close),isComment:!1,openRegExp:s(e.open)}}))?l:[]))}(r)),!(null!=(f=r.comments)&&f.length||l.removeStrings&&null!=(c=r.strings)&&c.length))return t;for(var h=[],m=0;m<t.length;){var v,x=void 0,d=e(o);try{for(d.s();!(v=d.n()).done;){var p=v.value,E=p.openRegExp;E.lastIndex=m;var R=E.exec(t);R&&i(R,p,x,l)&&(x={grammar:p,match:R})}}catch(e){d.e(e)}finally{d.f()}if(x){var S=x.match.index;if(!x.grammar.isComment&&l.removeStrings&&(S=u(t,x.match.index)),h.push(t.slice(m,S)),x.grammar.isComment){var I=x.grammar.closeRegExp;I.lastIndex=x.match.index+x.match[0].length;var C=I.exec(t);m=C?C.index+C[0].length:t.length}else{m=a(t,x.match.index,x.grammar);var j=t.slice(x.match.index,m);l.removeStrings?h.push(g(r,o,t,x.match.index,j)):h.push(j)}}else h.push(t.slice(m)),m=t.length}return h.join("")}function i(e,n,r,t){return!r||(e.index<r.match.index||!(e.index>r.match.index)&&(t.removeStrings&&r.grammar.isComment&&!n.isComment))}function s(e){return new RegExp(e,e.flags.includes("g")?e.flags:"".concat(e.flags,"g"))}function a(e,n,r){if("`"===e[n])return function(e,n){var r=n+1;for(;r<e.length;)if("\\"!==e[r]){if("`"===e[r])return r+1;"$"!==e[r]||"{"!==e[r+1]?r+=1:r=h(e,r+2,"}",{slashStartsRegExp:!0}).endIndex+1}else r+=2;return e.length}(e,n);if(c(e,n))return function(e,n){var r=o(e,n),t=n+r.length;for(;t<e.length;){if(e.startsWith(r,t))return t+r.length;"{"!==e[t]||"{"!==e[t+1]?"{"!==e[t]?t+="\\"===e[t]?2:1:t=h(e,t+1,"}",{slashStartsRegExp:!1}).endIndex+1:t+=2}return e.length}(e,n);var t=r.closeRegExp;t.lastIndex=n+1;var l=t.exec(e);return l?l.index+l[0].length:e.length}function o(e,n){var r,t=e.slice(n,n+3);return"'''"===t||'"""'===t?t:null!=(r=e[n])?r:""}function u(e,n){var r=f(e,n);return r?n-r.length:n}function f(e,n){var r;if('"'===e[n]||"'"===e[n]){for(var t=n-1;t>=0&&/[A-Za-z]/.test(null!=(l=e[t])?l:"");){var l;t-=1}var i=e.slice(t+1,n);if(i&&/^[bfru]+$/i.test(i)&&!(t>=0&&/[\dA-Za-z_]/.test(null!=(r=e[t])?r:"")))return i}}function g(e,n,r,t,i){return i.startsWith("`")?function(e,n,r){var t=[],i=1;for(;i<r.length-1;)if("\\"!==r[i])if("$"!==r[i]||"{"!==r[i+1])i+=1;else{var s=h(r,i+2,"}",{slashStartsRegExp:!0});t.push(l(e,s.content,{removeStrings:!0},n)),i=s.endIndex+1}else i+=2;return t.join("\n")}(e,n,i):c(r,t)?function(e,n,r){var t=o(r,0).length,i=[],s=t;for(;s<r.length-t;)if("{"!==r[s]||"{"!==r[s+1])if("{"!==r[s])s+="\\"===r[s]?2:1;else{var a=h(r,s+1,"}",{slashStartsRegExp:!1});i.push(l(e,a.content,{removeStrings:!0},n)),s=a.endIndex+1}else s+=2;return i.join("\n")}(e,n,i):""}function c(e,n){var r,t;return null!=(r=null==(t=f(e,n))?void 0:t.toLowerCase().includes("f"))&&r}function h(e,n,r,t){for(var l=1,i=n;i<e.length;){var s=e[i];if('"'!==s&&"'"!==s&&"`"!==s)if(t.slashStartsRegExp&&"/"===e[i]&&"/"===e[i+1])i=x(e,i);else if(t.slashStartsRegExp&&"/"===e[i]&&"*"===e[i+1])i=d(e,i);else if(t.slashStartsRegExp&&"/"===s)i=v(e,i);else{if("{"===s&&(l+=1),s===r&&0===(l-=1))return{content:e.slice(n,i),endIndex:i};i+=1}else i=m(e,i)}return{content:e.slice(n),endIndex:e.length}}function m(e,n){for(var r=o(e,n),t=n+r.length;t<e.length;)if("\\"!==e[t]){if(e.startsWith(r,t))return t+r.length;t+=1}else t+=2;return t}function v(e,n){for(var r=n+1,t=!1;r<e.length;)if("\\"!==e[r]){if("["===e[r]&&(t=!0),"]"===e[r]&&(t=!1),"/"===e[r]&&!t){for(r+=1;/[A-Za-z]/.test(null!=(l=e[r])?l:"");){var l;r+=1}return r}if("\n"===e[r])return n+1;r+=1}else r+=2;return n+1}function x(e,n){var r=e.indexOf("\n",n+2);return-1===r?e.length:r}function d(e,n){var r=e.indexOf("*/",n+2);return-1===r?e.length:r+2}export{t as removeCommentsAndStringsInSourceCode,r as removeCommentsInSourceCode};
2
2
  //# sourceMappingURL=removeCommentsInSourceCode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"removeCommentsInSourceCode.js","sources":["../../src/helpers/removeCommentsInSourceCode.ts"],"sourcesContent":["import type { LanguageDefinition } from '../types/language.js';\n\nexport function removeCommentsInSourceCode(\n grammer: NonNullable<LanguageDefinition['grammer']>,\n sourceCode: string\n): string {\n if (!grammer.comments?.length) return sourceCode;\n\n const newSourceCodeSlices: string[] = [];\n\n let lastIndex = 0;\n\n while (lastIndex < sourceCode.length) {\n let first: { match: RegExpExecArray; closeRegExp: RegExp | undefined; isComment: boolean } | undefined;\n\n for (const commentOrStringGrammer of [\n ...grammer.comments.map((v) => ({ isComment: true, ...v })),\n ...(grammer.strings?.map((v) => ({ isComment: false, ...v })) ?? []),\n ]) {\n const startRegExp = new RegExp(commentOrStringGrammer.open, 'g');\n startRegExp.lastIndex = lastIndex;\n\n const match = startRegExp.exec(sourceCode);\n\n if (match && (!first || match.index < first.match.index)) {\n first = { match, closeRegExp: commentOrStringGrammer.close, isComment: commentOrStringGrammer.isComment };\n }\n }\n\n if (first) {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex, first.match.index));\n\n const closeRegExp = new RegExp(first.closeRegExp ?? /(?=\\n)/g, 'g');\n closeRegExp.lastIndex = first.match.index + first.match[0].length;\n\n const match = closeRegExp.exec(sourceCode);\n\n lastIndex = match ? match.index + match[0].length : sourceCode.length;\n if (!first.isComment) newSourceCodeSlices.push(sourceCode.slice(first.match.index, lastIndex));\n } else {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex));\n lastIndex = sourceCode.length;\n }\n }\n\n return newSourceCodeSlices.join('');\n}\n"],"names":["removeCommentsInSourceCode","grammer","sourceCode","_grammer$comments","comments","length","newSourceCodeSlices","lastIndex","first","_i","_arr","concat","_toConsumableArray","map","v","_objectSpread","isComment","_grammer$strings$map","_grammer$strings","strings","commentOrStringGrammer","startRegExp","RegExp","open","match","exec","index","closeRegExp","close","_first$closeRegExp","push","slice","join"],"mappings":"gGAEO,SAASA,EACdC,EACAC,GACQ,IAAAC,EACR,GAAqB,OAAjBA,EAACF,EAAQG,YAARD,EAAkBE,OAAQ,OAAOH,EAMtC,IAJA,IAAMI,EAAgC,GAElCC,EAAY,EAETA,EAAYL,EAAWG,QAAQ,CAGpC,IAFA,IAAIG,OAAkG,EAEtGC,EAAA,EAAAC,EAAA,GAAAC,OAAAC,EACKX,EAAQG,SAASS,IAAI,SAACC,GAAC,OAAAC,EAAA,CAAQC,WAAW,GAASF,EAAC,IAAIF,EACE,OADFK,EACxC,OADwCC,EACvDjB,EAAQkB,cAAO,EAAfD,EAAiBL,IAAI,SAACC,GAAC,OAAAC,EAAA,CAAQC,WAAW,GAAUF,EAAC,IAAIG,EAAI,KAAER,EAAAC,EAAAL,OAAAI,IAClE,CAAA,IAAAQ,EAAAC,EAHQE,EAAsBV,EAAAD,GAIzBY,EAAc,IAAIC,OAAOF,EAAuBG,KAAM,KAC5DF,EAAYd,UAAYA,EAExB,IAAMiB,EAAQH,EAAYI,KAAKvB,GAE3BsB,KAAWhB,GAASgB,EAAME,MAAQlB,EAAMgB,MAAME,SAChDlB,EAAQ,CAAEgB,MAAAA,EAAOG,YAAaP,EAAuBQ,MAAOZ,UAAWI,EAAuBJ,WAElG,CAEA,GAAIR,EAAO,CAAA,IAAAqB,EACTvB,EAAoBwB,KAAK5B,EAAW6B,MAAMxB,EAAWC,EAAMgB,MAAME,QAEjE,IAAMC,EAAc,IAAIL,cAAMO,EAACrB,EAAMmB,aAAWE,EAAI,UAAW,KAC/DF,EAAYpB,UAAYC,EAAMgB,MAAME,MAAQlB,EAAMgB,MAAM,GAAGnB,OAE3D,IAAMmB,EAAQG,EAAYF,KAAKvB,GAE/BK,EAAYiB,EAAQA,EAAME,MAAQF,EAAM,GAAGnB,OAASH,EAAWG,OAC1DG,EAAMQ,WAAWV,EAAoBwB,KAAK5B,EAAW6B,MAAMvB,EAAMgB,MAAME,MAAOnB,GACrF,MACED,EAAoBwB,KAAK5B,EAAW6B,MAAMxB,IAC1CA,EAAYL,EAAWG,MAE3B,CAEA,OAAOC,EAAoB0B,KAAK,GAClC"}
1
+ {"version":3,"file":"removeCommentsInSourceCode.js","sources":["../../src/helpers/removeCommentsInSourceCode.ts"],"sourcesContent":["import type { LanguageDefinition } from '../types/language.js';\n\nexport type SourceCodeGrammar = NonNullable<LanguageDefinition['grammer']>;\n\n/** Removes comments from source code according to the provided language grammar. */\nexport function removeCommentsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: false });\n}\n\n/** Removes comments and string literal contents while preserving executable interpolation expressions. */\nexport function removeCommentsAndStringsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: true });\n}\n\ninterface CommentOrStringGrammar {\n closeRegExp: RegExp;\n isComment: boolean;\n openRegExp: RegExp;\n}\n\nfunction removeCommentsAndMaybeStringsInSourceCode(\n grammar: SourceCodeGrammar,\n sourceCode: string,\n options: { removeStrings: boolean },\n commentOrStringGrammars = compileCommentOrStringGrammars(grammar)\n): string {\n if (!grammar.comments?.length && (!options.removeStrings || !grammar.strings?.length)) return sourceCode;\n\n const newSourceCodeSlices: string[] = [];\n\n let lastIndex = 0;\n\n while (lastIndex < sourceCode.length) {\n let first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined;\n\n for (const commentOrStringGrammer of commentOrStringGrammars) {\n const startRegExp = commentOrStringGrammer.openRegExp;\n startRegExp.lastIndex = lastIndex;\n\n const match = startRegExp.exec(sourceCode);\n\n if (match && shouldPreferMatch(match, commentOrStringGrammer, first, options)) {\n first = { grammar: commentOrStringGrammer, match };\n }\n }\n\n if (first) {\n let stringPrefixStartIndex = first.match.index;\n if (!first.grammar.isComment && options.removeStrings) {\n stringPrefixStartIndex = getPythonStringPrefixStartIndex(sourceCode, first.match.index);\n }\n newSourceCodeSlices.push(sourceCode.slice(lastIndex, stringPrefixStartIndex));\n\n if (!first.grammar.isComment) {\n lastIndex = findStringEndIndex(sourceCode, first.match.index, first.grammar);\n const stringLiteral = sourceCode.slice(first.match.index, lastIndex);\n if (options.removeStrings) {\n newSourceCodeSlices.push(\n preserveStringInterpolationExpressions(\n grammar,\n commentOrStringGrammars,\n sourceCode,\n first.match.index,\n stringLiteral\n )\n );\n } else {\n newSourceCodeSlices.push(stringLiteral);\n }\n } else {\n const closeRegExp = first.grammar.closeRegExp;\n closeRegExp.lastIndex = first.match.index + first.match[0].length;\n\n const match = closeRegExp.exec(sourceCode);\n\n lastIndex = match ? match.index + match[0].length : sourceCode.length;\n }\n } else {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex));\n lastIndex = sourceCode.length;\n }\n }\n\n return newSourceCodeSlices.join('');\n}\n\nfunction compileCommentOrStringGrammars(grammar: SourceCodeGrammar): readonly CommentOrStringGrammar[] {\n return [\n ...(grammar.comments?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close ?? /(?=\\n)/g),\n isComment: true,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ...(grammar.strings?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close),\n isComment: false,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ] satisfies CommentOrStringGrammar[];\n}\n\nfunction shouldPreferMatch(\n match: RegExpExecArray,\n grammar: CommentOrStringGrammar,\n first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined,\n options: { removeStrings: boolean }\n): boolean {\n if (!first) return true;\n if (match.index < first.match.index) return true;\n if (match.index > first.match.index) return false;\n return options.removeStrings && first.grammar.isComment && !grammar.isComment;\n}\n\nfunction makeGlobalRegExp(regExp: RegExp): RegExp {\n return new RegExp(regExp, regExp.flags.includes('g') ? regExp.flags : `${regExp.flags}g`);\n}\n\nfunction findStringEndIndex(sourceCode: string, stringStartIndex: number, grammar: CommentOrStringGrammar): number {\n if (sourceCode[stringStartIndex] === '`') return findJavaScriptTemplateEndIndex(sourceCode, stringStartIndex);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return findPythonFStringEndIndex(sourceCode, stringStartIndex);\n\n const closeRegExp = grammar.closeRegExp;\n closeRegExp.lastIndex = stringStartIndex + 1;\n const match = closeRegExp.exec(sourceCode);\n return match ? match.index + match[0].length : sourceCode.length;\n}\n\nfunction findJavaScriptTemplateEndIndex(sourceCode: string, stringStartIndex: number): number {\n let index = stringStartIndex + 1;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '`') return index + 1;\n if (sourceCode[index] === '$' && sourceCode[index + 1] === '{') {\n index = readBalancedExpression(sourceCode, index + 2, '}', { slashStartsRegExp: true }).endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return sourceCode.length;\n}\n\nfunction findPythonFStringEndIndex(sourceCode: string, stringStartIndex: number): number {\n const quote = getStringQuote(sourceCode, stringStartIndex);\n let index = stringStartIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n if (sourceCode[index] === '{' && sourceCode[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '{') {\n index = readBalancedExpression(sourceCode, index + 1, '}', { slashStartsRegExp: false }).endIndex + 1;\n continue;\n }\n index += sourceCode[index] === '\\\\' ? 2 : 1;\n }\n\n return sourceCode.length;\n}\n\nfunction getStringQuote(sourceCode: string, stringStartIndex: number): string {\n const threeCharacterQuote = sourceCode.slice(stringStartIndex, stringStartIndex + 3);\n if (threeCharacterQuote === \"'''\" || threeCharacterQuote === '\"\"\"') return threeCharacterQuote;\n return sourceCode[stringStartIndex] ?? '';\n}\n\nfunction getPythonStringPrefixStartIndex(sourceCode: string, stringStartIndex: number): number {\n const prefix = getPythonStringPrefix(sourceCode, stringStartIndex);\n return prefix ? stringStartIndex - prefix.length : stringStartIndex;\n}\n\nfunction getPythonStringPrefix(sourceCode: string, stringStartIndex: number): string | undefined {\n if (sourceCode[stringStartIndex] !== '\"' && sourceCode[stringStartIndex] !== \"'\") return undefined;\n let index = stringStartIndex - 1;\n while (index >= 0 && /[A-Za-z]/.test(sourceCode[index] ?? '')) index -= 1;\n\n const prefix = sourceCode.slice(index + 1, stringStartIndex);\n if (!prefix || !/^[bfru]+$/i.test(prefix)) return undefined;\n if (index >= 0 && /[\\dA-Za-z_]/.test(sourceCode[index] ?? '')) return undefined;\n\n return prefix;\n}\n\nfunction preserveStringInterpolationExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n sourceCode: string,\n stringStartIndex: number,\n stringLiteral: string\n): string {\n if (stringLiteral.startsWith('`'))\n return preserveJavaScriptTemplateExpressions(grammar, commentOrStringGrammars, stringLiteral);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return preservePythonFStringExpressions(grammar, commentOrStringGrammars, stringLiteral);\n return '';\n}\n\nfunction hasPythonFStringPrefix(sourceCode: string, stringStartIndex: number): boolean {\n return getPythonStringPrefix(sourceCode, stringStartIndex)?.toLowerCase().includes('f') ?? false;\n}\n\nfunction preserveJavaScriptTemplateExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const expressions: string[] = [];\n let index = 1;\n\n while (index < stringLiteral.length - 1) {\n if (stringLiteral[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '$' && stringLiteral[index + 1] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 2, '}', { slashStartsRegExp: true });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction preservePythonFStringExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const quoteLength = getStringQuote(stringLiteral, 0).length;\n const expressions: string[] = [];\n let index = quoteLength;\n\n while (index < stringLiteral.length - quoteLength) {\n if (stringLiteral[index] === '{' && stringLiteral[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 1, '}', { slashStartsRegExp: false });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += stringLiteral[index] === '\\\\' ? 2 : 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction readBalancedExpression(\n sourceCode: string,\n startIndex: number,\n closeChar: string,\n options: { slashStartsRegExp: boolean }\n): { content: string; endIndex: number } {\n let depth = 1;\n let index = startIndex;\n\n while (index < sourceCode.length) {\n const char = sourceCode[index];\n if (char === '\"' || char === \"'\" || char === '`') {\n index = skipQuotedSpan(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '/') {\n index = skipJavaScriptSingleLineComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '*') {\n index = skipJavaScriptBlockComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && char === '/') {\n index = skipJavaScriptRegExpLiteral(sourceCode, index);\n continue;\n }\n if (char === '{') depth += 1;\n if (char === closeChar) {\n depth -= 1;\n if (depth === 0) return { content: sourceCode.slice(startIndex, index), endIndex: index };\n }\n index += 1;\n }\n\n return { content: sourceCode.slice(startIndex), endIndex: sourceCode.length };\n}\n\nfunction skipQuotedSpan(sourceCode: string, startIndex: number): number {\n const quote = getStringQuote(sourceCode, startIndex);\n let index = startIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n index += 1;\n }\n\n return index;\n}\n\nfunction skipJavaScriptRegExpLiteral(sourceCode: string, startIndex: number): number {\n let index = startIndex + 1;\n let inCharacterClass = false;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '[') inCharacterClass = true;\n if (sourceCode[index] === ']') inCharacterClass = false;\n if (sourceCode[index] === '/' && !inCharacterClass) {\n index += 1;\n while (/[A-Za-z]/.test(sourceCode[index] ?? '')) index += 1;\n return index;\n }\n if (sourceCode[index] === '\\n') return startIndex + 1;\n index += 1;\n }\n\n return startIndex + 1;\n}\n\nfunction skipJavaScriptSingleLineComment(sourceCode: string, startIndex: number): number {\n const newLineIndex = sourceCode.indexOf('\\n', startIndex + 2);\n return newLineIndex === -1 ? sourceCode.length : newLineIndex;\n}\n\nfunction skipJavaScriptBlockComment(sourceCode: string, startIndex: number): number {\n const endIndex = sourceCode.indexOf('*/', startIndex + 2);\n return endIndex === -1 ? sourceCode.length : endIndex + 2;\n}\n"],"names":["removeCommentsInSourceCode","grammar","sourceCode","removeCommentsAndMaybeStringsInSourceCode","removeStrings","removeCommentsAndStringsInSourceCode","options","commentOrStringGrammars","_grammar$comments","_grammar$strings","_grammar$comments$map","_grammar$comments2","_grammar$strings$map","_grammar$strings2","concat","_toConsumableArray","comments","map","v","_v$close","closeRegExp","makeGlobalRegExp","close","isComment","openRegExp","open","strings","compileCommentOrStringGrammars","length","newSourceCodeSlices","lastIndex","_step","first","_iterator","_createForOfIteratorHelper","s","n","done","commentOrStringGrammer","value","startRegExp","match","exec","shouldPreferMatch","err","e","f","stringPrefixStartIndex","index","getPythonStringPrefixStartIndex","push","slice","findStringEndIndex","stringLiteral","preserveStringInterpolationExpressions","join","regExp","RegExp","flags","includes","stringStartIndex","readBalancedExpression","slashStartsRegExp","endIndex","findJavaScriptTemplateEndIndex","hasPythonFStringPrefix","quote","getStringQuote","startsWith","findPythonFStringEndIndex","_sourceCode$stringSta","threeCharacterQuote","prefix","getPythonStringPrefix","_sourceCode$index2","test","_sourceCode$index","expressions","expression","content","preserveJavaScriptTemplateExpressions","quoteLength","preservePythonFStringExpressions","_getPythonStringPrefi","_getPythonStringPrefi2","toLowerCase","startIndex","closeChar","depth","char","skipJavaScriptSingleLineComment","skipJavaScriptBlockComment","skipJavaScriptRegExpLiteral","skipQuotedSpan","inCharacterClass","_sourceCode$index3","newLineIndex","indexOf"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";var e,r,t=require("../_virtual/_rollupPluginBabelHelpers.cjs"),n=require("node:child_process"),o=require("node:fs/promises"),a=require("node:os"),i=require("node:path"),c={bun:["package.json","bun.lock","bun.lockb"],cargo:["Cargo.toml","Cargo.lock"],go:["go.mod","go.sum"],gradle:["build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","gradle","gradlew","gradlew.bat"],maven:["pom.xml",".mvn","mvnw","mvnw.cmd"],npm:["package.json","package-lock.json"],pnpm:["package.json","pnpm-lock.yaml","pnpm-workspace.yaml"],ruby:["Gemfile","Gemfile.lock",".ruby-version"],uv:["pyproject.toml","uv.lock"],yarn:["package.json","yarn.lock",".yarnrc.yml",".yarn"]},s=(e="darwin"===a.platform()?"gtime":"/usr/bin/time",(r=n.spawnSync(e,["--version"],{stdio:"ignore"})).error||0!==r.status?void 0:[e,"--format","%e %M"]);function u(){return u=t.asyncToGenerator(t.regenerator().m(function e(r){var n,c,s,u,d,m,l,y,g;return t.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.n=1,o.mkdtemp(i.join(a.tmpdir(),null!=(n=r.tempDirPrefix)?n:"exercode-"));case 1:return c=e.v,e.p=2,e.n=3,o.cp(r.cwd,c,{recursive:!0});case 3:return e.n=4,p({packageManager:r.packageManager,projectDir:r.projectDir,runDir:c,projectFilePaths:r.projectFilePaths});case 4:return m="function"==typeof r.command?r.command({runDir:c}):r.command,l=Date.now(),e.n=5,f(m,{cwd:c,env:r.env?t.objectSpread2(t.objectSpread2({},process.env),r.env):process.env,outputLimitBytes:null!=(s=r.outputLimitBytes)?s:52428800,stdin:null!=(u=r.stdin)?u:"",timeLimitSeconds:r.timeLimitSeconds});case 5:return y=e.v,g=(Date.now()-l)/1e3,e.a(2,{stdin:null!=(d=r.stdin)?d:"",stdout:y.stdout,stderr:y.stderr,status:y.timedOut||y.outputLimitExceeded?0:y.status,timeSeconds:y.timedOut?r.timeLimitSeconds+.001:y.timeSeconds||g,memoryBytes:y.memoryBytes,timedOut:y.timedOut,signal:y.signal,outputLimitExceeded:y.outputLimitExceeded});case 6:return e.p=6,e.n=7,o.rm(c,{force:!0,recursive:!0});case 7:return e.f(6);case 8:return e.a(2)}},e,null,[[2,,6,8]])})),u.apply(this,arguments)}function p(e){return d.apply(this,arguments)}function d(){return(d=t.asyncToGenerator(t.regenerator().m(function e(r){var n,o,a,s,u;return t.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:o=t.createForOfIteratorHelper(null!=(n=r.projectFilePaths)?n:c[r.packageManager]),e.p=1,o.s();case 2:if((a=o.n()).done){e.n=4;break}return s=a.value,e.n=3,m(i.join(r.projectDir,s),i.join(r.runDir,s));case 3:e.n=2;break;case 4:e.n=6;break;case 5:e.p=5,u=e.v,o.e(u);case 6:return e.p=6,o.f(),e.f(6);case 7:return e.a(2)}},e,null,[[1,5,6,7]])}))).apply(this,arguments)}function m(e,r){return l.apply(this,arguments)}function l(){return(l=t.asyncToGenerator(t.regenerator().m(function e(r,n){var a;return t.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,o.cp(r,n,{recursive:!0});case 1:e.n=3;break;case 2:if(e.p=2,a=e.v,"ENOENT"===("object"===t.typeof(a)&&null!==a&&"code"in a?a.code:void 0)){e.n=3;break}throw a;case 3:return e.a(2)}},e,null,[[0,2]])}))).apply(this,arguments)}function f(e,r){return y.apply(this,arguments)}function y(){return y=t.asyncToGenerator(t.regenerator().m(function e(r,o){var a,c,u,p,d,m,l,f,y,b,k,w,h,L,j,S,B,E;return t.regenerator().w(function(e){for(;;)switch(e.n){case 0:return a=void 0===s?void 0:i.join(o.cwd,".exercode-time-result"),c=void 0===s?r:[].concat(t.toConsumableArray(s),["--output=".concat(a)],t.toConsumableArray(r)),u=n.spawn(c[0],c.slice(1),{cwd:o.cwd,detached:"win32"!==process.platform,env:o.env,stdio:["pipe","pipe","pipe"]}),p=[],d=[],m=0,l=!1,f=!1,y=function(e,r){if(m>=o.outputLimitBytes)r.byteLength>0&&(f=!0,g(u,"SIGKILL"));else{var t=o.outputLimitBytes-m,n=r.byteLength>t?r.subarray(0,t):r;e.push(n),m+=n.byteLength,r.byteLength>t&&(f=!0,g(u,"SIGKILL"))}},u.stdout.on("data",function(e){return y(p,e)}),u.stderr.on("data",function(e){return y(d,e)}),b=setTimeout(function(){l=!0,g(u,"SIGTERM")},1e3*o.timeLimitSeconds),(k=setTimeout(function(){l&&g(u,"SIGKILL")},1e3*o.timeLimitSeconds+1e3)).unref(),e.n=1,new Promise(function(e,r){var t,n=!1,a=function(e){n||(t=e,g(u,"SIGKILL"),void 0===u.pid&&(n=!0,r(e)))};u.on("error",a),u.stdin.on("error",function(e){"EPIPE"!==e.code&&a(e)}),u.on("close",function(o,a){n||(n=!0,t?r(t):e({status:null!=o?o:void 0,signal:null!=a?a:void 0}))}),u.stdin.end(o.stdin)}).finally(function(){clearTimeout(b),clearTimeout(k)});case 1:if(w=e.v,h=w.status,L=w.signal,void 0!==a){e.n=2;break}E={timeSeconds:0,memoryBytes:0},e.n=4;break;case 2:return e.n=3,v(a);case 3:E=e.v;case 4:return S=(j=E).timeSeconds,B=j.memoryBytes,e.a(2,{stdout:Buffer.concat(p).toString(),stderr:Buffer.concat(d).toString(),status:h,timeSeconds:S,memoryBytes:B,timedOut:l,signal:L,outputLimitExceeded:f})}},e)})),y.apply(this,arguments)}function g(e,r){if(void 0!==e.pid)try{if("win32"===process.platform)return void e.kill(r);process.kill(-e.pid,r)}catch(e){var n="object"===t.typeof(e)&&null!==e&&"code"in e?e.code:void 0;if("ESRCH"!==n&&"EPERM"!==n)throw e}}function v(e){return b.apply(this,arguments)}function b(){return(b=t.asyncToGenerator(t.regenerator().m(function e(r){var n,a,i;return t.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,o.readFile(r,"utf8");case 1:n=e.v,e.n=4;break;case 2:if(e.p=2,i=e.v,"ENOENT"===("object"===t.typeof(i)&&null!==i&&"code"in i?i.code:void 0)){e.n=3;break}throw i;case 3:return e.a(2,{timeSeconds:0,memoryBytes:0});case 4:if(a=/(\d+(?:[.,]\d+)?) (\d+)\s*$/.exec(n)){e.n=5;break}return e.a(2,{timeSeconds:0,memoryBytes:0});case 5:return e.a(2,{timeSeconds:Number(a[1].replace(",",".")),memoryBytes:1024*Number(a[2])})}},e,null,[[0,2]])}))).apply(this,arguments)}exports.copyPackageManagerProjectFiles=p,exports.runCommandInTemporaryPackageManagerProject=function(e){return u.apply(this,arguments)};
2
+ //# sourceMappingURL=runCommandInTemporaryPackageManagerProject.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runCommandInTemporaryPackageManagerProject.cjs","sources":["../../src/helpers/runCommandInTemporaryPackageManagerProject.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport type PackageManager = 'bun' | 'cargo' | 'go' | 'gradle' | 'maven' | 'npm' | 'pnpm' | 'ruby' | 'uv' | 'yarn';\n\nexport interface PackageManagerCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}\n\nexport interface RunCommandInTemporaryPackageManagerProjectOptions {\n cwd: string;\n projectDir: string;\n packageManager: PackageManager;\n command: readonly [string, ...string[]] | ((context: { runDir: string }) => readonly [string, ...string[]]);\n stdin?: string;\n env?: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n outputLimitBytes?: number;\n tempDirPrefix?: string;\n projectFilePaths?: readonly string[];\n}\n\nconst packageManagerProjectFilePaths = {\n bun: ['package.json', 'bun.lock', 'bun.lockb'],\n cargo: ['Cargo.toml', 'Cargo.lock'],\n go: ['go.mod', 'go.sum'],\n gradle: [\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n 'gradle.properties',\n 'gradle',\n 'gradlew',\n 'gradlew.bat',\n ],\n maven: ['pom.xml', '.mvn', 'mvnw', 'mvnw.cmd'],\n npm: ['package.json', 'package-lock.json'],\n pnpm: ['package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml'],\n ruby: ['Gemfile', 'Gemfile.lock', '.ruby-version'],\n uv: ['pyproject.toml', 'uv.lock'],\n yarn: ['package.json', 'yarn.lock', '.yarnrc.yml', '.yarn'],\n} as const satisfies Record<PackageManager, readonly string[]>;\n\nconst defaultOutputLimitBytes = 50 * 1024 * 1024;\nconst killGracePeriodMilliseconds = 1000;\nconst timeCommand = resolveTimeCommand();\n\n/**\n * Copies a submission directory to a temporary directory, overlays package\n * manager project files from the problem directory, runs a command, and then\n * removes the temporary directory.\n */\nexport async function runCommandInTemporaryPackageManagerProject(\n options: RunCommandInTemporaryPackageManagerProjectOptions\n): Promise<PackageManagerCommandRunResult> {\n const runDir = await fs.mkdtemp(path.join(os.tmpdir(), options.tempDirPrefix ?? 'exercode-'));\n try {\n await fs.cp(options.cwd, runDir, { recursive: true });\n await copyPackageManagerProjectFiles({\n packageManager: options.packageManager,\n projectDir: options.projectDir,\n runDir,\n projectFilePaths: options.projectFilePaths,\n });\n\n const command = typeof options.command === 'function' ? options.command({ runDir }) : options.command;\n const startedAt = Date.now();\n const result = await spawnWithInput(command, {\n cwd: runDir,\n env: options.env ? { ...process.env, ...options.env } : process.env,\n outputLimitBytes: options.outputLimitBytes ?? defaultOutputLimitBytes,\n stdin: options.stdin ?? '',\n timeLimitSeconds: options.timeLimitSeconds,\n });\n const elapsedTimeSeconds = (Date.now() - startedAt) / 1000;\n\n return {\n stdin: options.stdin ?? '',\n stdout: result.stdout,\n stderr: result.stderr,\n status: result.timedOut || result.outputLimitExceeded ? 0 : result.status,\n timeSeconds: result.timedOut ? options.timeLimitSeconds + 1e-3 : result.timeSeconds || elapsedTimeSeconds,\n memoryBytes: result.memoryBytes,\n timedOut: result.timedOut,\n signal: result.signal,\n outputLimitExceeded: result.outputLimitExceeded,\n };\n } finally {\n await fs.rm(runDir, { force: true, recursive: true });\n }\n}\n\nexport async function copyPackageManagerProjectFiles(options: {\n packageManager: PackageManager;\n projectDir: string;\n runDir: string;\n projectFilePaths?: readonly string[];\n}): Promise<void> {\n for (const projectFilePath of options.projectFilePaths ?? packageManagerProjectFilePaths[options.packageManager]) {\n await copyPathIfExists(path.join(options.projectDir, projectFilePath), path.join(options.runDir, projectFilePath));\n }\n}\n\nasync function copyPathIfExists(sourcePath: string, destinationPath: string): Promise<void> {\n try {\n await fs.cp(sourcePath, destinationPath, { recursive: true });\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n }\n}\n\nasync function spawnWithInput(\n command: readonly [string, ...string[]],\n context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n outputLimitBytes: number;\n stdin: string;\n timeLimitSeconds: number;\n }\n): Promise<{\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}> {\n const timeOutputPath = timeCommand === undefined ? undefined : path.join(context.cwd, '.exercode-time-result');\n const spawnedCommand =\n timeCommand === undefined ? command : ([...timeCommand, `--output=${timeOutputPath}`, ...command] as const);\n const subprocess = childProcess.spawn(spawnedCommand[0], spawnedCommand.slice(1), {\n cwd: context.cwd,\n detached: process.platform !== 'win32',\n env: context.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let outputBytes = 0;\n let timedOut = false;\n let outputLimitExceeded = false;\n\n const appendOutputChunk = (chunks: Buffer[], chunk: Buffer): void => {\n if (outputBytes >= context.outputLimitBytes) {\n if (chunk.byteLength > 0) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n return;\n }\n\n const remainingBytes = context.outputLimitBytes - outputBytes;\n const appendedChunk = chunk.byteLength > remainingBytes ? chunk.subarray(0, remainingBytes) : chunk;\n chunks.push(appendedChunk);\n outputBytes += appendedChunk.byteLength;\n\n if (chunk.byteLength > remainingBytes) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n };\n\n subprocess.stdout.on('data', (chunk: Buffer) => appendOutputChunk(stdoutChunks, chunk));\n subprocess.stderr.on('data', (chunk: Buffer) => appendOutputChunk(stderrChunks, chunk));\n\n const timeout = setTimeout(() => {\n timedOut = true;\n killSubprocessGroup(subprocess, 'SIGTERM');\n }, context.timeLimitSeconds * 1000);\n const killTimeout = setTimeout(\n () => {\n if (timedOut) killSubprocessGroup(subprocess, 'SIGKILL');\n },\n context.timeLimitSeconds * 1000 + killGracePeriodMilliseconds\n );\n killTimeout.unref();\n\n const { status, signal } = await new Promise<{ status: number | undefined; signal: NodeJS.Signals | undefined }>(\n (resolve, reject) => {\n let settled = false;\n let pendingError: Error | undefined;\n const failAfterClose = (error: Error): void => {\n if (settled) return;\n pendingError = error;\n killSubprocessGroup(subprocess, 'SIGKILL');\n if (subprocess.pid === undefined) {\n settled = true;\n reject(error);\n }\n };\n subprocess.on('error', failAfterClose);\n subprocess.stdin.on('error', (error: NodeJS.ErrnoException) => {\n if (error.code !== 'EPIPE') failAfterClose(error);\n });\n subprocess.on('close', (code, closeSignal) => {\n if (settled) return;\n settled = true;\n if (pendingError) {\n reject(pendingError);\n return;\n }\n resolve({ status: code ?? undefined, signal: closeSignal ?? undefined });\n });\n subprocess.stdin.end(context.stdin);\n }\n ).finally(() => {\n clearTimeout(timeout);\n clearTimeout(killTimeout);\n });\n\n const { timeSeconds, memoryBytes } =\n timeOutputPath === undefined ? { timeSeconds: 0, memoryBytes: 0 } : await readTimeResult(timeOutputPath);\n\n return {\n stdout: Buffer.concat(stdoutChunks).toString(),\n stderr: Buffer.concat(stderrChunks).toString(),\n status,\n timeSeconds,\n memoryBytes,\n timedOut,\n signal,\n outputLimitExceeded,\n };\n}\n\nfunction resolveTimeCommand(): readonly [string, ...string[]] | undefined {\n const command = os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time';\n const result = childProcess.spawnSync(command, ['--version'], { stdio: 'ignore' });\n if (result.error || result.status !== 0) return undefined;\n\n return [command, '--format', '%e %M'];\n}\n\nfunction killSubprocessGroup(subprocess: childProcess.ChildProcess, signal: NodeJS.Signals): void {\n if (subprocess.pid === undefined) return;\n\n try {\n if (process.platform === 'win32') {\n subprocess.kill(signal);\n return;\n }\n process.kill(-subprocess.pid, signal);\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ESRCH' && code !== 'EPERM') throw error;\n }\n}\n\nasync function readTimeResult(timeOutputPath: string): Promise<{ timeSeconds: number; memoryBytes: number }> {\n let content: string;\n try {\n content = await fs.readFile(timeOutputPath, 'utf8');\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n return { timeSeconds: 0, memoryBytes: 0 };\n }\n\n const match = /(\\d+(?:[.,]\\d+)?) (\\d+)\\s*$/.exec(content);\n if (!match) return { timeSeconds: 0, memoryBytes: 0 };\n\n return { timeSeconds: Number(match[1]!.replace(',', '.')), memoryBytes: Number(match[2]) * 1024 };\n}\n"],"names":["command","result","packageManagerProjectFilePaths","bun","cargo","go","gradle","maven","npm","pnpm","ruby","uv","yarn","timeCommand","os","platform","childProcess","spawnSync","stdio","error","status","_runCommandInTemporaryPackageManagerProject","_asyncToGenerator","_regenerator","m","_callee","options","_options$tempDirPrefi","runDir","_options$outputLimitB","_options$stdin","_options$stdin2","startedAt","elapsedTimeSeconds","w","_context","p","n","fs","mkdtemp","path","join","tmpdir","tempDirPrefix","v","cp","cwd","recursive","copyPackageManagerProjectFiles","packageManager","projectDir","projectFilePaths","Date","now","spawnWithInput","env","_objectSpread","process","outputLimitBytes","stdin","timeLimitSeconds","a","stdout","stderr","timedOut","outputLimitExceeded","timeSeconds","memoryBytes","signal","rm","force","f","apply","this","arguments","_x2","_copyPackageManagerProjectFiles","_callee2","_options$projectFileP","_iterator","_step","projectFilePath","_t","_context2","_createForOfIteratorHelper","s","done","value","copyPathIfExists","e","_x3","_x4","_copyPathIfExists","_callee3","sourcePath","destinationPath","_t2","_context3","_typeof","code","undefined","_x5","_x6","_spawnWithInput","_callee4","context","timeOutputPath","spawnedCommand","subprocess","stdoutChunks","stderrChunks","outputBytes","appendOutputChunk","timeout","killTimeout","_yield$Promise$finall","_ref","_t3","_context4","concat","_toConsumableArray","spawn","slice","detached","chunks","chunk","byteLength","killSubprocessGroup","remainingBytes","appendedChunk","subarray","push","on","setTimeout","unref","Promise","resolve","reject","pendingError","settled","failAfterClose","pid","closeSignal","end","clearTimeout","readTimeResult","Buffer","toString","kill","_x7","_readTimeResult","_callee5","content","match","_t4","_context5","readFile","exec","Number","replace","_x"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export type PackageManager = 'bun' | 'cargo' | 'go' | 'gradle' | 'maven' | 'npm' | 'pnpm' | 'ruby' | 'uv' | 'yarn';
2
+ export interface PackageManagerCommandRunResult {
3
+ stdin: string;
4
+ stdout: string;
5
+ stderr: string;
6
+ status: number | undefined;
7
+ timeSeconds: number;
8
+ memoryBytes: number;
9
+ timedOut: boolean;
10
+ signal: NodeJS.Signals | undefined;
11
+ outputLimitExceeded: boolean;
12
+ }
13
+ export interface RunCommandInTemporaryPackageManagerProjectOptions {
14
+ cwd: string;
15
+ projectDir: string;
16
+ packageManager: PackageManager;
17
+ command: readonly [string, ...string[]] | ((context: {
18
+ runDir: string;
19
+ }) => readonly [string, ...string[]]);
20
+ stdin?: string;
21
+ env?: NodeJS.ProcessEnv;
22
+ timeLimitSeconds: number;
23
+ outputLimitBytes?: number;
24
+ tempDirPrefix?: string;
25
+ projectFilePaths?: readonly string[];
26
+ }
27
+ /**
28
+ * Copies a submission directory to a temporary directory, overlays package
29
+ * manager project files from the problem directory, runs a command, and then
30
+ * removes the temporary directory.
31
+ */
32
+ export declare function runCommandInTemporaryPackageManagerProject(options: RunCommandInTemporaryPackageManagerProjectOptions): Promise<PackageManagerCommandRunResult>;
33
+ export declare function copyPackageManagerProjectFiles(options: {
34
+ packageManager: PackageManager;
35
+ projectDir: string;
36
+ runDir: string;
37
+ projectFilePaths?: readonly string[];
38
+ }): Promise<void>;
@@ -0,0 +1,2 @@
1
+ import{asyncToGenerator as e,regenerator as t,objectSpread2 as n,createForOfIteratorHelper as r,typeof as o,toConsumableArray as i}from"../_virtual/_rollupPluginBabelHelpers.js";import a from"node:child_process";import s from"node:fs/promises";import c from"node:os";import u from"node:path";var p,m,d={bun:["package.json","bun.lock","bun.lockb"],cargo:["Cargo.toml","Cargo.lock"],go:["go.mod","go.sum"],gradle:["build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","gradle","gradlew","gradlew.bat"],maven:["pom.xml",".mvn","mvnw","mvnw.cmd"],npm:["package.json","package-lock.json"],pnpm:["package.json","pnpm-lock.yaml","pnpm-workspace.yaml"],ruby:["Gemfile","Gemfile.lock",".ruby-version"],uv:["pyproject.toml","uv.lock"],yarn:["package.json","yarn.lock",".yarnrc.yml",".yarn"]},l=(p="darwin"===c.platform()?"gtime":"/usr/bin/time",(m=a.spawnSync(p,["--version"],{stdio:"ignore"})).error||0!==m.status?void 0:[p,"--format","%e %M"]);function f(e){return y.apply(this,arguments)}function y(){return y=e(t().m(function e(r){var o,i,a,p,m,d,l,f,y;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.n=1,s.mkdtemp(u.join(c.tmpdir(),null!=(o=r.tempDirPrefix)?o:"exercode-"));case 1:return i=e.v,e.p=2,e.n=3,s.cp(r.cwd,i,{recursive:!0});case 3:return e.n=4,v({packageManager:r.packageManager,projectDir:r.projectDir,runDir:i,projectFilePaths:r.projectFilePaths});case 4:return d="function"==typeof r.command?r.command({runDir:i}):r.command,l=Date.now(),e.n=5,w(d,{cwd:i,env:r.env?n(n({},process.env),r.env):process.env,outputLimitBytes:null!=(a=r.outputLimitBytes)?a:52428800,stdin:null!=(p=r.stdin)?p:"",timeLimitSeconds:r.timeLimitSeconds});case 5:return f=e.v,y=(Date.now()-l)/1e3,e.a(2,{stdin:null!=(m=r.stdin)?m:"",stdout:f.stdout,stderr:f.stderr,status:f.timedOut||f.outputLimitExceeded?0:f.status,timeSeconds:f.timedOut?r.timeLimitSeconds+.001:f.timeSeconds||y,memoryBytes:f.memoryBytes,timedOut:f.timedOut,signal:f.signal,outputLimitExceeded:f.outputLimitExceeded});case 6:return e.p=6,e.n=7,s.rm(i,{force:!0,recursive:!0});case 7:return e.f(6);case 8:return e.a(2)}},e,null,[[2,,6,8]])})),y.apply(this,arguments)}function v(e){return g.apply(this,arguments)}function g(){return(g=e(t().m(function e(n){var o,i,a,s,c;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:i=r(null!=(o=n.projectFilePaths)?o:d[n.packageManager]),e.p=1,i.s();case 2:if((a=i.n()).done){e.n=4;break}return s=a.value,e.n=3,b(u.join(n.projectDir,s),u.join(n.runDir,s));case 3:e.n=2;break;case 4:e.n=6;break;case 5:e.p=5,c=e.v,i.e(c);case 6:return e.p=6,i.f(),e.f(6);case 7:return e.a(2)}},e,null,[[1,5,6,7]])}))).apply(this,arguments)}function b(e,t){return k.apply(this,arguments)}function k(){return(k=e(t().m(function e(n,r){var i;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,s.cp(n,r,{recursive:!0});case 1:e.n=3;break;case 2:if(e.p=2,i=e.v,"ENOENT"===("object"===o(i)&&null!==i&&"code"in i?i.code:void 0)){e.n=3;break}throw i;case 3:return e.a(2)}},e,null,[[0,2]])}))).apply(this,arguments)}function w(e,t){return h.apply(this,arguments)}function h(){return h=e(t().m(function e(n,r){var o,s,c,p,m,d,f,y,v,g,b,k,w,h,j,B,E,I;return t().w(function(e){for(;;)switch(e.n){case 0:return o=void 0===l?void 0:u.join(r.cwd,".exercode-time-result"),s=void 0===l?n:[].concat(i(l),["--output=".concat(o)],i(n)),c=a.spawn(s[0],s.slice(1),{cwd:r.cwd,detached:"win32"!==process.platform,env:r.env,stdio:["pipe","pipe","pipe"]}),p=[],m=[],d=0,f=!1,y=!1,v=function(e,t){if(d>=r.outputLimitBytes)t.byteLength>0&&(y=!0,L(c,"SIGKILL"));else{var n=r.outputLimitBytes-d,o=t.byteLength>n?t.subarray(0,n):t;e.push(o),d+=o.byteLength,t.byteLength>n&&(y=!0,L(c,"SIGKILL"))}},c.stdout.on("data",function(e){return v(p,e)}),c.stderr.on("data",function(e){return v(m,e)}),g=setTimeout(function(){f=!0,L(c,"SIGTERM")},1e3*r.timeLimitSeconds),(b=setTimeout(function(){f&&L(c,"SIGKILL")},1e3*r.timeLimitSeconds+1e3)).unref(),e.n=1,new Promise(function(e,t){var n,o=!1,i=function(e){o||(n=e,L(c,"SIGKILL"),void 0===c.pid&&(o=!0,t(e)))};c.on("error",i),c.stdin.on("error",function(e){"EPIPE"!==e.code&&i(e)}),c.on("close",function(r,i){o||(o=!0,n?t(n):e({status:null!=r?r:void 0,signal:null!=i?i:void 0}))}),c.stdin.end(r.stdin)}).finally(function(){clearTimeout(g),clearTimeout(b)});case 1:if(k=e.v,w=k.status,h=k.signal,void 0!==o){e.n=2;break}I={timeSeconds:0,memoryBytes:0},e.n=4;break;case 2:return e.n=3,S(o);case 3:I=e.v;case 4:return B=(j=I).timeSeconds,E=j.memoryBytes,e.a(2,{stdout:Buffer.concat(p).toString(),stderr:Buffer.concat(m).toString(),status:w,timeSeconds:B,memoryBytes:E,timedOut:f,signal:h,outputLimitExceeded:y})}},e)})),h.apply(this,arguments)}function L(e,t){if(void 0!==e.pid)try{if("win32"===process.platform)return void e.kill(t);process.kill(-e.pid,t)}catch(e){var n="object"===o(e)&&null!==e&&"code"in e?e.code:void 0;if("ESRCH"!==n&&"EPERM"!==n)throw e}}function S(e){return j.apply(this,arguments)}function j(){return(j=e(t().m(function e(n){var r,i,a;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,s.readFile(n,"utf8");case 1:r=e.v,e.n=4;break;case 2:if(e.p=2,a=e.v,"ENOENT"===("object"===o(a)&&null!==a&&"code"in a?a.code:void 0)){e.n=3;break}throw a;case 3:return e.a(2,{timeSeconds:0,memoryBytes:0});case 4:if(i=/(\d+(?:[.,]\d+)?) (\d+)\s*$/.exec(r)){e.n=5;break}return e.a(2,{timeSeconds:0,memoryBytes:0});case 5:return e.a(2,{timeSeconds:Number(i[1].replace(",",".")),memoryBytes:1024*Number(i[2])})}},e,null,[[0,2]])}))).apply(this,arguments)}export{v as copyPackageManagerProjectFiles,f as runCommandInTemporaryPackageManagerProject};
2
+ //# sourceMappingURL=runCommandInTemporaryPackageManagerProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runCommandInTemporaryPackageManagerProject.js","sources":["../../src/helpers/runCommandInTemporaryPackageManagerProject.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport type PackageManager = 'bun' | 'cargo' | 'go' | 'gradle' | 'maven' | 'npm' | 'pnpm' | 'ruby' | 'uv' | 'yarn';\n\nexport interface PackageManagerCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}\n\nexport interface RunCommandInTemporaryPackageManagerProjectOptions {\n cwd: string;\n projectDir: string;\n packageManager: PackageManager;\n command: readonly [string, ...string[]] | ((context: { runDir: string }) => readonly [string, ...string[]]);\n stdin?: string;\n env?: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n outputLimitBytes?: number;\n tempDirPrefix?: string;\n projectFilePaths?: readonly string[];\n}\n\nconst packageManagerProjectFilePaths = {\n bun: ['package.json', 'bun.lock', 'bun.lockb'],\n cargo: ['Cargo.toml', 'Cargo.lock'],\n go: ['go.mod', 'go.sum'],\n gradle: [\n 'build.gradle',\n 'build.gradle.kts',\n 'settings.gradle',\n 'settings.gradle.kts',\n 'gradle.properties',\n 'gradle',\n 'gradlew',\n 'gradlew.bat',\n ],\n maven: ['pom.xml', '.mvn', 'mvnw', 'mvnw.cmd'],\n npm: ['package.json', 'package-lock.json'],\n pnpm: ['package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml'],\n ruby: ['Gemfile', 'Gemfile.lock', '.ruby-version'],\n uv: ['pyproject.toml', 'uv.lock'],\n yarn: ['package.json', 'yarn.lock', '.yarnrc.yml', '.yarn'],\n} as const satisfies Record<PackageManager, readonly string[]>;\n\nconst defaultOutputLimitBytes = 50 * 1024 * 1024;\nconst killGracePeriodMilliseconds = 1000;\nconst timeCommand = resolveTimeCommand();\n\n/**\n * Copies a submission directory to a temporary directory, overlays package\n * manager project files from the problem directory, runs a command, and then\n * removes the temporary directory.\n */\nexport async function runCommandInTemporaryPackageManagerProject(\n options: RunCommandInTemporaryPackageManagerProjectOptions\n): Promise<PackageManagerCommandRunResult> {\n const runDir = await fs.mkdtemp(path.join(os.tmpdir(), options.tempDirPrefix ?? 'exercode-'));\n try {\n await fs.cp(options.cwd, runDir, { recursive: true });\n await copyPackageManagerProjectFiles({\n packageManager: options.packageManager,\n projectDir: options.projectDir,\n runDir,\n projectFilePaths: options.projectFilePaths,\n });\n\n const command = typeof options.command === 'function' ? options.command({ runDir }) : options.command;\n const startedAt = Date.now();\n const result = await spawnWithInput(command, {\n cwd: runDir,\n env: options.env ? { ...process.env, ...options.env } : process.env,\n outputLimitBytes: options.outputLimitBytes ?? defaultOutputLimitBytes,\n stdin: options.stdin ?? '',\n timeLimitSeconds: options.timeLimitSeconds,\n });\n const elapsedTimeSeconds = (Date.now() - startedAt) / 1000;\n\n return {\n stdin: options.stdin ?? '',\n stdout: result.stdout,\n stderr: result.stderr,\n status: result.timedOut || result.outputLimitExceeded ? 0 : result.status,\n timeSeconds: result.timedOut ? options.timeLimitSeconds + 1e-3 : result.timeSeconds || elapsedTimeSeconds,\n memoryBytes: result.memoryBytes,\n timedOut: result.timedOut,\n signal: result.signal,\n outputLimitExceeded: result.outputLimitExceeded,\n };\n } finally {\n await fs.rm(runDir, { force: true, recursive: true });\n }\n}\n\nexport async function copyPackageManagerProjectFiles(options: {\n packageManager: PackageManager;\n projectDir: string;\n runDir: string;\n projectFilePaths?: readonly string[];\n}): Promise<void> {\n for (const projectFilePath of options.projectFilePaths ?? packageManagerProjectFilePaths[options.packageManager]) {\n await copyPathIfExists(path.join(options.projectDir, projectFilePath), path.join(options.runDir, projectFilePath));\n }\n}\n\nasync function copyPathIfExists(sourcePath: string, destinationPath: string): Promise<void> {\n try {\n await fs.cp(sourcePath, destinationPath, { recursive: true });\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n }\n}\n\nasync function spawnWithInput(\n command: readonly [string, ...string[]],\n context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n outputLimitBytes: number;\n stdin: string;\n timeLimitSeconds: number;\n }\n): Promise<{\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n timedOut: boolean;\n signal: NodeJS.Signals | undefined;\n outputLimitExceeded: boolean;\n}> {\n const timeOutputPath = timeCommand === undefined ? undefined : path.join(context.cwd, '.exercode-time-result');\n const spawnedCommand =\n timeCommand === undefined ? command : ([...timeCommand, `--output=${timeOutputPath}`, ...command] as const);\n const subprocess = childProcess.spawn(spawnedCommand[0], spawnedCommand.slice(1), {\n cwd: context.cwd,\n detached: process.platform !== 'win32',\n env: context.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let outputBytes = 0;\n let timedOut = false;\n let outputLimitExceeded = false;\n\n const appendOutputChunk = (chunks: Buffer[], chunk: Buffer): void => {\n if (outputBytes >= context.outputLimitBytes) {\n if (chunk.byteLength > 0) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n return;\n }\n\n const remainingBytes = context.outputLimitBytes - outputBytes;\n const appendedChunk = chunk.byteLength > remainingBytes ? chunk.subarray(0, remainingBytes) : chunk;\n chunks.push(appendedChunk);\n outputBytes += appendedChunk.byteLength;\n\n if (chunk.byteLength > remainingBytes) {\n outputLimitExceeded = true;\n killSubprocessGroup(subprocess, 'SIGKILL');\n }\n };\n\n subprocess.stdout.on('data', (chunk: Buffer) => appendOutputChunk(stdoutChunks, chunk));\n subprocess.stderr.on('data', (chunk: Buffer) => appendOutputChunk(stderrChunks, chunk));\n\n const timeout = setTimeout(() => {\n timedOut = true;\n killSubprocessGroup(subprocess, 'SIGTERM');\n }, context.timeLimitSeconds * 1000);\n const killTimeout = setTimeout(\n () => {\n if (timedOut) killSubprocessGroup(subprocess, 'SIGKILL');\n },\n context.timeLimitSeconds * 1000 + killGracePeriodMilliseconds\n );\n killTimeout.unref();\n\n const { status, signal } = await new Promise<{ status: number | undefined; signal: NodeJS.Signals | undefined }>(\n (resolve, reject) => {\n let settled = false;\n let pendingError: Error | undefined;\n const failAfterClose = (error: Error): void => {\n if (settled) return;\n pendingError = error;\n killSubprocessGroup(subprocess, 'SIGKILL');\n if (subprocess.pid === undefined) {\n settled = true;\n reject(error);\n }\n };\n subprocess.on('error', failAfterClose);\n subprocess.stdin.on('error', (error: NodeJS.ErrnoException) => {\n if (error.code !== 'EPIPE') failAfterClose(error);\n });\n subprocess.on('close', (code, closeSignal) => {\n if (settled) return;\n settled = true;\n if (pendingError) {\n reject(pendingError);\n return;\n }\n resolve({ status: code ?? undefined, signal: closeSignal ?? undefined });\n });\n subprocess.stdin.end(context.stdin);\n }\n ).finally(() => {\n clearTimeout(timeout);\n clearTimeout(killTimeout);\n });\n\n const { timeSeconds, memoryBytes } =\n timeOutputPath === undefined ? { timeSeconds: 0, memoryBytes: 0 } : await readTimeResult(timeOutputPath);\n\n return {\n stdout: Buffer.concat(stdoutChunks).toString(),\n stderr: Buffer.concat(stderrChunks).toString(),\n status,\n timeSeconds,\n memoryBytes,\n timedOut,\n signal,\n outputLimitExceeded,\n };\n}\n\nfunction resolveTimeCommand(): readonly [string, ...string[]] | undefined {\n const command = os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time';\n const result = childProcess.spawnSync(command, ['--version'], { stdio: 'ignore' });\n if (result.error || result.status !== 0) return undefined;\n\n return [command, '--format', '%e %M'];\n}\n\nfunction killSubprocessGroup(subprocess: childProcess.ChildProcess, signal: NodeJS.Signals): void {\n if (subprocess.pid === undefined) return;\n\n try {\n if (process.platform === 'win32') {\n subprocess.kill(signal);\n return;\n }\n process.kill(-subprocess.pid, signal);\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ESRCH' && code !== 'EPERM') throw error;\n }\n}\n\nasync function readTimeResult(timeOutputPath: string): Promise<{ timeSeconds: number; memoryBytes: number }> {\n let content: string;\n try {\n content = await fs.readFile(timeOutputPath, 'utf8');\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? (error as { code: unknown }).code : undefined;\n if (code !== 'ENOENT') throw error;\n return { timeSeconds: 0, memoryBytes: 0 };\n }\n\n const match = /(\\d+(?:[.,]\\d+)?) (\\d+)\\s*$/.exec(content);\n if (!match) return { timeSeconds: 0, memoryBytes: 0 };\n\n return { timeSeconds: Number(match[1]!.replace(',', '.')), memoryBytes: Number(match[2]) * 1024 };\n}\n"],"names":["command","result","packageManagerProjectFilePaths","bun","cargo","go","gradle","maven","npm","pnpm","ruby","uv","yarn","timeCommand","os","platform","childProcess","spawnSync","stdio","error","status","runCommandInTemporaryPackageManagerProject","_x","_runCommandInTemporaryPackageManagerProject","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","options","_options$tempDirPrefi","runDir","_options$outputLimitB","_options$stdin","_options$stdin2","startedAt","elapsedTimeSeconds","w","_context","p","n","fs","mkdtemp","path","join","tmpdir","tempDirPrefix","v","cp","cwd","recursive","copyPackageManagerProjectFiles","packageManager","projectDir","projectFilePaths","Date","now","spawnWithInput","env","_objectSpread","process","outputLimitBytes","stdin","timeLimitSeconds","a","stdout","stderr","timedOut","outputLimitExceeded","timeSeconds","memoryBytes","signal","rm","force","f","_x2","_copyPackageManagerProjectFiles","_callee2","_options$projectFileP","_iterator","_step","projectFilePath","_t","_context2","_createForOfIteratorHelper","s","done","value","copyPathIfExists","e","_x3","_x4","_copyPathIfExists","_callee3","sourcePath","destinationPath","_t2","_context3","_typeof","code","undefined","_x5","_x6","_spawnWithInput","_callee4","context","timeOutputPath","spawnedCommand","subprocess","stdoutChunks","stderrChunks","outputBytes","appendOutputChunk","timeout","killTimeout","_yield$Promise$finall","_ref","_t3","_context4","concat","_toConsumableArray","spawn","slice","detached","chunks","chunk","byteLength","killSubprocessGroup","remainingBytes","appendedChunk","subarray","push","on","setTimeout","unref","Promise","resolve","reject","pendingError","settled","failAfterClose","pid","closeSignal","end","clearTimeout","readTimeResult","Buffer","toString","kill","_x7","_readTimeResult","_callee5","content","match","_t4","_context5","readFile","exec","Number","replace"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),r=require("../types/language.cjs"),a=Object.fromEntries(Object.entries(r.languageIdToDefinition).flatMap(function(r){var a=e.slicedToArray(r,2),t=a[0],i=a[1];return i.grammer?[[t,i.grammer]]:[]}));exports.languageIdToSourceCodeGrammar=a;
2
+ //# sourceMappingURL=sourceCodeGrammars.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceCodeGrammars.cjs","sources":["../../src/helpers/sourceCodeGrammars.ts"],"sourcesContent":["import type { SourceCodeGrammar } from './removeCommentsInSourceCode.js';\nimport { languageIdToDefinition } from '../types/language.js';\n\nexport const languageIdToSourceCodeGrammar = Object.fromEntries(\n Object.entries(languageIdToDefinition).flatMap(([languageId, languageDefinition]) =>\n languageDefinition.grammer ? [[languageId, languageDefinition.grammer] as const] : []\n )\n) as Readonly<Record<string, SourceCodeGrammar | undefined>>;\n"],"names":["languageIdToSourceCodeGrammar","Object","fromEntries","entries","languageIdToDefinition","flatMap","_ref","_ref2","_slicedToArray","languageId","languageDefinition","grammer"],"mappings":"2GAGaA,EAAgCC,OAAOC,YAClDD,OAAOE,QAAQC,0BAAwBC,QAAQ,SAAAC,GAAA,IAAAC,EAAAC,EAAAA,cAAAF,EAAA,GAAEG,EAAUF,EAAA,GAAEG,EAAkBH,EAAA,GAAA,OAC7EG,EAAmBC,QAAU,CAAC,CAACF,EAAYC,EAAmBC,UAAqB,EAAE"}
@@ -0,0 +1,2 @@
1
+ import type { SourceCodeGrammar } from './removeCommentsInSourceCode.js';
2
+ export declare const languageIdToSourceCodeGrammar: Readonly<Record<string, SourceCodeGrammar | undefined>>;
@@ -0,0 +1,2 @@
1
+ import{slicedToArray as r}from"../_virtual/_rollupPluginBabelHelpers.js";import{languageIdToDefinition as e}from"../types/language.js";var a=Object.fromEntries(Object.entries(e).flatMap(function(e){var a=r(e,2),t=a[0],l=a[1];return l.grammer?[[t,l.grammer]]:[]}));export{a as languageIdToSourceCodeGrammar};
2
+ //# sourceMappingURL=sourceCodeGrammars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceCodeGrammars.js","sources":["../../src/helpers/sourceCodeGrammars.ts"],"sourcesContent":["import type { SourceCodeGrammar } from './removeCommentsInSourceCode.js';\nimport { languageIdToDefinition } from '../types/language.js';\n\nexport const languageIdToSourceCodeGrammar = Object.fromEntries(\n Object.entries(languageIdToDefinition).flatMap(([languageId, languageDefinition]) =>\n languageDefinition.grammer ? [[languageId, languageDefinition.grammer] as const] : []\n )\n) as Readonly<Record<string, SourceCodeGrammar | undefined>>;\n"],"names":["languageIdToSourceCodeGrammar","Object","fromEntries","entries","languageIdToDefinition","flatMap","_ref","_ref2","_slicedToArray","languageId","languageDefinition","grammer"],"mappings":"2IAGaA,EAAgCC,OAAOC,YAClDD,OAAOE,QAAQC,GAAwBC,QAAQ,SAAAC,GAAA,IAAAC,EAAAC,EAAAF,EAAA,GAAEG,EAAUF,EAAA,GAAEG,EAAkBH,EAAA,GAAA,OAC7EG,EAAmBC,QAAU,CAAC,CAACF,EAAYC,EAAmBC,UAAqB,EAAE"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("./helpers/parseArgs.cjs"),s=require("./helpers/printTestCaseResult.cjs"),t=require("./helpers/startHttpServer.cjs"),r=require("./types/decisionCode.cjs"),p=require("./types/testCaseResult.cjs");exports.parseArgs=e.parseArgs,exports.encodeFileForTestCaseResult=s.encodeFileForTestCaseResult,exports.printTestCaseResult=s.printTestCaseResult,exports.startHttpServer=t.startHttpServer,exports.DecisionCode=r.DecisionCode,exports.TEST_CASE_RESULT_PREFIX=p.TEST_CASE_RESULT_PREFIX,exports.testCaseResultSchema=p.testCaseResultSchema;
1
+ "use strict";var e=require("./helpers/parseArgs.cjs"),r=require("./helpers/printTestCaseResult.cjs"),s=require("./helpers/removeCommentsInSourceCode.cjs"),o=require("./helpers/runCommandInTemporaryPackageManagerProject.cjs"),t=require("./helpers/sourceCodeGrammars.cjs"),a=require("./helpers/startHttpServer.cjs"),n=require("./types/decisionCode.cjs"),c=require("./types/testCaseResult.cjs");exports.parseArgs=e.parseArgs,exports.encodeFileForTestCaseResult=r.encodeFileForTestCaseResult,exports.printTestCaseResult=r.printTestCaseResult,exports.removeCommentsAndStringsInSourceCode=s.removeCommentsAndStringsInSourceCode,exports.removeCommentsInSourceCode=s.removeCommentsInSourceCode,exports.copyPackageManagerProjectFiles=o.copyPackageManagerProjectFiles,exports.runCommandInTemporaryPackageManagerProject=o.runCommandInTemporaryPackageManagerProject,exports.languageIdToSourceCodeGrammar=t.languageIdToSourceCodeGrammar,exports.startHttpServer=a.startHttpServer,exports.DecisionCode=n.DecisionCode,exports.TEST_CASE_RESULT_PREFIX=c.TEST_CASE_RESULT_PREFIX,exports.testCaseResultSchema=c.testCaseResultSchema;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  export * from './helpers/parseArgs.js';
2
2
  export * from './helpers/printTestCaseResult.js';
3
+ export * from './helpers/removeCommentsInSourceCode.js';
4
+ export * from './helpers/runCommandInTemporaryPackageManagerProject.js';
5
+ export * from './helpers/sourceCodeGrammars.js';
3
6
  export * from './helpers/startHttpServer.js';
4
7
  export * from './types/decisionCode.js';
5
8
  export * from './types/testCaseResult.js';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export{parseArgs}from"./helpers/parseArgs.js";export{encodeFileForTestCaseResult,printTestCaseResult}from"./helpers/printTestCaseResult.js";export{startHttpServer}from"./helpers/startHttpServer.js";export{DecisionCode}from"./types/decisionCode.js";export{TEST_CASE_RESULT_PREFIX,testCaseResultSchema}from"./types/testCaseResult.js";
1
+ export{parseArgs}from"./helpers/parseArgs.js";export{encodeFileForTestCaseResult,printTestCaseResult}from"./helpers/printTestCaseResult.js";export{removeCommentsAndStringsInSourceCode,removeCommentsInSourceCode}from"./helpers/removeCommentsInSourceCode.js";export{copyPackageManagerProjectFiles,runCommandInTemporaryPackageManagerProject}from"./helpers/runCommandInTemporaryPackageManagerProject.js";export{languageIdToSourceCodeGrammar}from"./helpers/sourceCodeGrammars.js";export{startHttpServer}from"./helpers/startHttpServer.js";export{DecisionCode}from"./types/decisionCode.js";export{TEST_CASE_RESULT_PREFIX,testCaseResultSchema}from"./types/testCaseResult.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),t=require("node:path"),r=require("zod"),n=require("../helpers/cleanWorkingDirectory.cjs"),s=require("../helpers/copyTestCaseFileInput.cjs"),i=require("../helpers/findEntryPointFile.cjs"),a=require("../helpers/findLanguageDefinitionByPath.cjs"),u=require("../helpers/judgeByStaticAnalysis.cjs"),o=require("../helpers/parseArgs.cjs"),d=require("../helpers/printTestCaseResult.cjs"),c=require("../helpers/readOutputFiles.cjs"),l=require("../helpers/readProblemMarkdownFrontMatter.cjs"),p=require("../helpers/readTestCases.cjs"),m=require("../helpers/resolveCwds.cjs"),C=require("../helpers/spawnSyncWithTimeout.cjs"),f=require("../types/decisionCode.cjs"),g=r.z.object({language:r.z.union([r.z.string(),r.z.array(r.z.string())]).optional()});function h(){return(h=e.asyncToGenerator(e.regenerator().m(function t(r,n){var s,i,a,u,d,c,l,p,C,f;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return s=o.parseArgs(process.argv),i=g.parse(s.params),t.n=1,m.resolveCwds(r,s.cwd);case 1:a=t.v,u=a.cwds,d=a.isDebugMode,c=e.createForOfIteratorHelper(u),t.p=2,c.s();case 3:if((l=c.n()).done){t.n=6;break}return p=l.value,d&&m.printDebugCwdBanner(r,p),t.n=4,I(r,p.cwd,i,n);case 4:C=t.v,d&&!v(p,C)&&(process.exitCode=1,m.printDebugExpectationFailureBanner(r,p));case 5:t.n=3;break;case 6:t.n=8;break;case 7:t.p=7,f=t.v,c.e(f);case 8:return t.p=8,c.f(),t.f(8);case 9:return t.a(2)}},t,null,[[2,7,8,9]])}))).apply(this,arguments)}function I(e,t,r,n){return y.apply(this,arguments)}function y(){return(y=e.asyncToGenerator(e.regenerator().m(function t(r,o,p,m){var C,g,h,I,y,v,S,L,O,k,_,w,M,P,x,F,B,j,q,A,U,N,W,z,G,X,H,Q,Y,Z,J,V,K,$,ee,te,re,ne,se,ie,ae,ue,oe,de,ce,le,pe;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return t.n=1,l.readProblemMarkdownFrontMatter(r);case 1:return _=t.v,t.n=2,(null!=(C=m.readTestCases)?C:b)(r);case 2:return w=t.v,M=null!=(g=null==(h=w[0])?void 0:h.id)?g:"prebuild",P={buildTimeoutSeconds:null!=(I=null==(y=m.limits)?void 0:y.buildTimeoutSeconds)?I:10,maxOutputLength:null!=(v=null==(S=m.limits)?void 0:S.maxOutputLength)?v:5e4},x=null!=(L=m.runTimeoutSeconds)?L:2,t.n=3,u.judgeByStaticAnalysis(o,_);case 3:if(!(F=t.v)){t.n=4;break}return d.printTestCaseResult(e.objectSpread2({testCaseId:M},F)),t.a(2,{allAccepted:!1});case 4:return t.n=5,i.findEntryPointFile(o,p.language);case 5:if(B=t.v){t.n=6;break}return d.printTestCaseResult({testCaseId:M,decisionCode:f.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(p.language?": language: ".concat(p.language):"")}),t.a(2,{allAccepted:!1});case 6:if(j=a.findLanguageDefinitionByPath(B)){t.n=7;break}return d.printTestCaseResult({testCaseId:M,decisionCode:f.DecisionCode.WRONG_ANSWER,stderr:"unsupported language"}),t.a(2,{allAccepted:!1});case 7:if(q=e.objectSpread2(e.objectSpread2({},process.env),{},{CI:"",FORCE_COLOR:"0"}),A=B,!j.prebuild){t.n=12;break}return t.p=8,t.n=9,j.prebuild(o);case 9:return t.n=10,i.findEntryPointFile(o,p.language);case 10:(U=t.v)&&(A=U),t.n=12;break;case 11:return t.p=11,oe=t.v,d.printTestCaseResult({testCaseId:M,decisionCode:f.DecisionCode.BUILD_ERROR,stderr:oe instanceof Error?oe.message:String(oe)}),t.a(2,{allAccepted:!1});case 12:if(!(N=null==(O=j.buildCommand)?void 0:O.call(j,A))){t.n=13;break}if(!(W=E(N,{cwd:o,env:q,testCaseId:M,limits:P}))){t.n=13;break}return d.printTestCaseResult(W),t.a(2,{allAccepted:!1});case 13:return t.n=14,n.snapshotWorkingDirectory(o);case 14:if(z=t.v,0!==w.length){t.n=15;break}return d.printTestCaseResult({testCaseId:"default",decisionCode:f.DecisionCode.ACCEPTED}),t.a(2,{allAccepted:!0});case 15:G=null==(k=w.shared)?void 0:k.fileInputPath,X=e.createForOfIteratorHelper(w),t.p=16,X.s();case 17:if((H=X.n()).done){t.n=36;break}if(J=H.value,!G){t.n=18;break}return t.n=18,s.copyTestCaseFileInput(G,o);case 18:if(!J.fileInputPath){t.n=19;break}return t.n=19,s.copyTestCaseFileInput(J.fileInputPath,o);case 19:if(V="number"==typeof _.timeLimitMs?_.timeLimitMs/1e3:x,K=j.command(A),$=null!=(Q=J.input)?Q:"",ee=void 0,t.p=20,!m.resolveInput){t.n=22;break}return t.n=21,m.resolveInput({testCase:J,cwd:o,env:q});case 21:$=t.v;case 22:if(!m.runCommand){t.n=24;break}return t.n=23,m.runCommand({testCase:J,command:K,stdin:$,cwd:o,env:q,timeLimitSeconds:V});case 23:de=t.v,t.n=25;break;case 24:de=T(K,{stdin:$,cwd:o,env:q,timeLimitSeconds:V});case 25:ee=de,t.n=28;break;case 26:return t.p=26,ce=t.v,d.printTestCaseResult({testCaseId:J.id,decisionCode:f.DecisionCode.RUNTIME_ERROR,stdin:$,stderr:R(ce)}),t.n=27,n.cleanWorkingDirectory(o,z);case 27:return t.a(2,{allAccepted:!1});case 28:return t.n=29,c.readOutputFiles(o,null!=(Y=_.requiredOutputFilePaths)?Y:[]);case 29:if(te=t.v,re={timeLimitSeconds:V,outputLimitLength:P.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:_.memoryLimitByte,requiredOutputFilePaths:_.requiredOutputFilePaths}},ne=D({runResult:ee,outputFiles:te,context:re}),se=ne,ne.decisionCode!==f.DecisionCode.ACCEPTED){t.n=33;break}return t.p=30,t.n=31,null==(ie=m.test)?void 0:ie.call(m,{testCase:J,runResult:ee,outputFiles:te,context:re});case 31:(ae=t.v)&&(se={decisionCode:null!=(ue=ae.decisionCode)?ue:ne.decisionCode,feedbackMarkdown:ae.feedbackMarkdown,stderr:ae.stderr}),t.n=33;break;case 32:t.p=32,le=t.v,se={decisionCode:f.DecisionCode.RUNTIME_ERROR,stderr:R(le)};case 33:return d.printTestCaseResult(e.objectSpread2(e.objectSpread2({testCaseId:J.id},se),{},{exitStatus:ee.status,stdin:ee.stdin,stdout:ee.stdout.slice(0,P.maxOutputLength)||void 0,stderr:(null!=(Z=se.stderr)?Z:ee.stderr).slice(0,P.maxOutputLength)||void 0,timeSeconds:ee.timeSeconds,memoryBytes:ee.memoryBytes,outputFiles:te.length>0?te:void 0})),t.n=34,n.cleanWorkingDirectory(o,z);case 34:if(se.decisionCode===f.DecisionCode.ACCEPTED){t.n=35;break}return t.a(2,{allAccepted:!1});case 35:t.n=17;break;case 36:t.n=38;break;case 37:t.p=37,pe=t.v,X.e(pe);case 38:return t.p=38,X.f(),t.f(38);case 39:return t.a(2,{allAccepted:!0})}},t,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function v(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function E(e,t){var r,n=C.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),s=null!=(r=n.status)?r:void 0;return 0!==n.status?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_ERROR,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.stdout.length>t.limits.maxOutputLength||n.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:void 0}function R(e){return e instanceof Error?e.message:String(e)}function b(e){return S.apply(this,arguments)}function S(){return(S=e.asyncToGenerator(e.regenerator().m(function r(n){var s,i,a;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,p.readTestCases(t.join(n,"test_cases"));case 1:if(i=e.v,a=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(s=i.shared)||!s.fileInputPath){e.n=2;break}return e.a(2,Object.assign(a,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,a)}},r)}))).apply(this,arguments)}function T(e,t){var r,n=C.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:n.stdout,stderr:n.stderr,status:null!=(r=n.status)?r:void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function D(e){var t,r,n;if(0!==e.runResult.status)return{decisionCode:f.DecisionCode.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:f.DecisionCode.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:f.DecisionCode.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:f.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var s=null!=(r=null==(n=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:n.length)?r:0;return e.outputFiles.length<s?{decisionCode:f.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:f.DecisionCode.ACCEPTED}}exports.commandJudgePreset=function(e,t){return h.apply(this,arguments)};
1
+ "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),t=require("node:path"),r=require("zod"),n=require("../helpers/cleanWorkingDirectory.cjs"),s=require("../helpers/copyTestCaseFileInput.cjs"),i=require("../helpers/findEntryPointFile.cjs"),a=require("../helpers/findLanguageDefinitionByPath.cjs"),u=require("../helpers/judgeByStaticAnalysis.cjs"),o=require("../helpers/parseArgs.cjs"),d=require("../helpers/printTestCaseResult.cjs"),c=require("../helpers/readOutputFiles.cjs"),l=require("../helpers/readProblemMarkdownFrontMatter.cjs"),p=require("../helpers/readTestCases.cjs"),m=require("../helpers/resolveCwds.cjs"),C=require("../helpers/spawnSyncWithTimeout.cjs"),f=require("../types/decisionCode.cjs"),g=r.z.object({language:r.z.union([r.z.string(),r.z.array(r.z.string())]).optional()});function h(){return(h=e.asyncToGenerator(e.regenerator().m(function t(r,n){var s,i,a,u,d,c,l,p,C,f;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return s=o.parseArgs(process.argv),i=g.parse(s.params),t.n=1,m.resolveCwds(r,s.cwd);case 1:a=t.v,u=a.cwds,d=a.isDebugMode,c=e.createForOfIteratorHelper(u),t.p=2,c.s();case 3:if((l=c.n()).done){t.n=6;break}return p=l.value,d&&m.printDebugCwdBanner(r,p),t.n=4,I(r,p.cwd,i,n);case 4:C=t.v,d&&!E(p,C)&&(process.exitCode=1,m.printDebugExpectationFailureBanner(r,p));case 5:t.n=3;break;case 6:t.n=8;break;case 7:t.p=7,f=t.v,c.e(f);case 8:return t.p=8,c.f(),t.f(8);case 9:return t.a(2)}},t,null,[[2,7,8,9]])}))).apply(this,arguments)}function I(e,t,r,n){return y.apply(this,arguments)}function y(){return(y=e.asyncToGenerator(e.regenerator().m(function t(r,o,p,m){var C,g,h,I,y,E,S,L,O,k,_,w,M,x,P,F,B,j,q,A,U,N,W,z,G,X,H,Q,Y,Z,J,V,K,$,ee,te,re,ne,se,ie,ae,ue,oe,de,ce,le,pe;return e.regenerator().w(function(t){for(;;)switch(t.p=t.n){case 0:return t.n=1,l.readProblemMarkdownFrontMatter(r);case 1:return _=t.v,t.n=2,(null!=(C=m.readTestCases)?C:b)(r);case 2:return w=t.v,M=null!=(g=null==(h=w[0])?void 0:h.id)?g:"prebuild",x={buildTimeoutSeconds:null!=(I=null==(y=m.limits)?void 0:y.buildTimeoutSeconds)?I:10,maxOutputLength:null!=(E=null==(S=m.limits)?void 0:S.maxOutputLength)?E:5e4},P=null!=(L=m.runTimeoutSeconds)?L:2,t.n=3,u.judgeByStaticAnalysis(o,_);case 3:if(!(F=t.v)){t.n=4;break}return d.printTestCaseResult(e.objectSpread2({testCaseId:M},F)),t.a(2,{allAccepted:!1});case 4:return t.n=5,i.findEntryPointFile(o,p.language);case 5:if(B=t.v){t.n=6;break}return d.printTestCaseResult({testCaseId:M,decisionCode:f.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(p.language?": language: ".concat(p.language):"")}),t.a(2,{allAccepted:!1});case 6:if(j=a.findLanguageDefinitionByPath(B)){t.n=7;break}return d.printTestCaseResult({testCaseId:M,decisionCode:f.DecisionCode.WRONG_ANSWER,stderr:"unsupported language"}),t.a(2,{allAccepted:!1});case 7:if(q=e.objectSpread2(e.objectSpread2({},process.env),{},{CI:"",FORCE_COLOR:"0"}),A=B,!j.prebuild){t.n=12;break}return t.p=8,t.n=9,j.prebuild(o);case 9:return t.n=10,i.findEntryPointFile(o,p.language);case 10:(U=t.v)&&(A=U),t.n=12;break;case 11:return t.p=11,oe=t.v,d.printTestCaseResult({testCaseId:M,decisionCode:f.DecisionCode.BUILD_ERROR,stderr:oe instanceof Error?oe.message:String(oe)}),t.a(2,{allAccepted:!1});case 12:if(!(N=null==(O=j.buildCommand)?void 0:O.call(j,A))){t.n=13;break}if(!(W=v(N,{cwd:o,env:q,testCaseId:M,limits:x}))){t.n=13;break}return d.printTestCaseResult(W),t.a(2,{allAccepted:!1});case 13:return t.n=14,n.snapshotWorkingDirectory(o);case 14:if(z=t.v,0!==w.length){t.n=15;break}return d.printTestCaseResult({testCaseId:"default",decisionCode:f.DecisionCode.ACCEPTED}),t.a(2,{allAccepted:!0});case 15:G=null==(k=w.shared)?void 0:k.fileInputPath,X=e.createForOfIteratorHelper(w),t.p=16,X.s();case 17:if((H=X.n()).done){t.n=36;break}if(J=H.value,!G){t.n=18;break}return t.n=18,s.copyTestCaseFileInput(G,o);case 18:if(!J.fileInputPath){t.n=19;break}return t.n=19,s.copyTestCaseFileInput(J.fileInputPath,o);case 19:if(V="number"==typeof _.timeLimitMs?_.timeLimitMs/1e3:P,K=j.command(A),$=null!=(Q=J.input)?Q:"",ee=void 0,t.p=20,!m.resolveInput){t.n=22;break}return t.n=21,m.resolveInput({testCase:J,cwd:o,env:q});case 21:$=t.v;case 22:if(!m.runCommand){t.n=24;break}return t.n=23,m.runCommand({testCase:J,command:K,stdin:$,cwd:o,env:q,timeLimitSeconds:V});case 23:de=t.v,t.n=25;break;case 24:de=T(K,{stdin:$,cwd:o,env:q,timeLimitSeconds:V});case 25:ee=de,t.n=28;break;case 26:return t.p=26,ce=t.v,d.printTestCaseResult({testCaseId:J.id,decisionCode:f.DecisionCode.RUNTIME_ERROR,stdin:$,stderr:R(ce)}),t.n=27,n.cleanWorkingDirectory(o,z);case 27:return t.a(2,{allAccepted:!1});case 28:return t.n=29,c.readOutputFiles(o,null!=(Y=_.requiredOutputFilePaths)?Y:[]);case 29:if(te=t.v,re={timeLimitSeconds:V,outputLimitLength:x.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:_.memoryLimitByte,requiredOutputFilePaths:_.requiredOutputFilePaths}},ne=D({runResult:ee,outputFiles:te,context:re}),se=ne,ne.decisionCode!==f.DecisionCode.ACCEPTED){t.n=33;break}return t.p=30,t.n=31,null==(ie=m.test)?void 0:ie.call(m,{testCase:J,runResult:ee,outputFiles:te,context:re});case 31:(ae=t.v)&&(se={decisionCode:null!=(ue=ae.decisionCode)?ue:ne.decisionCode,feedbackMarkdown:ae.feedbackMarkdown,stderr:ae.stderr}),t.n=33;break;case 32:t.p=32,le=t.v,se={decisionCode:f.DecisionCode.RUNTIME_ERROR,stderr:R(le)};case 33:return d.printTestCaseResult(e.objectSpread2(e.objectSpread2({testCaseId:J.id},se),{},{exitStatus:ee.status,stdin:ee.stdin,stdout:ee.stdout.slice(0,x.maxOutputLength)||void 0,stderr:(null!=(Z=se.stderr)?Z:ee.stderr).slice(0,x.maxOutputLength)||void 0,timeSeconds:ee.timeSeconds,memoryBytes:ee.memoryBytes,outputFiles:te.length>0?te:void 0})),t.n=34,n.cleanWorkingDirectory(o,z);case 34:if(se.decisionCode===f.DecisionCode.ACCEPTED){t.n=35;break}return t.a(2,{allAccepted:!1});case 35:t.n=17;break;case 36:t.n=38;break;case 37:t.p=37,pe=t.v,X.e(pe);case 38:return t.p=38,X.f(),t.f(38);case 39:return t.a(2,{allAccepted:!0})}},t,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function E(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function v(e,t){var r,n=C.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),s=null!=(r=n.status)?r:void 0;return 0!==n.status?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_ERROR,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.stdout.length>t.limits.maxOutputLength||n.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:f.DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:void 0}function R(e){return e instanceof Error?e.message:String(e)}function b(e){return S.apply(this,arguments)}function S(){return(S=e.asyncToGenerator(e.regenerator().m(function r(n){var s,i,a;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,p.readTestCases(t.join(n,"test_cases"));case 1:if(i=e.v,a=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(s=i.shared)||!s.fileInputPath){e.n=2;break}return e.a(2,Object.assign(a,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,a)}},r)}))).apply(this,arguments)}function T(e,t){var r,n=C.spawnSyncWithTimeout(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:n.stdout,stderr:n.stderr,status:null!=(r=n.status)?r:void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function D(e){var t,r,n;if(0!==e.runResult.status)return{decisionCode:f.DecisionCode.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:f.DecisionCode.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:f.DecisionCode.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.outputLimitExceeded||e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:f.DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var s=null!=(r=null==(n=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:n.length)?r:0;return e.outputFiles.length<s?{decisionCode:f.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:f.DecisionCode.ACCEPTED}}exports.commandJudgePreset=function(e,t){return h.apply(this,arguments)};
2
2
  //# sourceMappingURL=command.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.cjs","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\n printDebugCwdBanner,\n printDebugExpectationFailureBanner,\n resolveCwds,\n type ResolvedCwd,\n} from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<CommandRunResult> | CommandRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n for (const resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase>(problemDir, resolvedCwd.cwd, params, options);\n if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n process.exitCode = 1;\n printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n }\n }\n}\n\nasync function runCommandJudgeForCwd<TTestCase extends BaseCommandTestCase>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<{ allAccepted: boolean }> {\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return { allAccepted: false };\n }\n\n const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return { allAccepted: false };\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return { allAccepted: false };\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(cwd);\n const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return { allAccepted: false };\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\n return { allAccepted: false };\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return { allAccepted: true };\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: CommandRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n })\n : runCommand(command, {\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n return { allAccepted: false };\n }\n\n const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return { allAccepted: false };\n }\n\n return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","_commandJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","_yield$resolveCwds","cwds","isDebugMode","_iterator","_step","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","exitCode","printDebugExpectationFailureBanner","e","f","a","apply","this","arguments","_x3","_x4","_x5","_x6","_runCommandJudgeForCwd","_callee2","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator2","_step2","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t2","_t3","_t4","_t5","_t6","_context2","readProblemMarkdownFrontMatter","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","allAccepted","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","expectedResult","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x7","_readCommandTestCases","_callee3","_fileTestCases$shared","fileTestCases","commandTestCases","_context3","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x","_x2"],"mappings":"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"}
1
+ {"version":3,"file":"command.cjs","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\n printDebugCwdBanner,\n printDebugExpectationFailureBanner,\n resolveCwds,\n type ResolvedCwd,\n} from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n outputLimitExceeded?: boolean;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<CommandRunResult> | CommandRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n for (const resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase>(problemDir, resolvedCwd.cwd, params, options);\n if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n process.exitCode = 1;\n printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n }\n }\n}\n\nasync function runCommandJudgeForCwd<TTestCase extends BaseCommandTestCase>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<{ allAccepted: boolean }> {\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return { allAccepted: false };\n }\n\n const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return { allAccepted: false };\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return { allAccepted: false };\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(cwd);\n const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return { allAccepted: false };\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\n return { allAccepted: false };\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return { allAccepted: true };\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: CommandRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n })\n : runCommand(command, {\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n return { allAccepted: false };\n }\n\n const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return { allAccepted: false };\n }\n\n return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.outputLimitExceeded ||\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","_commandJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","_yield$resolveCwds","cwds","isDebugMode","_iterator","_step","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","exitCode","printDebugExpectationFailureBanner","e","f","a","apply","this","arguments","_x3","_x4","_x5","_x6","_runCommandJudgeForCwd","_callee2","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator2","_step2","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t2","_t3","_t4","_t5","_t6","_context2","readProblemMarkdownFrontMatter","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","allAccepted","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","expectedResult","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x7","_readCommandTestCases","_callee3","_fileTestCases$shared","fileTestCases","commandTestCases","_context3","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","outputLimitExceeded","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x","_x2"],"mappings":"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"}
@@ -13,6 +13,7 @@ export interface CommandRunResult {
13
13
  status: number | undefined;
14
14
  timeSeconds: number;
15
15
  memoryBytes: number;
16
+ outputLimitExceeded?: boolean;
16
17
  }
17
18
  interface CommandJudgeContext {
18
19
  timeLimitSeconds: number;
@@ -1,2 +1,2 @@
1
- import{asyncToGenerator as e,regenerator as t,createForOfIteratorHelper as r,objectSpread2 as n}from"../_virtual/_rollupPluginBabelHelpers.js";import s from"node:path";import{z as i}from"zod";import{cleanWorkingDirectory as a,snapshotWorkingDirectory as u}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as o}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as d}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as c}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as l}from"../helpers/judgeByStaticAnalysis.js";import{parseArgs as m}from"../helpers/parseArgs.js";import{printTestCaseResult as p}from"../helpers/printTestCaseResult.js";import{readOutputFiles as f}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as h}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as C}from"../helpers/readTestCases.js";import{resolveCwds as I,printDebugExpectationFailureBanner as v,printDebugCwdBanner as g}from"../helpers/resolveCwds.js";import{spawnSyncWithTimeout as E}from"../helpers/spawnSyncWithTimeout.js";import{DecisionCode as R}from"../types/decisionCode.js";var b=i.object({language:i.union([i.string(),i.array(i.string())]).optional()});function y(e,t){return L.apply(this,arguments)}function L(){return(L=e(t().m(function e(n,s){var i,a,u,o,d,c,l,p,f,h;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return i=m(process.argv),a=b.parse(i.params),e.n=1,I(n,i.cwd);case 1:u=e.v,o=u.cwds,d=u.isDebugMode,c=r(o),e.p=2,c.s();case 3:if((l=c.n()).done){e.n=6;break}return p=l.value,d&&g(n,p),e.n=4,S(n,p.cwd,a,s);case 4:f=e.v,d&&!k(p,f)&&(process.exitCode=1,v(n,p));case 5:e.n=3;break;case 6:e.n=8;break;case 7:e.p=7,h=e.v,c.e(h);case 8:return e.p=8,c.f(),e.f(8);case 9:return e.a(2)}},e,null,[[2,7,8,9]])}))).apply(this,arguments)}function S(e,t,r,n){return O.apply(this,arguments)}function O(){return(O=e(t().m(function e(s,i,m,C){var I,v,g,E,b,y,L,S,O,k,x,D,B,F,j,A,U,N,X,q,G,W,H,Q,Y,Z,z,V,J,K,$,ee,te,re,ne,se,ie,ae,ue,oe,de,ce,le,me,pe,fe,he;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.n=1,h(s);case 1:return x=e.v,e.n=2,(null!=(I=C.readTestCases)?I:M)(s);case 2:return D=e.v,B=null!=(v=null==(g=D[0])?void 0:g.id)?v:"prebuild",F={buildTimeoutSeconds:null!=(E=null==(b=C.limits)?void 0:b.buildTimeoutSeconds)?E:10,maxOutputLength:null!=(y=null==(L=C.limits)?void 0:L.maxOutputLength)?y:5e4},j=null!=(S=C.runTimeoutSeconds)?S:2,e.n=3,l(i,x);case 3:if(!(A=e.v)){e.n=4;break}return p(n({testCaseId:B},A)),e.a(2,{allAccepted:!1});case 4:return e.n=5,d(i,m.language);case 5:if(U=e.v){e.n=6;break}return p({testCaseId:B,decisionCode:R.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(m.language?": language: ".concat(m.language):"")}),e.a(2,{allAccepted:!1});case 6:if(N=c(U)){e.n=7;break}return p({testCaseId:B,decisionCode:R.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2,{allAccepted:!1});case 7:if(X=n(n({},process.env),{},{CI:"",FORCE_COLOR:"0"}),q=U,!N.prebuild){e.n=12;break}return e.p=8,e.n=9,N.prebuild(i);case 9:return e.n=10,d(i,m.language);case 10:(G=e.v)&&(q=G),e.n=12;break;case 11:return e.p=11,le=e.v,p({testCaseId:B,decisionCode:R.BUILD_ERROR,stderr:le instanceof Error?le.message:String(le)}),e.a(2,{allAccepted:!1});case 12:if(!(W=null==(O=N.buildCommand)?void 0:O.call(N,q))){e.n=13;break}if(!(H=T(W,{cwd:i,env:X,testCaseId:B,limits:F}))){e.n=13;break}return p(H),e.a(2,{allAccepted:!1});case 13:return e.n=14,u(i);case 14:if(Q=e.v,0!==D.length){e.n=15;break}return p({testCaseId:"default",decisionCode:R.ACCEPTED}),e.a(2,{allAccepted:!0});case 15:Y=null==(k=D.shared)?void 0:k.fileInputPath,Z=r(D),e.p=16,Z.s();case 17:if((z=Z.n()).done){e.n=36;break}if($=z.value,!Y){e.n=18;break}return e.n=18,o(Y,i);case 18:if(!$.fileInputPath){e.n=19;break}return e.n=19,o($.fileInputPath,i);case 19:if(ee="number"==typeof x.timeLimitMs?x.timeLimitMs/1e3:j,te=N.command(q),re=null!=(V=$.input)?V:"",ne=void 0,e.p=20,!C.resolveInput){e.n=22;break}return e.n=21,C.resolveInput({testCase:$,cwd:i,env:X});case 21:re=e.v;case 22:if(!C.runCommand){e.n=24;break}return e.n=23,C.runCommand({testCase:$,command:te,stdin:re,cwd:i,env:X,timeLimitSeconds:ee});case 23:me=e.v,e.n=25;break;case 24:me=w(te,{stdin:re,cwd:i,env:X,timeLimitSeconds:ee});case 25:ne=me,e.n=28;break;case 26:return e.p=26,pe=e.v,p({testCaseId:$.id,decisionCode:R.RUNTIME_ERROR,stdin:re,stderr:_(pe)}),e.n=27,a(i,Q);case 27:return e.a(2,{allAccepted:!1});case 28:return e.n=29,f(i,null!=(J=x.requiredOutputFilePaths)?J:[]);case 29:if(se=e.v,ie={timeLimitSeconds:ee,outputLimitLength:F.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:x.memoryLimitByte,requiredOutputFilePaths:x.requiredOutputFilePaths}},ae=P({runResult:ne,outputFiles:se,context:ie}),ue=ae,ae.decisionCode!==R.ACCEPTED){e.n=33;break}return e.p=30,e.n=31,null==(oe=C.test)?void 0:oe.call(C,{testCase:$,runResult:ne,outputFiles:se,context:ie});case 31:(de=e.v)&&(ue={decisionCode:null!=(ce=de.decisionCode)?ce:ae.decisionCode,feedbackMarkdown:de.feedbackMarkdown,stderr:de.stderr}),e.n=33;break;case 32:e.p=32,fe=e.v,ue={decisionCode:R.RUNTIME_ERROR,stderr:_(fe)};case 33:return p(n(n({testCaseId:$.id},ue),{},{exitStatus:ne.status,stdin:ne.stdin,stdout:ne.stdout.slice(0,F.maxOutputLength)||void 0,stderr:(null!=(K=ue.stderr)?K:ne.stderr).slice(0,F.maxOutputLength)||void 0,timeSeconds:ne.timeSeconds,memoryBytes:ne.memoryBytes,outputFiles:se.length>0?se:void 0})),e.n=34,a(i,Q);case 34:if(ue.decisionCode===R.ACCEPTED){e.n=35;break}return e.a(2,{allAccepted:!1});case 35:e.n=17;break;case 36:e.n=38;break;case 37:e.p=37,he=e.v,Z.e(he);case 38:return e.p=38,Z.f(),e.f(38);case 39:return e.a(2,{allAccepted:!0})}},e,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function k(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function T(e,t){var r,n=E(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),s=null!=(r=n.status)?r:void 0;return 0!==n.status?{testCaseId:t.testCaseId,decisionCode:R.BUILD_ERROR,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:R.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.stdout.length>t.limits.maxOutputLength||n.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:R.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:void 0}function _(e){return e instanceof Error?e.message:String(e)}function M(e){return x.apply(this,arguments)}function x(){return(x=e(t().m(function e(r){var n,i,a;return t().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,C(s.join(r,"test_cases"));case 1:if(i=e.v,a=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(n=i.shared)||!n.fileInputPath){e.n=2;break}return e.a(2,Object.assign(a,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,a)}},e)}))).apply(this,arguments)}function w(e,t){var r,n=E(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:n.stdout,stderr:n.stderr,status:null!=(r=n.status)?r:void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function P(e){var t,r,n;if(0!==e.runResult.status)return{decisionCode:R.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:R.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:R.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:R.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var s=null!=(r=null==(n=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:n.length)?r:0;return e.outputFiles.length<s?{decisionCode:R.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:R.ACCEPTED}}export{y as commandJudgePreset};
1
+ import{asyncToGenerator as e,regenerator as t,createForOfIteratorHelper as r,objectSpread2 as n}from"../_virtual/_rollupPluginBabelHelpers.js";import s from"node:path";import{z as i}from"zod";import{cleanWorkingDirectory as u,snapshotWorkingDirectory as a}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as o}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as d}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as c}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as l}from"../helpers/judgeByStaticAnalysis.js";import{parseArgs as m}from"../helpers/parseArgs.js";import{printTestCaseResult as p}from"../helpers/printTestCaseResult.js";import{readOutputFiles as f}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as h}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as C}from"../helpers/readTestCases.js";import{resolveCwds as I,printDebugExpectationFailureBanner as v,printDebugCwdBanner as g}from"../helpers/resolveCwds.js";import{spawnSyncWithTimeout as E}from"../helpers/spawnSyncWithTimeout.js";import{DecisionCode as R}from"../types/decisionCode.js";var b=i.object({language:i.union([i.string(),i.array(i.string())]).optional()});function y(e,t){return L.apply(this,arguments)}function L(){return(L=e(t().m(function e(n,s){var i,u,a,o,d,c,l,p,f,h;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return i=m(process.argv),u=b.parse(i.params),e.n=1,I(n,i.cwd);case 1:a=e.v,o=a.cwds,d=a.isDebugMode,c=r(o),e.p=2,c.s();case 3:if((l=c.n()).done){e.n=6;break}return p=l.value,d&&g(n,p),e.n=4,S(n,p.cwd,u,s);case 4:f=e.v,d&&!k(p,f)&&(process.exitCode=1,v(n,p));case 5:e.n=3;break;case 6:e.n=8;break;case 7:e.p=7,h=e.v,c.e(h);case 8:return e.p=8,c.f(),e.f(8);case 9:return e.a(2)}},e,null,[[2,7,8,9]])}))).apply(this,arguments)}function S(e,t,r,n){return O.apply(this,arguments)}function O(){return(O=e(t().m(function e(s,i,m,C){var I,v,g,E,b,y,L,S,O,k,M,D,B,F,j,A,U,N,X,q,G,W,H,Q,Y,Z,z,V,J,K,$,ee,te,re,ne,se,ie,ue,ae,oe,de,ce,le,me,pe,fe,he;return t().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.n=1,h(s);case 1:return M=e.v,e.n=2,(null!=(I=C.readTestCases)?I:x)(s);case 2:return D=e.v,B=null!=(v=null==(g=D[0])?void 0:g.id)?v:"prebuild",F={buildTimeoutSeconds:null!=(E=null==(b=C.limits)?void 0:b.buildTimeoutSeconds)?E:10,maxOutputLength:null!=(y=null==(L=C.limits)?void 0:L.maxOutputLength)?y:5e4},j=null!=(S=C.runTimeoutSeconds)?S:2,e.n=3,l(i,M);case 3:if(!(A=e.v)){e.n=4;break}return p(n({testCaseId:B},A)),e.a(2,{allAccepted:!1});case 4:return e.n=5,d(i,m.language);case 5:if(U=e.v){e.n=6;break}return p({testCaseId:B,decisionCode:R.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:"main file not found".concat(m.language?": language: ".concat(m.language):"")}),e.a(2,{allAccepted:!1});case 6:if(N=c(U)){e.n=7;break}return p({testCaseId:B,decisionCode:R.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2,{allAccepted:!1});case 7:if(X=n(n({},process.env),{},{CI:"",FORCE_COLOR:"0"}),q=U,!N.prebuild){e.n=12;break}return e.p=8,e.n=9,N.prebuild(i);case 9:return e.n=10,d(i,m.language);case 10:(G=e.v)&&(q=G),e.n=12;break;case 11:return e.p=11,le=e.v,p({testCaseId:B,decisionCode:R.BUILD_ERROR,stderr:le instanceof Error?le.message:String(le)}),e.a(2,{allAccepted:!1});case 12:if(!(W=null==(O=N.buildCommand)?void 0:O.call(N,q))){e.n=13;break}if(!(H=T(W,{cwd:i,env:X,testCaseId:B,limits:F}))){e.n=13;break}return p(H),e.a(2,{allAccepted:!1});case 13:return e.n=14,a(i);case 14:if(Q=e.v,0!==D.length){e.n=15;break}return p({testCaseId:"default",decisionCode:R.ACCEPTED}),e.a(2,{allAccepted:!0});case 15:Y=null==(k=D.shared)?void 0:k.fileInputPath,Z=r(D),e.p=16,Z.s();case 17:if((z=Z.n()).done){e.n=36;break}if($=z.value,!Y){e.n=18;break}return e.n=18,o(Y,i);case 18:if(!$.fileInputPath){e.n=19;break}return e.n=19,o($.fileInputPath,i);case 19:if(ee="number"==typeof M.timeLimitMs?M.timeLimitMs/1e3:j,te=N.command(q),re=null!=(V=$.input)?V:"",ne=void 0,e.p=20,!C.resolveInput){e.n=22;break}return e.n=21,C.resolveInput({testCase:$,cwd:i,env:X});case 21:re=e.v;case 22:if(!C.runCommand){e.n=24;break}return e.n=23,C.runCommand({testCase:$,command:te,stdin:re,cwd:i,env:X,timeLimitSeconds:ee});case 23:me=e.v,e.n=25;break;case 24:me=w(te,{stdin:re,cwd:i,env:X,timeLimitSeconds:ee});case 25:ne=me,e.n=28;break;case 26:return e.p=26,pe=e.v,p({testCaseId:$.id,decisionCode:R.RUNTIME_ERROR,stdin:re,stderr:_(pe)}),e.n=27,u(i,Q);case 27:return e.a(2,{allAccepted:!1});case 28:return e.n=29,f(i,null!=(J=M.requiredOutputFilePaths)?J:[]);case 29:if(se=e.v,ie={timeLimitSeconds:ee,outputLimitLength:F.maxOutputLength,problemMarkdownFrontMatter:{memoryLimitByte:M.memoryLimitByte,requiredOutputFilePaths:M.requiredOutputFilePaths}},ue=P({runResult:ne,outputFiles:se,context:ie}),ae=ue,ue.decisionCode!==R.ACCEPTED){e.n=33;break}return e.p=30,e.n=31,null==(oe=C.test)?void 0:oe.call(C,{testCase:$,runResult:ne,outputFiles:se,context:ie});case 31:(de=e.v)&&(ae={decisionCode:null!=(ce=de.decisionCode)?ce:ue.decisionCode,feedbackMarkdown:de.feedbackMarkdown,stderr:de.stderr}),e.n=33;break;case 32:e.p=32,fe=e.v,ae={decisionCode:R.RUNTIME_ERROR,stderr:_(fe)};case 33:return p(n(n({testCaseId:$.id},ae),{},{exitStatus:ne.status,stdin:ne.stdin,stdout:ne.stdout.slice(0,F.maxOutputLength)||void 0,stderr:(null!=(K=ae.stderr)?K:ne.stderr).slice(0,F.maxOutputLength)||void 0,timeSeconds:ne.timeSeconds,memoryBytes:ne.memoryBytes,outputFiles:se.length>0?se:void 0})),e.n=34,u(i,Q);case 34:if(ae.decisionCode===R.ACCEPTED){e.n=35;break}return e.a(2,{allAccepted:!1});case 35:e.n=17;break;case 36:e.n=38;break;case 37:e.p=37,he=e.v,Z.e(he);case 38:return e.p=38,Z.f(),e.f(38);case 39:return e.a(2,{allAccepted:!0})}},e,null,[[30,32],[20,26],[16,37,38,39],[8,11]])}))).apply(this,arguments)}function k(e,t){return t.allAccepted===("accepted"===e.expectedResult)}function T(e,t){var r,n=E(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",env:t.env},t.limits.buildTimeoutSeconds),s=null!=(r=n.status)?r:void 0;return 0!==n.status?{testCaseId:t.testCaseId,decisionCode:R.BUILD_ERROR,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.timeSeconds>t.limits.buildTimeoutSeconds?{testCaseId:t.testCaseId,decisionCode:R.BUILD_TIME_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:n.stdout.length>t.limits.maxOutputLength||n.stderr.length>t.limits.maxOutputLength?{testCaseId:t.testCaseId,decisionCode:R.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,exitStatus:s,stdout:n.stdout.slice(0,t.limits.maxOutputLength),stderr:n.stderr.slice(0,t.limits.maxOutputLength),timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}:void 0}function _(e){return e instanceof Error?e.message:String(e)}function x(e){return M.apply(this,arguments)}function M(){return(M=e(t().m(function e(r){var n,i,u;return t().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,C(s.join(r,"test_cases"));case 1:if(i=e.v,u=i.map(function(e){return{id:(t=e).id,input:t.input,fileInputPath:t.fileInputPath};var t}),null==(n=i.shared)||!n.fileInputPath){e.n=2;break}return e.a(2,Object.assign(u,{shared:{fileInputPath:i.shared.fileInputPath}}));case 2:return e.a(2,u)}},e)}))).apply(this,arguments)}function w(e,t){var r,n=E(e[0],e.slice(1),{cwd:t.cwd,encoding:"utf8",input:t.stdin,env:t.env},t.timeLimitSeconds);return{stdin:t.stdin,stdout:n.stdout,stderr:n.stderr,status:null!=(r=n.status)?r:void 0,timeSeconds:n.timeSeconds,memoryBytes:n.memoryBytes}}function P(e){var t,r,n;if(0!==e.runResult.status)return{decisionCode:R.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.timeSeconds>e.context.timeLimitSeconds)return{decisionCode:R.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(t=e.context.problemMarkdownFrontMatter.memoryLimitByte)?t:Number.POSITIVE_INFINITY))return{decisionCode:R.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(e.runResult.outputLimitExceeded||e.runResult.stdout.length>e.context.outputLimitLength||e.runResult.stderr.length>e.context.outputLimitLength)return{decisionCode:R.OUTPUT_SIZE_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var s=null!=(r=null==(n=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:n.length)?r:0;return e.outputFiles.length<s?{decisionCode:R.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:R.ACCEPTED}}export{y as commandJudgePreset};
2
2
  //# sourceMappingURL=command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\n printDebugCwdBanner,\n printDebugExpectationFailureBanner,\n resolveCwds,\n type ResolvedCwd,\n} from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<CommandRunResult> | CommandRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n for (const resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase>(problemDir, resolvedCwd.cwd, params, options);\n if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n process.exitCode = 1;\n printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n }\n }\n}\n\nasync function runCommandJudgeForCwd<TTestCase extends BaseCommandTestCase>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<{ allAccepted: boolean }> {\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return { allAccepted: false };\n }\n\n const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return { allAccepted: false };\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return { allAccepted: false };\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(cwd);\n const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return { allAccepted: false };\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\n return { allAccepted: false };\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return { allAccepted: true };\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: CommandRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n })\n : runCommand(command, {\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n return { allAccepted: false };\n }\n\n const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return { allAccepted: false };\n }\n\n return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","commandJudgePreset","_x","_x2","_commandJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","_yield$resolveCwds","cwds","isDebugMode","_iterator","_step","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","exitCode","printDebugExpectationFailureBanner","e","f","a","_x3","_x4","_x5","_x6","_runCommandJudgeForCwd","_callee2","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator2","_step2","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t2","_t3","_t4","_t5","_t6","_context2","readProblemMarkdownFrontMatter","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","allAccepted","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","expectedResult","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x7","_readCommandTestCases","_callee3","_fileTestCases$shared","fileTestCases","commandTestCases","_context3","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR"],"mappings":"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"}
1
+ {"version":3,"file":"command.js","sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\n printDebugCwdBanner,\n printDebugExpectationFailureBanner,\n resolveCwds,\n type ResolvedCwd,\n} from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n outputLimitExceeded?: boolean;\n}\n\ninterface CommandJudgeContext {\n timeLimitSeconds: number;\n outputLimitLength: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n buildTimeoutSeconds: number;\n maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<TTestCase extends BaseCommandTestCase = BaseCommandTestCase> {\n limits?: CommandJudgeLimits;\n runTimeoutSeconds?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }) => Promise<CommandRunResult> | CommandRunResult;\n test?: (context: {\n testCase: TTestCase;\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n * readTestCases: async () => [\n * { id: '01', input: '1 2' },\n * ],\n * test: ({ runResult }) => {\n * return runResult.stdout.trim() === '3'\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n for (const resolvedCwd of cwds) {\n if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n const result = await runCommandJudgeForCwd<TTestCase>(problemDir, resolvedCwd.cwd, params, options);\n if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n process.exitCode = 1;\n printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n }\n }\n}\n\nasync function runCommandJudgeForCwd<TTestCase extends BaseCommandTestCase>(\n problemDir: string,\n cwd: string,\n params: JudgeParams,\n options: CommandJudgePresetOptions<TTestCase>\n): Promise<{ allAccepted: boolean }> {\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n const limits = {\n buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n };\n const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return { allAccepted: false };\n }\n\n const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n if (!originalMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return { allAccepted: false };\n }\n\n const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return { allAccepted: false };\n }\n\n // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let mainFilePath = originalMainFilePath;\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(cwd);\n const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: error instanceof Error ? error.message : String(error),\n });\n return { allAccepted: false };\n }\n }\n\n const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n if (buildCommand) {\n const buildResult = runBuild(buildCommand, {\n cwd,\n env,\n testCaseId: prebuildTestCaseId,\n limits,\n });\n if (buildResult) {\n printTestCaseResult(buildResult);\n return { allAccepted: false };\n }\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n if (testCases.length === 0) {\n printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n return { allAccepted: true };\n }\n\n const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n for (const testCase of testCases) {\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : runTimeoutSeconds;\n\n const command = languageDefinition.command(mainFilePath);\n let stdin = testCase.input ?? '';\n let runResult: CommandRunResult;\n try {\n if (options.resolveInput) {\n stdin = await options.resolveInput({ testCase, cwd, env });\n }\n\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n })\n : runCommand(command, {\n stdin,\n cwd,\n env,\n timeLimitSeconds,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n return { allAccepted: false };\n }\n\n const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: CommandJudgeContext = {\n timeLimitSeconds,\n outputLimitLength: limits.maxOutputLength,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n if (extendedJudgeResult) {\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n };\n }\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n printTestCaseResult({\n testCaseId: testCase.id,\n ...judgeResult,\n exitStatus: runResult.status,\n stdin: runResult.stdin,\n stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n });\n\n await cleanWorkingDirectory(cwd, cwdSnapshot);\n if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return { allAccepted: false };\n }\n\n return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\n}\n\nfunction runBuild(\n buildCommand: readonly [string, ...string[]],\n context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n const spawnResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n context.limits.buildTimeoutSeconds\n );\n const exitStatus = spawnResult.status ?? undefined;\n\n if (spawnResult.status !== 0) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n if (\n spawnResult.stdout.length > context.limits.maxOutputLength ||\n spawnResult.stderr.length > context.limits.maxOutputLength\n ) {\n return {\n testCaseId: context.testCaseId,\n decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n exitStatus,\n stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n }\n\n return;\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n id: string;\n input?: string;\n fileInputPath?: string;\n fileOutputPath?: string;\n output?: string;\n}): BaseCommandTestCase {\n return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n problemDir: string\n): Promise<readonly TTestCase[]> {\n const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n if (fileTestCases.shared?.fileInputPath) {\n return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n }\n return commandTestCases;\n}\n\nfunction runCommand(\n command: readonly [string, ...string[]],\n context: {\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n }\n): CommandRunResult {\n const spawnResult = spawnSyncWithTimeout(\n command[0],\n command.slice(1),\n { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n context.timeLimitSeconds\n );\n\n return {\n stdin: context.stdin,\n stdout: spawnResult.stdout,\n stderr: spawnResult.stderr,\n status: spawnResult.status ?? undefined,\n timeSeconds: spawnResult.timeSeconds,\n memoryBytes: spawnResult.memoryBytes,\n };\n}\n\nfunction evaluateByLimits(context: {\n runResult: CommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n if (context.runResult.status !== 0) {\n return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n }\n\n if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n if (\n context.runResult.outputLimitExceeded ||\n context.runResult.stdout.length > context.context.outputLimitLength ||\n context.runResult.stderr.length > context.context.outputLimitLength\n ) {\n return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n }\n\n const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFileCount) {\n return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"names":["judgeParamsSchema","z","object","language","union","string","array","optional","commandJudgePreset","_x","_x2","_commandJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","args","params","_yield$resolveCwds","cwds","isDebugMode","_iterator","_step","resolvedCwd","result","_t","w","_context","p","n","parseArgs","process","argv","parse","resolveCwds","cwd","v","_createForOfIteratorHelper","s","done","value","printDebugCwdBanner","runCommandJudgeForCwd","matchesExpectedResult","exitCode","printDebugExpectationFailureBanner","e","f","a","_x3","_x4","_x5","_x6","_runCommandJudgeForCwd","_callee2","_options$readTestCase","_testCases$0$id","_testCases$","_options$limits$build","_options$limits","_options$limits$maxOu","_options$limits2","_options$runTimeoutSe","_languageDefinition$b","_shared","problemMarkdownFrontMatter","testCases","prebuildTestCaseId","limits","runTimeoutSeconds","staticAnalysisResult","originalMainFilePath","languageDefinition","env","mainFilePath","prebuiltMainFilePath","buildCommand","buildResult","cwdSnapshot","sharedFileInputPath","_iterator2","_step2","_testCase$input","_problemMarkdownFront","_judgeResult$stderr","testCase","timeLimitSeconds","command","stdin","runResult","outputFiles","judgeContext","baseJudgeResult","judgeResult","_options$test","extendedJudgeResult","_extendedJudgeResult$","_t2","_t3","_t4","_t5","_t6","_context2","readProblemMarkdownFrontMatter","readTestCases","readCommandTestCases","id","buildTimeoutSeconds","maxOutputLength","judgeByStaticAnalysis","printTestCaseResult","_objectSpread","testCaseId","allAccepted","findEntryPointFile","decisionCode","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","stderr","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","prebuild","BUILD_ERROR","Error","message","String","call","runBuild","snapshotWorkingDirectory","length","ACCEPTED","shared","fileInputPath","copyTestCaseFileInput","timeLimitMs","input","resolveInput","runCommand","RUNTIME_ERROR","errorToMessage","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","outputLimitLength","memoryLimitByte","evaluateByLimits","context","test","feedbackMarkdown","exitStatus","status","stdout","slice","undefined","timeSeconds","memoryBytes","expectedResult","_spawnResult$status","spawnResult","spawnSyncWithTimeout","encoding","BUILD_TIME_LIMIT_EXCEEDED","BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED","error","_x7","_readCommandTestCases","_callee3","_fileTestCases$shared","fileTestCases","commandTestCases","_context3","readFileTestCases","path","join","map","Object","assign","_spawnResult$status2","_context$context$prob","_context$context$prob2","_context$context$prob3","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","outputLimitExceeded","OUTPUT_SIZE_LIMIT_EXCEEDED","requiredOutputFileCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exercode/problem-utils",
3
- "version": "1.11.4",
3
+ "version": "1.13.0",
4
4
  "description": ":100: A set of utilities for judging programs on Exercode (https://exercode.willbooster.com/).",
5
5
  "keywords": [
6
6
  "exercode",
@@ -40,7 +40,7 @@
40
40
  "lint": "oxlint --no-error-on-unmatched-pattern .",
41
41
  "lint-fix": "yarn lint --fix",
42
42
  "prepare": "lefthook install || true",
43
- "prettify": "prettier --cache --color --no-error-on-unmatched-pattern --write \"**/{.*/,}*.{java}\" \"!**/test{-,/}fixtures/**\" || true",
43
+ "prettify": "prettier --cache --no-error-on-unmatched-pattern --write \"**/{.*/,}*.{java}\" \"!**/test{-,/}fixtures/**\" || true",
44
44
  "start": "build-ts run src/index.ts",
45
45
  "test": "rm -fr temp && dotenv -c test -- vitest test",
46
46
  "test/ci-setup": "yarn build && bun install --cwd example",
@@ -68,12 +68,12 @@
68
68
  "@willbooster/oxlint-config": "1.4.6",
69
69
  "@willbooster/prettier-config": "10.4.0",
70
70
  "@willbooster/wb": "13.15.2",
71
- "build-ts": "17.1.13",
71
+ "build-ts": "17.1.15",
72
72
  "conventional-changelog-conventionalcommits": "9.3.1",
73
73
  "dotenv-cli": "11.0.0",
74
74
  "lefthook": "2.1.6",
75
- "oxfmt": "0.49.0",
76
- "oxlint": "1.64.0",
75
+ "oxfmt": "0.50.0",
76
+ "oxlint": "1.65.0",
77
77
  "oxlint-tsgolint": "0.22.1",
78
78
  "prettier": "3.8.3",
79
79
  "prettier-plugin-java": "2.8.1",