eslint-plugin-package-json 0.7.0 → 0.8.1
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/README.md +10 -3
- package/lib/index.d.mts +4 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +2 -0
- package/lib/index.mjs.map +1 -1
- package/lib/rules/order-properties.js +1 -1
- package/lib/rules/order-properties.js.map +1 -1
- package/lib/rules/order-properties.mjs +1 -1
- package/lib/rules/order-properties.mjs.map +1 -1
- package/lib/rules/unique-dependencies.d.mts +11 -0
- package/lib/rules/unique-dependencies.d.ts +11 -0
- package/lib/rules/unique-dependencies.js +109 -0
- package/lib/rules/unique-dependencies.js.map +1 -0
- package/lib/rules/unique-dependencies.mjs +89 -0
- package/lib/rules/unique-dependencies.mjs.map +1 -0
- package/lib/tests/rules/ruleTester.d.mts +6 -5
- package/lib/tests/rules/ruleTester.d.ts +6 -5
- package/lib/tests/rules/ruleTester.js +13 -0
- package/lib/tests/rules/ruleTester.js.map +1 -1
- package/lib/tests/rules/ruleTester.mjs +13 -0
- package/lib/tests/rules/ruleTester.mjs.map +1 -1
- package/lib/utils/predicates.d.mts +6 -0
- package/lib/utils/predicates.d.ts +6 -0
- package/lib/utils/predicates.js +36 -0
- package/lib/utils/predicates.js.map +1 -0
- package/lib/utils/predicates.mjs +11 -0
- package/lib/utils/predicates.mjs.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,8 +14,7 @@
|
|
|
14
14
|
<a href="https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/blob/main/.github/CODE_OF_CONDUCT.md" target="_blank"><img alt="Contributor Covenant" src="https://img.shields.io/badge/code_of_conduct-enforced-21bb42" /></a>
|
|
15
15
|
<a href="https://github.com/JoshuaKGoldberg/eslint-plugin-package-json/blob/main/LICENSE.md" target="_blank"><img alt="License: MIT" src="https://img.shields.io/github/license/JoshuaKGoldberg/eslint-plugin-package-json?color=21bb42"></a>
|
|
16
16
|
<img alt="Style: Prettier" src="https://img.shields.io/badge/style-prettier-21bb42.svg" />
|
|
17
|
-
<img alt="
|
|
18
|
-
<img alt="npm package version" src="https://img.shields.io/npm/v/eslint-plugin-package-json?color=21bb42" />
|
|
17
|
+
<a href="https://www.npmjs.com/package/eslint-plugin-package-json"><img alt="npm package version" src="https://img.shields.io/npm/v/eslint-plugin-package-json?color=21bb42" /></a>
|
|
19
18
|
</p>
|
|
20
19
|
|
|
21
20
|
## Installation
|
|
@@ -62,6 +61,12 @@ module.exports = {
|
|
|
62
61
|
};
|
|
63
62
|
```
|
|
64
63
|
|
|
64
|
+
### Usage Alongside Prettier
|
|
65
|
+
|
|
66
|
+
**[`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.
|
|
67
|
+
We recommend using both the Prettier plugin and `extends: ["plugin:package-json/recommended"]`.
|
|
68
|
+
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.
|
|
69
|
+
|
|
65
70
|
## Supported Rules
|
|
66
71
|
|
|
67
72
|
<!-- prettier-ignore-start -->
|
|
@@ -77,6 +82,7 @@ module.exports = {
|
|
|
77
82
|
| [order-properties](docs/rules/order-properties.md) | Package properties must be declared in standard order | ✅ | 🔧 | |
|
|
78
83
|
| [prefer-repository-shorthand](docs/rules/prefer-repository-shorthand.md) | Enforce shorthand declaration for GitHub repository. | ✅ | 🔧 | |
|
|
79
84
|
| [sort-collections](docs/rules/sort-collections.md) | Dependencies, scripts, and configuration values must be declared in alphabetical order. | ✅ | 🔧 | |
|
|
85
|
+
| [unique-dependencies](docs/rules/unique-dependencies.md) | Enforce that if repository directory is specified, it matches the path to the package.json file | ✅ | | 💡 |
|
|
80
86
|
| [valid-local-dependency](docs/rules/valid-local-dependency.md) | Checks existence of local dependencies in the package.json | ✅ | | |
|
|
81
87
|
| [valid-package-def](docs/rules/valid-package-def.md) | Enforce that package.json has all properties required by the npm spec | ✅ | | |
|
|
82
88
|
| [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 | ✅ | | 💡 |
|
|
@@ -84,7 +90,8 @@ module.exports = {
|
|
|
84
90
|
<!-- end auto-generated rules list -->
|
|
85
91
|
<!-- prettier-ignore-end -->
|
|
86
92
|
|
|
87
|
-
These rules only run on `package.json` files; they will ignore all other files being linted.
|
|
93
|
+
These rules only run on `package.json` files; they will ignore all other files being linted.
|
|
94
|
+
They can lint `package.json` files at project root and in any subfolder of the project, making this plugin great for monorepos.
|
|
88
95
|
|
|
89
96
|
## Contributors
|
|
90
97
|
|
package/lib/index.d.mts
CHANGED
|
@@ -18,6 +18,10 @@ declare const rules: {
|
|
|
18
18
|
create(context: PackageJsonRuleContext<string[]>): jsonc_eslint_parser.RuleListener;
|
|
19
19
|
meta: eslint.Rule.RuleMetaData;
|
|
20
20
|
};
|
|
21
|
+
"unique-dependencies": {
|
|
22
|
+
create(context: PackageJsonRuleContext<unknown[]>): jsonc_eslint_parser.RuleListener;
|
|
23
|
+
meta: eslint.Rule.RuleMetaData;
|
|
24
|
+
};
|
|
21
25
|
"valid-local-dependency": {
|
|
22
26
|
create(context: PackageJsonRuleContext<unknown[]>): jsonc_eslint_parser.RuleListener;
|
|
23
27
|
meta: eslint.Rule.RuleMetaData;
|
package/lib/index.d.ts
CHANGED
|
@@ -18,6 +18,10 @@ declare const rules: {
|
|
|
18
18
|
create(context: PackageJsonRuleContext<string[]>): jsonc_eslint_parser.RuleListener;
|
|
19
19
|
meta: eslint.Rule.RuleMetaData;
|
|
20
20
|
};
|
|
21
|
+
"unique-dependencies": {
|
|
22
|
+
create(context: PackageJsonRuleContext<unknown[]>): jsonc_eslint_parser.RuleListener;
|
|
23
|
+
meta: eslint.Rule.RuleMetaData;
|
|
24
|
+
};
|
|
21
25
|
"valid-local-dependency": {
|
|
22
26
|
create(context: PackageJsonRuleContext<unknown[]>): jsonc_eslint_parser.RuleListener;
|
|
23
27
|
meta: eslint.Rule.RuleMetaData;
|
package/lib/index.js
CHANGED
|
@@ -35,6 +35,7 @@ module.exports = __toCommonJS(src_exports);
|
|
|
35
35
|
var import_order_properties = __toESM(require("./rules/order-properties.js"));
|
|
36
36
|
var import_prefer_repository_shorthand = __toESM(require("./rules/prefer-repository-shorthand.js"));
|
|
37
37
|
var import_sort_collections = __toESM(require("./rules/sort-collections.js"));
|
|
38
|
+
var import_unique_dependencies = __toESM(require("./rules/unique-dependencies.js"));
|
|
38
39
|
var import_valid_local_dependency = __toESM(require("./rules/valid-local-dependency.js"));
|
|
39
40
|
var import_valid_package_def = __toESM(require("./rules/valid-package-def.js"));
|
|
40
41
|
var import_valid_repository_directory = __toESM(require("./rules/valid-repository-directory.js"));
|
|
@@ -42,6 +43,7 @@ const rules = {
|
|
|
42
43
|
"order-properties": import_order_properties.default,
|
|
43
44
|
"prefer-repository-shorthand": import_prefer_repository_shorthand.default,
|
|
44
45
|
"sort-collections": import_sort_collections.default,
|
|
46
|
+
"unique-dependencies": import_unique_dependencies.default,
|
|
45
47
|
"valid-local-dependency": import_valid_local_dependency.default,
|
|
46
48
|
"valid-package-def": import_valid_package_def.default,
|
|
47
49
|
"valid-repository-directory": import_valid_repository_directory.default
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import orderProperties from \"./rules/order-properties.js\";\nimport preferRepositoryShorthand from \"./rules/prefer-repository-shorthand.js\";\nimport sortCollections from \"./rules/sort-collections.js\";\nimport validLocalDependency from \"./rules/valid-local-dependency.js\";\nimport validPackageDef from \"./rules/valid-package-def.js\";\nimport validRepositoryDirectory from \"./rules/valid-repository-directory.js\";\n\nexport const rules = {\n\t\"order-properties\": orderProperties,\n\t\"prefer-repository-shorthand\": preferRepositoryShorthand,\n\t\"sort-collections\": sortCollections,\n\t\"valid-local-dependency\": validLocalDependency,\n\t\"valid-package-def\": validPackageDef,\n\t\"valid-repository-directory\": validRepositoryDirectory,\n};\n\nexport const configs = {\n\trecommended: {\n\t\trules: Object.fromEntries(\n\t\t\tObject.entries(rules)\n\t\t\t\t.filter(([, rule]) => rule.meta.docs?.recommended)\n\t\t\t\t.map(([name]) => [\"package-json/\" + name, \"error\" as const]),\n\t\t),\n\t},\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAA4B;AAC5B,yCAAsC;AACtC,8BAA4B;AAC5B,oCAAiC;AACjC,+BAA4B;AAC5B,wCAAqC;AAE9B,MAAM,QAAQ;AAAA,EACpB,oBAAoB,wBAAAA;AAAA,EACpB,+BAA+B,mCAAAC;AAAA,EAC/B,oBAAoB,wBAAAC;AAAA,EACpB,0BAA0B,8BAAAC;AAAA,EAC1B,qBAAqB,yBAAAC;AAAA,EACrB,8BAA8B,kCAAAC;AAC/B;AAEO,MAAM,UAAU;AAAA,EACtB,aAAa;AAAA,IACZ,OAAO,OAAO;AAAA,MACb,OAAO,QAAQ,KAAK,EAClB,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,KAAK,MAAM,WAAW,EAChD,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,kBAAkB,MAAM,OAAgB,CAAC;AAAA,IAC7D;AAAA,EACD;AACD;","names":["orderProperties","preferRepositoryShorthand","sortCollections","validLocalDependency","validPackageDef","validRepositoryDirectory"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import orderProperties from \"./rules/order-properties.js\";\nimport preferRepositoryShorthand from \"./rules/prefer-repository-shorthand.js\";\nimport sortCollections from \"./rules/sort-collections.js\";\nimport uniqueDependencies from \"./rules/unique-dependencies.js\";\nimport validLocalDependency from \"./rules/valid-local-dependency.js\";\nimport validPackageDef from \"./rules/valid-package-def.js\";\nimport validRepositoryDirectory from \"./rules/valid-repository-directory.js\";\n\nexport const rules = {\n\t\"order-properties\": orderProperties,\n\t\"prefer-repository-shorthand\": preferRepositoryShorthand,\n\t\"sort-collections\": sortCollections,\n\t\"unique-dependencies\": uniqueDependencies,\n\t\"valid-local-dependency\": validLocalDependency,\n\t\"valid-package-def\": validPackageDef,\n\t\"valid-repository-directory\": validRepositoryDirectory,\n};\n\nexport const configs = {\n\trecommended: {\n\t\trules: Object.fromEntries(\n\t\t\tObject.entries(rules)\n\t\t\t\t.filter(([, rule]) => rule.meta.docs?.recommended)\n\t\t\t\t.map(([name]) => [\"package-json/\" + name, \"error\" as const]),\n\t\t),\n\t},\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAA4B;AAC5B,yCAAsC;AACtC,8BAA4B;AAC5B,iCAA+B;AAC/B,oCAAiC;AACjC,+BAA4B;AAC5B,wCAAqC;AAE9B,MAAM,QAAQ;AAAA,EACpB,oBAAoB,wBAAAA;AAAA,EACpB,+BAA+B,mCAAAC;AAAA,EAC/B,oBAAoB,wBAAAC;AAAA,EACpB,uBAAuB,2BAAAC;AAAA,EACvB,0BAA0B,8BAAAC;AAAA,EAC1B,qBAAqB,yBAAAC;AAAA,EACrB,8BAA8B,kCAAAC;AAC/B;AAEO,MAAM,UAAU;AAAA,EACtB,aAAa;AAAA,IACZ,OAAO,OAAO;AAAA,MACb,OAAO,QAAQ,KAAK,EAClB,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,KAAK,MAAM,WAAW,EAChD,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,kBAAkB,MAAM,OAAgB,CAAC;AAAA,IAC7D;AAAA,EACD;AACD;","names":["orderProperties","preferRepositoryShorthand","sortCollections","uniqueDependencies","validLocalDependency","validPackageDef","validRepositoryDirectory"]}
|
package/lib/index.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import orderProperties from "./rules/order-properties.js";
|
|
2
2
|
import preferRepositoryShorthand from "./rules/prefer-repository-shorthand.js";
|
|
3
3
|
import sortCollections from "./rules/sort-collections.js";
|
|
4
|
+
import uniqueDependencies from "./rules/unique-dependencies.js";
|
|
4
5
|
import validLocalDependency from "./rules/valid-local-dependency.js";
|
|
5
6
|
import validPackageDef from "./rules/valid-package-def.js";
|
|
6
7
|
import validRepositoryDirectory from "./rules/valid-repository-directory.js";
|
|
@@ -8,6 +9,7 @@ const rules = {
|
|
|
8
9
|
"order-properties": orderProperties,
|
|
9
10
|
"prefer-repository-shorthand": preferRepositoryShorthand,
|
|
10
11
|
"sort-collections": sortCollections,
|
|
12
|
+
"unique-dependencies": uniqueDependencies,
|
|
11
13
|
"valid-local-dependency": validLocalDependency,
|
|
12
14
|
"valid-package-def": validPackageDef,
|
|
13
15
|
"valid-repository-directory": validRepositoryDirectory
|
package/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import orderProperties from \"./rules/order-properties.js\";\nimport preferRepositoryShorthand from \"./rules/prefer-repository-shorthand.js\";\nimport sortCollections from \"./rules/sort-collections.js\";\nimport validLocalDependency from \"./rules/valid-local-dependency.js\";\nimport validPackageDef from \"./rules/valid-package-def.js\";\nimport validRepositoryDirectory from \"./rules/valid-repository-directory.js\";\n\nexport const rules = {\n\t\"order-properties\": orderProperties,\n\t\"prefer-repository-shorthand\": preferRepositoryShorthand,\n\t\"sort-collections\": sortCollections,\n\t\"valid-local-dependency\": validLocalDependency,\n\t\"valid-package-def\": validPackageDef,\n\t\"valid-repository-directory\": validRepositoryDirectory,\n};\n\nexport const configs = {\n\trecommended: {\n\t\trules: Object.fromEntries(\n\t\t\tObject.entries(rules)\n\t\t\t\t.filter(([, rule]) => rule.meta.docs?.recommended)\n\t\t\t\t.map(([name]) => [\"package-json/\" + name, \"error\" as const]),\n\t\t),\n\t},\n};\n"],"mappings":"AAAA,OAAO,qBAAqB;AAC5B,OAAO,+BAA+B;AACtC,OAAO,qBAAqB;AAC5B,OAAO,0BAA0B;AACjC,OAAO,qBAAqB;AAC5B,OAAO,8BAA8B;AAE9B,MAAM,QAAQ;AAAA,EACpB,oBAAoB;AAAA,EACpB,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,8BAA8B;AAC/B;AAEO,MAAM,UAAU;AAAA,EACtB,aAAa;AAAA,IACZ,OAAO,OAAO;AAAA,MACb,OAAO,QAAQ,KAAK,EAClB,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,KAAK,MAAM,WAAW,EAChD,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,kBAAkB,MAAM,OAAgB,CAAC;AAAA,IAC7D;AAAA,EACD;AACD;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import orderProperties from \"./rules/order-properties.js\";\nimport preferRepositoryShorthand from \"./rules/prefer-repository-shorthand.js\";\nimport sortCollections from \"./rules/sort-collections.js\";\nimport uniqueDependencies from \"./rules/unique-dependencies.js\";\nimport validLocalDependency from \"./rules/valid-local-dependency.js\";\nimport validPackageDef from \"./rules/valid-package-def.js\";\nimport validRepositoryDirectory from \"./rules/valid-repository-directory.js\";\n\nexport const rules = {\n\t\"order-properties\": orderProperties,\n\t\"prefer-repository-shorthand\": preferRepositoryShorthand,\n\t\"sort-collections\": sortCollections,\n\t\"unique-dependencies\": uniqueDependencies,\n\t\"valid-local-dependency\": validLocalDependency,\n\t\"valid-package-def\": validPackageDef,\n\t\"valid-repository-directory\": validRepositoryDirectory,\n};\n\nexport const configs = {\n\trecommended: {\n\t\trules: Object.fromEntries(\n\t\t\tObject.entries(rules)\n\t\t\t\t.filter(([, rule]) => rule.meta.docs?.recommended)\n\t\t\t\t.map(([name]) => [\"package-json/\" + name, \"error\" as const]),\n\t\t),\n\t},\n};\n"],"mappings":"AAAA,OAAO,qBAAqB;AAC5B,OAAO,+BAA+B;AACtC,OAAO,qBAAqB;AAC5B,OAAO,wBAAwB;AAC/B,OAAO,0BAA0B;AACjC,OAAO,qBAAqB;AAC5B,OAAO,8BAA8B;AAE9B,MAAM,QAAQ;AAAA,EACpB,oBAAoB;AAAA,EACpB,+BAA+B;AAAA,EAC/B,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,8BAA8B;AAC/B;AAEO,MAAM,UAAU;AAAA,EACtB,aAAa;AAAA,IACZ,OAAO,OAAO;AAAA,MACb,OAAO,QAAQ,KAAK,EAClB,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,KAAK,MAAM,WAAW,EAChD,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,kBAAkB,MAAM,OAAgB,CAAC;AAAA,IAC7D;AAAA,EACD;AACD;","names":[]}
|
|
@@ -82,7 +82,7 @@ var order_properties_default = (0, import_createRule.createRule)({
|
|
|
82
82
|
const orderedKeys = Object.keys(orderedSource);
|
|
83
83
|
const { properties } = ast.body[0].expression;
|
|
84
84
|
for (let i = 0; i < properties.length; i += 1) {
|
|
85
|
-
if (properties[i].value !== orderedKeys[i]) {
|
|
85
|
+
if (properties[i].key.value !== orderedKeys[i]) {
|
|
86
86
|
context.report({
|
|
87
87
|
fix(fixer) {
|
|
88
88
|
return fixer.replaceText(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/rules/order-properties.ts"],"sourcesContent":["import sortPackageJson from \"sort-package-json\";\n\nimport { createRule } from \"../createRule.js\";\n\nconst standardOrderLegacy = [\n\t\"name\",\n\t\"version\",\n\t\"private\",\n\t\"publishConfig\",\n\t\"description\",\n\t\"main\",\n\t\"exports\",\n\t\"browser\",\n\t\"files\",\n\t\"bin\",\n\t\"directories\",\n\t\"man\",\n\t\"scripts\",\n\t\"repository\",\n\t\"keywords\",\n\t\"author\",\n\t\"license\",\n\t\"bugs\",\n\t\"homepage\",\n\t\"config\",\n\t\"dependencies\",\n\t\"devDependencies\",\n\t\"peerDependencies\",\n\t\"optionalDependencies\",\n\t\"bundledDependencies\",\n\t\"engines\",\n\t\"os\",\n\t\"cpu\",\n];\n\ntype Order = \"legacy\" | \"sort-package-json\";\n\ntype Options = [{ order: Order }?];\n\nexport default createRule<Options>({\n\tcreate(context) {\n\t\treturn {\n\t\t\t\"Program:exit\"() {\n\t\t\t\tconst { ast, text } = context.sourceCode;\n\n\t\t\t\tconst options = {\n\t\t\t\t\torder: \"sort-package-json\",\n\t\t\t\t\t...context.options[0],\n\t\t\t\t} satisfies Options[0];\n\n\t\t\t\tconst requiredOrder =\n\t\t\t\t\toptions.order === \"legacy\"\n\t\t\t\t\t\t? standardOrderLegacy\n\t\t\t\t\t\t: options.order;\n\t\t\t\tconst orderedSource = sortPackageJson(\n\t\t\t\t\tJSON.parse(text) as object,\n\t\t\t\t\trequiredOrder === \"sort-package-json\"\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tsortOrder: requiredOrder,\n\t\t\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst orderedKeys = Object.keys(orderedSource);\n\n\t\t\t\tconst { properties } = ast.body[0].expression;\n\n\t\t\t\tfor (let i = 0; i < properties.length; i += 1) {\n\t\t\t\t\tif (properties[i].value !== orderedKeys[i]) {\n\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\tfix(fixer) {\n\t\t\t\t\t\t\t\treturn fixer.replaceText(\n\t\t\t\t\t\t\t\t\tcontext.sourceCode.ast,\n\t\t\t\t\t\t\t\t\tJSON.stringify(orderedSource, null, 2) +\n\t\t\t\t\t\t\t\t\t\t`\\n`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\"Package top-level properties are not ordered in the npm standard way. Run the ESLint auto-fixer to correct.\",\n\t\t\t\t\t\t\tnode: context.sourceCode.ast,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t},\n\n\tmeta: {\n\t\tdocs: {\n\t\t\tcategory: \"Best Practices\",\n\t\t\tdescription:\n\t\t\t\t\"Package properties must be declared in standard order\",\n\t\t\trecommended: true,\n\t\t},\n\t\tfixable: \"code\",\n\t\tschema: [\n\t\t\t{\n\t\t\t\tproperties: {\n\t\t\t\t\torder: {\n\t\t\t\t\t\tanyOf: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tenum: [\"legacy\", \"sort-package-json\"],\n\t\t\t\t\t\t\t\ttype: [\"string\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\titems: {\n\t\t\t\t\t\t\t\t\ttype: [\"string\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: [\"array\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttype: \"object\",\n\t\t\t},\n\t\t],\n\t},\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
1
|
+
{"version":3,"sources":["../../src/rules/order-properties.ts"],"sourcesContent":["import type { AST as JsonAST } from \"jsonc-eslint-parser\";\n\nimport sortPackageJson from \"sort-package-json\";\n\nimport { createRule } from \"../createRule.js\";\n\nconst standardOrderLegacy = [\n\t\"name\",\n\t\"version\",\n\t\"private\",\n\t\"publishConfig\",\n\t\"description\",\n\t\"main\",\n\t\"exports\",\n\t\"browser\",\n\t\"files\",\n\t\"bin\",\n\t\"directories\",\n\t\"man\",\n\t\"scripts\",\n\t\"repository\",\n\t\"keywords\",\n\t\"author\",\n\t\"license\",\n\t\"bugs\",\n\t\"homepage\",\n\t\"config\",\n\t\"dependencies\",\n\t\"devDependencies\",\n\t\"peerDependencies\",\n\t\"optionalDependencies\",\n\t\"bundledDependencies\",\n\t\"engines\",\n\t\"os\",\n\t\"cpu\",\n];\n\ntype Order = \"legacy\" | \"sort-package-json\";\n\ntype Options = [{ order: Order }?];\n\nexport default createRule<Options>({\n\tcreate(context) {\n\t\treturn {\n\t\t\t\"Program:exit\"() {\n\t\t\t\tconst { ast, text } = context.sourceCode;\n\n\t\t\t\tconst options = {\n\t\t\t\t\torder: \"sort-package-json\",\n\t\t\t\t\t...context.options[0],\n\t\t\t\t} satisfies Options[0];\n\n\t\t\t\tconst requiredOrder =\n\t\t\t\t\toptions.order === \"legacy\"\n\t\t\t\t\t\t? standardOrderLegacy\n\t\t\t\t\t\t: options.order;\n\t\t\t\tconst orderedSource = sortPackageJson(\n\t\t\t\t\tJSON.parse(text) as object,\n\t\t\t\t\trequiredOrder === \"sort-package-json\"\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tsortOrder: requiredOrder,\n\t\t\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst orderedKeys = Object.keys(orderedSource);\n\n\t\t\t\tconst { properties } = ast.body[0].expression;\n\n\t\t\t\tfor (let i = 0; i < properties.length; i += 1) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(properties[i].key as JsonAST.JSONStringLiteral)\n\t\t\t\t\t\t\t.value !== orderedKeys[i]\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\tfix(fixer) {\n\t\t\t\t\t\t\t\treturn fixer.replaceText(\n\t\t\t\t\t\t\t\t\tcontext.sourceCode.ast,\n\t\t\t\t\t\t\t\t\tJSON.stringify(orderedSource, null, 2) +\n\t\t\t\t\t\t\t\t\t\t`\\n`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\"Package top-level properties are not ordered in the npm standard way. Run the ESLint auto-fixer to correct.\",\n\t\t\t\t\t\t\tnode: context.sourceCode.ast,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t},\n\n\tmeta: {\n\t\tdocs: {\n\t\t\tcategory: \"Best Practices\",\n\t\t\tdescription:\n\t\t\t\t\"Package properties must be declared in standard order\",\n\t\t\trecommended: true,\n\t\t},\n\t\tfixable: \"code\",\n\t\tschema: [\n\t\t\t{\n\t\t\t\tproperties: {\n\t\t\t\t\torder: {\n\t\t\t\t\t\tanyOf: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tenum: [\"legacy\", \"sort-package-json\"],\n\t\t\t\t\t\t\t\ttype: [\"string\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\titems: {\n\t\t\t\t\t\t\t\t\ttype: [\"string\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: [\"array\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttype: \"object\",\n\t\t\t},\n\t\t],\n\t},\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,+BAA4B;AAE5B,wBAA2B;AAE3B,MAAM,sBAAsB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAMA,IAAO,+BAAQ,8BAAoB;AAAA,EAClC,OAAO,SAAS;AACf,WAAO;AAAA,MACN,iBAAiB;AAChB,cAAM,EAAE,KAAK,KAAK,IAAI,QAAQ;AAE9B,cAAM,UAAU;AAAA,UACf,OAAO;AAAA,UACP,GAAG,QAAQ,QAAQ,CAAC;AAAA,QACrB;AAEA,cAAM,gBACL,QAAQ,UAAU,WACf,sBACA,QAAQ;AACZ,cAAM,oBAAgB,yBAAAA;AAAA,UACrB,KAAK,MAAM,IAAI;AAAA,UACf,kBAAkB,sBACf,SACA;AAAA,YACA,WAAW;AAAA,UACZ;AAAA,QACH;AACA,cAAM,cAAc,OAAO,KAAK,aAAa;AAE7C,cAAM,EAAE,WAAW,IAAI,IAAI,KAAK,CAAC,EAAE;AAEnC,iBAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAAG;AAC9C,cACE,WAAW,CAAC,EAAE,IACb,UAAU,YAAY,CAAC,GACxB;AACD,oBAAQ,OAAO;AAAA,cACd,IAAI,OAAO;AACV,uBAAO,MAAM;AAAA,kBACZ,QAAQ,WAAW;AAAA,kBACnB,KAAK,UAAU,eAAe,MAAM,CAAC,IACpC;AAAA;AAAA,gBACF;AAAA,cACD;AAAA,cACA,SACC;AAAA,cACD,MAAM,QAAQ,WAAW;AAAA,YAC1B,CAAC;AAAA,UACF;AAEA;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM;AAAA,IACL,MAAM;AAAA,MACL,UAAU;AAAA,MACV,aACC;AAAA,MACD,aAAa;AAAA,IACd;AAAA,IACA,SAAS;AAAA,IACT,QAAQ;AAAA,MACP;AAAA,QACC,YAAY;AAAA,UACX,OAAO;AAAA,YACN,OAAO;AAAA,cACN;AAAA,gBACC,MAAM,CAAC,UAAU,mBAAmB;AAAA,gBACpC,MAAM,CAAC,QAAQ;AAAA,cAChB;AAAA,cACA;AAAA,gBACC,OAAO;AAAA,kBACN,MAAM,CAAC,QAAQ;AAAA,gBAChB;AAAA,gBACA,MAAM,CAAC,OAAO;AAAA,cACf;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,QACA,MAAM;AAAA,MACP;AAAA,IACD;AAAA,EACD;AACD,CAAC;","names":["sortPackageJson"]}
|
|
@@ -49,7 +49,7 @@ var order_properties_default = createRule({
|
|
|
49
49
|
const orderedKeys = Object.keys(orderedSource);
|
|
50
50
|
const { properties } = ast.body[0].expression;
|
|
51
51
|
for (let i = 0; i < properties.length; i += 1) {
|
|
52
|
-
if (properties[i].value !== orderedKeys[i]) {
|
|
52
|
+
if (properties[i].key.value !== orderedKeys[i]) {
|
|
53
53
|
context.report({
|
|
54
54
|
fix(fixer) {
|
|
55
55
|
return fixer.replaceText(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/rules/order-properties.ts"],"sourcesContent":["import sortPackageJson from \"sort-package-json\";\n\nimport { createRule } from \"../createRule.js\";\n\nconst standardOrderLegacy = [\n\t\"name\",\n\t\"version\",\n\t\"private\",\n\t\"publishConfig\",\n\t\"description\",\n\t\"main\",\n\t\"exports\",\n\t\"browser\",\n\t\"files\",\n\t\"bin\",\n\t\"directories\",\n\t\"man\",\n\t\"scripts\",\n\t\"repository\",\n\t\"keywords\",\n\t\"author\",\n\t\"license\",\n\t\"bugs\",\n\t\"homepage\",\n\t\"config\",\n\t\"dependencies\",\n\t\"devDependencies\",\n\t\"peerDependencies\",\n\t\"optionalDependencies\",\n\t\"bundledDependencies\",\n\t\"engines\",\n\t\"os\",\n\t\"cpu\",\n];\n\ntype Order = \"legacy\" | \"sort-package-json\";\n\ntype Options = [{ order: Order }?];\n\nexport default createRule<Options>({\n\tcreate(context) {\n\t\treturn {\n\t\t\t\"Program:exit\"() {\n\t\t\t\tconst { ast, text } = context.sourceCode;\n\n\t\t\t\tconst options = {\n\t\t\t\t\torder: \"sort-package-json\",\n\t\t\t\t\t...context.options[0],\n\t\t\t\t} satisfies Options[0];\n\n\t\t\t\tconst requiredOrder =\n\t\t\t\t\toptions.order === \"legacy\"\n\t\t\t\t\t\t? standardOrderLegacy\n\t\t\t\t\t\t: options.order;\n\t\t\t\tconst orderedSource = sortPackageJson(\n\t\t\t\t\tJSON.parse(text) as object,\n\t\t\t\t\trequiredOrder === \"sort-package-json\"\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tsortOrder: requiredOrder,\n\t\t\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst orderedKeys = Object.keys(orderedSource);\n\n\t\t\t\tconst { properties } = ast.body[0].expression;\n\n\t\t\t\tfor (let i = 0; i < properties.length; i += 1) {\n\t\t\t\t\tif (properties[i].value !== orderedKeys[i]) {\n\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\tfix(fixer) {\n\t\t\t\t\t\t\t\treturn fixer.replaceText(\n\t\t\t\t\t\t\t\t\tcontext.sourceCode.ast,\n\t\t\t\t\t\t\t\t\tJSON.stringify(orderedSource, null, 2) +\n\t\t\t\t\t\t\t\t\t\t`\\n`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\"Package top-level properties are not ordered in the npm standard way. Run the ESLint auto-fixer to correct.\",\n\t\t\t\t\t\t\tnode: context.sourceCode.ast,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t},\n\n\tmeta: {\n\t\tdocs: {\n\t\t\tcategory: \"Best Practices\",\n\t\t\tdescription:\n\t\t\t\t\"Package properties must be declared in standard order\",\n\t\t\trecommended: true,\n\t\t},\n\t\tfixable: \"code\",\n\t\tschema: [\n\t\t\t{\n\t\t\t\tproperties: {\n\t\t\t\t\torder: {\n\t\t\t\t\t\tanyOf: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tenum: [\"legacy\", \"sort-package-json\"],\n\t\t\t\t\t\t\t\ttype: [\"string\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\titems: {\n\t\t\t\t\t\t\t\t\ttype: [\"string\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: [\"array\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttype: \"object\",\n\t\t\t},\n\t\t],\n\t},\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/rules/order-properties.ts"],"sourcesContent":["import type { AST as JsonAST } from \"jsonc-eslint-parser\";\n\nimport sortPackageJson from \"sort-package-json\";\n\nimport { createRule } from \"../createRule.js\";\n\nconst standardOrderLegacy = [\n\t\"name\",\n\t\"version\",\n\t\"private\",\n\t\"publishConfig\",\n\t\"description\",\n\t\"main\",\n\t\"exports\",\n\t\"browser\",\n\t\"files\",\n\t\"bin\",\n\t\"directories\",\n\t\"man\",\n\t\"scripts\",\n\t\"repository\",\n\t\"keywords\",\n\t\"author\",\n\t\"license\",\n\t\"bugs\",\n\t\"homepage\",\n\t\"config\",\n\t\"dependencies\",\n\t\"devDependencies\",\n\t\"peerDependencies\",\n\t\"optionalDependencies\",\n\t\"bundledDependencies\",\n\t\"engines\",\n\t\"os\",\n\t\"cpu\",\n];\n\ntype Order = \"legacy\" | \"sort-package-json\";\n\ntype Options = [{ order: Order }?];\n\nexport default createRule<Options>({\n\tcreate(context) {\n\t\treturn {\n\t\t\t\"Program:exit\"() {\n\t\t\t\tconst { ast, text } = context.sourceCode;\n\n\t\t\t\tconst options = {\n\t\t\t\t\torder: \"sort-package-json\",\n\t\t\t\t\t...context.options[0],\n\t\t\t\t} satisfies Options[0];\n\n\t\t\t\tconst requiredOrder =\n\t\t\t\t\toptions.order === \"legacy\"\n\t\t\t\t\t\t? standardOrderLegacy\n\t\t\t\t\t\t: options.order;\n\t\t\t\tconst orderedSource = sortPackageJson(\n\t\t\t\t\tJSON.parse(text) as object,\n\t\t\t\t\trequiredOrder === \"sort-package-json\"\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tsortOrder: requiredOrder,\n\t\t\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst orderedKeys = Object.keys(orderedSource);\n\n\t\t\t\tconst { properties } = ast.body[0].expression;\n\n\t\t\t\tfor (let i = 0; i < properties.length; i += 1) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(properties[i].key as JsonAST.JSONStringLiteral)\n\t\t\t\t\t\t\t.value !== orderedKeys[i]\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\tfix(fixer) {\n\t\t\t\t\t\t\t\treturn fixer.replaceText(\n\t\t\t\t\t\t\t\t\tcontext.sourceCode.ast,\n\t\t\t\t\t\t\t\t\tJSON.stringify(orderedSource, null, 2) +\n\t\t\t\t\t\t\t\t\t\t`\\n`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\"Package top-level properties are not ordered in the npm standard way. Run the ESLint auto-fixer to correct.\",\n\t\t\t\t\t\t\tnode: context.sourceCode.ast,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t},\n\n\tmeta: {\n\t\tdocs: {\n\t\t\tcategory: \"Best Practices\",\n\t\t\tdescription:\n\t\t\t\t\"Package properties must be declared in standard order\",\n\t\t\trecommended: true,\n\t\t},\n\t\tfixable: \"code\",\n\t\tschema: [\n\t\t\t{\n\t\t\t\tproperties: {\n\t\t\t\t\torder: {\n\t\t\t\t\t\tanyOf: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tenum: [\"legacy\", \"sort-package-json\"],\n\t\t\t\t\t\t\t\ttype: [\"string\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\titems: {\n\t\t\t\t\t\t\t\t\ttype: [\"string\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttype: [\"array\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttype: \"object\",\n\t\t\t},\n\t\t],\n\t},\n});\n"],"mappings":"AAEA,OAAO,qBAAqB;AAE5B,SAAS,kBAAkB;AAE3B,MAAM,sBAAsB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAMA,IAAO,2BAAQ,WAAoB;AAAA,EAClC,OAAO,SAAS;AACf,WAAO;AAAA,MACN,iBAAiB;AAChB,cAAM,EAAE,KAAK,KAAK,IAAI,QAAQ;AAE9B,cAAM,UAAU;AAAA,UACf,OAAO;AAAA,UACP,GAAG,QAAQ,QAAQ,CAAC;AAAA,QACrB;AAEA,cAAM,gBACL,QAAQ,UAAU,WACf,sBACA,QAAQ;AACZ,cAAM,gBAAgB;AAAA,UACrB,KAAK,MAAM,IAAI;AAAA,UACf,kBAAkB,sBACf,SACA;AAAA,YACA,WAAW;AAAA,UACZ;AAAA,QACH;AACA,cAAM,cAAc,OAAO,KAAK,aAAa;AAE7C,cAAM,EAAE,WAAW,IAAI,IAAI,KAAK,CAAC,EAAE;AAEnC,iBAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAAG;AAC9C,cACE,WAAW,CAAC,EAAE,IACb,UAAU,YAAY,CAAC,GACxB;AACD,oBAAQ,OAAO;AAAA,cACd,IAAI,OAAO;AACV,uBAAO,MAAM;AAAA,kBACZ,QAAQ,WAAW;AAAA,kBACnB,KAAK,UAAU,eAAe,MAAM,CAAC,IACpC;AAAA;AAAA,gBACF;AAAA,cACD;AAAA,cACA,SACC;AAAA,cACD,MAAM,QAAQ,WAAW;AAAA,YAC1B,CAAC;AAAA,UACF;AAEA;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM;AAAA,IACL,MAAM;AAAA,MACL,UAAU;AAAA,MACV,aACC;AAAA,MACD,aAAa;AAAA,IACd;AAAA,IACA,SAAS;AAAA,IACT,QAAQ;AAAA,MACP;AAAA,QACC,YAAY;AAAA,UACX,OAAO;AAAA,YACN,OAAO;AAAA,cACN;AAAA,gBACC,MAAM,CAAC,UAAU,mBAAmB;AAAA,gBACpC,MAAM,CAAC,QAAQ;AAAA,cAChB;AAAA,cACA;AAAA,gBACC,OAAO;AAAA,kBACN,MAAM,CAAC,QAAQ;AAAA,gBAChB;AAAA,gBACA,MAAM,CAAC,OAAO;AAAA,cACf;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,QACA,MAAM;AAAA,MACP;AAAA,IACD;AAAA,EACD;AACD,CAAC;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as eslint from 'eslint';
|
|
2
|
+
import * as jsonc_eslint_parser from 'jsonc-eslint-parser';
|
|
3
|
+
import { PackageJsonRuleContext } from '../createRule.mjs';
|
|
4
|
+
import 'estree';
|
|
5
|
+
|
|
6
|
+
declare const _default: {
|
|
7
|
+
create(context: PackageJsonRuleContext<unknown[]>): jsonc_eslint_parser.RuleListener;
|
|
8
|
+
meta: eslint.Rule.RuleMetaData;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { _default as default };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as eslint from 'eslint';
|
|
2
|
+
import * as jsonc_eslint_parser from 'jsonc-eslint-parser';
|
|
3
|
+
import { PackageJsonRuleContext } from '../createRule.js';
|
|
4
|
+
import 'estree';
|
|
5
|
+
|
|
6
|
+
declare const _default: {
|
|
7
|
+
create(context: PackageJsonRuleContext<unknown[]>): jsonc_eslint_parser.RuleListener;
|
|
8
|
+
meta: eslint.Rule.RuleMetaData;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { _default as default };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var unique_dependencies_exports = {};
|
|
20
|
+
__export(unique_dependencies_exports, {
|
|
21
|
+
default: () => unique_dependencies_default
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(unique_dependencies_exports);
|
|
24
|
+
var import_createRule = require("../createRule.js");
|
|
25
|
+
var import_predicates = require("../utils/predicates.js");
|
|
26
|
+
const dependencyPropertyNames = /* @__PURE__ */ new Set([
|
|
27
|
+
"bundleDependencies",
|
|
28
|
+
"bundledDependencies",
|
|
29
|
+
"dependencies",
|
|
30
|
+
"devDependencies",
|
|
31
|
+
"optionalDependencies",
|
|
32
|
+
"peerDependencies",
|
|
33
|
+
"overrides"
|
|
34
|
+
]);
|
|
35
|
+
var unique_dependencies_default = (0, import_createRule.createRule)({
|
|
36
|
+
create(context) {
|
|
37
|
+
function check(elements, getNodeToRemove) {
|
|
38
|
+
const seen = /* @__PURE__ */ new Set();
|
|
39
|
+
for (const element of elements.filter(import_predicates.isNotNullish).filter(import_predicates.isJSONStringLiteral).reverse()) {
|
|
40
|
+
if (seen.has(element.value)) {
|
|
41
|
+
report(element);
|
|
42
|
+
} else {
|
|
43
|
+
seen.add(element.value);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function report(node) {
|
|
47
|
+
context.report({
|
|
48
|
+
messageId: "overridden",
|
|
49
|
+
node,
|
|
50
|
+
suggest: [
|
|
51
|
+
{
|
|
52
|
+
fix(fixer) {
|
|
53
|
+
const removal = getNodeToRemove(node);
|
|
54
|
+
return [
|
|
55
|
+
fixer.remove(removal),
|
|
56
|
+
fixer.remove(
|
|
57
|
+
// A listing that's overridden can't be last,
|
|
58
|
+
// so we're guaranteed there's a comma after.
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
60
|
+
context.sourceCode.getTokenAfter(
|
|
61
|
+
removal
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
];
|
|
65
|
+
},
|
|
66
|
+
messageId: "remove"
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
"Program > JSONExpressionStatement > JSONObjectExpression > JSONProperty[key.type=JSONLiteral]"(node) {
|
|
74
|
+
if (!dependencyPropertyNames.has(node.key.value)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
switch (node.value.type) {
|
|
78
|
+
case "JSONArrayExpression":
|
|
79
|
+
check(
|
|
80
|
+
node.value.elements,
|
|
81
|
+
(element) => element
|
|
82
|
+
);
|
|
83
|
+
break;
|
|
84
|
+
case "JSONObjectExpression":
|
|
85
|
+
check(
|
|
86
|
+
node.value.properties.map(
|
|
87
|
+
(property) => property.key
|
|
88
|
+
),
|
|
89
|
+
(property) => property.parent
|
|
90
|
+
);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
},
|
|
96
|
+
meta: {
|
|
97
|
+
docs: {
|
|
98
|
+
category: "Best Practices",
|
|
99
|
+
description: "Enforce that if repository directory is specified, it matches the path to the package.json file",
|
|
100
|
+
recommended: true
|
|
101
|
+
},
|
|
102
|
+
hasSuggestions: true,
|
|
103
|
+
messages: {
|
|
104
|
+
overridden: "Package name is overridden by a duplicate listing later on.",
|
|
105
|
+
remove: "Remove this redundant dependency listing."
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=unique-dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/rules/unique-dependencies.ts"],"sourcesContent":["import type { AST as JsonAST } from \"jsonc-eslint-parser\";\n\nimport * as ESTree from \"estree\";\n\nimport { createRule } from \"../createRule.js\";\nimport { isJSONStringLiteral, isNotNullish } from \"../utils/predicates.js\";\n\nconst dependencyPropertyNames = new Set([\n\t\"bundleDependencies\",\n\t\"bundledDependencies\",\n\t\"dependencies\",\n\t\"devDependencies\",\n\t\"optionalDependencies\",\n\t\"peerDependencies\",\n\t\"overrides\",\n]);\n\nexport default createRule({\n\tcreate(context) {\n\t\tfunction check(\n\t\t\telements: (JsonAST.JSONNode | null)[],\n\t\t\tgetNodeToRemove: (element: JsonAST.JSONNode) => ESTree.Node,\n\t\t) {\n\t\t\tconst seen = new Set();\n\n\t\t\tfor (const element of elements\n\t\t\t\t.filter(isNotNullish)\n\t\t\t\t.filter(isJSONStringLiteral)\n\t\t\t\t.reverse()) {\n\t\t\t\tif (seen.has(element.value)) {\n\t\t\t\t\treport(element);\n\t\t\t\t} else {\n\t\t\t\t\tseen.add(element.value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction report(node: JsonAST.JSONNode) {\n\t\t\t\tcontext.report({\n\t\t\t\t\tmessageId: \"overridden\",\n\t\t\t\t\tnode: node as unknown as ESTree.Node,\n\t\t\t\t\tsuggest: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfix(fixer) {\n\t\t\t\t\t\t\t\tconst removal = getNodeToRemove(node);\n\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\tfixer.remove(removal),\n\t\t\t\t\t\t\t\t\tfixer.remove(\n\t\t\t\t\t\t\t\t\t\t// A listing that's overridden can't be last,\n\t\t\t\t\t\t\t\t\t\t// so we're guaranteed there's a comma after.\n\t\t\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\t\t\t\t\tcontext.sourceCode.getTokenAfter(\n\t\t\t\t\t\t\t\t\t\t\tremoval,\n\t\t\t\t\t\t\t\t\t\t)!,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmessageId: \"remove\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t\"Program > JSONExpressionStatement > JSONObjectExpression > JSONProperty[key.type=JSONLiteral]\"(\n\t\t\t\tnode: JsonAST.JSONProperty & {\n\t\t\t\t\tkey: JsonAST.JSONStringLiteral;\n\t\t\t\t},\n\t\t\t) {\n\t\t\t\tif (!dependencyPropertyNames.has(node.key.value)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tswitch (node.value.type) {\n\t\t\t\t\tcase \"JSONArrayExpression\":\n\t\t\t\t\t\tcheck(\n\t\t\t\t\t\t\tnode.value.elements,\n\t\t\t\t\t\t\t(element) => element as unknown as ESTree.Node,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"JSONObjectExpression\":\n\t\t\t\t\t\tcheck(\n\t\t\t\t\t\t\tnode.value.properties.map(\n\t\t\t\t\t\t\t\t(property) => property.key,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t(property) =>\n\t\t\t\t\t\t\t\tproperty.parent as unknown as ESTree.Node,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t},\n\n\tmeta: {\n\t\tdocs: {\n\t\t\tcategory: \"Best Practices\",\n\t\t\tdescription:\n\t\t\t\t\"Enforce that if repository directory is specified, it matches the path to the package.json file\",\n\t\t\trecommended: true,\n\t\t},\n\t\thasSuggestions: true,\n\t\tmessages: {\n\t\t\toverridden:\n\t\t\t\t\"Package name is overridden by a duplicate listing later on.\",\n\t\t\tremove: \"Remove this redundant dependency listing.\",\n\t\t},\n\t},\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,wBAA2B;AAC3B,wBAAkD;AAElD,MAAM,0BAA0B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAED,IAAO,kCAAQ,8BAAW;AAAA,EACzB,OAAO,SAAS;AACf,aAAS,MACR,UACA,iBACC;AACD,YAAM,OAAO,oBAAI,IAAI;AAErB,iBAAW,WAAW,SACpB,OAAO,8BAAY,EACnB,OAAO,qCAAmB,EAC1B,QAAQ,GAAG;AACZ,YAAI,KAAK,IAAI,QAAQ,KAAK,GAAG;AAC5B,iBAAO,OAAO;AAAA,QACf,OAAO;AACN,eAAK,IAAI,QAAQ,KAAK;AAAA,QACvB;AAAA,MACD;AAEA,eAAS,OAAO,MAAwB;AACvC,gBAAQ,OAAO;AAAA,UACd,WAAW;AAAA,UACX;AAAA,UACA,SAAS;AAAA,YACR;AAAA,cACC,IAAI,OAAO;AACV,sBAAM,UAAU,gBAAgB,IAAI;AACpC,uBAAO;AAAA,kBACN,MAAM,OAAO,OAAO;AAAA,kBACpB,MAAM;AAAA;AAAA;AAAA;AAAA,oBAIL,QAAQ,WAAW;AAAA,sBAClB;AAAA,oBACD;AAAA,kBACD;AAAA,gBACD;AAAA,cACD;AAAA,cACA,WAAW;AAAA,YACZ;AAAA,UACD;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAO;AAAA,MACN,gGACC,MAGC;AACD,YAAI,CAAC,wBAAwB,IAAI,KAAK,IAAI,KAAK,GAAG;AACjD;AAAA,QACD;AAEA,gBAAQ,KAAK,MAAM,MAAM;AAAA,UACxB,KAAK;AACJ;AAAA,cACC,KAAK,MAAM;AAAA,cACX,CAAC,YAAY;AAAA,YACd;AACA;AAAA,UACD,KAAK;AACJ;AAAA,cACC,KAAK,MAAM,WAAW;AAAA,gBACrB,CAAC,aAAa,SAAS;AAAA,cACxB;AAAA,cACA,CAAC,aACA,SAAS;AAAA,YACX;AACA;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM;AAAA,IACL,MAAM;AAAA,MACL,UAAU;AAAA,MACV,aACC;AAAA,MACD,aAAa;AAAA,IACd;AAAA,IACA,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACT,YACC;AAAA,MACD,QAAQ;AAAA,IACT;AAAA,EACD;AACD,CAAC;","names":[]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createRule } from "../createRule.js";
|
|
2
|
+
import { isJSONStringLiteral, isNotNullish } from "../utils/predicates.js";
|
|
3
|
+
const dependencyPropertyNames = /* @__PURE__ */ new Set([
|
|
4
|
+
"bundleDependencies",
|
|
5
|
+
"bundledDependencies",
|
|
6
|
+
"dependencies",
|
|
7
|
+
"devDependencies",
|
|
8
|
+
"optionalDependencies",
|
|
9
|
+
"peerDependencies",
|
|
10
|
+
"overrides"
|
|
11
|
+
]);
|
|
12
|
+
var unique_dependencies_default = createRule({
|
|
13
|
+
create(context) {
|
|
14
|
+
function check(elements, getNodeToRemove) {
|
|
15
|
+
const seen = /* @__PURE__ */ new Set();
|
|
16
|
+
for (const element of elements.filter(isNotNullish).filter(isJSONStringLiteral).reverse()) {
|
|
17
|
+
if (seen.has(element.value)) {
|
|
18
|
+
report(element);
|
|
19
|
+
} else {
|
|
20
|
+
seen.add(element.value);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function report(node) {
|
|
24
|
+
context.report({
|
|
25
|
+
messageId: "overridden",
|
|
26
|
+
node,
|
|
27
|
+
suggest: [
|
|
28
|
+
{
|
|
29
|
+
fix(fixer) {
|
|
30
|
+
const removal = getNodeToRemove(node);
|
|
31
|
+
return [
|
|
32
|
+
fixer.remove(removal),
|
|
33
|
+
fixer.remove(
|
|
34
|
+
// A listing that's overridden can't be last,
|
|
35
|
+
// so we're guaranteed there's a comma after.
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
37
|
+
context.sourceCode.getTokenAfter(
|
|
38
|
+
removal
|
|
39
|
+
)
|
|
40
|
+
)
|
|
41
|
+
];
|
|
42
|
+
},
|
|
43
|
+
messageId: "remove"
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
"Program > JSONExpressionStatement > JSONObjectExpression > JSONProperty[key.type=JSONLiteral]"(node) {
|
|
51
|
+
if (!dependencyPropertyNames.has(node.key.value)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
switch (node.value.type) {
|
|
55
|
+
case "JSONArrayExpression":
|
|
56
|
+
check(
|
|
57
|
+
node.value.elements,
|
|
58
|
+
(element) => element
|
|
59
|
+
);
|
|
60
|
+
break;
|
|
61
|
+
case "JSONObjectExpression":
|
|
62
|
+
check(
|
|
63
|
+
node.value.properties.map(
|
|
64
|
+
(property) => property.key
|
|
65
|
+
),
|
|
66
|
+
(property) => property.parent
|
|
67
|
+
);
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
meta: {
|
|
74
|
+
docs: {
|
|
75
|
+
category: "Best Practices",
|
|
76
|
+
description: "Enforce that if repository directory is specified, it matches the path to the package.json file",
|
|
77
|
+
recommended: true
|
|
78
|
+
},
|
|
79
|
+
hasSuggestions: true,
|
|
80
|
+
messages: {
|
|
81
|
+
overridden: "Package name is overridden by a duplicate listing later on.",
|
|
82
|
+
remove: "Remove this redundant dependency listing."
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
export {
|
|
87
|
+
unique_dependencies_default as default
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=unique-dependencies.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/rules/unique-dependencies.ts"],"sourcesContent":["import type { AST as JsonAST } from \"jsonc-eslint-parser\";\n\nimport * as ESTree from \"estree\";\n\nimport { createRule } from \"../createRule.js\";\nimport { isJSONStringLiteral, isNotNullish } from \"../utils/predicates.js\";\n\nconst dependencyPropertyNames = new Set([\n\t\"bundleDependencies\",\n\t\"bundledDependencies\",\n\t\"dependencies\",\n\t\"devDependencies\",\n\t\"optionalDependencies\",\n\t\"peerDependencies\",\n\t\"overrides\",\n]);\n\nexport default createRule({\n\tcreate(context) {\n\t\tfunction check(\n\t\t\telements: (JsonAST.JSONNode | null)[],\n\t\t\tgetNodeToRemove: (element: JsonAST.JSONNode) => ESTree.Node,\n\t\t) {\n\t\t\tconst seen = new Set();\n\n\t\t\tfor (const element of elements\n\t\t\t\t.filter(isNotNullish)\n\t\t\t\t.filter(isJSONStringLiteral)\n\t\t\t\t.reverse()) {\n\t\t\t\tif (seen.has(element.value)) {\n\t\t\t\t\treport(element);\n\t\t\t\t} else {\n\t\t\t\t\tseen.add(element.value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction report(node: JsonAST.JSONNode) {\n\t\t\t\tcontext.report({\n\t\t\t\t\tmessageId: \"overridden\",\n\t\t\t\t\tnode: node as unknown as ESTree.Node,\n\t\t\t\t\tsuggest: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfix(fixer) {\n\t\t\t\t\t\t\t\tconst removal = getNodeToRemove(node);\n\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\tfixer.remove(removal),\n\t\t\t\t\t\t\t\t\tfixer.remove(\n\t\t\t\t\t\t\t\t\t\t// A listing that's overridden can't be last,\n\t\t\t\t\t\t\t\t\t\t// so we're guaranteed there's a comma after.\n\t\t\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\t\t\t\t\tcontext.sourceCode.getTokenAfter(\n\t\t\t\t\t\t\t\t\t\t\tremoval,\n\t\t\t\t\t\t\t\t\t\t)!,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmessageId: \"remove\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t\"Program > JSONExpressionStatement > JSONObjectExpression > JSONProperty[key.type=JSONLiteral]\"(\n\t\t\t\tnode: JsonAST.JSONProperty & {\n\t\t\t\t\tkey: JsonAST.JSONStringLiteral;\n\t\t\t\t},\n\t\t\t) {\n\t\t\t\tif (!dependencyPropertyNames.has(node.key.value)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tswitch (node.value.type) {\n\t\t\t\t\tcase \"JSONArrayExpression\":\n\t\t\t\t\t\tcheck(\n\t\t\t\t\t\t\tnode.value.elements,\n\t\t\t\t\t\t\t(element) => element as unknown as ESTree.Node,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"JSONObjectExpression\":\n\t\t\t\t\t\tcheck(\n\t\t\t\t\t\t\tnode.value.properties.map(\n\t\t\t\t\t\t\t\t(property) => property.key,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t(property) =>\n\t\t\t\t\t\t\t\tproperty.parent as unknown as ESTree.Node,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t},\n\n\tmeta: {\n\t\tdocs: {\n\t\t\tcategory: \"Best Practices\",\n\t\t\tdescription:\n\t\t\t\t\"Enforce that if repository directory is specified, it matches the path to the package.json file\",\n\t\t\trecommended: true,\n\t\t},\n\t\thasSuggestions: true,\n\t\tmessages: {\n\t\t\toverridden:\n\t\t\t\t\"Package name is overridden by a duplicate listing later on.\",\n\t\t\tremove: \"Remove this redundant dependency listing.\",\n\t\t},\n\t},\n});\n"],"mappings":"AAIA,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB,oBAAoB;AAElD,MAAM,0BAA0B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAED,IAAO,8BAAQ,WAAW;AAAA,EACzB,OAAO,SAAS;AACf,aAAS,MACR,UACA,iBACC;AACD,YAAM,OAAO,oBAAI,IAAI;AAErB,iBAAW,WAAW,SACpB,OAAO,YAAY,EACnB,OAAO,mBAAmB,EAC1B,QAAQ,GAAG;AACZ,YAAI,KAAK,IAAI,QAAQ,KAAK,GAAG;AAC5B,iBAAO,OAAO;AAAA,QACf,OAAO;AACN,eAAK,IAAI,QAAQ,KAAK;AAAA,QACvB;AAAA,MACD;AAEA,eAAS,OAAO,MAAwB;AACvC,gBAAQ,OAAO;AAAA,UACd,WAAW;AAAA,UACX;AAAA,UACA,SAAS;AAAA,YACR;AAAA,cACC,IAAI,OAAO;AACV,sBAAM,UAAU,gBAAgB,IAAI;AACpC,uBAAO;AAAA,kBACN,MAAM,OAAO,OAAO;AAAA,kBACpB,MAAM;AAAA;AAAA;AAAA;AAAA,oBAIL,QAAQ,WAAW;AAAA,sBAClB;AAAA,oBACD;AAAA,kBACD;AAAA,gBACD;AAAA,cACD;AAAA,cACA,WAAW;AAAA,YACZ;AAAA,UACD;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAO;AAAA,MACN,gGACC,MAGC;AACD,YAAI,CAAC,wBAAwB,IAAI,KAAK,IAAI,KAAK,GAAG;AACjD;AAAA,QACD;AAEA,gBAAQ,KAAK,MAAM,MAAM;AAAA,UACxB,KAAK;AACJ;AAAA,cACC,KAAK,MAAM;AAAA,cACX,CAAC,YAAY;AAAA,YACd;AACA;AAAA,UACD,KAAK;AACJ;AAAA,cACC,KAAK,MAAM,WAAW;AAAA,gBACrB,CAAC,aAAa,SAAS;AAAA,cACxB;AAAA,cACA,CAAC,aACA,SAAS;AAAA,YACX;AACA;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM;AAAA,IACL,MAAM;AAAA,MACL,UAAU;AAAA,MACV,aACC;AAAA,MACD,aAAa;AAAA,IACd;AAAA,IACA,gBAAgB;AAAA,IAChB,UAAU;AAAA,MACT,YACC;AAAA,MACD,QAAQ;AAAA,IACT;AAAA,EACD;AACD,CAAC;","names":[]}
|
|
@@ -3,12 +3,13 @@ import { PackageJsonRuleModule } from '../../createRule.mjs';
|
|
|
3
3
|
import 'estree';
|
|
4
4
|
import 'jsonc-eslint-parser';
|
|
5
5
|
|
|
6
|
+
type JsonRuleTesterRun = (name: string, rule: PackageJsonRuleModule, tests: {
|
|
7
|
+
invalid?: RuleTester.InvalidTestCase[] | undefined;
|
|
8
|
+
valid?: (RuleTester.ValidTestCase | string)[] | undefined;
|
|
9
|
+
}) => void;
|
|
6
10
|
type JsonRuleTester = RuleTester & {
|
|
7
|
-
run:
|
|
8
|
-
invalid?: RuleTester.InvalidTestCase[] | undefined;
|
|
9
|
-
valid?: (RuleTester.ValidTestCase | string)[] | undefined;
|
|
10
|
-
}) => void;
|
|
11
|
+
run: JsonRuleTesterRun;
|
|
11
12
|
};
|
|
12
13
|
declare const ruleTester: JsonRuleTester;
|
|
13
14
|
|
|
14
|
-
export { type JsonRuleTester, ruleTester };
|
|
15
|
+
export { type JsonRuleTester, type JsonRuleTesterRun, ruleTester };
|
|
@@ -3,12 +3,13 @@ import { PackageJsonRuleModule } from '../../createRule.js';
|
|
|
3
3
|
import 'estree';
|
|
4
4
|
import 'jsonc-eslint-parser';
|
|
5
5
|
|
|
6
|
+
type JsonRuleTesterRun = (name: string, rule: PackageJsonRuleModule, tests: {
|
|
7
|
+
invalid?: RuleTester.InvalidTestCase[] | undefined;
|
|
8
|
+
valid?: (RuleTester.ValidTestCase | string)[] | undefined;
|
|
9
|
+
}) => void;
|
|
6
10
|
type JsonRuleTester = RuleTester & {
|
|
7
|
-
run:
|
|
8
|
-
invalid?: RuleTester.InvalidTestCase[] | undefined;
|
|
9
|
-
valid?: (RuleTester.ValidTestCase | string)[] | undefined;
|
|
10
|
-
}) => void;
|
|
11
|
+
run: JsonRuleTesterRun;
|
|
11
12
|
};
|
|
12
13
|
declare const ruleTester: JsonRuleTester;
|
|
13
14
|
|
|
14
|
-
export { type JsonRuleTester, ruleTester };
|
|
15
|
+
export { type JsonRuleTester, type JsonRuleTesterRun, ruleTester };
|
|
@@ -35,6 +35,19 @@ var import_eslint = require("eslint");
|
|
|
35
35
|
const ruleTester = new import_eslint.RuleTester({
|
|
36
36
|
parser: require.resolve("jsonc-eslint-parser")
|
|
37
37
|
});
|
|
38
|
+
const originalRun = ruleTester.run;
|
|
39
|
+
ruleTester.run = (name, rule, tests) => {
|
|
40
|
+
originalRun.call(ruleTester, name, rule, {
|
|
41
|
+
invalid: tests.invalid?.map((test) => ({
|
|
42
|
+
filename: "package.json",
|
|
43
|
+
...test
|
|
44
|
+
})),
|
|
45
|
+
valid: tests.valid?.map((test) => ({
|
|
46
|
+
filename: "package.json",
|
|
47
|
+
...typeof test === "string" ? { code: test } : { ...test }
|
|
48
|
+
}))
|
|
49
|
+
});
|
|
50
|
+
};
|
|
38
51
|
// Annotate the CommonJS export names for ESM import in node:
|
|
39
52
|
0 && (module.exports = {
|
|
40
53
|
ruleTester
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/tests/rules/ruleTester.ts"],"sourcesContent":["import { RuleTester } from \"eslint\";\n\nimport type { PackageJsonRuleModule } from \"../../createRule.js\";\n\nexport type
|
|
1
|
+
{"version":3,"sources":["../../../src/tests/rules/ruleTester.ts"],"sourcesContent":["import { RuleTester } from \"eslint\";\n\nimport type { PackageJsonRuleModule } from \"../../createRule.js\";\n\nexport type JsonRuleTesterRun = (\n\tname: string,\n\trule: PackageJsonRuleModule,\n\ttests: {\n\t\tinvalid?: RuleTester.InvalidTestCase[] | undefined;\n\t\tvalid?: (RuleTester.ValidTestCase | string)[] | undefined;\n\t},\n) => void;\n\nexport type JsonRuleTester = RuleTester & {\n\trun: JsonRuleTesterRun;\n};\n\nexport const ruleTester = new RuleTester({\n\tparser: require.resolve(\"jsonc-eslint-parser\"),\n}) as JsonRuleTester;\n\nconst originalRun = ruleTester.run;\n\nruleTester.run = (name, rule, tests) => {\n\toriginalRun.call(ruleTester, name, rule as PackageJsonRuleModule, {\n\t\tinvalid: tests.invalid?.map((test) => ({\n\t\t\tfilename: \"package.json\",\n\t\t\t...test,\n\t\t})),\n\t\tvalid: tests.valid?.map((test) => ({\n\t\t\tfilename: \"package.json\",\n\t\t\t...(typeof test === \"string\" ? { code: test } : { ...test }),\n\t\t})),\n\t});\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA2B;AAiBpB,MAAM,aAAa,IAAI,yBAAW;AAAA,EACxC,QAAQ,gBAAgB,qBAAqB;AAC9C,CAAC;AAED,MAAM,cAAc,WAAW;AAE/B,WAAW,MAAM,CAAC,MAAM,MAAM,UAAU;AACvC,cAAY,KAAK,YAAY,MAAM,MAA+B;AAAA,IACjE,SAAS,MAAM,SAAS,IAAI,CAAC,UAAU;AAAA,MACtC,UAAU;AAAA,MACV,GAAG;AAAA,IACJ,EAAE;AAAA,IACF,OAAO,MAAM,OAAO,IAAI,CAAC,UAAU;AAAA,MAClC,UAAU;AAAA,MACV,GAAI,OAAO,SAAS,WAAW,EAAE,MAAM,KAAK,IAAI,EAAE,GAAG,KAAK;AAAA,IAC3D,EAAE;AAAA,EACH,CAAC;AACF;","names":[]}
|
|
@@ -2,6 +2,19 @@ import { RuleTester } from "eslint";
|
|
|
2
2
|
const ruleTester = new RuleTester({
|
|
3
3
|
parser: require.resolve("jsonc-eslint-parser")
|
|
4
4
|
});
|
|
5
|
+
const originalRun = ruleTester.run;
|
|
6
|
+
ruleTester.run = (name, rule, tests) => {
|
|
7
|
+
originalRun.call(ruleTester, name, rule, {
|
|
8
|
+
invalid: tests.invalid?.map((test) => ({
|
|
9
|
+
filename: "package.json",
|
|
10
|
+
...test
|
|
11
|
+
})),
|
|
12
|
+
valid: tests.valid?.map((test) => ({
|
|
13
|
+
filename: "package.json",
|
|
14
|
+
...typeof test === "string" ? { code: test } : { ...test }
|
|
15
|
+
}))
|
|
16
|
+
});
|
|
17
|
+
};
|
|
5
18
|
export {
|
|
6
19
|
ruleTester
|
|
7
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/tests/rules/ruleTester.ts"],"sourcesContent":["import { RuleTester } from \"eslint\";\n\nimport type { PackageJsonRuleModule } from \"../../createRule.js\";\n\nexport type
|
|
1
|
+
{"version":3,"sources":["../../../src/tests/rules/ruleTester.ts"],"sourcesContent":["import { RuleTester } from \"eslint\";\n\nimport type { PackageJsonRuleModule } from \"../../createRule.js\";\n\nexport type JsonRuleTesterRun = (\n\tname: string,\n\trule: PackageJsonRuleModule,\n\ttests: {\n\t\tinvalid?: RuleTester.InvalidTestCase[] | undefined;\n\t\tvalid?: (RuleTester.ValidTestCase | string)[] | undefined;\n\t},\n) => void;\n\nexport type JsonRuleTester = RuleTester & {\n\trun: JsonRuleTesterRun;\n};\n\nexport const ruleTester = new RuleTester({\n\tparser: require.resolve(\"jsonc-eslint-parser\"),\n}) as JsonRuleTester;\n\nconst originalRun = ruleTester.run;\n\nruleTester.run = (name, rule, tests) => {\n\toriginalRun.call(ruleTester, name, rule as PackageJsonRuleModule, {\n\t\tinvalid: tests.invalid?.map((test) => ({\n\t\t\tfilename: \"package.json\",\n\t\t\t...test,\n\t\t})),\n\t\tvalid: tests.valid?.map((test) => ({\n\t\t\tfilename: \"package.json\",\n\t\t\t...(typeof test === \"string\" ? { code: test } : { ...test }),\n\t\t})),\n\t});\n};\n"],"mappings":"AAAA,SAAS,kBAAkB;AAiBpB,MAAM,aAAa,IAAI,WAAW;AAAA,EACxC,QAAQ,gBAAgB,qBAAqB;AAC9C,CAAC;AAED,MAAM,cAAc,WAAW;AAE/B,WAAW,MAAM,CAAC,MAAM,MAAM,UAAU;AACvC,cAAY,KAAK,YAAY,MAAM,MAA+B;AAAA,IACjE,SAAS,MAAM,SAAS,IAAI,CAAC,UAAU;AAAA,MACtC,UAAU;AAAA,MACV,GAAG;AAAA,IACJ,EAAE;AAAA,IACF,OAAO,MAAM,OAAO,IAAI,CAAC,UAAU;AAAA,MAClC,UAAU;AAAA,MACV,GAAI,OAAO,SAAS,WAAW,EAAE,MAAM,KAAK,IAAI,EAAE,GAAG,KAAK;AAAA,IAC3D,EAAE;AAAA,EACH,CAAC;AACF;","names":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { AST } from 'jsonc-eslint-parser';
|
|
2
|
+
|
|
3
|
+
declare function isNotNullish<T extends NonNullable<unknown>>(value: T | null | undefined): value is T;
|
|
4
|
+
declare function isJSONStringLiteral(node: AST.JSONNode): node is AST.JSONStringLiteral;
|
|
5
|
+
|
|
6
|
+
export { isJSONStringLiteral, isNotNullish };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { AST } from 'jsonc-eslint-parser';
|
|
2
|
+
|
|
3
|
+
declare function isNotNullish<T extends NonNullable<unknown>>(value: T | null | undefined): value is T;
|
|
4
|
+
declare function isJSONStringLiteral(node: AST.JSONNode): node is AST.JSONStringLiteral;
|
|
5
|
+
|
|
6
|
+
export { isJSONStringLiteral, isNotNullish };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var predicates_exports = {};
|
|
20
|
+
__export(predicates_exports, {
|
|
21
|
+
isJSONStringLiteral: () => isJSONStringLiteral,
|
|
22
|
+
isNotNullish: () => isNotNullish
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(predicates_exports);
|
|
25
|
+
function isNotNullish(value) {
|
|
26
|
+
return value !== null && value !== void 0;
|
|
27
|
+
}
|
|
28
|
+
function isJSONStringLiteral(node) {
|
|
29
|
+
return node.type === "JSONLiteral" && typeof node.value === "string";
|
|
30
|
+
}
|
|
31
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
32
|
+
0 && (module.exports = {
|
|
33
|
+
isJSONStringLiteral,
|
|
34
|
+
isNotNullish
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=predicates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/predicates.ts"],"sourcesContent":["import type { AST as JsonAST } from \"jsonc-eslint-parser\";\n\nexport function isNotNullish<T extends NonNullable<unknown>>(\n\tvalue: T | null | undefined,\n): value is T {\n\treturn value !== null && value !== undefined;\n}\n\nexport function isJSONStringLiteral(\n\tnode: JsonAST.JSONNode,\n): node is JsonAST.JSONStringLiteral {\n\treturn node.type === \"JSONLiteral\" && typeof node.value === \"string\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,aACf,OACa;AACb,SAAO,UAAU,QAAQ,UAAU;AACpC;AAEO,SAAS,oBACf,MACoC;AACpC,SAAO,KAAK,SAAS,iBAAiB,OAAO,KAAK,UAAU;AAC7D;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
function isNotNullish(value) {
|
|
2
|
+
return value !== null && value !== void 0;
|
|
3
|
+
}
|
|
4
|
+
function isJSONStringLiteral(node) {
|
|
5
|
+
return node.type === "JSONLiteral" && typeof node.value === "string";
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
isJSONStringLiteral,
|
|
9
|
+
isNotNullish
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=predicates.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/predicates.ts"],"sourcesContent":["import type { AST as JsonAST } from \"jsonc-eslint-parser\";\n\nexport function isNotNullish<T extends NonNullable<unknown>>(\n\tvalue: T | null | undefined,\n): value is T {\n\treturn value !== null && value !== undefined;\n}\n\nexport function isJSONStringLiteral(\n\tnode: JsonAST.JSONNode,\n): node is JsonAST.JSONStringLiteral {\n\treturn node.type === \"JSONLiteral\" && typeof node.value === \"string\";\n}\n"],"mappings":"AAEO,SAAS,aACf,OACa;AACb,SAAO,UAAU,QAAQ,UAAU;AACpC;AAEO,SAAS,oBACf,MACoC;AACpC,SAAO,KAAK,SAAS,iBAAiB,OAAO,KAAK,UAAU;AAC7D;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-package-json",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
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": {
|