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

@trailheadtechnology/eslint-config

v1.5.1

Published

Sharable Trailhead Technology ESLint and Stylelint Config

Downloads

485

Readme

Trailhead Web Linters

This version supports only ESLint 9 Flat Config

Usage

Install

Angular

npm install --D @trailheadtechnology/eslint-config eslint stylelint @angular-eslint/eslint-plugin @angular-eslint/eslint-plugin-template @angular-eslint/template-parser

React

npm install --D @trailheadtechnology/eslint-config eslint stylelint

Configure ESLint

Create a file named eslint.config.mjs in the root of your project with the following content.

For Angular CLI project:

import baseConfig from '@trailheadtechnology/eslint-config';
import angularConfig from '@trailheadtechnology/eslint-config/angular.js';

export default [
  ...baseConfig,
  ...angularConfig,
  {
    files: [ "**/*.ts" ],
    rules: {
      // Add any additional rules here
    },
  }
]

For Angular NX project:

import baseConfig from '@trailheadtechnology/eslint-config';
import angularConfig from '@trailheadtechnology/eslint-config/angular.js';
import nxDevkit from '@nx/devkit';

export default [
  ...baseConfig,
  ...angularConfig,
  {
    files: ["**/*.ts"],
    rules: {
       // Add any additional rules here
    },
    languageOptions: {
      parserOptions: {
        tsconfigRootDir: nxDevkit.workspaceRoot
      },
    },
  } 
];

React

import baseConfig from '@trailheadtechnology/eslint-config';
import reactConfig from '@trailheadtechnology/eslint-config/react.js';

export default [
  ...baseConfig,
  ...reactConfig,
  {
    files: [ "**/*.ts" ],
    rules: {
      // Add any additional rules here
    },
  }
]

Configure Stylelint

Create a file named stylelint.config.mjs in the root of your project with the following content.

export default {
  extends: [
    "@trailheadtechnology/eslint-config/stylelint"
  ],
  rules: {
    // Add any additional rules here
  }
}

Troubleshooting

NextJS: Plugin Conflicts with nextVitals

When using NextJS with nextVitals imports, you may encounter conflicts with plugins that are defined in multiple configs (such as import and @typescript-eslint). To resolve this, you need to deduplicate the conflicting plugins by extracting them from nextVitals and defining them once at the start of your config.

Here's how to fix it:

import baseConfig from '@trailheadtechnology/eslint-config';
import reactConfig from '@trailheadtechnology/eslint-config/react.js';
import { stripConflictingPlugins } from '@trailheadtechnology/eslint-config/utils.js';
import nextVitals from '@next/eslint-plugin-next';

// Plugins that are defined in multiple configs and need deduplication
const conflictingPlugins = ['import', '@typescript-eslint'];

// Extract plugins from nextVitals to use as the single source
const extractedPlugins = {};
for (const config of nextVitals) {
  if (config.plugins) {
    for (const name of conflictingPlugins) {
      if (config.plugins[name] && !extractedPlugins[name]) {
        extractedPlugins[name] = config.plugins[name];
      }
    }
  }
}

export default [
  // Define conflicting plugins once at the start
  {
    plugins: extractedPlugins,
  },
  ...stripConflictingPlugins(nextVitals, conflictingPlugins),
  ...stripConflictingPlugins(baseConfig, conflictingPlugins),
  ...reactConfig,
  {
    files: ["**/*.{ts,tsx}"],
    rules: {
      // Add any additional rules here
    },
  }
];

This approach:

  1. Extracts the conflicting plugins from nextVitals configs
  2. Defines them once at the beginning of your config array
  3. Strips the conflicting plugins from both nextVitals and baseConfig to avoid duplicate definitions