{"id":14978301,"url":"https://github.com/eslint-kit/eslint-kit","last_synced_at":"2026-02-15T08:21:33.672Z","repository":{"id":37754956,"uuid":"493765521","full_name":"eslint-kit/eslint-kit","owner":"eslint-kit","description":"All-in-one solution for configuring ESLint in all of your projects","archived":false,"fork":false,"pushed_at":"2025-04-28T20:13:06.000Z","size":2710,"stargazers_count":129,"open_issues_count":5,"forks_count":7,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-28T21:29:37.993Z","etag":null,"topics":["airbnb-eslint","eslint","eslint-config","eslint-config-airbnb","eslint-kit","nodejs","react","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eslint-kit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-05-18T17:38:36.000Z","updated_at":"2025-02-12T21:29:33.000Z","dependencies_parsed_at":"2023-02-14T01:17:01.235Z","dependency_job_id":"855e36ca-2fef-4206-b11f-621200a55668","html_url":"https://github.com/eslint-kit/eslint-kit","commit_stats":{"total_commits":167,"total_committers":5,"mean_commits":33.4,"dds":"0.33532934131736525","last_synced_commit":"04930b43ed50470e1f345ef1b77aa5844c3d8ea9"},"previous_names":[],"tags_count":209,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eslint-kit%2Feslint-kit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eslint-kit%2Feslint-kit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eslint-kit%2Feslint-kit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eslint-kit%2Feslint-kit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eslint-kit","download_url":"https://codeload.github.com/eslint-kit/eslint-kit/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253650801,"owners_count":21942218,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["airbnb-eslint","eslint","eslint-config","eslint-config-airbnb","eslint-kit","nodejs","react","typescript"],"created_at":"2024-09-24T13:57:19.679Z","updated_at":"2026-02-15T08:21:33.618Z","avatar_url":"https://github.com/eslint-kit.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"logo.svg\" width=\"280\" align=\"center\" alt=\"ESLint Kit\" style=\"max-width: 100%;\" /\u003e\n  \u003ch1\u003e\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\n    ✨ All-in-one solution for configuring ESLint in all of your projects ✨\n  \u003c/p\u003e\n\u003c/p\u003e\n\u003cbr/\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/eslint-kit/eslint-kit/actions?query=branch%3Amain\"\u003e\n    \u003cimg src=\"https://github.com/eslint-kit/eslint-kit/actions/workflows/test-and-build.yml/badge.svg?event=push\u0026branch=main\" alt=\"eslint-kit CI Status\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\" rel=\"nofollow\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/license/eslint-kit/eslint-kit\" alt=\"License\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/eslint-kit\" rel=\"nofollow\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/dw/eslint-kit.svg\" alt=\"npm\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/eslint-kit\" rel=\"nofollow\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/stars/eslint-kit/eslint-kit\" alt=\"stars\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## Before you start\n\nThe README on `main` branch can contain some unreleased changes.\n\nGo to [`release/latest`](https://github.com/eslint-kit/eslint-kit/tree/release/latest) branch to see the actual README for the latest version from NPM.\n\n## Previous releases\n\n- [v10.x.x](https://github.com/eslint-kit/eslint-kit/tree/release/10)\n- [v9.x.x](https://github.com/eslint-kit/eslint-kit/tree/release/9)\n- [v8.x.x](https://github.com/eslint-kit/eslint-kit/tree/release/8)\n- [v7.x.x](https://github.com/eslint-kit/eslint-kit/tree/release/7)\n\n## Navigation\n\n- [Why?](#why)\n- [Quick installation](#quick-installation)\n- [Manual installation](#manual-installation)\n- [configure API](#configure-api)\n- [Presets](#presets)\n  - [Common](#common)\n  - [Frameworks](#frameworks)\n  - [Libraries](#libraries)\n- [Extends](#extends)\n- [Allow Debug](#allow-debug)\n- [Linting Modes](#linting-modes)\n- [Common issues](#common-issues)\n- [Setting up editors](#setting-up-editors)\n  - [VSCode](#vscode)\n- [Contributing](#contributing)\n- [Maintenance](#maintenance)\n\n## Why?\n\n- Most configs contain too common rules inside, so you need to do a lot of things to finalize them for your project.\n- You have to update config dependencies manually.\n- The other configs are bound to a specific stack/technology, so it's hard to extend them in a way that you like.\n- Sometimes, configs use formatting rules. Formatting is not ESLint's job, so there's a high chance to get into a conflict someday.\n- Together, the above means that most likely you'll need a different ESLint config for each of your projects.\n- You may often need to install a lot of dependencies: eslint, prettier, plugins, configs, parser, etc.\n- You may often face problems with eslint/parser/plugin/config versions. It takes time to find the issue and solution.\n- The average ESLint config UX is poor - for example, when using `no-console` rule, you will get warnings during the development. This kind of checks is useful when linting code for the production (CI environment, precommit hooks), but useless in development. ESLint Kit has `allowDebug` option to solve this problem.\n\n**ESLint Kit** is solving all these problems by providing many small presets, each performing a specific task.\n\nYou can select presets by using `configure` function in your `.eslintrc.cjs` file:\n\n```js\nconst { configure, presets } = require('eslint-kit')\n\nmodule.exports = configure({\n  mode: 'only-errors',\n  presets: [\n    presets.imports(),\n    presets.typescript(),\n    presets.prettier(),\n    presets.node(),\n    presets.react({ version: '18.0' }),\n  ],\n  extend: {\n    rules: {\n      'some-rule': 'off'\n    }\n  }\n})\n```\n\n`eslint-kit` dependencies are automatically updated. The configs are covered with tests, and each package update is tested. Broken plugins/rules/configs will not be deployed and will stuck at the review process, waiting for the fix by a developers.\n\n`eslint-kit` package contains all the dependencies you might need. The only exception are `eslint` and `prettier` - they should be installed separately to work properly (executing `yarn eslint` and so on).\n\nThe ESLint Kit presets try to contain only the best-practice rules to make overwriting as rare as possible. But you can still easily override them by using `extend` property.\n\n## Quick installation\n\n```\nnpx eslint-kit-cli@latest\n```\n\nOr if you want to use exactly **11** version of `eslint-kit`:\n\n```\nnpx eslint-kit-cli@^11\n```\n\n[Learn more about eslint-kit-cli](https://github.com/eslint-kit/eslint-kit-cli)\n\n## Manual installation\n\nNPM:\n\n```sh\nnpm install -D eslint-kit@^11.0.0 eslint@^8.57.0 prettier@^3.0.0\n```\n\nYarn:\n\n```sh\nyarn add -D eslint-kit@^11.0.0 eslint@^8.57.0 prettier@^3.0.0\n```\n\nAfter installing, add the `.eslintrc.cjs` file in your project root:\n\n```js\nconst { configure, presets } = require('eslint-kit')\n\nmodule.exports = configure({\n  presets: [],\n})\n```\n\nNow, just select the `presets` you need. The full information about them is located in [Presets](#presets) section.\n\nYou can also [set up your editor](#setting-up-editors) if you haven't already.\n\n## configure API\n\n```ts\nconfigure({\n  // (optional) Project root\n  root: __dirname,\n\n  // (optional) Base ESLint Config to extend from\n  // May be used in monorepos to declare shared ESLint Kit options for all packages\n  // See \"Extends\" section for more info\n  extends: '../../base.eslintrc.cjs',\n  // Also accepts ESLint Config object, but only if it was created using ESLint Kit\n  extends: require(path.resolve(__dirname, '../../base.eslintrc.cjs')),\n  \n  // (optional) Allow debug\n  // Very good option for development\n  // See \"Allow Debug\" section for more info\n  allowDebug: false,\n\n  // (optional) Mode\n  // See \"Linting Modes\" section for more info \n  mode: 'default',\n\n  // (optional) ESLint Kit presets\n  presets: [],\n\n  // (optional) Custom eslint config\n  // It gets merged with presets at the end\n  extend: { rules: { /* ... */ } }\n})\n```\n\n## Presets\n\n### Common\n\n\u003cdetails\u003e\n\u003csummary\u003eBase (always included automatically)\u003c/summary\u003e\n\u003cbr\u003e\n\n- Enables `unicorn`, 'sonarjs', and `@stylistic/eslint-plugin` plugins\n- Enables `@babel/eslint-parser`\n- Adds commonly used JavaScript rules\n- No need to include it in presets manually\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eImports\u003c/summary\u003e\n\u003cbr\u003e\n\n- Enables `import-x` and `simple-import-sort` plugins\n- Enables alias support for `jsconfig` and `tsconfig`\n- Configures file extensions depending on used presets\n\n```ts\nconfigure({\n  presets: [\n    presets.imports({\n      // (optional) Imports sort settings\n      sort: {\n        // (optional) Add newline between import groups\n        newline: false,\n\n        // (optional) Define groups for sorting (see below)\n        groups: [/* ... */]\n      },\n\n      // (optional) Alias settings\n      alias: {\n        // (optional) Base path for all aliases\n        // Defaults to './'\n        root: './src',\n\n        // (optional) Aliases\n        // Defaults to empty object\n        paths: { '@app': './' },\n\n        // (optional) A custom path to jsconfig\n        // Defaults to jsconfig.json\n        jsconfig: 'jsconfig.json'\n      }\n    })\n  ]\n})\n```\n\nUnder the hood, we use `eslint-plugin-simple-import-sort`. It provides an option to override sorting `groups` - check out [this section](https://github.com/lydell/eslint-plugin-simple-import-sort#custom-grouping) in their README.\n\nThese are the default `groups` values used by `eslint-kit`:\n\n```ts\n[\n  // side effects\n  ['^\\\\u0000'],\n\n  // node.js libraries and scoped libraries\n  ['^(child_process|crypto|events|fs|http|https|os|path)(/.*)?$', '^@?\\\\w'],\n\n  // common aliases (@app, @root, @/, ~/) and anything not matched\n  ['^@app', '^@root', '^~', '^'],\n\n  // relative imports\n  ['^\\\\.'],\n]\n```\n\nTo define your own `groups`, just pass it inside using `sort.groups`.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eTypeScript\u003c/summary\u003e\n\u003cbr\u003e\n\n- Changes parser to `@typescript-eslint/parser`\n- Allows the usage of `.ts`, `.mts` and `.tsx` extensions\n- Adds some TypeScript-specific rules (for TS files)\n- Replaces some default ESLint rules with their TypeScript analogues (for TS files)\n\n```ts\nconfigure({\n  presets: [\n    presets.typescript({\n      // (optional) Project's root\n      root: './',\n\n      // (optional) A path to tsconfig file\n      tsconfig: 'tsconfig.json',\n\n      // (optional) Enforce using `type` insead of `interface`\n      // Default to `false` in v11, will become `true` in v12, and will be removed in v13\n      // ESLint Kit CLI will set `true` on bootstrap\n      enforceUsingType: false,\n    })\n  ]\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ePrettier\u003c/summary\u003e\n\u003cbr\u003e\n\n- Enables the rule `prettier/prettier` from Prettier ESLint plugin\n\n```ts\nconfigure({\n  presets: [\n    /*\n     * Optionally, you can pass the Prettier config\n     * Note: it will merge and override any options set with .prettierrc files\n     */\n    presets.prettier({\n      semi: false,\n      singleQuote: true\n      // ...\n    })\n  ]\n})\n```\n\nThe recommended Prettier config:\n\n```json\n{\n  \"semi\": false,\n  \"singleQuote\": true,\n  \"tabWidth\": 2,\n  \"quoteProps\": \"consistent\"\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eNode\u003c/summary\u003e\n\u003cbr\u003e\n\n- Enables `node` environment\n\n```ts\nconfigure({\n  presets: [presets.node()]\n})\n```\n\n\u003c/details\u003e\n\n### Frameworks\n\n\u003cdetails\u003e\n\u003csummary\u003eReact\u003c/summary\u003e\n\u003cbr\u003e\n\n- Adds some React and React Hooks rules\n- Enables `browser` environment and `jsx` ecma feature\n\n```ts\nconfigure({\n  presets: [\n    presets.react({\n      // (optional) Allows to specify React version\n      version: 'detect',\n      // (optional) Allows using JSX without importing `React`\n      newJSXTransform: false\n    })\n  ]\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eVue\u003c/summary\u003e\n\u003cbr\u003e\n\n- Adds `vue` plugin\n- Changes parser to `vue-eslint-parser`\n- Detects installed vue version and enables `/recommended` rules for it\n- Enables `@typescript-eslint/parser` for `\u003cscript\u003e` blocks when `typescript` preset is used\n- Enables `browser` environment and `jsx` ecma feature\n- Allows `export default`\n\nYou still need to set up your editor / IDE to lint `.vue` files. You can use [this guide](https://eslint.vuejs.org/user-guide/#editor-integrations) from Vue documentation. \n\n```ts\nconfigure({\n  presets: [\n    presets.vue({\n      // (optional) Allows to specify Vue version\n      version: 'detect'\n    })\n  ]\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eAstro\u003c/summary\u003e\n\u003cbr\u003e\n\n- Adds `astro` plugin\n- Uses parser to `astro-eslint-parser` for `.astro` files\n- Enables `/recommended` rules and environment for Astro\n- Enables `@typescript-eslint/parser` for `\u003cscript\u003e` tags when `typescript` preset is used\n\nYou still need to set up your editor / IDE to lint `.astro` files. You can use [this guide](https://ota-meshi.github.io/eslint-plugin-astro/user-guide/#-editor-integrations) from Astro documentation. \n\n```ts\nconfigure({\n  presets: [presets.astro()]\n})\n```\n\nIf you use Prettier, you also need to install `prettier-plugin-astro`. Use [this guide](https://github.com/withastro/prettier-plugin-astro?tab=readme-ov-file#recommended-configuration) from plugin documentation.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eSolid.js\u003c/summary\u003e\n\u003cbr\u003e\n\n- Adds `solid` plugin and enables `/recommended` rules\n- Enables `/typescript` rules when `typescript` preset is active\n\n```ts\nconfigure({\n  presets: [presets.solidJs()]\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eSvelte\u003c/summary\u003e\n\u003cbr\u003e\n\n- Adds `svelte3` plugin and configures it\n- Enables some TypeScript settings when `typescript` preset is active\n\nYou still need to set up your editor / IDE to lint `.svelte` files. You can use [this guide](https://github.com/sveltejs/eslint-plugin-svelte3/blob/master/INTEGRATIONS.md) from `svelte3` plugin repo.\n\n```ts\nconfigure({\n  presets: [\n    presets.svelte({\n      // (optional) Disable type checking for .svelte files\n      noTypeCheck: true\n    })\n  ]\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eNext.js\u003c/summary\u003e\n\u003cbr\u003e\n\n- Enables `@next/eslint-plugin-next` plugin rules\n- Enables new JSX transform support\n- Allows the usage of `export default`\n\n`nextJs` preset doesn't provide React rules, so don't forget to add `react` preset too. You may omit `newJSXTransform`, since it's already included in `nextJs`.\n\n```ts\nconfigure({\n  presets: [presets.react(), presets.nextJs()]\n})\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eRemix\u003c/summary\u003e\n\u003cbr\u003e\n\n- Enables new JSX transform support\n- Allows the usage of `export default`\n\n`remix` preset doesn't provide React rules, so don't forget to add `react` preset too. You may omit `newJSXTransform`, since it's already included in `remix`.\n\n```ts\nconfigure({\n  presets: [presets.react(), presets.remix()]\n})\n```\n\n\u003c/details\u003e\n\n### Libraries\n\n\u003cdetails\u003e\n\u003csummary\u003eEffector\u003c/summary\u003e\n\u003cbr\u003e\n\n- Adds `effector` plugin and enables `/recommended`, `/scope`, and `/react` rules\n\n```ts\nconfigure({\n  presets: [\n    presets.effector({\n      // (optional) Enables /future rules\n      future: false\n    })\n  ]\n})\n```\n\n\u003c/details\u003e\n\n## Extends\n\n\u003e [!IMPORTANT]\n\u003e The paths from \"extend.ignorePatterns\", \"extend.overrides\" and similar options defined in \"extends\" ESLint config are resolved relative to the current ESLint config\n\nMay be used in monorepos to declare shared ESLint Kit options for all packages.\n\nRoot .eslintrc.cjs example:\n\n```js\n// \u003croot\u003e/base.eslintrc.cjs\nconst { configure, presets } = require('eslint-kit')\n\nmodule.exports = configure({\n  presets: [\n    presets.imports(),\n    presets.typescript(),\n    presets.prettier(),\n    presets.node(),\n  ],\n})\n```\n\nPackage .eslintrc.cjs example:\n\n```js\n// \u003croot\u003e/libs/my-library/.eslintrc.cjs\nconst { configure } = require('eslint-kit')\n\nmodule.exports = configure({\n  root: __dirname,\n  extends: '../../base.eslintrc.cjs', // Resolved relative to \"root\"\n})\n```\n\nAlso accepts ESLint Config object, but only if it was created using ESLint Kit:\n\n```js\n// \u003croot\u003e/libs/my-library/.eslintrc.cjs\nconst { configure } = require('eslint-kit')\nconst path = require('path')\n\nmodule.exports = configure({\n  extends: require(path.resolve(__dirname, '../../base.eslintrc.cjs')),\n})\n```\n\nInternally, the local ESLint Kit options is just merged with the ESLint Kit options from \"extends\" config.\n\nSome properties are deep merged, but some are simply overwritten.\n\nThe complete list of deep merged options:\n\n- `presets`\n- `extend`\n- `extend.rules`\n- `extend.env`\n- `extend.globals`\n- `extend.plugins`\n- `extend.settings`\n- `extend.overrides`\n\nYou may find the merging implementation in [this source file](./src/index.ts).\n\n## Allow Debug\n\nUseful in development mode.\n\nDisables the following rules:\n\n- `no-debugger`\n- `no-console`\n- `no-alert`\n- `effector/no-patronum-debug`\n\n```js\nconst { configure, presets } = require('eslint-kit')\n\nmodule.exports = configure({\n  allowDebug: process.env.NODE_ENV !== \"production\",\n  /* ... */\n})\n```\n\n## Linting Modes\n\n```js\nconst { configure, presets } = require('eslint-kit')\n\nmodule.exports = configure({\n  mode: 'decrease-level',\n  /* ... */\n})\n```\n\nLinting Modes are useful when you want to set similar behavior to a large number of rules.\n\n#### `default`\n\nDo not transform rule levels. This is the default value.\n\n#### `decrease-level`\n\nTransform `error` to `warn`, and `warn` to `off`.\n\nIt's useful for incremental adoption: you can focus on fixing only critical issues first.\n\n#### `only-errors`\n\nTransform `warn` to `error`.\n\nIt's useful when you want to completely prevent any warnings to get into your main branch.\n\n#### `only-warns`\n\nTransform `error` to `warn`.\n\nI have no idea when this may be useful, but ok.\n\n#### `disable-warns`\n\nTransform `warn` to `off`.\n\nI have no idea when this may be useful, but ok.\n\n## Common issues\n\n**Q**: ESLint ignores my `.eslintrc.cjs`, why?  \n**A**: It's a regular issue with tools like `@vue/cli` and `create-react-app`. Check `package.json` and remove `eslintConfig` if you find it. Otherwise, try to restart your editor.\n\n**Q**: ESLint: TypeError: this.libOptions.parse is not a function  \n**A**: Most likely you're using old broken ESLint version. `8.44.0` is tested and can be safely used.\n\n**Q**: ESLint couldn't determine the plugin \"foo\" uniquely  \n**A**: Most likely your `.eslintrc.cjs` is located inside some nested project directory, and you have `eslint` package installed in the high-level `node_modules`. You can try setting `extend.root` to `true` like in the example below:\n\n```ts\nconfigure({\n  presets: [/* ... */],\n  extend: {\n    root: true\n  }\n})\n```\n\n**Q**: In my monorepo, ESLint complains about `tsconfig.json` (or another file) location. How can I fix it?  \n**A**: Just set up `root` option inside your nested package (workspace) `.eslintrc.cjs` like in the example below:\n\n```ts\nconfigure({\n  root: __dirname,\n  presets: [/* ... */]\n})\n```\n\n**Q**: I get another error when using `eslint-kit` in a monorepo\n**A**: We didn't test monorepos much. They often have different issues with eslint and plugins resolving. And we also don't guarantee that your aliases settings will work in monorepo.\n\n\n## Setting up editors\n\n### VSCode\n\nInstall ESLint VSCode extension:\n\n\u003cimg width=\"360\" alt=\"CleanShot 2022-05-22 at 02 12 33@2x\" src=\"https://user-images.githubusercontent.com/35740512/169671833-75706ff1-93c7-4002-a540-00fce3e9384d.png\"\u003e\n\nNext, select from the following and click on it:\n\n\u003cdetails\u003e\n\u003csummary\u003eUsing a keybind\u003c/summary\u003e\n\u003cbr\u003e\n\nClick on Settings icon:\n\n\u003cimg width=\"47\" alt=\"Opening settings menu\" src=\"https://user-images.githubusercontent.com/35740512/169671780-194c01ca-bc5b-4972-a450-0c7bff70f932.png\"\u003e\n\nSelect \"Keyboard shortcuts\"\n\n\u003cimg width=\"314\" alt=\"Selecting keybind settings\" src=\"https://user-images.githubusercontent.com/35740512/169671809-6f6005f1-c7cb-4d91-b2a3-dd5e5d731c92.png\"\u003e\n\nType \"eslint\" and click on \"edit\" button:\n\n\u003cimg width=\"719\" alt=\"Adding a keybind\" src=\"https://user-images.githubusercontent.com/35740512/169671924-ad3215d9-ceff-46ff-9ee3-699fd759302a.png\"\u003e\n\nFinally, choose the keybind you like.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eLinting on file save\u003c/summary\u003e\n\u003cbr\u003e\n\nClick on Settings icon:\n\n\u003cimg width=\"47\" alt=\"Opening settings menu\" src=\"https://user-images.githubusercontent.com/35740512/169671780-194c01ca-bc5b-4972-a450-0c7bff70f932.png\"\u003e\n\nSelect \"Settings\"\n\n\u003cimg width=\"314\" alt=\"Selecting settings\" src=\"https://user-images.githubusercontent.com/35740512/169671992-39adbda7-b08a-4b75-963e-cba35ed61719.png\"\u003e\n\nSwitch to text mode:\n\n\u003cimg width=\"540\" alt=\"Switching to text mode\" src=\"https://user-images.githubusercontent.com/35740512/169672014-6673c180-fb4c-4974-8e0f-d65220d96508.png\"\u003e\n\nFinally, add the following and save:\n\n```ts\n{\n  \"eslint.validate\": [\n    \"javascript\",\n    \"javascriptreact\",\n    \"typescript\",\n    \"typescriptreact\"\n  ],\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.eslint\": true\n  }\n}\n```\n\n\u003c/details\u003e\n\n## Contributing\n\n1. Fork this repo\n2. Switch to a new branch, it should start with `feat/`, `fix/`, `docs/`, `refactor/`, etc., depending on the changes you want to propose\n3. Make changes\n4. Create a Pull Request into this repo's `main` branch\n5. When the checks are done and the review is passed, I'll merge it into `main` and it will create a new record in the changelog. Then, when the release is finally ready, your changes will be released.\n\n## Maintenance\n\nThe dev branch is `main` - any developer changes is merged in there. Also, there is a `release` branch. It always contains the actual published release source code and tag.\n\nAll changes are made using Pull Requests - push is forbidden. PR can be merged only after successful `test-and-build` workflow checks.\n\nWhen PR is merged, `release-drafter` workflow creates/updates a draft release. The changelog is built from the merged branch scope (`feat`, `fix`, etc) and PR title. When the release is ready - we publish the draft.\n\nThen, the `release` workflow handles everything:\n\n1. We run tests and build a package\n2. Then, we merge release tag into the `release` branch\n3. After, we restore build artifacts and publish it to NPM\n\nAlso, this repo has Renovate bot set up to auto-update `typescript` preset dependencies (they change frequently). The bot creates a PR into `main` branch and automatically merges it after successful checks.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feslint-kit%2Feslint-kit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feslint-kit%2Feslint-kit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feslint-kit%2Feslint-kit/lists"}