diff --git a/src/config/index.d.ts b/src/config/index.d.ts index e5fd90ff..ca7a5b69 100644 --- a/src/config/index.d.ts +++ b/src/config/index.d.ts @@ -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'; @@ -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 = AllRules, + Strict extends boolean = false, +> { /** * @see [Using Configuration Files](https://eslint.org/docs/latest/user-guide/configuring/configuration-files#using-configuration-files) */ @@ -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 + : Partial>; /** * Overrides. diff --git a/src/flat-config/index.d.ts b/src/flat-config/index.d.ts index 9254effe..2b81d9b5 100644 --- a/src/flat-config/index.d.ts +++ b/src/flat-config/index.d.ts @@ -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'; @@ -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 = 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. * @@ -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 + : Partial>; /** * An object containing name-value pairs of information that should be available to all rules. @@ -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 = AllRules, + Strict extends boolean = false, +> = FlatESLintConfigItem | PredefinedConfig; export * from './language-options'; export * from './linter-options'; diff --git a/src/index.ts b/src/index.ts index 8c767696..babd56e3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,7 @@ 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. @@ -7,7 +9,10 @@ import type { FlatESLintConfig } from './flat-config'; * @param config ESLint config. * @returns ESLint config. */ -export function defineConfig(config: ESLintConfig): ESLintConfig { +export function defineConfig< + Rules extends Record = AllRules, + Strict extends boolean = false, +>(config: ESLintConfig): ESLintConfig { return config; } @@ -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 = AllRules, + Strict extends boolean = false, +>(config: FlatESLintConfig): FlatESLintConfig; /** * Define a flat ESLint config. @@ -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[]; +export function defineFlatConfig< + Rules extends Record = AllRules, + Strict extends boolean = false, +>( + config: ReadonlyArray>, +): Array>; export function defineFlatConfig(config: unknown): unknown { return config; diff --git a/src/rules/index.d.ts b/src/rules/index.d.ts index d1e8e3fc..7109d0ea 100644 --- a/src/rules/index.d.ts +++ b/src/rules/index.d.ts @@ -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 ->; +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 {}