{"id":35659334,"url":"https://github.com/fullstacksjs/eslint-config","last_synced_at":"2026-05-31T05:02:51.945Z","repository":{"id":44945496,"uuid":"300303466","full_name":"fullstacksjs/eslint-config","owner":"fullstacksjs","description":"One configuration to rule them all","archived":false,"fork":false,"pushed_at":"2026-03-09T14:36:25.000Z","size":3945,"stargazers_count":94,"open_issues_count":0,"forks_count":9,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-19T09:40:54.750Z","etag":null,"topics":["eslint","flat-config","fullstacksjs"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/@fullstacksjs/eslint-config","language":"JavaScript","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/fullstacksjs.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-10-01T14:12:26.000Z","updated_at":"2026-03-09T14:35:52.000Z","dependencies_parsed_at":"2023-12-05T16:39:33.931Z","dependency_job_id":"f2541404-00c3-4e55-9e34-7f25c8a8bbc4","html_url":"https://github.com/fullstacksjs/eslint-config","commit_stats":{"total_commits":440,"total_committers":5,"mean_commits":88.0,"dds":"0.020454545454545503","last_synced_commit":"e4d9f6a5b9e73aace59c288b079056caaa9b3e96"},"previous_names":["full-stacks/eslint-config"],"tags_count":265,"template":false,"template_full_name":null,"purl":"pkg:github/fullstacksjs/eslint-config","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fullstacksjs%2Feslint-config","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fullstacksjs%2Feslint-config/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fullstacksjs%2Feslint-config/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fullstacksjs%2Feslint-config/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fullstacksjs","download_url":"https://codeload.github.com/fullstacksjs/eslint-config/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fullstacksjs%2Feslint-config/sbom","scorecard":{"id":413612,"data":{"date":"2025-08-11","repo":{"name":"github.com/fullstacksjs/eslint-config","commit":"5b6564fde16cbbf622feef5691559d45487e43d5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.1,"checks":[{"name":"Code-Review","score":4,"reason":"Found 10/25 approved changesets -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":10,"reason":"28 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":3,"reason":"dependency not pinned by hash detected -- score normalized to 3","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/fullstacksjs/eslint-config/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/fullstacksjs/eslint-config/release.yml/main?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   1 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yml:12"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 16 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-xffm-g5w8-qvg7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T23:16:40.072Z","repository_id":44945496,"created_at":"2025-08-18T23:16:40.072Z","updated_at":"2025-08-18T23:16:40.072Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31473273,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T08:36:52.050Z","status":"ssl_error","status_checked_at":"2026-04-06T08:36:51.267Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["eslint","flat-config","fullstacksjs"],"created_at":"2026-01-05T16:14:45.391Z","updated_at":"2026-04-06T13:01:42.858Z","avatar_url":"https://github.com/fullstacksjs.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n![logo](https://raw.githubusercontent.com/fullstacksjs/eslint-config/master/assets/banner.png)\n\n\u003cbr/\u003e\n\n![download status][download-badge]\n![version][version-badge]\n![MIT License][license-badge]\n\n\u003c/div\u003e\n\n## Installation\n\n```sh\nnpm install --save-dev @fullstacksjs/eslint-config eslint prettier\n```\n\n⚡️ That's it, you don't need to install any eslint-plugin!  If you already have some plugins installed, please remove them.\n\n## Usage\n\nTo use the configuration, all you need is to export the generated config by the `defineConfig` function. It automatically enables required plugins with **Auto Module Detection**.\n\n### ESM\n\n```js\nimport { defineConfig } from '@fullstacksjs/eslint-config';\n\nexport default defineConfig({\n  typescript: {\n    tsconfigRootDir: import.meta.dirname, // Recommended when using TypeScript\n  }\n});\n```\n\n### CJS\n\n```js\nconst { defineConfig } = require('@fullstacksjs/eslint-config');\n\nmodule.exports = defineConfig({\n  typescript: {\n    tsconfigRootDir: __dirname, // Recommended when using TypeScript\n  }\n});\n```\n\n## How Module Detection Works\n\nAutomatic module detection enables ESLint plugins based on the dependencies listed in your `package.json`. It scans your project to identify which tools you're using, and then activates the corresponding ESLint plugins accordingly.\n\nFor example, if your `package.json` includes `vitest` as a dependency, the configuration will automatically enable `eslint-plugin-vitest` for you. (You don't need to install the plugin itself)\n\n### Modules API\n\nYou can fine-tune module detection by overriding it, the `defineConfig` function accepts options as its first argument to control enabled modules.\n\n```typescript\ninterface Options {\n  react?: boolean | { additionalEffectHooks?: string }; // controls react, react-hooks, jsx/a11y plugins\n  typescript?: boolean | ParserOptions // https://typescript-eslint.io/packages/parser#configuration\n  node?: boolean; // controls node plugin\n  sort?: boolean; // controls perfectionist plugin\n  strict?: boolean; // controls strict rules\n  import?: { internalRegExp?: string; lifetime?: number; }; // controls import plugin\n  esm?: boolean; // controls esm plugin\n  test?: boolean; // controls test formatting plugin\n  jest?: boolean; // controls jest plugin\n  vitest?: boolean; // controls vitest plugin\n  cypress?: boolean; // controls cypress plugin\n  playwright?: boolean // controls playwright plugin\n  storybook?: boolean; // controls storybook plugin\n  tailwind?: false | TailwindConfig; // controls tailwindcss plugin\n  next?: boolean; // controls next plugin\n  prettier?: boolean; // controls prettier plugin\n  disableExpensiveRules?: boolean; // controls expensive rules\n  gitignore?: false | string; // automatically ignore paths from .gitignore\n  regex?: boolean | {allowedCharacterRanges?: string[]} // controls regexp plugin\n}\n```\n\n## What if I want to add my one rules\n\nYou can pass any number of arbitrary custom config overrides to `defineConfig` function:\n\n```js\nimport { defineConfig } from '@fullstacksjs/eslint-config';\n\nexport default defineConfig(\n  {\n    typescript: true,\n    // You can pass extends here\n    rules: {\n      'no-console': 'error'\n    }\n  },\n  // And any number of extra configurations\n  {\n    files: ['**/*.ts'],\n    rules: {},\n  }, {\n    rules: {},\n  })\n```\n\n## What If I Want to Use a Plugin That Isn't Supported?\n\nYou can still use any ESLint plugin, even if it's not supported by automatic detection. Simply install the plugin manually and add it to the `defineConfig`. There are no limitations.\n\n```js\nimport { defineConfig } from '@fullstacksjs/eslint-config';\nimport pluginVue from 'eslint-plugin-vue';\n\nexport default defineConfig(\n  { /* Options */},\n  ...pluginVue.configs['flat/recommended']\n)\n```\n\n## Tailwind\n\nTo enable Tailwind CSS in your project, specify the path to your CSS file in the module configuration:\n\nTailwind 4:\n```typescript\nexport default defineConfig({\n  tailwind: { entryPoint: './src/global.css' },\n})\n```\n\nTailwind 3:\n```typescript\nexport default defineConfig({\n  tailwind: { tailwindConfig: './tailwind.config.js' },\n})\n```\n\n## GitIgnore\n\nBy default, FullstacksJS checks for a `.gitignore` file at the root of the project. If the file exists, it will be used automatically. You can override this behavior by updating the configuration.\n\n```typescript\nexport default defineConfig({\n  gitignore: './packages/acme/.gitignore', // use `false` to disable\n})\n```\n\n## I'm Getting a Next.js Warning: Plugin Was Not Detected\n\nThis configuration includes built-in support for [Next.js](https://nextjs.org). The warning you're seeing from Next.js is misleading—it simply checks whether the plugin is explicitly listed in your package.json.\n\nYou can safely ignore this warning. Alternatively, you can update your lint script from next lint to eslint to avoid it entirely.\n\n## Speed Optimization!\n\nBalancing the benefits of linting rules against their performance impact is crucial. Below is a table highlighting the most resource-intensive linting rules encountered in a real-world React project:\n\n| Rule                                   | Time (ms) | Relative |\n| -------------------------------------- | --------- | -------- |\n| prettier/prettier                      | 3299.631  | 19.2%    |\n| @typescript-eslint/no-misused-promises | 2473.767  | 14.4%    |\n| import/no-cycle                        | 1177.111  | 6.8%     |\n| import/namespace                       | 1148.731  | 6.7%     |\n\nAs illustrated, certain rules significantly increase linting time, potentially hindering the developer experience by slowing down the feedback loop. To mitigate this, you may consider disabling these resource-intensive rules in the development environment. However, they can remain active in environments where performance is less critical, such as Continuous Integration (CI) systems or during pre-commit checks (git hooks).\n\nTo conditionally disable expensive linting rules, you can modify your configuration as follows:\n\nList of `expensiveRules` to be affected:\n\n```sh\n@typescript-eslint/no-floating-promises\n@typescript-eslint/no-misused-promises\nimport/default # (disabled in TS env)\nimport/export # (disabled in TS env)\nimport/named # (disabled in TS env)\nimport/no-named-as-default-member # (disabled in TS env)\nimport/namespace\nimport/no-cycle\nimport/no-deprecated\n```\n\n```js\nexport default defineConfig({\n  disableExpensiveRules: !process.env.CI || !process.env.HUSKY, // Or anywhere you want\n  prettier: false // So you should run the formatter explicitly.\n});\n```\n\n## Migration Guide\n\n[See Migration Guide](./MIGRATION.md)\n\n## What's included?\n\n* [@eslint-react/eslint-plugin](https://eslint-react.xyz)\n* [@next/eslint-plugin-next](https://nextjs.org/docs/basic-features/eslint#eslint-plugin)\n* [@stylistic/eslint-plugin](https://eslint.style/packages/default)\n* [@vitest/eslint-plugin](https://github.com/vitest-dev/eslint-plugin-vitest)\n* [eslint-plugin-cypress](https://github.com/cypress-io/eslint-plugin-cypress)\n* [eslint-plugin-import-x](https://github.com/un-ts/eslint-plugin-import-x)\n* [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest)\n* [eslint-plugin-jest-formatting](https://github.com/dangreenisrael/eslint-plugin-jest-formatting)\n* [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y)\n* [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n)\n* [eslint-plugin-perfectionist](https://perfectionist.dev)\n* [eslint-plugin-playwright](https://github.com/playwright-community/eslint-plugin-playwright)\n* [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier)\n* [eslint-plugin-promise](https://github.com/eslint-community/eslint-plugin-promise)\n* [eslint-plugin-react-hooks](https://www.npmjs.com/package/eslint-plugin-react-hooks)\n* [eslint-plugin-storybook](https://github.com/storybookjs/eslint-plugin-storybook#readme)\n* [eslint-plugin-better-tailwindcss](https://github.com/schoero/eslint-plugin-better-tailwindcss)\n* [typescript-eslint](https://typescript-eslint.io)\n* [eslint-plugin-regexp](https://www.npmjs.com/package/eslint-plugin-regexp)\n\nThat's all. Feel free to use 💛\n\n[download-badge]: https://img.shields.io/npm/dm/@fullstacksjs/eslint-config?color=6464E2\u0026label=DOWNLOADS\u0026style=flat-square\n[version-badge]: https://img.shields.io/npm/v/@fullstacksjs/eslint-config?color=6464E2\u0026label=VERSION\u0026style=flat-square\n[license-badge]: https://img.shields.io/npm/l/@fullstacksjs/eslint-config?color=6464E2\u0026label=LICENSE\u0026style=flat-square\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffullstacksjs%2Feslint-config","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffullstacksjs%2Feslint-config","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffullstacksjs%2Feslint-config/lists"}