UNPKG

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