ESLint Plugin Functional is a comprehensive ESLint plugin that provides rules to promote functional programming patterns in JavaScript and TypeScript. It offers multiple configuration presets ranging from strict functional enforcement to more lenient approaches, with rule categories covering currying support, mutation prevention, exception handling, paradigm enforcement, statement restrictions, and stylistic preferences.
npm install eslint-plugin-functionalESM Import:
import plugin from "eslint-plugin-functional";CommonJS (not recommended, use ESM):
const plugin = require("eslint-plugin-functional");import functional from "eslint-plugin-functional";
export default [
{
plugins: {
functional,
},
rules: {
...functional.configs.recommended.rules,
},
},
];import functional from "eslint-plugin-functional";
export default [
{
plugins: {
functional,
},
rules: {
"functional/no-let": "error",
"functional/immutable-data": "warn",
"functional/no-throw-statements": "error",
},
},
];import functional from "eslint-plugin-functional";
export default [
{
plugins: {
functional,
},
rules: {
// Use strict functional programming rules
...functional.configs.strict.rules,
},
},
];ESLint Plugin Functional is organized around several key components:
The plugin follows ESLint's flat configuration format and provides both individual rule control and preset configurations for different functional programming strictness levels.
Core plugin functionality including metadata, rule registration, and configuration management.
interface EslintPluginFunctional {
meta: {
name: "eslint-plugin-functional";
version: string;
};
rules: Record<string, ESLintRule>;
configs: Record<string, FlatConfig.Config>;
}
declare const plugin: EslintPluginFunctional;
export default plugin;20 ESLint rules that enforce functional programming patterns, prevent mutations, and discourage imperative constructs.
interface Rules {
"functional-parameters": ESLintRule;
"immutable-data": ESLintRule;
"no-classes": ESLintRule;
"no-class-inheritance": ESLintRule;
"no-conditional-statements": ESLintRule;
"no-expression-statements": ESLintRule;
"no-let": ESLintRule;
"no-loop-statements": ESLintRule;
"no-mixed-types": ESLintRule;
"no-promise-reject": ESLintRule;
"no-return-void": ESLintRule;
"no-this-expressions": ESLintRule;
"no-throw-statements": ESLintRule;
"no-try-statements": ESLintRule;
"prefer-immutable-types": ESLintRule;
"prefer-property-signatures": ESLintRule;
"prefer-readonly-type": ESLintRule;
"prefer-tacit": ESLintRule;
"readonly-type": ESLintRule;
"type-declaration-immutability": ESLintRule;
}14 predefined rule configurations covering different functional programming approaches from beginner-friendly to strict enforcement.
interface Configs {
all: FlatConfig.Config;
lite: FlatConfig.Config;
recommended: FlatConfig.Config;
strict: FlatConfig.Config;
off: FlatConfig.Config;
disableTypeChecked: FlatConfig.Config;
externalVanillaRecommended: FlatConfig.Config;
externalTypeScriptRecommended: FlatConfig.Config;
currying: FlatConfig.Config;
noExceptions: FlatConfig.Config;
noMutations: FlatConfig.Config;
noOtherParadigms: FlatConfig.Config;
noStatements: FlatConfig.Config;
stylistic: FlatConfig.Config;
}import type { FlatConfig } from "@typescript-eslint/utils/ts-eslint";
interface ESLintRule {
meta: {
type: "problem" | "suggestion" | "layout";
docs: {
description: string;
recommended?: boolean | "recommended" | "strict";
category: string;
requiresTypeChecking?: boolean;
};
schema: JSONSchema4;
deprecated?: boolean;
};
create(context: RuleContext): Record<string, Function>;
}
interface PluginMeta {
name: "eslint-plugin-functional";
version: string;
}