eslint-plugin-package-json 0.61.0 → 0.62.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,17 @@
1
1
  # Changelog
2
2
 
3
- # [0.61.0](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/compare/v0.60.0...v0.61.0) (2025-11-03)
3
+ # [0.62.0](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/compare/v0.61.0...v0.62.0) (2025-11-03)
4
+
5
+
6
+ ### Features
7
+
8
+ * **scripts-name-casing:** add new rule ([#1344](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1344)) ([e735595](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/commit/e735595537e6857c771eac12a1efcd55cb2d3564)), closes [#61](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/61)
4
9
 
10
+ # [0.61.0](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/compare/v0.60.0...v0.61.0) (2025-11-03)
5
11
 
6
12
  ### Features
7
13
 
8
- * add new stylistic config ([#1342](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1342)) ([3d01cce](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/commit/3d01cce99a1718a7485669c7b8cf6143a255b094)), closes [#1341](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1341)
14
+ - add new stylistic config ([#1342](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1342)) ([3d01cce](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/commit/3d01cce99a1718a7485669c7b8cf6143a255b094)), closes [#1341](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/issues/1341)
9
15
 
10
16
  # [0.60.0](https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/compare/v0.59.1...v0.60.0) (2025-11-03)
11
17
 
package/README.md CHANGED
@@ -205,6 +205,7 @@ The default settings don't conflict, and Prettier plugins can quickly fix up ord
205
205
  | [require-types](docs/rules/require-types.md) | Requires the `types` property to be present. | | | | |
206
206
  | [require-version](docs/rules/require-version.md) | Requires the `version` property to be present. | ✔️ ✅ | | | |
207
207
  | [restrict-dependency-ranges](docs/rules/restrict-dependency-ranges.md) | Restricts the range of dependencies to allow or disallow specific types of ranges. | | | 💡 | |
208
+ | [scripts-name-casing](docs/rules/scripts-name-casing.md) | Enforce that names for `scripts` are in kebab case (optionally separated by colons). | 🎨 | | 💡 | |
208
209
  | [sort-collections](docs/rules/sort-collections.md) | Selected collections must be in a consistent order (lexicographical for most; lifecycle-aware for scripts). | ✔️ ✅ | 🔧 | | |
209
210
  | [unique-dependencies](docs/rules/unique-dependencies.md) | Checks a dependency isn't specified more than once (i.e. in `dependencies` and `devDependencies`) | ✔️ ✅ | | 💡 | |
210
211
  | [valid-author](docs/rules/valid-author.md) | Enforce that the `author` property is valid. | ✔️ ✅ | | | |
package/lib/plugin.js CHANGED
@@ -5,16 +5,17 @@ import { rule as rule$3 } from "./rules/order-properties.js";
5
5
  import { rule as rule$4 } from "./rules/repository-shorthand.js";
6
6
  import { rules } from "./rules/require-properties.js";
7
7
  import { rule as rule$5 } from "./rules/restrict-dependency-ranges.js";
8
- import { rule as rule$6 } from "./rules/sort-collections.js";
9
- import { rule as rule$7 } from "./rules/unique-dependencies.js";
10
- import { rule as rule$8 } from "./rules/valid-author.js";
11
- import { rule as rule$9 } from "./rules/valid-bin.js";
12
- import { rule as rule$10 } from "./rules/valid-local-dependency.js";
13
- import { rule as rule$11 } from "./rules/valid-name.js";
14
- import { rule as rule$12 } from "./rules/valid-package-definition.js";
8
+ import { rule as rule$6 } from "./rules/scripts-name-casing.js";
9
+ import { rule as rule$7 } from "./rules/sort-collections.js";
10
+ import { rule as rule$8 } from "./rules/unique-dependencies.js";
11
+ import { rule as rule$9 } from "./rules/valid-author.js";
12
+ import { rule as rule$10 } from "./rules/valid-bin.js";
13
+ import { rule as rule$11 } from "./rules/valid-local-dependency.js";
14
+ import { rule as rule$12 } from "./rules/valid-name.js";
15
+ import { rule as rule$13 } from "./rules/valid-package-definition.js";
15
16
  import { rules as rules$1 } from "./rules/valid-properties.js";
16
- import { rule as rule$13 } from "./rules/valid-repository-directory.js";
17
- import { rule as rule$14 } from "./rules/valid-version.js";
17
+ import { rule as rule$14 } from "./rules/valid-repository-directory.js";
18
+ import { rule as rule$15 } from "./rules/valid-version.js";
18
19
  import { createRequire } from "node:module";
19
20
  import * as parserJsonc from "jsonc-eslint-parser";
20
21
 
@@ -28,23 +29,24 @@ const rules$2 = {
28
29
  ...rules,
29
30
  "repository-shorthand": rule$4,
30
31
  "restrict-dependency-ranges": rule$5,
31
- "sort-collections": rule$6,
32
- "unique-dependencies": rule$7,
32
+ "scripts-name-casing": rule$6,
33
+ "sort-collections": rule$7,
34
+ "unique-dependencies": rule$8,
33
35
  ...rules$1,
34
- "valid-author": rule$8,
35
- "valid-bin": rule$9,
36
- "valid-local-dependency": rule$10,
37
- "valid-name": rule$11,
38
- "valid-package-definition": rule$12,
39
- "valid-repository-directory": rule$13,
40
- "valid-version": rule$14
36
+ "valid-author": rule$9,
37
+ "valid-bin": rule$10,
38
+ "valid-local-dependency": rule$11,
39
+ "valid-name": rule$12,
40
+ "valid-package-definition": rule$13,
41
+ "valid-repository-directory": rule$14,
42
+ "valid-version": rule$15
41
43
  };
42
- const baseRecommendedRules = { ...Object.fromEntries(Object.entries(rules$2).filter(([, rule$15]) => rule$15.meta.docs?.recommended).map(([name$1]) => ["package-json/" + name$1, "error"])) };
44
+ const baseRecommendedRules = { ...Object.fromEntries(Object.entries(rules$2).filter(([, rule$16]) => rule$16.meta.docs?.recommended).map(([name$1]) => ["package-json/" + name$1, "error"])) };
43
45
  const recommendedRules = {
44
46
  ...baseRecommendedRules,
45
47
  "package-json/valid-package-definition": ["error", { ignoreProperties: Object.entries(baseRecommendedRules).filter(([name$1]) => name$1.startsWith("package-json/valid-") && name$1 !== "package-json/valid-package-definition").map(([name$1]) => name$1.replace("package-json/valid-", "")) }]
46
48
  };
47
- const stylisticRules = { ...Object.fromEntries(Object.entries(rules$2).filter(([, rule$15]) => rule$15.meta.docs?.category === "Stylistic").map(([name$1]) => ["package-json/" + name$1, "error"])) };
49
+ const stylisticRules = { ...Object.fromEntries(Object.entries(rules$2).filter(([, rule$16]) => rule$16.meta.docs?.category === "Stylistic").map(([name$1]) => ["package-json/" + name$1, "error"])) };
48
50
  const plugin = {
49
51
  configs: {
50
52
  "legacy-recommended": {
@@ -0,0 +1,6 @@
1
+ import { PackageJsonRuleModule } from "../createRule.js";
2
+
3
+ //#region src/rules/scripts-name-casing.d.ts
4
+ declare const rule: PackageJsonRuleModule<[], []>;
5
+ //#endregion
6
+ export { rule };
@@ -0,0 +1,43 @@
1
+ import { createRule } from "../createRule.js";
2
+ import { kebabCase } from "change-case";
3
+
4
+ //#region src/rules/scripts-name-casing.ts
5
+ const rule = createRule({
6
+ create(context) {
7
+ return { "Program > JSONExpressionStatement > JSONObjectExpression > JSONProperty[key.value=scripts]"(node) {
8
+ if (node.value.type === "JSONObjectExpression") for (const property of node.value.properties) {
9
+ const key = property.key;
10
+ const kebabCaseKey = key.value.split(":").map((segment) => kebabCase(segment)).join(":");
11
+ if (kebabCaseKey !== key.value) context.report({
12
+ data: { property: key.value },
13
+ messageId: "invalidCase",
14
+ node: key,
15
+ suggest: [{
16
+ data: { property: key.value },
17
+ fix: (fixer) => {
18
+ return fixer.replaceText(key, JSON.stringify(kebabCaseKey));
19
+ },
20
+ messageId: "convertToKebabCase"
21
+ }]
22
+ });
23
+ }
24
+ } };
25
+ },
26
+ meta: {
27
+ docs: {
28
+ category: "Stylistic",
29
+ description: "Enforce that names for `scripts` are in kebab case (optionally separated by colons)."
30
+ },
31
+ hasSuggestions: true,
32
+ messages: {
33
+ convertToKebabCase: "Convert {{ property }} to kebab case.",
34
+ invalidCase: "Script name {{ property }} should be in kebab case."
35
+ },
36
+ schema: [],
37
+ type: "suggestion"
38
+ },
39
+ name: "scripts-name-casing"
40
+ });
41
+
42
+ //#endregion
43
+ export { rule };
@@ -1,7 +1,7 @@
1
1
  import { createRule } from "../createRule.js";
2
2
  import { formatErrors } from "../utils/formatErrors.js";
3
- import { validateBin } from "package-json-validator";
4
3
  import { kebabCase } from "change-case";
4
+ import { validateBin } from "package-json-validator";
5
5
 
6
6
  //#region src/rules/valid-bin.ts
7
7
  const rule = createRule({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-package-json",
3
- "version": "0.61.0",
3
+ "version": "0.62.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": {