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

@fasteroid/traits

v1.0.0

Published

Mixin metadata for the masses!

Readme

@fasteroid/traits

Mixin metadata for the masses!

Premise

The real world is messy.  Not every concept lends itself to neat representation in a hierarchy.  For all their troubles, patterns like mixins and entity component systems are the most powerful ways to split and recombine concepts in your codebase.

Typically in TypeScript, people reach for mixins, but I wasn't aware of anything out there that made it easy for mixins to query for the presence of others, ECS-style.  This package makes an attempt at solving that problem.

Usage

// 'TraitsList' needed in imports to export traits since they reference it.  See TS4023 for details.
import { Trait, hasTrait, TraitsList } from './index'

export const HealthTrait = Trait(
    base => class HealthComponent extends base {
        _health = 100; // private and protected fields don't work if you want to export the trait.  See TS4094 for details.
        
        public get health() { return this._health }
        public set health(hp: number) { 
            hp = Math.max(hp, 0);
            if( hp === 0 && this._health !== 0 ) {
                console.log("Entity", this, "died")
            }
            this._health = hp;
        }
    },
    Symbol("Health")
)

export const FlammableTrait = Trait(
    base => class FlammableComponent extends base {
        public onFireFramesLeft = 0;

        public tick() {
            if( this.onFireFramesLeft <= 0 ) return;
            this.onFireFramesLeft--;

            if( hasTrait(this, HealthTrait) ) {
                this.health -= 1;
            }
        }

        public ignite(frames: number) {
            this.onFireFramesLeft += frames;
        }
    },
    Symbol("Flammable")
)

// protip: invoke a trait with no args to get a constructor for the trait
const player = new ( HealthTrait( FlammableTrait() ) ); 

player.ignite(200);

setInterval( () => player.tick(), 33 ); // the player will die from the fire in a few seconds

Plans for the future...

  • Find a workaround for TS4023 so you can at least export traits with "private" properties
  • Make adding a trait to a constructor which already has that trait a no-op, regardless of order
  • Find a way to introduce fewer prototype chain entries for better performance

License

MIT License