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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@dharmax/state-router

v3.2.0

Published

A cute and tight router and application state controller

Downloads

41

Readme

General

This package contains a functional router and a web-application state manager.

What is a functional router? it's a router that captures a url changes and per specific pattern of url, it simply triggers a handler. It supports hash notation as well as normal url patterns. It also supports contexts (url parameters).

Together with the state manager - which will be the main object you'd need to work with, you get a very simple semantic application state management: each state can be given a logical name, route and an associated page/component.

The router by default ignores file extensions '.json', '.css', '.js', '.png', '.jpg', '.svg', '.webp','md' and you can access the router's staticFilters member to replace or add other rules for static serving support.

you can use the hash notation or not (set the router's mode to 'history' or 'hash')

Example

state definitions

    stateManager.addState('main', 'main-page', /main$/);
    stateManager.addState('login', 'login-box', 'login')
    stateManager.addState('signup', 'signup-box', /signup/)
    stateManager.addState('my-profile') // will assume the page name and the route are the same...
    stateManager.addState('inbox')
    stateManager.addState('about')
    stateManager.addState('discussion', 'discussion-page', 'discussion/%')
    stateManager.addState('article', 'article-page', 'article/%','article-mode')
    stateManager.addState('blog', 'article-page', 'blog/%','blog-mode')

usage in the gui

In your main component, you write something like that:


stateManager.onChange( event => {
    // this specific example works with RiotJs, but you get the drift
    this.update({
        currentPage: event.data.pageName
    })
})

More

  • pageChangeHandler - it's a global optional page change listener that receives ('send', 'pageview', /${state.name}/${context || ''});
  • google analytics (ga) is automatically used if it was found
  • query parameters are passed to the state context under queryParams object
  • on page change, an event state:changed is fired with the new state (that include the context)
  • in addState, the last (optional) parameter can contain either a string an array of strings and it can be used for in-state special logic, or sub-states within the same parent-component, for example