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

siren-resource

v0.0.8

Published

Resourceful routing with siren+json hypermedia for Express.

Downloads

3

Readme

siren-resource

Resourceful routing with siren+json hypermedia for Express.

Status - Developer Preview

Here be dragons.

What it does

Creates a bunch of routes for you automatically, based on resources, and maps them to actions. Here's the mapping, right from the source:

// GET /resource -> index
app.get( path,
  handler(path, 'index', options) );

// POST /resource -> create
app.post( path, 
  handler(path, 'create', options) );

// GET /resource/:id -> show
app.get( path + '/:id',
  handler(path, 'show', options) );

// PUT /resource/:id -> update / append
app.put( path + '/:id',
  handler(path, 'put', options) );

// DELETE /resource/:id -> delete
app.delete( path + '/:id',
  handler(path, 'delete', options) );

It also automatically sets content type to siren+json, and provides a super easy .entity() function to help you encode your responses so that they conform to the spec.

Usage

'use strict';

var express = require('express'),
  http = require('http'),
  resource = require('siren-resource'),
  bodyParser = require('body-parser'),
  methodOverride = require('method-override'),

  collection = resource.adapters.memory,  
  app = express(),
  server,
  port = 3000,

  // Collections are the database abstraction layer
  // that backs your resources. You can initialize
  // them by passing in an array of models.
  albums = collection({
    models: [
      {
        "id": "chmzq50np0002gfixtr1qp64o",
        "name": "Settle",
        "artist": "Disclosure",
        "artistId": "chmzq4l480001gfixe8a3nzhm",
        "coverImage": "/covers/medium/zrms5gxr.jpg",
        "year": "2013",
        "genres": [
          "electronic", "house", "garage", "UK garage",
          "future garage"
        ]
      }
    ],

    // They also take some config....
    config: {
      title: 'Albums',
      description: 'Some great albums you should ' +
        'listen to.',
      class: ['album']      
    }
  });

app.use( bodyParser.json() );
app.use( bodyParser.urlencoded({extended: true}) );
app.use( methodOverride() );
// app.use( log.requestLogger() );

// Once you're ready, hook up your RESTful
// routes by passing your collection into
// the resource() function.
resource('/albums', app, albums);

// Create the server
server = http.createServer(app);


server.listen(port, function () {
  console.log('Listening on port ' + port);
});

Here's what the output looks like:

{
  "title": "Albums",
  "properties": {
    "description": "Some great albums you should listen to.",
    "entityCount": 1
  },
  "entities": [
    {
      "id": "chmzq50np0002gfixtr1qp64o",
      "name": "Settle",
      "artist": "Disclosure",
      "artistId": "chmzq4l480001gfixe8a3nzhm",
      "coverImage": "/covers/medium/zrms5gxr.jpg",
      "year": "2013",
      "genres": [
        "electronic",
        "house",
        "garage",
        "UK garage",
        "future garage"
      ]
    }
  ],
  "entityAttributes": {
    "rel": [
      "item"
    ],
    "class": [
      "album"
    ]
  },
  "links": [
    {
      "rel": [
        "self"
      ],
      "href": "/albums"
    }
  ]
}

Error messaging

404 and 401 error handling routes get hooked up for you for unsupported methods and urls.

Paging

Pass paging rules in on the options, and it will automatically create prev / next links that look like. Those links work automatically, too:

/resource?offset=20&limit=10

Credits

Copyright (c) Eric Elliott 2013

Written for the book, "Programming JavaScript Applications" (O'Reilly)