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

@sebastienrousseau/config-kit

v0.0.8

Published

Shared conformance test kit for the @sebastienrousseau configuration family: packaging, typing, resolvability and real-tool validation in one suite

Readme

@sebastienrousseau/config-kit

The conformance suite for the @sebastienrousseau configuration family.

Every configuration package in the family calls runSuite from a one-line test file. The gates live here, so adding one applies to all of them on the next release rather than needing the same edit in dozens of repositories.

Why it exists

The family used to carry a copy of the same test suite in every repository: two templates, asserting that a module loads and is an object. They reported 100% line coverage over files that are mostly literals, and they missed every defect that actually shipped:

  • four packages whose index.d.ts contradicted their runtime export, so TypeScript consumers were mistyped
  • a semantic-release preset naming six plugins and declaring none, two of which nothing else installed, so a consumer's release run died on plugin load
  • an ESLint package whose CommonJS entry was eslintrc-shaped and could not load on the ESLint version it claimed to support
  • a Stylelint config using three rules Stylelint had deleted, so every consumer saw three errors on every file
  • a Biome config pinned to a superseded schema that Biome 2 rejected outright

One of those suites compared the two entrypoints with a chain of conditions and no final branch. When the entrypoints disagreed — the exact thing it existed to detect — no branch matched and it passed, asserting nothing.

Usage

// tests/conformance.test.js
require("@sebastienrousseau/config-kit").runSuite({ root: __dirname + "/.." });

Declare what the package is in package.json:

{
  "configKit": {
    "shape": "object",
    "presets": ["rustfmt.toml", "clippy.toml"],
    "validate": "eslint-flat",
    "nativeToolchain": "rustfmt, clippy"
  }
}

| Field | Meaning | | --- | --- | | shape | object, array or string; asserted against both the runtime export and index.d.ts | | presets | Files the package reads at runtime or ships for a tool; each must be in files and in the tarball | | validate | Validator name, or omitted for structural checks only | | nativeToolchain | Required when there is no JS validator: names the toolchain CI runs instead | | resolveIgnore | Specifiers to exclude from the resolvability gate | | resolveExtra | Specifiers to add to it |

What it checks

  • Entrypoints — CJS, ESM and the legacy main all load and export the same value
  • Types — the shape index.d.ts promises matches what the module returns
  • Manifest — licence, engines.node, sideEffects, conditional exports, keywords
  • Exports map — every target exists and is in the files allowlist
  • Resolvability — every package the configuration names can be loaded by a consumer
  • Tarball — npm pack contains every export and preset, and no test or website files
  • Presets — present, non-empty and structurally sound for their format
  • Layout — the governance and documentation files the family standard requires
  • SPDX — shipped sources and workflows declare their licence
  • Versions — manifest, CHANGELOG, source literals and README pins agree
  • Documentation — relative links resolve, no unresolved placeholders
  • The real tool — where one exists, the tool is handed the configuration and must accept it

Validators

| Name | What it proves | | --- | --- | | eslint-flat | ESLint accepts the config, and flags a missing semicolon under it | | prettier | Formats, is idempotent, and every option is known to Prettier | | stylelint | No rule the installed Stylelint has removed, and sloppy CSS is caught | | commitlint | Accepts a conventional message and rejects a malformed one | | markdownlint | Accepts clean Markdown and flags malformed Markdown | | remark | Every configured plugin loads and is a valid unified attacher | | browserslist | The query list resolves to real browsers | | typescript-tsconfig | tsc compiles a project extending each preset | | semantic-release | Every plugin installs and exposes a lifecycle hook | | biome / oxlint | The CLI accepts the config file against a clean subject | | dockerfile | Pinned base image, non-root user | | structural | No JS validator exists; nativeToolchain must name the CI job that does |

Every validator has a test proving it fails when its tool is missing. A gate that cannot fail is worse than no gate, because it reads as assurance.

Development

npm ci
npm test          # unit, parser, validator and end-to-end suites
npm run test:unit # without the end-to-end fixtures

See DEVELOPMENT.md.

Licence

Apache-2.0 OR MIT, at your option. See LICENSE-APACHE and LICENSE-MIT.