eslint-plugin-package-json 0.82.0 β†’ 0.84.0

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 CHANGED
@@ -1,11 +1,23 @@
1
1
  # Changelog
2
2
 
3
- # [0.82.0](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/compare/v0.81.0...v0.82.0) (2025-11-17)
3
+ # [0.84.0](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/compare/v0.83.0...v0.84.0) (2025-11-18)
4
+
5
+
6
+ ### Features
7
+
8
+ * add new `recommended-publishable` config ([#1413](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1413)) ([ba313a6](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/commit/ba313a6ca0b701c152986a83a377b9541c2b20c8)), closes [#1403](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1403)
4
9
 
10
+ # [0.83.0](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/compare/v0.82.0...v0.83.0) (2025-11-17)
11
+
12
+ ### Features
13
+
14
+ - **specify-peers-locally:** add rule to require all peers are declared as dev dependencies ([#1407](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1407)) ([5a102ec](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/commit/5a102ecd0f6fb025f42e838492844e2fa32ba786)), closes [#1053](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1053)
15
+
16
+ # [0.82.0](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/compare/v0.81.0...v0.82.0) (2025-11-17)
5
17
 
6
18
  ### Features
7
19
 
8
- * **require-sideEffects:** add new rule for requiring `sideEffects` ([#1406](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1406)) ([0a8388d](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/commit/0a8388d6be21e6d4d7c0203fd65be96751ca5f29)), closes [#1405](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1405)
20
+ - **require-sideEffects:** add new rule for requiring `sideEffects` ([#1406](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1406)) ([0a8388d](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/commit/0a8388d6be21e6d4d7c0203fd65be96751ca5f29)), closes [#1405](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1405)
9
21
 
10
22
  # [0.81.0](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/compare/v0.80.0...v0.81.0) (2025-11-17)
11
23
 
package/README.md CHANGED
@@ -61,9 +61,23 @@ export default [
61
61
 
62
62
  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.
63
63
 
64
+ ### Recommended Config for Publishable Packages
65
+
66
+ 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.
67
+
68
+ ```ts
69
+ // eslint.config.ts
70
+ import packageJson from "eslint-plugin-package-json";
71
+
72
+ export default [
73
+ // your other ESLint configurations
74
+ packageJson.configs["recommended-publishable"],
75
+ ];
76
+ ```
77
+
64
78
  ### Stylistic Config
65
79
 
66
- The stylistic configuration enables 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.
80
+ 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.
67
81
  This can be used in addition to the recommended config, or on its own.
68
82
 
69
83
  ```ts
@@ -72,7 +86,7 @@ import packageJson from "eslint-plugin-package-json";
72
86
 
73
87
  export default [
74
88
  // your other ESLint configurations
75
- packageJson.configs.recommended,
89
+ packageJson.configs.recommended, // or packageJson.configs["recommended-publishable"]
76
90
  packageJson.configs.stylistic,
77
91
  ];
78
92
  ```
@@ -176,76 +190,78 @@ The default settings don't conflict, and Prettier plugins can quickly fix up ord
176
190
  πŸ’Ό Configurations enabled in.\
177
191
  βœ”οΈ Set in the `legacy-recommended` configuration.\
178
192
  βœ… Set in the `recommended` configuration.\
193
+ πŸ“¦ Set in the `recommended-publishable` configuration.\
179
194
  🎨 Set in the `stylistic` configuration.\
180
195
  πŸ”§ Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\
181
196
  πŸ’‘ Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).\
182
197
  ❌ Deprecated.
183
198
 
184
- | NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  | Description | πŸ’Ό | πŸ”§ | πŸ’‘ | ❌ |
185
- | :------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--- | :- | :- | :- |
186
- | [bin-name-casing](docs/rules/bin-name-casing.md) | Enforce that names for bin properties are in kebab case. | 🎨 | | πŸ’‘ | |
187
- | [exports-subpaths-style](docs/rules/exports-subpaths-style.md) | Enforce consistent format for the exports field (implicit or explicit subpaths). | 🎨 | πŸ”§ | | |
188
- | [no-empty-fields](docs/rules/no-empty-fields.md) | Reports on unnecessary empty arrays and objects. | βœ”οΈ βœ… | | πŸ’‘ | |
189
- | [no-redundant-files](docs/rules/no-redundant-files.md) | Prevents adding unnecessary / redundant files. | βœ”οΈ βœ… | | πŸ’‘ | |
190
- | [no-redundant-publishConfig](docs/rules/no-redundant-publishConfig.md) | Warns when publishConfig.access is used in unscoped packages. | βœ”οΈ βœ… | | πŸ’‘ | |
191
- | [order-properties](docs/rules/order-properties.md) | Package properties must be declared in standard order | βœ”οΈ βœ… | πŸ”§ | | |
192
- | [repository-shorthand](docs/rules/repository-shorthand.md) | Enforce either object or shorthand declaration for repository. | βœ”οΈ βœ… | πŸ”§ | | |
193
- | [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. | | | πŸ’‘ | |
194
- | [require-author](docs/rules/require-author.md) | Requires the `author` property to be present. | | | | |
195
- | [require-bugs](docs/rules/require-bugs.md) | Requires the `bugs` property to be present. | | | | |
196
- | [require-bundleDependencies](docs/rules/require-bundleDependencies.md) | Requires the `bundleDependencies` property to be present. | | | | |
197
- | [require-dependencies](docs/rules/require-dependencies.md) | Requires the `dependencies` property to be present. | | | | |
198
- | [require-description](docs/rules/require-description.md) | Requires the `description` property to be present. | βœ”οΈ βœ… | | | |
199
- | [require-devDependencies](docs/rules/require-devDependencies.md) | Requires the `devDependencies` property to be present. | | | | |
200
- | [require-engines](docs/rules/require-engines.md) | Requires the `engines` property to be present. | | | | |
201
- | [require-exports](docs/rules/require-exports.md) | Requires the `exports` property to be present. | | | | |
202
- | [require-files](docs/rules/require-files.md) | Requires the `files` property to be present. | | | | |
203
- | [require-keywords](docs/rules/require-keywords.md) | Requires the `keywords` property to be present. | | | | |
204
- | [require-license](docs/rules/require-license.md) | Requires the `license` property to be present. | βœ”οΈ βœ… | | | |
205
- | [require-name](docs/rules/require-name.md) | Requires the `name` property to be present. | βœ”οΈ βœ… | | | |
206
- | [require-optionalDependencies](docs/rules/require-optionalDependencies.md) | Requires the `optionalDependencies` property to be present. | | | | |
207
- | [require-peerDependencies](docs/rules/require-peerDependencies.md) | Requires the `peerDependencies` property to be present. | | | | |
208
- | [require-sideEffects](docs/rules/require-sideEffects.md) | Requires the `sideEffects` property to be present. | | | | |
209
- | [require-type](docs/rules/require-type.md) | Requires the `type` property to be present. | βœ”οΈ βœ… | | | |
210
- | [require-types](docs/rules/require-types.md) | Requires the `types` property to be present. | | | | |
211
- | [require-version](docs/rules/require-version.md) | Requires the `version` property to be present. | βœ”οΈ βœ… | | | |
212
- | [restrict-dependency-ranges](docs/rules/restrict-dependency-ranges.md) | Restricts the range of dependencies to allow or disallow specific types of ranges. | | | πŸ’‘ | |
213
- | [restrict-private-properties](docs/rules/restrict-private-properties.md) | Disallows unnecessary properties in private packages. | | πŸ”§ | πŸ’‘ | |
214
- | [scripts-name-casing](docs/rules/scripts-name-casing.md) | Enforce that names for `scripts` are in kebab case (optionally separated by colons). | 🎨 | | πŸ’‘ | |
215
- | [sort-collections](docs/rules/sort-collections.md) | Selected collections must be in a consistent order (lexicographical for most; lifecycle-aware for scripts). | βœ”οΈ βœ… | πŸ”§ | | |
216
- | [unique-dependencies](docs/rules/unique-dependencies.md) | Checks a dependency isn't specified more than once (i.e. in `dependencies` and `devDependencies`) | βœ”οΈ βœ… | | πŸ’‘ | |
217
- | [valid-author](docs/rules/valid-author.md) | Enforce that the `author` property is valid. | βœ”οΈ βœ… | | | |
218
- | [valid-bin](docs/rules/valid-bin.md) | Enforce that the `bin` property is valid. | βœ”οΈ βœ… | | | |
219
- | [valid-bundleDependencies](docs/rules/valid-bundleDependencies.md) | Enforce that the `bundleDependencies` (also: `bundledDependencies`) property is valid. | βœ”οΈ βœ… | | | |
220
- | [valid-config](docs/rules/valid-config.md) | Enforce that the `config` property is valid. | βœ”οΈ βœ… | | | |
221
- | [valid-contributors](docs/rules/valid-contributors.md) | Enforce that the `contributors` property is valid. | βœ”οΈ βœ… | | | |
222
- | [valid-cpu](docs/rules/valid-cpu.md) | Enforce that the `cpu` property is valid. | βœ”οΈ βœ… | | | |
223
- | [valid-dependencies](docs/rules/valid-dependencies.md) | Enforce that the `dependencies` property is valid. | βœ”οΈ βœ… | | | |
224
- | [valid-description](docs/rules/valid-description.md) | Enforce that the `description` property is valid. | βœ”οΈ βœ… | | | |
225
- | [valid-devDependencies](docs/rules/valid-devDependencies.md) | Enforce that the `devDependencies` property is valid. | βœ”οΈ βœ… | | | |
226
- | [valid-directories](docs/rules/valid-directories.md) | Enforce that the `directories` property is valid. | βœ”οΈ βœ… | | | |
227
- | [valid-engines](docs/rules/valid-engines.md) | Enforce that the `engines` property is valid. | βœ”οΈ βœ… | | | |
228
- | [valid-exports](docs/rules/valid-exports.md) | Enforce that the `exports` property is valid. | βœ”οΈ βœ… | | | |
229
- | [valid-files](docs/rules/valid-files.md) | Enforce that the `files` property is valid. | βœ”οΈ βœ… | | | |
230
- | [valid-homepage](docs/rules/valid-homepage.md) | Enforce that the `homepage` property is valid. | βœ”οΈ βœ… | | | |
231
- | [valid-keywords](docs/rules/valid-keywords.md) | Enforce that the `keywords` property is valid. | βœ”οΈ βœ… | | | |
232
- | [valid-license](docs/rules/valid-license.md) | Enforce that the `license` property is valid. | βœ”οΈ βœ… | | | |
233
- | [valid-local-dependency](docs/rules/valid-local-dependency.md) | Checks existence of local dependencies in the package.json | | | | ❌ |
234
- | [valid-main](docs/rules/valid-main.md) | Enforce that the `main` property is valid. | βœ”οΈ βœ… | | | |
235
- | [valid-man](docs/rules/valid-man.md) | Enforce that the `man` property is valid. | βœ”οΈ βœ… | | | |
236
- | [valid-name](docs/rules/valid-name.md) | Enforce that package names are valid npm package names | βœ”οΈ βœ… | | | |
237
- | [valid-optionalDependencies](docs/rules/valid-optionalDependencies.md) | Enforce that the `optionalDependencies` property is valid. | βœ”οΈ βœ… | | | |
238
- | [valid-os](docs/rules/valid-os.md) | Enforce that the `os` property is valid. | βœ”οΈ βœ… | | | |
239
- | [valid-package-definition](docs/rules/valid-package-definition.md) | Enforce that package.json has all properties required by the npm spec | | | | ❌ |
240
- | [valid-peerDependencies](docs/rules/valid-peerDependencies.md) | Enforce that the `peerDependencies` property is valid. | βœ”οΈ βœ… | | | |
241
- | [valid-private](docs/rules/valid-private.md) | Enforce that the `private` property is valid. | βœ”οΈ βœ… | | | |
242
- | [valid-publishConfig](docs/rules/valid-publishConfig.md) | Enforce that the `publishConfig` property is valid. | βœ”οΈ βœ… | | | |
243
- | [valid-repository](docs/rules/valid-repository.md) | Enforce that the `repository` property is valid. | βœ”οΈ βœ… | | | |
244
- | [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 | βœ”οΈ βœ… | | πŸ’‘ | |
245
- | [valid-scripts](docs/rules/valid-scripts.md) | Enforce that the `scripts` property is valid. | βœ”οΈ βœ… | | | |
246
- | [valid-type](docs/rules/valid-type.md) | Enforce that the `type` property is valid. | βœ”οΈ βœ… | | | |
247
- | [valid-version](docs/rules/valid-version.md) | Enforce that package versions are valid semver specifiers | βœ”οΈ βœ… | | | |
248
- | [valid-workspaces](docs/rules/valid-workspaces.md) | Enforce that the `workspaces` property is valid. | βœ”οΈ βœ… | | | |
199
+ | NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  | Description | πŸ’Ό | πŸ”§ | πŸ’‘ | ❌ |
200
+ | :------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------ | :- | :- | :- |
201
+ | [bin-name-casing](docs/rules/bin-name-casing.md) | Enforce that names for bin properties are in kebab case. | 🎨 | | πŸ’‘ | |
202
+ | [exports-subpaths-style](docs/rules/exports-subpaths-style.md) | Enforce consistent format for the exports field (implicit or explicit subpaths). | 🎨 | πŸ”§ | | |
203
+ | [no-empty-fields](docs/rules/no-empty-fields.md) | Reports on unnecessary empty arrays and objects. | βœ”οΈ βœ… πŸ“¦ | | πŸ’‘ | |
204
+ | [no-redundant-files](docs/rules/no-redundant-files.md) | Prevents adding unnecessary / redundant files. | βœ”οΈ βœ… πŸ“¦ | | πŸ’‘ | |
205
+ | [no-redundant-publishConfig](docs/rules/no-redundant-publishConfig.md) | Warns when publishConfig.access is used in unscoped packages. | βœ”οΈ βœ… πŸ“¦ | | πŸ’‘ | |
206
+ | [order-properties](docs/rules/order-properties.md) | Package properties must be declared in standard order | βœ”οΈ βœ… πŸ“¦ | πŸ”§ | | |
207
+ | [repository-shorthand](docs/rules/repository-shorthand.md) | Enforce either object or shorthand declaration for repository. | βœ”οΈ βœ… πŸ“¦ | πŸ”§ | | |
208
+ | [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. | πŸ“¦ | | πŸ’‘ | |
209
+ | [require-author](docs/rules/require-author.md) | Requires the `author` property to be present. | | | | |
210
+ | [require-bugs](docs/rules/require-bugs.md) | Requires the `bugs` property to be present. | | | | |
211
+ | [require-bundleDependencies](docs/rules/require-bundleDependencies.md) | Requires the `bundleDependencies` property to be present. | | | | |
212
+ | [require-dependencies](docs/rules/require-dependencies.md) | Requires the `dependencies` property to be present. | | | | |
213
+ | [require-description](docs/rules/require-description.md) | Requires the `description` property to be present. | βœ”οΈ βœ… πŸ“¦ | | | |
214
+ | [require-devDependencies](docs/rules/require-devDependencies.md) | Requires the `devDependencies` property to be present. | | | | |
215
+ | [require-engines](docs/rules/require-engines.md) | Requires the `engines` property to be present. | | | | |
216
+ | [require-exports](docs/rules/require-exports.md) | Requires the `exports` property to be present. | πŸ“¦ | | | |
217
+ | [require-files](docs/rules/require-files.md) | Requires the `files` property to be present. | πŸ“¦ | | | |
218
+ | [require-keywords](docs/rules/require-keywords.md) | Requires the `keywords` property to be present. | | | | |
219
+ | [require-license](docs/rules/require-license.md) | Requires the `license` property to be present. | βœ”οΈ βœ… πŸ“¦ | | | |
220
+ | [require-name](docs/rules/require-name.md) | Requires the `name` property to be present. | βœ”οΈ βœ… πŸ“¦ | | | |
221
+ | [require-optionalDependencies](docs/rules/require-optionalDependencies.md) | Requires the `optionalDependencies` property to be present. | | | | |
222
+ | [require-peerDependencies](docs/rules/require-peerDependencies.md) | Requires the `peerDependencies` property to be present. | | | | |
223
+ | [require-sideEffects](docs/rules/require-sideEffects.md) | Requires the `sideEffects` property to be present. | πŸ“¦ | | | |
224
+ | [require-type](docs/rules/require-type.md) | Requires the `type` property to be present. | βœ”οΈ βœ… πŸ“¦ | | | |
225
+ | [require-types](docs/rules/require-types.md) | Requires the `types` property to be present. | | | | |
226
+ | [require-version](docs/rules/require-version.md) | Requires the `version` property to be present. | βœ”οΈ βœ… πŸ“¦ | | | |
227
+ | [restrict-dependency-ranges](docs/rules/restrict-dependency-ranges.md) | Restricts the range of dependencies to allow or disallow specific types of ranges. | | | πŸ’‘ | |
228
+ | [restrict-private-properties](docs/rules/restrict-private-properties.md) | Disallows unnecessary properties in private packages. | | πŸ”§ | πŸ’‘ | |
229
+ | [scripts-name-casing](docs/rules/scripts-name-casing.md) | Enforce that names for `scripts` are in kebab case (optionally separated by colons). | 🎨 | | πŸ’‘ | |
230
+ | [sort-collections](docs/rules/sort-collections.md) | Selected collections must be in a consistent order (lexicographical for most; lifecycle-aware for scripts). | βœ”οΈ βœ… πŸ“¦ | πŸ”§ | | |
231
+ | [specify-peers-locally](docs/rules/specify-peers-locally.md) | Requires that all peer dependencies are also declared as dev dependencies | βœ”οΈ βœ… πŸ“¦ | | πŸ’‘ | |
232
+ | [unique-dependencies](docs/rules/unique-dependencies.md) | Checks a dependency isn't specified more than once (i.e. in `dependencies` and `devDependencies`) | βœ”οΈ βœ… πŸ“¦ | | πŸ’‘ | |
233
+ | [valid-author](docs/rules/valid-author.md) | Enforce that the `author` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
234
+ | [valid-bin](docs/rules/valid-bin.md) | Enforce that the `bin` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
235
+ | [valid-bundleDependencies](docs/rules/valid-bundleDependencies.md) | Enforce that the `bundleDependencies` (also: `bundledDependencies`) property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
236
+ | [valid-config](docs/rules/valid-config.md) | Enforce that the `config` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
237
+ | [valid-contributors](docs/rules/valid-contributors.md) | Enforce that the `contributors` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
238
+ | [valid-cpu](docs/rules/valid-cpu.md) | Enforce that the `cpu` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
239
+ | [valid-dependencies](docs/rules/valid-dependencies.md) | Enforce that the `dependencies` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
240
+ | [valid-description](docs/rules/valid-description.md) | Enforce that the `description` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
241
+ | [valid-devDependencies](docs/rules/valid-devDependencies.md) | Enforce that the `devDependencies` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
242
+ | [valid-directories](docs/rules/valid-directories.md) | Enforce that the `directories` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
243
+ | [valid-engines](docs/rules/valid-engines.md) | Enforce that the `engines` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
244
+ | [valid-exports](docs/rules/valid-exports.md) | Enforce that the `exports` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
245
+ | [valid-files](docs/rules/valid-files.md) | Enforce that the `files` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
246
+ | [valid-homepage](docs/rules/valid-homepage.md) | Enforce that the `homepage` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
247
+ | [valid-keywords](docs/rules/valid-keywords.md) | Enforce that the `keywords` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
248
+ | [valid-license](docs/rules/valid-license.md) | Enforce that the `license` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
249
+ | [valid-local-dependency](docs/rules/valid-local-dependency.md) | Checks existence of local dependencies in the package.json | | | | ❌ |
250
+ | [valid-main](docs/rules/valid-main.md) | Enforce that the `main` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
251
+ | [valid-man](docs/rules/valid-man.md) | Enforce that the `man` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
252
+ | [valid-name](docs/rules/valid-name.md) | Enforce that package names are valid npm package names | βœ”οΈ βœ… πŸ“¦ | | | |
253
+ | [valid-optionalDependencies](docs/rules/valid-optionalDependencies.md) | Enforce that the `optionalDependencies` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
254
+ | [valid-os](docs/rules/valid-os.md) | Enforce that the `os` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
255
+ | [valid-package-definition](docs/rules/valid-package-definition.md) | Enforce that package.json has all properties required by the npm spec | | | | ❌ |
256
+ | [valid-peerDependencies](docs/rules/valid-peerDependencies.md) | Enforce that the `peerDependencies` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
257
+ | [valid-private](docs/rules/valid-private.md) | Enforce that the `private` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
258
+ | [valid-publishConfig](docs/rules/valid-publishConfig.md) | Enforce that the `publishConfig` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
259
+ | [valid-repository](docs/rules/valid-repository.md) | Enforce that the `repository` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
260
+ | [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 | βœ”οΈ βœ… πŸ“¦ | | πŸ’‘ | |
261
+ | [valid-scripts](docs/rules/valid-scripts.md) | Enforce that the `scripts` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
262
+ | [valid-type](docs/rules/valid-type.md) | Enforce that the `type` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
263
+ | [valid-version](docs/rules/valid-version.md) | Enforce that package versions are valid semver specifiers | βœ”οΈ βœ… πŸ“¦ | | | |
264
+ | [valid-workspaces](docs/rules/valid-workspaces.md) | Enforce that the `workspaces` property is valid. | βœ”οΈ βœ… πŸ“¦ | | | |
249
265
 
250
266
  <!-- end auto-generated rules list -->
251
267
  <!-- prettier-ignore-end -->
package/lib/index.d.mts CHANGED
@@ -26,6 +26,19 @@ declare const configs: {
26
26
  [k: string]: "error";
27
27
  };
28
28
  };
29
+ "recommended-publishable": {
30
+ files: string[];
31
+ languageOptions: {
32
+ parser: typeof jsonc_eslint_parser0;
33
+ };
34
+ name: string;
35
+ plugins: {
36
+ readonly "package-json": eslint0.ESLint.Plugin;
37
+ };
38
+ rules: {
39
+ [x: string]: "error";
40
+ };
41
+ };
29
42
  stylistic: {
30
43
  files: string[];
31
44
  languageOptions: {
package/lib/plugin.d.mts CHANGED
@@ -26,6 +26,19 @@ declare const plugin: {
26
26
  [k: string]: "error";
27
27
  };
28
28
  };
29
+ "recommended-publishable": {
30
+ files: string[];
31
+ languageOptions: {
32
+ parser: typeof parserJsonc;
33
+ };
34
+ name: string;
35
+ plugins: {
36
+ readonly "package-json": ESLint.Plugin;
37
+ };
38
+ rules: {
39
+ [x: string]: "error";
40
+ };
41
+ };
29
42
  stylistic: {
30
43
  files: string[];
31
44
  languageOptions: {
package/lib/plugin.mjs CHANGED
@@ -11,13 +11,14 @@ import { rule as rule$8 } from "./rules/restrict-dependency-ranges.mjs";
11
11
  import { rule as rule$9 } from "./rules/restrict-private-properties.mjs";
12
12
  import { rule as rule$10 } from "./rules/scripts-name-casing.mjs";
13
13
  import { rule as rule$11 } from "./rules/sort-collections.mjs";
14
- import { rule as rule$12 } from "./rules/unique-dependencies.mjs";
15
- import { rule as rule$13 } from "./rules/valid-local-dependency.mjs";
16
- import { rule as rule$14 } from "./rules/valid-name.mjs";
17
- import { rule as rule$15 } from "./rules/valid-package-definition.mjs";
14
+ import { rule as rule$12 } from "./rules/specify-peers-locally.mjs";
15
+ import { rule as rule$13 } from "./rules/unique-dependencies.mjs";
16
+ import { rule as rule$14 } from "./rules/valid-local-dependency.mjs";
17
+ import { rule as rule$15 } from "./rules/valid-name.mjs";
18
+ import { rule as rule$16 } from "./rules/valid-package-definition.mjs";
18
19
  import { rules as rules$1 } from "./rules/valid-properties.mjs";
19
- import { rule as rule$16 } from "./rules/valid-repository-directory.mjs";
20
- import { rule as rule$17 } from "./rules/valid-version.mjs";
20
+ import { rule as rule$17 } from "./rules/valid-repository-directory.mjs";
21
+ import { rule as rule$18 } from "./rules/valid-version.mjs";
21
22
  import { createRequire } from "node:module";
22
23
  import * as parserJsonc from "jsonc-eslint-parser";
23
24
 
@@ -37,16 +38,21 @@ const rules$2 = {
37
38
  "restrict-private-properties": rule$9,
38
39
  "scripts-name-casing": rule$10,
39
40
  "sort-collections": rule$11,
40
- "unique-dependencies": rule$12,
41
+ "specify-peers-locally": rule$12,
42
+ "unique-dependencies": rule$13,
41
43
  ...rules$1,
42
- "valid-local-dependency": rule$13,
43
- "valid-name": rule$14,
44
- "valid-package-definition": rule$15,
45
- "valid-repository-directory": rule$16,
46
- "valid-version": rule$17
44
+ "valid-local-dependency": rule$14,
45
+ "valid-name": rule$15,
46
+ "valid-package-definition": rule$16,
47
+ "valid-repository-directory": rule$17,
48
+ "valid-version": rule$18
47
49
  };
48
- const recommendedRules = { ...Object.fromEntries(Object.entries(rules$2).filter(([, rule$18]) => rule$18.meta.docs?.recommended).map(([name$1]) => ["package-json/" + name$1, "error"])) };
49
- const stylisticRules = { ...Object.fromEntries(Object.entries(rules$2).filter(([, rule$18]) => rule$18.meta.docs?.category === "Stylistic").map(([name$1]) => ["package-json/" + name$1, "error"])) };
50
+ const recommendedRules = { ...Object.fromEntries(Object.entries(rules$2).filter(([, rule$19]) => rule$19.meta.docs?.recommended).map(([name$1]) => ["package-json/" + name$1, "error"])) };
51
+ const recommendedPublishableRules = {
52
+ ...recommendedRules,
53
+ ...Object.fromEntries(Object.entries(rules$2).filter(([, rule$19]) => rule$19.meta.docs?.category === "Publishable").map(([name$1]) => ["package-json/" + name$1, "error"]))
54
+ };
55
+ const stylisticRules = { ...Object.fromEntries(Object.entries(rules$2).filter(([, rule$19]) => rule$19.meta.docs?.category === "Stylistic").map(([name$1]) => ["package-json/" + name$1, "error"])) };
50
56
  const plugin = {
51
57
  configs: {
52
58
  "legacy-recommended": {
@@ -62,6 +68,15 @@ const plugin = {
62
68
  } },
63
69
  rules: recommendedRules
64
70
  },
71
+ "recommended-publishable": {
72
+ files: ["**/package.json"],
73
+ languageOptions: { parser: parserJsonc },
74
+ name: "package-json/recommended-publishable",
75
+ plugins: { get "package-json"() {
76
+ return plugin;
77
+ } },
78
+ rules: recommendedPublishableRules
79
+ },
65
80
  stylistic: {
66
81
  files: ["**/package.json"],
67
82
  languageOptions: { parser: parserJsonc },
@@ -9,8 +9,8 @@ const properties = [
9
9
  ["description", { isRecommended: true }],
10
10
  ["devDependencies"],
11
11
  ["engines"],
12
- ["exports"],
13
- ["files"],
12
+ ["exports", { category: "Publishable" }],
13
+ ["files", { category: "Publishable" }],
14
14
  ["keywords"],
15
15
  ["license", {
16
16
  ignorePrivateDefault: true,
@@ -22,7 +22,7 @@ const properties = [
22
22
  }],
23
23
  ["optionalDependencies"],
24
24
  ["peerDependencies"],
25
- ["sideEffects"],
25
+ ["sideEffects", { category: "Publishable" }],
26
26
  ["type", { isRecommended: true }],
27
27
  ["types"],
28
28
  ["version", {
@@ -0,0 +1,6 @@
1
+ import { PackageJsonRuleModule } from "../createRule.mjs";
2
+
3
+ //#region src/rules/specify-peers-locally.d.ts
4
+ declare const rule: PackageJsonRuleModule<[], []>;
5
+ //#endregion
6
+ export { rule };
@@ -0,0 +1,65 @@
1
+ import { createRule } from "../createRule.mjs";
2
+ import { isJSONStringLiteral } from "../utils/predicates.mjs";
3
+
4
+ //#region src/rules/specify-peers-locally.ts
5
+ const rule = createRule({
6
+ create(context) {
7
+ const devDependencyNames = /* @__PURE__ */ new Set();
8
+ let devDependenciesObjectNode;
9
+ const peerDependencyMap = {};
10
+ return {
11
+ "Program > JSONExpressionStatement > JSONObjectExpression > JSONProperty[key.type=JSONLiteral][value.type=JSONObjectExpression][key.value=devDependencies]"(node) {
12
+ devDependenciesObjectNode = node.value;
13
+ for (const devDependencyPropertyNode of node.value.properties) {
14
+ const dependencyKey = devDependencyPropertyNode.key;
15
+ if (isJSONStringLiteral(dependencyKey)) devDependencyNames.add(dependencyKey.value);
16
+ }
17
+ },
18
+ "Program > JSONExpressionStatement > JSONObjectExpression > JSONProperty[key.type=JSONLiteral][value.type=JSONObjectExpression][key.value=peerDependencies]"(node) {
19
+ for (const peerDependencyPropertyNode of node.value.properties) {
20
+ const dependencyKey = peerDependencyPropertyNode.key;
21
+ if (isJSONStringLiteral(dependencyKey)) peerDependencyMap[dependencyKey.value] = peerDependencyPropertyNode;
22
+ }
23
+ },
24
+ "Program:exit"() {
25
+ for (const [peerDependencyName, peerDependencyNode] of Object.entries(peerDependencyMap)) if (!devDependencyNames.has(peerDependencyName)) {
26
+ const peerDependencyValue = peerDependencyNode.value;
27
+ context.report({
28
+ data: { name: peerDependencyName },
29
+ messageId: "devDependencyNotDefined",
30
+ node: peerDependencyNode,
31
+ suggest: devDependenciesObjectNode && isJSONStringLiteral(peerDependencyValue) ? [{
32
+ data: { name: peerDependencyName },
33
+ fix: (fixer) => {
34
+ const updatedDevDependencies = {
35
+ ...JSON.parse(context.sourceCode.getText(devDependenciesObjectNode)),
36
+ [peerDependencyName]: peerDependencyValue.value
37
+ };
38
+ const sortedDevDependencies = Object.fromEntries(Object.entries(updatedDevDependencies).sort((a, b) => a[0] > b[0] ? 1 : -1));
39
+ return fixer.replaceText(devDependenciesObjectNode, JSON.stringify(sortedDevDependencies, null, 2).split("\n").join("\n "));
40
+ },
41
+ messageId: "addToDevDependencies"
42
+ }] : []
43
+ });
44
+ }
45
+ }
46
+ };
47
+ },
48
+ meta: {
49
+ docs: {
50
+ description: "Requires that all peer dependencies are also declared as dev dependencies",
51
+ recommended: true
52
+ },
53
+ hasSuggestions: true,
54
+ messages: {
55
+ addToDevDependencies: "Add \"{{ name }}\" to `devDependencies`",
56
+ devDependencyNotDefined: "Peer dependency \"{{ name }}\" is not also declared in `devDependencies`."
57
+ },
58
+ schema: [],
59
+ type: "problem"
60
+ },
61
+ name: "specify-peers-locally"
62
+ });
63
+
64
+ //#endregion
65
+ export { rule };
@@ -2,6 +2,10 @@ import { PackageJsonRuleModule } from "../createRule.mjs";
2
2
 
3
3
  //#region src/utils/createSimpleRequirePropertyRule.d.ts
4
4
  interface CreateRequirePropertyRuleOptions {
5
+ /**
6
+ * The category for this rule.
7
+ */
8
+ category?: string;
5
9
  /**
6
10
  * The default value of `ignorePrivate` rule option.
7
11
  */
@@ -18,6 +22,7 @@ interface CreateRequirePropertyRuleOptions {
18
22
  * to create a more complex rule, create it in its own file.
19
23
  */
20
24
  declare const createSimpleRequirePropertyRule: (propertyName: string, {
25
+ category,
21
26
  ignorePrivateDefault,
22
27
  isRecommended
23
28
  }?: CreateRequirePropertyRuleOptions) => {
@@ -8,7 +8,7 @@ import { isJSONStringLiteral } from "./predicates.mjs";
8
8
  * Note: this will only create a basic require rule, with no options. If you need
9
9
  * to create a more complex rule, create it in its own file.
10
10
  */
11
- const createSimpleRequirePropertyRule = (propertyName, { ignorePrivateDefault = false, isRecommended } = {}) => {
11
+ const createSimpleRequirePropertyRule = (propertyName, { category, ignorePrivateDefault = false, isRecommended } = {}) => {
12
12
  const ruleName = `require-${propertyName}`;
13
13
  return {
14
14
  rule: createRule({
@@ -26,6 +26,7 @@ const createSimpleRequirePropertyRule = (propertyName, { ignorePrivateDefault =
26
26
  },
27
27
  meta: {
28
28
  docs: {
29
+ category,
29
30
  description: `Requires the \`${propertyName}\` property to be present.`,
30
31
  recommended: isRecommended
31
32
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-package-json",
3
- "version": "0.82.0",
3
+ "version": "0.84.0",
4
4
  "description": "Rules for consistent, readable, and valid package.json files. πŸ—‚οΈ",
5
5
  "homepage": "https://github.com/JoshuaKGoldberg/eslint-plugin-package-json#readme",
6
6
  "bugs": {
@@ -27,6 +27,7 @@
27
27
  "url": "https://michael.faith"
28
28
  }
29
29
  ],
30
+ "sideEffects": false,
30
31
  "type": "module",
31
32
  "exports": {
32
33
  ".": {
@@ -90,7 +91,7 @@
90
91
  "jiti": "2.6.0",
91
92
  "json-schema-to-ts": "3.1.1",
92
93
  "jsonc-eslint-parser": "2.4.1",
93
- "knip": "5.68.0",
94
+ "knip": "5.69.0",
94
95
  "lint-staged": "16.2.0",
95
96
  "markdownlint": "0.39.0",
96
97
  "markdownlint-cli": "0.45.0",