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

xtralife-env

v4.4.0

Published

Dependency injection for node.js

Downloads

33

Readme

xtralive-env is the assembly line

xtralive-env is a module aimed at handling configuration and dependency injection.

How to configure

Add it to your package.json

dependencies: {
	"xtralife-env":"*"
}

You can then use xlenv = require "xtralife-env"

You can add configuration data to xlenv easily with overrides. To load a configuration file, use overrideWith.

xlenv.overrideWith 'file.coffee'

Configuration files are simply modules or js files:

module.exports =
	loglevel: 'warn'
	server:
		port: 80
		bind_ip: '127.0.0.1'

You can load more files, and each file will override existing settings.

You can also override xlenv with override :

xlenv.override 'server', {port:8080, bind_ip: '192.168.0.1'}

If you want to override at the root level, use null as the "mount point"

xlenv.override null, {loglevel: 'info'}

But you can override at any depth, and the root needs not exist already :

xlenv.override 'config.server', {port:8080, bind_ip: '192.168.0.1'}

How to use synchronously

To get configuration data from xlenv, you can simply dereference it

console.log xlenv.loglevel
console.log xlenv.server.port

Asynchronous use

xlenv configuration files can also contain async functions. Let's see an example (file counter-conf.coffee) : The following example is just that, an example. It's not the best use case one can think of !

total_requests = 0

module.exports =
	requests: (cb)->
		cb(null, total_requests++)

Now if I include this configuration in xlenv,

xlenv.override 'counters', require('counter-conf.coffee')

I can ask xlenv for an asynchronous dependency injection :

xlenv.inject ["counters.requests"], (err, counter)->
	console.log(counter)

Each time this code is executed, the counter will be incremented for me.

This kind of initialization can be very handy when an asynchronous callback is required to get a value. Let's modify our counter to use Redis to store its value !

redis = require('redis').createClient()

module.exports =
	requests: (cb)->
		redis.incr 'requests', cb

Now each time I inject "counters.request", a request will be made to Redis to increment the counter.

But if try to use xlenv.counters.requests, the function will be returned, not the counter...

Finally, inject can be used for singletons too, if the property name is prefixed with =:

xlenv.inject ["=redis"], (err, redis)-> # the same redis instance will be injected each time, not a new one
    # now use redis...

    xlenv.inject ["redis"], (err, anotherRedis)->
        # anotherRedis is != redis, it's a new one

Default Logs

To inherit of the default log configuration just invoke :

xlenv.override null, xlenv.Log

then to retreive the actual logger do:

xlenv.Logger xlenv.logs, (err, logger)->
	xlenv.log = logger