From 16ce74d247781ac890dc0baa30c384f97e581b6b Mon Sep 17 00:00:00 2001 From: Brad Zacher Date: Sun, 5 Apr 2020 10:46:39 -0700 Subject: [PATCH] feat(experimental-utils): update eslint types to match v6.8 (#1846) --- .../src/ts-eslint-scope/ScopeManager.ts | 3 +- .../src/ts-eslint-scope/analyze.ts | 3 +- .../src/ts-eslint/CLIEngine.ts | 26 ++++++++++++--- .../src/ts-eslint/Linter.ts | 32 +++++++++++++++---- .../src/ts-eslint/ParserOptions.ts | 20 ++++++++++-- .../experimental-utils/src/ts-eslint/Rule.ts | 1 + .../src/ts-eslint/RuleTester.ts | 4 +++ 7 files changed, 74 insertions(+), 15 deletions(-) diff --git a/packages/experimental-utils/src/ts-eslint-scope/ScopeManager.ts b/packages/experimental-utils/src/ts-eslint-scope/ScopeManager.ts index d1b469a6d4f..9f971d79764 100644 --- a/packages/experimental-utils/src/ts-eslint-scope/ScopeManager.ts +++ b/packages/experimental-utils/src/ts-eslint-scope/ScopeManager.ts @@ -1,5 +1,6 @@ import ESLintScopeManager from 'eslint-scope/lib/scope-manager'; import { TSESTree } from '../ts-estree'; +import { EcmaVersion } from '../ts-eslint'; import { Scope } from './Scope'; import { Variable } from './Variable'; @@ -10,7 +11,7 @@ interface ScopeManagerOptions { nodejsScope?: boolean; sourceType?: 'module' | 'script'; impliedStrict?: boolean; - ecmaVersion?: number; + ecmaVersion?: EcmaVersion; } interface ScopeManager { diff --git a/packages/experimental-utils/src/ts-eslint-scope/analyze.ts b/packages/experimental-utils/src/ts-eslint-scope/analyze.ts index c4ab4514c8c..9bbe1c1118e 100644 --- a/packages/experimental-utils/src/ts-eslint-scope/analyze.ts +++ b/packages/experimental-utils/src/ts-eslint-scope/analyze.ts @@ -1,4 +1,5 @@ import { analyze as ESLintAnalyze } from 'eslint-scope'; +import { EcmaVersion } from '../ts-eslint'; import { ScopeManager } from './ScopeManager'; interface AnalysisOptions { @@ -9,7 +10,7 @@ interface AnalysisOptions { impliedStrict?: boolean; fallback?: string | ((node: {}) => string[]); sourceType?: 'script' | 'module'; - ecmaVersion?: number; + ecmaVersion?: EcmaVersion; } const analyze = ESLintAnalyze as ( ast: {}, diff --git a/packages/experimental-utils/src/ts-eslint/CLIEngine.ts b/packages/experimental-utils/src/ts-eslint/CLIEngine.ts index 46fc36b32ba..4c640d35c91 100644 --- a/packages/experimental-utils/src/ts-eslint/CLIEngine.ts +++ b/packages/experimental-utils/src/ts-eslint/CLIEngine.ts @@ -2,11 +2,9 @@ import { CLIEngine as ESLintCLIEngine } from 'eslint'; import { Linter } from './Linter'; -import { RuleModule, RuleListener } from './Rule'; +import { RuleMetaData, RuleModule, RuleListener } from './Rule'; interface CLIEngine { - version: string; - executeOnFiles(patterns: string[]): CLIEngine.LintReport; resolveFileGlobPatterns(patterns: string[]): string[]; @@ -39,6 +37,7 @@ namespace CLIEngine { configFile?: string; cwd?: string; envs?: string[]; + errorOnUnmatchedPattern?: boolean; extensions?: string[]; fix?: boolean; globals?: string[]; @@ -49,6 +48,7 @@ namespace CLIEngine { parser?: string; parserOptions?: Linter.ParserOptions; plugins?: string[]; + resolvePluginsRelativeTo?: string; rules?: { [name: string]: Linter.RuleLevel | Linter.RuleLevelAndOptions; }; @@ -73,9 +73,24 @@ namespace CLIEngine { warningCount: number; fixableErrorCount: number; fixableWarningCount: number; + usedDeprecatedRules: DeprecatedRuleUse[]; + } + + export interface DeprecatedRuleUse { + ruleId: string; + replacedBy: string[]; + } + + export interface LintResultData { + rulesMeta: { + [ruleId: string]: RuleMetaData; + }; } - export type Formatter = (results: LintResult[]) => string; + export type Formatter = ( + results: LintResult[], + data?: LintResultData, + ) => string; } const CLIEngine = ESLintCLIEngine as { @@ -83,8 +98,9 @@ const CLIEngine = ESLintCLIEngine as { // static methods getErrorResults(results: CLIEngine.LintResult[]): CLIEngine.LintResult[]; - + getFormatter(format?: string): CLIEngine.Formatter; outputFixes(report: CLIEngine.LintReport): void; + version: string; }; export { CLIEngine }; diff --git a/packages/experimental-utils/src/ts-eslint/Linter.ts b/packages/experimental-utils/src/ts-eslint/Linter.ts index 5363059b14d..57b1d23ea6c 100644 --- a/packages/experimental-utils/src/ts-eslint/Linter.ts +++ b/packages/experimental-utils/src/ts-eslint/Linter.ts @@ -60,15 +60,35 @@ namespace Linter { export type RuleLevelAndOptions = [RuleLevel, ...unknown[]]; - export interface Config { - rules?: { - [name: string]: RuleLevel | RuleLevelAndOptions; - }; + export type RuleEntry = RuleLevel | RuleLevelAndOptions; + export type RulesRecord = Partial>; + + // https://github.com/eslint/eslint/blob/v6.8.0/conf/config-schema.js + interface BaseConfig { + $schema?: string; + env?: { [name: string]: boolean }; + extends?: string | string[]; + globals?: { [name: string]: boolean }; + noInlineConfig?: boolean; + overrides?: ConfigOverride[]; parser?: string; parserOptions?: ParserOptions; + plugins?: string[]; + processor?: string; + reportUnusedDisableDirectives?: boolean; settings?: { [name: string]: unknown }; - env?: { [name: string]: boolean }; - globals?: { [name: string]: boolean }; + rules?: RulesRecord; + } + + export interface ConfigOverride extends BaseConfig { + excludedFiles?: string | string[]; + files: string | string[]; + } + export type RuleOverride = ConfigOverride; // TODO - delete this next major + + export interface Config extends BaseConfig { + ignorePatterns?: string | string[]; + root?: boolean; } export type ParserOptions = TSParserOptions; diff --git a/packages/experimental-utils/src/ts-eslint/ParserOptions.ts b/packages/experimental-utils/src/ts-eslint/ParserOptions.ts index 0ff55c81c56..4a85f2acab5 100644 --- a/packages/experimental-utils/src/ts-eslint/ParserOptions.ts +++ b/packages/experimental-utils/src/ts-eslint/ParserOptions.ts @@ -1,12 +1,28 @@ import { TSESTreeOptions } from '@typescript-eslint/typescript-estree'; +type EcmaVersion = + | 3 + | 5 + | 6 + | 7 + | 8 + | 9 + | 10 + | 11 + | 2015 + | 2016 + | 2017 + | 2018 + | 2019 + | 2020; + interface ParserOptions { comment?: boolean; ecmaFeatures?: { globalReturn?: boolean; jsx?: boolean; }; - ecmaVersion?: 3 | 5 | 6 | 7 | 8 | 9 | 10 | 2015 | 2016 | 2017 | 2018 | 2019; + ecmaVersion?: EcmaVersion; errorOnTypeScriptSyntacticAndSemanticIssues?: boolean; errorOnUnknownASTType?: boolean; extraFileExtensions?: string[]; @@ -25,4 +41,4 @@ interface ParserOptions { warnOnUnsupportedTypeScriptVersion?: boolean; } -export { ParserOptions }; +export { EcmaVersion, ParserOptions }; diff --git a/packages/experimental-utils/src/ts-eslint/Rule.ts b/packages/experimental-utils/src/ts-eslint/Rule.ts index 8301947ee6b..61f9cd7611e 100644 --- a/packages/experimental-utils/src/ts-eslint/Rule.ts +++ b/packages/experimental-utils/src/ts-eslint/Rule.ts @@ -128,6 +128,7 @@ interface ReportDescriptorBase { * The messageId which is being reported. */ messageId: TMessageIds; + // we disallow this because it's much better to use messageIds for reusable errors that are easily testable // desc?: string; } diff --git a/packages/experimental-utils/src/ts-eslint/RuleTester.ts b/packages/experimental-utils/src/ts-eslint/RuleTester.ts index 9c63709f37f..41dadcb6363 100644 --- a/packages/experimental-utils/src/ts-eslint/RuleTester.ts +++ b/packages/experimental-utils/src/ts-eslint/RuleTester.ts @@ -24,6 +24,8 @@ interface SuggestionOutput { * Each individual error has its own suggestion, so you have to show the correct, _isolated_ output for each suggestion. */ output: string; + // we disallow this because it's much better to use messageIds for reusable errors that are easily testable + // desc?: string; } interface InvalidTestCase< @@ -36,6 +38,8 @@ interface InvalidTestCase< interface TestCaseError { messageId: TMessageIds; + // we disallow this because it's much better to use messageIds for reusable errors that are easily testable + // message?: string; data?: Record; type?: AST_NODE_TYPES | AST_TOKEN_TYPES; line?: number;