UNPKG

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