Skip to content

Commit 901d52a

Browse files
feat: add support for flat configs
1 parent e53918b commit 901d52a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+645
-528
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ Tidelift is working with the maintainers of `eslint-plugin-functional` and a gro
3333

3434
## Rulesets
3535

36-
The following rulesets are made available by this plugin:
36+
The following rulesets are made available by this plugin.
37+
38+
Note: if using a [flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new) add a `flat/` prefix to the preset name
39+
(e.g. `functional.configs["flat/recommended"]`).
3740

3841
Presets:
3942

eslint-doc-generator.config.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,25 @@ import { format } from "prettier";
33

44
export default {
55
configEmoji: [["lite", "☑️"]],
6-
ignoreConfig: ["all", "off", "disable-type-checked"],
6+
ignoreConfig: [
7+
"all",
8+
"off",
9+
"disable-type-checked",
10+
"flat/all",
11+
"flat/currying",
12+
"flat/disable-type-checked",
13+
"flat/external-typescript-recommended",
14+
"flat/external-vanilla-recommended",
15+
"flat/lite",
16+
"flat/no-exceptions",
17+
"flat/no-mutations",
18+
"flat/no-other-paradigms",
19+
"flat/no-statements",
20+
"flat/off",
21+
"flat/recommended",
22+
"flat/strict",
23+
"flat/stylistic",
24+
],
725
ruleDocSectionInclude: ["Rule Details"],
826
ruleListSplit: "meta.docs.category",
927
postprocess: (doc) => format(doc, { parser: "markdown" }),

src/configs/all.ts

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,15 @@
1-
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
1+
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";
22

3-
import * as functionalParameters from "#eslint-plugin-functional/rules/functional-parameters";
4-
import * as immutableData from "#eslint-plugin-functional/rules/immutable-data";
5-
import * as noClasses from "#eslint-plugin-functional/rules/no-classes";
6-
import * as noConditionalStatements from "#eslint-plugin-functional/rules/no-conditional-statements";
7-
import * as noExpressionStatements from "#eslint-plugin-functional/rules/no-expression-statements";
8-
import * as noLet from "#eslint-plugin-functional/rules/no-let";
9-
import * as noLoopStatements from "#eslint-plugin-functional/rules/no-loop-statements";
10-
import * as noMixedTypes from "#eslint-plugin-functional/rules/no-mixed-types";
11-
import * as noPromiseReject from "#eslint-plugin-functional/rules/no-promise-reject";
12-
import * as noReturnVoid from "#eslint-plugin-functional/rules/no-return-void";
13-
import * as noThisExpressions from "#eslint-plugin-functional/rules/no-this-expressions";
14-
import * as noThrowStatements from "#eslint-plugin-functional/rules/no-throw-statements";
15-
import * as noTryStatements from "#eslint-plugin-functional/rules/no-try-statements";
16-
import * as preferImmutableTypes from "#eslint-plugin-functional/rules/prefer-immutable-types";
17-
import * as preferPropertySignatures from "#eslint-plugin-functional/rules/prefer-property-signatures";
18-
import * as preferTacit from "#eslint-plugin-functional/rules/prefer-tacit";
19-
import * as readonlyType from "#eslint-plugin-functional/rules/readonly-type";
20-
import * as typeDeclarationImmutability from "#eslint-plugin-functional/rules/type-declaration-immutability";
3+
import { rules } from "#eslint-plugin-functional/rules";
4+
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";
215

22-
const config: Linter.Config = {
23-
rules: {
24-
[`functional/${functionalParameters.name}`]: "error",
25-
[`functional/${immutableData.name}`]: "error",
26-
[`functional/${noClasses.name}`]: "error",
27-
[`functional/${noConditionalStatements.name}`]: "error",
28-
[`functional/${noExpressionStatements.name}`]: "error",
29-
[`functional/${noLet.name}`]: "error",
30-
[`functional/${noLoopStatements.name}`]: "error",
31-
[`functional/${noMixedTypes.name}`]: "error",
32-
[`functional/${noPromiseReject.name}`]: "error",
33-
[`functional/${noReturnVoid.name}`]: "error",
34-
[`functional/${noThisExpressions.name}`]: "error",
35-
[`functional/${noThrowStatements.name}`]: "error",
36-
[`functional/${noTryStatements.name}`]: "error",
37-
[`functional/${preferImmutableTypes.name}`]: "error",
38-
[`functional/${preferPropertySignatures.name}`]: "error",
39-
[`functional/${preferTacit.name}`]: "warn",
40-
[`functional/${readonlyType.name}`]: "error",
41-
[`functional/${typeDeclarationImmutability.name}`]: "error",
42-
},
43-
};
44-
45-
export default config;
6+
export default {
7+
...Object.fromEntries(
8+
Object.entries(rules)
9+
.filter(([, rule]) => rule.meta.deprecated !== true)
10+
.map(([name, rule]) => [
11+
`${ruleNameScope}/${name}`,
12+
rule.meta.docs.recommendedSeverity,
13+
]),
14+
),
15+
} satisfies FlatConfig.Config["rules"];

src/configs/currying.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1-
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
1+
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";
22

3-
import * as functionalParameters from "#eslint-plugin-functional/rules/functional-parameters";
3+
import { rules } from "#eslint-plugin-functional/rules";
4+
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";
45

5-
const config: Linter.Config = {
6-
rules: {
7-
[`functional/${functionalParameters.name}`]: "error",
8-
},
9-
};
10-
11-
export default config;
6+
export default Object.fromEntries(
7+
Object.entries(rules)
8+
.filter(
9+
([, rule]) =>
10+
rule.meta.deprecated !== true &&
11+
rule.meta.docs.category === "Currying" &&
12+
rule.meta.docs.recommended !== false,
13+
)
14+
.map(([name, rule]) => [
15+
`${ruleNameScope}/${name}`,
16+
rule.meta.docs.recommendedSeverity,
17+
]),
18+
) satisfies FlatConfig.Config["rules"];

src/configs/deprecated.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/configs/disable-type-checked.ts

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

33
import { rules } from "#eslint-plugin-functional/rules";
4+
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";
45

5-
const config: Linter.Config = {
6-
rules: Object.fromEntries(
7-
Object.entries(rules)
8-
.filter(([, rule]) => rule.meta.docs?.requiresTypeChecking === true)
9-
.map(([name]) => [`functional/${name}`, "off"]),
10-
),
11-
};
12-
13-
export default config;
6+
export default Object.fromEntries(
7+
Object.entries(rules)
8+
.filter(([, rule]) => rule.meta.docs?.requiresTypeChecking === true)
9+
.map(([name]) => [`${ruleNameScope}/${name}`, "off"]),
10+
) satisfies FlatConfig.Config["rules"];
Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
1-
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
1+
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";
22

33
import externalVanillaRecommended from "#eslint-plugin-functional/configs/external-vanilla-recommended";
4-
import { mergeConfigs } from "#eslint-plugin-functional/utils/merge-configs";
54

6-
const tsConfig: Linter.Config = {
7-
rules: {
8-
"@typescript-eslint/prefer-readonly": "error",
9-
"@typescript-eslint/switch-exhaustiveness-check": "error",
10-
},
11-
};
5+
const tsConfig = {
6+
"@typescript-eslint/prefer-readonly": "error",
7+
"@typescript-eslint/switch-exhaustiveness-check": "error",
8+
} satisfies FlatConfig.Config["rules"];
129

13-
const fullConfig: Linter.Config = mergeConfigs(
14-
externalVanillaRecommended,
15-
tsConfig,
16-
);
17-
18-
export default fullConfig;
10+
export default {
11+
...externalVanillaRecommended,
12+
...tsConfig,
13+
} satisfies FlatConfig.Config["rules"];
Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
1+
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";
22

3-
const config: Linter.Config = {
4-
rules: {
5-
"prefer-const": "error",
6-
"no-param-reassign": "error",
7-
"no-var": "error",
8-
},
9-
};
10-
11-
export default config;
3+
export default {
4+
"prefer-const": "error",
5+
"no-param-reassign": "error",
6+
"no-var": "error",
7+
} satisfies FlatConfig.Config["rules"];

src/configs/lite.ts

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,36 @@
1-
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
1+
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";
22

33
import * as functionalParameters from "#eslint-plugin-functional/rules/functional-parameters";
44
import * as immutableData from "#eslint-plugin-functional/rules/immutable-data";
55
import * as noConditionalStatements from "#eslint-plugin-functional/rules/no-conditional-statements";
66
import * as noExpressionStatements from "#eslint-plugin-functional/rules/no-expression-statements";
77
import * as preferImmutableTypes from "#eslint-plugin-functional/rules/prefer-immutable-types";
8-
import { mergeConfigs } from "#eslint-plugin-functional/utils/merge-configs";
98

109
import recommended from "./recommended";
1110

12-
const overrides: Linter.Config = {
13-
rules: {
14-
[`functional/${functionalParameters.name}`]: [
15-
"error",
16-
{
17-
enforceParameterCount: false,
11+
const overrides = {
12+
[functionalParameters.fullName]: [
13+
"error",
14+
{
15+
enforceParameterCount: false,
16+
},
17+
],
18+
[immutableData.fullName]: ["error", { ignoreClasses: "fieldsOnly" }],
19+
[noConditionalStatements.fullName]: "off",
20+
[noExpressionStatements.fullName]: "off",
21+
[preferImmutableTypes.fullName]: [
22+
"error",
23+
{
24+
enforcement: "None",
25+
ignoreInferredTypes: true,
26+
parameters: {
27+
enforcement: "ReadonlyShallow",
1828
},
19-
],
20-
[`functional/${immutableData.name}`]: [
21-
"error",
22-
{ ignoreClasses: "fieldsOnly" },
23-
],
24-
[`functional/${noConditionalStatements.name}`]: "off",
25-
[`functional/${noExpressionStatements.name}`]: "off",
26-
[`functional/${preferImmutableTypes.name}`]: [
27-
"error",
28-
{
29-
enforcement: "None",
30-
ignoreInferredTypes: true,
31-
parameters: {
32-
enforcement: "ReadonlyShallow",
33-
},
34-
},
35-
],
36-
},
37-
};
29+
},
30+
],
31+
} satisfies FlatConfig.Config["rules"];
3832

39-
const config: Linter.Config = mergeConfigs(recommended, overrides);
40-
41-
export default config;
33+
export default {
34+
...recommended,
35+
...overrides,
36+
};

src/configs/no-exceptions.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
1+
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";
22

3-
import * as noThrowStatements from "#eslint-plugin-functional/rules/no-throw-statements";
4-
import * as noTryStatements from "#eslint-plugin-functional/rules/no-try-statements";
3+
import { rules } from "#eslint-plugin-functional/rules";
4+
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";
55

6-
const config: Linter.Config = {
7-
rules: {
8-
[`functional/${noThrowStatements.name}`]: "error",
9-
[`functional/${noTryStatements.name}`]: "error",
10-
},
11-
};
12-
13-
export default config;
6+
export default Object.fromEntries(
7+
Object.entries(rules)
8+
.filter(
9+
([, rule]) =>
10+
rule.meta.deprecated !== true &&
11+
rule.meta.docs.category === "No Exceptions" &&
12+
rule.meta.docs.recommended !== false,
13+
)
14+
.map(([name, rule]) => [
15+
`${ruleNameScope}/${name}`,
16+
rule.meta.docs.recommendedSeverity,
17+
]),
18+
) satisfies FlatConfig.Config["rules"];

src/configs/no-mutations.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1-
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
1+
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";
22

3-
import * as immutableData from "#eslint-plugin-functional/rules/immutable-data";
4-
import * as noLet from "#eslint-plugin-functional/rules/no-let";
5-
import * as preferImmutableTypes from "#eslint-plugin-functional/rules/prefer-immutable-types";
6-
import * as typeDeclarationImmutability from "#eslint-plugin-functional/rules/type-declaration-immutability";
3+
import { rules } from "#eslint-plugin-functional/rules";
4+
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";
75

8-
const config: Linter.Config = {
9-
rules: {
10-
[`functional/${immutableData.name}`]: "error",
11-
[`functional/${noLet.name}`]: "error",
12-
[`functional/${preferImmutableTypes.name}`]: "error",
13-
[`functional/${typeDeclarationImmutability.name}`]: "error",
14-
},
15-
};
16-
17-
export default config;
6+
export default Object.fromEntries(
7+
Object.entries(rules)
8+
.filter(
9+
([, rule]) =>
10+
rule.meta.deprecated !== true &&
11+
rule.meta.docs.category === "No Mutations" &&
12+
rule.meta.docs.recommended !== false,
13+
)
14+
.map(([name, rule]) => [
15+
`${ruleNameScope}/${name}`,
16+
rule.meta.docs.recommendedSeverity,
17+
]),
18+
) satisfies FlatConfig.Config["rules"];

src/configs/no-other-paradigms.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
1+
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";
22

3-
import * as noClasses from "#eslint-plugin-functional/rules/no-classes";
4-
import * as noMixedTypes from "#eslint-plugin-functional/rules/no-mixed-types";
5-
import * as noThisExpressions from "#eslint-plugin-functional/rules/no-this-expressions";
3+
import { rules } from "#eslint-plugin-functional/rules";
4+
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";
65

7-
const config: Linter.Config = {
8-
rules: {
9-
[`functional/${noClasses.name}`]: "error",
10-
[`functional/${noMixedTypes.name}`]: "error",
11-
[`functional/${noThisExpressions.name}`]: "error",
12-
},
13-
};
14-
15-
export default config;
6+
export default Object.fromEntries(
7+
Object.entries(rules)
8+
.filter(
9+
([, rule]) =>
10+
rule.meta.deprecated !== true &&
11+
rule.meta.docs.category === "No Other Paradigms" &&
12+
rule.meta.docs.recommended !== false,
13+
)
14+
.map(([name, rule]) => [
15+
`${ruleNameScope}/${name}`,
16+
rule.meta.docs.recommendedSeverity,
17+
]),
18+
) satisfies FlatConfig.Config["rules"];

0 commit comments

Comments
 (0)