eslint-plugin-package-json 1.0.0-beta.2 → 1.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +96 -227
- package/lib/plugin.mjs +4 -6
- package/lib/rules/no-empty-fields.mjs +5 -4
- package/lib/rules/order-properties.d.mts +2 -2
- package/lib/rules/order-properties.mjs +3 -35
- package/package.json +12 -12
- package/lib/rules/valid-package-definition.d.mts +0 -20
- package/lib/rules/valid-package-definition.mjs +0 -44
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.0.0-beta.4](https://github.com/michaelfaith/eslint-plugin-package-json/compare/v1.0.0-beta.3...v1.0.0-beta.4) (2026-04-06)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### ⚠ BREAKING CHANGES
|
|
7
|
+
|
|
8
|
+
* **order-properties:** remove legacy order option
|
|
9
|
+
* remove `valid-package-definition` rule ([#1707](https://github.com/michaelfaith/eslint-plugin-package-json/issues/1707))
|
|
10
|
+
|
|
11
|
+
### 🚀 Features
|
|
12
|
+
|
|
13
|
+
* **order-properties:** remove legacy order option ([935f6dc](https://github.com/michaelfaith/eslint-plugin-package-json/commit/935f6dccccdfe7d61deb43e083647a0a1dc8e953))
|
|
14
|
+
* remove `valid-package-definition` rule ([#1707](https://github.com/michaelfaith/eslint-plugin-package-json/issues/1707)) ([a4a5b86](https://github.com/michaelfaith/eslint-plugin-package-json/commit/a4a5b86e94b1fd41da8b113f49c96a8149e30fa6))
|
|
15
|
+
|
|
16
|
+
## [1.0.0-beta.3](https://github.com/michaelfaith/eslint-plugin-package-json/compare/v1.0.0-beta.2...v1.0.0-beta.3) (2026-04-05)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### 🩹 Bug Fixes
|
|
20
|
+
|
|
21
|
+
* **no-empty-fields:** Allow `files` to be an empty list ([#1682](https://github.com/michaelfaith/eslint-plugin-package-json/issues/1682)) ([4311f74](https://github.com/michaelfaith/eslint-plugin-package-json/commit/4311f743a79b6fc792822680720106a2a84953d4))
|
|
22
|
+
|
|
23
|
+
## [0.91.1](https://github.com/michaelfaith/eslint-plugin-package-json/compare/v0.91.0...v0.91.1) (2026-03-27)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### 🩹 Bug Fixes
|
|
27
|
+
|
|
28
|
+
* **no-empty-fields:** Allow `files` to be an empty list ([#1682](https://github.com/michaelfaith/eslint-plugin-package-json/issues/1682)) ([4311f74](https://github.com/michaelfaith/eslint-plugin-package-json/commit/4311f743a79b6fc792822680720106a2a84953d4))
|
|
29
|
+
|
|
3
30
|
## [1.0.0-beta.2](https://github.com/michaelfaith/eslint-plugin-package-json/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2026-03-13)
|
|
4
31
|
|
|
5
32
|
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<p align="center">
|
|
9
9
|
<!-- prettier-ignore-start -->
|
|
10
10
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
11
|
-
<a href="#contributors" target="_blank"><img alt="👪 All Contributors:
|
|
11
|
+
<a href="#contributors" target="_blank"><img alt="👪 All Contributors: 41" src="https://img.shields.io/badge/%F0%9F%91%AA_all_contributors-41-21bb42.svg" /></a>
|
|
12
12
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
13
13
|
<!-- prettier-ignore-end -->
|
|
14
14
|
<a href="https://github.com/michaelfaith/eslint-plugin-package-json/blob/main/.github/CODE_OF_CONDUCT.md" target="_blank"><img alt="🤝 Code of Conduct: Kept" src="https://img.shields.io/badge/%F0%9F%A4%9D_code_of_conduct-kept-21bb42" /></a>
|
|
@@ -18,139 +18,9 @@
|
|
|
18
18
|
<img alt="💪 TypeScript: Strict" src="https://img.shields.io/badge/%F0%9F%92%AA_typescript-strict-21bb42.svg" />
|
|
19
19
|
</p>
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## Getting Started
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
```shell
|
|
26
|
-
npm install eslint eslint-plugin-package-json --save-dev
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Usage
|
|
30
|
-
|
|
31
|
-
### Recommended Config
|
|
32
|
-
|
|
33
|
-
This plugin's recommended configuration enables its rules on `**/package.json` files, parsing them with [`jsonc-eslint-parser`](https://github.com/ota-meshi/jsonc-eslint-parser).
|
|
34
|
-
|
|
35
|
-
```ts
|
|
36
|
-
// eslint.config.ts
|
|
37
|
-
import packageJson from "eslint-plugin-package-json";
|
|
38
|
-
import { defineConfig } from "eslint/config";
|
|
39
|
-
|
|
40
|
-
export default defineConfig([
|
|
41
|
-
// your other ESLint configurations
|
|
42
|
-
packageJson.configs.recommended,
|
|
43
|
-
]);
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
If you want to override the recommended rules:
|
|
47
|
-
|
|
48
|
-
```ts
|
|
49
|
-
// eslint.config.ts
|
|
50
|
-
import packageJson from "eslint-plugin-package-json";
|
|
51
|
-
import { defineConfig } from "eslint/config";
|
|
52
|
-
|
|
53
|
-
export default defineConfig([
|
|
54
|
-
// your other ESLint configurations
|
|
55
|
-
{
|
|
56
|
-
extends: [packageJson.configs.recommended],
|
|
57
|
-
files: ["package.json"],
|
|
58
|
-
rules: {
|
|
59
|
-
"package-json/require-author": "error",
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
]);
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
See [ESLint's _Configuration Files_ guide](https://eslint.org/docs/latest/use/configure/configuration-files-new) for details on how to customize your rules and other config settings.
|
|
66
|
-
|
|
67
|
-
### Recommended Config for Publishable Packages
|
|
68
|
-
|
|
69
|
-
> [!NOTE]
|
|
70
|
-
> This config was recently made redundant and is now the same as `recommended`.
|
|
71
|
-
> However, we're keeping it as its own config for now, in the event that we add new rules unique to the publishable use case.
|
|
72
|
-
|
|
73
|
-
The `recommended-publishable` configuration has everything in it from the standard `recommended` config, with some additional rules added that are geared towards packages that are intended to be published.
|
|
74
|
-
|
|
75
|
-
```ts
|
|
76
|
-
// eslint.config.ts
|
|
77
|
-
import packageJson from "eslint-plugin-package-json";
|
|
78
|
-
import { defineConfig } from "eslint/config";
|
|
79
|
-
|
|
80
|
-
export default defineConfig([
|
|
81
|
-
// your other ESLint configurations
|
|
82
|
-
packageJson.configs["recommended-publishable"],
|
|
83
|
-
]);
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### Stylistic Config
|
|
87
|
-
|
|
88
|
-
The `stylistic` configuration sets up the parser and files similar to the recommended config, but includes rules that are more opinionated about the style of a package.json.
|
|
89
|
-
This can be used in addition to the recommended config, or on its own.
|
|
90
|
-
|
|
91
|
-
```ts
|
|
92
|
-
// eslint.config.ts
|
|
93
|
-
import packageJson from "eslint-plugin-package-json";
|
|
94
|
-
import { defineConfig } from "eslint/config";
|
|
95
|
-
|
|
96
|
-
export default defineConfig([
|
|
97
|
-
// your other ESLint configurations
|
|
98
|
-
packageJson.configs.recommended, // or packageJson.configs["recommended-publishable"]
|
|
99
|
-
packageJson.configs.stylistic,
|
|
100
|
-
]);
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### Settings
|
|
104
|
-
|
|
105
|
-
Some rules can be configured in ESLint shared settings.
|
|
106
|
-
You can set them in `settings.packageJson` in an ESLint flat config.
|
|
107
|
-
|
|
108
|
-
Example:
|
|
109
|
-
|
|
110
|
-
```ts
|
|
111
|
-
// eslint.config.ts
|
|
112
|
-
import packageJson from "eslint-plugin-package-json";
|
|
113
|
-
import { defineConfig } from "eslint/config";
|
|
114
|
-
|
|
115
|
-
export default defineConfig({
|
|
116
|
-
plugins: {
|
|
117
|
-
"package-json": packageJson,
|
|
118
|
-
},
|
|
119
|
-
rules: {
|
|
120
|
-
// `description` won't be required in package.json with `"private": true`
|
|
121
|
-
"package-json/require-description": "error",
|
|
122
|
-
},
|
|
123
|
-
settings: {
|
|
124
|
-
packageJson: {
|
|
125
|
-
enforceForPrivate: false,
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
|
-
});
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
#### `enforceForPrivate`
|
|
132
|
-
|
|
133
|
-
- **Type:** `boolean`
|
|
134
|
-
- **Default:** [see below]
|
|
135
|
-
|
|
136
|
-
When a package.json file has a `"private": true` field, it indicates that the package will not be published to npm (or another online registry).
|
|
137
|
-
Some fields that are nice to have in public packages become less relevant when a package is private.
|
|
138
|
-
This option determines whether `require-*` rules, if used, should enforce the presence of the corresponding property in package.json files that have `"private": true`.
|
|
139
|
-
|
|
140
|
-
By default, this is:
|
|
141
|
-
|
|
142
|
-
- `false` for [`require-name`](docs/rules/require-name.md) and [`require-version`](docs/rules/require-version.md).
|
|
143
|
-
- `true` for every other `require-*` rule.
|
|
144
|
-
|
|
145
|
-
By specifying this setting as `true` or `false`, it will override the defaults and apply the setting for ALL rules.
|
|
146
|
-
In that case, either all `require-*` rules will be applied to private packages or no `require-*` rules will be applied to private packages.
|
|
147
|
-
Even then, you can override the setting again at the rule level, by using the rule's `ignorePrivate` option, which will take precedence over this global setting.
|
|
148
|
-
|
|
149
|
-
### Usage Alongside Prettier
|
|
150
|
-
|
|
151
|
-
**[`prettier-plugin-packagejson`](https://github.com/matzkoh/prettier-plugin-packagejson)** is a [Prettier plugin](https://prettier.io/docs/en/plugins) that enforces the same `package.json` keys ordering as the [`order-properties`](docs/rules/order-properties.md) and [sort-collections](docs/rules/sort-collections.md) rules with default options.
|
|
152
|
-
We recommend using both the Prettier plugin and `eslint-plugin-package-json`'s recommended configuration.
|
|
153
|
-
The default settings don't conflict, and Prettier plugins can quickly fix up ordering in your editor on save and/or as a Git hook.
|
|
23
|
+
See [Getting Started](https://github.com/michaelfaith/eslint-plugin-package-json/blob/main/docs/getting-started.md) for details.
|
|
154
24
|
|
|
155
25
|
## Supported Rules
|
|
156
26
|
|
|
@@ -162,96 +32,94 @@ The default settings don't conflict, and Prettier plugins can quickly fix up ord
|
|
|
162
32
|
📦 Set in the `recommended-publishable` configuration.\
|
|
163
33
|
🎨 Set in the `stylistic` configuration.\
|
|
164
34
|
🔧 Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\
|
|
165
|
-
💡 Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions)
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
|
169
|
-
|
|
|
170
|
-
| [
|
|
171
|
-
| [
|
|
172
|
-
| [no-
|
|
173
|
-
| [no-redundant-
|
|
174
|
-
| [
|
|
175
|
-
| [
|
|
176
|
-
| [
|
|
177
|
-
| [require-
|
|
178
|
-
| [require-
|
|
179
|
-
| [require-
|
|
180
|
-
| [require-
|
|
181
|
-
| [require-
|
|
182
|
-
| [require-
|
|
183
|
-
| [require-
|
|
184
|
-
| [require-
|
|
185
|
-
| [require-
|
|
186
|
-
| [require-
|
|
187
|
-
| [require-
|
|
188
|
-
| [require-
|
|
189
|
-
| [require-
|
|
190
|
-
| [require-
|
|
191
|
-
| [require-
|
|
192
|
-
| [require-
|
|
193
|
-
| [require-
|
|
194
|
-
| [require-
|
|
195
|
-
| [require-
|
|
196
|
-
| [require-
|
|
197
|
-
| [require-
|
|
198
|
-
| [require-
|
|
199
|
-
| [require-
|
|
200
|
-
| [require-
|
|
201
|
-
| [require-
|
|
202
|
-
| [require-
|
|
203
|
-
| [require-
|
|
204
|
-
| [require-
|
|
205
|
-
| [require-
|
|
206
|
-
| [require-
|
|
207
|
-
| [require-
|
|
208
|
-
| [require-
|
|
209
|
-
| [require-
|
|
210
|
-
| [require-
|
|
211
|
-
| [
|
|
212
|
-
| [restrict-
|
|
213
|
-
| [
|
|
214
|
-
| [
|
|
215
|
-
| [
|
|
216
|
-
| [
|
|
217
|
-
| [
|
|
218
|
-
| [valid-
|
|
219
|
-
| [valid-
|
|
220
|
-
| [valid-
|
|
221
|
-
| [valid-
|
|
222
|
-
| [valid-
|
|
223
|
-
| [valid-
|
|
224
|
-
| [valid-
|
|
225
|
-
| [valid-
|
|
226
|
-
| [valid-
|
|
227
|
-
| [valid-
|
|
228
|
-
| [valid-
|
|
229
|
-
| [valid-
|
|
230
|
-
| [valid-
|
|
231
|
-
| [valid-
|
|
232
|
-
| [valid-
|
|
233
|
-
| [valid-
|
|
234
|
-
| [valid-
|
|
235
|
-
| [valid-
|
|
236
|
-
| [valid-
|
|
237
|
-
| [valid-
|
|
238
|
-
| [valid-
|
|
239
|
-
| [valid-
|
|
240
|
-
| [valid-
|
|
241
|
-
| [valid-
|
|
242
|
-
| [valid-
|
|
243
|
-
| [valid-
|
|
244
|
-
| [valid-
|
|
245
|
-
| [valid-
|
|
246
|
-
| [valid-
|
|
247
|
-
| [valid-
|
|
248
|
-
| [valid-
|
|
249
|
-
| [valid-
|
|
250
|
-
| [valid-
|
|
251
|
-
| [valid-
|
|
252
|
-
| [valid-
|
|
253
|
-
| [valid-version](docs/rules/valid-version.md) | Enforce that package versions are valid semver specifiers | ✅ 📦 | | | |
|
|
254
|
-
| [valid-workspaces](docs/rules/valid-workspaces.md) | Enforce that the `workspaces` property is valid. | ✅ 📦 | | | |
|
|
35
|
+
💡 Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).
|
|
36
|
+
|
|
37
|
+
| Name | Description | 💼 | 🔧 | 💡 |
|
|
38
|
+
| :------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--- | :- | :- |
|
|
39
|
+
| [bin-name-casing](docs/rules/bin-name-casing.md) | Enforce that names for bin properties are in kebab case. | 🎨 | | 💡 |
|
|
40
|
+
| [exports-subpaths-style](docs/rules/exports-subpaths-style.md) | Enforce consistent format for the exports field (implicit or explicit subpaths). | 🎨 | 🔧 | |
|
|
41
|
+
| [no-empty-fields](docs/rules/no-empty-fields.md) | Reports on unnecessary empty arrays and objects. | ✅ 📦 | | 💡 |
|
|
42
|
+
| [no-redundant-files](docs/rules/no-redundant-files.md) | Prevents adding unnecessary / redundant files. | ✅ 📦 | | 💡 |
|
|
43
|
+
| [no-redundant-publishConfig](docs/rules/no-redundant-publishConfig.md) | Warns when publishConfig.access is used in unscoped packages. | ✅ 📦 | | 💡 |
|
|
44
|
+
| [order-properties](docs/rules/order-properties.md) | Package properties should be declared in standard order | 🎨 | 🔧 | |
|
|
45
|
+
| [repository-shorthand](docs/rules/repository-shorthand.md) | Enforce either object or shorthand declaration for repository. | ✅ 📦 | 🔧 | |
|
|
46
|
+
| [require-attribution](docs/rules/require-attribution.md) | Ensures that proper attribution is included, requiring that either `author` or `contributors` is defined, and that if `contributors` is present, it should include at least one contributor. | ✅ 📦 | | 💡 |
|
|
47
|
+
| [require-author](docs/rules/require-author.md) | Requires the `author` property to be present. | | | |
|
|
48
|
+
| [require-bin](docs/rules/require-bin.md) | Requires the `bin` property to be present. | | | |
|
|
49
|
+
| [require-bugs](docs/rules/require-bugs.md) | Requires the `bugs` property to be present. | | | |
|
|
50
|
+
| [require-bundleDependencies](docs/rules/require-bundleDependencies.md) | Requires the `bundleDependencies` property to be present. | | | |
|
|
51
|
+
| [require-contributors](docs/rules/require-contributors.md) | Requires the `contributors` property to be present. | | | |
|
|
52
|
+
| [require-cpu](docs/rules/require-cpu.md) | Requires the `cpu` property to be present. | | | |
|
|
53
|
+
| [require-dependencies](docs/rules/require-dependencies.md) | Requires the `dependencies` property to be present. | | | |
|
|
54
|
+
| [require-description](docs/rules/require-description.md) | Requires the `description` property to be present. | ✅ 📦 | | |
|
|
55
|
+
| [require-devDependencies](docs/rules/require-devDependencies.md) | Requires the `devDependencies` property to be present. | | | |
|
|
56
|
+
| [require-devEngines](docs/rules/require-devEngines.md) | Requires the `devEngines` property to be present. | | | |
|
|
57
|
+
| [require-directories](docs/rules/require-directories.md) | Requires the `directories` property to be present. | | | |
|
|
58
|
+
| [require-engines](docs/rules/require-engines.md) | Requires the `engines` property to be present. | | | |
|
|
59
|
+
| [require-exports](docs/rules/require-exports.md) | Requires the `exports` property to be present. | ✅ 📦 | | |
|
|
60
|
+
| [require-files](docs/rules/require-files.md) | Requires the `files` property to be present. | ✅ 📦 | | |
|
|
61
|
+
| [require-funding](docs/rules/require-funding.md) | Requires the `funding` property to be present. | | | |
|
|
62
|
+
| [require-homepage](docs/rules/require-homepage.md) | Requires the `homepage` property to be present. | | | |
|
|
63
|
+
| [require-keywords](docs/rules/require-keywords.md) | Requires the `keywords` property to be present. | | | |
|
|
64
|
+
| [require-license](docs/rules/require-license.md) | Requires the `license` property to be present. | ✅ 📦 | | |
|
|
65
|
+
| [require-main](docs/rules/require-main.md) | Requires the `main` property to be present. | | | |
|
|
66
|
+
| [require-man](docs/rules/require-man.md) | Requires the `man` property to be present. | | | |
|
|
67
|
+
| [require-module](docs/rules/require-module.md) | Requires the `module` property to be present. | | | |
|
|
68
|
+
| [require-name](docs/rules/require-name.md) | Requires the `name` property to be present. | ✅ 📦 | | |
|
|
69
|
+
| [require-optionalDependencies](docs/rules/require-optionalDependencies.md) | Requires the `optionalDependencies` property to be present. | | | |
|
|
70
|
+
| [require-os](docs/rules/require-os.md) | Requires the `os` property to be present. | | | |
|
|
71
|
+
| [require-packageManager](docs/rules/require-packageManager.md) | Requires the `packageManager` property to be present. | | | |
|
|
72
|
+
| [require-peerDependencies](docs/rules/require-peerDependencies.md) | Requires the `peerDependencies` property to be present. | | | |
|
|
73
|
+
| [require-private](docs/rules/require-private.md) | Requires the `private` property to be present. | | 🔧 | |
|
|
74
|
+
| [require-publishConfig](docs/rules/require-publishConfig.md) | Requires the `publishConfig` property to be present. | | | |
|
|
75
|
+
| [require-repository](docs/rules/require-repository.md) | Requires the `repository` property to be present. | ✅ 📦 | | |
|
|
76
|
+
| [require-scripts](docs/rules/require-scripts.md) | Requires the `scripts` property to be present. | | | |
|
|
77
|
+
| [require-sideEffects](docs/rules/require-sideEffects.md) | Requires the `sideEffects` property to be present. | ✅ 📦 | | |
|
|
78
|
+
| [require-type](docs/rules/require-type.md) | Requires the `type` property to be present. | ✅ 📦 | 🔧 | |
|
|
79
|
+
| [require-types](docs/rules/require-types.md) | Requires the `types` property to be present. | | | |
|
|
80
|
+
| [require-version](docs/rules/require-version.md) | Requires the `version` property to be present. | ✅ 📦 | | |
|
|
81
|
+
| [restrict-dependency-ranges](docs/rules/restrict-dependency-ranges.md) | Restricts the range of dependencies to allow or disallow specific types of ranges. | | | 💡 |
|
|
82
|
+
| [restrict-private-properties](docs/rules/restrict-private-properties.md) | Disallows unnecessary properties in private packages. | | 🔧 | 💡 |
|
|
83
|
+
| [scripts-name-casing](docs/rules/scripts-name-casing.md) | Enforce that names for `scripts` are in kebab case (optionally separated by colons). | 🎨 | | 💡 |
|
|
84
|
+
| [sort-collections](docs/rules/sort-collections.md) | Selected collections must be in a consistent order (lexicographical for most; lifecycle-aware for scripts). | ✅ 📦 | 🔧 | |
|
|
85
|
+
| [specify-peers-locally](docs/rules/specify-peers-locally.md) | Requires that all peer dependencies are also declared as dev dependencies | ✅ 📦 | | 💡 |
|
|
86
|
+
| [unique-dependencies](docs/rules/unique-dependencies.md) | Checks a dependency isn't specified more than once (i.e. in `dependencies` and `devDependencies`) | ✅ 📦 | | 💡 |
|
|
87
|
+
| [valid-author](docs/rules/valid-author.md) | Enforce that the `author` property is valid. | ✅ 📦 | | |
|
|
88
|
+
| [valid-bin](docs/rules/valid-bin.md) | Enforce that the `bin` property is valid. | ✅ 📦 | | |
|
|
89
|
+
| [valid-bugs](docs/rules/valid-bugs.md) | Enforce that the `bugs` property is valid. | ✅ 📦 | | |
|
|
90
|
+
| [valid-bundleDependencies](docs/rules/valid-bundleDependencies.md) | Enforce that the `bundleDependencies` (also: `bundledDependencies`) property is valid. | ✅ 📦 | | |
|
|
91
|
+
| [valid-config](docs/rules/valid-config.md) | Enforce that the `config` property is valid. | ✅ 📦 | | |
|
|
92
|
+
| [valid-contributors](docs/rules/valid-contributors.md) | Enforce that the `contributors` property is valid. | ✅ 📦 | | |
|
|
93
|
+
| [valid-cpu](docs/rules/valid-cpu.md) | Enforce that the `cpu` property is valid. | ✅ 📦 | | |
|
|
94
|
+
| [valid-dependencies](docs/rules/valid-dependencies.md) | Enforce that the `dependencies` property is valid. | ✅ 📦 | | |
|
|
95
|
+
| [valid-description](docs/rules/valid-description.md) | Enforce that the `description` property is valid. | ✅ 📦 | | |
|
|
96
|
+
| [valid-devDependencies](docs/rules/valid-devDependencies.md) | Enforce that the `devDependencies` property is valid. | ✅ 📦 | | |
|
|
97
|
+
| [valid-devEngines](docs/rules/valid-devEngines.md) | Enforce that the `devEngines` property is valid. | ✅ 📦 | | |
|
|
98
|
+
| [valid-directories](docs/rules/valid-directories.md) | Enforce that the `directories` property is valid. | ✅ 📦 | | |
|
|
99
|
+
| [valid-engines](docs/rules/valid-engines.md) | Enforce that the `engines` property is valid. | ✅ 📦 | | |
|
|
100
|
+
| [valid-exports](docs/rules/valid-exports.md) | Enforce that the `exports` property is valid. | ✅ 📦 | | |
|
|
101
|
+
| [valid-files](docs/rules/valid-files.md) | Enforce that the `files` property is valid. | ✅ 📦 | | |
|
|
102
|
+
| [valid-funding](docs/rules/valid-funding.md) | Enforce that the `funding` property is valid. | ✅ 📦 | | |
|
|
103
|
+
| [valid-homepage](docs/rules/valid-homepage.md) | Enforce that the `homepage` property is valid. | ✅ 📦 | | |
|
|
104
|
+
| [valid-keywords](docs/rules/valid-keywords.md) | Enforce that the `keywords` property is valid. | ✅ 📦 | | |
|
|
105
|
+
| [valid-license](docs/rules/valid-license.md) | Enforce that the `license` property is valid. | ✅ 📦 | | |
|
|
106
|
+
| [valid-main](docs/rules/valid-main.md) | Enforce that the `main` property is valid. | ✅ 📦 | | |
|
|
107
|
+
| [valid-man](docs/rules/valid-man.md) | Enforce that the `man` property is valid. | ✅ 📦 | | |
|
|
108
|
+
| [valid-module](docs/rules/valid-module.md) | Enforce that the `module` property is valid. | ✅ 📦 | | |
|
|
109
|
+
| [valid-name](docs/rules/valid-name.md) | Enforce that package names are valid npm package names | ✅ 📦 | | |
|
|
110
|
+
| [valid-optionalDependencies](docs/rules/valid-optionalDependencies.md) | Enforce that the `optionalDependencies` property is valid. | ✅ 📦 | | |
|
|
111
|
+
| [valid-os](docs/rules/valid-os.md) | Enforce that the `os` property is valid. | ✅ 📦 | | |
|
|
112
|
+
| [valid-packageManager](docs/rules/valid-packageManager.md) | Enforce that the `packageManager` property is valid. | ✅ 📦 | | |
|
|
113
|
+
| [valid-peerDependencies](docs/rules/valid-peerDependencies.md) | Enforce that the `peerDependencies` property is valid. | ✅ 📦 | | |
|
|
114
|
+
| [valid-private](docs/rules/valid-private.md) | Enforce that the `private` property is valid. | ✅ 📦 | | |
|
|
115
|
+
| [valid-publishConfig](docs/rules/valid-publishConfig.md) | Enforce that the `publishConfig` property is valid. | ✅ 📦 | | |
|
|
116
|
+
| [valid-repository](docs/rules/valid-repository.md) | Enforce that the `repository` property is valid. | ✅ 📦 | | |
|
|
117
|
+
| [valid-repository-directory](docs/rules/valid-repository-directory.md) | Enforce that if repository directory is specified, it matches the path to the package.json file | ✅ 📦 | | 💡 |
|
|
118
|
+
| [valid-scripts](docs/rules/valid-scripts.md) | Enforce that the `scripts` property is valid. | ✅ 📦 | | |
|
|
119
|
+
| [valid-sideEffects](docs/rules/valid-sideEffects.md) | Enforce that the `sideEffects` property is valid. | ✅ 📦 | | |
|
|
120
|
+
| [valid-type](docs/rules/valid-type.md) | Enforce that the `type` property is valid. | ✅ 📦 | | |
|
|
121
|
+
| [valid-version](docs/rules/valid-version.md) | Enforce that package versions are valid semver specifiers | ✅ 📦 | | |
|
|
122
|
+
| [valid-workspaces](docs/rules/valid-workspaces.md) | Enforce that the `workspaces` property is valid. | ✅ 📦 | | |
|
|
255
123
|
|
|
256
124
|
<!-- end auto-generated rules list -->
|
|
257
125
|
<!-- prettier-ignore-end -->
|
|
@@ -302,41 +170,42 @@ Thanks! 🗂
|
|
|
302
170
|
</tr>
|
|
303
171
|
<tr>
|
|
304
172
|
<td align="center" valign="top" width="14.28%"><a href="https://christopher-buss.gitbook.io/portfolio"><img src="https://avatars.githubusercontent.com/u/32301681?v=4?s=100" width="100px;" alt="Christopher Buss"/><br /><sub><b>Christopher Buss</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Achristopher-buss" title="Bug reports">🐛</a> <a href="#ideas-christopher-buss" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=christopher-buss" title="Code">💻</a></td>
|
|
173
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ClementValot"><img src="https://avatars.githubusercontent.com/u/65364056?v=4?s=100" width="100px;" alt="Clément Valot"/><br /><sub><b>Clément Valot</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3AClementValot" title="Bug reports">🐛</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=ClementValot" title="Code">💻</a></td>
|
|
305
174
|
<td align="center" valign="top" width="14.28%"><a href="http://www.curtisjewell.dev/"><img src="https://avatars.githubusercontent.com/u/67483?v=4?s=100" width="100px;" alt="Curtis Jewell"/><br /><sub><b>Curtis Jewell</b></sub></a><br /><a href="#ideas-csjewell" title="Ideas, Planning, & Feedback">🤔</a></td>
|
|
306
175
|
<td align="center" valign="top" width="14.28%"><a href="https://davidlj95.com"><img src="https://avatars.githubusercontent.com/u/8050648?v=4?s=100" width="100px;" alt="David LJ"/><br /><sub><b>David LJ</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=davidlj95" title="Documentation">📖</a></td>
|
|
307
176
|
<td align="center" valign="top" width="14.28%"><a href="http://lishaduck.github.io"><img src="https://avatars.githubusercontent.com/u/88557639?v=4?s=100" width="100px;" alt="Eli"/><br /><sub><b>Eli</b></sub></a><br /><a href="#ideas-lishaduck" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Alishaduck" title="Bug reports">🐛</a></td>
|
|
308
177
|
<td align="center" valign="top" width="14.28%"><a href="https://open-fixture-library.org"><img src="https://avatars.githubusercontent.com/u/202916?v=4?s=100" width="100px;" alt="Flo Edelmann"/><br /><sub><b>Flo Edelmann</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=FloEdelmann" title="Documentation">📖</a></td>
|
|
309
178
|
<td align="center" valign="top" width="14.28%"><a href="http://heggria.site"><img src="https://avatars.githubusercontent.com/u/34475327?v=4?s=100" width="100px;" alt="Heggria"/><br /><sub><b>Heggria</b></sub></a><br /><a href="#ideas-heggria" title="Ideas, Planning, & Feedback">🤔</a></td>
|
|
310
|
-
<td align="center" valign="top" width="14.28%"><a href="https://hirok.io"><img src="https://avatars.githubusercontent.com/u/1075694?v=4?s=100" width="100px;" alt="Hiroki Osame"/><br /><sub><b>Hiroki Osame</b></sub></a><br /><a href="#ideas-privatenumber" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=privatenumber" title="Code">💻</a></td>
|
|
311
179
|
</tr>
|
|
312
180
|
<tr>
|
|
181
|
+
<td align="center" valign="top" width="14.28%"><a href="https://hirok.io"><img src="https://avatars.githubusercontent.com/u/1075694?v=4?s=100" width="100px;" alt="Hiroki Osame"/><br /><sub><b>Hiroki Osame</b></sub></a><br /><a href="#ideas-privatenumber" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=privatenumber" title="Code">💻</a></td>
|
|
313
182
|
<td align="center" valign="top" width="14.28%"><a href="https://vanyauhalin.me/"><img src="https://avatars.githubusercontent.com/u/56481109?v=4?s=100" width="100px;" alt="Ivan Uhalin"/><br /><sub><b>Ivan Uhalin</b></sub></a><br /><a href="#ideas-vanyauhalin" title="Ideas, Planning, & Feedback">🤔</a></td>
|
|
314
183
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Zamiell"><img src="https://avatars.githubusercontent.com/u/5511220?v=4?s=100" width="100px;" alt="James"/><br /><sub><b>James</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=Zamiell" title="Code">💻</a> <a href="#ideas-Zamiell" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3AZamiell" title="Bug reports">🐛</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=Zamiell" title="Documentation">📖</a></td>
|
|
315
184
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zetlen"><img src="https://avatars.githubusercontent.com/u/1643758?v=4?s=100" width="100px;" alt="James Zetlen"/><br /><sub><b>James Zetlen</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=zetlen" title="Code">💻</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Azetlen" title="Bug reports">🐛</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=zetlen" title="Documentation">📖</a> <a href="#infra-zetlen" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-zetlen" title="Maintenance">🚧</a> <a href="#tool-zetlen" title="Tools">🔧</a></td>
|
|
316
185
|
<td align="center" valign="top" width="14.28%"><a href="https://piranna.github.io/"><img src="https://avatars.githubusercontent.com/u/532414?v=4?s=100" width="100px;" alt="Jesús Leganés-Combarro"/><br /><sub><b>Jesús Leganés-Combarro</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=piranna" title="Code">💻</a></td>
|
|
317
186
|
<td align="center" valign="top" width="14.28%"><a href="http://www.joshuakgoldberg.com/"><img src="https://avatars.githubusercontent.com/u/3335181?v=4?s=100" width="100px;" alt="Josh Goldberg ✨"/><br /><sub><b>Josh Goldberg ✨</b></sub></a><br /><a href="#tool-JoshuaKGoldberg" title="Tools">🔧</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3AJoshuaKGoldberg" title="Bug reports">🐛</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=JoshuaKGoldberg" title="Code">💻</a> <a href="#infra-JoshuaKGoldberg" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=JoshuaKGoldberg" title="Documentation">📖</a> <a href="#maintenance-JoshuaKGoldberg" title="Maintenance">🚧</a> <a href="#ideas-JoshuaKGoldberg" title="Ideas, Planning, & Feedback">🤔</a> <a href="#content-JoshuaKGoldberg" title="Content">🖋</a> <a href="#projectManagement-JoshuaKGoldberg" title="Project Management">📆</a></td>
|
|
318
187
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kendallgassner"><img src="https://avatars.githubusercontent.com/u/15275462?v=4?s=100" width="100px;" alt="Kendall Gassner"/><br /><sub><b>Kendall Gassner</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=kendallgassner" title="Code">💻</a> <a href="#maintenance-kendallgassner" title="Maintenance">🚧</a></td>
|
|
319
|
-
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KristjanESPERANTO"><img src="https://avatars.githubusercontent.com/u/35647502?v=4?s=100" width="100px;" alt="Kristjan ESPERANTO"/><br /><sub><b>Kristjan ESPERANTO</b></sub></a><br /><a href="#ideas-kristjanesperanto" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Akristjanesperanto" title="Bug reports">🐛</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=kristjanesperanto" title="Code">💻</a></td>
|
|
320
188
|
</tr>
|
|
321
189
|
<tr>
|
|
190
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KristjanESPERANTO"><img src="https://avatars.githubusercontent.com/u/35647502?v=4?s=100" width="100px;" alt="Kristjan ESPERANTO"/><br /><sub><b>Kristjan ESPERANTO</b></sub></a><br /><a href="#ideas-kristjanesperanto" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Akristjanesperanto" title="Bug reports">🐛</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=kristjanesperanto" title="Code">💻</a></td>
|
|
322
191
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marcalexiei"><img src="https://avatars.githubusercontent.com/u/24919330?v=4?s=100" width="100px;" alt="Marco Pasqualetti"/><br /><sub><b>Marco Pasqualetti</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=marcalexiei" title="Code">💻</a> <a href="#tool-marcalexiei" title="Tools">🔧</a> <a href="#maintenance-marcalexiei" title="Maintenance">🚧</a></td>
|
|
323
192
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lo1tuma"><img src="https://avatars.githubusercontent.com/u/169170?v=4?s=100" width="100px;" alt="Mathias Schreck"/><br /><sub><b>Mathias Schreck</b></sub></a><br /><a href="#ideas-lo1tuma" title="Ideas, Planning, & Feedback">🤔</a></td>
|
|
324
193
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Cellule"><img src="https://avatars.githubusercontent.com/u/4157103?v=4?s=100" width="100px;" alt="Michael "Mike" Ferris"/><br /><sub><b>Michael "Mike" Ferris</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=cellule" title="Code">💻</a></td>
|
|
325
194
|
<td align="center" valign="top" width="14.28%"><a href="https://morrisoncole.co.uk"><img src="https://avatars.githubusercontent.com/u/963368?v=4?s=100" width="100px;" alt="Morrison Cole"/><br /><sub><b>Morrison Cole</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3AMorrisonCole" title="Bug reports">🐛</a></td>
|
|
326
195
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nschonni"><img src="https://avatars.githubusercontent.com/u/1297909?v=4?s=100" width="100px;" alt="Nick Schonning"/><br /><sub><b>Nick Schonning</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=nschonni" title="Code">💻</a></td>
|
|
327
196
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/OlivierZal"><img src="https://avatars.githubusercontent.com/u/88216225?v=4?s=100" width="100px;" alt="Olivier Zalmanski"/><br /><sub><b>Olivier Zalmanski</b></sub></a><br /><a href="#maintenance-olivierzal" title="Maintenance">🚧</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=olivierzal" title="Documentation">📖</a></td>
|
|
328
|
-
<td align="center" valign="top" width="14.28%"><a href="http://patrikcsak.com"><img src="https://avatars.githubusercontent.com/u/4766244?v=4?s=100" width="100px;" alt="Patrik Csak"/><br /><sub><b>Patrik Csak</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Apatrik-csak" title="Bug reports">🐛</a></td>
|
|
329
197
|
</tr>
|
|
330
198
|
<tr>
|
|
199
|
+
<td align="center" valign="top" width="14.28%"><a href="http://patrikcsak.com"><img src="https://avatars.githubusercontent.com/u/4766244?v=4?s=100" width="100px;" alt="Patrik Csak"/><br /><sub><b>Patrik Csak</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Apatrik-csak" title="Bug reports">🐛</a></td>
|
|
331
200
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rakleed"><img src="https://avatars.githubusercontent.com/u/19418601?v=4?s=100" width="100px;" alt="Pavel"/><br /><sub><b>Pavel</b></sub></a><br /><a href="#ideas-rakleed" title="Ideas, Planning, & Feedback">🤔</a> <a href="#tool-rakleed" title="Tools">🔧</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=rakleed" title="Documentation">📖</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=rakleed" title="Code">💻</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Arakleed" title="Bug reports">🐛</a></td>
|
|
332
201
|
<td align="center" valign="top" width="14.28%"><a href="https://sasial.dev"><img src="https://avatars.githubusercontent.com/u/44125644?v=4?s=100" width="100px;" alt="Sasial"/><br /><sub><b>Sasial</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=sasial-dev" title="Code">💻</a></td>
|
|
333
202
|
<td align="center" valign="top" width="14.28%"><a href="https://shayan-zamani.me"><img src="https://avatars.githubusercontent.com/u/81762186?v=4?s=100" width="100px;" alt="Shayan Zamani"/><br /><sub><b>Shayan Zamani</b></sub></a><br /><a href="#ideas-ShayanTheNerd" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=ShayanTheNerd" title="Documentation">📖</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=ShayanTheNerd" title="Code">💻</a></td>
|
|
334
203
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Sigmabrogz"><img src="https://avatars.githubusercontent.com/u/122412346?v=4?s=100" width="100px;" alt="Sigmabro"/><br /><sub><b>Sigmabro</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=Sigmabrogz" title="Code">💻</a></td>
|
|
335
204
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sirugh"><img src="https://avatars.githubusercontent.com/u/1278869?v=4?s=100" width="100px;" alt="Stephen"/><br /><sub><b>Stephen</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=sirugh" title="Code">💻</a></td>
|
|
336
205
|
<td align="center" valign="top" width="14.28%"><a href="https://hyoban.cc"><img src="https://avatars.githubusercontent.com/u/38493346?v=4?s=100" width="100px;" alt="Stephen Zhou"/><br /><sub><b>Stephen Zhou</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Ahyoban" title="Bug reports">🐛</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=hyoban" title="Code">💻</a> <a href="#ideas-hyoban" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=hyoban" title="Documentation">📖</a></td>
|
|
337
|
-
<td align="center" valign="top" width="14.28%"><a href="https://ota-meshi.github.io/"><img src="https://avatars.githubusercontent.com/u/16508807?v=4?s=100" width="100px;" alt="Yosuke Ota"/><br /><sub><b>Yosuke Ota</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Aota-meshi" title="Bug reports">🐛</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=ota-meshi" title="Code">💻</a></td>
|
|
338
206
|
</tr>
|
|
339
207
|
<tr>
|
|
208
|
+
<td align="center" valign="top" width="14.28%"><a href="https://ota-meshi.github.io/"><img src="https://avatars.githubusercontent.com/u/16508807?v=4?s=100" width="100px;" alt="Yosuke Ota"/><br /><sub><b>Yosuke Ota</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Aota-meshi" title="Bug reports">🐛</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=ota-meshi" title="Code">💻</a></td>
|
|
340
209
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/b3rnhard"><img src="https://avatars.githubusercontent.com/u/10774404?v=4?s=100" width="100px;" alt="b3rnhard"/><br /><sub><b>b3rnhard</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Ab3rnhard" title="Bug reports">🐛</a></td>
|
|
341
210
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/chouchouji"><img src="https://avatars.githubusercontent.com/u/70570907?v=4?s=100" width="100px;" alt="chouchouji"/><br /><sub><b>chouchouji</b></sub></a><br /><a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=chouchouji" title="Code">💻</a></td>
|
|
342
211
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/michaelfaith"><img src="https://avatars.githubusercontent.com/u/8071845?v=4?s=100" width="100px;" alt="michael faith"/><br /><sub><b>michael faith</b></sub></a><br /><a href="#infra-michaelfaith" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=michaelfaith" title="Code">💻</a> <a href="#maintenance-michaelfaith" title="Maintenance">🚧</a> <a href="#ideas-michaelfaith" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/issues?q=author%3Amichaelfaith" title="Bug reports">🐛</a> <a href="#tool-michaelfaith" title="Tools">🔧</a> <a href="https://github.com/michaelfaith/eslint-plugin-package-json/commits?author=michaelfaith" title="Documentation">📖</a> <a href="#projectManagement-michaelfaith" title="Project Management">📆</a></td>
|
package/lib/plugin.mjs
CHANGED
|
@@ -14,10 +14,9 @@ import { rule as rule$11 } from "./rules/sort-collections.mjs";
|
|
|
14
14
|
import { rule as rule$12 } from "./rules/specify-peers-locally.mjs";
|
|
15
15
|
import { rule as rule$13 } from "./rules/unique-dependencies.mjs";
|
|
16
16
|
import { rule as rule$14 } from "./rules/valid-name.mjs";
|
|
17
|
-
import { rule as rule$15 } from "./rules/valid-package-definition.mjs";
|
|
18
17
|
import { rules as rules$2 } from "./rules/valid-properties.mjs";
|
|
19
|
-
import { rule as rule$
|
|
20
|
-
import { rule as rule$
|
|
18
|
+
import { rule as rule$15 } from "./rules/valid-repository-directory.mjs";
|
|
19
|
+
import { rule as rule$16 } from "./rules/valid-version.mjs";
|
|
21
20
|
import { createRequire } from "node:module";
|
|
22
21
|
import * as parserJsonc from "jsonc-eslint-parser";
|
|
23
22
|
//#region src/plugin.ts
|
|
@@ -40,9 +39,8 @@ const rules = {
|
|
|
40
39
|
"unique-dependencies": rule$13,
|
|
41
40
|
...rules$2,
|
|
42
41
|
"valid-name": rule$14,
|
|
43
|
-
"valid-
|
|
44
|
-
"valid-
|
|
45
|
-
"valid-version": rule$17
|
|
42
|
+
"valid-repository-directory": rule$15,
|
|
43
|
+
"valid-version": rule$16
|
|
46
44
|
};
|
|
47
45
|
const recommendedRules = { ...Object.fromEntries(Object.entries(rules).filter(([, rule]) => rule.meta.docs?.recommended).map(([name]) => ["package-json/" + name, "error"])) };
|
|
48
46
|
const recommendedPublishableRules = {
|
|
@@ -37,16 +37,17 @@ const getTopLevelProperty = (node) => {
|
|
|
37
37
|
while (n.parent.parent?.parent?.type !== void 0 && n.parent.parent.parent.type !== "Program") n = n.parent;
|
|
38
38
|
return n.type === "JSONProperty" ? n.key : void 0;
|
|
39
39
|
};
|
|
40
|
+
const defaultIgnoreProperties = ["files"];
|
|
40
41
|
const rule = createRule({
|
|
41
42
|
create(context) {
|
|
42
|
-
const ignoreProperties = context.options[0]?.ignoreProperties ??
|
|
43
|
+
const ignoreProperties = new Set(context.options[0]?.ignoreProperties ?? defaultIgnoreProperties);
|
|
43
44
|
return {
|
|
44
45
|
JSONArrayExpression(node) {
|
|
45
46
|
const topLevelProperty = getTopLevelProperty(node);
|
|
46
47
|
if (!topLevelProperty) return;
|
|
47
48
|
if (!node.elements.length) {
|
|
48
49
|
const topLevelPropertyName = topLevelProperty.value;
|
|
49
|
-
if (!ignoreProperties.
|
|
50
|
+
if (!ignoreProperties.has(topLevelPropertyName)) report(context, getNode(node));
|
|
50
51
|
}
|
|
51
52
|
},
|
|
52
53
|
JSONObjectExpression(node) {
|
|
@@ -54,13 +55,13 @@ const rule = createRule({
|
|
|
54
55
|
if (!topLevelProperty) return;
|
|
55
56
|
if (!node.properties.length) {
|
|
56
57
|
const topLevelPropertyName = topLevelProperty.value;
|
|
57
|
-
if (!ignoreProperties.
|
|
58
|
+
if (!ignoreProperties.has(topLevelPropertyName)) report(context, getNode(node));
|
|
58
59
|
}
|
|
59
60
|
}
|
|
60
61
|
};
|
|
61
62
|
},
|
|
62
63
|
meta: {
|
|
63
|
-
defaultOptions: [{ ignoreProperties:
|
|
64
|
+
defaultOptions: [{ ignoreProperties: defaultIgnoreProperties }],
|
|
64
65
|
docs: {
|
|
65
66
|
category: "Best Practices",
|
|
66
67
|
description: "Reports on unnecessary empty arrays and objects.",
|
|
@@ -2,13 +2,13 @@ import { PackageJsonRuleModule } from "../createRule.mjs";
|
|
|
2
2
|
|
|
3
3
|
//#region src/rules/order-properties.d.ts
|
|
4
4
|
declare const rule: PackageJsonRuleModule<[({
|
|
5
|
-
order?: "sort-package-json" |
|
|
5
|
+
order?: "sort-package-json" | string[] | undefined;
|
|
6
6
|
} | undefined)?], [{
|
|
7
7
|
readonly additionalProperties: false;
|
|
8
8
|
readonly properties: {
|
|
9
9
|
readonly order: {
|
|
10
10
|
readonly anyOf: readonly [{
|
|
11
|
-
readonly enum: readonly ["
|
|
11
|
+
readonly enum: readonly ["sort-package-json"];
|
|
12
12
|
readonly type: readonly ["string"];
|
|
13
13
|
}, {
|
|
14
14
|
readonly items: {
|
|
@@ -4,44 +4,12 @@ import { detectNewlineGraceful } from "detect-newline";
|
|
|
4
4
|
import sortObjectKeys from "sort-object-keys";
|
|
5
5
|
import { sortOrder } from "sort-package-json";
|
|
6
6
|
//#region src/rules/order-properties.ts
|
|
7
|
-
const standardOrderLegacy = [
|
|
8
|
-
"name",
|
|
9
|
-
"version",
|
|
10
|
-
"private",
|
|
11
|
-
"publishConfig",
|
|
12
|
-
"description",
|
|
13
|
-
"main",
|
|
14
|
-
"exports",
|
|
15
|
-
"browser",
|
|
16
|
-
"files",
|
|
17
|
-
"bin",
|
|
18
|
-
"directories",
|
|
19
|
-
"man",
|
|
20
|
-
"scripts",
|
|
21
|
-
"repository",
|
|
22
|
-
"keywords",
|
|
23
|
-
"author",
|
|
24
|
-
"license",
|
|
25
|
-
"bugs",
|
|
26
|
-
"homepage",
|
|
27
|
-
"config",
|
|
28
|
-
"dependencies",
|
|
29
|
-
"devDependencies",
|
|
30
|
-
"peerDependencies",
|
|
31
|
-
"optionalDependencies",
|
|
32
|
-
"bundledDependencies",
|
|
33
|
-
"engines",
|
|
34
|
-
"os",
|
|
35
|
-
"cpu"
|
|
36
|
-
];
|
|
37
7
|
const rule = createRule({
|
|
38
8
|
create(context) {
|
|
39
9
|
return { "Program:exit"() {
|
|
40
10
|
const { ast, text } = context.sourceCode;
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
const { order } = options;
|
|
44
|
-
const requiredOrder = order === "legacy" ? standardOrderLegacy : order === "sort-package-json" ? sortOrder : order;
|
|
11
|
+
const { order = "sort-package-json" } = context.options[0] ?? {};
|
|
12
|
+
const requiredOrder = order === "sort-package-json" ? sortOrder : order;
|
|
45
13
|
const json = JSON.parse(text);
|
|
46
14
|
const orderedNonStandardKeys = Object.keys(json).filter((key) => !requiredOrder.includes(key)).sort();
|
|
47
15
|
const orderedSource = sortObjectKeys(json, [...requiredOrder, ...orderedNonStandardKeys]);
|
|
@@ -78,7 +46,7 @@ const rule = createRule({
|
|
|
78
46
|
additionalProperties: false,
|
|
79
47
|
properties: { order: {
|
|
80
48
|
anyOf: [{
|
|
81
|
-
enum: ["
|
|
49
|
+
enum: ["sort-package-json"],
|
|
82
50
|
type: ["string"]
|
|
83
51
|
}, {
|
|
84
52
|
items: { type: ["string"] },
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-package-json",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.4",
|
|
4
4
|
"description": "Rules for consistent, readable, and valid package.json files. 🗂️",
|
|
5
5
|
"homepage": "https://github.com/michaelfaith/eslint-plugin-package-json#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -59,39 +59,39 @@
|
|
|
59
59
|
"devDependencies": {
|
|
60
60
|
"@eslint-community/eslint-plugin-eslint-comments": "4.7.0",
|
|
61
61
|
"@eslint/js": "10.0.1",
|
|
62
|
-
"@eslint/markdown": "
|
|
62
|
+
"@eslint/markdown": "8.0.1",
|
|
63
63
|
"@types/estree": "1.0.8",
|
|
64
64
|
"@types/node": "24.12.0",
|
|
65
65
|
"@types/semver": "7.7.1",
|
|
66
66
|
"@types/validate-npm-package-name": "4.0.2",
|
|
67
|
-
"@vitest/coverage-v8": "4.0
|
|
67
|
+
"@vitest/coverage-v8": "4.1.0",
|
|
68
68
|
"@vitest/eslint-plugin": "1.6.1",
|
|
69
69
|
"console-fail-test": "0.6.0",
|
|
70
|
-
"eslint": "10.
|
|
70
|
+
"eslint": "10.1.0",
|
|
71
71
|
"eslint-doc-generator": "3.3.1",
|
|
72
72
|
"eslint-plugin-eslint-plugin": "7.3.1",
|
|
73
|
-
"eslint-plugin-jsdoc": "62.
|
|
73
|
+
"eslint-plugin-jsdoc": "62.9.0",
|
|
74
74
|
"eslint-plugin-jsonc": "3.1.0",
|
|
75
75
|
"eslint-plugin-n": "17.24.0",
|
|
76
76
|
"eslint-plugin-node-dependencies": "2.2.0",
|
|
77
|
-
"eslint-plugin-perfectionist": "5.
|
|
77
|
+
"eslint-plugin-perfectionist": "5.8.0",
|
|
78
78
|
"eslint-plugin-regexp": "3.1.0",
|
|
79
|
-
"eslint-plugin-unicorn": "
|
|
79
|
+
"eslint-plugin-unicorn": "64.0.0",
|
|
80
80
|
"eslint-plugin-yml": "3.3.0",
|
|
81
81
|
"husky": "9.1.7",
|
|
82
82
|
"jiti": "2.6.1",
|
|
83
83
|
"json-schema-to-ts": "3.1.1",
|
|
84
|
-
"knip": "
|
|
85
|
-
"lint-staged": "16.
|
|
84
|
+
"knip": "6.2.0",
|
|
85
|
+
"lint-staged": "16.4.0",
|
|
86
86
|
"prettier": "3.8.0",
|
|
87
87
|
"prettier-plugin-curly": "0.4.0",
|
|
88
88
|
"prettier-plugin-packagejson": "3.0.0",
|
|
89
89
|
"prettier-plugin-sentences-per-line": "0.2.3",
|
|
90
90
|
"prettier-plugin-sh": "0.18.0",
|
|
91
91
|
"tsdown": "0.21.0",
|
|
92
|
-
"typescript": "
|
|
93
|
-
"typescript-eslint": "8.
|
|
94
|
-
"vitest": "4.0
|
|
92
|
+
"typescript": "6.0.2",
|
|
93
|
+
"typescript-eslint": "8.58.0",
|
|
94
|
+
"vitest": "4.1.0"
|
|
95
95
|
},
|
|
96
96
|
"peerDependencies": {
|
|
97
97
|
"eslint": ">=9.0.0"
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { PackageJsonRuleModule } from "../createRule.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/rules/valid-package-definition.d.ts
|
|
4
|
-
declare const rule: PackageJsonRuleModule<[({
|
|
5
|
-
ignoreProperties?: string[] | undefined;
|
|
6
|
-
} | undefined)?], [{
|
|
7
|
-
readonly additionalProperties: false;
|
|
8
|
-
readonly properties: {
|
|
9
|
-
readonly ignoreProperties: {
|
|
10
|
-
readonly description: "Array of top-level package properties to ignore.";
|
|
11
|
-
readonly items: {
|
|
12
|
-
readonly type: "string";
|
|
13
|
-
};
|
|
14
|
-
readonly type: "array";
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
readonly type: "object";
|
|
18
|
-
}]>;
|
|
19
|
-
//#endregion
|
|
20
|
-
export { rule };
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { createRule } from "../createRule.mjs";
|
|
2
|
-
import { validate } from "package-json-validator";
|
|
3
|
-
//#region src/rules/valid-package-definition.ts
|
|
4
|
-
const ignoredErrors = [
|
|
5
|
-
/^Url not valid/i,
|
|
6
|
-
/^Invalid version range for .+?: file:/i,
|
|
7
|
-
/^author field should have name/i
|
|
8
|
-
];
|
|
9
|
-
const isUsableError = (errorText) => ignoredErrors.every((pattern) => !pattern.test(errorText));
|
|
10
|
-
const rule = createRule({
|
|
11
|
-
create(context) {
|
|
12
|
-
const ignoreProperties = context.options[0]?.ignoreProperties ?? [];
|
|
13
|
-
return { "Program:exit"() {
|
|
14
|
-
const usableErrors = validate(context.sourceCode.text).errors?.filter((error) => {
|
|
15
|
-
return isUsableError(error.message) && !ignoreProperties.includes(error.field);
|
|
16
|
-
}) ?? [];
|
|
17
|
-
for (const error of usableErrors) if (error.message) context.report({
|
|
18
|
-
message: error.message,
|
|
19
|
-
node: context.sourceCode.ast
|
|
20
|
-
});
|
|
21
|
-
} };
|
|
22
|
-
},
|
|
23
|
-
meta: {
|
|
24
|
-
defaultOptions: [{ ignoreProperties: [] }],
|
|
25
|
-
deprecated: true,
|
|
26
|
-
docs: {
|
|
27
|
-
category: "Best Practices",
|
|
28
|
-
description: "Enforce that package.json has all properties required by the npm spec"
|
|
29
|
-
},
|
|
30
|
-
schema: [{
|
|
31
|
-
additionalProperties: false,
|
|
32
|
-
properties: { ignoreProperties: {
|
|
33
|
-
description: "Array of top-level package properties to ignore.",
|
|
34
|
-
items: { type: "string" },
|
|
35
|
-
type: "array"
|
|
36
|
-
} },
|
|
37
|
-
type: "object"
|
|
38
|
-
}],
|
|
39
|
-
type: "problem"
|
|
40
|
-
},
|
|
41
|
-
name: "valid-package-definition"
|
|
42
|
-
});
|
|
43
|
-
//#endregion
|
|
44
|
-
export { rule };
|