{"version":3,"sources":["../../../src/checkers/oxlint/cli.ts"],"sourcesContent":["import { exec } from 'node:child_process'\nimport { stripVTControlCharacters as strip } from 'node:util'\nimport colors from 'picocolors'\nimport { createFrame, offsetRangeToBabelLocation } from '../../codeFrame.js'\nimport { consoleLog, type NormalizedDiagnostic } from '../../logger.js'\nimport { normalizePath, readSources } from '../../sources.js'\nimport { DiagnosticLevel } from '../../types.js'\nimport { parseArgsStringToArgv } from '../stylelint/argv.js'\n\nconst severityMap = {\n error: DiagnosticLevel.Error,\n warning: DiagnosticLevel.Warning,\n info: DiagnosticLevel.Suggestion,\n} as const\n\nexport function mapSeverity(s: string): DiagnosticLevel {\n return severityMap[s as keyof typeof severityMap] ?? DiagnosticLevel.Error\n}\n\nexport function getOxlintCommand(command: string) {\n const parsed = parseArgsStringToArgv(command)\n\n const index = parsed.findIndex((p) => p === '--format' || p === '-f')\n if (index === -1) {\n parsed.push('--format', 'json')\n } else {\n consoleLog(\n colors.yellow(\n '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\".',\n ),\n 'warn',\n )\n\n parsed.splice(index, 2, '--format', 'json')\n }\n\n return parsed\n}\n\nexport function runOxlint(command: string, cwd: string) {\n return new Promise((resolve, _reject) => {\n exec(\n command,\n {\n cwd,\n maxBuffer: Number.POSITIVE_INFINITY,\n },\n (_error, stdout, _stderr) => {\n parseOxlintOutput(stdout, cwd)\n .then(resolve)\n .catch(() => resolve([]))\n },\n )\n })\n}\n\ntype Span = { offset: number; length: number }\ntype Entry = {\n file: string\n span: Span\n code: string\n message: string\n severity: string\n}\n\nasync function parseOxlintOutput(\n output: string,\n cwd: string,\n): Promise {\n const parsed = safeParseOxlint(output)\n if (!parsed) return []\n\n const entries = getEntries(parsed, cwd)\n if (entries.length === 0) return []\n\n const files = getUniqueFiles(entries)\n const sourceCache = await readSources(files)\n\n return buildDiagnostics(entries, sourceCache)\n}\n\nfunction safeParseOxlint(output: string): OxlintOutput | null {\n try {\n return JSON.parse(output)\n } catch {\n return null\n }\n}\n\nfunction getEntries(parsed: OxlintOutput, cwd: string) {\n return parsed.diagnostics.flatMap(\n ({ filename, labels, code, message, severity }) => {\n const file = normalizePath(filename, cwd)\n\n const [label] = labels\n if (!label) return []\n\n return [\n {\n file,\n span: label.span,\n code,\n message,\n severity,\n },\n ] as Entry[]\n },\n )\n}\n\nfunction getUniqueFiles(entries: Entry[]) {\n return [...new Set(entries.map((e) => e.file))]\n}\n\nfunction buildDiagnostics(entries: Entry[], sources: Map) {\n return entries.flatMap((entry) => {\n const source = sources.get(entry.file)\n if (!source) return []\n\n const loc = offsetRangeToBabelLocation(\n source,\n entry.span.offset,\n entry.span.length,\n )\n const codeFrame = createFrame(source, loc)\n\n return [\n {\n message: `${entry.code}: ${entry.message}`,\n conclusion: '',\n level: mapSeverity(entry.severity),\n checker: 'oxlint',\n id: entry.file,\n codeFrame,\n stripedCodeFrame: codeFrame && strip(codeFrame),\n loc,\n },\n ] as NormalizedDiagnostic[]\n })\n}\n\ntype OxlintOutput = {\n diagnostics: Diagnostic[]\n number_of_files: number\n number_of_rules: number\n threads_count: number\n start_time: number\n}\n\ntype Diagnostic = {\n message: string\n code: string\n severity: string\n causes: unknown[]\n url: string\n help: string\n filename: string\n labels: Label[]\n related: unknown[]\n}\n\ntype Label = {\n label: string\n span: Record<'offset' | 'length' | 'line' | 'column', number>\n}\n"],"mappings":"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","names":[]}