JavaScript/TypeScript linter (ESLint wrapper) with great defaults
npx @tessl/cli install tessl/npm-xo@1.2.0XO is a zero-configuration JavaScript and TypeScript linter built as an opinionated ESLint wrapper that enforces strict and readable code standards. It provides beautiful output, automatic file discovery, TypeScript support by default, and includes many useful ESLint plugins like unicorn, import, ava, and n. XO is designed for maximum developer productivity by eliminating configuration decisions while maintaining flexibility through flat config customization when needed.
npm install xoimport Xo, {
allFilesGlob,
jsFilesGlob,
tsFilesGlob,
type FlatXoConfig,
type XoConfigItem
} from "xo";For CommonJS:
const Xo = require("xo").default;
const { allFilesGlob, jsFilesGlob, tsFilesGlob } = require("xo");# Lint all supported files in current directory
xo
# Lint specific files
xo index.js src/*.ts
# Auto-fix issues
xo --fix
# Use spaces instead of tabs
xo --space
# Enable React support
xo --reactimport Xo from "xo";
// Create XO instance
const xo = new Xo(
{ cwd: process.cwd(), fix: false },
{ space: true, semicolon: true }
);
// Lint files
const result = await xo.lintFiles("src/**/*.{js,ts}");
console.log(`Found ${result.errorCount} errors, ${result.warningCount} warnings`);
// Lint text
const textResult = await xo.lintText("console.log('hello')", { filePath: "test.js" });XO is built around several key components:
The core XO class provides comprehensive linting functionality for JavaScript and TypeScript files, with support for both file-based and text-based linting operations.
class Xo {
constructor(linterOptions: LinterOptions, baseXoConfig?: XoConfigOptions);
lintFiles(globs?: string | string[]): Promise<XoLintResult>;
lintText(code: string, options: LintTextOptions): Promise<XoLintResult>;
calculateConfigForFile(filePath: string): Promise<Linter.Config>;
getFormatter(name: string): Promise<ESLint.Formatter>;
initEslint(files?: string[]): Promise<void>;
}
// Static methods for convenience
static lintText(code: string, options: LintTextOptions & LinterOptions & XoConfigOptions): Promise<XoLintResult>;
static lintFiles(globs: string | undefined, options: LinterOptions & XoConfigOptions): Promise<XoLintResult>;
static outputFixes(results: XoLintResult): Promise<void>;
static xoToEslintConfig(flatXoConfig: XoConfigItem[], options?: CreateConfigOptions): Linter.Config[];Command-line interface providing comprehensive linting capabilities with auto-fixing, reporter options, configuration overrides, and editor integration.
// CLI flags and their types
interface CliFlags {
fix: boolean; // Auto-fix issues
reporter?: string; // Custom reporter
space?: string; // Space indentation config
semicolon: boolean; // Semicolon enforcement
prettier: boolean; // Prettier integration
react: boolean; // React-specific rules
quiet: boolean; // Show only errors
stdin: boolean; // Read from stdin
open: boolean; // Open files in editor
ignores: string[]; // Ignore patterns
cwd: string; // Working directory
}XO configuration system supporting flat config files, CLI options, and programmatic configuration with TypeScript support.
interface XoConfigOptions {
space?: boolean | number | string;
semicolon?: boolean;
prettier?: boolean | 'compat';
react?: boolean;
ignores?: string | string[];
}
interface XoConfigItem extends XoConfigOptions {
files?: string | string[];
ignores?: string | string[];
// ... extends Linter.Config
}
type FlatXoConfig = XoConfigItem | XoConfigItem[];// Exported glob patterns for file matching
const jsFilesGlob = "**/*.{js,jsx,mjs,cjs}";
const tsFilesGlob = "**/*.{ts,tsx,cts,mts}";
const allFilesGlob = "**/*.{js,jsx,mjs,cjs,ts,tsx,cts,mts}";interface XoLintResult {
errorCount: number;
warningCount: number;
fixableErrorCount: number;
fixableWarningCount: number;
results: ESLint.LintResult[];
rulesMeta: Record<string, Rule.RuleMetaData>;
}
interface CreateConfigOptions {
prettierOptions?: Options;
}
// Utility types
type Space = boolean | number | string | undefined;