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

@watershed-labs/world

v0.1.0

Published

Cucumber World base class lifecycle contract for the Watershed ecosystem

Readme

@watershed-labs/world

Cucumber World base class and lifecycle contract for the Watershed ecosystem.

Part of the Watershed testing ecosystem.


Overview

@watershed-labs/world is the foundation every Watershed template builds on. It provides the WatershedWorld base class that all Cucumber Worlds extend, enforcing a consistent lifecycle contract across every template: session initialisation, cleanup handler registry, and guaranteed teardown.

Every template calls super.init() and super.teardown(). The base class handles the rest — worker ID resolution, cleanup handler ordering, and reporter attachment.


Installation

npm install @watershed-labs/world

Usage

import { WatershedWorld } from '@watershed-labs/world';
import { setWorldConstructor } from '@cucumber/cucumber';

class OtterWorld extends WatershedWorld {
    async init() {
        await super.init();         // always call first
        this.driver = await ...;    // template-specific setup
    }
}

setWorldConstructor(OtterWorld);

API

| Method | Description | | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | init() | Called by the Before hook. Override in each template for session setup. Always call super.init() first. | | updateContext(updates) | Merges values into the scenario context store via Object.assign (mutates in place). This preserves the object reference so BaseHelper and BasePage always see the current values without re-reading the store. Use to expose the driver after creation: this.updateContext({ driver: this.driver }). | | teardown() | Calls all registered cleanup handlers in reverse registration order, then resets internal state. Called automatically by @watershed-labs/hooks after every scenario. | | registerCleanup(fn) | Registers an async cleanup function. Called during teardown() in reverse order. Use this for BiDi subscriptions, network intercepts, and any resource that must be released per-scenario. | | attach(data, mediaType) | Wraps Cucumber's native attach. Use for screenshots, logs, and arbitrary report attachments. | | workerId | String. Set from CUCUMBER_WORKER_ID during init(). Available to all subclasses. Defaults to '0' in non-parallel runs. |


Lifecycle Contract

Before scenario
  → init()                  override in template, call super.init() first

During scenario
  → registerCleanup(fn)     register cleanup handles as resources are created

After scenario (automatic via @watershed-labs/hooks)
  → teardown()              cleanup handlers called in reverse order
                            capturedErrors reset
                            internal state cleared

Parallel Safety

Safe. Cucumber instantiates a fresh World per scenario per worker. workerId is set automatically from CUCUMBER_WORKER_ID and is available to all subclasses.


Licence

MIT — part of the Watershed ecosystem.