{"id":13801285,"url":"https://github.com/eslint-community/eslint-plugin-n","last_synced_at":"2026-01-10T02:37:19.492Z","repository":{"id":37830411,"uuid":"93131028","full_name":"eslint-community/eslint-plugin-n","owner":"eslint-community","description":"Additional ESLint rules for Node.js","archived":false,"fork":true,"pushed_at":"2024-04-11T08:47:52.000Z","size":1674,"stargazers_count":167,"open_issues_count":24,"forks_count":29,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-04-12T12:01:00.736Z","etag":null,"topics":["eslint","eslint-plugin","node","nodejs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"mysticatea/eslint-plugin-node","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eslint-community.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},"funding":{"github":["mysticatea"]}},"created_at":"2017-06-02T05:42:14.000Z","updated_at":"2024-04-09T22:51:21.000Z","dependencies_parsed_at":"2023-02-10T04:30:34.237Z","dependency_job_id":null,"html_url":"https://github.com/eslint-community/eslint-plugin-n","commit_stats":{"total_commits":456,"total_committers":54,"mean_commits":8.444444444444445,"dds":"0.35526315789473684","last_synced_commit":"49d3ee780c57be2eabdb577d892e2f2430ec3888"},"previous_names":["weiran-zsd/eslint-plugin-node"],"tags_count":99,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eslint-community%2Feslint-plugin-n","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eslint-community%2Feslint-plugin-n/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eslint-community%2Feslint-plugin-n/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eslint-community%2Feslint-plugin-n/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eslint-community","download_url":"https://codeload.github.com/eslint-community/eslint-plugin-n/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219875693,"owners_count":16554702,"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":["eslint","eslint-plugin","node","nodejs"],"created_at":"2024-08-04T00:01:21.220Z","updated_at":"2025-10-02T13:31:20.497Z","avatar_url":"https://github.com/eslint-community.png","language":"JavaScript","funding_links":["https://github.com/sponsors/mysticatea"],"categories":["JavaScript","Plugins","Utilities"],"sub_categories":["Languages and Environments","ESLint Plugins"],"readme":"# eslint-plugin-n\n\n\u003e forked from [eslint-plugin-node](https://www.npmjs.com/package/eslint-plugin-node) v11.1.0. as the original repository seems [no longer maintained](https://github.com/mysticatea/eslint-plugin-node/issues/300).\n\n[![npm version](https://img.shields.io/npm/v/eslint-plugin-n.svg)](https://www.npmjs.com/package/eslint-plugin-n)\n[![Downloads](https://img.shields.io/npm/dm/eslint-plugin-n.svg)](https://www.npmjs.com/package/eslint-plugin-n)\n[![Build Status](https://github.com/eslint-community/eslint-plugin-n/workflows/CI/badge.svg)](https://github.com/eslint-community/eslint-plugin-n/actions)\n\nAdditional ESLint rules for Node.js\n\n## 🎨 Playground\n\n[online-playground](https://eslint-online-playground.netlify.app/#eNp1jzEOwjAMRa9SeWFpYS8rOwtiIQxRalWBxIniFIFQ747bCASV2BK/Lz//J3AyG7xrHx2uLwwtWB9DytXKW2ZLfVP+q60iqGGN7CzlZCQbSNJPRVWlAO8ZqWMFbXWS3xxqE5rgvcyxU1BLKrqht9TS5oec67Kj0PcO+gI6MaZ9zDYUPEtnrfH6iIkFTHMFTmfkLLZ3gsOQDB4eEUvAh25w8p74qGiUTlGbq+6n9t+NOrztME4nkrG40M79/hgLbEqbZnHXRzu+APYwfks=)\n\n## 💿 Install \u0026 Usage\n\n```sh\nnpm install --save-dev eslint eslint-plugin-n\n```\n\n| Version | Supported Node.js | Supported ESLint Version | Status |\n|---------|-------------------|---------------------------|--------|\n| 17.x   | `^18.18.0 \\|\\| ^20.9.0 \\|\\| \u003e=21.1.0`  | `\u003e=8.23.0`          | 🏃‍♂️actively maintained |\n| 16.x   | `\u003e=16.0.0`   | `\u003e=7.0.0`          | ⚠️EOL |\n| 15.x   | `\u003e=12.22.0`  | `\u003e=7.0.0`          | ⚠️EOL |\n\n**Note:** It recommends a use of [the \"engines\" field of package.json](https://docs.npmjs.com/files/package.json#engines). The \"engines\" field is used by `n/no-unsupported-features/*` rules.\n\n### [`eslint.config.js`](https://eslint.org/docs/latest/use/configure/configuration-files-new) (requires eslint\u003e=v8.23.0)\n\n```js\nconst nodePlugin = require(\"eslint-plugin-n\")\n\nmodule.exports = [\n    nodePlugin.configs[\"flat/recommended-script\"],\n    {\n        rules: {\n            \"n/exports-style\": [\"error\", \"module.exports\"]\n        }\n    }\n]\n```\n\nTo setup without the recommended configs, you'll need to add the plugin:\n\n```js\nconst nodePlugin = require(\"eslint-plugin-n\")\n\nmodule.exports = [\n    {\n        plugins: {n: nodePlugin},\n        rules: {\n            \"n/exports-style\": [\"error\", \"module.exports\"]\n        }\n    }\n]\n```\n\n### **[.eslintrc.json](https://eslint.org/docs/latest/use/configure/configuration-files)** (legacy example)\n\n```jsonc\n{\n    \"extends\": [\"eslint:recommended\", \"plugin:n/recommended\"],\n    \"parserOptions\": {\n        \"ecmaVersion\": 2021\n    },\n    \"rules\": {\n        \"n/exports-style\": [\"error\", \"module.exports\"]\n    }\n}\n```\n\nTo setup without the recommended rules you'll need to add the plugin:\n\n```jsonc\n{\n    \"parserOptions\": {\n        \"ecmaVersion\": 2021\n    },\n    \"plugins\": [\"n\"],\n    \"rules\": {\n        \"n/exports-style\": [\"error\", \"module.exports\"]\n    }\n}\n```\n\n**package.json** (An example)\n\n```json\n{\n    \"name\": \"your-module\",\n    \"version\": \"1.0.0\",\n    \"type\": \"commonjs\",\n    \"engines\": {\n        \"node\": \"\u003e=8.10.0\"\n    }\n}\n```\n\n### Configured Node.js version range\n\nThe rules get the supported Node.js version range from the following, falling back to the next if unspecified:\n\n1. Rule configuration `version`\n2. ESLint [shared setting](http://eslint.org/docs/user-guide/configuring.html#adding-shared-settings) `node.version`\n3. `package.json` [`engines`] field\n4. `\u003e=16.0.0`\n\nIf you omit the [engines] field, this rule chooses `\u003e=16.0.0` as the configured Node.js version since `16` is the maintained lts (see also [Node.js Release Working Group](https://github.com/nodejs/Release#readme)).\n\nFor Node.js packages, using the [`engines`] field is recommended because it's the official way to indicate support:\n\n```json\n{\n    \"name\": \"your-module\",\n    \"version\": \"1.0.0\",\n    \"engines\": {\n        \"node\": \"\u003e=16.0.0\"\n    }\n}\n```\n\nFor [Shareable Configs](https://eslint.org/docs/latest/developer-guide/shareable-configs) or packages with a different development environment (e.g. pre-compiled, web package, etc.), you can configure ESLint with `settings.node.version` to specify support.\n\n## 📖 Rules\n\n\u003c!-- begin auto-generated rules list --\u003e\n\n💼 [Configurations](https://github.com/eslint-community/eslint-plugin-n#-configs) enabled in.\\\n🟢 Set in the `recommended-module` [configuration](https://github.com/eslint-community/eslint-plugin-n#-configs).\\\n✅ Set in the `recommended-script` [configuration](https://github.com/eslint-community/eslint-plugin-n#-configs).\\\n🔧 Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\\\n❌ Deprecated.\n\n| Name                                                                                         | Description                                                                 | 💼   | 🔧 | ❌  |\n| :------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | :--- | :- | :- |\n| [callback-return](docs/rules/callback-return.md)                                             | require `return` statements after callbacks                                 |      |    |    |\n| [exports-style](docs/rules/exports-style.md)                                                 | enforce either `module.exports` or `exports`                                |      | 🔧 |    |\n| [file-extension-in-import](docs/rules/file-extension-in-import.md)                           | enforce the style of file extensions in `import` declarations               |      | 🔧 |    |\n| [global-require](docs/rules/global-require.md)                                               | require `require()` calls to be placed at top-level module scope            |      |    |    |\n| [handle-callback-err](docs/rules/handle-callback-err.md)                                     | require error handling in callbacks                                         |      |    |    |\n| [hashbang](docs/rules/hashbang.md)                                                           | require correct usage of hashbang                                           | 🟢 ✅ | 🔧 |    |\n| [no-callback-literal](docs/rules/no-callback-literal.md)                                     | enforce Node.js-style error-first callback pattern is followed              |      |    |    |\n| [no-deprecated-api](docs/rules/no-deprecated-api.md)                                         | disallow deprecated APIs                                                    | 🟢 ✅ |    |    |\n| [no-exports-assign](docs/rules/no-exports-assign.md)                                         | disallow the assignment to `exports`                                        | 🟢 ✅ |    |    |\n| [no-extraneous-import](docs/rules/no-extraneous-import.md)                                   | disallow `import` declarations which import extraneous modules              | 🟢 ✅ |    |    |\n| [no-extraneous-require](docs/rules/no-extraneous-require.md)                                 | disallow `require()` expressions which import extraneous modules            | 🟢 ✅ |    |    |\n| [no-hide-core-modules](docs/rules/no-hide-core-modules.md)                                   | disallow third-party modules which are hiding core modules                  |      |    | ❌  |\n| [no-missing-import](docs/rules/no-missing-import.md)                                         | disallow `import` declarations which import missing modules                 | 🟢 ✅ |    |    |\n| [no-missing-require](docs/rules/no-missing-require.md)                                       | disallow `require()` expressions which import missing modules               | 🟢 ✅ |    |    |\n| [no-mixed-requires](docs/rules/no-mixed-requires.md)                                         | disallow `require` calls to be mixed with regular variable declarations     |      |    |    |\n| [no-new-require](docs/rules/no-new-require.md)                                               | disallow `new` operators with calls to `require`                            |      |    |    |\n| [no-path-concat](docs/rules/no-path-concat.md)                                               | disallow string concatenation with `__dirname` and `__filename`             |      |    |    |\n| [no-process-env](docs/rules/no-process-env.md)                                               | disallow the use of `process.env`                                           |      |    |    |\n| [no-process-exit](docs/rules/no-process-exit.md)                                             | disallow the use of `process.exit()`                                        | 🟢 ✅ |    |    |\n| [no-restricted-import](docs/rules/no-restricted-import.md)                                   | disallow specified modules when loaded by `import` declarations             |      |    |    |\n| [no-restricted-require](docs/rules/no-restricted-require.md)                                 | disallow specified modules when loaded by `require`                         |      |    |    |\n| [no-sync](docs/rules/no-sync.md)                                                             | disallow synchronous methods                                                |      |    |    |\n| [no-top-level-await](docs/rules/no-top-level-await.md)                                       | disallow top-level `await` in published modules                             |      |    |    |\n| [no-unpublished-bin](docs/rules/no-unpublished-bin.md)                                       | disallow `bin` files that npm ignores                                       | 🟢 ✅ |    |    |\n| [no-unpublished-import](docs/rules/no-unpublished-import.md)                                 | disallow `import` declarations which import private modules                 | 🟢 ✅ |    |    |\n| [no-unpublished-require](docs/rules/no-unpublished-require.md)                               | disallow `require()` expressions which import private modules               | 🟢 ✅ |    |    |\n| [no-unsupported-features/es-builtins](docs/rules/no-unsupported-features/es-builtins.md)     | disallow unsupported ECMAScript built-ins on the specified version          | 🟢 ✅ |    |    |\n| [no-unsupported-features/es-syntax](docs/rules/no-unsupported-features/es-syntax.md)         | disallow unsupported ECMAScript syntax on the specified version             | 🟢 ✅ |    |    |\n| [no-unsupported-features/node-builtins](docs/rules/no-unsupported-features/node-builtins.md) | disallow unsupported Node.js built-in APIs on the specified version         | 🟢 ✅ |    |    |\n| [prefer-global/buffer](docs/rules/prefer-global/buffer.md)                                   | enforce either `Buffer` or `require(\"buffer\").Buffer`                       |      |    |    |\n| [prefer-global/console](docs/rules/prefer-global/console.md)                                 | enforce either `console` or `require(\"console\")`                            |      |    |    |\n| [prefer-global/process](docs/rules/prefer-global/process.md)                                 | enforce either `process` or `require(\"process\")`                            |      |    |    |\n| [prefer-global/text-decoder](docs/rules/prefer-global/text-decoder.md)                       | enforce either `TextDecoder` or `require(\"util\").TextDecoder`               |      |    |    |\n| [prefer-global/text-encoder](docs/rules/prefer-global/text-encoder.md)                       | enforce either `TextEncoder` or `require(\"util\").TextEncoder`               |      |    |    |\n| [prefer-global/url](docs/rules/prefer-global/url.md)                                         | enforce either `URL` or `require(\"url\").URL`                                |      |    |    |\n| [prefer-global/url-search-params](docs/rules/prefer-global/url-search-params.md)             | enforce either `URLSearchParams` or `require(\"url\").URLSearchParams`        |      |    |    |\n| [prefer-node-protocol](docs/rules/prefer-node-protocol.md)                                   | enforce using the `node:` protocol when importing Node.js builtin modules.  |      | 🔧 |    |\n| [prefer-promises/dns](docs/rules/prefer-promises/dns.md)                                     | enforce `require(\"dns\").promises`                                           |      |    |    |\n| [prefer-promises/fs](docs/rules/prefer-promises/fs.md)                                       | enforce `require(\"fs\").promises`                                            |      |    |    |\n| [process-exit-as-throw](docs/rules/process-exit-as-throw.md)                                 | require that `process.exit()` expressions use the same code path as `throw` | 🟢 ✅ |    |    |\n| [shebang](docs/rules/shebang.md)                                                             | require correct usage of hashbang                                           |      | 🔧 | ❌  |\n\n\u003c!-- end auto-generated rules list --\u003e\n\n## 🔧 Configs\n\n\u003c!-- begin auto-generated configs list --\u003e\n\n|    | Name                 |\n| :- | :------------------- |\n| 🟢 | `recommended-module` |\n| ✅  | `recommended-script` |\n\n\u003c!-- end auto-generated configs list --\u003e\n\nAbout each config:\n\n- `recommended`: Considers both CommonJS and ES Modules. If [`\"type\":\"module\"` field](https://medium.com/@nodejs/announcing-a-new-experimental-modules-1be8d2d6c2ff#b023) existed in package.json then it considers files as ES Modules. Otherwise it considers files as CommonJS. In addition, it considers `*.mjs` files as ES Modules and `*.cjs` files as CommonJS.\n- `recommended-module`: Considers all files as ES Modules.\n- `recommended-script`: Considers all files as CommonJS.\n- `flat/all`: enables all of the rules shipped with the package. This configuration is **not recommended** for production use because it may change with every minor and major version. Use at your own risk.\n\nThese preset configs:\n\n- enable [no-process-exit](http://eslint.org/docs/rules/no-process-exit) rule because [the official document](https://nodejs.org/api/process.html#process_process_exit_code) does not recommend a use of `process.exit()`.\n- enable plugin rules indicated by emojis in the [rules table](#-rules).\n- add `{ecmaVersion: 2021}` and etc into `parserOptions`.\n- add proper globals into `globals`.\n- add this plugin into `plugins`.\n\n## 👫 FAQ\n\n- Q: The `no-missing-import` / `no-missing-require` rules don't work with nested folders in SublimeLinter-eslint\n- A: See [context.getFilename() in rule returns relative path](https://github.com/roadhump/SublimeLinter-eslint#contextgetfilename-in-rule-returns-relative-path) in the SublimeLinter-eslint FAQ.\n\n- Q: How to use the flat eslint config with mixed commonjs and es modules?\n- A: You can use the new exported flat config `flat/mixed-esm-and-cjs`, an example:\n\n```js\nconst nodePlugin = require(\"eslint-plugin-n\");\n\nmodule.exports = [\n  ...nodePlugin.configs[\"flat/mixed-esm-and-cjs\"],\n  {\n    rules: {\n      \"n/exports-style\": [\"error\", \"module.exports\"],\n    },\n  },\n]\n```\n\n## 🚥 Semantic Versioning Policy\n\n`eslint-plugin-n` follows [semantic versioning](http://semver.org/) and [ESLint's Semantic Versioning Policy](https://github.com/eslint/eslint#semantic-versioning-policy).\n\n- Patch release (intended to not break your lint build)\n  - A bug fix in a rule that results in it reporting fewer errors.\n  - Improvements to documentation.\n  - Non-user-facing changes such as refactoring code, adding, deleting, or modifying tests, and increasing test coverage.\n  - Re-releasing after a failed release (i.e., publishing a release that doesn't work for anyone).\n- Minor release (might break your lint build)\n  - A bug fix in a rule that results in it reporting more errors.\n  - A new rule is created.\n  - A new option to an existing rule is created.\n  - An existing rule is deprecated.\n- Major release (likely to break your lint build)\n  - A support for old Node version is dropped.\n  - A support for old ESLint version is dropped.\n  - An existing rule is changed in it reporting more errors.\n  - An existing rule is removed.\n  - An existing option of a rule is removed.\n  - An existing config is updated.\n\nDeprecated rules follow ESLint's [deprecation policy](https://eslint.org/docs/user-guide/rule-deprecation).\n\n## 📰 Changelog\n\n- [GitHub Releases](https://github.com/eslint-community/eslint-plugin-n/releases)\n\n## ❤️ Contributing\n\nWelcome contributing!\n\nPlease use GitHub's Issues/PRs.\n\n### Development Tools\n\n- `npm test` runs tests and measures coverage.\n- `npm run coverage` shows the coverage result of `npm test` command.\n- `npm run clean` removes the coverage result of `npm test` command.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feslint-community%2Feslint-plugin-n","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feslint-community%2Feslint-plugin-n","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feslint-community%2Feslint-plugin-n/lists"}