ESLint Config XO is a comprehensive ESLint shareable configuration that implements the XO linting standards and rules. It provides opinionated JavaScript/TypeScript linting configurations with multiple variants for different environments (Node.js/browser) and indentation preferences (tabs/2-spaces).
npm install --save-dev eslint-config-xo// Main configuration (maps to ./index.js)
import xo from 'eslint-config-xo';
// Browser variant (maps to ./browser.js)
import xoBrowser from 'eslint-config-xo/browser';
// Space indentation variant (maps to ./space.js)
import xoSpace from 'eslint-config-xo/space';
// Space + browser variant (maps to ./space-browser.js)
import xoSpaceBrowser from 'eslint-config-xo/space/browser';// eslint.config.js
import xo from 'eslint-config-xo';
export default [
...xo,
];For browser environments:
import xoBrowser from 'eslint-config-xo/browser';
export default [
...xoBrowser,
];For 2-space indentation:
import xoSpace from 'eslint-config-xo/space';
export default [
...xoSpace,
];For browser with 2-space indentation:
import xoSpaceBrowser from 'eslint-config-xo/space/browser';
export default [
...xoSpaceBrowser,
];ESLint Config XO is built around several key components:
Main XO ESLint configuration with comprehensive rules for Node.js environments using tab indentation.
import xo from 'eslint-config-xo';
/**
* Default XO ESLint configuration for Node.js environments
* - Returns array of 4 configuration objects
* - Main JS/TS config with tab-based indentation
* - JSON, JSONC, and JSON5 configurations
* - 220+ configured ESLint rules
* - Node.js and ES2021 globals
* @returns {Array} Array of ESLint configuration objects [config, jsoncConfig, json5Config, jsonConfig]
*/
const defaultConfig = xo;
// defaultConfig is an array: [config, jsoncConfig, json5Config, jsonConfig]Configuration objects returned (in array order):
config): JavaScript/TypeScript files (.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts) with comprehensive rules and tab indentationjsoncConfig): .jsonc, tsconfig.json, .vscode/*.json with comment support and trailing commas allowedjson5Config): .json5 files with extended JSON5 syntax supportjsonConfig): .json files with strict validation (placed last so non-standard JSONs match first)Supported file extensions: .js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .json, .jsonc, .json5
Key features:
@stylistic/indent: ['error', 'tab'])globals.nodeBuiltin, globals.es2021)no-debugger, no-dupe-keys, no-unreachable)eqeqeq, no-eval, prefer-const)@stylistic/eslint-plugin (e.g., comma-dangle, quotes, semi)arrow-body-style, prefer-destructuring)no-restricted-imports for deprecated modules)@stylistic, json, and css pluginsreportUnusedDisableDirectives and reportUnusedInlineConfigs set to "error"XO ESLint configuration adapted for browser environments with appropriate globals and restrictions.
import xoBrowser from 'eslint-config-xo/browser';
/**
* XO ESLint configuration for browser environments
* - Extends the main configuration object from index.js
* - Browser globals instead of Node.js globals
* - Confusing browser globals restrictions
* @returns {Array} Array containing single ESLint configuration object
*/
const browserConfig = xoBrowser;
// browserConfig is an array: [modifiedConfig]Environment differences from default:
globals.browser, globals.es2021) instead of Node.js built-in globalsno-restricted-globals rule with confusing browser globals from confusing-browser-globals packageXO ESLint configuration with 2-space indentation instead of tabs for Node.js environments.
import xoSpace from 'eslint-config-xo/space';
/**
* XO ESLint configuration with 2-space indentation for Node.js
* - Extends the main configuration object from index.js
* - 2-space indentation instead of tabs
* - Otherwise identical to default configuration
* @returns {Array} Array containing single ESLint configuration object
*/
const spaceConfig = xoSpace;
// spaceConfig is an array: [modifiedConfig]Key differences from default:
@stylistic/indent: ['error', 2]) instead of tab indentationXO ESLint configuration with 2-space indentation for browser environments.
import xoSpaceBrowser from 'eslint-config-xo/space/browser';
/**
* XO ESLint configuration with 2-space indentation for browser environments
* - Extends the browser configuration from browser.js
* - Applies 2-space indentation instead of tabs
* - Browser globals and confusing globals restrictions
* @returns {Array} Array containing single ESLint configuration object
*/
const spaceBrowserConfig = xoSpaceBrowser;
// spaceBrowserConfig is an array: [modifiedConfig]Combines features of:
@stylistic/indent: ['error', 2]) instead of tabs/**
* ESLint configuration object in flat config format
* @typedef {Object} ESLintConfig
* @property {Object} [languageOptions] - Language-specific options
* @property {Object} [languageOptions.globals] - Global variables
* @property {number|string} [languageOptions.ecmaVersion] - ECMAScript version
* @property {string} [languageOptions.sourceType] - Source type ("script" or "module")
* @property {Object} [languageOptions.parserOptions] - Parser options
* @property {Object} [languageOptions.parserOptions.ecmaFeatures] - ECMAScript features
* @property {boolean} [languageOptions.parserOptions.ecmaFeatures.jsx] - JSX support
* @property {Object} [linterOptions] - Linter behavior options
* @property {string} [linterOptions.reportUnusedDisableDirectives] - Report unused disable directives
* @property {string} [linterOptions.reportUnusedInlineConfigs] - Report unused inline configs
* @property {Object} [plugins] - ESLint plugins
* @property {string[]} [files] - File patterns
* @property {string} [language] - Language configuration
* @property {Object} [rules] - ESLint rules
*/
/**
* Rule configuration values
* @typedef {("error"|"warn"|"off"|Array)} RuleConfig
*/.css files.json, .jsonc, .json5 filesThe configuration includes rules from several categories:
.js, .jsx, .mjs, .cjs.ts, .tsx, .mts, .cts.json with strict validation.jsonc, tsconfig.json, .vscode/*.json with comment support.json5 with extended syntax support.css support available but currently disabled in configurationThe package includes CSS linting configuration that is currently disabled:
// CSS configuration exists in source but is commented out
// Available rules: css/no-duplicate-imports, css/no-empty-blocks,
// css/no-invalid-at-rule-placement, css/no-invalid-at-rules,
// css/no-invalid-named-grid-areas, css/no-invalid-properties
const cssConfig = {
plugins: { css },
files: ['**/*.css'],
language: 'css/css',
rules: {
'css/no-duplicate-imports': 'error',
'css/no-empty-blocks': 'error',
'css/no-invalid-at-rule-placement': 'error',
'css/no-invalid-at-rules': 'error',
'css/no-invalid-named-grid-areas': 'error',
'css/no-invalid-properties': 'error'
}
};
// Note: Disabled until more stable according to source comments