{
  "version": 3,
  "sources": ["../../../../src/packages/text.comments-parser/extractComments.ts"],
  "sourcesContent": ["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { parseString, stripComments } from 'strip-comments-strings';\nimport type { CommentSpecifier } from './CommentSpecifier.ts';\n\ninterface ExtractedComments {\n  text: string;\n  comments: CommentSpecifier[] | undefined;\n  hasFinalNewline: boolean;\n}\n\nexport function extractComments(text: string): ExtractedComments {\n  const hasFinalNewline = text.endsWith('\\n');\n\n  let t = text;\n\n  if (!hasFinalNewline) {\n    /* For the sake of the comment parser, which otherwise loses the\n     * final character of a final comment\n     */\n    t += '\\n';\n  }\n\n  const { comments: rawComments } = parseString(t);\n\n  const comments: CommentSpecifier[] = [];\n\n  let stripped: string = stripComments(t);\n\n  if (!hasFinalNewline) {\n    stripped = stripped.slice(0, -1);\n  }\n\n  let offset = 0; // accumulates difference of indices from text to stripped\n\n  for (const comment of rawComments) {\n    /* Extract much more context for the comment needed to restore it later */\n    // Unfortunately, JavaScript lastIndexOf does not have an end parameter:\n    const preamble: string = stripped.slice(0, comment.index - offset);\n\n    const lineStart = Math.max(preamble.lastIndexOf('\\n'), 0);\n\n    const priorLines = preamble.split('\\n');\n\n    let lineNumber = priorLines.length;\n\n    let after = '';\n\n    let hasAfter = false;\n\n    if (lineNumber === 1) {\n      if (preamble.trim().length === 0) {\n        lineNumber = 0;\n      }\n    } else {\n      after = priorLines[lineNumber - 2] ?? '';\n\n      hasAfter = true;\n\n      if (priorLines[0]?.trim().length === 0) {\n        /* JSON5.stringify will not have a whitespace-only line at the start */\n        lineNumber--;\n      }\n    }\n\n    let lineEnd = stripped.indexOf('\\n', lineStart === 0 ? 0 : lineStart + 1);\n\n    if (lineEnd < 0) {\n      lineEnd = stripped.length;\n    }\n\n    const whitespaceMatch = stripped\n      .slice(lineStart, comment.index - offset)\n      .match(/^\\s*/);\n\n    const newComment: CommentSpecifier = {\n      type: comment.type,\n      content: comment.content,\n      lineNumber,\n      on: stripped.slice(lineStart, lineEnd),\n      whitespace: whitespaceMatch ? whitespaceMatch[0] : '',\n    };\n\n    if (hasAfter) {\n      newComment.after = after;\n    }\n    const nextLineEnd = stripped.indexOf('\\n', lineEnd + 1);\n    if (nextLineEnd >= 0) {\n      newComment.before = stripped.slice(lineEnd, nextLineEnd);\n    }\n    comments.push(newComment);\n    offset += comment.indexEnd - comment.index;\n  }\n  return {\n    text: stripped,\n    comments: comments.length ? comments : undefined,\n    hasFinalNewline,\n  };\n}\n"],
  "mappings": "AAEA,SAAS,aAAa,qBAAqB;AASpC,SAAS,gBAAgB,MAAiC;AAC/D,QAAM,kBAAkB,KAAK,SAAS,IAAI;AAE1C,MAAI,IAAI;AAER,MAAI,CAAC,iBAAiB;AAIpB,SAAK;AAAA,EACP;AAEA,QAAM,EAAE,UAAU,YAAY,IAAI,YAAY,CAAC;AAE/C,QAAM,WAA+B,CAAC;AAEtC,MAAI,WAAmB,cAAc,CAAC;AAEtC,MAAI,CAAC,iBAAiB;AACpB,eAAW,SAAS,MAAM,GAAG,EAAE;AAAA,EACjC;AAEA,MAAI,SAAS;AAEb,aAAW,WAAW,aAAa;AAGjC,UAAM,WAAmB,SAAS,MAAM,GAAG,QAAQ,QAAQ,MAAM;AAEjE,UAAM,YAAY,KAAK,IAAI,SAAS,YAAY,IAAI,GAAG,CAAC;AAExD,UAAM,aAAa,SAAS,MAAM,IAAI;AAEtC,QAAI,aAAa,WAAW;AAE5B,QAAI,QAAQ;AAEZ,QAAI,WAAW;AAEf,QAAI,eAAe,GAAG;AACpB,UAAI,SAAS,KAAK,EAAE,WAAW,GAAG;AAChC,qBAAa;AAAA,MACf;AAAA,IACF,OAAO;AACL,cAAQ,WAAW,aAAa,CAAC,KAAK;AAEtC,iBAAW;AAEX,UAAI,WAAW,CAAC,GAAG,KAAK,EAAE,WAAW,GAAG;AAEtC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,QAAQ,MAAM,cAAc,IAAI,IAAI,YAAY,CAAC;AAExE,QAAI,UAAU,GAAG;AACf,gBAAU,SAAS;AAAA,IACrB;AAEA,UAAM,kBAAkB,SACrB,MAAM,WAAW,QAAQ,QAAQ,MAAM,EACvC,MAAM,MAAM;AAEf,UAAM,aAA+B;AAAA,MACnC,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA,IAAI,SAAS,MAAM,WAAW,OAAO;AAAA,MACrC,YAAY,kBAAkB,gBAAgB,CAAC,IAAI;AAAA,IACrD;AAEA,QAAI,UAAU;AACZ,iBAAW,QAAQ;AAAA,IACrB;AACA,UAAM,cAAc,SAAS,QAAQ,MAAM,UAAU,CAAC;AACtD,QAAI,eAAe,GAAG;AACpB,iBAAW,SAAS,SAAS,MAAM,SAAS,WAAW;AAAA,IACzD;AACA,aAAS,KAAK,UAAU;AACxB,cAAU,QAAQ,WAAW,QAAQ;AAAA,EACvC;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,SAAS,SAAS,WAAW;AAAA,IACvC;AAAA,EACF;AACF;",
  "names": []
}
