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

@nielspeter/eess-gherkin

v0.5.0

Published

Architecture testing for Gherkin feature files — the Gherkin dialect of the eess family. Features and scenarios as first-class elements, ready for cross-validation against a markdown corpus.

Downloads

588

Readme

@nielspeter/eess-gherkin

Architecture testing for Gherkin feature files — the Gherkin dialect of the eess family.

Loads .feature files with a deliberate line grammar (feature titles, scenario titles, keywords, tags, locations — steps and tables stay opaque) and exposes features/scenarios as first-class elements:

import { features, scenarios } from '@nielspeter/eess-gherkin'

const set = features({ roots: ['specs/behaviors/features/**'] })

// Scenario hygiene: titles must be citable — unique within their file.
scenarios(set).should().haveUniqueTitles().rule({ id: 'gherkin/unique-titles' }).check()

Why it exists: a spec corpus cites scenarios from markdown (user stories → behavior specs). Those citations are validated by the md↔gherkin pairing in @nielspeter/eess-crossvalidate, which resolves each cited `path/to/x.feature` · 'Scenario title' against the elements this dialect loads — so a renamed or deleted scenario fails the build instead of silently orphaning the story that cites it.

Doc strings (""" / fenced) are guarded: keyword-looking lines inside them are never parsed as scenarios.

What did the set actually load?

A rule that passes over zero scenarios is not a pass, so features() will tell you what it found. The returned FeatureSet is inspectable, not just something to pass to a builder:

import { features } from '@nielspeter/eess-gherkin'

const set = features({ roots: ['specs/behaviors/features/**'] })

console.log(set.root) // root the glob resolved against — defaults to process.cwd()
console.log(set.features().length) // parsed feature files, in path order
console.log(set.scenarios().length) // every scenario across the set, in source order

for (const sc of set.scenarios()) {
  console.log(`${sc.relPath}:${sc.line}`, sc.title, sc.tags.join(' '))
}

0 from either count means the glob matched nothing — check set.root first, since a run from a subdirectory resolves a different tree. @nielspeter/eess-md's corpus() answers the same question the same way, with documents(), root and fileIndex.