Skip to content

Commit dfc381c

Browse files
Fix pkg.
1 parent f9db895 commit dfc381c

File tree

1 file changed

+129
-127
lines changed

1 file changed

+129
-127
lines changed

Diff for: src/rules/no-extraneous-dependencies.js

+129-127
Original file line numberDiff line numberDiff line change
@@ -1,127 +1,129 @@
1-
import fs from 'fs'
2-
import path from 'path'
3-
import readPkgUp from 'read-pkg-up'
4-
import minimatch from 'minimatch'
5-
import importType from '../core/importType'
6-
import isStaticRequire from '../core/staticRequire'
7-
8-
function getDependencies(context) {
9-
try {
10-
const pkg = readPkgUp.sync({cwd: context.getFilename(), normalize: false})
11-
const packageContent = JSON.parse(pkg.pkg)
12-
return {
13-
dependencies: packageContent.dependencies || {},
14-
devDependencies: packageContent.devDependencies || {},
15-
optionalDependencies: packageContent.optionalDependencies || {},
16-
peerDependencies: packageContent.peerDependencies || {},
17-
}
18-
} catch (e) {
19-
return null
20-
}
21-
}
22-
23-
function missingErrorMessage(packageName) {
24-
return `'${packageName}' should be listed in the project's dependencies. ` +
25-
`Run 'npm i -S ${packageName}' to add it`
26-
}
27-
28-
function devDepErrorMessage(packageName) {
29-
return `'${packageName}' should be listed in the project's dependencies, not devDependencies.`
30-
}
31-
32-
function optDepErrorMessage(packageName) {
33-
return `'${packageName}' should be listed in the project's dependencies, ` +
34-
`not optionalDependencies.`
35-
}
36-
37-
function reportIfMissing(context, deps, depsOptions, node, name) {
38-
if (importType(name, context) !== 'external') {
39-
return
40-
}
41-
const splitName = name.split('/')
42-
const packageName = splitName[0][0] === '@'
43-
? splitName.slice(0, 2).join('/')
44-
: splitName[0]
45-
const isInDeps = deps.dependencies[packageName] !== undefined
46-
const isInDevDeps = deps.devDependencies[packageName] !== undefined
47-
const isInOptDeps = deps.optionalDependencies[packageName] !== undefined
48-
const isInPeerDeps = deps.peerDependencies[packageName] !== undefined
49-
50-
if (isInDeps ||
51-
(depsOptions.allowDevDeps && isInDevDeps) ||
52-
(depsOptions.allowPeerDeps && isInPeerDeps) ||
53-
(depsOptions.allowOptDeps && isInOptDeps)
54-
) {
55-
return
56-
}
57-
58-
if (isInDevDeps && !depsOptions.allowDevDeps) {
59-
context.report(node, devDepErrorMessage(packageName))
60-
return
61-
}
62-
63-
if (isInOptDeps && !depsOptions.allowOptDeps) {
64-
context.report(node, optDepErrorMessage(packageName))
65-
return
66-
}
67-
68-
context.report(node, missingErrorMessage(packageName))
69-
}
70-
71-
function testConfig(config, filename) {
72-
// Simplest configuration first, either a boolean or nothing.
73-
if (typeof config === 'boolean' || typeof config === 'undefined') {
74-
return config
75-
}
76-
// Array of globs.
77-
return config.some(c => (
78-
minimatch(filename, c) ||
79-
minimatch(filename, path.join(process.cwd(), c))
80-
))
81-
}
82-
83-
module.exports = {
84-
meta: {
85-
docs: {},
86-
87-
schema: [
88-
{
89-
'type': 'object',
90-
'properties': {
91-
'devDependencies': { 'type': ['boolean', 'array'] },
92-
'optionalDependencies': { 'type': ['boolean', 'array'] },
93-
'peerDependencies': { 'type': ['boolean', 'array'] },
94-
},
95-
'additionalProperties': false,
96-
},
97-
],
98-
},
99-
100-
create: function (context) {
101-
const options = context.options[0] || {}
102-
const filename = context.getFilename()
103-
const deps = getDependencies(context)
104-
105-
if (!deps) {
106-
return {}
107-
}
108-
109-
const depsOptions = {
110-
allowDevDeps: testConfig(options.devDependencies, filename) !== false,
111-
allowOptDeps: testConfig(options.optionalDependencies, filename) !== false,
112-
allowPeerDeps: testConfig(options.peerDependencies, filename) !== false,
113-
}
114-
115-
// todo: use module visitor from module-utils core
116-
return {
117-
ImportDeclaration: function (node) {
118-
reportIfMissing(context, deps, depsOptions, node, node.source.value)
119-
},
120-
CallExpression: function handleRequires(node) {
121-
if (isStaticRequire(node)) {
122-
reportIfMissing(context, deps, depsOptions, node, node.arguments[0].value)
123-
}
124-
},
125-
}
126-
},
127-
}
1+
import path from 'path'
2+
import readPkgUp from 'read-pkg-up'
3+
import minimatch from 'minimatch'
4+
import importType from '../core/importType'
5+
import isStaticRequire from '../core/staticRequire'
6+
7+
function getDependencies(context) {
8+
try {
9+
const pkg = readPkgUp.sync({cwd: context.getFilename(), normalize: false})
10+
if (!pkg || !pkg.pkg) {
11+
return null
12+
}
13+
const packageContent = pkg.pkg
14+
return {
15+
dependencies: packageContent.dependencies || {},
16+
devDependencies: packageContent.devDependencies || {},
17+
optionalDependencies: packageContent.optionalDependencies || {},
18+
peerDependencies: packageContent.peerDependencies || {},
19+
}
20+
} catch (e) {
21+
return null
22+
}
23+
}
24+
25+
function missingErrorMessage(packageName) {
26+
return `'${packageName}' should be listed in the project's dependencies. ` +
27+
`Run 'npm i -S ${packageName}' to add it`
28+
}
29+
30+
function devDepErrorMessage(packageName) {
31+
return `'${packageName}' should be listed in the project's dependencies, not devDependencies.`
32+
}
33+
34+
function optDepErrorMessage(packageName) {
35+
return `'${packageName}' should be listed in the project's dependencies, ` +
36+
`not optionalDependencies.`
37+
}
38+
39+
function reportIfMissing(context, deps, depsOptions, node, name) {
40+
if (importType(name, context) !== 'external') {
41+
return
42+
}
43+
const splitName = name.split('/')
44+
const packageName = splitName[0][0] === '@'
45+
? splitName.slice(0, 2).join('/')
46+
: splitName[0]
47+
const isInDeps = deps.dependencies[packageName] !== undefined
48+
const isInDevDeps = deps.devDependencies[packageName] !== undefined
49+
const isInOptDeps = deps.optionalDependencies[packageName] !== undefined
50+
const isInPeerDeps = deps.peerDependencies[packageName] !== undefined
51+
52+
if (isInDeps ||
53+
(depsOptions.allowDevDeps && isInDevDeps) ||
54+
(depsOptions.allowPeerDeps && isInPeerDeps) ||
55+
(depsOptions.allowOptDeps && isInOptDeps)
56+
) {
57+
return
58+
}
59+
60+
if (isInDevDeps && !depsOptions.allowDevDeps) {
61+
context.report(node, devDepErrorMessage(packageName))
62+
return
63+
}
64+
65+
if (isInOptDeps && !depsOptions.allowOptDeps) {
66+
context.report(node, optDepErrorMessage(packageName))
67+
return
68+
}
69+
70+
context.report(node, missingErrorMessage(packageName))
71+
}
72+
73+
function testConfig(config, filename) {
74+
// Simplest configuration first, either a boolean or nothing.
75+
if (typeof config === 'boolean' || typeof config === 'undefined') {
76+
return config
77+
}
78+
// Array of globs.
79+
return config.some(c => (
80+
minimatch(filename, c) ||
81+
minimatch(filename, path.join(process.cwd(), c))
82+
))
83+
}
84+
85+
module.exports = {
86+
meta: {
87+
docs: {},
88+
89+
schema: [
90+
{
91+
'type': 'object',
92+
'properties': {
93+
'devDependencies': { 'type': ['boolean', 'array'] },
94+
'optionalDependencies': { 'type': ['boolean', 'array'] },
95+
'peerDependencies': { 'type': ['boolean', 'array'] },
96+
},
97+
'additionalProperties': false,
98+
},
99+
],
100+
},
101+
102+
create: function (context) {
103+
const options = context.options[0] || {}
104+
const filename = context.getFilename()
105+
const deps = getDependencies(context)
106+
107+
if (!deps) {
108+
return {}
109+
}
110+
111+
const depsOptions = {
112+
allowDevDeps: testConfig(options.devDependencies, filename) !== false,
113+
allowOptDeps: testConfig(options.optionalDependencies, filename) !== false,
114+
allowPeerDeps: testConfig(options.peerDependencies, filename) !== false,
115+
}
116+
117+
// todo: use module visitor from module-utils core
118+
return {
119+
ImportDeclaration: function (node) {
120+
reportIfMissing(context, deps, depsOptions, node, node.source.value)
121+
},
122+
CallExpression: function handleRequires(node) {
123+
if (isStaticRequire(node)) {
124+
reportIfMissing(context, deps, depsOptions, node, node.arguments[0].value)
125+
}
126+
},
127+
}
128+
},
129+
}

0 commit comments

Comments
 (0)