[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-10190":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":36,"readmeContent":37,"aiSummary":38,"trendingCount":16,"starSnapshotCount":16,"syncStatus":18,"lastSyncTime":39,"discoverSource":40},10190,"xo","xojs\u002Fxo","xojs","❤️ JavaScript\u002FTypeScript linter (ESLint wrapper) with great defaults","",null,"TypeScript",7972,305,53,7,0,1,2,5,3,38.46,"MIT License",false,"main",[26,27,28,29,30,31,32,33,34,35,5],"best-practices","code-style","eslint","eslint-plugin","eslint-rules","linter","nodejs","shareable-configs","style-linter","unicorns","2026-06-12 02:02:18","\u003Ch1 align=\"center\">\n\t\u003Cbr>\n\t\u003Cimg width=\"400\" src=\"media\u002Flogo.svg\" alt=\"XO\">\n\t\u003Cbr>\n\t\u003Cbr>\n\t\u003Cbr>\n\u003C\u002Fh1>\n\n> JavaScript\u002FTypeScript linter (ESLint wrapper) with great defaults\n\n[![Coverage Status](https:\u002F\u002Fcodecov.io\u002Fgh\u002Fxojs\u002Fxo\u002Fbranch\u002Fmain\u002Fgraph\u002Fbadge.svg)](https:\u002F\u002Fcodecov.io\u002Fgh\u002Fxojs\u002Fxo\u002Fbranch\u002Fmain)\n[![XO code style](https:\u002F\u002Fshields.io\u002Fbadge\u002Fcode_style-5ed9c7?logo=xo&labelColor=gray&logoSize=auto&logoWidth=20)](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fxo)\n\nOpinionated but configurable ESLint wrapper with lots of goodies included. Enforces strict and readable code. Never discuss code style on a pull request again! No decision-making. No `eslint.config.js` to manage. It just works!\n\nIt uses [ESLint](https:\u002F\u002Feslint.org) underneath, so issues regarding built-in rules should be opened over [there](https:\u002F\u002Fgithub.com\u002Feslint\u002Feslint\u002Fissues).\n\n**XO requires your project to be [ESM](https:\u002F\u002Fgist.github.com\u002Fsindresorhus\u002Fa39789f98801d908bbc7ff3ecc99d99c).**\n\n![](https:\u002F\u002Fraw.githubusercontent.com\u002Fsindresorhus\u002Feslint-formatter-pretty\u002Fmain\u002Fscreenshot.png)\n\n## Highlights\n\n- Beautiful output.\n- Zero-config, but [configurable when needed](#config).\n- Enforces readable code, because you read more code than you write.\n- No need to specify file paths to lint as it lints all JS\u002FTS files except for [commonly ignored paths](#ignores).\n- [Flat config customization.](#config)\n- [TypeScript supported by default.](#typescript)\n- Includes many useful ESLint plugins, like [`unicorn`](https:\u002F\u002Fgithub.com\u002Fsindresorhus\u002Feslint-plugin-unicorn), [`import-x`](https:\u002F\u002Fgithub.com\u002Fun-ts\u002Feslint-plugin-import-x), [`ava`](https:\u002F\u002Fgithub.com\u002Favajs\u002Feslint-plugin-ava), [`n`](https:\u002F\u002Fgithub.com\u002Feslint-community\u002Feslint-plugin-n) and more.\n- Caches results between runs for much better performance.\n- Super simple to add XO to a project with [`$ npm init xo`](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fcreate-xo).\n- Fix many issues automagically with `$ xo --fix`.\n- Open all files with errors at the correct line in your editor with `$ xo --open`.\n- Specify [indent](#space) and [semicolon](#semicolon) preferences easily without messing with the rule config.\n- Optionally use the [Prettier](https:\u002F\u002Fgithub.com\u002Fprettier\u002Fprettier) code style or turn off all Prettier rules with the `compat` option.\n- Optionally use `eslint-config-xo-react` for easy JSX and React linting with zero config.\n- Optionally use with ESLint [directly](#usage-as-an-eslint-configuration)\n- Great [editor plugins](#editor-plugins).\n\n## Install\n\n```sh\nnpm install xo --save-dev\n```\n\n*You must install XO locally. You can run it directly with `$ npx xo`.*\n\n*For framework-specific linting, see [Astro](#astro), [Svelte](#svelte), and [Vue](#vue).*\n\n## Usage\n\n```console\n$ xo --help\n\n\tUsage\n\t\t$ xo [\u003Cfile|glob> ...]\n\n\tOptions\n\t\t--fix                     Automagically fix issues\n\t\t--fix-dry-run             Automagically fix issues without saving the changes to the file system\n\t\t--reporter                Reporter to use\n\t\t--space                   Use space indent instead of tabs [Default: 2]\n\t\t--config                  Path to a XO configuration file\n\t\t--semicolon               Use semicolons [Default: true]\n\t\t--react                   Include React specific parsing and xo-react linting rules [Default: false]\n\t\t--prettier                Format with prettier or turn off Prettier-conflicted rules when set to 'compat' [Default: false]\n\t\t--print-config            Print the effective ESLint config for the given file\n\t\t--version                 Print XO version\n\t\t--open                    Open files with issues in your editor\n\t\t--quiet                   Show only errors and no warnings\n\t\t--max-warnings            Number of warnings to trigger nonzero exit code [Default: -1]\n\t\t--stdin                   Validate\u002Ffix code from stdin\n\t\t--stdin-filename          Specify a filename for the --stdin option\n\t\t--ignore                  Ignore pattern globs, can be set multiple times\n\t\t--suppressions-location   Path to a custom ESLint suppressions file\n\t\t--cwd=\u003Cdir>               Working directory for files [Default: process.cwd()]\n\n\tExamples\n\t\t$ xo\n\t\t$ xo index.js\n\t\t$ xo *.js !foo.js\n\t\t$ xo --space\n\t\t$ xo --print-config=index.js\n\t\t$ echo 'const x=true' | xo --stdin --fix\n\n\tTips\n\t\t- Add XO to your project with `npm init xo`.\n\t\t- Put options in xo.config.js instead of using flags so other tools can read it.\n```\n\n## Default code style\n\n*Any of these can be [overridden](#shareable-configs) if necessary.*\n\n- Tab indentation *[(or space)](#space)*\n- Semicolons *[(or not)](#semicolon)*\n- Single-quotes\n- [Trailing comma](https:\u002F\u002Fmedium.com\u002F@nikgraf\u002Fwhy-you-should-enforce-dangling-commas-for-multiline-statements-d034c98e36f8) for multiline statements\n- No unused variables\n- Space after keyword `if (condition) {}`\n- Always `===` instead of `==`\n\nCheck out an [example](index.ts) and the [ESLint rules](https:\u002F\u002Fgithub.com\u002Fxojs\u002Feslint-config-xo\u002Fblob\u002Fmain\u002Findex.js).\n\n## Workflow\n\nThe recommended workflow is to add XO locally to your project and run it with the tests.\n\nSimply run `$ npm init xo` (with any options) to add XO to create an `xo.config.js`.\n\n## Config\n\nYou can configure XO options by creating an `xo.config.js` or an `xo.config.ts` file in the root directory of your project, or you can add an `xo` field to your `package.json`. XO supports all js\u002Fts file extensions (js,cjs,mjs,ts,cts,mts) and popular framework extensions (vue,svelte,astro) automatically. A XO config is an extension of ESLint's Flat Config. Like ESLint, an XO config exports an array of XO config objects. XO config objects extend [ESLint Configuration Objects](https:\u002F\u002Feslint.org\u002Fdocs\u002Flatest\u002Fuse\u002Fconfigure\u002Fconfiguration-files#configuration-objects). This means all the available configuration params for ESLint also work for `XO`. However, `XO` enhances and adds extra params to the configuration objects to make them easier to work with.\n\n### Config types\n\nXO exports the types `FlatXoConfig`, `XoConfigItem`, and other types for you to get TypeScript validation on your config files.\n\nexamples:\n`xo.config.js`\n\n```js\n\u002F** @type {import('xo').FlatXoConfig} *\u002F\nconst xoConfig = [...]\n```\n\n`xo.config.ts`\n\n```ts\nimport {type FlatXoConfig} from 'xo';\n\nconst xoConfig: FlatXoConfig = [...]\n```\n\n```ts\nexport default [...] satisfies import('xo').FlatXoConfig\n```\n\n### files\n\nType: `string | (string | string[])[]`\\\nDefault: `**\u002F*.{js,cjs,mjs,jsx,ts,cts,mts,tsx,vue,svelte,astro}`\n\nA glob string, array of globs, or ESLint's native format (where nested arrays create AND patterns) indicating which files the config object applies to. By default `XO` will apply the configuration to [all files](lib\u002Fconstants.ts). This is compatible with ESLint plugin configs, so you can spread them directly into your XO config.\n\n> Tip: If you are adding additional `@typescript-eslint` rules to your config, these rules will apply to JS files as well unless you separate them appropriately with the `files` option. `@typescript-eslint` rules set to `'off'` or `0`, however, will have no effect on JS linting.\n\n### ignores\n\nType: `string | string[]`\n\nSome [paths](lib\u002Fconstants.ts) are ignored by default, including paths in `.gitignore`. Additional ignores can be added here.\n\n> Tip: For *global* ignores, keep `ignores` as the only key in the config item. You can optionally set a `name` property. Adding more properties will cause ignores to be scoped down to your files selection, which may have unexpected effects.\n\nGlobal negated ignores are supported in both config files and the CLI for reopening XO's built-in ignored paths. This includes directory globs like `!dist\u002F**`, file globs like `!**\u002F*.min.js`, and literal file paths like `!dist\u002Fsrc\u002Findex.js`.\n\nWhen global ignores are involved, XO uses them in this order:\n\n1. Built-in default ignores\n2. Global config `ignores`\n3. CLI `ignores`\n\nXO keeps positive ignores for fast file discovery and only rechecks XO's own default-ignored paths. ESLint makes the final ignore decision.\n\n### space\n\nType: `boolean | number`\\\nDefault: `false` *(tab indentation)*\n\nSet it to `true` to get 2-space indentation or specify the number of spaces.\n\nThis option exists for pragmatic reasons, but I would strongly recommend you read [“Why tabs are superior”](http:\u002F\u002Flea.verou.me\u002F2012\u002F01\u002Fwhy-tabs-are-clearly-superior\u002F).\n\n### semicolon\n\nType: `boolean`\\\nDefault: `true` *(Semicolons required)*\n\nSet it to `false` to enforce no-semicolon style.\n\n### prettier\n\nType: `boolean | 'compat'`\\\nDefault: `false`\n\nFormat code with [Prettier](https:\u002F\u002Fgithub.com\u002Fprettier\u002Fprettier).\n\n[Prettier options](https:\u002F\u002Fprettier.io\u002Fdocs\u002Fen\u002Foptions.html) will be based on your [Prettier config](https:\u002F\u002Fprettier.io\u002Fdocs\u002Fen\u002Fconfiguration.html). XO will then **merge** your options with its own defaults:\n\n- [semi](https:\u002F\u002Fprettier.io\u002Fdocs\u002Fen\u002Foptions.html#semicolons): based on [semicolon](#semicolon) option\n- [useTabs](https:\u002F\u002Fprettier.io\u002Fdocs\u002Fen\u002Foptions.html#tabs): based on [space](#space) option\n- [tabWidth](https:\u002F\u002Fprettier.io\u002Fdocs\u002Fen\u002Foptions.html#tab-width): based on [space](#space) option\n- [singleQuote](https:\u002F\u002Fprettier.io\u002Fdocs\u002Fen\u002Foptions.html#quotes): `true`\n- [bracketSpacing](https:\u002F\u002Fprettier.io\u002Fdocs\u002Fen\u002Foptions.html#bracket-spacing): `false`\n\nTo stick with Prettier's defaults, add this to your Prettier config:\n\n```js\nexport default {\n\tsingleQuote: false,\n\tbracketSpacing: true,\n};\n```\n\nIf contradicting options are set for both Prettier and XO, an error will be thrown.\n\n#### Compat\n\nIf the Prettier option is set to `compat`, instead of formatting your code automatically, XO will turn off all rules that conflict with Prettier code style and allow you to pass your formatting to the Prettier tool directly.\n\n### react\n\nType: `boolean`\\\nDefault: `false`\n\nAdds `eslint-plugin-react`, `eslint-plugin-react-hooks`, and `eslint-config-xo-react` to get all the React best practices applied automatically.\n\n### Astro\n\nTo lint [Astro](https:\u002F\u002Fastro.build) files, install [`eslint-plugin-astro`](https:\u002F\u002Fgithub.com\u002Fota-meshi\u002Feslint-plugin-astro):\n\n```sh\nnpm install --save-dev eslint-plugin-astro\n```\n\nThen spread its recommended config in your `xo.config.js`:\n\n```js\nimport astroPlugin from 'eslint-plugin-astro';\n\nconst xoConfig = [\n\t...astroPlugin.configs.recommended,\n];\n\nexport default xoConfig;\n```\n\n### Svelte\n\nTo lint [Svelte](https:\u002F\u002Fsvelte.dev) files, install [`eslint-plugin-svelte`](https:\u002F\u002Fgithub.com\u002Fsveltejs\u002Feslint-plugin-svelte):\n\n```sh\nnpm install --save-dev eslint-plugin-svelte\n```\n\nThen spread its recommended config in your `xo.config.js`:\n\n```js\nimport sveltePlugin from 'eslint-plugin-svelte';\n\nconst xoConfig = [\n\t...sveltePlugin.configs.recommended,\n];\n\nexport default xoConfig;\n```\n\n### Vue\n\nTo lint [Vue](https:\u002F\u002Fvuejs.org) files, install [`eslint-plugin-vue`](https:\u002F\u002Fgithub.com\u002Fvuejs\u002Feslint-plugin-vue):\n\n```sh\nnpm install --save-dev eslint-plugin-vue\n```\n\nThen spread its recommended config in your `xo.config.js`:\n\n```js\nimport vuePlugin from 'eslint-plugin-vue';\n\nconst xoConfig = [\n\t...vuePlugin.configs['flat\u002Frecommended'],\n];\n\nexport default xoConfig;\n```\n\n### Shareable configs\n\nIf you want to extend a [shareable ESLint config](https:\u002F\u002Feslint.org\u002Fdocs\u002Flatest\u002Fextend\u002Fshareable-configs) or any other npm package, use `xo.config.js` instead of `package.json`, since `package.json` only supports serializable values and cannot `import`.\n\n`xo.config.js`\n\n```js\nexport {default} from 'my-shareable-config';\n```\n\nYou can also extend and override:\n\n```js\nimport myConfig from 'my-shareable-config';\n\nexport default [\n\t...myConfig,\n\t{\n\t\trules: {\n\t\t\t\u002F\u002F Your overrides\n\t\t},\n\t},\n];\n```\n\n## TypeScript\n\nXO will automatically lint TypeScript files (`.ts`, `.mts`, `.cts`, and `.tsx`) with the rules defined in [eslint-config-xo-typescript#use-with-xo](https:\u002F\u002Fgithub.com\u002Fxojs\u002Feslint-config-xo-typescript#use-with-xo).\n\nXO will handle the [@typescript-eslint\u002Fparser `project` option](https:\u002F\u002Ftypescript-eslint.io\u002Fpackages\u002Fparser\u002F#project) automatically even if you don't have a `tsconfig.json` in your project.\n\nYou can opt out of XO's automatic tsconfig handling by specifying your own `languageOptions.parserOptions.project`, `languageOptions.parserOptions.projectService`, or `languageOptions.parserOptions.tsconfigRootDir`. Files in a config with these properties will be excluded from automatic tsconfig handling.\n\n## Usage as an ESLint Configuration\n\nWith the introduction of the ESLint flat config, many of the original goals of `xo` were brought into the ESLint core, and shareable configs with plugins became possible. Although we highly recommend the use of the `xo` cli, we understand that some teams need to rely on ESLint directly.\n\nFor these purposes, you can still get most of the features of `xo` by using our ESLint configuration helpers.\n\n### xoToEslintConfig\n\nThe `xoToEslintConfig` function is designed for use in an `eslint.config.js` file. It is NOT for use in an `xo.config.js` file. This function takes a `FlatXoConfig` and outputs an ESLint config object. This function will neither be able to automatically handle TS integration for you nor automatic Prettier integration. You are responsible for configuring your other tools appropriately. The `xo` cli, will, however, handle all of these details for you.\n\n`eslint.config.js`\n\n```js\nimport xo from 'xo';\n\nexport default xo.xoToEslintConfig([{space: true, prettier: 'compat'}]);\n```\n\n## Tips\n\n### Monorepo\n\nPut a `xo.config.js` with your config at the root and do not add a config to any of your bundled packages.\n\n### Including files ignored by default\n\nTo include files that XO [ignores by default](lib\u002Fconstants.ts), add them as negative globs in the [`ignores` option](#ignores):\n\n```js\nconst xoConfig = [{ignores: ['!vendor\u002F**']}];\n\nexport default xoConfig;\n```\n\nThis also works for narrower carve-outs:\n\n```js\nconst xoConfig = [{ignores: ['!dist\u002Fsrc\u002F**', '!dist\u002Fsrc\u002Findex.js']}];\n\nexport default xoConfig;\n```\n\n### Warnings are hidden when there are errors\n\nWhen XO finds errors, warnings are automatically hidden to reduce noise and let you focus on what matters. Warnings are shown normally when there are no errors. Use `--quiet` to always suppress warnings, or `--max-warnings` to treat warnings as errors.\n\n### Bulk suppression\n\nXO automatically respects an [`eslint-suppressions.json`](https:\u002F\u002Feslint.org\u002Fdocs\u002Flatest\u002Fuse\u002Fsuppressions) file if one exists in the working directory. This lets you suppress existing violations while still enforcing rules on new code — useful for incrementally adopting stricter rules in a large codebase.\n\nTo generate the suppressions file, create a temporary `eslint.config.js` using [`xoToEslintConfig`](#xotoeslintconfig) and run ESLint with `--suppress-all`:\n\n```sh\nnpx eslint --suppress-all\n```\n\nCommit the resulting `eslint-suppressions.json` to share suppressions across your team.\n\nTo use a custom suppressions file path, pass `--suppressions-location`:\n\n```sh\nxo --suppressions-location config\u002Fsuppressions.json\n```\n\n## FAQ\n\n### What does XO mean?\n\nIt means [hugs and kisses](https:\u002F\u002Fen.wiktionary.org\u002Fwiki\u002Fxoxo).\n\n### Why not Standard?\n\nThe [Standard style](https:\u002F\u002Fstandardjs.com) 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.\n\n### Why not ESLint?\n\nXO 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](https:\u002F\u002Fgithub.com\u002Fxojs\u002Feslint-config-xo).\n\n## Editor plugins\n\n- [Sublime Text](https:\u002F\u002Fgithub.com\u002Fxojs\u002FSublimeLinter-contrib-xo)\n- [Atom](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fatom-linter-xo)\n- [Vim](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fvim-xo)\n- [TextMate 2](https:\u002F\u002Fgithub.com\u002Fclaylo\u002FXO.tmbundle)\n- [VSCode](https:\u002F\u002Fgithub.com\u002FSamVerschueren\u002Fvscode-linter-xo)\n- [Emacs](https:\u002F\u002Fgithub.com\u002Fj-em\u002Fxo-emacs)\n- [WebStorm](https:\u002F\u002Fgithub.com\u002Fjamestalmage\u002Fxo-with-webstorm)\n\n## Build-system plugins\n\n- [Gulp](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fgulp-xo)\n- [Grunt](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fgrunt-xo)\n- [webpack loader](https:\u002F\u002Fgithub.com\u002FSemigradsky\u002Fxo-loader)\n- [webpack plugin](https:\u002F\u002Fgithub.com\u002Fnstanard\u002Fxo-webpack-plugin)\n- [Metalsmith](https:\u002F\u002Fgithub.com\u002Fblainsmith\u002Fmetalsmith-xo)\n- [Fly](https:\u002F\u002Fgithub.com\u002Flukeed\u002Ffly-xo)\n\n## Configs\n\n- [eslint-config-xo](https:\u002F\u002Fgithub.com\u002Fxojs\u002Feslint-config-xo) - ESLint shareable config for XO with tab indent\n- [eslint-config-xo-space](https:\u002F\u002Fgithub.com\u002Fxojs\u002Feslint-config-xo-space) - ESLint shareable config for XO with 2-space indent\n- [eslint-config-xo-react](https:\u002F\u002Fgithub.com\u002Fxojs\u002Feslint-config-xo-react) - ESLint shareable config for React to be used with the above\n- [eslint-config-xo-vue](https:\u002F\u002Fgithub.com\u002FChocPanda\u002Feslint-config-xo-vue) - ESLint shareable config for Vue to be used with the above\n- [stylelint-config-xo](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fstylelint-config-xo) - Stylelint shareable config for XO with tab indent\n- [stylelint-config-xo-space](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fstylelint-config-xo-space) - Stylelint shareable config for XO with 2-space indent\n- [eslint-config-xo-typescript](https:\u002F\u002Fgithub.com\u002Fxojs\u002Feslint-config-xo-typescript) - ESLint shareable config for TypeScript\n\n## Support\n\n- [Twitter](https:\u002F\u002Ftwitter.com\u002Fsindresorhus)\n\n## Related\n\n- [eslint-plugin-unicorn](https:\u002F\u002Fgithub.com\u002Fsindresorhus\u002Feslint-plugin-unicorn) - Various awesome ESLint rules *(Bundled in XO)*\n- [xo-summary](https:\u002F\u002Fgithub.com\u002FLitoMore\u002Fxo-summary) - Display output from `xo` as a list of style errors, ordered by count\n\n## Badge\n\nShow the world you're using XO → [![XO code style](https:\u002F\u002Fshields.io\u002Fbadge\u002Fcode_style-5ed9c7?logo=xo&labelColor=gray&logoSize=auto)](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fxo)\n\n```md\n[![XO code style](https:\u002F\u002Fshields.io\u002Fbadge\u002Fcode_style-5ed9c7?logo=xo&labelColor=gray&logoSize=auto)](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fxo)\n```\n\nLarge badge: [![XO code style](https:\u002F\u002Fshields.io\u002Fbadge\u002Fcode_style-5ed9c7?style=for-the-badge&logo=xo&labelColor=gray&logoSize=auto)](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fxo)\n\n```md\n[![XO code style](https:\u002F\u002Fshields.io\u002Fbadge\u002Fcode_style-5ed9c7?style=for-the-badge&logo=xo&labelColor=gray&logoSize=auto)](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fxo)\n```\n\nOr [customize the badge](https:\u002F\u002Fgithub.com\u002Fxojs\u002Fxo\u002Fissues\u002F689#issuecomment-1253127616).\n\nYou can also find some nice dynamic XO badges on [badgen.net](https:\u002F\u002Fbadgen.net\u002F#xo).\n","XO 是一个基于 ESLint 的 JavaScript\u002FTypeScript 代码检查工具，预设了良好的默认配置。它通过提供一系列内置的 ESLint 插件和规则来确保代码风格的一致性和可读性，无需手动编写复杂的 ESLint 配置文件。项目支持 TypeScript，并且能够自动修复一些常见的代码风格问题，还提供了缓存机制以提高运行效率。适用于希望快速集成代码规范检查、减少代码审查中关于格式讨论的前端开发场景。","2026-06-11 03:27:06","top_topic"]