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

Update ESLint to v7 #577

Merged
merged 15 commits into from May 9, 2020
4 changes: 2 additions & 2 deletions package.json
Expand Up @@ -53,7 +53,7 @@
"ava": "^3.8.1",
"babel-eslint": "^10.1.0",
"chalk": "^4.0.0",
"eslint": "^6.8.0",
"eslint": "^7.0.0",
"eslint-ava-rule-tester": "^4.0.0",
"eslint-plugin-eslint-plugin": "^2.2.1",
"execa": "^4.0.0",
Expand All @@ -66,7 +66,7 @@
"xo": "^0.30.0"
},
"peerDependencies": {
"eslint": ">=6.8.0"
"eslint": ">=7.0.0"
},
"ava": {
"babel": true,
Expand Down
1 change: 0 additions & 1 deletion test/better-regex.js
Expand Up @@ -10,7 +10,6 @@ const ruleTester = avaRuleTester(test, {

const createError = (original, optimized) => [
{
ruleId: 'better-regex',
message: `${original} can be optimized to ${optimized}`
}
];
Expand Down
2 changes: 0 additions & 2 deletions test/consistent-function-scoping.js
Expand Up @@ -17,12 +17,10 @@ const typescriptRuleTester = avaRuleTester(test, {
parser: require.resolve('@typescript-eslint/parser')
});

const ruleId = 'consistent-function-scoping';
const MESSAGE_ID_NAMED = 'named';
const MESSAGE_ID_ANONYMOUS = 'anonymous';

const createError = ({name, arrow}) => ({
ruleId,
messageId: name ? MESSAGE_ID_NAMED : MESSAGE_ID_ANONYMOUS,
data: {
functionType: arrow ? 'arrow function' : 'function',
Expand Down
11 changes: 5 additions & 6 deletions test/custom-error-definition.js
Expand Up @@ -18,13 +18,12 @@ const typescriptRuleTester = avaRuleTester(test, {
parser: require.resolve('@typescript-eslint/parser')
});

const invalidClassNameError = {ruleId: 'custom-error-definition', message: 'Invalid class name, use `FooError`.'};
const constructorError = {ruleId: 'custom-error-definition', message: 'Add a constructor to your error.'};
const noSuperCallError = {ruleId: 'custom-error-definition', message: 'Missing call to `super()` in constructor.'};
const invalidNameError = name => ({ruleId: 'custom-error-definition', message: `The \`name\` property should be set to \`${name}\`.`});
const passMessageToSuperError = {ruleId: 'custom-error-definition', message: 'Pass the error message to `super()` instead of setting `this.message`.'};
const invalidClassNameError = {message: 'Invalid class name, use `FooError`.'};
const constructorError = {message: 'Add a constructor to your error.'};
const noSuperCallError = {message: 'Missing call to `super()` in constructor.'};
const invalidNameError = name => ({message: `The \`name\` property should be set to \`${name}\`.`});
const passMessageToSuperError = {message: 'Pass the error message to `super()` instead of setting `this.message`.'};
const invalidExportError = {
ruleId: 'custom-error-definition',
messageId: 'invalidExport'
};

Expand Down
2 changes: 0 additions & 2 deletions test/error-message.js
Expand Up @@ -10,12 +10,10 @@ const ruleTester = avaRuleTester(test, {
});

const emptyStringError = {
ruleId: 'error-message',
message: 'Error message should not be an empty string.'
};

const noMessageError = {
ruleId: 'error-message',
message: 'Pass a message to the error constructor.'
};

Expand Down
1 change: 0 additions & 1 deletion test/escape-case.js
Expand Up @@ -11,7 +11,6 @@ const ruleTester = avaRuleTester(test, {

const errors = [
{
ruleId: 'escape-case',
message: 'Use uppercase characters for the value of the escape sequence.'
}
];
Expand Down
11 changes: 0 additions & 11 deletions test/expiring-todo-comments.js
Expand Up @@ -9,57 +9,46 @@ const ruleTester = avaRuleTester(test, {
});

const expiredTodoError = (expirationDate, message) => ({
ruleId: 'expiring-todo-comments',
message: `There is a TODO that is past due date: ${expirationDate}. ${message}`
});

const avoidMultipleDatesError = (expirationDates, message) => ({
ruleId: 'expiring-todo-comments',
message: `Avoid using multiple expiration dates in TODO: ${expirationDates}. ${message}`
});

const havePackageError = (package_, message) => ({
ruleId: 'expiring-todo-comments',
message: `There is a TODO that is deprecated since you installed: ${package_}. ${message}`
});

const dontHavePackageError = (package_, message) => ({
ruleId: 'expiring-todo-comments',
message: `There is a TODO that is deprecated since you uninstalled: ${package_}. ${message}`
});

const versionMatchesError = (comparison, message) => ({
ruleId: 'expiring-todo-comments',
message: `There is a TODO match for package version: ${comparison}. ${message}`
});

const engineMatchesError = (comparison, message) => ({
ruleId: 'expiring-todo-comments',
message: `There is a TODO match for Node.js version: ${comparison}. ${message}`
});

const reachedPackageVersionError = (version, message) => ({
ruleId: 'expiring-todo-comments',
message: `There is a TODO that is past due package version: ${version}. ${message}`
});

const avoidMultiplePackageVersionsError = (versions, message) => ({
ruleId: 'expiring-todo-comments',
message: `Avoid using multiple package versions in TODO: ${versions}. ${message}`
});

const removeWhitespacesError = (argument, message) => ({
ruleId: 'expiring-todo-comments',
message: `Avoid using whitespaces on TODO argument. On '${argument}' use '${argument.replace(/ /g, '')}'. ${message}`
});

const missingAtSymbolError = (bad, good, message) => ({
ruleId: 'expiring-todo-comments',
message: `Missing '@' on TODO argument. On '${bad}' use '${good}'. ${message}`
});

const noWarningCommentError = () => ({
ruleId: 'expiring-todo-comments',
message: 'Unexpected \'todo\' comment.'
});

Expand Down
1 change: 0 additions & 1 deletion test/explicit-length-check.js
Expand Up @@ -10,7 +10,6 @@ const ruleTester = avaRuleTester(test, {

const error = message => {
return {
ruleId: 'explicit-length-check',
message
};
};
Expand Down
1 change: 0 additions & 1 deletion test/filename-case.js
Expand Up @@ -31,7 +31,6 @@ function testCaseWithOptions(filename, errorMessage, options = []) {
options,
errors: errorMessage && [
{
ruleId: 'filename-case',
message: errorMessage
}
]
Expand Down
1 change: 0 additions & 1 deletion test/import-index.js
Expand Up @@ -12,7 +12,6 @@ const ruleTester = avaRuleTester(test, {
});

const error = {
ruleId: 'import-index',
message: 'Do not reference the index file directly.'
};

Expand Down
77 changes: 38 additions & 39 deletions test/lint/lint.js
@@ -1,62 +1,61 @@
#!/usr/bin/env node
'use strict';
const {CLIEngine} = require('eslint');
const {ESLint} = require('eslint');
const unicorn = require('../..');

const {recommended} = unicorn.configs;
const files = [process.argv[2] || '.'];
const fix = process.argv.includes('--fix');
const ruleIds = Object.keys(unicorn.rules);
const unicornRules = new Map(Object.entries(unicorn.rules));

const cli = new CLIEngine({
const eslint = new ESLint({
baseConfig: recommended,
useEslintrc: false,
plugins: {
unicorn
},
fix,
ignorePattern: [
]
overrideConfig: {
ignorePatterns: [
'coverage',
'test/integration/fixtures'
]
}
});

cli.addPlugin('eslint-plugin-unicorn', unicorn);

// Make sure rules are loaded from codebase
const loadedRules = cli.getRules();
if (!ruleIds.every(ruleId => unicornRules.get(ruleId) === loadedRules.get(`unicorn/${ruleId}`))) {
console.error('`eslint-plugin-unicorn` rules are not loaded from codebase.');
process.exit(1);
}
(async function () {
const results = await eslint.lintFiles(files);

const report = cli.executeOnFiles(files);
if (fix) {
await ESLint.outputFixes(results);
}

const {
errorCount,
warningCount,
fixableErrorCount,
fixableWarningCount
} = report;
const errorCount = results.reduce((total, {errorCount}) => total + errorCount, 0);
const warningCount = results.reduce((total, {warningCount}) => total + warningCount, 0);
const fixableErrorCount = results.reduce((total, {fixableErrorCount}) => total + fixableErrorCount, 0);
const fixableWarningCount = results.reduce((total, {fixableWarningCount}) => total + fixableWarningCount, 0);

const hasFixable = fixableErrorCount || fixableWarningCount;
const hasFixable = fixableErrorCount || fixableWarningCount;

if (fix) {
CLIEngine.outputFixes(report);
}
if (errorCount || warningCount) {
const {format} = await eslint.loadFormatter();
console.log(format(results));

if (errorCount || warningCount) {
const formatter = cli.getFormatter();
console.log(formatter(report.results));
console.log();
console.log(`You need to fix the failed test${errorCount + warningCount > 1 ? 's' : ''} above and run \`npm run lint <file>\` to check again.`);

console.log();
console.log(`You need to fix the failed test${errorCount + warningCount > 1 ? 's' : ''} above and run \`npm run lint <file>\` to check again.`);
if (hasFixable) {
console.log();
console.log('You may also want run `npm run lint <file> --fix` to fix fixable problems.');
}

if (hasFixable) {
console.log();
console.log('You may also want run `npm run lint <file> --fix` to fix fixable problems.');
console.log('* If you\'re making a new rule, you can fix this later. *');
} else {
console.log('All tests have passed.');
}

console.log();
console.log('* If you\'re making a new rule, you can fix this later. *');
} else {
console.log('All tests have passed.');
}

process.exit(errorCount);
process.exit(errorCount);
})().catch(error => {
process.exitCode = 1;
console.error(error);
});
2 changes: 0 additions & 2 deletions test/new-for-builtins.js
Expand Up @@ -20,12 +20,10 @@ const ruleTester = avaRuleTester(test, {
});

const enforceNewError = builtin => ({
ruleId: 'new-for-builtins',
message: `Use \`new ${builtin}()\` instead of \`${builtin}()\`.`
});

const disallowNewError = builtin => ({
ruleId: 'new-for-builtins',
message: `Use \`${builtin}()\` instead of \`new ${builtin}()\`.`
});

Expand Down
1 change: 0 additions & 1 deletion test/no-abusive-eslint-disable.js
Expand Up @@ -21,7 +21,6 @@ const ruleTester = avaRuleTester(test, {

const error = [
{
ruleId: 'no-abusive-eslint-disable',
message: 'Specify the rules you want to disable.'
}
];
Expand Down
1 change: 0 additions & 1 deletion test/no-array-instanceof.js
Expand Up @@ -10,7 +10,6 @@ const ruleTester = avaRuleTester(test, {

const errors = [
{
ruleId: 'no-array-instanceof',
message: 'Use `Array.isArray()` instead of `instanceof Array`.'
}
];
Expand Down
1 change: 0 additions & 1 deletion test/no-console-spaces.js
Expand Up @@ -11,7 +11,6 @@ const ruleTester = avaRuleTester(test, {

function buildError({method, column, line}) {
const error = {
ruleId: 'no-console-spaces',
message: `Do not use leading/trailing space between \`console.${method}\` parameters.`
};

Expand Down
2 changes: 1 addition & 1 deletion test/no-for-loop.js
Expand Up @@ -19,7 +19,7 @@ function testCase(code, output) {
return {
code,
output: output || code,
errors: [{ruleId: 'no-for-loop'}]
errors: [{}]
};
}

Expand Down
1 change: 0 additions & 1 deletion test/no-hex-escape.js
Expand Up @@ -16,7 +16,6 @@ const typescriptRuleTester = avaRuleTester(test, {
});

const error = {
ruleId: 'no-hex-escape',
message: 'Use Unicode escapes instead of hexadecimal escapes.'
};

Expand Down
3 changes: 0 additions & 3 deletions test/no-nested-ternary.js
Expand Up @@ -15,7 +15,6 @@ const typescriptRuleTester = avaRuleTester(test, {

const errors = [
{
ruleId: 'no-nested-ternary',
message: 'Do not nest ternary expressions.'
}
];
Expand Down Expand Up @@ -49,11 +48,9 @@ ruleTester.run('new-error', rule, {
output: 'const foo = i > 5 ? (i < 100 ? true : false) : (i < 100 ? true : false);',
errors: [
{
ruleId: 'no-nested-ternary',
column: 21
},
{
ruleId: 'no-nested-ternary',
column: 46
}
]
Expand Down
2 changes: 0 additions & 2 deletions test/no-new-buffer.js
Expand Up @@ -17,12 +17,10 @@ const typescriptRuleTester = avaRuleTester(test, {
});

const allocError = {
ruleId: 'no-new-buffer',
message: '`new Buffer()` is deprecated, use `Buffer.alloc()` instead.'
};

const fromError = {
ruleId: 'no-new-buffer',
message: '`new Buffer()` is deprecated, use `Buffer.from()` instead.'
};

Expand Down
1 change: 0 additions & 1 deletion test/no-process-exit.js
Expand Up @@ -12,7 +12,6 @@ const ruleTester = avaRuleTester(test, {

const errors = [
{
ruleId: 'no-process-exit',
message: 'Only use `process.exit()` in CLI apps. Throw an error instead.'
}
];
Expand Down
1 change: 0 additions & 1 deletion test/no-unsafe-regex.js
Expand Up @@ -12,7 +12,6 @@ const ruleTester = avaRuleTester(test, {
});

const error = {
ruleId: 'no-unsafe-regex',
message: 'Unsafe regular expression.'
};

Expand Down
1 change: 0 additions & 1 deletion test/no-unused-properties.js
Expand Up @@ -23,7 +23,6 @@ const babelEslintRuleTester = avaRuleTester(test, {
});

const error = {
ruleId: 'no-unused-properties',
message: 'Property `u` is defined but never used.'
};

Expand Down
2 changes: 0 additions & 2 deletions test/no-zero-fractions.js
Expand Up @@ -12,11 +12,9 @@ const ruleTester = avaRuleTester(test, {
});

const errorZeroFraction = {
ruleId: 'no-zero-fractions',
message: 'Don\'t use a zero fraction in the number.'
};
const errorDanglingDot = {
ruleId: 'no-zero-fractions',
message: 'Don\'t use a dangling dot in the number.'
};

Expand Down
1 change: 0 additions & 1 deletion test/number-literal-case.js
Expand Up @@ -13,7 +13,6 @@ const ruleTester = avaRuleTester(test, {
});

const error = {
ruleId: 'number-literal-case',
message: 'Invalid number literal casing.'
};

Expand Down