Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade to ESLint 8 and require Node.js 12 #171

Merged
merged 1 commit into from Oct 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion gruntfile.js
Expand Up @@ -3,7 +3,7 @@ module.exports = grunt => {
grunt.initConfig({
eslint: {
options: {
configFile: 'conf/eslint.json',
overrideConfigFile: 'conf/eslint.json',
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you changing the option name?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello @sindresorhus because 'configFile' option is deprecated in v8. If you run the test with that option eslint prints the error message:

Warning: Invalid Options:
- Unknown options: configFile
- 'configFile' has been removed. Please use the 'overrideConfigFile' option instead. Use --force to continue.

rulePaths: ['conf/rules'],
quiet: true
},
Expand Down
4 changes: 2 additions & 2 deletions package.json
Expand Up @@ -11,7 +11,7 @@
"url": "https://sindresorhus.com"
},
"engines": {
"node": ">=10"
"node": ">=12"
},
"scripts": {
"test": "grunt"
Expand All @@ -28,7 +28,7 @@
],
"dependencies": {
"chalk": "^4.0.0",
"eslint": "^7.0.0"
"eslint": "^8.0.0"
},
"devDependencies": {
"grunt": "^1.0.1",
Expand Down
4 changes: 2 additions & 2 deletions readme.md
Expand Up @@ -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']
Expand All @@ -55,7 +55,7 @@ grunt.initConfig({

## Options

See the [ESLint options](https://eslint.org/docs/developer-guide/nodejs-api#cliengine).
See the [ESLint options](https://eslint.org/docs/developer-guide/nodejs-api#-new-eslintoptions).

In addition the following options are supported:

Expand Down
95 changes: 50 additions & 45 deletions 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);
}
});
};
};