/
lint.js
102 lines (84 loc) · 2.52 KB
/
lint.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
'use strict'
const CLIEngine = require('eslint').CLIEngine
const path = require('path')
const formatter = CLIEngine.getFormatter()
const userConfig = require('./config/user')
const globby = require('globby')
const FILES = [
'*.js',
'bin/**',
'config/**/*.js',
'test/**/*.js',
'src/**/*.js',
'tasks/**/*.js',
'benchmarks/**/*.js',
'!**/node_modules/**'
]
function checkDependencyVersions () {
const checkVersions = (type, pkg, key) => {
const badVersions = []
if (pkg[key]) {
Object.keys(pkg[key]).forEach(name => {
const version = pkg[key][name]
if (/^(?!~)([<>=^]{1,2})[0]/.test(version)) {
badVersions.push({
type,
name,
version,
message: 'development (e.g. < 1.0.0) versions should start with a ~'
})
}
if (/^(?!\^)([<>=~]{1,2})[1-9]/.test(version)) {
badVersions.push({
type,
name,
version,
message: 'stable versions (e.g. >= 1.0.0) should start with a ^'
})
}
})
}
return badVersions
}
return new Promise((resolve, reject) => {
const pkg = require(path.join(process.cwd(), 'package.json'))
const badVersions = []
.concat(checkVersions('Dependency', pkg, 'dependencies'))
.concat(checkVersions('Dev dependency', pkg, 'devDependencies'))
.concat(checkVersions('Optional dependency', pkg, 'optionalDependencies'))
.concat(checkVersions('Peer dependency', pkg, 'peerDependencies'))
.concat(checkVersions('Bundled dependency', pkg, 'bundledDependencies'))
if (badVersions.length) {
badVersions.forEach(({ type, name, version, message }) => {
console.log(`${type} ${name} had version ${version} - ${message}`)
})
return reject(new Error('Dependency version errors'))
}
resolve()
})
}
function runLinter (opts = {}) {
return new Promise(async (resolve, reject) => {
const cli = new CLIEngine({
useEslintrc: true,
baseConfig: require('./config/eslintrc'),
fix: opts.fix
})
const config = userConfig()
const patterns = (config.lint && config.lint.files) || FILES
const files = await globby(patterns)
const report = cli.executeOnFiles(files)
console.log(formatter(report.results))
if (report.errorCount > 0) {
return reject(new Error('Lint errors'))
}
resolve()
})
}
function lint (opts) {
return Promise.all([
runLinter(opts),
checkDependencyVersions(opts)
])
}
module.exports = lint