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-rule-composer

v0.3.0

Published

A utility for composing ESLint rules from other ESLint rules

Downloads

13,798,809

Readme

eslint-rule-composer

This is a utility that allows you to build ESLint rules out of other ESLint rules.

Installation

npm install eslint-rule-composer --save

Requires Node 4 or later.

Examples

The following example creates a modified version of the no-unused-expressions rule which does not report lines starting with expect.

const ruleComposer = require('eslint-rule-composer');
const eslint = require('eslint');
const noUnusedExpressionsRule = new eslint.Linter().getRules().get('no-unused-expressions');

module.exports = ruleComposer.filterReports(
  noUnusedExpressionsRule,
  (problem, metadata) => metadata.sourceCode.getFirstToken(problem.node).value !== 'expect'
);

The following example creates a modified version of the semi rule which reports missing semicolons after experimental class properties:

const ruleComposer = require('eslint-rule-composer');
const eslint = require('eslint');
const semiRule = new eslint.Linter().getRules().get('semi');

module.exports = ruleComposer.joinReports([
  semiRule,
  context => ({
    ClassProperty(node) {
      if (context.getSourceCode().getLastToken(node).value !== ';') {
        context.report({ node, message: 'Missing semicolon.' })
      }
    }
  })
]);

You can access rule's options and shared settings from the current ESLint configuration. The following example creates a modified version of the no-unused-expressions rule which accepts a list of exceptions.


/*
  rule configuration:

  {
    "custom-no-unused-expressions": ["error", {
      "whitelist": ["expect", "test"]
    }]
  }
*/

const ruleComposer = require('eslint-rule-composer');
const eslint = require('eslint');
const noUnusedExpressionsRule = new eslint.Linter().getRules().get('no-unused-expressions');

module.exports = ruleComposer.filterReports(
  noUnusedExpressionsRule,
  (problem, metadata) => {
    const firstToken = metadata.sourceCode.getFirstToken(problem.node);
    const whitelist = metadata.options[0].whitelist;
    return whitelist.includes(value) === false
  }
);

API

ruleComposer.filterReports(rule, predicate) and ruleComposer.mapReports(rule, predicate)

Both of these functions accept two arguments: rule (an ESLint rule object) and predicate (a function)

filterReports(rule, predicate) returns a new rule such that whenever the original rule would have reported a problem, the new rule will report a problem only if predicate returns true for that problem. mapReports(rule, predicate) returns a new rule such that whenever the original rule would have reported a problem, the new rule reports the result of calling predicate on the problem.

In both cases, predicate is called with two arguments: problem and metadata.

  • problem is a normalized representation of a problem reported by the original rule. This has the following schema:

    {
      node: ASTNode | null,
      message: string,
      messageId: string | null,
      data: Object | null,
      loc: {
        start: { line: number, column: number },
        end: { line: number, column: number } | null
      },
      fix: Function
    }

    Note that the messageId and data properties will only be present if the original rule reported a problem using Message IDs, otherwise they will be null.

    When returning a descriptor with mapReports, the messageId property on the returned descriptor will be used to generate the new message. To modify a report message directly for a rule that uses message IDs, ensure that the predicate function returns an object without a messageId property.

  • metadata is an object containing information about the source text that was linted. This has the following properties:

  • sourceCode: a SourceCode instance corresponding to the linted text.

  • settings: linter instance's shared settings

  • options: rule's configuration options

  • filename: corresponding filename for the linted text.

ruleComposer.joinReports(rules)

Given an array of ESLint rule objects, joinReports returns a new rule that will report all of the problems from any of the rules in the array. The options provided to the new rule will also be provided to all of the rules in the array.

Getting a reference to an ESLint rule

To get a reference to an ESLint core rule, you can use ESLint's public API like this:

// get a reference to the 'semi' rule

const eslint = require('eslint');
const semiRule = new eslint.Linter().getRules().get('semi');

To get a reference to a rule from a plugin, you can do this:

// get a reference to the 'react/boolean-prop-naming' rule
const booleanPropNamingRule = require('eslint-plugin-react').rules['boolean-prop-naming'];

You can also create your own rules (see the rule documentation):

const myCustomRule = {
  create(context) {
    return {
      DebuggerStatement(node) {
        context.report({ node, message: 'Do not use debugger statements.' });
      }
    }
  }
};

License

MIT License