Many developers especially from the Java world may know the code analysis platform SonarQube (formerly SONAR). While its focus was mostly integration all the great analysis tools for Java the modular architecture allows plugging tools for other languages to provide linter results and code coverage under the same web interface.
We are a polyglot bunch and are using more and more React in addition to our Java, C++, .Net and “what not” projects. Of course we would like the same quality overview for these JavaScript projects as we are used to in other ecosystems. So I tried SonarQube for react.
The start
Using SonarQube to analyse a JavaScript project is as easy as for the other languages: Just provide a sonar-project.properties file specifying the sources and some paths for analysis results and there you go. It may look similar to the following for a create-react-app:
sonar.projectKey=myproject:webclient sonar.projectName=Webclient for my cool project sonar.projectVersion=0.3.0 #sonar.language=js sonar.sources=src sonar.exclusions=src/tests/** sonar.tests=src/tests sonar.sourceEncoding=UTF-8 #sonar.test.inclusions=src/tests/**/*.test.js sonar.coverage.exclusions=src/tests/** sonar.junit.reportPaths=test-results/test-report.junit.xml sonar.javascript.lcov.reportPaths=coverage/lcov.info
For the coverage you need to add some settings to your package.json, too:
{ ... "devDependencies": { "enzyme": "^3.3.0", "enzyme-adapter-react-16": "^1.1.1", "eslint": "^4.19.1", "eslint-plugin-react": "^7.7.0", "jest-junit": "^3.6.0" }, "jest": { "collectCoverageFrom": [ "src/**/*.{js,jsx}", "!**/node_modules/**", "!build/**" ], "coverageReporters": [ "lcov", "text" ] }, "jest-junit": { "output": "test-results/test-report.junit.xml" }, ... }
This is all nice but the set of built-in rules for JavaScript is a bit thin and does not fit React apps nicely.
ESLint to the recue
But you can make SonarQube use ESLint and thus become more useful.
First you have to install the ESLint Plugin for SonarQube from github.
Second you have to setup ESLint to your liking using eslint --init
in your project. That results in a eslintrc.js similar to this:
module.exports = { 'env': { 'browser': true, 'commonjs': true, 'es6': true }, 'extends': 'eslint:recommended', 'parserOptions': { 'ecmaFeatures': { 'experimentalObjectRestSpread': true, 'jsx': true }, 'sourceType': 'module' }, 'plugins': [ 'react' ], 'rules': { 'indent': [ 'error', 2 ], 'linebreak-style': [ 'error', 'unix' ], 'quotes': [ 'error', 'single' ], 'semi': [ 'error', 'always' ] } };
Lastly enable the ESLint ruleset for your project in sonarqube and look at the results. You may need to tune one thing or another but you will get some useful static analysis helping you to improve your code quality further.