diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c1870cf7..48143fcd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,9 +10,9 @@ jobs: fail-fast: false matrix: node-version: + - 16 - 14 - 12 - - 10 steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 diff --git a/gruntfile.js b/gruntfile.js index 677c6788..2b197427 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -3,7 +3,7 @@ module.exports = grunt => { grunt.initConfig({ eslint: { options: { - configFile: 'conf/eslint.json', + overrideConfigFile: 'conf/eslint.json', rulePaths: ['conf/rules'], quiet: true }, diff --git a/package.json b/package.json index 4776692e..7b9b6182 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "url": "https://sindresorhus.com" }, "engines": { - "node": ">=10" + "node": ">=12" }, "scripts": { "test": "grunt" @@ -28,7 +28,7 @@ ], "dependencies": { "chalk": "^4.0.0", - "eslint": "^7.0.0" + "eslint": "^8.0.0" }, "devDependencies": { "grunt": "^1.0.1", diff --git a/readme.md b/readme.md index 508f0316..e8d0bb2a 100644 --- a/readme.md +++ b/readme.md @@ -32,7 +32,7 @@ grunt.registerTask('default', ['eslint']); grunt.initConfig({ eslint: { options: { - configFile: 'conf/eslint.json', + overrideConfigFile: 'conf/eslint.json', rulePaths: ['conf/rules'] }, target: ['file.js'] diff --git a/tasks/eslint.js b/tasks/eslint.js index 134dc40f..d5ae5b34 100644 --- a/tasks/eslint.js +++ b/tasks/eslint.js @@ -1,62 +1,67 @@ 'use strict'; const chalk = require('chalk'); -const eslint = require('eslint'); +const { ESLint } = require('eslint'); module.exports = grunt => { - grunt.registerMultiTask('eslint', 'Validate files with ESLint', function () { - const options = this.options({ - outputFile: false, - quiet: false, - maxWarnings: -1, - failOnError: true, - }); - - if (this.filesSrc.length === 0) { - grunt.log.writeln(chalk.magenta('Could not find any files to validate')); - return true; - } + grunt.registerMultiTask('eslint', 'Validate files with ESLint', async function () { + const done = this.async(); - const formatter = eslint.CLIEngine.getFormatter(options.format); + try { + const { format, quiet, maxWarnings, failOnError, outputFile, ...options } = this.options({ + outputFile: false, + quiet: false, + maxWarnings: -1, + failOnError: true, + format: "stylish" + }); - if (!formatter) { - grunt.warn(`Could not find formatter ${options.format}`); - return false; - } + if (this.filesSrc.length === 0) { + grunt.log.writeln(chalk.magenta('Could not find any files to validate')); + return true; + } - const engine = new eslint.CLIEngine(options); + const engine = new ESLint(options); - let report; - try { - report = engine.executeOnFiles(this.filesSrc); - } catch (error) { - grunt.warn(error); - return false; - } + const formatter = await engine.loadFormatter(format); - if (options.fix) { - eslint.CLIEngine.outputFixes(report); - } + if (!formatter) { + grunt.warn(`Could not find formatter ${format}`); + return false; + } - let results = report.results; + let results = await engine.lintFiles(this.filesSrc); - if (options.quiet) { - results = eslint.CLIEngine.getErrorResults(results); - } + if (options.fix) { + await ESLint.outputFixes(results); + } - const output = formatter(results); + if (quiet) { + results = ESLint.getErrorResults(results); + } - if (options.outputFile) { - grunt.file.write(options.outputFile, output); - } else if (output) { - console.log(output); - } + const output = formatter.format(results); - const tooManyWarnings = options.maxWarnings >= 0 && report.warningCount > options.maxWarnings; + if (outputFile) { + grunt.file.write(outputFile, output); + } else if (output) { + console.log(output); + } - if (report.errorCount === 0 && tooManyWarnings) { - grunt.warn(`ESLint found too many warnings (maximum: ${options.maxWarnings})`); - } + const { warningCount, errorCount } = results.reduce((count, { warningCount, errorCount }) => { + count.warningCount += warningCount; + count.errorCount += errorCount; + return count; + }, { warningCount: 0, errorCount: 0 }); - return options.failOnError ? report.errorCount === 0 : 0; + const tooManyWarnings = maxWarnings >= 0 && warningCount > maxWarnings; + + if (errorCount === 0 && tooManyWarnings) { + grunt.warn(`ESLint found too many warnings (maximum: ${maxWarnings})`); + } + + done(failOnError ? errorCount === 0 : 0); + } catch (err) { + done(err); + } }); -}; +}; \ No newline at end of file