eslint-plugin-package-json 0.3.0 → 0.3.2

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.
Files changed (67) hide show
  1. package/.github/actions/prepare/action.yml +12 -0
  2. package/.github/workflows/format.yml +15 -0
  3. package/.github/workflows/lint-eslint-docs.yml +16 -0
  4. package/.github/workflows/lint.yml +15 -0
  5. package/.github/workflows/test.yml +1 -4
  6. package/.github/workflows/tsc.yml +15 -0
  7. package/.vscode/extensions.json +3 -0
  8. package/.vscode/launch.json +14 -15
  9. package/.vscode/settings.json +4 -0
  10. package/README.md +19 -7
  11. package/docs/rules/order-properties.md +5 -1
  12. package/docs/rules/sort-collections.md +5 -1
  13. package/docs/rules/valid-local-dependency.md +3 -5
  14. package/docs/rules/valid-package-def.md +3 -5
  15. package/lib/createRule.d.ts +30 -0
  16. package/lib/createRule.d.ts.map +1 -0
  17. package/lib/createRule.js +5 -6
  18. package/lib/index.d.ts +41 -0
  19. package/lib/index.d.ts.map +1 -0
  20. package/lib/index.js +19 -17
  21. package/lib/rules/order-properties.d.ts +6 -0
  22. package/lib/rules/order-properties.d.ts.map +1 -0
  23. package/lib/rules/order-properties.js +31 -35
  24. package/lib/rules/sort-collections.d.ts +6 -0
  25. package/lib/rules/sort-collections.d.ts.map +1 -0
  26. package/lib/rules/sort-collections.js +22 -42
  27. package/lib/rules/valid-local-dependency.d.ts +6 -0
  28. package/lib/rules/valid-local-dependency.d.ts.map +1 -0
  29. package/lib/rules/valid-local-dependency.js +29 -48
  30. package/lib/rules/valid-package-def.d.ts +6 -0
  31. package/lib/rules/valid-package-def.d.ts.map +1 -0
  32. package/lib/rules/valid-package-def.js +13 -28
  33. package/lib/tests/rules/order-properties.test.d.ts +2 -0
  34. package/lib/tests/rules/order-properties.test.d.ts.map +1 -0
  35. package/lib/tests/rules/order-properties.test.js +223 -0
  36. package/lib/tests/rules/ruleTester.d.ts +10 -0
  37. package/lib/tests/rules/ruleTester.d.ts.map +1 -0
  38. package/lib/tests/rules/ruleTester.js +7 -0
  39. package/lib/tests/rules/sort-collections.test.d.ts +2 -0
  40. package/lib/tests/rules/sort-collections.test.d.ts.map +1 -0
  41. package/lib/tests/rules/sort-collections.test.js +64 -0
  42. package/lib/tests/rules/valid-local-dependency.test.d.ts +2 -0
  43. package/lib/tests/rules/valid-local-dependency.test.d.ts.map +1 -0
  44. package/lib/tests/rules/valid-local-dependency.test.js +232 -0
  45. package/lib/tests/rules/valid-package-def.test.d.ts +2 -0
  46. package/lib/tests/rules/valid-package-def.test.d.ts.map +1 -0
  47. package/lib/tests/rules/valid-package-def.test.js +65 -0
  48. package/package.json +17 -16
  49. package/src/createRule.ts +49 -0
  50. package/src/index.ts +17 -0
  51. package/src/rules/order-properties.ts +122 -0
  52. package/src/rules/sort-collections.ts +96 -0
  53. package/src/rules/valid-local-dependency.ts +73 -0
  54. package/src/rules/valid-package-def.ts +45 -0
  55. package/src/tests/globalSetup.js +7 -0
  56. package/{tests/lib/rules/order-properties.js → src/tests/rules/order-properties.test.ts} +5 -16
  57. package/src/tests/rules/ruleTester.ts +17 -0
  58. package/{tests/lib/rules/sort-collections.js → src/tests/rules/sort-collections.test.ts} +2 -8
  59. package/{tests/lib/rules/valid-local-dependency.js → src/tests/rules/valid-local-dependency.test.ts} +33 -45
  60. package/{tests/lib/rules/valid-package-def.js → src/tests/rules/valid-package-def.test.ts} +2 -12
  61. package/tsconfig.json +13 -0
  62. package/vitest.config.ts +15 -0
  63. package/tests/lib/rules/ruleTester.js +0 -7
  64. /package/{tests/lib → src/tests}/__fixtures__/invalid-top-level-property-order/package.json +0 -0
  65. /package/{tests/lib → src/tests}/__fixtures__/unalphabetized-collections/package.json +0 -0
  66. /package/{tests/lib → src/tests}/__fixtures__/valid-local-dependency/gotcha/package.json/gotcha/package.json +0 -0
  67. /package/{tests/lib → src/tests}/__fixtures__/valid-local-dependency/package.json +0 -0
@@ -1,75 +1,56 @@
1
- /**
2
- * @fileoverview Checks existence of local dependencies in the package.json
3
- * @author Kendall Gassner
4
- */
5
- 'use strict';
6
- const path = require('path');
7
- const { createRule } = require('../createRule');
8
-
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = __importDefault(require("path"));
7
+ const createRule_js_1 = require("../createRule.js");
9
8
  //------------------------------------------------------------------------------
10
9
  // Rule Definition
11
10
  //------------------------------------------------------------------------------
12
-
13
- module.exports = createRule({
11
+ exports.default = (0, createRule_js_1.createRule)({
14
12
  meta: {
15
13
  docs: {
16
- description:
17
- 'Checks existence of local dependencies in the package.json',
14
+ description: 'Checks existence of local dependencies in the package.json',
18
15
  category: 'Best Practices',
19
16
  recommended: true
20
17
  }
21
18
  },
22
-
23
- create: function(context) {
19
+ create: function (context) {
24
20
  return {
25
21
  'Program:exit'() {
26
22
  const original = JSON.parse(context.sourceCode.text);
27
- const {
28
- dependencies,
29
- peerDependencies,
30
- devDependencies
31
- } = original;
32
-
23
+ const { dependencies, peerDependencies, devDependencies } = original;
33
24
  const depObjs = [
34
25
  Object.entries(dependencies || {}),
35
26
  Object.entries(peerDependencies || {}),
36
27
  Object.entries(devDependencies || {})
37
28
  ];
38
-
39
- depObjs.forEach(obj =>
40
- obj.forEach(([key, value]) => {
41
- const response = localPath => {
42
- const filePath = path.join(
43
- context
44
- .getFilename()
45
- .replace(/package\.json/g, '/'),
46
- value.replace(new RegExp(localPath, 'g'), ''),
47
- '/package.json'
48
- );
49
-
50
- try {
51
- if (!require.resolve(filePath)) {
52
- context.report({
53
- node: context.sourceCode.ast,
54
- message: `The package ${key} does not exist given the specified path: ${value}.`
55
- });
56
- }
57
- } catch (e) {
29
+ depObjs.forEach(obj => obj.forEach(([key, value]) => {
30
+ const response = (localPath) => {
31
+ const filePath = path_1.default.join(context.filename.replace(/package\.json/g, '/'), value.replace(new RegExp(localPath, 'g'), ''), '/package.json');
32
+ try {
33
+ if (!require.resolve(filePath)) {
58
34
  context.report({
59
35
  node: context.sourceCode.ast,
60
36
  message: `The package ${key} does not exist given the specified path: ${value}.`
61
37
  });
62
38
  }
63
- };
64
-
65
- if (value.startsWith('link:')) {
66
- response('link:');
67
39
  }
68
- if (value.startsWith('file:')) {
69
- response('file:');
40
+ catch (e) {
41
+ context.report({
42
+ node: context.sourceCode.ast,
43
+ message: `The package ${key} does not exist given the specified path: ${value}.`
44
+ });
70
45
  }
71
- })
72
- );
46
+ };
47
+ if (value.startsWith('link:')) {
48
+ response('link:');
49
+ }
50
+ if (value.startsWith('file:')) {
51
+ response('file:');
52
+ }
53
+ }));
73
54
  }
74
55
  };
75
56
  }
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ create(context: import("../createRule.js").PackageJsonRuleContext): import("jsonc-eslint-parser").RuleListener;
3
+ meta: import("eslint").Rule.RuleMetaData;
4
+ };
5
+ export default _default;
6
+ //# sourceMappingURL=valid-package-def.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-package-def.d.ts","sourceRoot":"","sources":["../../src/rules/valid-package-def.ts"],"names":[],"mappings":";;;;AAgBA,wBA4BG"}
@@ -1,11 +1,7 @@
1
1
  'use strict';
2
- const { PJV: PackageValidator } = require('package-json-validator');
3
- const { createRule } = require('../createRule');
4
-
5
- //------------------------------------------------------------------------------
6
- // Rule Definition
7
- //------------------------------------------------------------------------------
8
-
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const package_json_validator_1 = require("package-json-validator");
4
+ const createRule_js_1 = require("../createRule.js");
9
5
  // package-json-validator does not correctly recognize shorthand for repositories and alternate dependency statements, so we discard those values.
10
6
  // it also enforces a stricter code for NPM than is really appropriate,
11
7
  // so we disable some other errors here.
@@ -14,35 +10,24 @@ const unusedErrorPatterns = [
14
10
  /^Invalid version range for .+?: file:/i,
15
11
  /^author field should have name/i
16
12
  ];
17
-
18
- const isUsableError = errorText =>
19
- unusedErrorPatterns.every(pattern => !pattern.test(errorText));
20
-
21
- module.exports = createRule({
13
+ const isUsableError = (errorText) => unusedErrorPatterns.every(pattern => !pattern.test(errorText));
14
+ exports.default = (0, createRule_js_1.createRule)({
22
15
  meta: {
23
16
  docs: {
24
- description:
25
- 'Enforce that package.json has all properties required by NPM spec',
17
+ description: 'Enforce that package.json has all properties required by NPM spec',
26
18
  category: 'Best Practices',
27
19
  recommended: true
28
20
  }
29
21
  },
30
-
31
- create: function(context) {
22
+ create: function (context) {
32
23
  return {
33
24
  'Program:exit'() {
34
- const { errors } = PackageValidator.validate(
35
- context.sourceCode.text
36
- );
37
-
38
- (errors || []).filter(isUsableError).forEach(
39
- message =>
40
- message &&
41
- context.report({
42
- node: context.sourceCode.ast,
43
- message
44
- })
45
- );
25
+ const validation = package_json_validator_1.PJV.validate(context.sourceCode.text);
26
+ validation.errors?.filter(isUsableError).forEach(message => message &&
27
+ context.report({
28
+ node: context.sourceCode.ast,
29
+ message
30
+ }));
46
31
  }
47
32
  };
48
33
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=order-properties.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-properties.test.d.ts","sourceRoot":"","sources":["../../../src/tests/rules/order-properties.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const order_properties_1 = __importDefault(require("../../rules/order-properties"));
7
+ const ruleTester_1 = require("./ruleTester");
8
+ ruleTester_1.ruleTester.run('order-properties', order_properties_1.default, {
9
+ invalid: [
10
+ {
11
+ code: `{
12
+ "name": "invalid-top-level-property-order",
13
+ "scripts": {
14
+ "test": "tape"
15
+ },
16
+ "version": "1.0.0",
17
+ "description": "npm made me this way",
18
+ "main": "index.js",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/fake/github.git"
22
+ }
23
+ }
24
+ `,
25
+ errors: [
26
+ {
27
+ message: 'Package top-level properties are not ordered in the npm standard way. Run the ESLint auto-fixer to correct.'
28
+ }
29
+ ],
30
+ filename: 'package.json',
31
+ output: `{
32
+ "name": "invalid-top-level-property-order",
33
+ "version": "1.0.0",
34
+ "description": "npm made me this way",
35
+ "main": "index.js",
36
+ "scripts": {
37
+ "test": "tape"
38
+ },
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git+https://github.com/fake/github.git"
42
+ }
43
+ }
44
+ `
45
+ },
46
+ {
47
+ code: `{
48
+ "name": "invalid-top-level-property-order",
49
+ "scripts": {
50
+ "test": "tape"
51
+ },
52
+ "version": "1.0.0",
53
+ "description": "npm made me this way",
54
+ "main": "index.js",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/fake/github.git"
58
+ }
59
+ }
60
+ `,
61
+ errors: [
62
+ {
63
+ message: 'Package top-level properties are not ordered in the npm standard way. Run the ESLint auto-fixer to correct.'
64
+ }
65
+ ],
66
+ filename: 'package.json',
67
+ options: [{ order: 'legacy' }],
68
+ output: `{
69
+ "name": "invalid-top-level-property-order",
70
+ "version": "1.0.0",
71
+ "description": "npm made me this way",
72
+ "main": "index.js",
73
+ "scripts": {
74
+ "test": "tape"
75
+ },
76
+ "repository": {
77
+ "type": "git",
78
+ "url": "git+https://github.com/fake/github.git"
79
+ }
80
+ }
81
+ `
82
+ },
83
+ {
84
+ code: `{
85
+ "name": "invalid-top-level-property-order",
86
+ "scripts": {
87
+ "test": "tape"
88
+ },
89
+ "version": "1.0.0",
90
+ "description": "npm made me this way",
91
+ "main": "index.js",
92
+ "repository": {
93
+ "type": "git",
94
+ "url": "git+https://github.com/fake/github.git"
95
+ }
96
+ }
97
+ `,
98
+ errors: [
99
+ {
100
+ message: 'Package top-level properties are not ordered in the npm standard way. Run the ESLint auto-fixer to correct.'
101
+ }
102
+ ],
103
+ filename: 'package.json',
104
+ options: [{ order: 'sort-package-json' }],
105
+ output: `{
106
+ "name": "invalid-top-level-property-order",
107
+ "version": "1.0.0",
108
+ "description": "npm made me this way",
109
+ "repository": {
110
+ "type": "git",
111
+ "url": "git+https://github.com/fake/github.git"
112
+ },
113
+ "main": "index.js",
114
+ "scripts": {
115
+ "test": "tape"
116
+ }
117
+ }
118
+ `
119
+ },
120
+ {
121
+ code: `{
122
+ "name": "invalid-top-level-property-order",
123
+ "scripts": {
124
+ "test": "tape"
125
+ },
126
+ "version": "1.0.0",
127
+ "description": "npm made me this way",
128
+ "main": "index.js",
129
+ "repository": {
130
+ "type": "git",
131
+ "url": "git+https://github.com/fake/github.git"
132
+ }
133
+ }
134
+ `,
135
+ errors: [
136
+ {
137
+ message: 'Package top-level properties are not ordered in the npm standard way. Run the ESLint auto-fixer to correct.'
138
+ }
139
+ ],
140
+ filename: 'package.json',
141
+ options: [{ order: ['version', 'name', 'repository'] }],
142
+ output: `{
143
+ "version": "1.0.0",
144
+ "name": "invalid-top-level-property-order",
145
+ "repository": {
146
+ "type": "git",
147
+ "url": "git+https://github.com/fake/github.git"
148
+ },
149
+ "description": "npm made me this way",
150
+ "main": "index.js",
151
+ "scripts": {
152
+ "test": "tape"
153
+ }
154
+ }
155
+ `
156
+ }
157
+ ],
158
+ valid: [
159
+ `{
160
+ "name": "treat-yo-self",
161
+ "version": "1.1.1",
162
+ "description": "Once a year.",
163
+ "keywords": [
164
+ "modern",
165
+ "master"
166
+ ]
167
+ }`,
168
+ `{
169
+ "name": "treat-yo-self",
170
+ "version": "0.1.0",
171
+ "private": true,
172
+ "description": "Once a year.",
173
+ "keywords": [
174
+ "modern",
175
+ "master"
176
+ ]
177
+ }
178
+ `,
179
+ {
180
+ code: `{
181
+ "version": "1.1.1",
182
+ "name": "treat-yo-self",
183
+ "description": "Once a year.",
184
+ "keywords": [
185
+ "modern",
186
+ "master"
187
+ ]
188
+ }
189
+ `,
190
+ options: [{ order: ['version', 'name'] }]
191
+ },
192
+ {
193
+ code: `{
194
+ "name": "treat-yo-self",
195
+ "version": "1.1.1",
196
+ "description": "Once a year.",
197
+ "keywords": [
198
+ "modern",
199
+ "master"
200
+ ],
201
+ "exports": {
202
+ "import": "./index.js",
203
+ "require": "./index.js"
204
+ },
205
+ "main": "index.js"
206
+ }`,
207
+ options: [{ order: 'sort-package-json' }]
208
+ },
209
+ {
210
+ code: `{
211
+ "name": "treat-yo-self",
212
+ "version": "1.1.1",
213
+ "description": "Once a year.",
214
+ "main": "index.js",
215
+ "exports": {
216
+ "import": "./index.js",
217
+ "require": "./index.js"
218
+ }
219
+ }`,
220
+ options: [{ order: 'legacy' }]
221
+ }
222
+ ]
223
+ });
@@ -0,0 +1,10 @@
1
+ import { RuleTester } from 'eslint';
2
+ import { PackageJsonRuleModule } from '../../createRule';
3
+ export type JsonRuleTester = RuleTester & {
4
+ run: (name: string, rule: PackageJsonRuleModule, tests: {
5
+ valid?: Array<string | RuleTester.ValidTestCase> | undefined;
6
+ invalid?: RuleTester.InvalidTestCase[] | undefined;
7
+ }) => void;
8
+ };
9
+ export declare const ruleTester: JsonRuleTester;
10
+ //# sourceMappingURL=ruleTester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleTester.d.ts","sourceRoot":"","sources":["../../../src/tests/rules/ruleTester.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG;IACtC,GAAG,EAAE,CACD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,qBAAqB,EAC3B,KAAK,EAAE;QACH,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;QAC7D,OAAO,CAAC,EAAE,UAAU,CAAC,eAAe,EAAE,GAAG,SAAS,CAAC;KACtD,KACA,IAAI,CAAC;CACb,CAAC;AAEF,eAAO,MAAM,UAAU,gBAEH,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ruleTester = void 0;
4
+ const eslint_1 = require("eslint");
5
+ exports.ruleTester = new eslint_1.RuleTester({
6
+ parser: require.resolve('jsonc-eslint-parser')
7
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sort-collections.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort-collections.test.d.ts","sourceRoot":"","sources":["../../../src/tests/rules/sort-collections.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const sort_collections_1 = __importDefault(require("../../rules/sort-collections"));
7
+ const ruleTester_js_1 = require("./ruleTester.js");
8
+ //------------------------------------------------------------------------------
9
+ // Tests
10
+ //------------------------------------------------------------------------------
11
+ ruleTester_js_1.ruleTester.run('sort-collections', sort_collections_1.default, {
12
+ valid: [
13
+ {
14
+ code: `{
15
+ "scripts": {
16
+ "build": "webpack",
17
+ "watch": "webpack-dev-server"
18
+ }
19
+ }`,
20
+ filename: 'package.json'
21
+ },
22
+ // ignore if custom include rule
23
+ {
24
+ code: `{
25
+ "scripts": {
26
+ "build": "webpack",
27
+ "watch": "webpack-dev-server"
28
+ }
29
+ }`,
30
+ filename: 'package.json',
31
+ options: [['devDependencies']]
32
+ },
33
+ {
34
+ code: `{
35
+ "scripts": { "watch": "out of order...", "build": "but okay" }
36
+ }`,
37
+ filename: 'not-a-package.json',
38
+ options: [['devDependencies']]
39
+ }
40
+ ],
41
+ invalid: [
42
+ {
43
+ code: `{
44
+ "scripts": {
45
+ "watch": "webpack-dev-server",
46
+ "build": "webpack"
47
+ }
48
+ }`,
49
+ filename: 'package.json',
50
+ errors: [
51
+ {
52
+ message: 'Package scripts are not alphabetized',
53
+ type: 'JSONProperty'
54
+ }
55
+ ],
56
+ output: `{
57
+ "scripts": {
58
+ "build": "webpack",
59
+ "watch": "webpack-dev-server"
60
+ }
61
+ }`
62
+ }
63
+ ]
64
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=valid-local-dependency.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-local-dependency.test.d.ts","sourceRoot":"","sources":["../../../src/tests/rules/valid-local-dependency.test.ts"],"names":[],"mappings":""}