diff --git a/.cspell.json b/.cspell.json index c74d69186b9..c4de52f5432 100644 --- a/.cspell.json +++ b/.cspell.json @@ -47,6 +47,7 @@ "bigint", "bivariant", "blockless", + "camelcase", "codebases", "Codecov", "contravariant", diff --git a/.eslintrc.js b/.eslintrc.js index df695f85e94..68b9cc254da 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -78,7 +78,7 @@ module.exports = { '@typescript-eslint/internal/prefer-ast-types-enum': 'error', // - // eslint base + // eslint-base // curly: ['error', 'all'], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e6ae55fdfa9..8513c215e6d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,6 +45,10 @@ jobs: yarn --ignore-engines --frozen-lockfile --ignore-scripts yarn check-clean-workspace-after-install + - name: Patch Dependencies + run: | + yarn patch-package + - name: Build run: | yarn build @@ -87,6 +91,10 @@ jobs: yarn --ignore-engines --frozen-lockfile --ignore-scripts yarn check-clean-workspace-after-install + - name: Patch Dependencies + run: | + yarn patch-package + - name: Build run: | yarn build @@ -165,6 +173,10 @@ jobs: yarn --ignore-engines --frozen-lockfile --ignore-scripts yarn check-clean-workspace-after-install + - name: Patch Dependencies + run: | + yarn patch-package + - name: Build run: | yarn build @@ -208,6 +220,10 @@ jobs: yarn --ignore-engines --frozen-lockfile --ignore-scripts yarn check-clean-workspace-after-install + - name: Patch Dependencies + run: | + yarn patch-package + - name: Build run: | yarn build @@ -247,6 +263,10 @@ jobs: yarn --ignore-engines --frozen-lockfile --ignore-scripts yarn check-clean-workspace-after-install + - name: Patch Dependencies + run: | + yarn patch-package + - name: Build run: | yarn build @@ -322,6 +342,10 @@ jobs: yarn --ignore-engines --frozen-lockfile --ignore-scripts yarn check-clean-workspace-after-install + - name: Patch Dependencies + run: | + yarn patch-package + - name: Build run: | yarn build diff --git a/package.json b/package.json index 45b57d31e39..33a5a3de115 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "lint-markdown-fix": "yarn lint-markdown --fix", "lint-markdown": "markdownlint \"**/*.md\" --config=.markdownlint.json --ignore-path=.markdownlintignore", "lint": "eslint . --ext .js,.ts", - "postinstall": "yarn husky install && yarn build", + "postinstall": "patch-package && yarn husky install && yarn build", "pre-commit": "yarn lint-staged", "pre-push": "yarn check-format", "test": "nx run-many --target=test --all --parallel", @@ -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", @@ -115,6 +116,7 @@ "make-dir": "^3.1.0", "markdownlint-cli": "^0.28.1", "node-fetch": "^2.6.1", + "patch-package": "^6.4.7", "prettier": "2.3.2", "pretty-format": "^27.0.2", "rimraf": "^3.0.2", diff --git a/packages/eslint-plugin-internal/jest.config.js b/packages/eslint-plugin-internal/jest.config.js index cce8d6c61ba..bf4e270e376 100644 --- a/packages/eslint-plugin-internal/jest.config.js +++ b/packages/eslint-plugin-internal/jest.config.js @@ -3,6 +3,7 @@ // @ts-check /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { + resolver: '/../../tests/jest-resolver.js', globals: { 'ts-jest': { isolatedModules: true, diff --git a/packages/eslint-plugin-internal/src/rules/no-poorly-typed-ts-props.ts b/packages/eslint-plugin-internal/src/rules/no-poorly-typed-ts-props.ts index d5554ec57d5..5ca9057ad1d 100644 --- a/packages/eslint-plugin-internal/src/rules/no-poorly-typed-ts-props.ts +++ b/packages/eslint-plugin-internal/src/rules/no-poorly-typed-ts-props.ts @@ -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.', diff --git a/packages/eslint-plugin-tslint/jest.config.js b/packages/eslint-plugin-tslint/jest.config.js index 76cf7150459..37b87a10d75 100644 --- a/packages/eslint-plugin-tslint/jest.config.js +++ b/packages/eslint-plugin-tslint/jest.config.js @@ -3,6 +3,7 @@ // @ts-check /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { + resolver: '/../../tests/jest-resolver.js', globals: { 'ts-jest': { isolatedModules: true, diff --git a/packages/eslint-plugin-tslint/package.json b/packages/eslint-plugin-tslint/package.json index fda4f9fe502..c7785cf5cab 100644 --- a/packages/eslint-plugin-tslint/package.json +++ b/packages/eslint-plugin-tslint/package.json @@ -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": "*" }, diff --git a/packages/eslint-plugin/jest.config.js b/packages/eslint-plugin/jest.config.js index cce8d6c61ba..bf4e270e376 100644 --- a/packages/eslint-plugin/jest.config.js +++ b/packages/eslint-plugin/jest.config.js @@ -3,6 +3,7 @@ // @ts-check /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { + resolver: '/../../tests/jest-resolver.js', globals: { 'ts-jest': { isolatedModules: true, diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 3412b614384..5ee6a044ab5 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -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": { diff --git a/packages/eslint-plugin/src/rules/brace-style.ts b/packages/eslint-plugin/src/rules/brace-style.ts index 4d981763cf4..8bd77aa12ff 100644 --- a/packages/eslint-plugin/src/rules/brace-style.ts +++ b/packages/eslint-plugin/src/rules/brace-style.ts @@ -1,5 +1,5 @@ import { TSESTree } from '@typescript-eslint/experimental-utils'; -import baseRule from 'eslint/lib/rules/brace-style'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import { InferOptionsTypeFromRule, InferMessageIdsTypeFromRule, @@ -7,6 +7,8 @@ import { isTokenOnSameLine, } from '../util'; +const baseRule = getESLintCoreRule('brace-style'); + export type Options = InferOptionsTypeFromRule; export type MessageIds = InferMessageIdsTypeFromRule; @@ -22,6 +24,7 @@ export default createRule({ }, messages: baseRule.meta.messages, fixable: baseRule.meta.fixable, + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, }, defaultOptions: ['1tbs'], diff --git a/packages/eslint-plugin/src/rules/comma-dangle.ts b/packages/eslint-plugin/src/rules/comma-dangle.ts index 1e5049e3fea..9c212cca47e 100644 --- a/packages/eslint-plugin/src/rules/comma-dangle.ts +++ b/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; export type MessageIds = util.InferMessageIdsTypeFromRule; @@ -83,6 +85,7 @@ export default util.createRule({ additionalProperties: false, }, fixable: 'code', + hasSuggestions: baseRule.meta.hasSuggestions, messages: baseRule.meta.messages, }, defaultOptions: ['never'], diff --git a/packages/eslint-plugin/src/rules/dot-notation.ts b/packages/eslint-plugin/src/rules/dot-notation.ts index d0757f55a08..fef8cd45c18 100644 --- a/packages/eslint-plugin/src/rules/dot-notation.ts +++ b/packages/eslint-plugin/src/rules/dot-notation.ts @@ -1,7 +1,7 @@ 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, @@ -9,6 +9,8 @@ import { InferOptionsTypeFromRule, } from '../util'; +const baseRule = getESLintCoreRule('dot-notation'); + export type Options = InferOptionsTypeFromRule; export type MessageIds = InferMessageIdsTypeFromRule; @@ -52,6 +54,7 @@ export default createRule({ }, ], fixable: baseRule.meta.fixable, + hasSuggestions: baseRule.meta.hasSuggestions, messages: baseRule.meta.messages, }, defaultOptions: [ diff --git a/packages/eslint-plugin/src/rules/indent.ts b/packages/eslint-plugin/src/rules/indent.ts index b25586a0e8b..129754543c8 100644 --- a/packages/eslint-plugin/src/rules/indent.ts +++ b/packages/eslint-plugin/src/rules/indent.ts @@ -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; type MessageIds = util.InferMessageIdsTypeFromRule; @@ -96,6 +98,7 @@ export default util.createRule({ extendsBaseRule: true, }, fixable: 'whitespace', + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages ?? { wrongIndentation: diff --git a/packages/eslint-plugin/src/rules/init-declarations.ts b/packages/eslint-plugin/src/rules/init-declarations.ts index 5706006852b..4557faeb7d7 100644 --- a/packages/eslint-plugin/src/rules/init-declarations.ts +++ b/packages/eslint-plugin/src/rules/init-declarations.ts @@ -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; export type MessageIds = InferMessageIdsTypeFromRule; @@ -23,6 +25,7 @@ export default createRule({ recommended: false, extendsBaseRule: true, }, + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages ?? { initialized: diff --git a/packages/eslint-plugin/src/rules/keyword-spacing.ts b/packages/eslint-plugin/src/rules/keyword-spacing.ts index 2265b260443..f7bedfc1194 100644 --- a/packages/eslint-plugin/src/rules/keyword-spacing.ts +++ b/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; export type MessageIds = util.InferMessageIdsTypeFromRule; @@ -16,6 +18,7 @@ export default util.createRule({ extendsBaseRule: true, }, fixable: 'whitespace', + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages ?? { expectedBefore: 'Expected space(s) before "{{value}}".', diff --git a/packages/eslint-plugin/src/rules/lines-between-class-members.ts b/packages/eslint-plugin/src/rules/lines-between-class-members.ts index fc89f43c15c..ee29c7db72f 100644 --- a/packages/eslint-plugin/src/rules/lines-between-class-members.ts +++ b/packages/eslint-plugin/src/rules/lines-between-class-members.ts @@ -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; type MessageIds = util.InferMessageIdsTypeFromRule; @@ -31,6 +33,7 @@ export default util.createRule({ extendsBaseRule: true, }, fixable: 'whitespace', + hasSuggestions: baseRule.meta.hasSuggestions, schema, messages: baseRule.meta.messages ?? { never: 'Unexpected blank line between class members.', diff --git a/packages/eslint-plugin/src/rules/no-confusing-non-null-assertion.ts b/packages/eslint-plugin/src/rules/no-confusing-non-null-assertion.ts index bcf561b5856..9a8a2667949 100644 --- a/packages/eslint-plugin/src/rules/no-confusing-non-null-assertion.ts +++ b/packages/eslint-plugin/src/rules/no-confusing-non-null-assertion.ts @@ -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"', diff --git a/packages/eslint-plugin/src/rules/no-confusing-void-expression.ts b/packages/eslint-plugin/src/rules/no-confusing-void-expression.ts index a9b715350e9..67029f1cc60 100644 --- a/packages/eslint-plugin/src/rules/no-confusing-void-expression.ts +++ b/packages/eslint-plugin/src/rules/no-confusing-void-expression.ts @@ -71,6 +71,7 @@ export default util.createRule({ ], type: 'problem', fixable: 'code', + hasSuggestions: true, }, defaultOptions: [{}], diff --git a/packages/eslint-plugin/src/rules/no-dupe-class-members.ts b/packages/eslint-plugin/src/rules/no-dupe-class-members.ts index bc48b2a843e..0756e135fc9 100644 --- a/packages/eslint-plugin/src/rules/no-dupe-class-members.ts +++ b/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; type MessageIds = util.InferMessageIdsTypeFromRule; @@ -15,6 +20,7 @@ export default util.createRule({ recommended: false, extendsBaseRule: true, }, + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages, }, @@ -22,9 +28,10 @@ export default util.createRule({ 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; } @@ -33,8 +40,29 @@ export default util.createRule({ 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'], + ), + } + : {}), }; }, }); diff --git a/packages/eslint-plugin/src/rules/no-duplicate-imports.ts b/packages/eslint-plugin/src/rules/no-duplicate-imports.ts index a6f368902e3..ef02e3712b9 100644 --- a/packages/eslint-plugin/src/rules/no-duplicate-imports.ts +++ b/packages/eslint-plugin/src/rules/no-duplicate-imports.ts @@ -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; type MessageIds = util.InferMessageIdsTypeFromRule; @@ -18,6 +20,7 @@ export default util.createRule({ recommended: false, extendsBaseRule: true, }, + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: { ...baseRule.meta.messages, diff --git a/packages/eslint-plugin/src/rules/no-empty-function.ts b/packages/eslint-plugin/src/rules/no-empty-function.ts index 246680c60e3..d34618e0354 100644 --- a/packages/eslint-plugin/src/rules/no-empty-function.ts +++ b/packages/eslint-plugin/src/rules/no-empty-function.ts @@ -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; type MessageIds = util.InferMessageIdsTypeFromRule; @@ -47,6 +49,7 @@ export default util.createRule({ recommended: 'error', extendsBaseRule: true, }, + hasSuggestions: baseRule.meta.hasSuggestions, schema: [schema], messages: baseRule.meta.messages, }, diff --git a/packages/eslint-plugin/src/rules/no-empty-interface.ts b/packages/eslint-plugin/src/rules/no-empty-interface.ts index 11ed8582c75..d9c8c2477b8 100644 --- a/packages/eslint-plugin/src/rules/no-empty-interface.ts +++ b/packages/eslint-plugin/src/rules/no-empty-interface.ts @@ -19,6 +19,7 @@ export default util.createRule({ suggestion: true, }, fixable: 'code', + hasSuggestions: true, messages: { noEmpty: 'An empty interface is equivalent to `{}`.', noEmptyWithSuper: diff --git a/packages/eslint-plugin/src/rules/no-explicit-any.ts b/packages/eslint-plugin/src/rules/no-explicit-any.ts index 4e6b8c34fc1..8be3ce8d023 100644 --- a/packages/eslint-plugin/src/rules/no-explicit-any.ts +++ b/packages/eslint-plugin/src/rules/no-explicit-any.ts @@ -24,6 +24,7 @@ export default util.createRule({ suggestion: true, }, fixable: 'code', + hasSuggestions: true, messages: { unexpectedAny: 'Unexpected any. Specify a different type.', suggestUnknown: diff --git a/packages/eslint-plugin/src/rules/no-extra-parens.ts b/packages/eslint-plugin/src/rules/no-extra-parens.ts index 774fb44b389..6aa540a9be5 100644 --- a/packages/eslint-plugin/src/rules/no-extra-parens.ts +++ b/packages/eslint-plugin/src/rules/no-extra-parens.ts @@ -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; type MessageIds = util.InferMessageIdsTypeFromRule; @@ -23,6 +25,7 @@ export default util.createRule({ extendsBaseRule: true, }, fixable: 'code', + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages, }, diff --git a/packages/eslint-plugin/src/rules/no-extra-semi.ts b/packages/eslint-plugin/src/rules/no-extra-semi.ts index d1ffdf61d8d..d8db4ba7904 100644 --- a/packages/eslint-plugin/src/rules/no-extra-semi.ts +++ b/packages/eslint-plugin/src/rules/no-extra-semi.ts @@ -1,6 +1,8 @@ -import baseRule from 'eslint/lib/rules/no-extra-semi'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import * as util from '../util'; +const baseRule = getESLintCoreRule('no-extra-semi'); + type Options = util.InferOptionsTypeFromRule; type MessageIds = util.InferMessageIdsTypeFromRule; @@ -15,6 +17,7 @@ export default util.createRule({ extendsBaseRule: true, }, fixable: 'code', + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages, }, @@ -25,7 +28,13 @@ export default util.createRule({ return { ...rules, ClassProperty(node): void { - rules.MethodDefinition(node as never); + if (rules.MethodDefinition) { + // for ESLint <= v7 + rules.MethodDefinition(node as never); + } else { + // for ESLint v8 + rules['MethodDefinition, PropertyDefinition']?.(node as never); + } }, }; }, diff --git a/packages/eslint-plugin/src/rules/no-floating-promises.ts b/packages/eslint-plugin/src/rules/no-floating-promises.ts index 905dfd06fcf..ae196cf5288 100644 --- a/packages/eslint-plugin/src/rules/no-floating-promises.ts +++ b/packages/eslint-plugin/src/rules/no-floating-promises.ts @@ -27,6 +27,7 @@ export default util.createRule({ suggestion: true, requiresTypeChecking: true, }, + hasSuggestions: true, messages: { floating: 'Promises must be handled appropriately.', floatingVoid: diff --git a/packages/eslint-plugin/src/rules/no-implicit-any-catch.ts b/packages/eslint-plugin/src/rules/no-implicit-any-catch.ts index aed526f8ab0..2152a5ac087 100644 --- a/packages/eslint-plugin/src/rules/no-implicit-any-catch.ts +++ b/packages/eslint-plugin/src/rules/no-implicit-any-catch.ts @@ -25,6 +25,7 @@ export default util.createRule({ suggestion: true, }, fixable: 'code', + hasSuggestions: true, messages: { implicitAnyInCatch: 'Implicit any in catch clause', explicitAnyInCatch: 'Explicit any in catch clause', diff --git a/packages/eslint-plugin/src/rules/no-invalid-this.ts b/packages/eslint-plugin/src/rules/no-invalid-this.ts index 5d056308771..2d802cdba04 100644 --- a/packages/eslint-plugin/src/rules/no-invalid-this.ts +++ b/packages/eslint-plugin/src/rules/no-invalid-this.ts @@ -2,13 +2,15 @@ import { TSESTree, AST_NODE_TYPES, } from '@typescript-eslint/experimental-utils'; -import baseRule from 'eslint/lib/rules/no-invalid-this'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import { InferOptionsTypeFromRule, createRule, InferMessageIdsTypeFromRule, } from '../util'; +const baseRule = getESLintCoreRule('no-invalid-this'); + export type Options = InferOptionsTypeFromRule; export type MessageIds = InferMessageIdsTypeFromRule; @@ -26,6 +28,7 @@ export default createRule({ messages: baseRule.meta.messages ?? { unexpectedThis: "Unexpected 'this'.", }, + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, }, defaultOptions: [{ capIsConstructor: true }], diff --git a/packages/eslint-plugin/src/rules/no-loop-func.ts b/packages/eslint-plugin/src/rules/no-loop-func.ts index 44d0178e867..5560acf0952 100644 --- a/packages/eslint-plugin/src/rules/no-loop-func.ts +++ b/packages/eslint-plugin/src/rules/no-loop-func.ts @@ -3,9 +3,11 @@ import { TSESLint, TSESTree, } from '@typescript-eslint/experimental-utils'; -import baseRule from 'eslint/lib/rules/no-loop-func'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import * as util from '../util'; +const baseRule = getESLintCoreRule('no-loop-func'); + type Options = util.InferOptionsTypeFromRule; type MessageIds = util.InferMessageIdsTypeFromRule; @@ -20,6 +22,7 @@ export default util.createRule({ recommended: false, extendsBaseRule: true, }, + hasSuggestions: baseRule.meta.hasSuggestions, schema: [], messages: baseRule?.meta.messages ?? { unsafeRefs: diff --git a/packages/eslint-plugin/src/rules/no-loss-of-precision.ts b/packages/eslint-plugin/src/rules/no-loss-of-precision.ts index e9d52852668..3b53661a026 100644 --- a/packages/eslint-plugin/src/rules/no-loss-of-precision.ts +++ b/packages/eslint-plugin/src/rules/no-loss-of-precision.ts @@ -1,20 +1,13 @@ import { TSESTree } from '@typescript-eslint/experimental-utils'; -import BaseRule from 'eslint/lib/rules/no-loss-of-precision'; import * as util from '../util'; +import { maybeGetESLintCoreRule } from '../util/getESLintCoreRule'; -const baseRule = ((): typeof BaseRule | null => { - try { - return require('eslint/lib/rules/no-loss-of-precision') as - | typeof BaseRule - | null; - } catch { - /* istanbul ignore next */ - return null; - } -})(); +const baseRule = maybeGetESLintCoreRule('no-loss-of-precision'); -type Options = util.InferOptionsTypeFromRule; -type MessageIds = util.InferMessageIdsTypeFromRule; +type Options = util.InferOptionsTypeFromRule>; +type MessageIds = util.InferMessageIdsTypeFromRule< + NonNullable +>; export default util.createRule({ name: 'no-loss-of-precision', @@ -26,6 +19,7 @@ export default util.createRule({ recommended: false, extendsBaseRule: true, }, + hasSuggestions: baseRule?.meta.hasSuggestions, schema: [], messages: baseRule?.meta.messages ?? { noLossOfPrecision: '' }, }, diff --git a/packages/eslint-plugin/src/rules/no-magic-numbers.ts b/packages/eslint-plugin/src/rules/no-magic-numbers.ts index 1f45a489d35..20d06f05f56 100644 --- a/packages/eslint-plugin/src/rules/no-magic-numbers.ts +++ b/packages/eslint-plugin/src/rules/no-magic-numbers.ts @@ -2,9 +2,11 @@ import { TSESTree, AST_NODE_TYPES, } from '@typescript-eslint/experimental-utils'; -import baseRule from 'eslint/lib/rules/no-magic-numbers'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import * as util from '../util'; +const baseRule = getESLintCoreRule('no-magic-numbers'); + type Options = util.InferOptionsTypeFromRule; type MessageIds = util.InferMessageIdsTypeFromRule; @@ -22,6 +24,7 @@ export default util.createRule({ recommended: false, extendsBaseRule: true, }, + hasSuggestions: baseRule.meta.hasSuggestions, // Extend base schema with additional property to ignore TS numeric literal types schema: [ { diff --git a/packages/eslint-plugin/src/rules/no-non-null-asserted-optional-chain.ts b/packages/eslint-plugin/src/rules/no-non-null-asserted-optional-chain.ts index f5652b257c1..1d9c8f4aabc 100644 --- a/packages/eslint-plugin/src/rules/no-non-null-asserted-optional-chain.ts +++ b/packages/eslint-plugin/src/rules/no-non-null-asserted-optional-chain.ts @@ -26,6 +26,7 @@ export default util.createRule({ recommended: 'error', suggestion: true, }, + hasSuggestions: true, messages: { noNonNullOptionalChain: 'Optional chain expressions can return undefined by design - using a non-null assertion is unsafe and wrong.', diff --git a/packages/eslint-plugin/src/rules/no-non-null-assertion.ts b/packages/eslint-plugin/src/rules/no-non-null-assertion.ts index 4012693c755..ceba7fefd15 100644 --- a/packages/eslint-plugin/src/rules/no-non-null-assertion.ts +++ b/packages/eslint-plugin/src/rules/no-non-null-assertion.ts @@ -17,6 +17,7 @@ export default util.createRule<[], MessageIds>({ recommended: 'warn', suggestion: true, }, + hasSuggestions: true, messages: { noNonNull: 'Forbidden non-null assertion.', suggestOptionalChain: diff --git a/packages/eslint-plugin/src/rules/no-unused-expressions.ts b/packages/eslint-plugin/src/rules/no-unused-expressions.ts index 8116cbf704e..f2f0e2c73b2 100644 --- a/packages/eslint-plugin/src/rules/no-unused-expressions.ts +++ b/packages/eslint-plugin/src/rules/no-unused-expressions.ts @@ -2,9 +2,11 @@ import { AST_NODE_TYPES, TSESTree, } from '@typescript-eslint/experimental-utils'; -import baseRule from 'eslint/lib/rules/no-unused-expressions'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import * as util from '../util'; +const baseRule = getESLintCoreRule('no-unused-expressions'); + type MessageIds = util.InferMessageIdsTypeFromRule; type Options = util.InferOptionsTypeFromRule; @@ -18,6 +20,7 @@ export default util.createRule({ recommended: false, extendsBaseRule: true, }, + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages ?? { unusedExpression: diff --git a/packages/eslint-plugin/src/rules/no-useless-constructor.ts b/packages/eslint-plugin/src/rules/no-useless-constructor.ts index 2ad9c765c4e..a4532ce7286 100644 --- a/packages/eslint-plugin/src/rules/no-useless-constructor.ts +++ b/packages/eslint-plugin/src/rules/no-useless-constructor.ts @@ -2,9 +2,11 @@ import { TSESTree, AST_NODE_TYPES, } from '@typescript-eslint/experimental-utils'; -import baseRule from 'eslint/lib/rules/no-useless-constructor'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import * as util from '../util'; +const baseRule = getESLintCoreRule('no-useless-constructor'); + type Options = util.InferOptionsTypeFromRule; type MessageIds = util.InferMessageIdsTypeFromRule; @@ -53,6 +55,7 @@ export default util.createRule({ recommended: false, extendsBaseRule: true, }, + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages ?? { noUselessConstructor: 'Useless constructor.', diff --git a/packages/eslint-plugin/src/rules/object-curly-spacing.ts b/packages/eslint-plugin/src/rules/object-curly-spacing.ts index 00c73820fd7..090bd8e1e95 100644 --- a/packages/eslint-plugin/src/rules/object-curly-spacing.ts +++ b/packages/eslint-plugin/src/rules/object-curly-spacing.ts @@ -3,7 +3,7 @@ import { AST_TOKEN_TYPES, TSESTree, } from '@typescript-eslint/experimental-utils'; -import baseRule from 'eslint/lib/rules/object-curly-spacing'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import { createRule, InferMessageIdsTypeFromRule, @@ -13,6 +13,8 @@ import { isTokenOnSameLine, } from '../util'; +const baseRule = getESLintCoreRule('object-curly-spacing'); + export type Options = InferOptionsTypeFromRule; export type MessageIds = InferMessageIdsTypeFromRule; diff --git a/packages/eslint-plugin/src/rules/prefer-as-const.ts b/packages/eslint-plugin/src/rules/prefer-as-const.ts index 91f43242021..aeaa6fcdd7a 100644 --- a/packages/eslint-plugin/src/rules/prefer-as-const.ts +++ b/packages/eslint-plugin/src/rules/prefer-as-const.ts @@ -16,6 +16,7 @@ export default util.createRule({ suggestion: true, }, fixable: 'code', + hasSuggestions: true, messages: { preferConstAssertion: 'Expected a `const` instead of a literal type assertion.', diff --git a/packages/eslint-plugin/src/rules/prefer-enum-initializers.ts b/packages/eslint-plugin/src/rules/prefer-enum-initializers.ts index 1a5c1248c89..d590cab7fad 100644 --- a/packages/eslint-plugin/src/rules/prefer-enum-initializers.ts +++ b/packages/eslint-plugin/src/rules/prefer-enum-initializers.ts @@ -14,6 +14,7 @@ export default util.createRule<[], MessageIds>({ recommended: false, suggestion: true, }, + hasSuggestions: true, messages: { defineInitializer: "The value of the member '{{ name }}' should be explicitly defined", diff --git a/packages/eslint-plugin/src/rules/prefer-nullish-coalescing.ts b/packages/eslint-plugin/src/rules/prefer-nullish-coalescing.ts index fa6c1bb4e21..4fe3d021f70 100644 --- a/packages/eslint-plugin/src/rules/prefer-nullish-coalescing.ts +++ b/packages/eslint-plugin/src/rules/prefer-nullish-coalescing.ts @@ -26,6 +26,7 @@ export default util.createRule({ suggestion: true, requiresTypeChecking: true, }, + hasSuggestions: true, messages: { preferNullish: 'Prefer using nullish coalescing operator (`??`) instead of a logical or (`||`), as it is a safer operator.', diff --git a/packages/eslint-plugin/src/rules/prefer-optional-chain.ts b/packages/eslint-plugin/src/rules/prefer-optional-chain.ts index 0e15bf8f979..b1eff5e4ae7 100644 --- a/packages/eslint-plugin/src/rules/prefer-optional-chain.ts +++ b/packages/eslint-plugin/src/rules/prefer-optional-chain.ts @@ -41,6 +41,7 @@ export default util.createRule({ recommended: false, suggestion: true, }, + hasSuggestions: true, messages: { preferOptionalChain: "Prefer using an optional chain expression instead, as it's more concise and easier to read.", diff --git a/packages/eslint-plugin/src/rules/quotes.ts b/packages/eslint-plugin/src/rules/quotes.ts index 3cbdbce3d87..e4af60fd041 100644 --- a/packages/eslint-plugin/src/rules/quotes.ts +++ b/packages/eslint-plugin/src/rules/quotes.ts @@ -2,9 +2,11 @@ import { AST_NODE_TYPES, TSESTree, } from '@typescript-eslint/experimental-utils'; -import baseRule from 'eslint/lib/rules/quotes'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import * as util from '../util'; +const baseRule = getESLintCoreRule('quotes'); + export type Options = util.InferOptionsTypeFromRule; export type MessageIds = util.InferMessageIdsTypeFromRule; @@ -20,6 +22,7 @@ export default util.createRule({ extendsBaseRule: true, }, fixable: 'code', + hasSuggestions: baseRule.meta.hasSuggestions, messages: baseRule.meta.messages ?? { wrongQuotes: 'Strings must use {{description}}.', }, diff --git a/packages/eslint-plugin/src/rules/return-await.ts b/packages/eslint-plugin/src/rules/return-await.ts index 940dfe94023..1375d3028e1 100644 --- a/packages/eslint-plugin/src/rules/return-await.ts +++ b/packages/eslint-plugin/src/rules/return-await.ts @@ -28,6 +28,7 @@ export default util.createRule({ extendsBaseRule: 'no-return-await', }, fixable: 'code', + hasSuggestions: true, type: 'problem', messages: { nonPromiseAwait: diff --git a/packages/eslint-plugin/src/rules/semi.ts b/packages/eslint-plugin/src/rules/semi.ts index eccc264e461..05c4c6b1c3a 100644 --- a/packages/eslint-plugin/src/rules/semi.ts +++ b/packages/eslint-plugin/src/rules/semi.ts @@ -3,9 +3,11 @@ import { TSESLint, AST_NODE_TYPES, } from '@typescript-eslint/experimental-utils'; -import baseRule from 'eslint/lib/rules/semi'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import * as util from '../util'; +const baseRule = getESLintCoreRule('semi'); + export type Options = util.InferOptionsTypeFromRule; export type MessageIds = util.InferMessageIdsTypeFromRule; @@ -21,6 +23,7 @@ export default util.createRule({ extendsBaseRule: true, }, fixable: 'code', + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages ?? { missingSemi: 'Missing semicolon.', diff --git a/packages/eslint-plugin/src/rules/sort-type-union-intersection-members.ts b/packages/eslint-plugin/src/rules/sort-type-union-intersection-members.ts index af80720c290..cfcab2c0b2c 100644 --- a/packages/eslint-plugin/src/rules/sort-type-union-intersection-members.ts +++ b/packages/eslint-plugin/src/rules/sort-type-union-intersection-members.ts @@ -111,6 +111,7 @@ export default util.createRule({ recommended: false, }, fixable: 'code', + hasSuggestions: true, messages: { notSorted: '{{type}} type members must be sorted.', notSortedNamed: '{{type}} type {{name}} members must be sorted.', diff --git a/packages/eslint-plugin/src/rules/space-infix-ops.ts b/packages/eslint-plugin/src/rules/space-infix-ops.ts index 3a0a79ff1a3..86fb8d93d53 100644 --- a/packages/eslint-plugin/src/rules/space-infix-ops.ts +++ b/packages/eslint-plugin/src/rules/space-infix-ops.ts @@ -2,9 +2,11 @@ import { AST_TOKEN_TYPES, TSESTree, } from '@typescript-eslint/experimental-utils'; -import baseRule from 'eslint/lib/rules/space-infix-ops'; +import { getESLintCoreRule } from '../util/getESLintCoreRule'; import * as util from '../util'; +const baseRule = getESLintCoreRule('space-infix-ops'); + export type Options = util.InferOptionsTypeFromRule; export type MessageIds = util.InferMessageIdsTypeFromRule; @@ -22,6 +24,7 @@ export default util.createRule({ extendsBaseRule: true, }, fixable: baseRule.meta.fixable, + hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages ?? { missingSpace: "Operator '{{operator}}' must be spaced.", diff --git a/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts b/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts index 87796f9f427..1aca481e743 100644 --- a/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts +++ b/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts @@ -49,6 +49,7 @@ export default util.createRule({ meta: { type: 'suggestion', fixable: 'code', + hasSuggestions: true, docs: { description: 'Restricts the types allowed in boolean expressions', category: 'Best Practices', diff --git a/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts b/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts index 8881473da05..200dcb7c14c 100644 --- a/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts +++ b/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts @@ -21,6 +21,7 @@ export default createRule({ suggestion: true, requiresTypeChecking: true, }, + hasSuggestions: true, schema: [], messages: { switchIsNotExhaustive: diff --git a/packages/eslint-plugin/src/util/collectUnusedVariables.ts b/packages/eslint-plugin/src/util/collectUnusedVariables.ts index b36d07e818c..a1cfac27232 100644 --- a/packages/eslint-plugin/src/util/collectUnusedVariables.ts +++ b/packages/eslint-plugin/src/util/collectUnusedVariables.ts @@ -318,7 +318,7 @@ class UnusedVarsVisitor< protected TSMethodSignature = this.visitFunctionTypeSignature; protected TSModuleDeclaration(node: TSESTree.TSModuleDeclaration): void { - // global augmentation can be in any file, and they do not need exports + // -- global augmentation can be in any file, and they do not need exports if (node.global === true) { this.markVariableAsUsed('global', node.parent!); } diff --git a/packages/eslint-plugin/src/util/getESLintCoreRule.ts b/packages/eslint-plugin/src/util/getESLintCoreRule.ts new file mode 100644 index 00000000000..fdb2ca46df8 --- /dev/null +++ b/packages/eslint-plugin/src/util/getESLintCoreRule.ts @@ -0,0 +1,62 @@ +import { version } from 'eslint/package.json'; +import * as semver from 'semver'; +import { nullThrows } from './nullThrows'; + +const isESLintV8 = semver.major(version) >= 8; + +interface RuleMap { + 'arrow-parens': typeof import('eslint/lib/rules/arrow-parens'); + 'brace-style': typeof import('eslint/lib/rules/brace-style'); + 'comma-dangle': typeof import('eslint/lib/rules/comma-dangle'); + 'dot-notation': typeof import('eslint/lib/rules/dot-notation'); + indent: typeof import('eslint/lib/rules/indent'); + 'init-declarations': typeof import('eslint/lib/rules/init-declarations'); + 'keyword-spacing': typeof import('eslint/lib/rules/keyword-spacing'); + 'lines-between-class-members': typeof import('eslint/lib/rules/lines-between-class-members'); + 'no-dupe-args': typeof import('eslint/lib/rules/no-dupe-args'); + 'no-dupe-class-members': typeof import('eslint/lib/rules/no-dupe-class-members'); + 'no-duplicate-imports': typeof import('eslint/lib/rules/no-duplicate-imports'); + 'no-empty-function': typeof import('eslint/lib/rules/no-empty-function'); + 'no-extra-parens': typeof import('eslint/lib/rules/no-extra-parens'); + 'no-extra-semi': typeof import('eslint/lib/rules/no-extra-semi'); + 'no-implicit-globals': typeof import('eslint/lib/rules/no-implicit-globals'); + 'no-invalid-this': typeof import('eslint/lib/rules/no-invalid-this'); + 'no-loop-func': typeof import('eslint/lib/rules/no-loop-func'); + 'no-loss-of-precision': typeof import('eslint/lib/rules/no-loss-of-precision'); + 'no-magic-numbers': typeof import('eslint/lib/rules/no-magic-numbers'); + 'no-undef': typeof import('eslint/lib/rules/no-undef'); + 'no-unused-expressions': typeof import('eslint/lib/rules/no-unused-expressions'); + 'no-useless-constructor': typeof import('eslint/lib/rules/no-useless-constructor'); + 'no-restricted-globals': typeof import('eslint/lib/rules/no-restricted-globals'); + 'object-curly-spacing': typeof import('eslint/lib/rules/object-curly-spacing'); + 'prefer-const': typeof import('eslint/lib/rules/prefer-const'); + quotes: typeof import('eslint/lib/rules/quotes'); + semi: typeof import('eslint/lib/rules/semi'); + 'space-infix-ops': typeof import('eslint/lib/rules/space-infix-ops'); + strict: typeof import('eslint/lib/rules/strict'); +} + +type RuleId = keyof RuleMap; + +export const getESLintCoreRule: (ruleId: R) => RuleMap[R] = + isESLintV8 + ? (ruleId: R): RuleMap[R] => + nullThrows( + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + require('eslint/use-at-your-own-risk').builtinRules.get( + ruleId, + ) as RuleMap[R], + `ESLint's core rule '${ruleId}' not found.`, + ) + : (ruleId: R): RuleMap[R] => + require(`eslint/lib/rules/${ruleId}`) as RuleMap[R]; + +export function maybeGetESLintCoreRule( + ruleId: R, +): RuleMap[R] | null { + try { + return getESLintCoreRule(ruleId); + } catch { + return null; + } +} diff --git a/packages/eslint-plugin/tests/eslint-rules/arrow-parens.test.ts b/packages/eslint-plugin/tests/eslint-rules/arrow-parens.test.ts index 6d19021fa56..495bbe97e69 100644 --- a/packages/eslint-plugin/tests/eslint-rules/arrow-parens.test.ts +++ b/packages/eslint-plugin/tests/eslint-rules/arrow-parens.test.ts @@ -1,6 +1,8 @@ -import rule from 'eslint/lib/rules/arrow-parens'; +import { getESLintCoreRule } from '../../src/util/getESLintCoreRule'; import { RuleTester, noFormat } from '../RuleTester'; +const rule = getESLintCoreRule('arrow-parens'); + const ruleTester = new RuleTester({ parser: '@typescript-eslint/parser', }); diff --git a/packages/eslint-plugin/tests/eslint-rules/no-dupe-args.test.ts b/packages/eslint-plugin/tests/eslint-rules/no-dupe-args.test.ts index 0dc4807edb1..5bc8d99490d 100644 --- a/packages/eslint-plugin/tests/eslint-rules/no-dupe-args.test.ts +++ b/packages/eslint-plugin/tests/eslint-rules/no-dupe-args.test.ts @@ -1,6 +1,8 @@ -import rule from 'eslint/lib/rules/no-dupe-args'; +import { getESLintCoreRule } from '../../src/util/getESLintCoreRule'; import { RuleTester } from '../RuleTester'; +const rule = getESLintCoreRule('no-dupe-args'); + const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 6, diff --git a/packages/eslint-plugin/tests/eslint-rules/no-implicit-globals.test.ts b/packages/eslint-plugin/tests/eslint-rules/no-implicit-globals.test.ts index 2fc971bdef6..eb3fea348b5 100644 --- a/packages/eslint-plugin/tests/eslint-rules/no-implicit-globals.test.ts +++ b/packages/eslint-plugin/tests/eslint-rules/no-implicit-globals.test.ts @@ -1,6 +1,7 @@ -import rule from 'eslint/lib/rules/no-implicit-globals'; +import { getESLintCoreRule } from '../../src/util/getESLintCoreRule'; import { RuleTester } from '../RuleTester'; +const rule = getESLintCoreRule('no-implicit-globals'); const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 6, diff --git a/packages/eslint-plugin/tests/eslint-rules/no-restricted-globals.test.ts b/packages/eslint-plugin/tests/eslint-rules/no-restricted-globals.test.ts index 7a457a61784..6061c8ebb4e 100644 --- a/packages/eslint-plugin/tests/eslint-rules/no-restricted-globals.test.ts +++ b/packages/eslint-plugin/tests/eslint-rules/no-restricted-globals.test.ts @@ -1,6 +1,8 @@ -import rule from 'eslint/lib/rules/no-restricted-globals'; +import { getESLintCoreRule } from '../../src/util/getESLintCoreRule'; import { RuleTester } from '../RuleTester'; +const rule = getESLintCoreRule('no-restricted-globals'); + const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 6, diff --git a/packages/eslint-plugin/tests/eslint-rules/no-undef.test.ts b/packages/eslint-plugin/tests/eslint-rules/no-undef.test.ts index 4f2c9702411..9cff63994d3 100644 --- a/packages/eslint-plugin/tests/eslint-rules/no-undef.test.ts +++ b/packages/eslint-plugin/tests/eslint-rules/no-undef.test.ts @@ -1,6 +1,8 @@ -import rule from 'eslint/lib/rules/no-undef'; +import { getESLintCoreRule } from '../../src/util/getESLintCoreRule'; import { RuleTester } from '../RuleTester'; +const rule = getESLintCoreRule('no-undef'); + const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 6, diff --git a/packages/eslint-plugin/tests/eslint-rules/prefer-const.test.ts b/packages/eslint-plugin/tests/eslint-rules/prefer-const.test.ts index a051ebb6861..d3bce8cfdee 100644 --- a/packages/eslint-plugin/tests/eslint-rules/prefer-const.test.ts +++ b/packages/eslint-plugin/tests/eslint-rules/prefer-const.test.ts @@ -1,6 +1,8 @@ -import rule from 'eslint/lib/rules/prefer-const'; +import { getESLintCoreRule } from '../../src/util/getESLintCoreRule'; import { RuleTester } from '../RuleTester'; +const rule = getESLintCoreRule('prefer-const'); + const ruleTester = new RuleTester({ parser: '@typescript-eslint/parser', }); diff --git a/packages/eslint-plugin/tests/eslint-rules/strict.test.ts b/packages/eslint-plugin/tests/eslint-rules/strict.test.ts index 51d27c9bde9..83ad25a0605 100644 --- a/packages/eslint-plugin/tests/eslint-rules/strict.test.ts +++ b/packages/eslint-plugin/tests/eslint-rules/strict.test.ts @@ -1,6 +1,8 @@ -import rule from 'eslint/lib/rules/strict'; +import { getESLintCoreRule } from '../../src/util/getESLintCoreRule'; import { RuleTester } from '../RuleTester'; +const rule = getESLintCoreRule('strict'); + const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 6, diff --git a/packages/eslint-plugin/tests/rules/array-type.test.ts b/packages/eslint-plugin/tests/rules/array-type.test.ts index 6551bf6e7b9..3c2c1893a3f 100644 --- a/packages/eslint-plugin/tests/rules/array-type.test.ts +++ b/packages/eslint-plugin/tests/rules/array-type.test.ts @@ -1664,7 +1664,7 @@ interface FooInterface { ], }); -// eslint rule tester is not working with multi-pass +// -- eslint rule tester is not working with multi-pass // https://github.com/eslint/eslint/issues/11187 describe('array-type (nested)', () => { const linter = new TSESLint.Linter(); diff --git a/packages/eslint-plugin/tests/rules/no-duplicate-imports.test.ts b/packages/eslint-plugin/tests/rules/no-duplicate-imports.test.ts index 98e12fbeb7a..fae90720e7e 100644 --- a/packages/eslint-plugin/tests/rules/no-duplicate-imports.test.ts +++ b/packages/eslint-plugin/tests/rules/no-duplicate-imports.test.ts @@ -168,14 +168,6 @@ ruleTester.run('no-duplicate-imports', rule, { `, errors: [{ messageId: 'import' }], }, - { - code: ` - import foo from 'foo'; - export * from 'foo'; - `, - options: [{ includeExports: true }], - errors: [{ messageId: 'exportAs' }], - }, { code: ` import foo from 'foo'; diff --git a/packages/eslint-plugin/tests/rules/require-await.test.ts b/packages/eslint-plugin/tests/rules/require-await.test.ts index 248888b429f..ec2b178ecbb 100644 --- a/packages/eslint-plugin/tests/rules/require-await.test.ts +++ b/packages/eslint-plugin/tests/rules/require-await.test.ts @@ -375,7 +375,7 @@ async function foo() { for await (x of xs); } `, - // global await + // -- global await { code: 'await foo();', }, diff --git a/packages/eslint-plugin/typings/eslint-rules.d.ts b/packages/eslint-plugin/typings/eslint-rules.d.ts index d6677e9dc93..83d75d9fb34 100644 --- a/packages/eslint-plugin/typings/eslint-rules.d.ts +++ b/packages/eslint-plugin/typings/eslint-rules.d.ts @@ -230,7 +230,12 @@ declare module 'eslint/lib/rules/no-dupe-class-members' { Program(): void; ClassBody(): void; 'ClassBody:exit'(): void; - MethodDefinition(node: TSESTree.MethodDefinition): void; + // for ESLint <= v7 + MethodDefinition?: (node: TSESTree.MethodDefinition) => void; + // for ESLint v8 + 'MethodDefinition, PropertyDefinition'?: ( + node: TSESTree.MethodDefinition /* | TSESTree.PropertyDefinition */, + ) => void; } >; export = rule; @@ -520,11 +525,11 @@ declare module 'eslint/lib/rules/no-extra-parens' { ClassExpression(node: TSESTree.ClassExpression): void; ConditionalExpression(node: TSESTree.ConditionalExpression): void; DoWhileStatement(node: TSESTree.DoWhileStatement): void; - // eslint < 7.19.0 + // -- eslint < 7.19.0 'ForInStatement, ForOfStatement'( node: TSESTree.ForInStatement | TSESTree.ForOfStatement, ): void; - // eslint >= 7.19.0 + // -- eslint >= 7.19.0 ForInStatement(node: TSESTree.ForInStatement): void; ForOfStatement(node: TSESTree.ForOfStatement): void; ForStatement(node: TSESTree.ForStatement): void; @@ -637,7 +642,12 @@ declare module 'eslint/lib/rules/no-extra-semi' { { EmptyStatement(node: TSESTree.EmptyStatement): void; ClassBody(node: TSESTree.ClassBody): void; - MethodDefinition(node: TSESTree.MethodDefinition): void; + // for ESLint <= v7 + MethodDefinition?: (node: TSESTree.MethodDefinition) => void; + // for ESLint v8 + 'MethodDefinition, PropertyDefinition'?: ( + node: TSESTree.MethodDefinition /* | TSESTree.PropertyDefinition */, + ) => void; } >; export = rule; diff --git a/packages/experimental-utils/jest.config.js b/packages/experimental-utils/jest.config.js index cce8d6c61ba..bf4e270e376 100644 --- a/packages/experimental-utils/jest.config.js +++ b/packages/experimental-utils/jest.config.js @@ -3,6 +3,7 @@ // @ts-check /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { + resolver: '/../../tests/jest-resolver.js', globals: { 'ts-jest': { isolatedModules: true, diff --git a/packages/experimental-utils/src/eslint-utils/batchedSingleLineTests.ts b/packages/experimental-utils/src/eslint-utils/batchedSingleLineTests.ts index 29a56671a35..8eaef6e3f5e 100644 --- a/packages/experimental-utils/src/eslint-utils/batchedSingleLineTests.ts +++ b/packages/experimental-utils/src/eslint-utils/batchedSingleLineTests.ts @@ -34,7 +34,7 @@ function batchedSingleLineTests< >( options: ValidTestCase | InvalidTestCase, ): (ValidTestCase | InvalidTestCase)[] { - // eslint counts lines from 1 + // -- eslint counts lines from 1 const lineOffset = options.code.startsWith('\n') ? 2 : 1; const output = 'output' in options && options.output diff --git a/packages/experimental-utils/src/ts-eslint/CLIEngine.ts b/packages/experimental-utils/src/ts-eslint/CLIEngine.ts index dfcc2347a5e..9cc1c97b5c7 100644 --- a/packages/experimental-utils/src/ts-eslint/CLIEngine.ts +++ b/packages/experimental-utils/src/ts-eslint/CLIEngine.ts @@ -175,6 +175,8 @@ namespace CLIEngine { * important information so you can deal with the output yourself. * @deprecated use the ESLint class instead */ -class CLIEngine extends (ESLintCLIEngine as typeof CLIEngineBase) {} +const CLIEngine = ESLintCLIEngine + ? class CLIEngine extends (ESLintCLIEngine as typeof CLIEngineBase) {} + : undefined; export { CLIEngine }; diff --git a/packages/experimental-utils/src/ts-eslint/Rule.ts b/packages/experimental-utils/src/ts-eslint/Rule.ts index f813b9d1730..6b13b81c0db 100644 --- a/packages/experimental-utils/src/ts-eslint/Rule.ts +++ b/packages/experimental-utils/src/ts-eslint/Rule.ts @@ -57,6 +57,10 @@ interface RuleMetaData { * The fixer category. Omit if there is no fixer */ fixable?: 'code' | 'whitespace'; + /** + * Specifies whether rules can return suggestions. Omit if there is no suggestions + */ + hasSuggestions?: boolean; /** * A map of messages which the rule can report. * The key is the messageId, and the string is the parameterised error string. diff --git a/packages/parser/jest.config.js b/packages/parser/jest.config.js index 309c75f2fd3..af3026d5c10 100644 --- a/packages/parser/jest.config.js +++ b/packages/parser/jest.config.js @@ -1,6 +1,9 @@ 'use strict'; +// @ts-check +/** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { + resolver: '/../../tests/jest-resolver.js', globals: { 'ts-jest': { isolatedModules: true, diff --git a/packages/parser/package.json b/packages/parser/package.json index 7d8213c1a1a..ecdc1a703f0 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -41,7 +41,7 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "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" }, "dependencies": { "@typescript-eslint/scope-manager": "4.29.2", diff --git a/patches/eslint-plugin-import+2.24.0.patch b/patches/eslint-plugin-import+2.24.0.patch new file mode 100644 index 00000000000..6157ff15558 --- /dev/null +++ b/patches/eslint-plugin-import+2.24.0.patch @@ -0,0 +1,14 @@ +diff --git a/node_modules/eslint-plugin-import/lib/index.js b/node_modules/eslint-plugin-import/lib/index.js +index 247818e..1b42a54 100644 +--- a/node_modules/eslint-plugin-import/lib/index.js ++++ b/node_modules/eslint-plugin-import/lib/index.js +@@ -19,7 +19,8 @@ + 'no-named-as-default': require('./rules/no-named-as-default'), + 'no-named-as-default-member': require('./rules/no-named-as-default-member'), + 'no-anonymous-default-export': require('./rules/no-anonymous-default-export'), +- 'no-unused-modules': require('./rules/no-unused-modules'), ++ // temporarily removed for the v8 migration as it crashes the lint run ++ // 'no-unused-modules': require('./rules/no-unused-modules'), + + 'no-commonjs': require('./rules/no-commonjs'), + 'no-amd': require('./rules/no-amd'), diff --git a/patches/eslint-plugin-jest+24.4.0.patch b/patches/eslint-plugin-jest+24.4.0.patch new file mode 100644 index 00000000000..da14716ee8a --- /dev/null +++ b/patches/eslint-plugin-jest+24.4.0.patch @@ -0,0 +1,48 @@ +diff --git a/node_modules/eslint-plugin-jest/lib/rules/no-done-callback.js b/node_modules/eslint-plugin-jest/lib/rules/no-done-callback.js +index 8a09e7b..4f7dffa 100644 +--- a/node_modules/eslint-plugin-jest/lib/rules/no-done-callback.js ++++ b/node_modules/eslint-plugin-jest/lib/rules/no-done-callback.js +@@ -34,6 +34,7 @@ var _default = (0, _utils.createRule)({ + recommended: 'error', + suggestion: true + }, ++ hasSuggestions: true, + messages: { + noDoneCallback: 'Return a Promise instead of relying on callback parameter', + suggestWrappingInPromise: 'Wrap in `new Promise({{ callback }} => ...`', +diff --git a/node_modules/eslint-plugin-jest/lib/rules/no-focused-tests.js b/node_modules/eslint-plugin-jest/lib/rules/no-focused-tests.js +index 159e1fb..b167a83 100644 +--- a/node_modules/eslint-plugin-jest/lib/rules/no-focused-tests.js ++++ b/node_modules/eslint-plugin-jest/lib/rules/no-focused-tests.js +@@ -36,6 +36,7 @@ var _default = (0, _utils.createRule)({ + recommended: 'error', + suggestion: true + }, ++ hasSuggestions: true, + messages: { + focusedTest: 'Unexpected focused test.', + suggestRemoveFocus: 'Remove focus from test.' +diff --git a/node_modules/eslint-plugin-jest/lib/rules/prefer-expect-assertions.js b/node_modules/eslint-plugin-jest/lib/rules/prefer-expect-assertions.js +index cf064ac..c47dc4a 100644 +--- a/node_modules/eslint-plugin-jest/lib/rules/prefer-expect-assertions.js ++++ b/node_modules/eslint-plugin-jest/lib/rules/prefer-expect-assertions.js +@@ -29,6 +29,7 @@ var _default = (0, _utils.createRule)({ + recommended: false, + suggestion: true + }, ++ hasSuggestions: true, + messages: { + hasAssertionsTakesNoArguments: '`expect.hasAssertions` expects no arguments', + assertionsRequiresOneArgument: '`expect.assertions` excepts a single argument of type number', +diff --git a/node_modules/eslint-plugin-jest/lib/rules/prefer-strict-equal.js b/node_modules/eslint-plugin-jest/lib/rules/prefer-strict-equal.js +index 95136e6..c1179c6 100644 +--- a/node_modules/eslint-plugin-jest/lib/rules/prefer-strict-equal.js ++++ b/node_modules/eslint-plugin-jest/lib/rules/prefer-strict-equal.js +@@ -16,6 +16,7 @@ var _default = (0, _utils.createRule)({ + recommended: false, + suggestion: true + }, ++ hasSuggestions: true, + messages: { + useToStrictEqual: 'Use `toStrictEqual()` instead', + suggestReplaceWithStrictEqual: 'Replace with `toStrictEqual()`' diff --git a/tests/jest-resolver.js b/tests/jest-resolver.js new file mode 100644 index 00000000000..f79f54509b7 --- /dev/null +++ b/tests/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); +}; diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 0e8da2eba1c..16ced4c0241 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -5,5 +5,10 @@ "allowJs": true }, "extends": "./tsconfig.base.json", - "include": ["tests/**/*.ts", "tools/**/*.ts", ".eslintrc.js"] + "include": [ + "tests/**/*.ts", + "tools/**/*.ts", + ".eslintrc.js", + "tests/jest-resolver.js" + ] } diff --git a/yarn.lock b/yarn.lock index fcc05284ae5..9db3079831b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,13 +9,6 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/compat-data@^7.14.4": version "7.14.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" @@ -160,7 +153,7 @@ "@babel/traverse" "^7.14.0" "@babel/types" "^7.14.0" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": +"@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== @@ -694,15 +687,15 @@ dependencies: "@cspotcode/source-map-consumer" "0.8.0" -"@eslint/eslintrc@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" - integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ== +"@eslint/eslintrc@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.0.tgz#08309b915051dbfcfea8c3cdfc832375303396c9" + integrity sha512-FPnE4y+crrKBF0c9PckDHFuPDQl+wRX6S9jeSw2WwM2YNmrdRch3gx3DOTWpqpQu0G9yoJaeSSrJLiV/29tGyQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" + debug "^4.3.2" + espree "^8.0.0" + globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" @@ -783,6 +776,20 @@ unique-filename "^1.1.1" which "^1.3.1" +"@humanwhocodes/config-array@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.6.0.tgz#b5621fdb3b32309d2d16575456cbc277fa8f021a" + integrity sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2260,6 +2267,11 @@ dependencies: "@types/yargs-parser" "*" +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + "@zkochan/cmd-shim@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e" @@ -2310,7 +2322,7 @@ acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.1.1.tgz#3ddab7f84e4a7e2313f6c414c5b7dac85f4e3ebc" integrity sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w== -acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -2366,16 +2378,6 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@~6.12.6: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" - integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - all-contributors-cli@^6.20.0: version "6.20.0" resolved "https://registry.yarnpkg.com/all-contributors-cli/-/all-contributors-cli-6.20.0.tgz#9bc98dda38cb29cfe8afc8a78c004e14af25d2f6" @@ -3685,7 +3687,7 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -3975,6 +3977,14 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" +enhanced-resolve@^5.8.2: + version "5.8.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b" + integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enquirer@^2.3.5, enquirer@^2.3.6, enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -4156,6 +4166,14 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-6.0.0.tgz#9cf45b13c5ac8f3d4c50f46a5121f61b3e318978" + integrity sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -4170,7 +4188,7 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== @@ -4180,36 +4198,41 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@^7.27.0: - version "7.27.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.27.0.tgz#665a1506d8f95655c9274d84bd78f7166b07e9c7" - integrity sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA== +eslint-visitor-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz#e32e99c6cdc2eb063f204eda5db67bfe58bb4186" + integrity sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q== + +eslint@^8.0.0-0: + version "8.0.0-beta.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.0.0-beta.0.tgz#965fa5161b7cc93f1c82fb9c617a3814dc95ba38" + integrity sha512-Q5wCLXSpq+RIa9QBrmHApNCpgqjBU5aeQbVfeAuc9DyBIWzsdivbiirbCmYBrdoFWUoGSYCYWSIpqrS2une7jg== dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.1" + "@eslint/eslintrc" "^1.0.0" + "@humanwhocodes/config-array" "^0.6.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" + eslint-scope "^6.0.0" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.0.0" + espree "^8.0.0" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" + glob-parent "^6.0.1" globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" @@ -4217,22 +4240,21 @@ eslint@^7.27.0: natural-compare "^1.4.0" optionator "^0.9.1" progress "^2.0.0" - regexpp "^3.1.0" + regexpp "^3.2.0" semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-8.0.0.tgz#08c92c31814c96c96c54d3a35cc80f1cdb420275" + integrity sha512-y/+i23dwTjIDJrYCcjcAMr3c3UGbPIjC6THMQKjWmhP97fW0FPiI89kmpKfmgV/5jrkIi6toQP+CMm3qBE1Hig== dependencies: - acorn "^7.4.0" + acorn "^8.4.1" acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + eslint-visitor-keys "^3.0.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -4557,6 +4579,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + findup-sync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" @@ -4659,6 +4688,15 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^7.0.1, fs-extra@~7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -4669,15 +4707,6 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@~7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-minipass@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -4900,6 +4929,13 @@ glob-parent@^5.0.0, glob-parent@^5.1.0: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.1.tgz#42054f685eb6a44e7a7d189a96efa40a54971aa7" + integrity sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog== + dependencies: + is-glob "^4.0.1" + glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4968,13 +5004,6 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - globals@^13.6.0: version "13.9.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" @@ -4982,6 +5011,13 @@ globals@^13.6.0: dependencies: type-fest "^0.20.2" +globals@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== + dependencies: + type-fest "^0.20.2" + globby@^11.0.1, globby@^11.0.3: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" @@ -6433,11 +6469,6 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -6527,6 +6558,13 @@ kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -6756,11 +6794,6 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -7798,6 +7831,25 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +patch-package@^6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" + integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^2.4.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^2.0.0" + fs-extra "^7.0.1" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.0" + open "^7.4.2" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -8274,7 +8326,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpp@^3.1.0: +regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -8327,7 +8379,7 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.1, require-from-string@^2.0.2: +require-from-string@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -9090,17 +9142,10 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^6.0.9: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== - dependencies: - ajv "^8.0.1" - lodash.clonedeep "^4.5.0" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" +tapable@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" + integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== tar@5.0.7: version "5.0.7"