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

choreographer

v0.3.0

Published

Your server is my stage -- dirt simple URL routing for Node.js. Easy to use, easy to understand. Sinatra-style API.

Downloads

6

Readme

Choreographer

Your server is my stage -- dirt simple URL routing for Node.js. Easy to use, easy to understand. Sinatra-style API.

(This has been tested with Node.js v0.2.0-v0.4.8. Should work with all subsequent versions too.)

Install

Get npm if you don't already have it, and then just run npm install choreographer.

Usage

Dirt simple:

var http = require('http'),
  router = require('choreographer').router();

router.get('/chatroom/*/messages', function(req, res, room) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('No messages in ' + room + '.\n');
})
.post('/chatroom/*/message', function(req, res, room) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Posted message to ' + room + '.\n');
})
.notFound(function(req, res) {
  res.writeHead(404, {'Content-Type': 'text/plain'});
  res.end('404: This server is just a skeleton for a chat server.\n' +
    'I\'m afraid ' + req.url + ' cannot be found here.\n');
});

http.createServer(router).listen(80);

Routes are easily made case-insensitive with the optional ignoreCase flag:

router.get('/HelloWorld', true, function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello, World!\n');
});

Routes default to case-sensitive without the flag, but you can change that:

//routes defined up 'til now defaulted to case-sensitive if flag omitted
router.ignoreCase = true;
//routes defined following default to case-insensitive if flag omitted

A star * in a route matches anything up to a slash /, but if you want to match slashes too you can simply use two stars **:

router.get('/static/**', function(req, res, path) {
  serveStaticFiles(path); //path could be 'file.ext' or 'folders/file.ext'
});

Most flexibly, regular expressions may also be used as routes:

router.get(/^\/hw(\d+)$/i, function(req, res, hwNum) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Homework '+hwNum+' isn\'t available yet.\n');
});

There's also put, delete, head, trace, options, and connect, and that's it! That's the entire API, short and sweet.

As in Sinatra, routes are first-come, first-serve (only the callback for the first route to be matched by a request is invoked, and routes are matched in the order they are defined). Also as in Sinatra, creating get routes automatically creates head routes.

Choreographer has to parse the URL to match the routes (obviously). For convenience, the .parsedUrl property on the http.ServerRequest object is set to the parsed URL object so you needn't re-parse the URL (unless that property is already set to a parsed URL object, in which case, Choreographer will just use that object).

Notice that router is just an event listener for the request event on http.createServer, so if you want a listener that does more than routing:

http.createServer(function(req, res) {
  //do middleware stuff before routing
  router.apply(this, arguments);
  //do more stuff
}).listen(80);

Understanding The Code

The code is just as simple: first half is the router, second half is the routes. Lightweight and easy to understand.

The entire architecture is designed around the philosophy of being so simple it obviously has no bugs, rather than so complicated it has no obvious bugs.

Open-Source License

GNU Lesser General Public License