Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ Tidelift is working with the maintainers of `eslint-plugin-functional` and a gro

## Rulesets

The following rulesets are made available by this plugin:
The following rulesets are made available by this plugin.

Note: if using a [flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new) add a `flat/` prefix to the preset name
(e.g. `functional.configs["flat/recommended"]`).

Presets:

Expand Down
20 changes: 19 additions & 1 deletion eslint-doc-generator.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,25 @@ import { format } from "prettier";

export default {
configEmoji: [["lite", "☑️"]],
ignoreConfig: ["all", "off", "disable-type-checked"],
ignoreConfig: [
"all",
"off",
"disable-type-checked",
"flat/all",
"flat/currying",
"flat/disable-type-checked",
"flat/external-typescript-recommended",
"flat/external-vanilla-recommended",
"flat/lite",
"flat/no-exceptions",
"flat/no-mutations",
"flat/no-other-paradigms",
"flat/no-statements",
"flat/off",
"flat/recommended",
"flat/strict",
"flat/stylistic",
],
ruleDocSectionInclude: ["Rule Details"],
ruleListSplit: "meta.docs.category",
postprocess: (doc) => format(doc, { parser: "markdown" }),
Expand Down
56 changes: 13 additions & 43 deletions src/configs/all.ts
Original file line number Diff line number Diff line change
@@ -1,45 +1,15 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

import * as functionalParameters from "#eslint-plugin-functional/rules/functional-parameters";
import * as immutableData from "#eslint-plugin-functional/rules/immutable-data";
import * as noClasses from "#eslint-plugin-functional/rules/no-classes";
import * as noConditionalStatements from "#eslint-plugin-functional/rules/no-conditional-statements";
import * as noExpressionStatements from "#eslint-plugin-functional/rules/no-expression-statements";
import * as noLet from "#eslint-plugin-functional/rules/no-let";
import * as noLoopStatements from "#eslint-plugin-functional/rules/no-loop-statements";
import * as noMixedTypes from "#eslint-plugin-functional/rules/no-mixed-types";
import * as noPromiseReject from "#eslint-plugin-functional/rules/no-promise-reject";
import * as noReturnVoid from "#eslint-plugin-functional/rules/no-return-void";
import * as noThisExpressions from "#eslint-plugin-functional/rules/no-this-expressions";
import * as noThrowStatements from "#eslint-plugin-functional/rules/no-throw-statements";
import * as noTryStatements from "#eslint-plugin-functional/rules/no-try-statements";
import * as preferImmutableTypes from "#eslint-plugin-functional/rules/prefer-immutable-types";
import * as preferPropertySignatures from "#eslint-plugin-functional/rules/prefer-property-signatures";
import * as preferTacit from "#eslint-plugin-functional/rules/prefer-tacit";
import * as readonlyType from "#eslint-plugin-functional/rules/readonly-type";
import * as typeDeclarationImmutability from "#eslint-plugin-functional/rules/type-declaration-immutability";
import { rules } from "#eslint-plugin-functional/rules";
import { ruleNameScope } from "#eslint-plugin-functional/utils/misc";

const config: Linter.Config = {
rules: {
[`functional/${functionalParameters.name}`]: "error",
[`functional/${immutableData.name}`]: "error",
[`functional/${noClasses.name}`]: "error",
[`functional/${noConditionalStatements.name}`]: "error",
[`functional/${noExpressionStatements.name}`]: "error",
[`functional/${noLet.name}`]: "error",
[`functional/${noLoopStatements.name}`]: "error",
[`functional/${noMixedTypes.name}`]: "error",
[`functional/${noPromiseReject.name}`]: "error",
[`functional/${noReturnVoid.name}`]: "error",
[`functional/${noThisExpressions.name}`]: "error",
[`functional/${noThrowStatements.name}`]: "error",
[`functional/${noTryStatements.name}`]: "error",
[`functional/${preferImmutableTypes.name}`]: "error",
[`functional/${preferPropertySignatures.name}`]: "error",
[`functional/${preferTacit.name}`]: "warn",
[`functional/${readonlyType.name}`]: "error",
[`functional/${typeDeclarationImmutability.name}`]: "error",
},
};

export default config;
export default {
...Object.fromEntries(
Object.entries(rules)
.filter(([, rule]) => rule.meta.deprecated !== true)
.map(([name, rule]) => [
`${ruleNameScope}/${name}`,
rule.meta.docs.recommendedSeverity,
]),
),
} satisfies FlatConfig.Config["rules"];
25 changes: 16 additions & 9 deletions src/configs/currying.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

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

const config: Linter.Config = {
rules: {
[`functional/${functionalParameters.name}`]: "error",
},
};

export default config;
export default Object.fromEntries(
Object.entries(rules)
.filter(
([, rule]) =>
rule.meta.deprecated !== true &&
rule.meta.docs.category === "Currying" &&
rule.meta.docs.recommended !== false,
)
.map(([name, rule]) => [
`${ruleNameScope}/${name}`,
rule.meta.docs.recommendedSeverity,
]),
) satisfies FlatConfig.Config["rules"];
11 changes: 0 additions & 11 deletions src/configs/deprecated.ts

This file was deleted.

17 changes: 7 additions & 10 deletions src/configs/disable-type-checked.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

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

const config: Linter.Config = {
rules: Object.fromEntries(
Object.entries(rules)
.filter(([, rule]) => rule.meta.docs?.requiresTypeChecking === true)
.map(([name]) => [`functional/${name}`, "off"]),
),
};

export default config;
export default Object.fromEntries(
Object.entries(rules)
.filter(([, rule]) => rule.meta.docs?.requiresTypeChecking === true)
.map(([name]) => [`${ruleNameScope}/${name}`, "off"]),
) satisfies FlatConfig.Config["rules"];
23 changes: 9 additions & 14 deletions src/configs/external-typescript-recommended.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

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

const tsConfig: Linter.Config = {
rules: {
"@typescript-eslint/prefer-readonly": "error",
"@typescript-eslint/switch-exhaustiveness-check": "error",
},
};
const tsConfig = {
"@typescript-eslint/prefer-readonly": "error",
"@typescript-eslint/switch-exhaustiveness-check": "error",
} satisfies FlatConfig.Config["rules"];

const fullConfig: Linter.Config = mergeConfigs(
externalVanillaRecommended,
tsConfig,
);

export default fullConfig;
export default {
...externalVanillaRecommended,
...tsConfig,
} satisfies FlatConfig.Config["rules"];
16 changes: 6 additions & 10 deletions src/configs/external-vanilla-recommended.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

const config: Linter.Config = {
rules: {
"prefer-const": "error",
"no-param-reassign": "error",
"no-var": "error",
},
};

export default config;
export default {
"prefer-const": "error",
"no-param-reassign": "error",
"no-var": "error",
} satisfies FlatConfig.Config["rules"];
55 changes: 25 additions & 30 deletions src/configs/lite.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,36 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

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

import recommended from "./recommended";

const overrides: Linter.Config = {
rules: {
[`functional/${functionalParameters.name}`]: [
"error",
{
enforceParameterCount: false,
const overrides = {
[functionalParameters.fullName]: [
"error",
{
enforceParameterCount: false,
},
],
[immutableData.fullName]: ["error", { ignoreClasses: "fieldsOnly" }],
[noConditionalStatements.fullName]: "off",
[noExpressionStatements.fullName]: "off",
[preferImmutableTypes.fullName]: [
"error",
{
enforcement: "None",
ignoreInferredTypes: true,
parameters: {
enforcement: "ReadonlyShallow",
},
],
[`functional/${immutableData.name}`]: [
"error",
{ ignoreClasses: "fieldsOnly" },
],
[`functional/${noConditionalStatements.name}`]: "off",
[`functional/${noExpressionStatements.name}`]: "off",
[`functional/${preferImmutableTypes.name}`]: [
"error",
{
enforcement: "None",
ignoreInferredTypes: true,
parameters: {
enforcement: "ReadonlyShallow",
},
},
],
},
};
},
],
} satisfies FlatConfig.Config["rules"];

const config: Linter.Config = mergeConfigs(recommended, overrides);

export default config;
export default {
...recommended,
...overrides,
};
27 changes: 16 additions & 11 deletions src/configs/no-exceptions.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

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

const config: Linter.Config = {
rules: {
[`functional/${noThrowStatements.name}`]: "error",
[`functional/${noTryStatements.name}`]: "error",
},
};

export default config;
export default Object.fromEntries(
Object.entries(rules)
.filter(
([, rule]) =>
rule.meta.deprecated !== true &&
rule.meta.docs.category === "No Exceptions" &&
rule.meta.docs.recommended !== false,
)
.map(([name, rule]) => [
`${ruleNameScope}/${name}`,
rule.meta.docs.recommendedSeverity,
]),
) satisfies FlatConfig.Config["rules"];
31 changes: 16 additions & 15 deletions src/configs/no-mutations.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

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

const config: Linter.Config = {
rules: {
[`functional/${immutableData.name}`]: "error",
[`functional/${noLet.name}`]: "error",
[`functional/${preferImmutableTypes.name}`]: "error",
[`functional/${typeDeclarationImmutability.name}`]: "error",
},
};

export default config;
export default Object.fromEntries(
Object.entries(rules)
.filter(
([, rule]) =>
rule.meta.deprecated !== true &&
rule.meta.docs.category === "No Mutations" &&
rule.meta.docs.recommended !== false,
)
.map(([name, rule]) => [
`${ruleNameScope}/${name}`,
rule.meta.docs.recommendedSeverity,
]),
) satisfies FlatConfig.Config["rules"];
29 changes: 16 additions & 13 deletions src/configs/no-other-paradigms.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import { type Linter } from "@typescript-eslint/utils/ts-eslint";
import { type FlatConfig } from "@typescript-eslint/utils/ts-eslint";

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

const config: Linter.Config = {
rules: {
[`functional/${noClasses.name}`]: "error",
[`functional/${noMixedTypes.name}`]: "error",
[`functional/${noThisExpressions.name}`]: "error",
},
};

export default config;
export default Object.fromEntries(
Object.entries(rules)
.filter(
([, rule]) =>
rule.meta.deprecated !== true &&
rule.meta.docs.category === "No Other Paradigms" &&
rule.meta.docs.recommended !== false,
)
.map(([name, rule]) => [
`${ruleNameScope}/${name}`,
rule.meta.docs.recommendedSeverity,
]),
) satisfies FlatConfig.Config["rules"];
Loading