From 3dfa874f975dcb6843d8d97187a0ce6adadc2183 Mon Sep 17 00:00:00 2001 From: Luca Elin Haneklau Date: Mon, 2 May 2022 16:36:01 +0200 Subject: [PATCH] Add lit-analyzer cli json-formatter --- .../src/lib/cli/analyze-command.ts | 3 ++ packages/lit-analyzer/src/lib/cli/cli.ts | 1 + .../src/lib/cli/format/json-formatter.ts | 49 +++++++++++++++++++ .../src/lib/cli/lit-analyzer-cli-config.ts | 2 +- 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 packages/lit-analyzer/src/lib/cli/format/json-formatter.ts diff --git a/packages/lit-analyzer/src/lib/cli/analyze-command.ts b/packages/lit-analyzer/src/lib/cli/analyze-command.ts index 2c84f962..727533a8 100644 --- a/packages/lit-analyzer/src/lib/cli/analyze-command.ts +++ b/packages/lit-analyzer/src/lib/cli/analyze-command.ts @@ -10,6 +10,7 @@ import { CodeDiagnosticFormatter } from "./format/code-diagnostic-formatter.js"; import { AnalysisStats, DiagnosticFormatter } from "./format/diagnostic-formatter.js"; import { ListDiagnosticFormatter } from "./format/list-diagnostic-formatter.js"; import { MarkdownDiagnosticFormatter } from "./format/markdown-formatter.js"; +import { JsonDiagnosticFormatter } from "./format/json-formatter.js"; import { FormatterFormat, LitAnalyzerCliConfig } from "./lit-analyzer-cli-config.js"; function printText(text: string, config: LitAnalyzerCliConfig) { @@ -153,6 +154,8 @@ function getFormatter(format: FormatterFormat): DiagnosticFormatter { return new CodeDiagnosticFormatter(); case "markdown": return new MarkdownDiagnosticFormatter(); + case "json": + return new JsonDiagnosticFormatter(); default: throw new Error(`Unknown format: '${format}'`); } diff --git a/packages/lit-analyzer/src/lib/cli/cli.ts b/packages/lit-analyzer/src/lib/cli/cli.ts index fbdfe0c7..b08bc722 100644 --- a/packages/lit-analyzer/src/lib/cli/cli.ts +++ b/packages/lit-analyzer/src/lib/cli/cli.ts @@ -51,6 +51,7 @@ export async function cli(): Promise { o code Highlight problems in the code (default) o list Short and precise list of problems o markdown Markdown format + o json Json format (eslint-compatible) --noColor Print results without color --outFile FILE Emit all output to a single file --maxWarnings NUMBER Fail only when the number of warnings is larger than this number diff --git a/packages/lit-analyzer/src/lib/cli/format/json-formatter.ts b/packages/lit-analyzer/src/lib/cli/format/json-formatter.ts new file mode 100644 index 00000000..398f2bdd --- /dev/null +++ b/packages/lit-analyzer/src/lib/cli/format/json-formatter.ts @@ -0,0 +1,49 @@ +import { SourceFile } from "typescript"; +import { LitDiagnostic } from "../../analyze/types/lit-diagnostic.js"; +import { AnalysisStats, DiagnosticFormatter } from "./diagnostic-formatter.js"; + +export class JsonDiagnosticFormatter implements DiagnosticFormatter { + protected diagnostics: { file: SourceFile; diagnostics: LitDiagnostic[] }[] = []; + + report(_stats: AnalysisStats): string | undefined { + return JSON.stringify( + this.diagnostics.map(({ file, diagnostics }) => ({ + filePath: file.fileName, + messages: diagnostics.map(diag => ({ + ruleId: `lit-analyzer/${diag.source}`, + severity: diag.severity === "error" ? 2 : 1, + message: diag.message, + messageId: diag.code, + ...this.diagnosticsFileLocation(diag) + })), + errorCount: diagnostics.filter(d => d.severity === "error").length, + // "fatalErrorCount": 0, + // "fixableErrorCount": 0, + warningCount: diagnostics.filter(d => d.severity === "warning").length, + // "fixableWarningCount": 0, + // "suppressedMessages": [], + // "usedDeprecatedRules": [] + source: file.text + })) + ); + } + + diagnosticTextForFile(file: SourceFile, diagnostics: LitDiagnostic[]): string | undefined { + if (diagnostics.length === 0) return undefined; + this.diagnostics.push({ file, diagnostics }); + return undefined; + } + + protected diagnosticsFileLocation(diagnostic: LitDiagnostic) { + const fileToStart = diagnostic.file.text.slice(0, diagnostic.location.start).split("\n"); + const startLine = fileToStart[fileToStart.length - 1]; + const fileToEnd = diagnostic.file.text.slice(0, diagnostic.location.end).split("\n"); + const endLine = fileToEnd[fileToEnd.length - 1]; + return { + line: fileToStart.length, + column: startLine ? startLine.length + 1 : undefined, + endLine: fileToEnd.length, + endColumn: endLine ? endLine.length + 1 : undefined + }; + } +} diff --git a/packages/lit-analyzer/src/lib/cli/lit-analyzer-cli-config.ts b/packages/lit-analyzer/src/lib/cli/lit-analyzer-cli-config.ts index 0e0add52..6a3eb0a3 100644 --- a/packages/lit-analyzer/src/lib/cli/lit-analyzer-cli-config.ts +++ b/packages/lit-analyzer/src/lib/cli/lit-analyzer-cli-config.ts @@ -1,6 +1,6 @@ import { LitAnalyzerRules } from "../analyze/lit-analyzer-config.js"; -export type FormatterFormat = "code" | "list" | "markdown"; +export type FormatterFormat = "code" | "list" | "markdown" | "json"; export interface LitAnalyzerCliConfig { debug?: boolean;