/ reviews / biome-report-example.json
biome-report-example.json
  1  {
  2    "metadata": {
  3      "timestamp": "2025-05-10T12:34:56.789Z",
  4      "tool": "Biome",
  5      "version": "1.9.4"
  6    },
  7    "summary": {
  8      "total_files": 120,
  9      "files_with_issues": 15,
 10      "total_errors": 5,
 11      "total_warnings": 42,
 12      "total_hints": 18
 13    },
 14    "files": [
 15      {
 16        "path": "app/services/video/switcher.js",
 17        "errors": [
 18          {
 19            "rule": "noUndeclaredVariables",
 20            "message": "Variable \"videoElement\" is not declared",
 21            "location": {
 22              "start_line": 45,
 23              "start_column": 10,
 24              "end_line": 45,
 25              "end_column": 22
 26            },
 27            "code_snippet": "  const videoElement = document.getElementById('video-player');"
 28          }
 29        ],
 30        "warnings": [
 31          {
 32            "rule": "noConsoleLog",
 33            "message": "Using console.log is not allowed",
 34            "location": {
 35              "start_line": 78,
 36              "start_column": 4,
 37              "end_line": 78,
 38              "end_column": 15
 39            },
 40            "code_snippet": "    console.log('Video source changed');"
 41          },
 42          {
 43            "rule": "noVoid",
 44            "message": "void operator is not allowed",
 45            "location": {
 46              "start_line": 92,
 47              "start_column": 4,
 48              "end_line": 92,
 49              "end_column": 9
 50            },
 51            "code_snippet": "    void this.videoElement.load();"
 52          }
 53        ],
 54        "hints": []
 55      },
 56      {
 57        "path": "app/utils/animation/icon-animation.js",
 58        "errors": [],
 59        "warnings": [
 60          {
 61            "rule": "noDoubleEquals",
 62            "message": "Use '===' instead of '=='",
 63            "location": {
 64              "start_line": 37,
 65              "start_column": 15,
 66              "end_line": 37,
 67              "end_column": 17
 68            },
 69            "code_snippet": "    if (type == 'error') {"
 70          },
 71          {
 72            "rule": "useConst",
 73            "message": "Use 'const' instead of 'let' for variables that are never reassigned",
 74            "location": {
 75              "start_line": 42,
 76              "start_column": 8,
 77              "end_line": 42,
 78              "end_column": 11
 79            },
 80            "code_snippet": "    let iconUrl = AppConstants.ICONS[iconName];"
 81          }
 82        ],
 83        "hints": [
 84          {
 85            "rule": "useTemplate",
 86            "message": "Use template literals instead of string concatenation",
 87            "location": {
 88              "start_line": 55,
 89              "start_column": 18,
 90              "end_line": 55,
 91              "end_column": 19
 92            },
 93            "code_snippet": "    return 'icon-' + type;"
 94          }
 95        ]
 96      },
 97      {
 98        "path": "app/ui/stats-ui-manager.js",
 99        "errors": [],
100        "warnings": [
101          {
102            "rule": "noAccumulatingSpread",
103            "message": "Accumulating spread operations in array or object literals is not allowed",
104            "location": {
105              "start_line": 7,
106              "start_column": 28,
107              "end_line": 7,
108              "end_column": 31
109            },
110            "code_snippet": "    const sourceElements = [...this.videoController.videoElement.querySelectorAll('source')];"
111          }
112        ],
113        "hints": []
114      }
115    ]
116  }