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

structu-rex

v0.9.0

Published

Framework agnostic UI design system builder (Atomic Design, containers/UI, hooks, presenters)

Readme

Structurex

Structurex is a framework‑agnostic, strongly‑typed toolkit for building scalable UI design systems with a clean architecture mindset.

  • ✨ Atomic Design hierarchy (Atom → Molecule → Organism → Template → Page)
  • 🧩 Clear split between presentation (UIComponent) and business logic (ContainerComponent)
  • 🛠 CLI generator for boilerplate‑free components, containers and tests
  • 🛡 Architecture rules enforced via an ESLint preset (@structurex/eslint-config)
  • 🏗 No runtime dependency on React, Vue, Svelte… — integrate with any renderer

1 · Installation

npm i structurex         # runtime library
npm i -D eslint @structurex/eslint-config eslint-plugin-boundaries  # (optional) rules

2 · Bootstrapping in your project

Pick once where your render() methods will output — a DOM node, a virtual‑dom tree, Markdown… it’s your call.

// structurex.config.ts (top‑level of your code‑base)
import { setRenderOutput } from 'structurex';

setRenderOutput<HTMLElement>();  // or React.ReactNode, string, VNode, …

The generic is erased at runtime; it only drives TypeScript.

Add the file to tsconfig.json so it’s included in compilation.


3 · Scaffolding components

The library ships with an interactive Plop generator:

npx structurex component

It will ask:

  1. Component name (PascalCase)
  2. Tier — atom | mol | org | tpl | pg
  3. Add a Container file?
  4. Add a Jest test?

Structurex then creates the proper folder hierarchy, barrels (index.ts), tests inside test/<tier>/, and keeps src/index.ts auto‑exporting everything.


4 · Core classes at a glance

import { Atom, ContainerComponent, Hook, Presenter } from 'structurex';

/* Atom ------------------------------------------------------------------*/
export interface ButtonProps {
  label: string;
}

export class Button extends Atom<ButtonProps> {
  public render() {
    return document.createTextNode(this.props.label);
  }
}

/* Container -------------------------------------------------------------*/
export interface CounterState { value: number }

export class CounterContainer extends ContainerComponent<CounterState, {}> {
  protected getInitialState(): CounterState { return { value: 0 }; }
  public increment() { this.setState({ value: this.state.value + 1 }); }
  public render() { return String(this.state.value); }
}

/* Hook ------------------------------------------------------------------*/
export class UseDate extends Hook<Date> {
  public execute() { return new Date(); }
}

/* Presenter -------------------------------------------------------------*/
export class UserPresenter extends Presenter<UserDto, UserVM> {
  public map(dto: UserDto): UserVM { return { fullName: `${dto.first} ${dto.last}` }; }
}

5 · Enforcing architecture with ESLint

npm i -D eslint @structurex/eslint-config eslint-plugin-boundaries

Create eslint.config.js at repo root:

import structurex from '@structurex/eslint-config';

export default [structurex];   // add other configs as needed

Your editor will now warn if:

  • An Atom imports a Molecule or Organism.
  • A hook lives in atoms/.
  • Any layer breaks the dependency rule defined by Atomic Design.

Contributions welcome! Open an issue or PR on GitHub.


License

MIT © 2025 Víctor Larco