ESLint rules to promote functional programming in TypeScript.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
14 predefined rule configurations covering different functional programming approaches from beginner-friendly to strict enforcement. Each preset combines multiple rules with appropriate settings for specific use cases.
Enables all available rules with their default settings.
/**
* Enables all available rules
* Config: functional.configs.all
*/
interface AllConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: Record<string, "error">;
}Usage Example:
import functional from "eslint-plugin-functional";
export default [
{
plugins: { functional },
rules: {
...functional.configs.all.rules,
},
},
];Lightweight configuration ideal for beginners or gradual adoption of functional programming patterns.
/**
* Beginner-friendly functional programming rules
* Config: functional.configs.lite
*/
interface LiteConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: {
// Based on recommended rules with lighter overrides
"functional/functional-parameters": ["error", {
enforceParameterCount: false;
}];
"functional/immutable-data": ["error", {
ignoreClasses: "fieldsOnly";
}];
"functional/no-classes": "off";
"functional/no-conditional-statements": "off";
"functional/no-expression-statements": "off";
"functional/prefer-immutable-types": ["error", {
enforcement: "None";
overrides: Array<{
specifiers: { from: "file" };
options: {
ignoreInferredTypes: true;
parameters: { enforcement: "ReadonlyShallow" };
};
}>;
}];
// ... plus other recommended rules
};
}Usage Example:
import functional from "eslint-plugin-functional";
export default [
{
plugins: { functional },
rules: {
...functional.configs.lite.rules,
},
},
];Balanced configuration with practical overrides for real-world usage. Good balance between functional programming enforcement and practicality.
/**
* Recommended rules with practical overrides
* Config: functional.configs.recommended
*/
interface RecommendedConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: {
"functional/functional-parameters": ["error", {
enforceParameterCount: false;
overrides: Array<{
specifiers: Array<{ from: "file" }>;
options: {
enforceParameterCount: {
count: "atLeastOne";
ignoreLambdaExpression: true;
ignoreIIFE: true;
ignoreGettersAndSetters: true;
};
};
}>;
}];
"functional/no-conditional-statements": ["error", {
allowReturningBranches: true;
}];
"functional/no-let": ["error", {
allowInForLoopInit: true;
}];
"functional/no-this-expressions": "off";
"functional/no-throw-statements": ["error", {
allowToRejectPromises: true;
}];
"functional/no-try-statements": "off";
// ... other rules with specific configurations
};
}Usage Example:
import functional from "eslint-plugin-functional";
export default [
{
plugins: { functional },
rules: {
...functional.configs.recommended.rules,
},
},
];Strict functional programming enforcement with minimal exceptions.
/**
* Strict functional programming rules
* Config: functional.configs.strict
*/
interface StrictConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: Record<string, "error">;
}Usage Example:
import functional from "eslint-plugin-functional";
export default [
{
plugins: { functional },
rules: {
...functional.configs.strict.rules,
},
},
];Disables all functional programming rules. Useful for temporarily disabling the plugin.
/**
* Disables all rules
* Config: functional.configs.off
*/
interface OffConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: Record<string, "off">;
}Usage Example:
import functional from "eslint-plugin-functional";
export default [
{
plugins: { functional },
rules: {
...functional.configs.off.rules,
},
},
];Disables TypeScript type-aware rules while keeping other functional programming rules active.
/**
* Disables TypeScript type-aware rules
* Config: functional.configs.disableTypeChecked
*/
interface DisableTypeCheckedConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: Record<string, "off">;
}Usage Example:
import functional from "eslint-plugin-functional";
export default [
{
plugins: { functional },
rules: {
...functional.configs.recommended.rules,
...functional.configs.disableTypeChecked.rules,
},
},
];External recommended configuration optimized for vanilla JavaScript projects.
/**
* External recommended for vanilla JavaScript
* Config: functional.configs.externalVanillaRecommended
*/
interface ExternalVanillaRecommendedConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: Record<string, RuleConfiguration>;
}External recommended configuration optimized for TypeScript projects.
/**
* External recommended for TypeScript
* Config: functional.configs.externalTypeScriptRecommended
*/
interface ExternalTypeScriptRecommendedConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: Record<string, RuleConfiguration>;
}Rules focused on supporting and encouraging currying patterns.
/**
* Rules for currying support
* Config: functional.configs.currying
*/
interface CurryingConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: {
"functional/functional-parameters": "error";
"functional/prefer-tacit": "error";
// ... other currying-related rules
};
}Usage Example:
import functional from "eslint-plugin-functional";
export default [
{
plugins: { functional },
rules: {
...functional.configs.lite.rules,
...functional.configs.currying.rules,
},
},
];Rules that prevent exception-based error handling.
/**
* Rules preventing exceptions
* Config: functional.configs.noExceptions
*/
interface NoExceptionsConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: {
"functional/no-promise-reject": "error";
"functional/no-throw-statements": "error";
"functional/no-try-statements": "error";
};
}Rules that prevent data mutations.
/**
* Rules preventing mutations
* Config: functional.configs.noMutations
*/
interface NoMutationsConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: {
"functional/immutable-data": "error";
"functional/no-let": "error";
"functional/prefer-immutable-types": "error";
"functional/readonly-type": "error";
"functional/type-declaration-immutability": "error";
};
}Rules that prevent non-functional programming paradigms.
/**
* Rules preventing non-functional paradigms
* Config: functional.configs.noOtherParadigms
*/
interface NoOtherParadigmsConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: {
"functional/no-classes": "error";
"functional/no-class-inheritance": "error";
"functional/no-mixed-types": "error";
"functional/no-this-expressions": "error";
};
}Rules that prevent imperative statements.
/**
* Rules preventing imperative statements
* Config: functional.configs.noStatements
*/
interface NoStatementsConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: {
"functional/no-conditional-statements": "error";
"functional/no-expression-statements": "error";
"functional/no-loop-statements": "error";
"functional/no-return-void": "error";
};
}Stylistic functional programming rules that don't affect functionality but encourage better patterns.
/**
* Stylistic functional programming rules
* Config: functional.configs.stylistic
*/
interface StylisticConfig extends FlatConfig.Config {
plugins: { functional: EslintPluginFunctional };
rules: {
"functional/prefer-property-signatures": "error";
"functional/prefer-tacit": "error";
// ... other stylistic rules
};
}You can combine multiple presets to create custom configurations:
Usage Examples:
import functional from "eslint-plugin-functional";
// Combine lite with specific focuses
export default [
{
plugins: { functional },
rules: {
...functional.configs.lite.rules,
...functional.configs.noMutations.rules,
...functional.configs.stylistic.rules,
},
},
];
// Build custom strict configuration
export default [
{
plugins: { functional },
rules: {
...functional.configs.recommended.rules,
...functional.configs.noExceptions.rules,
...functional.configs.noStatements.rules,
},
},
];
// TypeScript-specific configuration
export default [
{
plugins: { functional },
rules: {
...functional.configs.externalTypeScriptRecommended.rules,
...functional.configs.noMutations.rules,
},
},
];type RuleConfiguration =
| "off" | 0
| "warn" | 1
| "error" | 2
| ["off" | "warn" | "error" | 0 | 1 | 2]
| ["off" | "warn" | "error" | 0 | 1 | 2, any];
interface FlatConfig.Config {
plugins?: Record<string, Plugin>;
rules?: Record<string, RuleConfiguration>;
files?: string[];
ignores?: string[];
languageOptions?: LanguageOptions;
linterOptions?: LinterOptions;
processor?: string | Processor;
settings?: Record<string, any>;
}