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

feat: support ESLint v8 #3737

Merged
merged 15 commits into from Aug 22, 2021
15 changes: 15 additions & 0 deletions jest-resolver.js
@@ -0,0 +1,15 @@
// https://github.com/facebook/jest/issues/9771#issuecomment-871585234

// temporary workaround while we wait for https://github.com/facebook/jest/issues/9771
const resolver = require('enhanced-resolve').create.sync({
conditionNames: ['require', 'node', 'default'],
extensions: ['.js', '.json', '.node', '.ts', '.tsx'],
});

module.exports = function (request, options) {
// list global module that must be resolved by defaultResolver here
if (['fs', 'http', 'path'].includes(request)) {
return options.defaultResolver(request, options);
}
return resolver(options.basedir, request);
};
3 changes: 2 additions & 1 deletion package.json
Expand Up @@ -100,7 +100,8 @@
"cspell": "^5.5.2",
"cz-conventional-changelog": "^3.3.0",
"downlevel-dts": "^0.7.0",
"eslint": "^7.27.0",
"enhanced-resolve": "^5.8.2",
"eslint": "^8.0.0-0",
"eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-eslint-plugin": "^3.0.3",
"eslint-plugin-import": "^2.23.4",
Expand Down
1 change: 1 addition & 0 deletions packages/eslint-plugin-internal/jest.config.js
Expand Up @@ -3,6 +3,7 @@
// @ts-check
/** @type {import('@jest/types').Config.InitialOptions} */
module.exports = {
resolver: '<rootDir>/../../jest-resolver.js',
globals: {
'ts-jest': {
isolatedModules: true,
Expand Down
Expand Up @@ -43,6 +43,7 @@ export default createRule({
requiresTypeChecking: true,
},
fixable: 'code',
hasSuggestions: true,
schema: [],
messages: {
doNotUse: 'Do not use {{type}}.{{property}} because it is poorly typed.',
Expand Down
1 change: 1 addition & 0 deletions packages/eslint-plugin-tslint/jest.config.js
Expand Up @@ -3,6 +3,7 @@
// @ts-check
/** @type {import('@jest/types').Config.InitialOptions} */
module.exports = {
resolver: '<rootDir>/../../jest-resolver.js',
globals: {
'ts-jest': {
isolatedModules: true,
Expand Down
2 changes: 1 addition & 1 deletion packages/eslint-plugin-tslint/package.json
Expand Up @@ -42,7 +42,7 @@
"lodash": "^4.17.21"
},
"peerDependencies": {
"eslint": "^5.0.0 || ^6.0.0 || ^7.0.0",
"eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0",
"tslint": "^5.0.0 || ^6.0.0",
"typescript": "*"
},
Expand Down
1 change: 1 addition & 0 deletions packages/eslint-plugin/jest.config.js
Expand Up @@ -3,6 +3,7 @@
// @ts-check
/** @type {import('@jest/types').Config.InitialOptions} */
module.exports = {
resolver: '<rootDir>/../../jest-resolver.js',
globals: {
'ts-jest': {
isolatedModules: true,
Expand Down
2 changes: 1 addition & 1 deletion packages/eslint-plugin/package.json
Expand Up @@ -63,7 +63,7 @@
},
"peerDependencies": {
"@typescript-eslint/parser": "^4.0.0",
"eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"
"eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
},
"peerDependenciesMeta": {
"typescript": {
Expand Down
5 changes: 4 additions & 1 deletion packages/eslint-plugin/src/rules/brace-style.ts
@@ -1,12 +1,14 @@
import { TSESTree } from '@typescript-eslint/experimental-utils';
import baseRule from 'eslint/lib/rules/brace-style';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import {
InferOptionsTypeFromRule,
InferMessageIdsTypeFromRule,
createRule,
isTokenOnSameLine,
} from '../util';

const baseRule = getEslintCoreRule('brace-style');

export type Options = InferOptionsTypeFromRule<typeof baseRule>;
export type MessageIds = InferMessageIdsTypeFromRule<typeof baseRule>;

Expand All @@ -22,6 +24,7 @@ export default createRule<Options, MessageIds>({
},
messages: baseRule.meta.messages,
fixable: baseRule.meta.fixable,
hasSuggestions: baseRule.meta.hasSuggestions,
schema: baseRule.meta.schema,
},
defaultOptions: ['1tbs'],
Expand Down
5 changes: 4 additions & 1 deletion packages/eslint-plugin/src/rules/comma-dangle.ts
@@ -1,10 +1,12 @@
import * as util from '../util';
import baseRule from 'eslint/lib/rules/comma-dangle';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import {
TSESTree,
AST_NODE_TYPES,
} from '@typescript-eslint/experimental-utils';

const baseRule = getEslintCoreRule('comma-dangle');

export type Options = util.InferOptionsTypeFromRule<typeof baseRule>;
export type MessageIds = util.InferMessageIdsTypeFromRule<typeof baseRule>;

Expand Down Expand Up @@ -82,6 +84,7 @@ export default util.createRule<Options, MessageIds>({
],
},
fixable: 'code',
hasSuggestions: baseRule.meta.hasSuggestions,
messages: baseRule.meta.messages,
},
defaultOptions: ['never'],
Expand Down
5 changes: 4 additions & 1 deletion packages/eslint-plugin/src/rules/dot-notation.ts
@@ -1,14 +1,16 @@
import { TSESTree } from '@typescript-eslint/experimental-utils';
import * as ts from 'typescript';
import * as tsutils from 'tsutils';
import baseRule from 'eslint/lib/rules/dot-notation';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import {
createRule,
getParserServices,
InferMessageIdsTypeFromRule,
InferOptionsTypeFromRule,
} from '../util';

const baseRule = getEslintCoreRule('dot-notation');

export type Options = InferOptionsTypeFromRule<typeof baseRule>;
export type MessageIds = InferMessageIdsTypeFromRule<typeof baseRule>;

Expand Down Expand Up @@ -52,6 +54,7 @@ export default createRule<Options, MessageIds>({
},
],
fixable: baseRule.meta.fixable,
hasSuggestions: baseRule.meta.hasSuggestions,
messages: baseRule.meta.messages,
},
defaultOptions: [
Expand Down
5 changes: 4 additions & 1 deletion packages/eslint-plugin/src/rules/indent.ts
Expand Up @@ -9,9 +9,11 @@ import {
TSESTree,
AST_NODE_TYPES,
} from '@typescript-eslint/experimental-utils';
import baseRule from 'eslint/lib/rules/indent';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import * as util from '../util';

const baseRule = getEslintCoreRule('indent');

type Options = util.InferOptionsTypeFromRule<typeof baseRule>;
type MessageIds = util.InferMessageIdsTypeFromRule<typeof baseRule>;

Expand Down Expand Up @@ -96,6 +98,7 @@ export default util.createRule<Options, MessageIds>({
extendsBaseRule: true,
},
fixable: 'whitespace',
hasSuggestions: baseRule.meta.hasSuggestions,
schema: baseRule.meta.schema,
messages: baseRule.meta.messages ?? {
wrongIndentation:
Expand Down
5 changes: 4 additions & 1 deletion packages/eslint-plugin/src/rules/init-declarations.ts
Expand Up @@ -2,13 +2,15 @@ import {
TSESTree,
AST_NODE_TYPES,
} from '@typescript-eslint/experimental-utils';
import baseRule from 'eslint/lib/rules/init-declarations';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import {
InferOptionsTypeFromRule,
InferMessageIdsTypeFromRule,
createRule,
} from '../util';

const baseRule = getEslintCoreRule('init-declarations');

export type Options = InferOptionsTypeFromRule<typeof baseRule>;
export type MessageIds = InferMessageIdsTypeFromRule<typeof baseRule>;

Expand All @@ -23,6 +25,7 @@ export default createRule<Options, MessageIds>({
recommended: false,
extendsBaseRule: true,
},
hasSuggestions: baseRule.meta.hasSuggestions,
schema: baseRule.meta.schema,
messages: baseRule.meta.messages ?? {
initialized:
Expand Down
5 changes: 4 additions & 1 deletion packages/eslint-plugin/src/rules/keyword-spacing.ts
@@ -1,7 +1,9 @@
import { AST_TOKEN_TYPES } from '@typescript-eslint/experimental-utils';
import baseRule from 'eslint/lib/rules/keyword-spacing';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import * as util from '../util';

const baseRule = getEslintCoreRule('keyword-spacing');

export type Options = util.InferOptionsTypeFromRule<typeof baseRule>;
export type MessageIds = util.InferMessageIdsTypeFromRule<typeof baseRule>;

Expand All @@ -16,6 +18,7 @@ export default util.createRule<Options, MessageIds>({
extendsBaseRule: true,
},
fixable: 'whitespace',
hasSuggestions: baseRule.meta.hasSuggestions,
schema: baseRule.meta.schema,
messages: baseRule.meta.messages ?? {
expectedBefore: 'Expected space(s) before "{{value}}".',
Expand Down
Expand Up @@ -2,9 +2,11 @@ import {
AST_NODE_TYPES,
TSESTree,
} from '@typescript-eslint/experimental-utils';
import baseRule from 'eslint/lib/rules/lines-between-class-members';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import * as util from '../util';

const baseRule = getEslintCoreRule('lines-between-class-members');

type Options = util.InferOptionsTypeFromRule<typeof baseRule>;
type MessageIds = util.InferMessageIdsTypeFromRule<typeof baseRule>;

Expand All @@ -31,6 +33,7 @@ export default util.createRule<Options, MessageIds>({
extendsBaseRule: true,
},
fixable: 'whitespace',
hasSuggestions: baseRule.meta.hasSuggestions,
schema,
messages: baseRule.meta.messages ?? {
never: 'Unexpected blank line between class members.',
Expand Down
Expand Up @@ -17,6 +17,7 @@ export default util.createRule({
recommended: false,
},
fixable: 'code',
hasSuggestions: true,
messages: {
confusingEqual:
'Confusing combinations of non-null assertion and equal test like "a! == b", which looks very similar to not equal "a !== b"',
Expand Down
Expand Up @@ -71,6 +71,7 @@ export default util.createRule<Options, MessageId>({
],
type: 'problem',
fixable: 'code',
hasSuggestions: true,
},
defaultOptions: [{}],

Expand Down
42 changes: 35 additions & 7 deletions packages/eslint-plugin/src/rules/no-dupe-class-members.ts
@@ -1,7 +1,12 @@
import { AST_NODE_TYPES } from '@typescript-eslint/experimental-utils';
import baseRule from 'eslint/lib/rules/no-dupe-class-members';
import {
AST_NODE_TYPES,
TSESTree,
} from '@typescript-eslint/experimental-utils';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import * as util from '../util';

const baseRule = getEslintCoreRule('no-dupe-class-members');

type Options = util.InferOptionsTypeFromRule<typeof baseRule>;
type MessageIds = util.InferMessageIdsTypeFromRule<typeof baseRule>;

Expand All @@ -15,16 +20,18 @@ export default util.createRule<Options, MessageIds>({
recommended: false,
extendsBaseRule: true,
},
hasSuggestions: baseRule.meta.hasSuggestions,
schema: baseRule.meta.schema,
messages: baseRule.meta.messages,
},
defaultOptions: [],
create(context) {
const rules = baseRule.create(context);

return {
...rules,
MethodDefinition(node): void {
function wrapMemberDefinitionListener(
coreListener: (node: TSESTree.MethodDefinition) => void,
): (node: TSESTree.MethodDefinition) => void {
return (node: TSESTree.MethodDefinition): void => {
if (node.computed) {
return;
}
Expand All @@ -33,8 +40,29 @@ export default util.createRule<Options, MessageIds>({
return;
}

return rules.MethodDefinition(node);
},
return coreListener(node);
};
}

return {
...rules,
// for ESLint <= v7
...(rules.MethodDefinition
? {
MethodDefinition: wrapMemberDefinitionListener(
rules.MethodDefinition,
),
}
: {}),
// for ESLint v8
...(rules['MethodDefinition, PropertyDefinition']
? {
'MethodDefinition, PropertyDefinition':
wrapMemberDefinitionListener(
rules['MethodDefinition, PropertyDefinition'],
),
}
: {}),
};
},
});
5 changes: 4 additions & 1 deletion packages/eslint-plugin/src/rules/no-duplicate-imports.ts
Expand Up @@ -2,9 +2,11 @@ import {
AST_NODE_TYPES,
TSESTree,
} from '@typescript-eslint/experimental-utils';
import baseRule from 'eslint/lib/rules/no-duplicate-imports';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import * as util from '../util';

const baseRule = getEslintCoreRule('no-duplicate-imports');

type Options = util.InferOptionsTypeFromRule<typeof baseRule>;
type MessageIds = util.InferMessageIdsTypeFromRule<typeof baseRule>;

Expand All @@ -18,6 +20,7 @@ export default util.createRule<Options, MessageIds>({
recommended: false,
extendsBaseRule: true,
},
hasSuggestions: baseRule.meta.hasSuggestions,
schema: baseRule.meta.schema,
messages: {
...baseRule.meta.messages,
Expand Down
5 changes: 4 additions & 1 deletion packages/eslint-plugin/src/rules/no-empty-function.ts
Expand Up @@ -2,9 +2,11 @@ import {
AST_NODE_TYPES,
TSESTree,
} from '@typescript-eslint/experimental-utils';
import baseRule from 'eslint/lib/rules/no-empty-function';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import * as util from '../util';

const baseRule = getEslintCoreRule('no-empty-function');

type Options = util.InferOptionsTypeFromRule<typeof baseRule>;
type MessageIds = util.InferMessageIdsTypeFromRule<typeof baseRule>;

Expand Down Expand Up @@ -47,6 +49,7 @@ export default util.createRule<Options, MessageIds>({
recommended: 'error',
extendsBaseRule: true,
},
hasSuggestions: baseRule.meta.hasSuggestions,
schema: [schema],
messages: baseRule.meta.messages,
},
Expand Down
1 change: 1 addition & 0 deletions packages/eslint-plugin/src/rules/no-empty-interface.ts
Expand Up @@ -19,6 +19,7 @@ export default util.createRule<Options, MessageIds>({
suggestion: true,
},
fixable: 'code',
hasSuggestions: true,
messages: {
noEmpty: 'An empty interface is equivalent to `{}`.',
noEmptyWithSuper:
Expand Down
1 change: 1 addition & 0 deletions packages/eslint-plugin/src/rules/no-explicit-any.ts
Expand Up @@ -24,6 +24,7 @@ export default util.createRule<Options, MessageIds>({
suggestion: true,
},
fixable: 'code',
hasSuggestions: true,
messages: {
unexpectedAny: 'Unexpected any. Specify a different type.',
suggestUnknown:
Expand Down
5 changes: 4 additions & 1 deletion packages/eslint-plugin/src/rules/no-extra-parens.ts
Expand Up @@ -6,9 +6,11 @@ import {
TSESTree,
TSESLint,
} from '@typescript-eslint/experimental-utils';
import baseRule from 'eslint/lib/rules/no-extra-parens';
import { getEslintCoreRule } from '../util/getEslintCoreRule';
import * as util from '../util';

const baseRule = getEslintCoreRule('no-extra-parens');

type Options = util.InferOptionsTypeFromRule<typeof baseRule>;
type MessageIds = util.InferMessageIdsTypeFromRule<typeof baseRule>;

Expand All @@ -23,6 +25,7 @@ export default util.createRule<Options, MessageIds>({
extendsBaseRule: true,
},
fixable: 'code',
hasSuggestions: baseRule.meta.hasSuggestions,
schema: baseRule.meta.schema,
messages: baseRule.meta.messages,
},
Expand Down