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 🙏

© 2024 – Pkg Stats / Ryan Hefner

fabricant

v0.2.2

Published

Tiny library for doing ES6 Unity3D-style object oriented composition

Downloads

8

Readme

Fabricant

ES6 composition with components and prefabs, Unity3D-style.

Host objects are simple data containers. Behaviour is encapsulated in components. Components are automatically instantiated on object creation, and it's easy to interoperate between components via the host object.

Usage

npm install fabricant
import Fabricate from "../fabricate";

// 1. Define your components - these are where all of your composed object's
// behaviour resides

class Focusable {
	focus() {
		// swap to a focused skin
	}
	blur() {
		// swap to blurred skin
	}
}

class Clickable {
	select() {
		// do select action/run registered callback
	}
}

// 2. Define the prefab for your composed object - this is a blueprint that
// says what default properties your object has, and which components it requires

const Button = {
	defaultSkin: "blue_steel",
	components: [Clickable, Focusable]
}

// 3. Fabricate the prefab as many times as you want to create instances

const MyButton = Fabricate(Button);
MyButton.components.get(Clickable).select();

Examples

Examples are in the src/examples directory, and are compiled by gulp to lib/examples. You can run them most easily with node:

gulp;node lib/examples/example
gulp;node lib/examples/engine

Project example

There is a fuller example I am working on using fabricant with THREE at:

https://github.com/davedx/architect

Tests

npm test

Rationale

Currently there are a lot of approaches to merging behaviours of objects in JavaScript. The original, prototypal inheritance, is very flexible but error prone and has too much boilerplate. ES6 provides a basic foundation for more concise object oriented programming in JavaScript with the addition of the class and extends keywords, but many people argue composition is a better road to behaviour reusability than inheritance.

Facebook made a strong case for composition when they introduced React, using Mixins to "mix behaviour in" to class components. However, ES6 is not compatible with this approach, so they are now looking at approaches such as functional composition (or "higher order components").

This approach is nice, but I personally find the Unity3D approach (I've also seen this used in a big games studio I worked for in a C++ code base) more readable, and also more complementary to object oriented code.

Therefore I have written this very simple library to "fabricate" objects from prefabs that define which components they need. All of the code defining the behaviour of the "thing" you are implementing should be in the components; the "host" object is simply a container for the components. This keeps composition very clean; the only way to build behaviour is by mixing different components together. There is no extra code in the host object itself, like there is in a React component.