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

universal-mixin

v2.0.0

Published

universal-mixin [![build status](https://secure.travis-ci.org/WebReflection/universal-mixin.svg)](http://travis-ci.org/WebReflection/universal-mixin) ===================================

Readme

universal-mixin build status

Inspired by Reginald Braithwaite proposal in his Using ES.later Decorators as Mixins post, and discussed with both Reginald and Addy Osmani in the gist related to Addy's Exploring ES2016 Decorators post, this mixin function goal is to bring a universal way, from ES3 to ES.future, client or server, to define functions usable as decorators for both clases and generic objects.

Following the same ES7 example used in Addy's post, based on this mixin solution.

const SuperPowers = mixin({
  init() {
    Object.defineProperty(this, '_superPowers', {value: []});
  },
  addPower(name) {
    this._superPowers.push(name);
    return this;
  },
  get powers() {
    return this._superPowers.slice(0);
  }
});

const UtilityBelt = mixin({
  init() {
    Object.defineProperty(this, '_utilityBelt', {value: []});
  },
  addToBelt(name) {
    this._utilityBelt.push(name);
    return this;
  },
  get utilities() {
    return this._utilityBelt.slice(0);
  }
});

// Usable as decorators
@SuperPowers
@UtilityBelt
class ComicBookCharacter {
  constructor(first, last) {
    this.firstName = first;
    this.lastName = last;
    // initialize mixins
    // if or when it's necessary
    this.init();
  }
  realName() {
    return this.firstName + ' ' + this.lastName;
  } 
};

// Usage examples
const batman = new ComicBookCharacter('Bruce', 'Wayne');
console.log(batman.realName());

batman
  .addToBelt('batarang')
  .addToBelt('cape');

console.log(batman.utilities);

batman
  .addPower('detective')
  .addPower('voice sounds like Gollum has asthma');

console.log(batman.powers);

It is also possible to use the mixin with other objects too.

// as example only, don't use at home
var SimpleEmitter = mixin({
  init: function () {
    Object.defineProperty(
      this,
      '_emitter',
      {value: Object.create(null)}
    );
  },
  on: function (type, handler) {
    (this._emitter[type] || (
      this._emitter[type] = []
    )).push(handler);
  },
  emit: function (type) {
    var args = [].slice.call(arguments, 1);
    (this._emitter[type] || []).forEach(function (fn) {
      fn.apply(this, args);
    }, this);
  }
});


var obj = SimpleEmitter({});

obj.init();
obj.on('event', function (err, res) {
  console.log(err, res);
});
obj.emit('event', null, 123);

It is also possible to define mixin constants, propeties, or static methods, passing a second object as parameter.

var WithStatic = mixin({}, {
  VALUE: 'any',
  method: function () {
    return WithStatic.VALUE;
  }
});

WithStatic.method(); // any

Which file ?

In nodejs you can either npm install universal-mixin or use universal-mixin.node.js file.

For browsers you can use universal-mixin.js file, and for AMD you can use universal-mixin.amd.js.

Compatibility

The provided functionality is compatible with IE6 or greater, Espruino, NodeJS, and other common JavaScript engines.

In pre ES5 compatible engines properties will be set enumerable and if no ES5 shim+sham is provided upfront getters and setters might not be accepted.

While IE6 and IE7 works just fine, if you are targeting IE8 please be sure ES5 shim+sham is loaded upfront. You can put this on top of your page.

<!--[if IE 8]>
<script src="//cdnjs.cloudflare.com/ajax/libs/es5-shim/4.1.7/es5-shim.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/es5-shim/4.1.7/es5-sham.min.js"></script>
<![endif]-->

Finally, you can test your browser through the test page.