eslint-package-json
July 13, 2026 Β· View on GitHub
Powerful ESLint rules for
package.json
Lint and autofix your package.json files with ESLint, powered by @eslint/json.
This plugin catches real package.json mistakes (invalid names, bad version ranges, broken exports, misplaced @types/*, redundant files entries, and more) and fixes many of them automatically.
Install
npm install --save-dev eslint eslint-package-json
Requires ESLint >=10.4, flat config, and ESM.
Usage
Add the recommended config to your eslint.config.js:
import packageJson from 'eslint-package-json';
export default [
packageJson.configs.recommended,
];
This lints every package.json in your project. To tweak individual rules, add a config block after the preset:
import packageJson from 'eslint-package-json';
export default [
packageJson.configs.recommended,
{
files: [
'**/package.json'
],
rules: {
'package-json/dependency-version-range': [
'error',
{
range: 'caret'
}
]
}
}
];
If you prefer to wire it up manually instead of using a preset:
import json from '@eslint/json';
import packageJson from 'eslint-package-json';
export default [
{
files: [
'**/package.json'
],
language: 'json/json',
plugins: {
json,
'package-json': packageJson
},
rules: {
'package-json/valid-fields': 'error'
}
}
];
Configs
recommendedβ Enables the rules that catch real, uncontroversial mistakes.allβ Enables every rule. Useful for discovering rules; not recommended for everyday use.
Rules
πΌ Configurations enabled in.
β
Set in the recommended configuration.
π§ Automatically fixable by the --fix CLI option.
π‘ Manually fixable by editor suggestions.
| NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β | Description | πΌ | π§ | π‘ |
|---|---|---|---|---|
| consistent-name-casing | Enforce kebab-case for keys in scripts and bin objects. | |||
| consistent-path-prefix | Enforce consistent ./ prefix on local path fields. | β | π§ | |
| dependency-version-range | Enforce a consistent version range style for dependencies. | β | π‘ | |
| description-format | Enforce formatting of the description field. | π§ | ||
| no-absolute-paths | Disallow absolute paths in path fields. | β | ||
| no-backslash-paths | Enforce forward slashes in path fields. | β | π§ | |
| no-core-module-dependencies | Disallow dependencies that shadow Node.js built-in modules. | β | π‘ | |
| no-deprecated-fields | Disallow fields and scripts that npm has deprecated. | β | ||
| no-dist-tag-dependencies | Disallow dist-tags as dependency specifiers. | β | ||
| no-duplicate-dependencies | Disallow a dependency listed in multiple dependency groups. | β | π§ | |
| no-empty-fields | Disallow empty fields. | β | π‘ | |
| no-exact-peer-dependencies | Disallow exact versions for peer dependencies. | π‘ | ||
| no-exports-trailing-slash | Disallow deprecated trailing-slash folder mappings in exports/imports. | β | π§ | |
| no-git-dependencies | Disallow git URLs as dependency specifiers. | |||
| no-http-dependencies | Disallow HTTP URLs as dependency specifiers. | β | ||
| no-install-scripts | Disallow install lifecycle scripts. | β | π‘ | |
| no-invalid-direct-overrides | Disallow npm overrides that conflict with direct dependencies. | β | π§ | |
| no-local-dependencies | Disallow local filesystem paths as dependency specifiers. | |||
| no-manual-maintainers | Disallow a manually-set maintainers field. | β | π‘ | |
| no-missing-files | Disallow missing files referenced by package metadata. | |||
| no-orphan-script-hooks | Disallow pre/post script hooks without a corresponding script. | β | ||
| no-orphan-types | Disallow @types/* packages without a corresponding dependency. | β | π‘ | |
| no-overrides-in-published-package | Disallow overrides in packages that can be published. | β | π‘ | |
| no-package-manager-engines | Disallow package manager versions in the engines field. | β | π‘ | |
| no-pre-release-dependencies | Disallow pre-release versions as dependency specifiers. | |||
| no-redundant-files | Disallow redundant entries in the files field. | β | π§ | |
| no-redundant-repository-fields | Disallow bugs/homepage values that duplicate what npm infers from repository. | π§ | ||
| no-restricted-dependencies | Disallow specific dependencies. | |||
| no-restricted-fields | Disallow specific fields. | π‘ | ||
| no-self-dependency | Disallow a package depending on itself. | β | π‘ | |
| no-typo-fields | Disallow misspelled package.json field names. | β | π§ | |
| no-wildcard-dependencies | Disallow wildcard version ranges for dependencies. | β | ||
| no-workspace-protocol-in-published-package | Disallow workspace: dependency specifiers in packages that can be published. | β | ||
| peer-dependencies-as-dev-dependencies | Enforce peer dependencies to also be listed in devDependencies at a compatible version. | β | π‘ | |
| prefer-engines-range | Prefer open-ended >= ranges in the engines field. | β | π‘ | |
| prefer-exports | Prefer an exports-first package interface. | β | ||
| prefer-files-field | Require a files allowlist. | β | ||
| prefer-https-urls | Prefer https:// URLs in metadata fields. | β | π§ | |
| prefer-provenance | Enforce npm provenance via publishConfig.provenance. | π‘ | ||
| prefer-shorthand | Prefer the shorthand string form of fields where possible. | β | π§ | |
| prefer-side-effects-field | Recommend declaring the sideEffects field for packages. | β | π‘ | |
| prefer-type-module | Enforce the type field to be module. | β | π‘ | |
| require-bin-shebang | Require bin files to start with the exact #!/usr/bin/env node shebang. | β | ||
| require-default-condition | Require a default entry in exports/imports conditions objects. | β | ||
| require-engines | Require the engines.node field. | β | ||
| require-entry-point | Require an entry point field. | β | ||
| require-exports-root | Require a . root entry in the exports field. | |||
| require-fields | Require specific fields to be present, always or only for published packages. | β | ||
| require-private-when-workspaces | Require private when workspaces is set. | β | π‘ | |
| require-types-in-exports | Enforce that types are exposed through the exports field. | β | ||
| restrict-fields-when-private | Disallow fields that have no effect when the package is private. | π‘ | ||
| sort-dependencies | Enforce alphabetical ordering of dependencies. | β | π§ | |
| sort-files | Enforce a canonical order for entries in the files field. | β | π§ | |
| sort-properties | Enforce a canonical order for top-level package.json fields. | β | π§ | |
| sort-scripts | Enforce alphabetical ordering of scripts. | π§ | ||
| types-in-dev-dependencies | Enforce @types/* packages to be in devDependencies. | π‘ | ||
| valid-fields | Enforce valid values for package.json fields. | β | π§ | π‘ |
FAQ
How is this different from eslint-plugin-package-json?
Both lint package.json through ESLint, and eslint-plugin-package-json is a great project. I built this because I wanted a different design:
- Fewer, more powerful rules. Instead of dozens of near-identical rules (one per field, one per dependency group), I use a handful of rules with options. For example, one
dependency-version-rangerule with adependencyTypesoption replaces a whole family ofno-caret-*/prefer-tilde-*rules. Less to learn, less to configure. - Native
@eslint/json. I target ESLint's official JSON language directly, with no parser compatibility layer. - Autofix-first. Every rule that can safely fix or suggest a fix does.
Why not npm-package-json-lint?
It's a separate CLI with its own config format and no autofix. This plugin lives inside ESLint, so it shares your editor integration, --fix, and flat config.
How do I disable a rule for package.json?
package.json must be valid JSON, so it cannot contain comments.
Disable the rule in eslint.config.js instead:
import packageJson from 'eslint-package-json';
export default [
packageJson.configs.recommended,
{
files: [
'**/package.json',
],
rules: {
'package-json/no-orphan-types': 'off',
},
},
];
Use a more specific files pattern when the rule should be disabled for only one package.
Related
- eslint-plugin-unicorn β Lots of awesome ESLint rules.
- eslint-node-test β ESLint rules for the Node.js built-in test runner.