Skip to content

Commit ec43f95

Browse files
Merge pull request #1032 from eslint-functional/define-config
2 parents c46e223 + c219037 commit ec43f95

3 files changed

Lines changed: 65 additions & 44 deletions

File tree

GETTING_STARTED.md

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,27 +36,40 @@ In your `eslint.config.js` file, import `typescript-eslint` and `eslint-plugin-f
3636

3737
```js
3838
// eslint.config.js
39+
import eslint from '@eslint/js';
40+
import { defineConfig } from 'eslint/config';
3941
import functional from "eslint-plugin-functional";
4042
import tseslint from "typescript-eslint";
4143

42-
export default tseslint.config({
43-
files: ["**/*.ts"],
44-
extends: [
45-
functional.configs.externalTypeScriptRecommended,
46-
functional.configs.recommended,
47-
functional.configs.stylistic,
48-
// your other plugin configs here
49-
],
50-
languageOptions: {
51-
parser: tseslint.parser,
52-
parserOptions: {
53-
projectService: true,
44+
export default defineConfig(
45+
eslint.configs.recommended,
46+
tseslint.configs.recommendedTypeChecked,
47+
functional.configs.externalTypeScriptRecommended,
48+
functional.configs.recommended,
49+
functional.configs.stylistic,
50+
// any other plugin configs here
51+
{
52+
rules: {
53+
// any rule configs here
5454
},
5555
},
56-
rules: {
57-
// any rule configs here
56+
{
57+
// enable types for type-aware linting
58+
languageOptions: {
59+
parserOptions: {
60+
projectService: true,
61+
},
62+
},
63+
},
64+
{
65+
// disable type-aware linting on JS files
66+
files: ['**/*.js'],
67+
extends: [
68+
tseslint.configs.disableTypeChecked,
69+
functional.configs.disableTypeChecked,
70+
],
5871
},
59-
});
72+
);
6073
```
6174

6275
### Without TypeScript
@@ -68,18 +81,21 @@ disable rules that require TypeScript.
6881

6982
```js
7083
// eslint.config.js
84+
import eslint from '@eslint/js';
85+
import { defineConfig } from 'eslint/config';
7186
import functional from "eslint-plugin-functional";
7287

73-
export default [
88+
export default defineConfig(
89+
eslint.configs.recommended,
7490
functional.configs.externalVanillaRecommended,
7591
functional.configs.recommended,
7692
functional.configs.stylistic,
7793
functional.configs.disableTypeChecked,
78-
// your other plugin configs here
94+
// any other plugin configs here
7995
{
8096
rules: {
8197
// any rule configs here
8298
},
8399
},
84-
];
100+
);
85101
```

src/index.ts

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { FlatConfig } from "@typescript-eslint/utils/ts-eslint";
1+
import type { ESLint, Linter } from "eslint";
22

33
import all from "#/configs/all";
44
import currying from "#/configs/currying";
@@ -22,28 +22,28 @@ const meta = {
2222
version: __VERSION__ as string,
2323
} as const;
2424

25-
const functional = {
25+
const functional: ESLint.Plugin = {
2626
meta,
2727
rules,
28-
} satisfies FlatConfig.Plugin;
28+
} as unknown as ESLint.Plugin;
2929

3030
const plugins = { functional } as const;
3131

3232
const configs: Readonly<{
33-
all: FlatConfig.Config;
34-
lite: FlatConfig.Config;
35-
recommended: FlatConfig.Config;
36-
strict: FlatConfig.Config;
37-
off: FlatConfig.Config;
38-
disableTypeChecked: FlatConfig.Config;
39-
externalVanillaRecommended: FlatConfig.Config;
40-
externalTypeScriptRecommended: FlatConfig.Config;
41-
currying: FlatConfig.Config;
42-
noExceptions: FlatConfig.Config;
43-
noMutations: FlatConfig.Config;
44-
noOtherParadigms: FlatConfig.Config;
45-
noStatements: FlatConfig.Config;
46-
stylistic: FlatConfig.Config;
33+
all: Linter.Config;
34+
lite: Linter.Config;
35+
recommended: Linter.Config;
36+
strict: Linter.Config;
37+
off: Linter.Config;
38+
disableTypeChecked: Linter.Config;
39+
externalVanillaRecommended: Linter.Config;
40+
externalTypeScriptRecommended: Linter.Config;
41+
currying: Linter.Config;
42+
noExceptions: Linter.Config;
43+
noMutations: Linter.Config;
44+
noOtherParadigms: Linter.Config;
45+
noStatements: Linter.Config;
46+
stylistic: Linter.Config;
4747
}> = {
4848
all: { plugins, rules: all },
4949
lite: { plugins, rules: lite },
@@ -71,9 +71,16 @@ const configs: Readonly<{
7171
},
7272
noStatements: { plugins, rules: noStatements },
7373
stylistic: { plugins, rules: stylistic },
74-
} satisfies Record<string, FlatConfig.Config>;
74+
} satisfies Record<
75+
string,
76+
Linter.Config & {
77+
extends?: Array<string | Linter.Config | InfiniteArray<Linter.Config>>;
78+
}
79+
>;
7580

76-
type EslintPluginFunctional = FlatConfig.Plugin & {
81+
type InfiniteArray<T> = T | Array<InfiniteArray<T>>;
82+
83+
type EslintPluginFunctional = typeof functional & {
7784
meta: typeof meta;
7885
rules: typeof rules;
7986
configs: typeof configs;

src/utils/rule.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import assert from "node:assert/strict";
33
import type { TSESTree } from "@typescript-eslint/utils";
44
import { type NamedCreateRuleMeta, RuleCreator, getParserServices } from "@typescript-eslint/utils/eslint-utils";
55
import type { ReportDescriptor, RuleContext, RuleListener, RuleModule } from "@typescript-eslint/utils/ts-eslint";
6+
import type { Rule as EslintRule } from "eslint";
67
import { Immutability, type ImmutabilityOverrides, getTypeImmutability } from "is-immutable-type";
78
import { isIntrinsicErrorType } from "ts-api-utils";
89
import type { Node as TSNode, Type, TypeNode } from "typescript";
@@ -40,13 +41,10 @@ export type NamedCreateRuleCustomMeta<T extends string, Options extends Readonly
4041
/**
4142
* The definition of a rule.
4243
*/
43-
export type Rule<MessageIds extends string, Options extends ReadonlyArray<unknown>> = RuleModule<
44-
MessageIds,
45-
Options,
46-
Docs
47-
> & {
48-
meta: NamedCreateRuleCustomMeta<MessageIds, Options>;
49-
};
44+
export type Rule<MessageIds extends string, Options extends ReadonlyArray<unknown>> = EslintRule.RuleModule &
45+
RuleModule<MessageIds, Options, Docs> & {
46+
meta: NamedCreateRuleCustomMeta<MessageIds, Options>;
47+
};
5048

5149
/**
5250
* All options must extends this type.

0 commit comments

Comments
 (0)