JavaScript happiness style linter ❤️
Enforce strict code style. Never discuss code style on a pull request again!
No decision-making. No .eslintrc
, .jshintrc
, .jscsrc
to manage. It just works!
Uses ESLint underneath, so issues regarding rules should be opened over there.
JSX is supported by default.
Install
$ npm install --global xo
Usage
$ xo --help
Usage
$ xo [<file|glob> ...]
Options
--init Add XO to your project
--fix Automagically fix issues
--compact Compact output
--stdin Validate code from stdin
--esnext Enable ES2015+ rules
--env Environment preset [Can be set multiple times]
--global Global variable [Can be set multiple times]
--ignore Additional paths to ignore [Can be set multiple times]
--space Use space indent instead of tabs [Default: 2]
--no-semicolon Prevent use of semicolons
--plugin Include third-party plugins [Can be set multiple times]
--extend Extend defaults with a custom config [Can be set multiple times]
Examples
$ xo
$ xo index.js
$ xo *.js !foo.js
$ xo --esnext --space
$ xo --env=node --env=mocha
$ xo --init --esnext
$ xo --plugin=react
Tips
Put options in package.json instead of using flags so other tools can read it.
Default code style
Any of these can be overridden if necessary.
- Tab indentation (or space)
- Semicolons
- Single-quotes
- No unused variables
- Space after keyword
if (condition) {}
- Always
===
instead of ==
Check out an example and the ESLint rules.
Workflow
The recommended workflow is to add XO locally to your project and run it with the tests.
Simply run $ xo --init
(with any options) to add XO to your package.json or create one.
Before
{
"name": "awesome-package",
"scripts": {
"test": "mocha"
},
"devDependencies": {
"mocha": "^2.0.0"
}
}
After
{
"name": "awesome-package",
"scripts": {
"test": "xo && mocha"
},
"devDependencies": {
"mocha": "^2.0.0",
"xo": "^0.8.0"
}
}
Then just run $ npm test
and XO will be run before your tests.
Config
You can configure some options in XO by putting it in package.json:
{
"name": "awesome-package",
"xo": {
"envs": [
"node",
"mocha"
]
}
}
Globals and rules can be configured inline in files.
esnext
Type: boolean
Default: false
ES2015 is parsed even without this option. Enabling this will give you ES2015+ support and rules.
This will let you use ES2016 features like async
/await
and decorators. For a full list of features see Babel's experimental features and their Learn ES2015.
envs
Type: array
Default: ['node']
Which environments your code is designed to run in. Each environment brings with it a certain set of predefined global variables.
globals
Type: array
Additional global variables your code accesses during execution.
ignores
Type: array
Some paths are ignored by default. Additional ignores can be added here.
space
Type: boolean
, number
Default: false
(tab indentation)
Set it to true
to get 2-space indentation or specify the number of spaces.
This option exists for pragmatic reasons, but I would strongly recommend you read "Why tabs are superior".
rules
Type: object
Override any of the default rules. See the ESLint docs for more info on each rule.
Please take a moment to consider if you really need to use this option.
semicolon
Type: boolean
Default: true
(semicolons required)
Set it to false
to enforce no-semicolon style.
plugins
Type: array
Include third-party plugins.
extends
Type: array
, string
Use one or more shareable configs to override any of the default rules (like rules
above).
FAQ
What does XO mean?
It means hugs and kisses.
Why not Standard?
The Standard style is a really cool idea. I too wish we could have one style to rule them all! But the reality is that the JS community is just too diverse and opinionated to create one code style. They also made the mistake of pushing their own style instead of the most popular one. In contrast, XO is more pragmatic and has no aspiration of being the style. My goal with XO is to make it simple to enforce consistent code style with close to no config. XO comes with my code style preference by default, as I mainly made it for myself, but everything is configurable.
Why not ESLint?
XO is based on ESLint. This project started out as just a shareable ESLint config, but it quickly grew out of that. I wanted something even simpler. Just typing xo
and be done. No decision-making. No config. I also have some exciting future plans for it. However, you can still get most of the XO benefits while using ESLint directly with the ESLint shareable config.
Editor plugins
Vim
You can use Syntastic's ESLint checker with the following settings in your .vimrc
file:
let g:syntastic_javascript_eslint_generic = 1
let g:syntastic_javascript_eslint_exec = 'xo'
let g:syntastic_javascript_eslint_args = '--compact'
let g:syntastic_javascript_checkers = ['eslint']
Build-system plugins
Configs
License
MIT © Sindre Sorhus