import { exec } from "node:child_process";
import { stripVTControlCharacters as strip } from "node:util";
import colors from "picocolors";
import { createFrame, offsetRangeToBabelLocation } from "../../codeFrame.js";
import { consoleLog } from "../../logger.js";
import { normalizePath, readSources } from "../../sources.js";
import { DiagnosticLevel } from "../../types.js";
import { parseArgsStringToArgv } from "../stylelint/argv.js";
const severityMap = {
  error: DiagnosticLevel.Error,
  warning: DiagnosticLevel.Warning,
  info: DiagnosticLevel.Suggestion
};
function mapSeverity(s) {
  return severityMap[s] ?? DiagnosticLevel.Error;
}
function getOxlintCommand(command) {
  const parsed = parseArgsStringToArgv(command);
  const index = parsed.findIndex((p) => p === "--format" || p === "-f");
  if (index === -1) {
    parsed.push("--format", "json");
  } else {
    consoleLog(
      colors.yellow(
        `vite-plugin-checker will force append "--format json" to the flags in dev mode, please don't use "--format" or "-f" flag in "config.oxlint.lintCommand".`
      ),
      "warn"
    );
    parsed.splice(index, 2, "--format", "json");
  }
  return parsed;
}
function runOxlint(command, cwd) {
  return new Promise((resolve, _reject) => {
    exec(
      command,
      {
        cwd,
        maxBuffer: Number.POSITIVE_INFINITY
      },
      (_error, stdout, _stderr) => {
        parseOxlintOutput(stdout, cwd).then(resolve).catch(() => resolve([]));
      }
    );
  });
}
async function parseOxlintOutput(output, cwd) {
  const parsed = safeParseOxlint(output);
  if (!parsed) return [];
  const entries = getEntries(parsed, cwd);
  if (entries.length === 0) return [];
  const files = getUniqueFiles(entries);
  const sourceCache = await readSources(files);
  return buildDiagnostics(entries, sourceCache);
}
function safeParseOxlint(output) {
  try {
    return JSON.parse(output);
  } catch {
    return null;
  }
}
function getEntries(parsed, cwd) {
  return parsed.diagnostics.flatMap(
    ({ filename, labels, code, message, severity }) => {
      const file = normalizePath(filename, cwd);
      const [label] = labels;
      if (!label) return [];
      return [
        {
          file,
          span: label.span,
          code,
          message,
          severity
        }
      ];
    }
  );
}
function getUniqueFiles(entries) {
  return [...new Set(entries.map((e) => e.file))];
}
function buildDiagnostics(entries, sources) {
  return entries.flatMap((entry) => {
    const source = sources.get(entry.file);
    if (!source) return [];
    const loc = offsetRangeToBabelLocation(
      source,
      entry.span.offset,
      entry.span.length
    );
    const codeFrame = createFrame(source, loc);
    return [
      {
        message: `${entry.code}: ${entry.message}`,
        conclusion: "",
        level: mapSeverity(entry.severity),
        checker: "oxlint",
        id: entry.file,
        codeFrame,
        stripedCodeFrame: codeFrame && strip(codeFrame),
        loc
      }
    ];
  });
}
export {
  getOxlintCommand,
  mapSeverity,
  runOxlint
};
//# sourceMappingURL=cli.js.map