eslint-plugin-package-json 0.2.0 → 0.3.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/.eslintrc +1 -1
- package/README.md +29 -30
- package/lib/createRule.js +17 -0
- package/lib/index.js +13 -28
- package/lib/rules/order-properties.js +31 -41
- package/lib/rules/sort-collections.js +7 -9
- package/lib/rules/valid-local-dependency.js +8 -17
- package/lib/rules/valid-package-def.js +15 -27
- package/package.json +51 -51
- package/tests/lib/rules/order-properties.js +209 -209
- package/tests/lib/rules/ruleTester.js +7 -0
- package/tests/lib/rules/sort-collections.js +12 -13
- package/tests/lib/rules/valid-local-dependency.js +19 -20
- package/tests/lib/rules/valid-package-def.js +5 -6
- package/lib/processors/PackageJsonProcessor.js +0 -63
- package/tests/lib/index.js +0 -157
- package/tests/lib/processors/PackageJsonProcessor.js +0 -159
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
//------------------------------------------------------------------------------
|
|
10
10
|
const path = require('path');
|
|
11
11
|
var rule = require('../../../lib/rules/valid-local-dependency'),
|
|
12
|
-
|
|
12
|
+
{ ruleTester } = require('./ruleTester');
|
|
13
13
|
|
|
14
14
|
//------------------------------------------------------------------------------
|
|
15
15
|
// Tests
|
|
@@ -19,11 +19,10 @@ const fileName = partialPath => {
|
|
|
19
19
|
return path.join(process.cwd(), partialPath);
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
-
var ruleTester = new RuleTester();
|
|
23
22
|
ruleTester.run('valid-local-dependency', rule, {
|
|
24
23
|
valid: [
|
|
25
24
|
{
|
|
26
|
-
code: `
|
|
25
|
+
code: `{
|
|
27
26
|
"dependencies": {
|
|
28
27
|
"some-package": "link:./tests/lib/__fixtures__/valid-local-dependency",
|
|
29
28
|
"some-other-package": "some-other-package"
|
|
@@ -32,7 +31,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
32
31
|
filename: fileName('package.json')
|
|
33
32
|
},
|
|
34
33
|
{
|
|
35
|
-
code: `
|
|
34
|
+
code: `{
|
|
36
35
|
"peerDependencies": {
|
|
37
36
|
"some-package": "link:./tests/lib/__fixtures__/valid-local-dependency",
|
|
38
37
|
"some-other-package": "some-other-package"
|
|
@@ -41,7 +40,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
41
40
|
filename: fileName('package.json')
|
|
42
41
|
},
|
|
43
42
|
{
|
|
44
|
-
code: `
|
|
43
|
+
code: `{
|
|
45
44
|
"devDependencies": {
|
|
46
45
|
"some-package": "link:./tests/lib/__fixtures__/valid-local-dependency",
|
|
47
46
|
"some-other-package": "some-other-package"
|
|
@@ -50,7 +49,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
50
49
|
filename: fileName('package.json')
|
|
51
50
|
},
|
|
52
51
|
{
|
|
53
|
-
code: `
|
|
52
|
+
code: `{
|
|
54
53
|
"name": "pandages",
|
|
55
54
|
"version": "1.0.0",
|
|
56
55
|
"description": "",
|
|
@@ -62,7 +61,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
62
61
|
filename: fileName('package.json')
|
|
63
62
|
},
|
|
64
63
|
{
|
|
65
|
-
code: `
|
|
64
|
+
code: `{
|
|
66
65
|
"dependencies": {
|
|
67
66
|
"some-other-package": "some-other-package"
|
|
68
67
|
}
|
|
@@ -70,7 +69,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
70
69
|
filename: fileName('package.json')
|
|
71
70
|
},
|
|
72
71
|
{
|
|
73
|
-
code: `
|
|
72
|
+
code: `{
|
|
74
73
|
"dependencies": {
|
|
75
74
|
"some-package": "link:./tests/lib/__fixtures__/Valid-local-dependency",
|
|
76
75
|
}
|
|
@@ -78,7 +77,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
78
77
|
filename: fileName('not-package.json')
|
|
79
78
|
},
|
|
80
79
|
{
|
|
81
|
-
code: `
|
|
80
|
+
code: `{
|
|
82
81
|
"dependencies": {
|
|
83
82
|
"some-package": "link:../valid-local-dependency"
|
|
84
83
|
}
|
|
@@ -88,7 +87,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
88
87
|
)
|
|
89
88
|
},
|
|
90
89
|
{
|
|
91
|
-
code: `
|
|
90
|
+
code: `{
|
|
92
91
|
"dependencies": {
|
|
93
92
|
"some-package": "file:./tests/lib/__fixtures__/valid-local-dependency",
|
|
94
93
|
"some-other-package": "some-other-package"
|
|
@@ -97,7 +96,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
97
96
|
filename: fileName('package.json')
|
|
98
97
|
},
|
|
99
98
|
{
|
|
100
|
-
code: `
|
|
99
|
+
code: `{
|
|
101
100
|
"dependencies": {
|
|
102
101
|
"some-package": "file:./tests/lib/__fixtures__/valid-local-dependency/gotcha/package.json/gotcha",
|
|
103
102
|
"some-other-package": "some-other-package"
|
|
@@ -108,7 +107,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
108
107
|
],
|
|
109
108
|
invalid: [
|
|
110
109
|
{
|
|
111
|
-
code: `
|
|
110
|
+
code: `{
|
|
112
111
|
"license": "ISC",
|
|
113
112
|
"dependencies": {
|
|
114
113
|
"some-package": "link:./tests/lib/__fixtures__/Valid-local-dependency",
|
|
@@ -124,7 +123,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
124
123
|
]
|
|
125
124
|
},
|
|
126
125
|
{
|
|
127
|
-
code: `
|
|
126
|
+
code: `{
|
|
128
127
|
"peerDependencies": {
|
|
129
128
|
"some-package": "link:./tests/lib/__fixtures__/Valid-local-dependency",
|
|
130
129
|
"some-other-package": "some-other-package"
|
|
@@ -139,7 +138,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
139
138
|
]
|
|
140
139
|
},
|
|
141
140
|
{
|
|
142
|
-
code: `
|
|
141
|
+
code: `{
|
|
143
142
|
"devDependencies": {
|
|
144
143
|
"some-package": "link:./tests/lib/__fixtures__/Valid-local-dependency",
|
|
145
144
|
"some-other-package": "some-other-package"
|
|
@@ -154,7 +153,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
154
153
|
]
|
|
155
154
|
},
|
|
156
155
|
{
|
|
157
|
-
code: `
|
|
156
|
+
code: `{
|
|
158
157
|
"dependencies": {
|
|
159
158
|
"some-package": "link:./tests/lib/__fixtures__/dependency",
|
|
160
159
|
"some-other-package": "some-other-package"
|
|
@@ -169,7 +168,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
169
168
|
]
|
|
170
169
|
},
|
|
171
170
|
{
|
|
172
|
-
code: `
|
|
171
|
+
code: `{
|
|
173
172
|
"dependencies": {
|
|
174
173
|
"some-package": "link:./tests/lib/__fixtures__/Valid-local-dependency",
|
|
175
174
|
"some-other-package": "some-other-package"
|
|
@@ -192,7 +191,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
192
191
|
]
|
|
193
192
|
},
|
|
194
193
|
{
|
|
195
|
-
code: `
|
|
194
|
+
code: `{
|
|
196
195
|
"dependencies": {
|
|
197
196
|
"some-package": "link:./tests/lib/__fixtures__/Valid-local-dependency",
|
|
198
197
|
"another-path": "link:./tests/lib/__fixtures__/valid-local-dependency",
|
|
@@ -208,7 +207,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
208
207
|
]
|
|
209
208
|
},
|
|
210
209
|
{
|
|
211
|
-
code: `
|
|
210
|
+
code: `{
|
|
212
211
|
"dependencies": {
|
|
213
212
|
"some-package": "link:../Valid-local-dependency"
|
|
214
213
|
}
|
|
@@ -224,7 +223,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
224
223
|
]
|
|
225
224
|
},
|
|
226
225
|
{
|
|
227
|
-
code: `
|
|
226
|
+
code: `{
|
|
228
227
|
"dependencies": {
|
|
229
228
|
"some-package": "file:./tests/lib/__fixtures__/Valid-local-dependency",
|
|
230
229
|
"some-other-package": "some-other-package"
|
|
@@ -239,7 +238,7 @@ ruleTester.run('valid-local-dependency', rule, {
|
|
|
239
238
|
]
|
|
240
239
|
},
|
|
241
240
|
{
|
|
242
|
-
code: `
|
|
241
|
+
code: `{
|
|
243
242
|
"dependencies": {
|
|
244
243
|
"some-package": "file:./tests/lib/__fixtures__/Valid-local-dependency/gotcha/package.json/gotcha",
|
|
245
244
|
"some-other-package": "some-other-package"
|
|
@@ -5,17 +5,16 @@
|
|
|
5
5
|
//------------------------------------------------------------------------------
|
|
6
6
|
|
|
7
7
|
var rule = require('../../../lib/rules/valid-package-def'),
|
|
8
|
-
|
|
8
|
+
{ ruleTester } = require('./ruleTester');
|
|
9
9
|
|
|
10
10
|
//------------------------------------------------------------------------------
|
|
11
11
|
// Tests
|
|
12
12
|
//------------------------------------------------------------------------------
|
|
13
13
|
|
|
14
|
-
var ruleTester = new RuleTester();
|
|
15
14
|
ruleTester.run('valid-package-def', rule, {
|
|
16
15
|
valid: [
|
|
17
16
|
{
|
|
18
|
-
code: `
|
|
17
|
+
code: `{
|
|
19
18
|
"name": "pandages",
|
|
20
19
|
"version": "1.0.0",
|
|
21
20
|
"description": "",
|
|
@@ -27,7 +26,7 @@ ruleTester.run('valid-package-def', rule, {
|
|
|
27
26
|
filename: 'package.json'
|
|
28
27
|
},
|
|
29
28
|
{
|
|
30
|
-
code: `
|
|
29
|
+
code: `{
|
|
31
30
|
"name": "pandages-subpackage",
|
|
32
31
|
"version": "1.0.0",
|
|
33
32
|
"description": "",
|
|
@@ -47,7 +46,7 @@ ruleTester.run('valid-package-def', rule, {
|
|
|
47
46
|
|
|
48
47
|
invalid: [
|
|
49
48
|
{
|
|
50
|
-
code: `
|
|
49
|
+
code: `{ "nmae": "invalid-package" }`,
|
|
51
50
|
|
|
52
51
|
filename: 'package.json',
|
|
53
52
|
errors: [
|
|
@@ -60,7 +59,7 @@ ruleTester.run('valid-package-def', rule, {
|
|
|
60
59
|
]
|
|
61
60
|
},
|
|
62
61
|
{
|
|
63
|
-
code: `
|
|
62
|
+
code: `{ "verison": "wireless" }`,
|
|
64
63
|
|
|
65
64
|
filename: 'packages/nested/package.json',
|
|
66
65
|
errors: [
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
const parseErrors = {};
|
|
2
|
-
|
|
3
|
-
const isPackageJson = filePath => /(?:^|[/\\])package.json$/.test(filePath);
|
|
4
|
-
|
|
5
|
-
const forPackageJsonOnly = fn => (source, filePath) =>
|
|
6
|
-
isPackageJson(filePath) ? fn(source, filePath) : [];
|
|
7
|
-
|
|
8
|
-
const leader = `module.exports = `;
|
|
9
|
-
|
|
10
|
-
// turn package.json into a legal JS file
|
|
11
|
-
function preprocess(source, filePath) {
|
|
12
|
-
try {
|
|
13
|
-
JSON.parse(source);
|
|
14
|
-
} catch (e) {
|
|
15
|
-
let line = 0;
|
|
16
|
-
let column = 0;
|
|
17
|
-
const posDescription = e.message.match(/position\s+(\d+)/);
|
|
18
|
-
if (posDescription) {
|
|
19
|
-
const pos = Number(posDescription[1]);
|
|
20
|
-
const lines = source.slice(0, pos).split('\n');
|
|
21
|
-
line += lines.length;
|
|
22
|
-
const previousLinesLength = lines.slice(0, -1).join('\n').length;
|
|
23
|
-
column = pos - previousLinesLength;
|
|
24
|
-
}
|
|
25
|
-
parseErrors[filePath] = {
|
|
26
|
-
ruleId: 'package-json/valid-package-def',
|
|
27
|
-
severity: 2,
|
|
28
|
-
message: e.message,
|
|
29
|
-
line,
|
|
30
|
-
column,
|
|
31
|
-
nodeType: 'Program'
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
// so eslint can point to the line in its own message, put the invalid
|
|
35
|
-
// JSON in a comment (escaping comment-closing characters!)
|
|
36
|
-
return ['/*' + source.replace(/\*\//g, '*\\/') + '*/'];
|
|
37
|
-
}
|
|
38
|
-
return [leader + source.trim() + ';'];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// the reverse of preprocess: extract AST node representing package object
|
|
42
|
-
function extractPackageObjectFromAST(ast) {
|
|
43
|
-
return ast.body[0].expression.right;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function postprocess(errors, filePath) {
|
|
47
|
-
if (parseErrors[filePath]) {
|
|
48
|
-
return [parseErrors[filePath]];
|
|
49
|
-
}
|
|
50
|
-
const flat = [].concat(...errors);
|
|
51
|
-
flat.forEach(({ fix }) => {
|
|
52
|
-
if (fix) {
|
|
53
|
-
fix.range = fix.range.map(i => i - leader.length);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
return flat;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
module.exports.preprocess = forPackageJsonOnly(preprocess);
|
|
60
|
-
module.exports.postprocess = forPackageJsonOnly(postprocess);
|
|
61
|
-
module.exports.supportsAutofix = true;
|
|
62
|
-
module.exports.isPackageJson = isPackageJson;
|
|
63
|
-
module.exports.extractPackageObjectFromAST = extractPackageObjectFromAST;
|
package/tests/lib/index.js
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
const assert = require('assert');
|
|
2
|
-
const { CLIEngine } = require('eslint');
|
|
3
|
-
const { includes, keys } = require('lodash');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
|
|
6
|
-
const plugin = require('../../lib');
|
|
7
|
-
|
|
8
|
-
function execute(scenario, rules, options) {
|
|
9
|
-
const cli = new CLIEngine(
|
|
10
|
-
Object.assign(
|
|
11
|
-
{
|
|
12
|
-
extensions: ['.json'],
|
|
13
|
-
baseConfig: {
|
|
14
|
-
rules
|
|
15
|
-
},
|
|
16
|
-
ignore: false,
|
|
17
|
-
useEslintrc: false
|
|
18
|
-
},
|
|
19
|
-
options
|
|
20
|
-
)
|
|
21
|
-
);
|
|
22
|
-
cli.addPlugin('eslint-plugin-package-json', plugin);
|
|
23
|
-
return cli.executeOnFiles([
|
|
24
|
-
path.join(__dirname, '__fixtures__', scenario, 'package.json')
|
|
25
|
-
]);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
describe('plugin exports', () => {
|
|
29
|
-
it('should define json processor', () => {
|
|
30
|
-
const extensions = keys(plugin.processors);
|
|
31
|
-
assert(includes(extensions, '.json'));
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
describe('should define rules', () => {
|
|
35
|
-
it('catches unalphabetized collections', () => {
|
|
36
|
-
const { errorCount, fixableErrorCount, results } = execute(
|
|
37
|
-
'unalphabetized-collections',
|
|
38
|
-
{
|
|
39
|
-
'package-json/sort-collections': 'error'
|
|
40
|
-
}
|
|
41
|
-
);
|
|
42
|
-
assert.equal(errorCount, 2, 'errorCount === 2');
|
|
43
|
-
assert.equal(fixableErrorCount, 2, 'fixableErrorCount === 2');
|
|
44
|
-
assert.equal(results.length, 1);
|
|
45
|
-
const { messages } = results[0];
|
|
46
|
-
const [scriptsMessage, depsMessage] = messages;
|
|
47
|
-
assert.equal(
|
|
48
|
-
scriptsMessage.ruleId,
|
|
49
|
-
'package-json/sort-collections'
|
|
50
|
-
);
|
|
51
|
-
assert.equal(
|
|
52
|
-
scriptsMessage.message,
|
|
53
|
-
'Package scripts are not alphabetized'
|
|
54
|
-
);
|
|
55
|
-
assert(scriptsMessage.fix);
|
|
56
|
-
assert.equal(depsMessage.ruleId, 'package-json/sort-collections');
|
|
57
|
-
assert.equal(
|
|
58
|
-
depsMessage.message,
|
|
59
|
-
'Package dependencies are not alphabetized'
|
|
60
|
-
);
|
|
61
|
-
assert(depsMessage.fix);
|
|
62
|
-
});
|
|
63
|
-
it('autofixes unalphabetized collections', () => {
|
|
64
|
-
const { errorCount, fixableErrorCount, results } = execute(
|
|
65
|
-
'unalphabetized-collections',
|
|
66
|
-
{
|
|
67
|
-
'package-json/sort-collections': 'error'
|
|
68
|
-
},
|
|
69
|
-
{ fix: true }
|
|
70
|
-
);
|
|
71
|
-
assert.equal(errorCount, 0, 'errorCount === 0');
|
|
72
|
-
assert.equal(fixableErrorCount, 0, 'fixableErrorCount === 0');
|
|
73
|
-
let fixed;
|
|
74
|
-
assert.doesNotThrow(() => {
|
|
75
|
-
fixed = JSON.parse(results[0].output);
|
|
76
|
-
});
|
|
77
|
-
const scriptsOrder = Object.keys(fixed.scripts);
|
|
78
|
-
const scriptsDesiredOrder = scriptsOrder.slice().sort();
|
|
79
|
-
assert.deepEqual(scriptsOrder, scriptsDesiredOrder);
|
|
80
|
-
const depsOrder = Object.keys(fixed.dependencies);
|
|
81
|
-
const depsDesiredOrder = depsOrder.slice().sort();
|
|
82
|
-
assert.deepEqual(depsOrder, depsDesiredOrder);
|
|
83
|
-
});
|
|
84
|
-
it('sorts top-level properties by convention', () => {
|
|
85
|
-
const { errorCount, fixableErrorCount, results } = execute(
|
|
86
|
-
'invalid-top-level-property-order',
|
|
87
|
-
{
|
|
88
|
-
'package-json/order-properties': 'error'
|
|
89
|
-
}
|
|
90
|
-
);
|
|
91
|
-
assert.equal(errorCount, 1, 'errorCount === 1');
|
|
92
|
-
assert.equal(fixableErrorCount, 1, 'fixableErrorCount === 1');
|
|
93
|
-
assert.equal(results.length, 1);
|
|
94
|
-
const { ruleId, message, fix } = results[0].messages[0];
|
|
95
|
-
assert.equal(ruleId, 'package-json/order-properties');
|
|
96
|
-
assert(
|
|
97
|
-
new RegExp(`Package top\\-level properties are not ordered in the NPM standard way:
|
|
98
|
-
|
|
99
|
-
\\{
|
|
100
|
-
"name": "invalid\\-top\\-level\\-property\\-order",
|
|
101
|
-
.*\\+ "scripts": \\{.*
|
|
102
|
-
.*\\+ "test": "tape".*
|
|
103
|
-
.*\\+ \\},.*
|
|
104
|
-
"version": "1\\.0\\.0",
|
|
105
|
-
"description": "npm made me this way",
|
|
106
|
-
"main": "index\\.js",
|
|
107
|
-
.*\\- "scripts": \\{.*
|
|
108
|
-
.*\\- "test": "tape".*
|
|
109
|
-
.*\\- \\},.*
|
|
110
|
-
"repository": \\{
|
|
111
|
-
"type": "git",
|
|
112
|
-
"url": "git\\+https://github\\.com/fake/github\\.git"
|
|
113
|
-
\\}
|
|
114
|
-
`).test(message),
|
|
115
|
-
'Matches error message: ' + message
|
|
116
|
-
);
|
|
117
|
-
assert(fix);
|
|
118
|
-
});
|
|
119
|
-
it('autofixes out-of-order top-level properties', () => {
|
|
120
|
-
const { errorCount, fixableErrorCount, results } = execute(
|
|
121
|
-
'invalid-top-level-property-order',
|
|
122
|
-
{
|
|
123
|
-
'package-json/order-properties': 'error'
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
fix: true
|
|
127
|
-
}
|
|
128
|
-
);
|
|
129
|
-
assert.equal(errorCount, 0, 'errorCount === 0');
|
|
130
|
-
assert.equal(fixableErrorCount, 0, 'fixableErrorCount === 0');
|
|
131
|
-
let fixedString = results[0].output;
|
|
132
|
-
assert.doesNotThrow(() => {
|
|
133
|
-
JSON.parse(fixedString);
|
|
134
|
-
});
|
|
135
|
-
assert.equal(
|
|
136
|
-
fixedString,
|
|
137
|
-
JSON.stringify(
|
|
138
|
-
{
|
|
139
|
-
name: 'invalid-top-level-property-order',
|
|
140
|
-
version: '1.0.0',
|
|
141
|
-
description: 'npm made me this way',
|
|
142
|
-
main: 'index.js',
|
|
143
|
-
scripts: {
|
|
144
|
-
test: 'tape'
|
|
145
|
-
},
|
|
146
|
-
repository: {
|
|
147
|
-
type: 'git',
|
|
148
|
-
url: 'git+https://github.com/fake/github.git'
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
null,
|
|
152
|
-
2
|
|
153
|
-
) + '\n'
|
|
154
|
-
);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
});
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
const assert = require('assert');
|
|
2
|
-
|
|
3
|
-
const processor = require('../../../lib/processors/PackageJsonProcessor');
|
|
4
|
-
|
|
5
|
-
const { preprocess, postprocess } = processor;
|
|
6
|
-
|
|
7
|
-
describe('isPackageJson', () => {
|
|
8
|
-
for (const [input, expected] of [
|
|
9
|
-
['', false],
|
|
10
|
-
['-', false],
|
|
11
|
-
['other', false],
|
|
12
|
-
['package.js', false],
|
|
13
|
-
['package.jsx', false],
|
|
14
|
-
['-package.json', false],
|
|
15
|
-
['prefix-package.json', false],
|
|
16
|
-
['package.json.json', false],
|
|
17
|
-
['package.package.json', false],
|
|
18
|
-
['package.json.package.json', false],
|
|
19
|
-
['package.json-package.json', false],
|
|
20
|
-
['package.json', true],
|
|
21
|
-
['/package.json', true],
|
|
22
|
-
['\\package.json', true],
|
|
23
|
-
['prefix/package.json', true],
|
|
24
|
-
['prefix\\package.json', true],
|
|
25
|
-
['mixed\\prefix/package.json', true],
|
|
26
|
-
['mixed/prefix\\package.json', true]
|
|
27
|
-
]) {
|
|
28
|
-
it(input, () => {
|
|
29
|
-
assert.equal(processor.isPackageJson(input), expected);
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
describe('preprocess', () => {
|
|
35
|
-
it('only returns lintable strings when filename is package.json', () => {
|
|
36
|
-
const result = preprocess('{ "nmae": "invalid" }', 'package-lock.json');
|
|
37
|
-
assert.deepEqual(result, []);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should turn root package.json file into JS file exporting object', () => {
|
|
41
|
-
const json = '{ "nmae": "invalid" }';
|
|
42
|
-
const expected = ['module.exports = { "nmae": "invalid" };'];
|
|
43
|
-
const result = preprocess(json, 'package.json');
|
|
44
|
-
assert.deepEqual(result, expected);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('should turn deeply nested package.json file into JS file exporting object', () => {
|
|
48
|
-
const json = '{ "nmae": "invalid" }';
|
|
49
|
-
const expected = ['module.exports = { "nmae": "invalid" };'];
|
|
50
|
-
const result = preprocess(json, '/packages/subpackage/package.json');
|
|
51
|
-
assert.deepEqual(result, expected);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe('postprocess', () => {
|
|
56
|
-
it('should return informative validity errors on unparseable json', () => {
|
|
57
|
-
const badJson = `{
|
|
58
|
-
"florp": [],
|
|
59
|
-
"glorp": [
|
|
60
|
-
"foon",
|
|
61
|
-
"zune",
|
|
62
|
-
{
|
|
63
|
-
"rune"
|
|
64
|
-
|
|
65
|
-
],
|
|
66
|
-
"spoon": 4
|
|
67
|
-
}`;
|
|
68
|
-
const commented = preprocess(badJson, 'package.json')[0];
|
|
69
|
-
assert(
|
|
70
|
-
commented.startsWith('/*') && commented.endsWith('*/'),
|
|
71
|
-
`unparseable JSON wrapped in multiline comment: ${commented}`
|
|
72
|
-
);
|
|
73
|
-
assert.deepEqual(postprocess([], 'package.json'), [
|
|
74
|
-
{
|
|
75
|
-
ruleId: 'package-json/valid-package-def',
|
|
76
|
-
severity: 2,
|
|
77
|
-
message: 'Unexpected token ] in JSON at position 130',
|
|
78
|
-
line: 9,
|
|
79
|
-
column: 11,
|
|
80
|
-
nodeType: 'Program'
|
|
81
|
-
}
|
|
82
|
-
]);
|
|
83
|
-
|
|
84
|
-
preprocess('{', 'nested/package.json');
|
|
85
|
-
assert.deepEqual(postprocess([], 'nested/package.json'), [
|
|
86
|
-
{
|
|
87
|
-
ruleId: 'package-json/valid-package-def',
|
|
88
|
-
severity: 2,
|
|
89
|
-
message: 'Unexpected end of JSON input',
|
|
90
|
-
line: 0,
|
|
91
|
-
column: 0,
|
|
92
|
-
nodeType: 'Program'
|
|
93
|
-
}
|
|
94
|
-
]);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('should pass flattened error collection if there were no parse errors', () => {
|
|
98
|
-
const errors2d = [
|
|
99
|
-
[
|
|
100
|
-
{
|
|
101
|
-
ruleId: 'package-json/order-properties',
|
|
102
|
-
severity: 2,
|
|
103
|
-
message: 'Whatever',
|
|
104
|
-
line: 0,
|
|
105
|
-
column: 0,
|
|
106
|
-
nodeType: 'Property'
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
ruleId: 'package-json/order-properties',
|
|
110
|
-
severity: 2,
|
|
111
|
-
message: 'And Ever',
|
|
112
|
-
line: 16,
|
|
113
|
-
column: 0,
|
|
114
|
-
nodeType: 'Property'
|
|
115
|
-
}
|
|
116
|
-
],
|
|
117
|
-
[
|
|
118
|
-
{
|
|
119
|
-
ruleId: 'package-json/sort-collections',
|
|
120
|
-
severity: 2,
|
|
121
|
-
message: 'whomever',
|
|
122
|
-
line: 15,
|
|
123
|
-
column: 4,
|
|
124
|
-
nodeType: 'Program'
|
|
125
|
-
}
|
|
126
|
-
]
|
|
127
|
-
];
|
|
128
|
-
const errors1d = [
|
|
129
|
-
{
|
|
130
|
-
ruleId: 'package-json/order-properties',
|
|
131
|
-
severity: 2,
|
|
132
|
-
message: 'Whatever',
|
|
133
|
-
line: 0,
|
|
134
|
-
column: 0,
|
|
135
|
-
nodeType: 'Property'
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
ruleId: 'package-json/order-properties',
|
|
139
|
-
severity: 2,
|
|
140
|
-
message: 'And Ever',
|
|
141
|
-
line: 16,
|
|
142
|
-
column: 0,
|
|
143
|
-
nodeType: 'Property'
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
ruleId: 'package-json/sort-collections',
|
|
147
|
-
severity: 2,
|
|
148
|
-
message: 'whomever',
|
|
149
|
-
line: 15,
|
|
150
|
-
column: 4,
|
|
151
|
-
nodeType: 'Program'
|
|
152
|
-
}
|
|
153
|
-
];
|
|
154
|
-
assert.deepEqual(
|
|
155
|
-
postprocess(errors2d, 'further/nested/package.json'),
|
|
156
|
-
errors1d
|
|
157
|
-
);
|
|
158
|
-
});
|
|
159
|
-
});
|