npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

eslint-plugin-functional

v7.1.0

Published

ESLint rules to promote functional programming in TypeScript.

Downloads

763,144

Readme

eslint-logo

eslint-plugin-functional

npm version Release Coverage Status semantic-release code style: prettier MIT license GitHub Discussions

An ESLint plugin to disable mutation and promote functional programming in JavaScript and TypeScript.

Donate

Any donations would be much appreciated. 😄

Enterprise Users

eslint-plugin-functional is available as part of the Tidelift Subscription.

Tidelift is working with the maintainers of eslint-plugin-functional and a growing network of open source maintainers to ensure your open source software supply chain meets enterprise standards now and into the future. Learn more.

Getting Started

See our getting started guide.

Rulesets

The following rulesets are made available by this plugin.

Presets:

  • Strict (configs.strict)
    Enforce recommended rules designed to strictly enforce functional programming.

  • Recommended (configs.recommended)
    Has the same goal as the strict preset but a little more lenient, allowing for functional-like coding styles and nicer integration with non-functional 3rd-party libraries.

  • Lite (configs.lite)
    Good if you're new to functional programming or are converting a large codebase.

Categorized:

  • Currying (configs.currying)
    JavaScript functions support syntax that is not compatible with curried functions. To enforce currying, this syntax should be prevented.

  • No Exceptions (configs.noExceptions)
    Functional programming style does not use run-time exceptions. Instead expressions produces values to indicate errors.

  • No Mutations (configs.noMutations)
    Prevent mutating any data as that's not functional

  • No Other Paradigms (configs.noOtherParadigms)
    JavaScript is multi-paradigm, allowing not only functional, but object-oriented as well as other programming styles. To promote a functional style, prevent the use of other paradigm styles.

  • No Statements (configs.noStatements)
    In functional programming everything is an expression that produces a value. JavaScript has a lot of syntax that is just statements that does not produce a value. That syntax has to be prevented to promote a functional style.

  • Stylistic (configs.stylistic)
    Enforce code styles that can be considered to be more functional.

Other:

  • All (configs.all)
    Enables all rules defined in this plugin.

  • Off (configs.off)
    Disable all rules defined in this plugin.

  • Disable Type Checked (configs.disableTypeChecked)
    Disable all rules that require type information.

  • External Vanilla Recommended (configs.externalVanillaRecommended)
    Configures recommended vanilla ESLint rules.

  • External TypeScript Recommended (configs.externalTypeScriptRecommended)
    Configures recommended TypeScript ESLint rules. Enabling this ruleset will also enable the vanilla one.

The below section gives details on which rules are enabled by each ruleset.

Rules

💼 Configurations enabled in.
⚠️ Configurations set to warn in.
🚫 Configurations disabled in.
☑️ Set in the lite configuration.
✅ Set in the recommended configuration.
🔒 Set in the strict configuration.
🎨 Set in the stylistic configuration.
🔧 Automatically fixable by the --fix CLI option.
💡 Manually fixable by editor suggestions.
💭 Requires type information.
❌ Deprecated.

Currying

| Name | Description | 💼 | ⚠️ | 🚫 | 🔧 | 💡 | 💭 | ❌ | | :----------------------------------------------------------- | :----------------------------- | :--------------------------- | :-- | :---------------------------- | :-- | :-- | :-- | :-- | | functional-parameters | Enforce functional parameters. | ☑️ ✅ 🔒 badge-currying | | ![badge-disableTypeChecked][] | | | 💭 | |

No Exceptions

| Name | Description | 💼 | ⚠️ | 🚫 | 🔧 | 💡 | 💭 | ❌ | | :------------------------------------------------------- | :----------------------------------------------------- | :------------------------------- | :-- | :---- | :-- | :-- | :-- | :-- | | no-promise-reject | Disallow rejecting promises. | | | | | | | | | no-throw-statements | Disallow throwing exceptions. | ☑️ ✅ 🔒 ![badge-noExceptions][] | | | | | | | | no-try-statements | Disallow try-catch[-finally] and try-finally patterns. | 🔒 ![badge-noExceptions][] | | ☑️ ✅ | | | | |

No Mutations

| Name                          | Description | 💼 | ⚠️ | 🚫 | 🔧 | 💡 | 💭 | ❌ | | :--------------------------------------------------------------------------- | :-------------------------------------------------------------- | :------------------------------ | :-- | :---------------------------- | :-- | :-- | :-- | :-- | | immutable-data | Enforce treating data as immutable. | ☑️ ✅ 🔒 ![badge-noMutations][] | | ![badge-disableTypeChecked][] | | | 💭 | | | no-let | Disallow mutable variables. | ☑️ ✅ 🔒 ![badge-noMutations][] | | | | | | | | prefer-immutable-types | Require function parameters to be typed as certain immutability | ☑️ ✅ 🔒 ![badge-noMutations][] | | ![badge-disableTypeChecked][] | 🔧 | 💡 | 💭 | | | prefer-readonly-type | Prefer readonly types over mutable types. | | | ![badge-disableTypeChecked][] | 🔧 | | 💭 | ❌ | | type-declaration-immutability | Enforce the immutability of types based on patterns. | ☑️ ✅ 🔒 ![badge-noMutations][] | | ![badge-disableTypeChecked][] | 🔧 | 💡 | 💭 | |

No Other Paradigms

| Name                 | Description | 💼 | ⚠️ | 🚫 | 🔧 | 💡 | 💭 | ❌ | | :--------------------------------------------------------- | :------------------------------------------------------------------------ | :----------------------------------- | :-- | :---------------------------- | :-- | :-- | :-- | :-- | | no-class-inheritance | Disallow inheritance in classes. | ☑️ ✅ 🔒 ![badge-noOtherParadigms][] | | | | | | | | no-classes | Disallow classes. | ✅ 🔒 ![badge-noOtherParadigms][] | | ☑️ | | | | | | no-mixed-types | Restrict types so that only members of the same kind are allowed in them. | ☑️ ✅ 🔒 ![badge-noOtherParadigms][] | | ![badge-disableTypeChecked][] | | | 💭 | | | no-this-expressions | Disallow this access. | 🔒 ![badge-noOtherParadigms][] | | ☑️ ✅ | | | | |

No Statements

| Name | Description | 💼 | ⚠️ | 🚫 | 🔧 | 💡 | 💭 | ❌ | | :------------------------------------------------------------------- | :--------------------------------------------- | :------------------------------- | :-- | :------------------------------- | :-- | :-- | :-- | :-- | | no-conditional-statements | Disallow conditional statements. | ✅ 🔒 ![badge-noStatements][] | | ☑️ ![badge-disableTypeChecked][] | | | 💭 | | | no-expression-statements | Disallow expression statements. | ✅ 🔒 ![badge-noStatements][] | | ☑️ ![badge-disableTypeChecked][] | | | 💭 | | | no-loop-statements | Disallow imperative loops. | ☑️ ✅ 🔒 ![badge-noStatements][] | | | | | | | | no-return-void | Disallow functions that don't return anything. | ☑️ ✅ 🔒 ![badge-noStatements][] | | ![badge-disableTypeChecked][] | | | 💭 | |

Stylistic

| Name                       | Description | 💼 | ⚠️ | 🚫 | 🔧 | 💡 | 💭 | ❌ | | :--------------------------------------------------------------------- | :--------------------------------------------------------------------- | :-- | :-- | :---------------------------- | :-- | :-- | :-- | :-- | | prefer-property-signatures | Prefer property signatures over method signatures. | 🎨 | | ![badge-disableTypeChecked][] | | | 💭 | | | prefer-tacit | Replaces x => f(x) with just f. | | 🎨 | ![badge-disableTypeChecked][] | | 💡 | 💭 | | | readonly-type | Require consistently using either readonly keywords or Readonly<T> | 🎨 | | ![badge-disableTypeChecked][] | 🔧 | | 💭 | |

External Recommended Rules

In addition to the above rules, there are a few other rules we recommended.

These rules are what are included in the external recommended rulesets.

Vanilla Rules

  • no-var
    Without this rule, it is still possible to create mutable var variables.

  • no-param-reassign
    Don't allow function parameters to be reassigned, they should be treated as constants.

  • prefer-const
    This rule provides a helpful fixer when converting from an imperative code style to a functional one.

TypeScript Rules

Contributing

See our contributing guide.

Prior work

This project started as a port of tslint-immutable which was originally inspired by eslint-plugin-immutable.