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

eslint-config-loderunner

v5.1.0

Published

Reusable ESLint flat configs for TypeScript, React, Vitest, Vue, and more

Readme

eslint-config-loderunner

Reusable ESLint flat configs for TypeScript, React, Vitest, and more.

This package provides modular ESLint configurations that you can mix and match. Each config is available in two forms: full configs (includes plugins and recommended rules) and rules-only exports (just the custom rules, for mixing with your own setup).

Each config module is independent and has its own peer dependencies that you must install separately. This keeps your project lean—you only install the plugins you actually use. Check the Peer dependencies section for each config below and install the required packages.

Installation

npm install --save-dev eslint-config-loderunner
# or
pnpm add --save-dev eslint-config-loderunner
# or
yarn add --dev eslint-config-loderunner

Configs

base

Core JavaScript rules including strict equality, no var, and no duplicate imports.

Peer dependencies:

pnpm add --save-dev @eslint/js

Rules-only usage:

import { defineConfig } from 'eslint/config';

import baseRules from 'eslint-config-loderunner/base/rules';
import loderunnerPlugin from 'eslint-config-loderunner/plugin';

export default defineConfig([
  {
    files: ['**/*.{js,mjs,cjs}'],
    plugins: { loderunner: loderunnerPlugin },
    rules: {
      ...baseRules,
    },
  },
]);

Full config usage:

import baseConfig from 'eslint-config-loderunner/base';
import { defineConfig } from 'eslint/config';

export default defineConfig([
  {
    files: ['**/*.{js,mjs,cjs}'],
    extends: [baseConfig],
  },
]);

typescript

TypeScript rules with type-checking enabled. Includes strict boolean expressions, exhaustive switch checks, consistent type imports, and warnings for symbols marked @deprecated in types.

Peer dependencies:

pnpm add --save-dev typescript-eslint

Rules-only usage:

import { defineConfig } from 'eslint/config';

import typescriptRules from 'eslint-config-loderunner/typescript/rules';

export default defineConfig([
  {
    files: ['**/*.{ts,tsx}'],
    rules: {
      ...typescriptRules,
    },
  },
]);

Full config usage:

import typescriptConfig from 'eslint-config-loderunner/typescript';
import { defineConfig } from 'eslint/config';

export default defineConfig([
  {
    files: ['**/*.{ts,tsx}'],
    extends: [typescriptConfig],
  },
]);

react

React and React Hooks rules. Includes JSX prop sorting (reserved props first, callbacks last).

Peer dependencies:

pnpm add --save-dev eslint-plugin-react eslint-plugin-react-hooks

Rules-only usage:

import { defineConfig } from 'eslint/config';

import reactRules from 'eslint-config-loderunner/react/rules';

export default defineConfig([
  {
    files: ['**/*.{jsx,tsx}'],
    rules: {
      ...reactRules,
    },
  },
]);

Full config usage:

import reactConfig from 'eslint-config-loderunner/react';
import { defineConfig } from 'eslint/config';

export default defineConfig([
  {
    files: ['**/*.{jsx,tsx}'],
    extends: [reactConfig],
  },
]);

vue

Vue.js rules.

Peer dependencies:

pnpm add --save-dev eslint-plugin-vue

Rules-only usage:

import { defineConfig } from 'eslint/config';

import vueRules from 'eslint-config-loderunner/vue/rules';

export default defineConfig([
  {
    files: ['**/*.vue'],
    rules: {
      ...vueRules,
    },
  },
]);

Full config usage:

import vueConfig from 'eslint-config-loderunner/vue';
import { defineConfig } from 'eslint/config';

export default defineConfig([
  {
    files: ['**/*.vue'],
    extends: [vueConfig],
  },
]);

import

Import ordering and organization rules. Enforces alphabetical sorting with newlines between groups, and warns on deprecated imports.

Peer dependencies:

pnpm add --save-dev eslint-plugin-import

TypeScript support:

For TypeScript projects, install the TypeScript resolver and it will be auto-detected:

pnpm add --save-dev eslint-import-resolver-typescript

Rules-only usage:

import { defineConfig } from 'eslint/config';

import importRules from 'eslint-config-loderunner/import/rules';

export default defineConfig([
  {
    files: ['**/*.{js,mjs,cjs,jsx,ts,tsx}'],
    rules: {
      ...importRules,
    },
  },
]);

Full config usage:

import importConfig from 'eslint-config-loderunner/import';
import { defineConfig } from 'eslint/config';

export default defineConfig([
  {
    files: ['**/*.{js,mjs,cjs,jsx,ts,tsx}'],
    extends: [importConfig],
  },
]);

jsdoc

JSDoc documentation rules. Requires JSDoc for public exports, enforces consistent formatting, and disallows types in JSDoc (prefer TypeScript).

Peer dependencies:

pnpm add --save-dev eslint-plugin-jsdoc

Rules-only usage:

import { defineConfig } from 'eslint/config';

import jsdocRules from 'eslint-config-loderunner/jsdoc/rules';

export default defineConfig([
  {
    files: ['**/*.{js,ts}'],
    rules: {
      ...jsdocRules,
    },
  },
]);

Full config usage:

import jsdocConfig from 'eslint-config-loderunner/jsdoc';
import { defineConfig } from 'eslint/config';

export default defineConfig([
  {
    files: ['**/*.{js,ts}'],
    extends: [jsdocConfig],
  },
]);

vitest

Vitest-specific rules for test files. Relaxes strict TypeScript rules for test flexibility (allows any, unbound methods, etc.).

Peer dependencies:

pnpm add --save-dev @vitest/eslint-plugin

Rules-only usage:

import { defineConfig } from 'eslint/config';

import vitestRules from 'eslint-config-loderunner/vitest/rules';

export default defineConfig([
  {
    files: ['**/*.test.{ts,tsx}', '**/*.spec.{ts,tsx}'],
    rules: {
      ...vitestRules,
    },
  },
]);

Full config usage:

import vitestConfig from 'eslint-config-loderunner/vitest';
import { defineConfig } from 'eslint/config';

export default defineConfig([
  {
    files: ['**/*.test.{ts,tsx}', '**/*.spec.{ts,tsx}'],
    extends: [vitestConfig],
  },
]);

formatting

Formatting rules that work with Prettier. Includes eslint-config-prettier and re-enables formatting rules like curly (require braces). Must be applied last in your config array.

Peer dependencies:

pnpm add --save-dev eslint-config-prettier

Rules-only usage:

import { defineConfig } from 'eslint/config';

import formattingRules from 'eslint-config-loderunner/formatting/rules';

export default defineConfig([
  // ... your other configs first
  {
    files: ['**/*.{js,mjs,cjs,jsx,ts,tsx}'],
    rules: {
      ...formattingRules, // Must be last
    },
  },
]);

Full config usage:

import formattingConfig from 'eslint-config-loderunner/formatting';
import { defineConfig } from 'eslint/config';

export default defineConfig([
  // ... your other configs first
  {
    files: ['**/*.{js,mjs,cjs,jsx,ts,tsx}'],
    extends: [formattingConfig], // Must be last
  },
]);

Custom Rules

| Rule | Description | | ------------------------------------------------------------- | -------------------------------------------------------------------------- | | loderunner/no-chained-arrow | Disallow arrow functions whose expression body is itself an arrow function |

Example Project Configurations

Vite + React Frontend

import { defineConfig } from 'eslint/config';

import baseConfig from 'eslint-config-loderunner/base';
import formattingConfig from 'eslint-config-loderunner/formatting';
import importConfig from 'eslint-config-loderunner/import';
import reactConfig from 'eslint-config-loderunner/react';
import typescriptConfig from 'eslint-config-loderunner/typescript';

export default defineConfig([
  { files: ['src/**/*.{js,jsx,ts,tsx}'] },
  { ignores: ['dist', 'node_modules'] },
  { extends: [baseConfig] },
  { extends: [typescriptConfig] },
  { extends: [reactConfig] },
  { extends: [importConfig] },
  { extends: [formattingConfig] },
]);

Node.js Backend/CLI

import { defineConfig } from 'eslint/config';

import baseConfig from 'eslint-config-loderunner/base';
import formattingConfig from 'eslint-config-loderunner/formatting';
import importConfig from 'eslint-config-loderunner/import';
import typescriptConfig from 'eslint-config-loderunner/typescript';

export default defineConfig([
  { files: ['src/**/*.{js,ts}'] },
  { ignores: ['node_modules', 'dist'] },
  { extends: [baseConfig] },
  { extends: [typescriptConfig] },
  { extends: [importConfig] },
  { extends: [formattingConfig] },
]);

Vue.js

import { defineConfig } from 'eslint/config';
import globals from 'globals';

import baseConfig from 'eslint-config-loderunner/base';
import formattingConfig from 'eslint-config-loderunner/formatting';
import importConfig from 'eslint-config-loderunner/import';
import typescriptConfig from 'eslint-config-loderunner/typescript';
import vueConfig from 'eslint-config-loderunner/vue';

export default defineConfig([
  {
    files: ['src/**/*.{js,mjs,cjs,vue}'],
    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.node,
      },
    },
  },
  { ignores: ['dist', 'node_modules'] },
  { extends: [baseConfig] },
  { extends: [typescriptConfig] },
  { extends: [vueConfig] },
  { extends: [importConfig] },
  { extends: [formattingConfig] },
]);

Library

import { defineConfig } from 'eslint/config';

import baseConfig from 'eslint-config-loderunner/base';
import formattingConfig from 'eslint-config-loderunner/formatting';
import importConfig from 'eslint-config-loderunner/import';
import jsdocConfig from 'eslint-config-loderunner/jsdoc';
import typescriptConfig from 'eslint-config-loderunner/typescript';
import vitestConfig from 'eslint-config-loderunner/vitest';

export default defineConfig([
  { files: ['src/**/*.{js,ts}'] },
  { ignores: ['node_modules', 'dist'] },
  { extends: [baseConfig] },
  { extends: [typescriptConfig] },
  { extends: [importConfig] },
  { extends: [jsdocConfig] },
  { extends: [vitestConfig] },
  { extends: [formattingConfig] },
]);