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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@bollgade/eslint-config

v1.0.0

Published

One-stop ESLint flat config for TypeScript, Node, NestJS, React, and Next.js

Readme

@bollgade/eslint-config

npm downloads

One-stop ESLint flat config factory for TypeScript projects: Node.js, NestJS, React, and Next.js.

Inspired by antfu/eslint-config: a single package where framework support is opt-in via optionalDependencies and auto-detected from your project's installed packages.

Installation

npm install -D @bollgade/eslint-config

Framework plugins are optional — install only what you need:

# React
npm install -D eslint-plugin-react eslint-plugin-react-hooks

# Next.js
npm install -D @next/eslint-plugin-next

# Accessibility
npm install -D eslint-plugin-jsx-a11y

# i18n
npm install -D eslint-plugin-i18next

# Storybook
npm install -D eslint-plugin-storybook

Usage

Create eslint.config.mts (or .js):

import { createConfig } from '@bollgade/eslint-config';

export default createConfig();

createConfig returns Promise<Linter.Config[]> — ESLint flat config supports async exports out of the box.


Presets

TypeScript + Node.js (backend, default)

export default createConfig();
// typescript: true, node: true, prettier: true, stylistic: true, imports: true
// react/next/nest: auto-detected from node_modules

NestJS

export default createConfig({
  nest: true, // disables @typescript-eslint/no-extraneous-class for module classes
});

React

export default createConfig({
  react: true,
  // auto-detects: jsx-a11y, i18next, storybook, react-component-name
});

Next.js

export default createConfig({
  next: true, // implies react: true automatically
});

With local overrides

import { createConfig } from '@bollgade/eslint-config';
import { defineConfig } from 'eslint/config';

const base = await createConfig({ react: true });

export default defineConfig(...base, {
  rules: {
    'no-console': 'off',
  },
});

All options

Every option is boolean | OptionsObject. Passing false disables the layer entirely, passing an object enables it with custom settings.

| Option | Type | Default | Description | |---|---|---|---| | typescript | boolean \| TypescriptOptions | true | typescript-eslint with typed linting | | node | boolean \| NodeOptions | true | Node.js globals | | nest | boolean \| NestOptions | auto-detect | NestJS-specific rule relaxations | | react | boolean \| ReactOptions | auto-detect | React + hooks plugins | | next | boolean \| NextOptions | auto-detect | Next.js plugin (implies react: true) | | prettier | boolean \| PrettierOptions | true | Prettier formatting integration | | stylistic | boolean \| StylisticOptions | true | @stylistic/eslint-plugin | | imports | boolean \| ImportsOptions | true | Import ordering and hygiene |

TypescriptOptions

createConfig({
  typescript: {
    tsconfigPath: './tsconfig.json',  // or array of paths
    strictTypeChecked: true,           // false → uses recommended preset
    rules: { /* override specific rules */ },
  },
});

ReactOptions

createConfig({
  react: {
    version: 'detect',     // React version for eslint-plugin-react
    a11y: true,            // jsx-a11y (auto-detect)
    i18n: true,            // eslint-plugin-i18next (auto-detect)
    storybook: true,       // eslint-plugin-storybook (auto-detect)
    componentName: true,   // eslint-plugin-react-component-name (auto-detect)
    rules: { /* override specific rules */ },
  },
});

ReactI18nOptions

createConfig({
  react: {
    i18n: {
      ignoreAttribute: ['to', 'as', 'name', 'data-testid'],
      rules: {},
    },
  },
});

ReactComponentNameOptions

createConfig({
  react: {
    componentName: {
      targets: ['memo', 'forwardRef', 'observer'],
    },
  },
});

What's included

| Layer | Always on | Plugin(s) | Key rules | |---|---|---|---| | base | ✓ | @eslint/js | no-console: warn, max-len: 120, prefer-arrow-callback | | typescript | ✓ | typescript-eslint | strictTypeChecked, no-floating-promises, no-unused-vars | | stylistic | ✓ | @stylistic/eslint-plugin | semi, arrowParens, quote-props | | imports | ✓ | eslint-plugin-import, eslint-plugin-unused-imports | import/order, no-unused-imports | | prettier | ✓ | eslint-plugin-prettier | singleQuote: true | | node | ✓ | — | globals.node, globals.jest | | nest | auto | — | no-extraneous-class: off | | react | auto | eslint-plugin-react, eslint-plugin-react-hooks | hooks rules, JSX rules | | react › a11y | auto | eslint-plugin-jsx-a11y | label-has-associated-control | | react › i18n | auto | eslint-plugin-i18next | no-literal-string | | react › storybook | auto | eslint-plugin-storybook | story file rules | | react › componentName | auto | eslint-plugin-react-component-name | display names for memo/forwardRef | | next | auto | @next/eslint-plugin-next | recommended Next.js rules |


Auto-detection

Frameworks are auto-detected by checking your node_modules:

| Option | Detected when | |---|---| | nest | @nestjs/core is installed | | react | react is installed | | next | next is installed | | react.a11y | eslint-plugin-jsx-a11y is installed | | react.i18n | eslint-plugin-i18next is installed | | react.storybook | eslint-plugin-storybook is installed | | react.componentName | eslint-plugin-react-component-name is installed |

You can always override auto-detection explicitly:

createConfig({
  react: true,       // force-enable even if react not in node_modules
  nest: false,       // force-disable even if @nestjs/core is installed
});

Implies logic

  • nest: true → always adds Node.js globals (even if node: false)
  • next: true → always adds React layer (even if react: false)

Roadmap

  • [ ] Typed rules — fully typed rules overrides per plugin (currently Partial<Linter.RulesRecord>)
  • [ ] projectService support — alternative to tsconfigPath in TypescriptOptions for monorepos
  • [ ] Separate test layer — dedicated test option with Jest/Vitest globals instead of bundling them in node