88 lines
2.8 KiB
Plaintext
88 lines
2.8 KiB
Plaintext
/*
|
|
We purposely don't generate types for our plugin because TL;DR:
|
|
1) there's no real reason that anyone should do a typed import of our rules,
|
|
2) it would require us to change our code so there aren't as many inferred types
|
|
|
|
This type declaration exists as a hacky way to add a type to the export for our
|
|
internal packages that require it.
|
|
|
|
*** Long reason ***
|
|
|
|
When you turn on declaration files, TS requires all types to be "fully resolvable"
|
|
without changes to the code.
|
|
All of our lint rules `export default createRule(...)`, which means they all
|
|
implicitly reference the `TSESLint.Rule` type for the export.
|
|
|
|
TS wants to transpile each rule file to this `.d.ts` file:
|
|
|
|
```ts
|
|
import type { TSESLint } from '@typescript-eslint/utils';
|
|
declare const _default: TSESLint.RuleModule<TMessageIds, TOptions, TSESLint.RuleListener>;
|
|
export default _default;
|
|
```
|
|
|
|
Because we don't import `TSESLint` in most files, it means that TS would have to
|
|
insert a new import during the declaration emit to make this work.
|
|
However TS wants to avoid adding new imports to the file because a new module
|
|
could have type side-effects (like global augmentation) which could cause weird
|
|
type side-effects in the decl file that wouldn't exist in source TS file.
|
|
|
|
So TS errors on most of our rules with the following error:
|
|
```
|
|
The inferred type of 'default' cannot be named without a reference to
|
|
'../../../../node_modules/@typescript-eslint/utils/src/ts-eslint/Rule'.
|
|
This is likely not portable. A type annotation is necessary. ts(2742)
|
|
```
|
|
*/
|
|
/* eslint-disable no-restricted-syntax */
|
|
|
|
import type {
|
|
RuleModuleWithMetaDocs,
|
|
RuleRecommendation,
|
|
RuleRecommendationAcrossConfigs,
|
|
} from '@typescript-eslint/utils/ts-eslint';
|
|
|
|
interface ESLintPluginDocs {
|
|
/**
|
|
* Does the rule extend (or is it based off of) an ESLint code rule?
|
|
* Alternately accepts the name of the base rule, in case the rule has been renamed.
|
|
* This is only used for documentation purposes.
|
|
*/
|
|
extendsBaseRule?: boolean | string;
|
|
|
|
/**
|
|
* If a string config name, which starting config this rule is enabled in.
|
|
* If an object, which settings it has enabled in each of those configs.
|
|
*/
|
|
recommended?: RuleRecommendation | RuleRecommendationAcrossConfigs<unknown[]>;
|
|
|
|
/**
|
|
* Does the rule require us to create a full TypeScript Program in order for it
|
|
* to type-check code. This is only used for documentation purposes.
|
|
*/
|
|
requiresTypeChecking?: boolean;
|
|
}
|
|
|
|
type ESLintPluginRuleModule = RuleModuleWithMetaDocs<
|
|
string,
|
|
readonly unknown[],
|
|
ESLintPluginDocs
|
|
>;
|
|
|
|
type TypeScriptESLintRules = Record<
|
|
string,
|
|
RuleModuleWithMetaDocs<string, unknown[], ESLintPluginDocs>
|
|
>;
|
|
|
|
declare const rules: TypeScriptESLintRules;
|
|
|
|
declare namespace rules {
|
|
export type {
|
|
ESLintPluginDocs,
|
|
ESLintPluginRuleModule,
|
|
TypeScriptESLintRules,
|
|
};
|
|
}
|
|
|
|
export = rules;
|