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

flacon

v0.5.0

Published

A hyperminimal dependency injection framework.

Downloads

609

Readme

flacon 💉

flacon is a dependency injection container with a clean and tiny API that helps you to test your components individually. .5k minified & gzipped.

  • Flexible – It does not care about what a module factory returns.
  • Unopinionated – It does not interfere with require calls.
  • Simple – Less than 100 lines of code.

npm version build status dependency status dev dependency status ISC-licensed

Installing

npm install flacon

Introduction

Imagine you have a service foo.js.

module.exports = {
	value: () => 'foo'
}

Now you want another service bar.js that uses foo.js.

const foo = require('./foo')

module.exports = {
	value: () => foo.value() + 'bar'
}

This looks all good. But when testing bar.js, mocking foo.js is really difficult because it is a private dependency. flacon, on the other hand, forces you to explicitly declare all dependencies, making it easy to mock them.

create a container

First, we create a new container in container.js. On a container, you can publish and load modules.

const Flacon = require('flacon')
module.exports = new Flacon()

publish modules

Let's start with foo.js. We call the publish method with an id and a factory function.

const container = require('./container');

container.publish('foo', () => ({
	value: () => 'foo'
}))

Moving on to bar.js, we define foo as a dependency. The result of foo's factory will be passed into bar's factory.

const container = require('./container')

const factory = (foo) => ({
	value: () => foo.value() + 'bar'
})
factory.deps = ['foo']
container.publish('bar', factory)

load modules

By simply calling the container with a module id, you will get the return value of the factory function.

const container = require('./container')

const bar = container('bar')
bar.value() // -> 'foobar'

mock dependencies

During testing, we can easily manipulate or mock a dependency. This will load every mocked module without caching.

const container = require('./container')

const bar = container('bar', {
	foo: (foo) => ({
		value: () => 'baz'
	})
})
bar.value() // -> 'bazbar'

Note: In a mock function, make sure to never manipulate given module, always return a new one!

flush

To force flacon to call a module's factory again, use flush.

container.load('foo')  // factory creates module
container.flush('foo')
container.load('foo')  // factory creates module again

API

flacon(id, [mocks])

Loads a module by id. Caches and returns the module.

mocks is an object of mocking functions by id. Mocked dependencies will not be cached.

  • id: The identifier, unique to the container.
  • mocks: A map of callbacks, mapped by module id. The return value of each callback will be the mock.

flacon.publish(id, factory)

Registers a module by id. Reads the module's dependencies from factory.deps. Returns the module's factory.

  • id: The identifier, unique to the container.
  • factory: A function, taking the dependencies, that returns the module.

flacon.flush()

Removes a module from the cache. Returns the container.

  • id: The identifier, unique to the container.

Contributing

If you have a question, found a bug or want to propose a feature, have a look at the issues page.