Skip to content
This repository was archived by the owner on Mar 7, 2025. It is now read-only.

feat: support customize Rules types via generic #240

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/config/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { Parser, ParserOptions } from '../parser-options';
import type { Rules } from '../rules';
import type { Rules as AllRules } from '../rules';
import type { RuleConfig } from '../rules/rule-config';
import type { Environments } from './env';
import type { Extends } from './extends';
import type { Overrides } from './overrides';
Expand All @@ -11,7 +12,10 @@ import type { Settings } from './settings';
*
* @see [ESLint Configuration](https://eslint.org/docs/latest/user-guide/configuring/)
*/
export interface ESLintConfig {
export interface ESLintConfig<
Rules extends Record<string, RuleConfig> = AllRules,
Strict extends boolean = false,
> {
/**
* @see [Using Configuration Files](https://eslint.org/docs/latest/user-guide/configuring/configuration-files#using-configuration-files)
*/
Expand Down Expand Up @@ -83,7 +87,9 @@ export interface ESLintConfig {
*
* @see [Rules](https://eslint.org/docs/latest/user-guide/configuring/rules)
*/
rules?: Rules;
rules?: Strict extends true
? Partial<Rules>
: Partial<Rules & Record<string, RuleConfig>>;

/**
* Overrides.
Expand Down
17 changes: 13 additions & 4 deletions src/flat-config/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { ESLint, Linter } from 'eslint';
import type { Rules } from '../rules';
import type { Rules as AllRules } from '../rules';
import type { RuleConfig } from '../rules/rule-config';
import type { LanguageOptions } from './language-options';
import type { LinterOptions } from './linter-options';

Expand All @@ -8,7 +9,10 @@ import type { LinterOptions } from './linter-options';
*
* @see [Configuration Files (New)](https://eslint.org/docs/latest/user-guide/configuring/configuration-files-new)
*/
export interface FlatESLintConfigItem {
export interface FlatESLintConfigItem<
Rules extends Record<string, RuleConfig> = AllRules,
Strict extends boolean = false,
> {
/**
* An array of glob patterns indicating the files that the configuration object should apply to. If not specified, the configuration object applies to all files.
*
Expand Down Expand Up @@ -54,7 +58,9 @@ export interface FlatESLintConfigItem {
*
* @see [Configuring rules](https://eslint.org/docs/latest/user-guide/configuring/configuration-files-new#configuring-rules)
*/
rules?: Rules;
rules?: Strict extends true
? Partial<Rules>
: Partial<Rules & Record<string, RuleConfig>>;

/**
* An object containing name-value pairs of information that should be available to all rules.
Expand All @@ -74,7 +80,10 @@ export interface FlatESLintConfigItem {
*/
export type PredefinedConfig = 'eslint:recommended' | 'eslint:all';

export type FlatESLintConfig = FlatESLintConfigItem | PredefinedConfig;
export type FlatESLintConfig<
Rules extends Record<string, RuleConfig> = AllRules,
Strict extends boolean = false,
> = FlatESLintConfigItem<Rules, Strict> | PredefinedConfig;

export * from './language-options';
export * from './linter-options';
21 changes: 16 additions & 5 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import type { ESLintConfig } from './config';
import type { FlatESLintConfig } from './flat-config';
import type { Rules as AllRules } from './rules';
import type { RuleConfig } from './rules/rule-config';

/**
* Define an ESLint config.
*
* @param config ESLint config.
* @returns ESLint config.
*/
export function defineConfig(config: ESLintConfig): ESLintConfig {
export function defineConfig<
Rules extends Record<string, RuleConfig> = AllRules,
Strict extends boolean = false,
>(config: ESLintConfig<Rules, Strict>): ESLintConfig {
return config;
}

Expand All @@ -19,7 +24,10 @@ export function defineConfig(config: ESLintConfig): ESLintConfig {
* @param config an item of Flat ESLint config.
* @returns an item of Flat ESLint config.
*/
export function defineFlatConfig(config: FlatESLintConfig): FlatESLintConfig;
export function defineFlatConfig<
Rules extends Record<string, RuleConfig> = AllRules,
Strict extends boolean = false,
>(config: FlatESLintConfig<Rules, Strict>): FlatESLintConfig<Rules, Strict>;

/**
* Define a flat ESLint config.
Expand All @@ -29,9 +37,12 @@ export function defineFlatConfig(config: FlatESLintConfig): FlatESLintConfig;
* @param config Flat ESLint config.
* @returns Flat ESLint config.
*/
export function defineFlatConfig(
config: ReadonlyArray<FlatESLintConfig>,
): FlatESLintConfig[];
export function defineFlatConfig<
Rules extends Record<string, RuleConfig> = AllRules,
Strict extends boolean = false,
>(
config: ReadonlyArray<FlatESLintConfig<Rules, Strict>>,
): Array<FlatESLintConfig<Rules, Strict>>;

export function defineFlatConfig(config: unknown): unknown {
return config;
Expand Down
51 changes: 25 additions & 26 deletions src/rules/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,29 +28,28 @@ import type { YmlRules } from './yml';
*
* @see [Rules](https://eslint.org/docs/user-guide/configuring/rules)
*/
export type Rules = Partial<
DeprecationRules &
EslintRules &
EslintCommentsRules &
GraphQLRules &
ImportRules &
JSDocRules &
JsoncRules &
JsxA11yRules &
NodeRules &
NRules &
PromiseRules &
ReactHooksRules &
ReactRules &
SonarJSRules &
SpellcheckRules &
TestingLibraryRules &
TypeScriptRules &
UnicornRules &
VitestRules &
VueRules &
VueI18nRules &
VuePugRules &
YmlRules &
Record<string, RuleConfig>
>;
export interface Rules
extends DeprecationRules,
EslintRules,
EslintCommentsRules,
GraphQLRules,
ImportRules,
JSDocRules,
JsoncRules,
JsxA11yRules,
NodeRules,
NRules,
PromiseRules,
ReactHooksRules,
ReactRules,
SonarJSRules,
SpellcheckRules,
TestingLibraryRules,
TypeScriptRules,
UnicornRules,
VitestRules,
VueRules,
VueI18nRules,
VuePugRules,
YmlRules,
Record<string, RuleConfig> {}