{"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  templateSyntax?: 'kotlin';\n}\n\ninterface BalancedExpressionOptions {\n  slashStartsComments?: boolean;\n  slashStartsRegExp: boolean;\n  supportsKotlinStrings?: boolean;\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              first.grammar,\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      templateSyntax: v.templateSyntax,\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 (grammar.templateSyntax === 'kotlin') return findKotlinStringEndIndex(sourceCode, stringStartIndex);\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 findKotlinStringEndIndex(sourceCode: string, stringStartIndex: number): number {\n  const quote = getStringQuote(sourceCode, stringStartIndex);\n  const isRawString = quote.length === 3;\n  let index = stringStartIndex + quote.length;\n\n  while (index < sourceCode.length) {\n    if (sourceCode.startsWith(quote, index)) return index + quote.length;\n    if (!isRawString && sourceCode[index] === '\\\\') {\n      index += 2;\n      continue;\n    }\n    if (sourceCode[index] === '$' && sourceCode[index + 1] === '{') {\n      index =\n        readBalancedExpression(sourceCode, index + 2, '}', {\n          slashStartsComments: true,\n          slashStartsRegExp: false,\n          supportsKotlinStrings: true,\n        }).endIndex + 1;\n      continue;\n    }\n    index += 1;\n  }\n\n  return 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  stringGrammar: CommentOrStringGrammar,\n  sourceCode: string,\n  stringStartIndex: number,\n  stringLiteral: string\n): string {\n  if (stringGrammar.templateSyntax === 'kotlin')\n    return preserveKotlinStringTemplateExpressions(grammar, commentOrStringGrammars, stringLiteral);\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 preserveKotlinStringTemplateExpressions(\n  grammar: SourceCodeGrammar,\n  commentOrStringGrammars: readonly CommentOrStringGrammar[],\n  stringLiteral: string\n): string {\n  const quoteLength = getStringQuote(stringLiteral, 0).length;\n  const isRawString = quoteLength === 3;\n  const expressions: string[] = [];\n  let index = quoteLength;\n\n  while (index < stringLiteral.length - quoteLength) {\n    if (!isRawString && stringLiteral[index] === '\\\\') {\n      index += 2;\n      continue;\n    }\n    if (stringLiteral[index] !== '$') {\n      index += 1;\n      continue;\n    }\n    if (stringLiteral[index + 1] === '{') {\n      const expression = readBalancedExpression(stringLiteral, index + 2, '}', {\n        slashStartsComments: true,\n        slashStartsRegExp: false,\n        supportsKotlinStrings: true,\n      });\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    if (isKotlinIdentifierStart(stringLiteral[index + 1])) {\n      let endIndex = index + 2;\n      while (isKotlinIdentifierPart(stringLiteral[endIndex])) endIndex += 1;\n      expressions.push(stringLiteral.slice(index + 1, endIndex));\n      index = endIndex;\n      continue;\n    }\n    index += 1;\n  }\n\n  return expressions.join('\\n');\n}\n\nfunction isKotlinIdentifierStart(character: string | undefined): boolean {\n  return character !== undefined && /[\\p{L}_]/u.test(character);\n}\n\nfunction isKotlinIdentifierPart(character: string | undefined): boolean {\n  return character !== undefined && /[\\p{L}\\p{N}_]/u.test(character);\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: BalancedExpressionOptions\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 === '\"' && options.supportsKotlinStrings) {\n      index = findKotlinStringEndIndex(sourceCode, index);\n      continue;\n    }\n    if (char === '\"' || char === \"'\" || char === '`') {\n      index = skipQuotedSpan(sourceCode, index);\n      continue;\n    }\n    if (\n      (options.slashStartsComments || options.slashStartsRegExp) &&\n      sourceCode[index] === '/' &&\n      sourceCode[index + 1] === '/'\n    ) {\n      index = skipJavaScriptSingleLineComment(sourceCode, index);\n      continue;\n    }\n    if (\n      (options.slashStartsComments || options.slashStartsRegExp) &&\n      sourceCode[index] === '/' &&\n      sourceCode[index + 1] === '*'\n    ) {\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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"}