@exercode/problem-utils 1.16.6 → 1.16.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  2. package/dist/helpers/checkProblemDirIsolation.cjs +2 -2
  3. package/dist/helpers/checkProblemDirIsolation.cjs.map +1 -1
  4. package/dist/helpers/checkProblemDirIsolation.js +2 -2
  5. package/dist/helpers/checkProblemDirIsolation.js.map +1 -1
  6. package/dist/helpers/cleanWorkingDirectory.cjs +2 -2
  7. package/dist/helpers/cleanWorkingDirectory.cjs.map +1 -1
  8. package/dist/helpers/cleanWorkingDirectory.js +2 -2
  9. package/dist/helpers/cleanWorkingDirectory.js.map +1 -1
  10. package/dist/helpers/compareStdoutAsSpaceSeparatedTokens.cjs +2 -2
  11. package/dist/helpers/compareStdoutAsSpaceSeparatedTokens.cjs.map +1 -1
  12. package/dist/helpers/compareStdoutAsSpaceSeparatedTokens.js +2 -2
  13. package/dist/helpers/compareStdoutAsSpaceSeparatedTokens.js.map +1 -1
  14. package/dist/helpers/copyTestCaseFileInput.cjs +2 -2
  15. package/dist/helpers/copyTestCaseFileInput.cjs.map +1 -1
  16. package/dist/helpers/copyTestCaseFileInput.js +2 -2
  17. package/dist/helpers/copyTestCaseFileInput.js.map +1 -1
  18. package/dist/helpers/findEntryPointFile.cjs +2 -2
  19. package/dist/helpers/findEntryPointFile.cjs.map +1 -1
  20. package/dist/helpers/findEntryPointFile.js +2 -2
  21. package/dist/helpers/findEntryPointFile.js.map +1 -1
  22. package/dist/helpers/findLanguageDefinitionByPath.cjs +2 -2
  23. package/dist/helpers/findLanguageDefinitionByPath.cjs.map +1 -1
  24. package/dist/helpers/findLanguageDefinitionByPath.js +2 -2
  25. package/dist/helpers/findLanguageDefinitionByPath.js.map +1 -1
  26. package/dist/helpers/findModelAnswerDirs.cjs +2 -2
  27. package/dist/helpers/findModelAnswerDirs.cjs.map +1 -1
  28. package/dist/helpers/findModelAnswerDirs.js +2 -2
  29. package/dist/helpers/findModelAnswerDirs.js.map +1 -1
  30. package/dist/helpers/judgeByStaticAnalysis.cjs +19 -2
  31. package/dist/helpers/judgeByStaticAnalysis.cjs.map +1 -1
  32. package/dist/helpers/judgeByStaticAnalysis.js +19 -2
  33. package/dist/helpers/judgeByStaticAnalysis.js.map +1 -1
  34. package/dist/helpers/parseArgs.cjs +2 -2
  35. package/dist/helpers/parseArgs.cjs.map +1 -1
  36. package/dist/helpers/parseArgs.js +2 -2
  37. package/dist/helpers/parseArgs.js.map +1 -1
  38. package/dist/helpers/printDebugBanner.cjs +3 -2
  39. package/dist/helpers/printDebugBanner.cjs.map +1 -1
  40. package/dist/helpers/printDebugBanner.js +3 -2
  41. package/dist/helpers/printDebugBanner.js.map +1 -1
  42. package/dist/helpers/printTestCaseResult.cjs +2 -2
  43. package/dist/helpers/printTestCaseResult.cjs.map +1 -1
  44. package/dist/helpers/printTestCaseResult.js +2 -2
  45. package/dist/helpers/printTestCaseResult.js.map +1 -1
  46. package/dist/helpers/readOutputFiles.cjs +2 -2
  47. package/dist/helpers/readOutputFiles.cjs.map +1 -1
  48. package/dist/helpers/readOutputFiles.js +2 -2
  49. package/dist/helpers/readOutputFiles.js.map +1 -1
  50. package/dist/helpers/readProblemMarkdownFrontMatter.cjs +2 -2
  51. package/dist/helpers/readProblemMarkdownFrontMatter.cjs.map +1 -1
  52. package/dist/helpers/readProblemMarkdownFrontMatter.js +2 -2
  53. package/dist/helpers/readProblemMarkdownFrontMatter.js.map +1 -1
  54. package/dist/helpers/readTestCases.cjs +2 -2
  55. package/dist/helpers/readTestCases.cjs.map +1 -1
  56. package/dist/helpers/readTestCases.js +2 -2
  57. package/dist/helpers/readTestCases.js.map +1 -1
  58. package/dist/helpers/removeCommentsInSourceCode.cjs +6 -2
  59. package/dist/helpers/removeCommentsInSourceCode.cjs.map +1 -1
  60. package/dist/helpers/removeCommentsInSourceCode.js +6 -2
  61. package/dist/helpers/removeCommentsInSourceCode.js.map +1 -1
  62. package/dist/helpers/resolveCwds.cjs +2 -2
  63. package/dist/helpers/resolveCwds.cjs.map +1 -1
  64. package/dist/helpers/resolveCwds.js +2 -2
  65. package/dist/helpers/resolveCwds.js.map +1 -1
  66. package/dist/helpers/runCommandInTemporaryPackageManagerProject.cjs +2 -2
  67. package/dist/helpers/runCommandInTemporaryPackageManagerProject.cjs.map +1 -1
  68. package/dist/helpers/runCommandInTemporaryPackageManagerProject.js +2 -2
  69. package/dist/helpers/runCommandInTemporaryPackageManagerProject.js.map +1 -1
  70. package/dist/helpers/runPythonInTemporaryUvProject.cjs +2 -2
  71. package/dist/helpers/runPythonInTemporaryUvProject.cjs.map +1 -1
  72. package/dist/helpers/runPythonInTemporaryUvProject.js +2 -2
  73. package/dist/helpers/runPythonInTemporaryUvProject.js.map +1 -1
  74. package/dist/helpers/sourceCodeGrammars.cjs +2 -2
  75. package/dist/helpers/sourceCodeGrammars.cjs.map +1 -1
  76. package/dist/helpers/sourceCodeGrammars.js +2 -2
  77. package/dist/helpers/sourceCodeGrammars.js.map +1 -1
  78. package/dist/helpers/spawnSyncWithTimeout.cjs +2 -2
  79. package/dist/helpers/spawnSyncWithTimeout.cjs.map +1 -1
  80. package/dist/helpers/spawnSyncWithTimeout.js +2 -2
  81. package/dist/helpers/spawnSyncWithTimeout.js.map +1 -1
  82. package/dist/helpers/startHttpServer.cjs +2 -2
  83. package/dist/helpers/startHttpServer.cjs.map +1 -1
  84. package/dist/helpers/startHttpServer.js +2 -2
  85. package/dist/helpers/startHttpServer.js.map +1 -1
  86. package/dist/index.cjs +1 -2
  87. package/dist/index.js +1 -2
  88. package/dist/presets/command.cjs +2 -2
  89. package/dist/presets/command.cjs.map +1 -1
  90. package/dist/presets/command.js +2 -2
  91. package/dist/presets/command.js.map +1 -1
  92. package/dist/presets/guiCommand.cjs +4 -2
  93. package/dist/presets/guiCommand.cjs.map +1 -1
  94. package/dist/presets/guiCommand.js +4 -2
  95. package/dist/presets/guiCommand.js.map +1 -1
  96. package/dist/presets/llm.cjs +2 -2
  97. package/dist/presets/llm.cjs.map +1 -1
  98. package/dist/presets/llm.js +2 -2
  99. package/dist/presets/llm.js.map +1 -1
  100. package/dist/presets/stdio.cjs +2 -2
  101. package/dist/presets/stdio.cjs.map +1 -1
  102. package/dist/presets/stdio.js +2 -2
  103. package/dist/presets/stdio.js.map +1 -1
  104. package/dist/types/decisionCode.cjs +2 -2
  105. package/dist/types/decisionCode.cjs.map +1 -1
  106. package/dist/types/decisionCode.js +2 -2
  107. package/dist/types/decisionCode.js.map +1 -1
  108. package/dist/types/language.cjs +11 -2
  109. package/dist/types/language.cjs.map +1 -1
  110. package/dist/types/language.js +11 -2
  111. package/dist/types/language.js.map +1 -1
  112. package/dist/types/problem.cjs +2 -2
  113. package/dist/types/problem.cjs.map +1 -1
  114. package/dist/types/problem.js +2 -2
  115. package/dist/types/problem.js.map +1 -1
  116. package/dist/types/testCaseResult.cjs +2 -2
  117. package/dist/types/testCaseResult.cjs.map +1 -1
  118. package/dist/types/testCaseResult.js +2 -2
  119. package/dist/types/testCaseResult.js.map +1 -1
  120. package/package.json +14 -14
  121. package/dist/_virtual/_rollupPluginBabelHelpers.cjs +0 -4
  122. package/dist/_virtual/_rollupPluginBabelHelpers.cjs.map +0 -1
  123. package/dist/_virtual/_rollupPluginBabelHelpers.js +0 -4
  124. package/dist/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  125. package/dist/index.cjs.map +0 -1
  126. package/dist/index.js.map +0 -1
@@ -1 +1 @@
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
+ {"version":3,"file":"removeCommentsInSourceCode.cjs","names":[],"sources":["../../src/helpers/removeCommentsInSourceCode.ts"],"sourcesContent":["import type { LanguageDefinition } from '../types/language.js';\n\nexport type SourceCodeGrammar = NonNullable<LanguageDefinition['grammer']>;\n\n/** Removes comments from source code according to the provided language grammar. */\nexport function removeCommentsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: false });\n}\n\n/** Removes comments and string literal contents while preserving executable interpolation expressions. */\nexport function removeCommentsAndStringsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: true });\n}\n\ninterface CommentOrStringGrammar {\n closeRegExp: RegExp;\n isComment: boolean;\n openRegExp: RegExp;\n}\n\nfunction removeCommentsAndMaybeStringsInSourceCode(\n grammar: SourceCodeGrammar,\n sourceCode: string,\n options: { removeStrings: boolean },\n commentOrStringGrammars = compileCommentOrStringGrammars(grammar)\n): string {\n if (!grammar.comments?.length && (!options.removeStrings || !grammar.strings?.length)) return sourceCode;\n\n const newSourceCodeSlices: string[] = [];\n\n let lastIndex = 0;\n\n while (lastIndex < sourceCode.length) {\n let first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined;\n\n for (const commentOrStringGrammer of commentOrStringGrammars) {\n const startRegExp = commentOrStringGrammer.openRegExp;\n startRegExp.lastIndex = lastIndex;\n\n const match = startRegExp.exec(sourceCode);\n\n if (match && shouldPreferMatch(match, commentOrStringGrammer, first, options)) {\n first = { grammar: commentOrStringGrammer, match };\n }\n }\n\n if (first) {\n let stringPrefixStartIndex = first.match.index;\n if (!first.grammar.isComment && options.removeStrings) {\n stringPrefixStartIndex = getPythonStringPrefixStartIndex(sourceCode, first.match.index);\n }\n newSourceCodeSlices.push(sourceCode.slice(lastIndex, stringPrefixStartIndex));\n\n if (!first.grammar.isComment) {\n lastIndex = findStringEndIndex(sourceCode, first.match.index, first.grammar);\n const stringLiteral = sourceCode.slice(first.match.index, lastIndex);\n if (options.removeStrings) {\n newSourceCodeSlices.push(\n preserveStringInterpolationExpressions(\n grammar,\n commentOrStringGrammars,\n sourceCode,\n first.match.index,\n stringLiteral\n )\n );\n } else {\n newSourceCodeSlices.push(stringLiteral);\n }\n } else {\n const closeRegExp = first.grammar.closeRegExp;\n closeRegExp.lastIndex = first.match.index + first.match[0].length;\n\n const match = closeRegExp.exec(sourceCode);\n\n lastIndex = match ? match.index + match[0].length : sourceCode.length;\n }\n } else {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex));\n lastIndex = sourceCode.length;\n }\n }\n\n return newSourceCodeSlices.join('');\n}\n\nfunction compileCommentOrStringGrammars(grammar: SourceCodeGrammar): readonly CommentOrStringGrammar[] {\n return [\n ...(grammar.comments?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close ?? /(?=\\n)/g),\n isComment: true,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ...(grammar.strings?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close),\n isComment: false,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ] satisfies CommentOrStringGrammar[];\n}\n\nfunction shouldPreferMatch(\n match: RegExpExecArray,\n grammar: CommentOrStringGrammar,\n first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined,\n options: { removeStrings: boolean }\n): boolean {\n if (!first) return true;\n if (match.index < first.match.index) return true;\n if (match.index > first.match.index) return false;\n return options.removeStrings && first.grammar.isComment && !grammar.isComment;\n}\n\nfunction makeGlobalRegExp(regExp: RegExp): RegExp {\n return new RegExp(regExp, regExp.flags.includes('g') ? regExp.flags : `${regExp.flags}g`);\n}\n\nfunction findStringEndIndex(sourceCode: string, stringStartIndex: number, grammar: CommentOrStringGrammar): number {\n if (sourceCode[stringStartIndex] === '`') return findJavaScriptTemplateEndIndex(sourceCode, stringStartIndex);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return findPythonFStringEndIndex(sourceCode, stringStartIndex);\n\n const closeRegExp = grammar.closeRegExp;\n closeRegExp.lastIndex = stringStartIndex + 1;\n const match = closeRegExp.exec(sourceCode);\n return match ? match.index + match[0].length : sourceCode.length;\n}\n\nfunction findJavaScriptTemplateEndIndex(sourceCode: string, stringStartIndex: number): number {\n let index = stringStartIndex + 1;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '`') return index + 1;\n if (sourceCode[index] === '$' && sourceCode[index + 1] === '{') {\n index = readBalancedExpression(sourceCode, index + 2, '}', { slashStartsRegExp: true }).endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return sourceCode.length;\n}\n\nfunction findPythonFStringEndIndex(sourceCode: string, stringStartIndex: number): number {\n const quote = getStringQuote(sourceCode, stringStartIndex);\n let index = stringStartIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n if (sourceCode[index] === '{' && sourceCode[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '{') {\n index = readBalancedExpression(sourceCode, index + 1, '}', { slashStartsRegExp: false }).endIndex + 1;\n continue;\n }\n index += sourceCode[index] === '\\\\' ? 2 : 1;\n }\n\n return sourceCode.length;\n}\n\nfunction getStringQuote(sourceCode: string, stringStartIndex: number): string {\n const threeCharacterQuote = sourceCode.slice(stringStartIndex, stringStartIndex + 3);\n if (threeCharacterQuote === \"'''\" || threeCharacterQuote === '\"\"\"') return threeCharacterQuote;\n return sourceCode[stringStartIndex] ?? '';\n}\n\nfunction getPythonStringPrefixStartIndex(sourceCode: string, stringStartIndex: number): number {\n const prefix = getPythonStringPrefix(sourceCode, stringStartIndex);\n return prefix ? stringStartIndex - prefix.length : stringStartIndex;\n}\n\nfunction getPythonStringPrefix(sourceCode: string, stringStartIndex: number): string | undefined {\n if (sourceCode[stringStartIndex] !== '\"' && sourceCode[stringStartIndex] !== \"'\") return undefined;\n let index = stringStartIndex - 1;\n while (index >= 0 && /[A-Za-z]/.test(sourceCode[index] ?? '')) index -= 1;\n\n const prefix = sourceCode.slice(index + 1, stringStartIndex);\n if (!prefix || !/^[bfru]+$/i.test(prefix)) return undefined;\n if (index >= 0 && /[\\dA-Za-z_]/.test(sourceCode[index] ?? '')) return undefined;\n\n return prefix;\n}\n\nfunction preserveStringInterpolationExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n sourceCode: string,\n stringStartIndex: number,\n stringLiteral: string\n): string {\n if (stringLiteral.startsWith('`'))\n return preserveJavaScriptTemplateExpressions(grammar, commentOrStringGrammars, stringLiteral);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return preservePythonFStringExpressions(grammar, commentOrStringGrammars, stringLiteral);\n return '';\n}\n\nfunction hasPythonFStringPrefix(sourceCode: string, stringStartIndex: number): boolean {\n return getPythonStringPrefix(sourceCode, stringStartIndex)?.toLowerCase().includes('f') ?? false;\n}\n\nfunction preserveJavaScriptTemplateExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const expressions: string[] = [];\n let index = 1;\n\n while (index < stringLiteral.length - 1) {\n if (stringLiteral[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '$' && stringLiteral[index + 1] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 2, '}', { slashStartsRegExp: true });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction preservePythonFStringExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const quoteLength = getStringQuote(stringLiteral, 0).length;\n const expressions: string[] = [];\n let index = quoteLength;\n\n while (index < stringLiteral.length - quoteLength) {\n if (stringLiteral[index] === '{' && stringLiteral[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 1, '}', { slashStartsRegExp: false });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += stringLiteral[index] === '\\\\' ? 2 : 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction readBalancedExpression(\n sourceCode: string,\n startIndex: number,\n closeChar: string,\n options: { slashStartsRegExp: boolean }\n): { content: string; endIndex: number } {\n let depth = 1;\n let index = startIndex;\n\n while (index < sourceCode.length) {\n const char = sourceCode[index];\n if (char === '\"' || char === \"'\" || char === '`') {\n index = skipQuotedSpan(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '/') {\n index = skipJavaScriptSingleLineComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '*') {\n index = skipJavaScriptBlockComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && char === '/') {\n index = skipJavaScriptRegExpLiteral(sourceCode, index);\n continue;\n }\n if (char === '{') depth += 1;\n if (char === closeChar) {\n depth -= 1;\n if (depth === 0) return { content: sourceCode.slice(startIndex, index), endIndex: index };\n }\n index += 1;\n }\n\n return { content: sourceCode.slice(startIndex), endIndex: sourceCode.length };\n}\n\nfunction skipQuotedSpan(sourceCode: string, startIndex: number): number {\n const quote = getStringQuote(sourceCode, startIndex);\n let index = startIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n index += 1;\n }\n\n return index;\n}\n\nfunction skipJavaScriptRegExpLiteral(sourceCode: string, startIndex: number): number {\n let index = startIndex + 1;\n let inCharacterClass = false;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '[') inCharacterClass = true;\n if (sourceCode[index] === ']') inCharacterClass = false;\n if (sourceCode[index] === '/' && !inCharacterClass) {\n index += 1;\n while (/[A-Za-z]/.test(sourceCode[index] ?? '')) index += 1;\n return index;\n }\n if (sourceCode[index] === '\\n') return startIndex + 1;\n index += 1;\n }\n\n return startIndex + 1;\n}\n\nfunction skipJavaScriptSingleLineComment(sourceCode: string, startIndex: number): number {\n const newLineIndex = sourceCode.indexOf('\\n', startIndex + 2);\n return newLineIndex === -1 ? sourceCode.length : newLineIndex;\n}\n\nfunction skipJavaScriptBlockComment(sourceCode: string, startIndex: number): number {\n const endIndex = sourceCode.indexOf('*/', startIndex + 2);\n return endIndex === -1 ? sourceCode.length : endIndex + 2;\n}\n"],"mappings":"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"}
@@ -1,2 +1,6 @@
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
- //# sourceMappingURL=removeCommentsInSourceCode.js.map
1
+ function e(e,t){return n(e,t,{removeStrings:!1})}function t(e,t){return n(e,t,{removeStrings:!0})}function n(e,t,n,a=r(e)){if(!e.comments?.length&&(!n.removeStrings||!e.strings?.length))return t;let s=[],c=0;for(;c<t.length;){let r;for(let e of a){let a=e.openRegExp;a.lastIndex=c;let o=a.exec(t);o&&i(o,e,r,n)&&(r={grammar:e,match:o})}if(r){let i=r.match.index;if(!r.grammar.isComment&&n.removeStrings&&(i=u(t,r.match.index)),s.push(t.slice(c,i)),r.grammar.isComment){let e=r.grammar.closeRegExp;e.lastIndex=r.match.index+r.match[0].length;let n=e.exec(t);c=n?n.index+n[0].length:t.length}else{c=o(t,r.match.index,r.grammar);let i=t.slice(r.match.index,c);n.removeStrings?s.push(f(e,a,t,r.match.index,i)):s.push(i)}}else s.push(t.slice(c)),c=t.length}return s.join(``)}function r(e){return[...e.comments?.map(e=>({closeRegExp:a(e.close??/(?=\n)/g),isComment:!0,openRegExp:a(e.open)}))??[],...e.strings?.map(e=>({closeRegExp:a(e.close),isComment:!1,openRegExp:a(e.open)}))??[]]}function i(e,t,n,r){return!n||e.index<n.match.index?!0:e.index>n.match.index?!1:r.removeStrings&&n.grammar.isComment&&!t.isComment}function a(e){return new RegExp(e,e.flags.includes(`g`)?e.flags:`${e.flags}g`)}function o(e,t,n){if(e[t]==="`")return s(e,t);if(p(e,t))return c(e,t);let r=n.closeRegExp;r.lastIndex=t+1;let i=r.exec(e);return i?i.index+i[0].length:e.length}function s(e,t){let n=t+1;for(;n<e.length;){if(e[n]===`\\`){n+=2;continue}if(e[n]==="`")return n+1;if(e[n]===`$`&&e[n+1]===`{`){n=g(e,n+2,`}`,{slashStartsRegExp:!0}).endIndex+1;continue}n+=1}return e.length}function c(e,t){let n=l(e,t),r=t+n.length;for(;r<e.length;){if(e.startsWith(n,r))return r+n.length;if(e[r]===`{`&&e[r+1]===`{`){r+=2;continue}if(e[r]===`{`){r=g(e,r+1,`}`,{slashStartsRegExp:!1}).endIndex+1;continue}r+=e[r]===`\\`?2:1}return e.length}function l(e,t){let n=e.slice(t,t+3);return n===`'''`||n===`"""`?n:e[t]??``}function u(e,t){let n=d(e,t);return n?t-n.length:t}function d(e,t){if(e[t]!==`"`&&e[t]!==`'`)return;let n=t-1;for(;n>=0&&/[A-Za-z]/.test(e[n]??``);)--n;let r=e.slice(n+1,t);if(!(!r||!/^[bfru]+$/i.test(r))&&!(n>=0&&/[\dA-Za-z_]/.test(e[n]??``)))return r}function f(e,t,n,r,i){return i.startsWith("`")?m(e,t,i):p(n,r)?h(e,t,i):``}function p(e,t){return d(e,t)?.toLowerCase().includes(`f`)??!1}function m(e,t,r){let i=[],a=1;for(;a<r.length-1;){if(r[a]===`\\`){a+=2;continue}if(r[a]===`$`&&r[a+1]===`{`){let o=g(r,a+2,`}`,{slashStartsRegExp:!0});i.push(n(e,o.content,{removeStrings:!0},t)),a=o.endIndex+1;continue}a+=1}return i.join(`
2
+ `)}function h(e,t,r){let i=l(r,0).length,a=[],o=i;for(;o<r.length-i;){if(r[o]===`{`&&r[o+1]===`{`){o+=2;continue}if(r[o]===`{`){let i=g(r,o+1,`}`,{slashStartsRegExp:!1});a.push(n(e,i.content,{removeStrings:!0},t)),o=i.endIndex+1;continue}o+=r[o]===`\\`?2:1}return a.join(`
3
+ `)}function g(e,t,n,r){let i=1,a=t;for(;a<e.length;){let o=e[a];if(o===`"`||o===`'`||o==="`"){a=_(e,a);continue}if(r.slashStartsRegExp&&e[a]===`/`&&e[a+1]===`/`){a=y(e,a);continue}if(r.slashStartsRegExp&&e[a]===`/`&&e[a+1]===`*`){a=b(e,a);continue}if(r.slashStartsRegExp&&o===`/`){a=v(e,a);continue}if(o===`{`&&(i+=1),o===n&&(--i,i===0))return{content:e.slice(t,a),endIndex:a};a+=1}return{content:e.slice(t),endIndex:e.length}}function _(e,t){let n=l(e,t),r=t+n.length;for(;r<e.length;){if(e[r]===`\\`){r+=2;continue}if(e.startsWith(n,r))return r+n.length;r+=1}return r}function v(e,t){let n=t+1,r=!1;for(;n<e.length;){if(e[n]===`\\`){n+=2;continue}if(e[n]===`[`&&(r=!0),e[n]===`]`&&(r=!1),e[n]===`/`&&!r){for(n+=1;/[A-Za-z]/.test(e[n]??``);)n+=1;return n}if(e[n]===`
4
+ `)return t+1;n+=1}return t+1}function y(e,t){let n=e.indexOf(`
5
+ `,t+2);return n===-1?e.length:n}function b(e,t){let n=e.indexOf(`*/`,t+2);return n===-1?e.length:n+2}export{t as removeCommentsAndStringsInSourceCode,e as removeCommentsInSourceCode};
6
+ //# 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 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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"}
1
+ {"version":3,"file":"removeCommentsInSourceCode.js","names":[],"sources":["../../src/helpers/removeCommentsInSourceCode.ts"],"sourcesContent":["import type { LanguageDefinition } from '../types/language.js';\n\nexport type SourceCodeGrammar = NonNullable<LanguageDefinition['grammer']>;\n\n/** Removes comments from source code according to the provided language grammar. */\nexport function removeCommentsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: false });\n}\n\n/** Removes comments and string literal contents while preserving executable interpolation expressions. */\nexport function removeCommentsAndStringsInSourceCode(grammar: SourceCodeGrammar, sourceCode: string): string {\n return removeCommentsAndMaybeStringsInSourceCode(grammar, sourceCode, { removeStrings: true });\n}\n\ninterface CommentOrStringGrammar {\n closeRegExp: RegExp;\n isComment: boolean;\n openRegExp: RegExp;\n}\n\nfunction removeCommentsAndMaybeStringsInSourceCode(\n grammar: SourceCodeGrammar,\n sourceCode: string,\n options: { removeStrings: boolean },\n commentOrStringGrammars = compileCommentOrStringGrammars(grammar)\n): string {\n if (!grammar.comments?.length && (!options.removeStrings || !grammar.strings?.length)) return sourceCode;\n\n const newSourceCodeSlices: string[] = [];\n\n let lastIndex = 0;\n\n while (lastIndex < sourceCode.length) {\n let first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined;\n\n for (const commentOrStringGrammer of commentOrStringGrammars) {\n const startRegExp = commentOrStringGrammer.openRegExp;\n startRegExp.lastIndex = lastIndex;\n\n const match = startRegExp.exec(sourceCode);\n\n if (match && shouldPreferMatch(match, commentOrStringGrammer, first, options)) {\n first = { grammar: commentOrStringGrammer, match };\n }\n }\n\n if (first) {\n let stringPrefixStartIndex = first.match.index;\n if (!first.grammar.isComment && options.removeStrings) {\n stringPrefixStartIndex = getPythonStringPrefixStartIndex(sourceCode, first.match.index);\n }\n newSourceCodeSlices.push(sourceCode.slice(lastIndex, stringPrefixStartIndex));\n\n if (!first.grammar.isComment) {\n lastIndex = findStringEndIndex(sourceCode, first.match.index, first.grammar);\n const stringLiteral = sourceCode.slice(first.match.index, lastIndex);\n if (options.removeStrings) {\n newSourceCodeSlices.push(\n preserveStringInterpolationExpressions(\n grammar,\n commentOrStringGrammars,\n sourceCode,\n first.match.index,\n stringLiteral\n )\n );\n } else {\n newSourceCodeSlices.push(stringLiteral);\n }\n } else {\n const closeRegExp = first.grammar.closeRegExp;\n closeRegExp.lastIndex = first.match.index + first.match[0].length;\n\n const match = closeRegExp.exec(sourceCode);\n\n lastIndex = match ? match.index + match[0].length : sourceCode.length;\n }\n } else {\n newSourceCodeSlices.push(sourceCode.slice(lastIndex));\n lastIndex = sourceCode.length;\n }\n }\n\n return newSourceCodeSlices.join('');\n}\n\nfunction compileCommentOrStringGrammars(grammar: SourceCodeGrammar): readonly CommentOrStringGrammar[] {\n return [\n ...(grammar.comments?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close ?? /(?=\\n)/g),\n isComment: true,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ...(grammar.strings?.map((v) => ({\n closeRegExp: makeGlobalRegExp(v.close),\n isComment: false,\n openRegExp: makeGlobalRegExp(v.open),\n })) ?? []),\n ] satisfies CommentOrStringGrammar[];\n}\n\nfunction shouldPreferMatch(\n match: RegExpExecArray,\n grammar: CommentOrStringGrammar,\n first: { grammar: CommentOrStringGrammar; match: RegExpExecArray } | undefined,\n options: { removeStrings: boolean }\n): boolean {\n if (!first) return true;\n if (match.index < first.match.index) return true;\n if (match.index > first.match.index) return false;\n return options.removeStrings && first.grammar.isComment && !grammar.isComment;\n}\n\nfunction makeGlobalRegExp(regExp: RegExp): RegExp {\n return new RegExp(regExp, regExp.flags.includes('g') ? regExp.flags : `${regExp.flags}g`);\n}\n\nfunction findStringEndIndex(sourceCode: string, stringStartIndex: number, grammar: CommentOrStringGrammar): number {\n if (sourceCode[stringStartIndex] === '`') return findJavaScriptTemplateEndIndex(sourceCode, stringStartIndex);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return findPythonFStringEndIndex(sourceCode, stringStartIndex);\n\n const closeRegExp = grammar.closeRegExp;\n closeRegExp.lastIndex = stringStartIndex + 1;\n const match = closeRegExp.exec(sourceCode);\n return match ? match.index + match[0].length : sourceCode.length;\n}\n\nfunction findJavaScriptTemplateEndIndex(sourceCode: string, stringStartIndex: number): number {\n let index = stringStartIndex + 1;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '`') return index + 1;\n if (sourceCode[index] === '$' && sourceCode[index + 1] === '{') {\n index = readBalancedExpression(sourceCode, index + 2, '}', { slashStartsRegExp: true }).endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return sourceCode.length;\n}\n\nfunction findPythonFStringEndIndex(sourceCode: string, stringStartIndex: number): number {\n const quote = getStringQuote(sourceCode, stringStartIndex);\n let index = stringStartIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n if (sourceCode[index] === '{' && sourceCode[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '{') {\n index = readBalancedExpression(sourceCode, index + 1, '}', { slashStartsRegExp: false }).endIndex + 1;\n continue;\n }\n index += sourceCode[index] === '\\\\' ? 2 : 1;\n }\n\n return sourceCode.length;\n}\n\nfunction getStringQuote(sourceCode: string, stringStartIndex: number): string {\n const threeCharacterQuote = sourceCode.slice(stringStartIndex, stringStartIndex + 3);\n if (threeCharacterQuote === \"'''\" || threeCharacterQuote === '\"\"\"') return threeCharacterQuote;\n return sourceCode[stringStartIndex] ?? '';\n}\n\nfunction getPythonStringPrefixStartIndex(sourceCode: string, stringStartIndex: number): number {\n const prefix = getPythonStringPrefix(sourceCode, stringStartIndex);\n return prefix ? stringStartIndex - prefix.length : stringStartIndex;\n}\n\nfunction getPythonStringPrefix(sourceCode: string, stringStartIndex: number): string | undefined {\n if (sourceCode[stringStartIndex] !== '\"' && sourceCode[stringStartIndex] !== \"'\") return undefined;\n let index = stringStartIndex - 1;\n while (index >= 0 && /[A-Za-z]/.test(sourceCode[index] ?? '')) index -= 1;\n\n const prefix = sourceCode.slice(index + 1, stringStartIndex);\n if (!prefix || !/^[bfru]+$/i.test(prefix)) return undefined;\n if (index >= 0 && /[\\dA-Za-z_]/.test(sourceCode[index] ?? '')) return undefined;\n\n return prefix;\n}\n\nfunction preserveStringInterpolationExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n sourceCode: string,\n stringStartIndex: number,\n stringLiteral: string\n): string {\n if (stringLiteral.startsWith('`'))\n return preserveJavaScriptTemplateExpressions(grammar, commentOrStringGrammars, stringLiteral);\n if (hasPythonFStringPrefix(sourceCode, stringStartIndex))\n return preservePythonFStringExpressions(grammar, commentOrStringGrammars, stringLiteral);\n return '';\n}\n\nfunction hasPythonFStringPrefix(sourceCode: string, stringStartIndex: number): boolean {\n return getPythonStringPrefix(sourceCode, stringStartIndex)?.toLowerCase().includes('f') ?? false;\n}\n\nfunction preserveJavaScriptTemplateExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const expressions: string[] = [];\n let index = 1;\n\n while (index < stringLiteral.length - 1) {\n if (stringLiteral[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '$' && stringLiteral[index + 1] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 2, '}', { slashStartsRegExp: true });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction preservePythonFStringExpressions(\n grammar: SourceCodeGrammar,\n commentOrStringGrammars: readonly CommentOrStringGrammar[],\n stringLiteral: string\n): string {\n const quoteLength = getStringQuote(stringLiteral, 0).length;\n const expressions: string[] = [];\n let index = quoteLength;\n\n while (index < stringLiteral.length - quoteLength) {\n if (stringLiteral[index] === '{' && stringLiteral[index + 1] === '{') {\n index += 2;\n continue;\n }\n if (stringLiteral[index] === '{') {\n const expression = readBalancedExpression(stringLiteral, index + 1, '}', { slashStartsRegExp: false });\n expressions.push(\n removeCommentsAndMaybeStringsInSourceCode(\n grammar,\n expression.content,\n { removeStrings: true },\n commentOrStringGrammars\n )\n );\n index = expression.endIndex + 1;\n continue;\n }\n index += stringLiteral[index] === '\\\\' ? 2 : 1;\n }\n\n return expressions.join('\\n');\n}\n\nfunction readBalancedExpression(\n sourceCode: string,\n startIndex: number,\n closeChar: string,\n options: { slashStartsRegExp: boolean }\n): { content: string; endIndex: number } {\n let depth = 1;\n let index = startIndex;\n\n while (index < sourceCode.length) {\n const char = sourceCode[index];\n if (char === '\"' || char === \"'\" || char === '`') {\n index = skipQuotedSpan(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '/') {\n index = skipJavaScriptSingleLineComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && sourceCode[index] === '/' && sourceCode[index + 1] === '*') {\n index = skipJavaScriptBlockComment(sourceCode, index);\n continue;\n }\n if (options.slashStartsRegExp && char === '/') {\n index = skipJavaScriptRegExpLiteral(sourceCode, index);\n continue;\n }\n if (char === '{') depth += 1;\n if (char === closeChar) {\n depth -= 1;\n if (depth === 0) return { content: sourceCode.slice(startIndex, index), endIndex: index };\n }\n index += 1;\n }\n\n return { content: sourceCode.slice(startIndex), endIndex: sourceCode.length };\n}\n\nfunction skipQuotedSpan(sourceCode: string, startIndex: number): number {\n const quote = getStringQuote(sourceCode, startIndex);\n let index = startIndex + quote.length;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode.startsWith(quote, index)) return index + quote.length;\n index += 1;\n }\n\n return index;\n}\n\nfunction skipJavaScriptRegExpLiteral(sourceCode: string, startIndex: number): number {\n let index = startIndex + 1;\n let inCharacterClass = false;\n\n while (index < sourceCode.length) {\n if (sourceCode[index] === '\\\\') {\n index += 2;\n continue;\n }\n if (sourceCode[index] === '[') inCharacterClass = true;\n if (sourceCode[index] === ']') inCharacterClass = false;\n if (sourceCode[index] === '/' && !inCharacterClass) {\n index += 1;\n while (/[A-Za-z]/.test(sourceCode[index] ?? '')) index += 1;\n return index;\n }\n if (sourceCode[index] === '\\n') return startIndex + 1;\n index += 1;\n }\n\n return startIndex + 1;\n}\n\nfunction skipJavaScriptSingleLineComment(sourceCode: string, startIndex: number): number {\n const newLineIndex = sourceCode.indexOf('\\n', startIndex + 2);\n return newLineIndex === -1 ? sourceCode.length : newLineIndex;\n}\n\nfunction skipJavaScriptBlockComment(sourceCode: string, startIndex: number): number {\n const endIndex = sourceCode.indexOf('*/', startIndex + 2);\n return endIndex === -1 ? sourceCode.length : endIndex + 2;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),n=require("node:path"),r=require("./findModelAnswerDirs.cjs"),t=require("./printDebugBanner.cjs");function a(){return(a=e.asyncToGenerator(e.regenerator().m(function a(o,s){var i,u,d,l,p,g,w,b;return e.regenerator().w(function(a){for(;;)switch(a.n){case 0:if(!s){a.n=1;break}return a.a(2,{cwds:[{cwd:s,expectedResult:"accepted"}],isDebugMode:!1});case 1:return a.n=2,Promise.all([r.findModelAnswerDirs(o),r.findFailingModelAnswerDirs(o)]);case 2:if(d=a.v,l=e.slicedToArray(d,2),p=l[0],g=l[1],0!==p.length||0!==g.length){a.n=3;break}throw new Error("cwd argument required (no model answer directories found in ".concat(n.join(o,r.MODEL_ANSWERS_DIRNAME)," or ").concat(n.join(o,r.FAILING_MODEL_ANSWERS_DIRNAME),")"));case 3:return w=c(),b=n.relative(o,null!=(i=null!=(u=p[0])?u:g[0])?i:"")||"<model_answer>",t.printDebugBanner(["[DEBUG MODE] cwd not provided -- judging against all model answers","","Problem dir : ".concat(o),"Model answers (".concat(p.length,"):")].concat(e.toConsumableArray(p.map(function(e){return" - ".concat(n.relative(o,e))})),["Failing model answers (".concat(g.length,"):")],e.toConsumableArray(g.map(function(e){return" - ".concat(n.relative(o,e))})),["","To judge a single cwd (e.g., a user submission), pass it as the first argument:"," bun ".concat(w," <cwd> [params-json]"),"For example:"," bun ".concat(w," ").concat(b)," bun ".concat(w," ").concat(b,' \'{"language":"python"}\'')])),a.a(2,{cwds:[].concat(e.toConsumableArray(p.map(function(e){return{cwd:e,expectedResult:"accepted"}})),e.toConsumableArray(g.map(function(e){return{cwd:e,expectedResult:"rejected"}}))),isDebugMode:!0})}},a)}))).apply(this,arguments)}function c(){var e=process.argv[1];return e?n.basename(e):"judge.ts"}exports.printDebugCwdBanner=function(e,r){var a=n.relative(e,r.cwd)||r.cwd,o=c();t.printDebugBanner(["[DEBUG MODE] judging: ".concat(a),"Expected result: ".concat(r.expectedResult),"","To judge only this cwd as a normal submission:"," bun ".concat(o," ").concat(a),"Run without a cwd to check debug-mode expectations."])},exports.printDebugExpectationFailureBanner=function(e,r){var a=n.relative(e,r.cwd)||r.cwd;t.printDebugBanner(["[DEBUG MODE] expectation failed: ".concat(a),"Expected result: ".concat(r.expectedResult),"accepted"===r.expectedResult?"The model answer was rejected by the judge.":"The failing model answer was accepted by the judge."])},exports.resolveCwds=function(e,n){return a.apply(this,arguments)};
2
- //# sourceMappingURL=resolveCwds.cjs.map
1
+ "use strict";const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("./printDebugBanner.cjs"),n=require("./findModelAnswerDirs.cjs");let r=require("node:path");r=e.__toESM(r,1);async function i(e,i){if(i)return{cwds:[{cwd:i,expectedResult:`accepted`}],isDebugMode:!1};let[a,o]=await Promise.all([n.findModelAnswerDirs(e),n.findFailingModelAnswerDirs(e)]);if(a.length===0&&o.length===0)throw Error(`cwd argument required (no model answer directories found in ${r.default.join(e,n.MODEL_ANSWERS_DIRNAME)} or ${r.default.join(e,n.FAILING_MODEL_ANSWERS_DIRNAME)})`);let c=s(),l=r.default.relative(e,a[0]??o[0]??``)||`<model_answer>`;return t.printDebugBanner([`[DEBUG MODE] cwd not provided -- judging against all model answers`,``,`Problem dir : ${e}`,`Model answers (${a.length}):`,...a.map(t=>` - ${r.default.relative(e,t)}`),`Failing model answers (${o.length}):`,...o.map(t=>` - ${r.default.relative(e,t)}`),``,`To judge a single cwd (e.g., a user submission), pass it as the first argument:`,` bun ${c} <cwd> [params-json]`,`For example:`,` bun ${c} ${l}`,` bun ${c} ${l} '{"language":"python"}'`]),{cwds:[...a.map(e=>({cwd:e,expectedResult:`accepted`})),...o.map(e=>({cwd:e,expectedResult:`rejected`}))],isDebugMode:!0}}function a(e,n){let i=r.default.relative(e,n.cwd)||n.cwd,a=s();t.printDebugBanner([`[DEBUG MODE] judging: ${i}`,`Expected result: ${n.expectedResult}`,``,`To judge only this cwd as a normal submission:`,` bun ${a} ${i}`,`Run without a cwd to check debug-mode expectations.`])}function o(e,n){t.printDebugBanner([`[DEBUG MODE] expectation failed: ${r.default.relative(e,n.cwd)||n.cwd}`,`Expected result: ${n.expectedResult}`,n.expectedResult===`accepted`?`The model answer was rejected by the judge.`:`The failing model answer was accepted by the judge.`])}function s(){let e=process.argv[1];return e?r.default.basename(e):`judge.ts`}exports.printDebugCwdBanner=a,exports.printDebugExpectationFailureBanner=o,exports.resolveCwds=i;
2
+ //# sourceMappingURL=resolveCwds.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveCwds.cjs","sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n FAILING_MODEL_ANSWERS_DIRNAME,\n MODEL_ANSWERS_DIRNAME,\n findFailingModelAnswerDirs,\n findModelAnswerDirs,\n} from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport type ExpectedJudgeResult = 'accepted' | 'rejected';\n\nexport interface ResolvedCwd {\n cwd: string;\n expectedResult: ExpectedJudgeResult;\n}\n\nexport interface ResolvedCwds {\n cwds: readonly ResolvedCwd[];\n isDebugMode: boolean;\n}\n\n/**\n * Resolve which working directories to judge.\n *\n * - If `cwdArg` is provided, use it as the single cwd.\n * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and\n * `<problemDir>/model_answers.fails/*` and judge each.\n * A prominent banner is printed so users can tell at a glance that this is a debug run.\n *\n * @throws if `cwdArg` is missing and no model answer directories are found.\n */\nexport async function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds> {\n if (cwdArg) return { cwds: [{ cwd: cwdArg, expectedResult: 'accepted' }], isDebugMode: false };\n\n const [modelAnswerDirs, failingModelAnswerDirs] = await Promise.all([\n findModelAnswerDirs(problemDir),\n findFailingModelAnswerDirs(problemDir),\n ]);\n if (modelAnswerDirs.length === 0 && failingModelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, MODEL_ANSWERS_DIRNAME)} or ${path.join(problemDir, FAILING_MODEL_ANSWERS_DIRNAME)})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer =\n path.relative(problemDir, modelAnswerDirs[0] ?? failingModelAnswerDirs[0] ?? '') || '<model_answer>';\n printDebugBanner([\n '[DEBUG MODE] cwd not provided -- judging against all model answers',\n '',\n `Problem dir : ${problemDir}`,\n `Model answers (${modelAnswerDirs.length}):`,\n ...modelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n `Failing model answers (${failingModelAnswerDirs.length}):`,\n ...failingModelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n '',\n 'To judge a single cwd (e.g., a user submission), pass it as the first argument:',\n ` bun ${scriptName} <cwd> [params-json]`,\n 'For example:',\n ` bun ${scriptName} ${exampleAnswer}`,\n ` bun ${scriptName} ${exampleAnswer} '{\"language\":\"python\"}'`,\n ]);\n\n return {\n cwds: [\n ...modelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'accepted' as const })),\n ...failingModelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'rejected' as const })),\n ],\n isDebugMode: true,\n };\n}\n\n/**\n * Print a per-cwd banner shown before judging each model answer in debug mode.\n * Includes the command for re-running this single cwd.\n */\nexport function printDebugCwdBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n '',\n 'To judge only this cwd as a normal submission:',\n ` bun ${scriptName} ${relativeCwd}`,\n 'Run without a cwd to check debug-mode expectations.',\n ]);\n}\n\nexport function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n printDebugBanner([\n `[DEBUG MODE] expectation failed: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n resolvedCwd.expectedResult === 'accepted'\n ? 'The model answer was rejected by the judge.'\n : 'The failing model answer was accepted by the judge.',\n ]);\n}\n\nfunction getInvokedScriptName(): string {\n const scriptPath = process.argv[1];\n return scriptPath ? path.basename(scriptPath) : 'judge.ts';\n}\n"],"names":["_resolveCwds","_asyncToGenerator","_regenerator","m","_callee","problemDir","cwdArg","_ref","_modelAnswerDirs$","_yield$Promise$all","_yield$Promise$all2","modelAnswerDirs","failingModelAnswerDirs","scriptName","exampleAnswer","w","_context","n","a","cwds","cwd","expectedResult","isDebugMode","Promise","all","findModelAnswerDirs","findFailingModelAnswerDirs","v","_slicedToArray","length","Error","concat","path","join","MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME","getInvokedScriptName","relative","printDebugBanner","_toConsumableArray","map","dir","apply","this","arguments","scriptPath","process","argv","basename","resolvedCwd","relativeCwd","_x","_x2"],"mappings":"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"}
1
+ {"version":3,"file":"resolveCwds.cjs","names":["findModelAnswerDirs","findFailingModelAnswerDirs","path","MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME"],"sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n FAILING_MODEL_ANSWERS_DIRNAME,\n MODEL_ANSWERS_DIRNAME,\n findFailingModelAnswerDirs,\n findModelAnswerDirs,\n} from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport type ExpectedJudgeResult = 'accepted' | 'rejected';\n\nexport interface ResolvedCwd {\n cwd: string;\n expectedResult: ExpectedJudgeResult;\n}\n\nexport interface ResolvedCwds {\n cwds: readonly ResolvedCwd[];\n isDebugMode: boolean;\n}\n\n/**\n * Resolve which working directories to judge.\n *\n * - If `cwdArg` is provided, use it as the single cwd.\n * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and\n * `<problemDir>/model_answers.fails/*` and judge each.\n * A prominent banner is printed so users can tell at a glance that this is a debug run.\n *\n * @throws if `cwdArg` is missing and no model answer directories are found.\n */\nexport async function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds> {\n if (cwdArg) return { cwds: [{ cwd: cwdArg, expectedResult: 'accepted' }], isDebugMode: false };\n\n const [modelAnswerDirs, failingModelAnswerDirs] = await Promise.all([\n findModelAnswerDirs(problemDir),\n findFailingModelAnswerDirs(problemDir),\n ]);\n if (modelAnswerDirs.length === 0 && failingModelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, MODEL_ANSWERS_DIRNAME)} or ${path.join(problemDir, FAILING_MODEL_ANSWERS_DIRNAME)})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer =\n path.relative(problemDir, modelAnswerDirs[0] ?? failingModelAnswerDirs[0] ?? '') || '<model_answer>';\n printDebugBanner([\n '[DEBUG MODE] cwd not provided -- judging against all model answers',\n '',\n `Problem dir : ${problemDir}`,\n `Model answers (${modelAnswerDirs.length}):`,\n ...modelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n `Failing model answers (${failingModelAnswerDirs.length}):`,\n ...failingModelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n '',\n 'To judge a single cwd (e.g., a user submission), pass it as the first argument:',\n ` bun ${scriptName} <cwd> [params-json]`,\n 'For example:',\n ` bun ${scriptName} ${exampleAnswer}`,\n ` bun ${scriptName} ${exampleAnswer} '{\"language\":\"python\"}'`,\n ]);\n\n return {\n cwds: [\n ...modelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'accepted' as const })),\n ...failingModelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'rejected' as const })),\n ],\n isDebugMode: true,\n };\n}\n\n/**\n * Print a per-cwd banner shown before judging each model answer in debug mode.\n * Includes the command for re-running this single cwd.\n */\nexport function printDebugCwdBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n '',\n 'To judge only this cwd as a normal submission:',\n ` bun ${scriptName} ${relativeCwd}`,\n 'Run without a cwd to check debug-mode expectations.',\n ]);\n}\n\nexport function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n printDebugBanner([\n `[DEBUG MODE] expectation failed: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n resolvedCwd.expectedResult === 'accepted'\n ? 'The model answer was rejected by the judge.'\n : 'The failing model answer was accepted by the judge.',\n ]);\n}\n\nfunction getInvokedScriptName(): string {\n const scriptPath = process.argv[1];\n return scriptPath ? path.basename(scriptPath) : 'judge.ts';\n}\n"],"mappings":"yLAgCA,eAAsB,EAAY,EAAoB,EAAmD,CACvG,GAAI,EAAQ,MAAO,CAAE,KAAM,CAAC,CAAE,IAAK,EAAQ,eAAgB,UAAW,CAAC,EAAG,YAAa,EAAM,EAE7F,GAAM,CAAC,EAAiB,GAA0B,MAAM,QAAQ,IAAI,CAClEA,EAAAA,oBAAoB,CAAU,EAC9BC,EAAAA,2BAA2B,CAAU,CACvC,CAAC,EACD,GAAI,EAAgB,SAAW,GAAK,EAAuB,SAAW,EACpE,MAAU,MACR,+DAA+DC,EAAAA,QAAK,KAAK,EAAYC,EAAAA,qBAAqB,EAAE,MAAMD,EAAAA,QAAK,KAAK,EAAYE,EAAAA,6BAA6B,EAAE,EACzK,EAGF,IAAM,EAAa,EAAqB,EAClC,EACJF,EAAAA,QAAK,SAAS,EAAY,EAAgB,IAAM,EAAuB,IAAM,EAAE,GAAK,iBAiBtF,OAhBA,EAAA,iBAAiB,CACf,qEACA,GACA,iBAAiB,IACjB,kBAAkB,EAAgB,OAAO,IACzC,GAAG,EAAgB,IAAK,GAAQ,OAAOA,EAAAA,QAAK,SAAS,EAAY,CAAG,GAAG,EACvE,0BAA0B,EAAuB,OAAO,IACxD,GAAG,EAAuB,IAAK,GAAQ,OAAOA,EAAAA,QAAK,SAAS,EAAY,CAAG,GAAG,EAC9E,GACA,kFACA,SAAS,EAAW,sBACpB,eACA,SAAS,EAAW,GAAG,IACvB,SAAS,EAAW,GAAG,EAAc,yBACvC,CAAC,EAEM,CACL,KAAM,CACJ,GAAG,EAAgB,IAAK,IAAS,CAAE,MAAK,eAAgB,UAAoB,EAAE,EAC9E,GAAG,EAAuB,IAAK,IAAS,CAAE,MAAK,eAAgB,UAAoB,EAAE,CACvF,EACA,YAAa,EACf,CACF,CAMA,SAAgB,EAAoB,EAAoB,EAAgC,CACtF,IAAM,EAAcA,EAAAA,QAAK,SAAS,EAAY,EAAY,GAAG,GAAK,EAAY,IACxE,EAAa,EAAqB,EACxC,EAAA,iBAAiB,CACf,yBAAyB,IACzB,oBAAoB,EAAY,iBAChC,GACA,iDACA,SAAS,EAAW,GAAG,IACvB,qDACF,CAAC,CACH,CAEA,SAAgB,EAAmC,EAAoB,EAAgC,CAErG,EAAA,iBAAiB,CACf,oCAFkBA,EAAAA,QAAK,SAAS,EAAY,EAAY,GAAG,GAAK,EAAY,MAG5E,oBAAoB,EAAY,iBAChC,EAAY,iBAAmB,WAC3B,8CACA,qDACN,CAAC,CACH,CAEA,SAAS,GAA+B,CACtC,IAAM,EAAa,QAAQ,KAAK,GAChC,OAAO,EAAaA,EAAAA,QAAK,SAAS,CAAU,EAAI,UAClD"}
@@ -1,2 +1,2 @@
1
- import{asyncToGenerator as e,regenerator as n,toConsumableArray as t,slicedToArray as a}from"../_virtual/_rollupPluginBabelHelpers.js";import c from"node:path";import{MODEL_ANSWERS_DIRNAME as r,FAILING_MODEL_ANSWERS_DIRNAME as o,findModelAnswerDirs as s,findFailingModelAnswerDirs as i}from"./findModelAnswerDirs.js";import{printDebugBanner as u}from"./printDebugBanner.js";function d(e,n){return l.apply(this,arguments)}function l(){return(l=e(n().m(function e(d,l){var p,m,g,f,b,h,j,v;return n().w(function(e){for(;;)switch(e.n){case 0:if(!l){e.n=1;break}return e.a(2,{cwds:[{cwd:l,expectedResult:"accepted"}],isDebugMode:!1});case 1:return e.n=2,Promise.all([s(d),i(d)]);case 2:if(g=e.v,f=a(g,2),b=f[0],h=f[1],0!==b.length||0!==h.length){e.n=3;break}throw new Error("cwd argument required (no model answer directories found in ".concat(c.join(d,r)," or ").concat(c.join(d,o),")"));case 3:return j=w(),v=c.relative(d,null!=(p=null!=(m=b[0])?m:h[0])?p:"")||"<model_answer>",u(["[DEBUG MODE] cwd not provided -- judging against all model answers","","Problem dir : ".concat(d),"Model answers (".concat(b.length,"):")].concat(t(b.map(function(e){return" - ".concat(c.relative(d,e))})),["Failing model answers (".concat(h.length,"):")],t(h.map(function(e){return" - ".concat(c.relative(d,e))})),["","To judge a single cwd (e.g., a user submission), pass it as the first argument:"," bun ".concat(j," <cwd> [params-json]"),"For example:"," bun ".concat(j," ").concat(v)," bun ".concat(j," ").concat(v,' \'{"language":"python"}\'')])),e.a(2,{cwds:[].concat(t(b.map(function(e){return{cwd:e,expectedResult:"accepted"}})),t(h.map(function(e){return{cwd:e,expectedResult:"rejected"}}))),isDebugMode:!0})}},e)}))).apply(this,arguments)}function p(e,n){var t=c.relative(e,n.cwd)||n.cwd,a=w();u(["[DEBUG MODE] judging: ".concat(t),"Expected result: ".concat(n.expectedResult),"","To judge only this cwd as a normal submission:"," bun ".concat(a," ").concat(t),"Run without a cwd to check debug-mode expectations."])}function m(e,n){var t=c.relative(e,n.cwd)||n.cwd;u(["[DEBUG MODE] expectation failed: ".concat(t),"Expected result: ".concat(n.expectedResult),"accepted"===n.expectedResult?"The model answer was rejected by the judge.":"The failing model answer was accepted by the judge."])}function w(){var e=process.argv[1];return e?c.basename(e):"judge.ts"}export{p as printDebugCwdBanner,m as printDebugExpectationFailureBanner,d as resolveCwds};
2
- //# sourceMappingURL=resolveCwds.js.map
1
+ import{printDebugBanner as e}from"./printDebugBanner.js";import{FAILING_MODEL_ANSWERS_DIRNAME as t,MODEL_ANSWERS_DIRNAME as n,findFailingModelAnswerDirs as r,findModelAnswerDirs as i}from"./findModelAnswerDirs.js";import a from"node:path";async function o(o,s){if(s)return{cwds:[{cwd:s,expectedResult:`accepted`}],isDebugMode:!1};let[c,u]=await Promise.all([i(o),r(o)]);if(c.length===0&&u.length===0)throw Error(`cwd argument required (no model answer directories found in ${a.join(o,n)} or ${a.join(o,t)})`);let d=l(),f=a.relative(o,c[0]??u[0]??``)||`<model_answer>`;return e([`[DEBUG MODE] cwd not provided -- judging against all model answers`,``,`Problem dir : ${o}`,`Model answers (${c.length}):`,...c.map(e=>` - ${a.relative(o,e)}`),`Failing model answers (${u.length}):`,...u.map(e=>` - ${a.relative(o,e)}`),``,`To judge a single cwd (e.g., a user submission), pass it as the first argument:`,` bun ${d} <cwd> [params-json]`,`For example:`,` bun ${d} ${f}`,` bun ${d} ${f} '{"language":"python"}'`]),{cwds:[...c.map(e=>({cwd:e,expectedResult:`accepted`})),...u.map(e=>({cwd:e,expectedResult:`rejected`}))],isDebugMode:!0}}function s(t,n){let r=a.relative(t,n.cwd)||n.cwd,i=l();e([`[DEBUG MODE] judging: ${r}`,`Expected result: ${n.expectedResult}`,``,`To judge only this cwd as a normal submission:`,` bun ${i} ${r}`,`Run without a cwd to check debug-mode expectations.`])}function c(t,n){e([`[DEBUG MODE] expectation failed: ${a.relative(t,n.cwd)||n.cwd}`,`Expected result: ${n.expectedResult}`,n.expectedResult===`accepted`?`The model answer was rejected by the judge.`:`The failing model answer was accepted by the judge.`])}function l(){let e=process.argv[1];return e?a.basename(e):`judge.ts`}export{s as printDebugCwdBanner,c as printDebugExpectationFailureBanner,o as resolveCwds};
2
+ //# sourceMappingURL=resolveCwds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveCwds.js","sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n FAILING_MODEL_ANSWERS_DIRNAME,\n MODEL_ANSWERS_DIRNAME,\n findFailingModelAnswerDirs,\n findModelAnswerDirs,\n} from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport type ExpectedJudgeResult = 'accepted' | 'rejected';\n\nexport interface ResolvedCwd {\n cwd: string;\n expectedResult: ExpectedJudgeResult;\n}\n\nexport interface ResolvedCwds {\n cwds: readonly ResolvedCwd[];\n isDebugMode: boolean;\n}\n\n/**\n * Resolve which working directories to judge.\n *\n * - If `cwdArg` is provided, use it as the single cwd.\n * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and\n * `<problemDir>/model_answers.fails/*` and judge each.\n * A prominent banner is printed so users can tell at a glance that this is a debug run.\n *\n * @throws if `cwdArg` is missing and no model answer directories are found.\n */\nexport async function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds> {\n if (cwdArg) return { cwds: [{ cwd: cwdArg, expectedResult: 'accepted' }], isDebugMode: false };\n\n const [modelAnswerDirs, failingModelAnswerDirs] = await Promise.all([\n findModelAnswerDirs(problemDir),\n findFailingModelAnswerDirs(problemDir),\n ]);\n if (modelAnswerDirs.length === 0 && failingModelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, MODEL_ANSWERS_DIRNAME)} or ${path.join(problemDir, FAILING_MODEL_ANSWERS_DIRNAME)})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer =\n path.relative(problemDir, modelAnswerDirs[0] ?? failingModelAnswerDirs[0] ?? '') || '<model_answer>';\n printDebugBanner([\n '[DEBUG MODE] cwd not provided -- judging against all model answers',\n '',\n `Problem dir : ${problemDir}`,\n `Model answers (${modelAnswerDirs.length}):`,\n ...modelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n `Failing model answers (${failingModelAnswerDirs.length}):`,\n ...failingModelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n '',\n 'To judge a single cwd (e.g., a user submission), pass it as the first argument:',\n ` bun ${scriptName} <cwd> [params-json]`,\n 'For example:',\n ` bun ${scriptName} ${exampleAnswer}`,\n ` bun ${scriptName} ${exampleAnswer} '{\"language\":\"python\"}'`,\n ]);\n\n return {\n cwds: [\n ...modelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'accepted' as const })),\n ...failingModelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'rejected' as const })),\n ],\n isDebugMode: true,\n };\n}\n\n/**\n * Print a per-cwd banner shown before judging each model answer in debug mode.\n * Includes the command for re-running this single cwd.\n */\nexport function printDebugCwdBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n '',\n 'To judge only this cwd as a normal submission:',\n ` bun ${scriptName} ${relativeCwd}`,\n 'Run without a cwd to check debug-mode expectations.',\n ]);\n}\n\nexport function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n printDebugBanner([\n `[DEBUG MODE] expectation failed: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n resolvedCwd.expectedResult === 'accepted'\n ? 'The model answer was rejected by the judge.'\n : 'The failing model answer was accepted by the judge.',\n ]);\n}\n\nfunction getInvokedScriptName(): string {\n const scriptPath = process.argv[1];\n return scriptPath ? path.basename(scriptPath) : 'judge.ts';\n}\n"],"names":["resolveCwds","_x","_x2","_resolveCwds","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","cwdArg","_ref","_modelAnswerDirs$","_yield$Promise$all","_yield$Promise$all2","modelAnswerDirs","failingModelAnswerDirs","scriptName","exampleAnswer","w","_context","n","a","cwds","cwd","expectedResult","isDebugMode","Promise","all","findModelAnswerDirs","findFailingModelAnswerDirs","v","_slicedToArray","length","Error","concat","path","join","MODEL_ANSWERS_DIRNAME","FAILING_MODEL_ANSWERS_DIRNAME","getInvokedScriptName","relative","printDebugBanner","_toConsumableArray","map","dir","printDebugCwdBanner","resolvedCwd","relativeCwd","printDebugExpectationFailureBanner","scriptPath","process","argv","basename"],"mappings":"sXAgCA,SAAsBA,EAAWC,EAAAC,GAAA,OAAAC,EAAAC,MAAAC,KAAAC,UAAA,CAyCjC,SAAAH,IAFC,OAEDA,EAAAI,EAAAC,IAAAC,EAzCO,SAAAC,EAA2BC,EAAoBC,GAA0B,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAZ,IAAAa,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,IAC1EX,EAAM,CAAAU,EAAAC,EAAA,EAAA,KAAA,CAAA,OAAAD,EAAAE,EAAA,EAAS,CAAEC,KAAM,CAAC,CAAEC,IAAKd,EAAQe,eAAgB,aAAeC,aAAa,IAAO,KAAA,EAAA,OAAAN,EAAAC,EAAA,EAEtCM,QAAQC,IAAI,CAClEC,EAAoBpB,GACpBqB,EAA2BrB,KAC3B,KAAA,EAH4C,GAG5CI,EAAAO,EAAAW,EAAAjB,EAAAkB,EAAAnB,EAAA,GAHKE,EAAeD,EAAA,GAAEE,EAAsBF,EAAA,GAIf,IAA3BC,EAAgBkB,QAAkD,IAAlCjB,EAAuBiB,OAAY,CAAAb,EAAAC,EAAA,EAAA,KAAA,CAAA,MAC/D,IAAIa,MAAK,+DAAAC,OACkDC,EAAKC,KAAK5B,EAAY6B,GAAsB,QAAAH,OAAOC,EAAKC,KAAK5B,EAAY8B,GAA8B,MACvK,KAAA,EAoBA,OAjBGtB,EAAauB,IACbtB,EACJkB,EAAKK,SAAShC,EAA2D,OAAjDE,EAAoB,OAApBC,EAAEG,EAAgB,IAAEH,EAAII,EAAuB,IAAEL,EAAI,KAAO,iBACtF+B,EAAgB,CACd,qEACA,GAAE,iBAAAP,OACe1B,GAAU,kBAAA0B,OACTpB,EAAgBkB,OAAM,OAAAE,OAAAQ,EACrC5B,EAAgB6B,IAAI,SAACC,GAAG,MAAA,OAAAV,OAAYC,EAAKK,SAAShC,EAAYoC,GAAI,IAAG,CAAA,0BAAAV,OAC9CnB,EAAuBiB,OAAM,OAAAU,EACpD3B,EAAuB4B,IAAI,SAACC,GAAG,MAAA,OAAAV,OAAYC,EAAKK,SAAShC,EAAYoC,GAAI,IAAG,CAC/E,GACA,kFAAiF,SAAAV,OACxElB,EAAU,wBACnB,eAAc,SAAAkB,OACLlB,EAAU,KAAAkB,OAAIjB,GAAa,SAAAiB,OAC3BlB,EAAU,KAAAkB,OAAIjB,EAAa,iCACnCE,EAAAE,EAAA,EAEI,CACLC,KAAI,GAAAY,OAAAQ,EACC5B,EAAgB6B,IAAI,SAACpB,GAAG,MAAM,CAAEA,IAAAA,EAAKC,eAAgB,WAAqB,IAAEkB,EAC5E3B,EAAuB4B,IAAI,SAACpB,GAAG,MAAM,CAAEA,IAAAA,EAAKC,eAAgB,WAAqB,KAEtFC,aAAa,IACd,EAAAlB,EAAA,KACFN,MAAAC,KAAAC,UAAA,CAMM,SAAS0C,EAAoBrC,EAAoBsC,GACtD,IAAMC,EAAcZ,EAAKK,SAAShC,EAAYsC,EAAYvB,MAAQuB,EAAYvB,IACxEP,EAAauB,IACnBE,EAAiB,CAAA,yBAAAP,OACUa,GAAW,oBAAAb,OAChBY,EAAYtB,gBAChC,GACA,iDAAgD,SAAAU,OACvClB,EAAU,KAAAkB,OAAIa,GACvB,uDAEJ,CAEO,SAASC,EAAmCxC,EAAoBsC,GACrE,IAAMC,EAAcZ,EAAKK,SAAShC,EAAYsC,EAAYvB,MAAQuB,EAAYvB,IAC9EkB,EAAiB,qCAAAP,OACqBa,GAAW,oBAAAb,OAC3BY,EAAYtB,gBACD,aAA/BsB,EAAYtB,eACR,8CACA,uDAER,CAEA,SAASe,IACP,IAAMU,EAAaC,QAAQC,KAAK,GAChC,OAAOF,EAAad,EAAKiB,SAASH,GAAc,UAClD"}
1
+ {"version":3,"file":"resolveCwds.js","names":[],"sources":["../../src/helpers/resolveCwds.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n FAILING_MODEL_ANSWERS_DIRNAME,\n MODEL_ANSWERS_DIRNAME,\n findFailingModelAnswerDirs,\n findModelAnswerDirs,\n} from './findModelAnswerDirs.js';\nimport { printDebugBanner } from './printDebugBanner.js';\n\nexport type ExpectedJudgeResult = 'accepted' | 'rejected';\n\nexport interface ResolvedCwd {\n cwd: string;\n expectedResult: ExpectedJudgeResult;\n}\n\nexport interface ResolvedCwds {\n cwds: readonly ResolvedCwd[];\n isDebugMode: boolean;\n}\n\n/**\n * Resolve which working directories to judge.\n *\n * - If `cwdArg` is provided, use it as the single cwd.\n * - Otherwise (debug mode), enumerate `<problemDir>/model_answers/*` and\n * `<problemDir>/model_answers.fails/*` and judge each.\n * A prominent banner is printed so users can tell at a glance that this is a debug run.\n *\n * @throws if `cwdArg` is missing and no model answer directories are found.\n */\nexport async function resolveCwds(problemDir: string, cwdArg: string | undefined): Promise<ResolvedCwds> {\n if (cwdArg) return { cwds: [{ cwd: cwdArg, expectedResult: 'accepted' }], isDebugMode: false };\n\n const [modelAnswerDirs, failingModelAnswerDirs] = await Promise.all([\n findModelAnswerDirs(problemDir),\n findFailingModelAnswerDirs(problemDir),\n ]);\n if (modelAnswerDirs.length === 0 && failingModelAnswerDirs.length === 0) {\n throw new Error(\n `cwd argument required (no model answer directories found in ${path.join(problemDir, MODEL_ANSWERS_DIRNAME)} or ${path.join(problemDir, FAILING_MODEL_ANSWERS_DIRNAME)})`\n );\n }\n\n const scriptName = getInvokedScriptName();\n const exampleAnswer =\n path.relative(problemDir, modelAnswerDirs[0] ?? failingModelAnswerDirs[0] ?? '') || '<model_answer>';\n printDebugBanner([\n '[DEBUG MODE] cwd not provided -- judging against all model answers',\n '',\n `Problem dir : ${problemDir}`,\n `Model answers (${modelAnswerDirs.length}):`,\n ...modelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n `Failing model answers (${failingModelAnswerDirs.length}):`,\n ...failingModelAnswerDirs.map((dir) => ` - ${path.relative(problemDir, dir)}`),\n '',\n 'To judge a single cwd (e.g., a user submission), pass it as the first argument:',\n ` bun ${scriptName} <cwd> [params-json]`,\n 'For example:',\n ` bun ${scriptName} ${exampleAnswer}`,\n ` bun ${scriptName} ${exampleAnswer} '{\"language\":\"python\"}'`,\n ]);\n\n return {\n cwds: [\n ...modelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'accepted' as const })),\n ...failingModelAnswerDirs.map((cwd) => ({ cwd, expectedResult: 'rejected' as const })),\n ],\n isDebugMode: true,\n };\n}\n\n/**\n * Print a per-cwd banner shown before judging each model answer in debug mode.\n * Includes the command for re-running this single cwd.\n */\nexport function printDebugCwdBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n const scriptName = getInvokedScriptName();\n printDebugBanner([\n `[DEBUG MODE] judging: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n '',\n 'To judge only this cwd as a normal submission:',\n ` bun ${scriptName} ${relativeCwd}`,\n 'Run without a cwd to check debug-mode expectations.',\n ]);\n}\n\nexport function printDebugExpectationFailureBanner(problemDir: string, resolvedCwd: ResolvedCwd): void {\n const relativeCwd = path.relative(problemDir, resolvedCwd.cwd) || resolvedCwd.cwd;\n printDebugBanner([\n `[DEBUG MODE] expectation failed: ${relativeCwd}`,\n `Expected result: ${resolvedCwd.expectedResult}`,\n resolvedCwd.expectedResult === 'accepted'\n ? 'The model answer was rejected by the judge.'\n : 'The failing model answer was accepted by the judge.',\n ]);\n}\n\nfunction getInvokedScriptName(): string {\n const scriptPath = process.argv[1];\n return scriptPath ? path.basename(scriptPath) : 'judge.ts';\n}\n"],"mappings":"+OAgCA,eAAsB,EAAY,EAAoB,EAAmD,CACvG,GAAI,EAAQ,MAAO,CAAE,KAAM,CAAC,CAAE,IAAK,EAAQ,eAAgB,UAAW,CAAC,EAAG,YAAa,EAAM,EAE7F,GAAM,CAAC,EAAiB,GAA0B,MAAM,QAAQ,IAAI,CAClE,EAAoB,CAAU,EAC9B,EAA2B,CAAU,CACvC,CAAC,EACD,GAAI,EAAgB,SAAW,GAAK,EAAuB,SAAW,EACpE,MAAU,MACR,+DAA+D,EAAK,KAAK,EAAY,CAAqB,EAAE,MAAM,EAAK,KAAK,EAAY,CAA6B,EAAE,EACzK,EAGF,IAAM,EAAa,EAAqB,EAClC,EACJ,EAAK,SAAS,EAAY,EAAgB,IAAM,EAAuB,IAAM,EAAE,GAAK,iBAiBtF,OAhBA,EAAiB,CACf,qEACA,GACA,iBAAiB,IACjB,kBAAkB,EAAgB,OAAO,IACzC,GAAG,EAAgB,IAAK,GAAQ,OAAO,EAAK,SAAS,EAAY,CAAG,GAAG,EACvE,0BAA0B,EAAuB,OAAO,IACxD,GAAG,EAAuB,IAAK,GAAQ,OAAO,EAAK,SAAS,EAAY,CAAG,GAAG,EAC9E,GACA,kFACA,SAAS,EAAW,sBACpB,eACA,SAAS,EAAW,GAAG,IACvB,SAAS,EAAW,GAAG,EAAc,yBACvC,CAAC,EAEM,CACL,KAAM,CACJ,GAAG,EAAgB,IAAK,IAAS,CAAE,MAAK,eAAgB,UAAoB,EAAE,EAC9E,GAAG,EAAuB,IAAK,IAAS,CAAE,MAAK,eAAgB,UAAoB,EAAE,CACvF,EACA,YAAa,EACf,CACF,CAMA,SAAgB,EAAoB,EAAoB,EAAgC,CACtF,IAAM,EAAc,EAAK,SAAS,EAAY,EAAY,GAAG,GAAK,EAAY,IACxE,EAAa,EAAqB,EACxC,EAAiB,CACf,yBAAyB,IACzB,oBAAoB,EAAY,iBAChC,GACA,iDACA,SAAS,EAAW,GAAG,IACvB,qDACF,CAAC,CACH,CAEA,SAAgB,EAAmC,EAAoB,EAAgC,CAErG,EAAiB,CACf,oCAFkB,EAAK,SAAS,EAAY,EAAY,GAAG,GAAK,EAAY,MAG5E,oBAAoB,EAAY,iBAChC,EAAY,iBAAmB,WAC3B,8CACA,qDACN,CAAC,CACH,CAEA,SAAS,GAA+B,CACtC,IAAM,EAAa,QAAQ,KAAK,GAChC,OAAO,EAAa,EAAK,SAAS,CAAU,EAAI,UAClD"}
@@ -1,2 +1,2 @@
1
- "use strict";var e,n,r=require("../_virtual/_rollupPluginBabelHelpers.cjs"),t=require("node:child_process"),a=require("node:fs/promises"),o=require("node:os"),i=require("node:path"),c={bun:["package.json","bun.lock","bun.lockb"],cargo:["Cargo.toml","Cargo.lock"],go:["go.mod","go.sum"],gradle:["build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","gradle.lockfile","buildscript-gradle.lockfile","gradle","gradlew","gradlew.bat"],maven:["pom.xml",".mvn","mvnw","mvnw.cmd"],npm:["package.json","package-lock.json"],pnpm:["package.json","pnpm-lock.yaml","pnpm-workspace.yaml"],ruby:["Gemfile","Gemfile.lock",".ruby-version"],uv:["pyproject.toml","uv.lock"],yarn:["package.json","yarn.lock",".yarnrc",".yarnrc.yml",".yarn"]},s={bun:function(e){return m.apply(this,arguments)},cargo:function(e){return y.apply(this,arguments)},go:function(e){return g.apply(this,arguments)},gradle:function(e){return v.apply(this,arguments)},maven:function(e){return k.apply(this,arguments)},npm:function(e){return b.apply(this,arguments)},pnpm:function(e){return h.apply(this,arguments)},ruby:function(e){return w.apply(this,arguments)},uv:function(){return j.apply(this,arguments)},yarn:function(e){return S.apply(this,arguments)}},u=(e="darwin"===o.platform()?"gtime":"/usr/bin/time",(n=t.spawnSync(e,["--version"],{stdio:"ignore"})).error||0!==n.status?void 0:[e,"--format","%e %M"]);function l(){return l=r.asyncToGenerator(r.regenerator().m(function e(n){var t,c,s,u,l,m,y,g,v,k,b,h,w,j,S,T,L,G,B,E,x;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.n=1,a.mkdtemp(i.join(o.tmpdir(),null!=(t=n.tempDirPrefix)?t:"exercode-"));case 1:return c=e.v,e.p=2,e.n=3,a.cp(n.cwd,c,{recursive:!0});case 3:return e.n=4,P({packageManager:n.packageManager,projectDir:n.projectDir,runDir:c,projectFilePaths:n.projectFilePaths});case 4:return l=n.env?r.objectSpread2(r.objectSpread2({},process.env),n.env):process.env,e.n=5,d(n.packageManager,c);case 5:if(m=e.v,y="function"==typeof n.command?n.command({runDir:c}):n.command,g=Date.now(),v=null!=(s=n.outputLimitBytes)?s:52428800,!m){e.n=7;break}return e.n=6,q(m,{cwd:c,env:l,outputLimitBytes:v,stdin:"",timeLimitSeconds:n.timeLimitSeconds});case 6:if(!f(k=e.v)){e.n=7;break}return e.a(2,p({elapsedTimeSeconds:(Date.now()-g)/1e3,options:n,result:k}));case 7:if(!((b=n.timeLimitSeconds-(Date.now()-g)/1e3)<=0)){e.n=8;break}return e.a(2,{stdin:null!=(h=n.stdin)?h:"",stdout:null!=(w=null==(j=k)?void 0:j.stdout)?w:"",stderr:null!=(S=null==(T=k)?void 0:T.stderr)?S:"",status:0,timeSeconds:n.timeLimitSeconds+.001,memoryBytes:null!=(L=null==(G=k)?void 0:G.memoryBytes)?L:0,timedOut:!0,signal:null==(B=k)?void 0:B.signal,outputLimitExceeded:!1});case 8:return e.n=9,q(y,{cwd:c,env:l,outputLimitBytes:v,stdin:null!=(u=n.stdin)?u:"",timeLimitSeconds:b});case 9:if(E=e.v,x=(Date.now()-g)/1e3,!k){e.n=10;break}return e.a(2,p({elapsedTimeSeconds:x,options:n,result:r.objectSpread2(r.objectSpread2({},E),{},{timeSeconds:k.timeSeconds+E.timeSeconds,memoryBytes:Math.max(k.memoryBytes,E.memoryBytes)})}));case 10:return e.a(2,p({elapsedTimeSeconds:x,options:n,result:E}));case 11:return e.p=11,e.n=12,a.rm(c,{force:!0,recursive:!0});case 12:return e.f(11);case 13:return e.a(2)}},e,null,[[2,,11,13]])})),l.apply(this,arguments)}function p(e){var n;return{stdin:null!=(n=e.options.stdin)?n:"",stdout:e.result.stdout,stderr:e.result.stderr,status:e.result.timedOut||e.result.outputLimitExceeded?0:e.result.status,timeSeconds:e.result.timedOut?e.options.timeLimitSeconds+.001:e.result.timeSeconds||e.elapsedTimeSeconds,memoryBytes:e.result.memoryBytes,timedOut:e.result.timedOut,signal:e.result.signal,outputLimitExceeded:e.result.outputLimitExceeded}}function d(e,n){return s[e](n)}function f(e){return 0!==e.status||e.timedOut||e.outputLimitExceeded}function m(){return(m=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"package.json"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,G(n,["bun.lock","bun.lockb"]);case 3:if(!e.v){e.n=4;break}t=["bun","install","--frozen-lockfile","--silent"],e.n=5;break;case 4:t=["bun","install","--silent"];case 5:return e.a(2,t)}},e)}))).apply(this,arguments)}function y(){return(y=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"Cargo.toml"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,E(i.join(n,"Cargo.lock"));case 3:if(!e.v){e.n=4;break}t=["cargo","fetch","--locked"],e.n=5;break;case 4:t=["cargo","fetch"];case 5:return e.a(2,t)}},e)}))).apply(this,arguments)}function g(){return(g=r.asyncToGenerator(r.regenerator().m(function e(n){return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"go.mod"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.a(2,["go","mod","download"])}},e)}))).apply(this,arguments)}function v(){return(v=r.asyncToGenerator(r.regenerator().m(function e(n){var t,a,o;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,G(n,["build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradlew","gradlew.bat"]);case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:if(t=["--no-daemon","--quiet","dependencies"],"win32"!==process.platform){e.n=6;break}return e.n=3,E(i.join(n,"gradlew.bat"));case 3:if(!e.v){e.n=4;break}a=["cmd.exe","/c","gradlew.bat"].concat(t),e.n=5;break;case 4:a=["gradle"].concat(t);case 5:return e.a(2,a);case 6:return e.n=7,E(i.join(n,"gradlew"));case 7:if(!e.v){e.n=8;break}o=["sh","./gradlew"].concat(t),e.n=9;break;case 8:o=["gradle"].concat(t);case 9:return e.a(2,o)}},e)}))).apply(this,arguments)}function k(){return(k=r.asyncToGenerator(r.regenerator().m(function e(n){var t,a,o;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"pom.xml"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:if(t=["-q","dependency:go-offline"],"win32"!==process.platform){e.n=6;break}return e.n=3,E(i.join(n,"mvnw.cmd"));case 3:if(!e.v){e.n=4;break}a=["cmd.exe","/c","mvnw.cmd"].concat(t),e.n=5;break;case 4:a=["mvn"].concat(t);case 5:return e.a(2,a);case 6:return e.n=7,E(i.join(n,"mvnw"));case 7:if(!e.v){e.n=8;break}o=["sh","./mvnw"].concat(t),e.n=9;break;case 8:o=["mvn"].concat(t);case 9:return e.a(2,o)}},e)}))).apply(this,arguments)}function b(){return(b=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"package.json"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,E(i.join(n,"package-lock.json"));case 3:if(!e.v){e.n=4;break}t=["npm","ci","--silent"],e.n=5;break;case 4:t=["npm","install","--silent"];case 5:return e.a(2,t)}},e)}))).apply(this,arguments)}function h(){return(h=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"package.json"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,E(i.join(n,"pnpm-lock.yaml"));case 3:if(!e.v){e.n=4;break}t=["pnpm","install","--frozen-lockfile","--silent"],e.n=5;break;case 4:t=["pnpm","install","--silent"];case 5:return e.a(2,t)}},e)}))).apply(this,arguments)}function w(){return(w=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"Gemfile"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,E(i.join(n,"Gemfile.lock"));case 3:if(!e.v){e.n=4;break}t=["bundle","install","--frozen","--quiet"],e.n=5;break;case 4:t=["bundle","install","--quiet"];case 5:return e.a(2,t)}},e)}))).apply(this,arguments)}function j(){return(j=r.asyncToGenerator(r.regenerator().m(function e(){return r.regenerator().w(function(e){for(;;)if(0===e.n)return e.a(2,void 0)},e)}))).apply(this,arguments)}function S(){return(S=r.asyncToGenerator(r.regenerator().m(function e(n){var t,a;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,"package.json"));case 1:if(e.v){e.n=2;break}return e.a(2,void 0);case 2:return e.n=3,T(n);case 3:return t=e.v,e.n=4,E(i.join(n,"yarn.lock"));case 4:if(a=e.v,!t){e.n=5;break}return e.a(2,a?["yarn","install","--immutable"]:["yarn","install"]);case 5:return e.a(2,a?["yarn","install","--frozen-lockfile","--silent"]:["yarn","install","--silent"])}},e)}))).apply(this,arguments)}function T(e){return L.apply(this,arguments)}function L(){return(L=r.asyncToGenerator(r.regenerator().m(function e(n){var t,a,o,c;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,E(i.join(n,".yarnrc.yml"));case 1:if(!e.v){e.n=2;break}return e.a(2,!0);case 2:return e.n=3,O(i.join(n,"package.json"));case 3:return a=e.v,o="string"==typeof a.packageManager?a.packageManager:void 0,c=null==(t=/^yarn@(\d+)/.exec(null!=o?o:""))?void 0:t[1],e.a(2,void 0!==c&&Number(c)>=2)}},e)}))).apply(this,arguments)}function G(e,n){return B.apply(this,arguments)}function B(){return(B=r.asyncToGenerator(r.regenerator().m(function e(n,t){var a,o,c,s;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:a=r.createForOfIteratorHelper(t),e.p=1,a.s();case 2:if((o=a.n()).done){e.n=5;break}return c=o.value,e.n=3,E(i.join(n,c));case 3:if(!e.v){e.n=4;break}return e.a(2,!0);case 4:e.n=2;break;case 5:e.n=7;break;case 6:e.p=6,s=e.v,a.e(s);case 7:return e.p=7,a.f(),e.f(7);case 8:return e.a(2,!1)}},e,null,[[1,6,7,8]])}))).apply(this,arguments)}function E(e){return x.apply(this,arguments)}function x(){return(x=r.asyncToGenerator(r.regenerator().m(function e(n){var t;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,a.access(n);case 1:return e.a(2,!0);case 2:if(e.p=2,t=e.v,"ENOENT"===("object"===r.typeof(t)&&null!==t&&"code"in t?t.code:void 0)){e.n=3;break}throw t;case 3:return e.a(2,!1)}},e,null,[[0,2]])}))).apply(this,arguments)}function O(e){return I.apply(this,arguments)}function I(){return(I=r.asyncToGenerator(r.regenerator().m(function e(n){var t,o,i;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,o=JSON,e.n=1,a.readFile(n,"utf8");case 1:return t=o.parse.call(o,e.v),e.a(2,"object"!==r.typeof(t)||null===t||Array.isArray(t)?{}:t);case 2:if(e.p=2,!((i=e.v)instanceof SyntaxError)){e.n=3;break}return e.a(2,{});case 3:if("ENOENT"!==("object"===r.typeof(i)&&null!==i&&"code"in i?i.code:void 0)){e.n=4;break}return e.a(2,{});case 4:throw i;case 5:return e.a(2)}},e,null,[[0,2]])}))).apply(this,arguments)}function P(e){return M.apply(this,arguments)}function M(){return(M=r.asyncToGenerator(r.regenerator().m(function e(n){var t,a,o,s,u;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:a=r.createForOfIteratorHelper(null!=(t=n.projectFilePaths)?t:c[n.packageManager]),e.p=1,a.s();case 2:if((o=a.n()).done){e.n=4;break}return s=o.value,e.n=3,N(i.join(n.projectDir,s),i.join(n.runDir,s));case 3:e.n=2;break;case 4:e.n=6;break;case 5:e.p=5,u=e.v,a.e(u);case 6:return e.p=6,a.f(),e.f(6);case 7:return e.a(2)}},e,null,[[1,5,6,7]])}))).apply(this,arguments)}function N(e,n){return D.apply(this,arguments)}function D(){return(D=r.asyncToGenerator(r.regenerator().m(function e(n,t){var o;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,a.cp(n,t,{recursive:!0});case 1:e.n=3;break;case 2:if(e.p=2,o=e.v,"ENOENT"===("object"===r.typeof(o)&&null!==o&&"code"in o?o.code:void 0)){e.n=3;break}throw o;case 3:return e.a(2)}},e,null,[[0,2]])}))).apply(this,arguments)}function q(e,n){return C.apply(this,arguments)}function C(){return C=r.asyncToGenerator(r.regenerator().m(function e(n,a){var o,c,s,l,p,d,f,m,y,g,v,k,b,h,w,j,S,T;return r.regenerator().w(function(e){for(;;)switch(e.n){case 0:return o=void 0===u?void 0:i.join(a.cwd,".exercode-time-result"),c=void 0===u?n:[].concat(r.toConsumableArray(u),["--output=".concat(o)],r.toConsumableArray(n)),s=t.spawn(c[0],c.slice(1),{cwd:a.cwd,detached:"win32"!==process.platform,env:a.env,stdio:["pipe","pipe","pipe"]}),l=[],p=[],d=0,f=!1,m=!1,y=function(e,n){if(d>=a.outputLimitBytes)n.byteLength>0&&(m=!0,F(s,"SIGKILL"));else{var r=a.outputLimitBytes-d,t=n.byteLength>r?n.subarray(0,r):n;e.push(t),d+=t.byteLength,n.byteLength>r&&(m=!0,F(s,"SIGKILL"))}},s.stdout.on("data",function(e){return y(l,e)}),s.stderr.on("data",function(e){return y(p,e)}),g=setTimeout(function(){f=!0,F(s,"SIGTERM")},1e3*a.timeLimitSeconds),(v=setTimeout(function(){f&&F(s,"SIGKILL")},1e3*a.timeLimitSeconds+1e3)).unref(),e.n=1,new Promise(function(e,n){var r,t=!1,o=function(e){t||(r=e,F(s,"SIGKILL"),void 0===s.pid&&(t=!0,n(e)))};s.on("error",o),s.stdin.on("error",function(e){"EPIPE"!==e.code&&o(e)}),s.on("close",function(a,o){t||(t=!0,r?n(r):e({status:null!=a?a:void 0,signal:null!=o?o:void 0}))}),s.stdin.end(a.stdin)}).finally(function(){clearTimeout(g),clearTimeout(v)});case 1:if(k=e.v,b=k.status,h=k.signal,void 0!==o){e.n=2;break}T={timeSeconds:0,memoryBytes:0},e.n=4;break;case 2:return e.n=3,z(o);case 3:T=e.v;case 4:return j=(w=T).timeSeconds,S=w.memoryBytes,e.a(2,{stdout:Buffer.concat(l).toString(),stderr:Buffer.concat(p).toString(),status:b,timeSeconds:j,memoryBytes:S,timedOut:f,signal:h,outputLimitExceeded:m})}},e)})),C.apply(this,arguments)}function F(e,n){if(void 0!==e.pid)try{if("win32"===process.platform)return void e.kill(n);process.kill(-e.pid,n)}catch(e){var t="object"===r.typeof(e)&&null!==e&&"code"in e?e.code:void 0;if("ESRCH"!==t&&"EPERM"!==t)throw e}}function z(e){return A.apply(this,arguments)}function A(){return(A=r.asyncToGenerator(r.regenerator().m(function e(n){var t,o,i;return r.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,a.readFile(n,"utf8");case 1:t=e.v,e.n=4;break;case 2:if(e.p=2,i=e.v,"ENOENT"===("object"===r.typeof(i)&&null!==i&&"code"in i?i.code:void 0)){e.n=3;break}throw i;case 3:return e.a(2,{timeSeconds:0,memoryBytes:0});case 4:if(o=/(\d+(?:[.,]\d+)?) (\d+)\s*$/.exec(t)){e.n=5;break}return e.a(2,{timeSeconds:0,memoryBytes:0});case 5:return e.a(2,{timeSeconds:Number(o[1].replace(",",".")),memoryBytes:1024*Number(o[2])})}},e,null,[[0,2]])}))).apply(this,arguments)}exports.copyPackageManagerProjectFiles=P,exports.runCommandInTemporaryPackageManagerProject=function(e){return l.apply(this,arguments)};
2
- //# sourceMappingURL=runCommandInTemporaryPackageManagerProject.cjs.map
1
+ "use strict";const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:child_process");t=e.__toESM(t,1);let n=require("node:fs/promises");n=e.__toESM(n,1);let r=require("node:os");r=e.__toESM(r,1);let i=require("node:path");i=e.__toESM(i,1);const a={bun:[`package.json`,`bun.lock`,`bun.lockb`],cargo:[`Cargo.toml`,`Cargo.lock`],go:[`go.mod`,`go.sum`],gradle:[`build.gradle`,`build.gradle.kts`,`settings.gradle`,`settings.gradle.kts`,`gradle.properties`,`gradle.lockfile`,`buildscript-gradle.lockfile`,`gradle`,`gradlew`,`gradlew.bat`],maven:[`pom.xml`,`.mvn`,`mvnw`,`mvnw.cmd`],npm:[`package.json`,`package-lock.json`],pnpm:[`package.json`,`pnpm-lock.yaml`,`pnpm-workspace.yaml`],ruby:[`Gemfile`,`Gemfile.lock`,`.ruby-version`],uv:[`pyproject.toml`,`uv.lock`],yarn:[`package.json`,`yarn.lock`,`.yarnrc`,`.yarnrc.yml`,`.yarn`]},o={bun:f,cargo:p,go:m,gradle:h,maven:g,npm:_,pnpm:v,ruby:y,uv:b,yarn:x},s=k();async function c(e){let t=await n.default.mkdtemp(i.default.join(r.default.tmpdir(),e.tempDirPrefix??`exercode-`));try{await n.default.cp(e.cwd,t,{recursive:!0}),await E({packageManager:e.packageManager,projectDir:e.projectDir,runDir:t,projectFilePaths:e.projectFilePaths});let r=e.env?{...process.env,...e.env}:process.env,i=await u(e.packageManager,t),a=typeof e.command==`function`?e.command({runDir:t}):e.command,o=Date.now(),s=e.outputLimitBytes??52428800,c;if(i&&(c=await O(i,{cwd:t,env:r,outputLimitBytes:s,stdin:``,timeLimitSeconds:e.timeLimitSeconds}),d(c)))return l({elapsedTimeSeconds:(Date.now()-o)/1e3,options:e,result:c});let f=e.timeLimitSeconds-(Date.now()-o)/1e3;if(f<=0)return{stdin:e.stdin??``,stdout:c?.stdout??``,stderr:c?.stderr??``,status:0,timeSeconds:e.timeLimitSeconds+.001,memoryBytes:c?.memoryBytes??0,timedOut:!0,signal:c?.signal,outputLimitExceeded:!1};let p=await O(a,{cwd:t,env:r,outputLimitBytes:s,stdin:e.stdin??``,timeLimitSeconds:f}),m=(Date.now()-o)/1e3;return l(c?{elapsedTimeSeconds:m,options:e,result:{...p,timeSeconds:c.timeSeconds+p.timeSeconds,memoryBytes:Math.max(c.memoryBytes,p.memoryBytes)}}:{elapsedTimeSeconds:m,options:e,result:p})}finally{await n.default.rm(t,{force:!0,recursive:!0})}}function l(e){return{stdin:e.options.stdin??``,stdout:e.result.stdout,stderr:e.result.stderr,status:e.result.timedOut||e.result.outputLimitExceeded?0:e.result.status,timeSeconds:e.result.timedOut?e.options.timeLimitSeconds+.001:e.result.timeSeconds||e.elapsedTimeSeconds,memoryBytes:e.result.memoryBytes,timedOut:e.result.timedOut,signal:e.result.signal,outputLimitExceeded:e.result.outputLimitExceeded}}function u(e,t){return o[e](t)}function d(e){return e.status!==0||e.timedOut||e.outputLimitExceeded}async function f(e){if(await w(i.default.join(e,`package.json`)))return await C(e,[`bun.lock`,`bun.lockb`])?[`bun`,`install`,`--frozen-lockfile`,`--silent`]:[`bun`,`install`,`--silent`]}async function p(e){if(await w(i.default.join(e,`Cargo.toml`)))return await w(i.default.join(e,`Cargo.lock`))?[`cargo`,`fetch`,`--locked`]:[`cargo`,`fetch`]}async function m(e){if(await w(i.default.join(e,`go.mod`)))return[`go`,`mod`,`download`]}async function h(e){if(!await C(e,[`build.gradle`,`build.gradle.kts`,`settings.gradle`,`settings.gradle.kts`,`gradlew`,`gradlew.bat`]))return;let t=[`--no-daemon`,`--quiet`,`dependencies`];return process.platform===`win32`?await w(i.default.join(e,`gradlew.bat`))?[`cmd.exe`,`/c`,`gradlew.bat`,...t]:[`gradle`,...t]:await w(i.default.join(e,`gradlew`))?[`sh`,`./gradlew`,...t]:[`gradle`,...t]}async function g(e){if(!await w(i.default.join(e,`pom.xml`)))return;let t=[`-q`,`dependency:go-offline`];return process.platform===`win32`?await w(i.default.join(e,`mvnw.cmd`))?[`cmd.exe`,`/c`,`mvnw.cmd`,...t]:[`mvn`,...t]:await w(i.default.join(e,`mvnw`))?[`sh`,`./mvnw`,...t]:[`mvn`,...t]}async function _(e){if(await w(i.default.join(e,`package.json`)))return await w(i.default.join(e,`package-lock.json`))?[`npm`,`ci`,`--silent`]:[`npm`,`install`,`--silent`]}async function v(e){if(await w(i.default.join(e,`package.json`)))return await w(i.default.join(e,`pnpm-lock.yaml`))?[`pnpm`,`install`,`--frozen-lockfile`,`--silent`]:[`pnpm`,`install`,`--silent`]}async function y(e){if(await w(i.default.join(e,`Gemfile`)))return await w(i.default.join(e,`Gemfile.lock`))?[`bundle`,`install`,`--frozen`,`--quiet`]:[`bundle`,`install`,`--quiet`]}async function b(){}async function x(e){if(!await w(i.default.join(e,`package.json`)))return;let t=await S(e),n=await w(i.default.join(e,`yarn.lock`));return t?n?[`yarn`,`install`,`--immutable`]:[`yarn`,`install`]:n?[`yarn`,`install`,`--frozen-lockfile`,`--silent`]:[`yarn`,`install`,`--silent`]}async function S(e){if(await w(i.default.join(e,`.yarnrc.yml`)))return!0;let t=await T(i.default.join(e,`package.json`)),n=typeof t.packageManager==`string`?t.packageManager:void 0,r=/^yarn@(\d+)/.exec(n??``)?.[1];return r!==void 0&&Number(r)>=2}async function C(e,t){for(let n of t)if(await w(i.default.join(e,n)))return!0;return!1}async function w(e){try{return await n.default.access(e),!0}catch(e){if((typeof e==`object`&&e&&`code`in e?e.code:void 0)!==`ENOENT`)throw e;return!1}}async function T(e){try{let t=JSON.parse(await n.default.readFile(e,`utf8`));return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch(e){if(e instanceof SyntaxError||(typeof e==`object`&&e&&`code`in e?e.code:void 0)===`ENOENT`)return{};throw e}}async function E(e){for(let t of e.projectFilePaths??a[e.packageManager])await D(i.default.join(e.projectDir,t),i.default.join(e.runDir,t))}async function D(e,t){try{await n.default.cp(e,t,{recursive:!0})}catch(e){if((typeof e==`object`&&e&&`code`in e?e.code:void 0)!==`ENOENT`)throw e}}async function O(e,n){let r=s===void 0?void 0:i.default.join(n.cwd,`.exercode-time-result`),a=s===void 0?e:[...s,`--output=${r}`,...e],o=t.default.spawn(a[0],a.slice(1),{cwd:n.cwd,detached:process.platform!==`win32`,env:n.env,stdio:[`pipe`,`pipe`,`pipe`]}),c=[],l=[],u=0,d=!1,f=!1,p=(e,t)=>{if(u>=n.outputLimitBytes){t.byteLength>0&&(f=!0,A(o,`SIGKILL`));return}let r=n.outputLimitBytes-u,i=t.byteLength>r?t.subarray(0,r):t;e.push(i),u+=i.byteLength,t.byteLength>r&&(f=!0,A(o,`SIGKILL`))};o.stdout.on(`data`,e=>p(c,e)),o.stderr.on(`data`,e=>p(l,e));let m=setTimeout(()=>{d=!0,A(o,`SIGTERM`)},n.timeLimitSeconds*1e3),h=setTimeout(()=>{d&&A(o,`SIGKILL`)},n.timeLimitSeconds*1e3+1e3);h.unref();let{status:g,signal:_}=await new Promise((e,t)=>{let r=!1,i,a=e=>{r||(i=e,A(o,`SIGKILL`),o.pid===void 0&&(r=!0,t(e)))};o.on(`error`,a),o.stdin.on(`error`,e=>{e.code!==`EPIPE`&&a(e)}),o.on(`close`,(n,a)=>{if(!r){if(r=!0,i){t(i);return}e({status:n??void 0,signal:a??void 0})}}),o.stdin.end(n.stdin)}).finally(()=>{clearTimeout(m),clearTimeout(h)}),{timeSeconds:v,memoryBytes:y}=r===void 0?{timeSeconds:0,memoryBytes:0}:await j(r);return{stdout:Buffer.concat(c).toString(),stderr:Buffer.concat(l).toString(),status:g,timeSeconds:v,memoryBytes:y,timedOut:d,signal:_,outputLimitExceeded:f}}function k(){let e=r.default.platform()===`darwin`?`gtime`:`/usr/bin/time`,n=t.default.spawnSync(e,[`--version`],{stdio:`ignore`});if(!(n.error||n.status!==0))return[e,`--format`,`%e %M`]}function A(e,t){if(e.pid!==void 0)try{if(process.platform===`win32`){e.kill(t);return}process.kill(-e.pid,t)}catch(e){let t=typeof e==`object`&&e&&`code`in e?e.code:void 0;if(t!==`ESRCH`&&t!==`EPERM`)throw e}}async function j(e){let t;try{t=await n.default.readFile(e,`utf8`)}catch(e){if((typeof e==`object`&&e&&`code`in e?e.code:void 0)!==`ENOENT`)throw e;return{timeSeconds:0,memoryBytes:0}}let r=/(\d+(?:[.,]\d+)?) (\d+)\s*$/.exec(t);return r?{timeSeconds:Number(r[1].replace(`,`,`.`)),memoryBytes:Number(r[2])*1024}:{timeSeconds:0,memoryBytes:0}}exports.copyPackageManagerProjectFiles=E,exports.runCommandInTemporaryPackageManagerProject=c;
2
+ //# sourceMappingURL=runCommandInTemporaryPackageManagerProject.cjs.map