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

surface

v0.8.1

Published

A tiny middleware of RESTful API for koa.

Downloads

73

Readme

Surface

NPM version build status Test coverage NPM Monthly Downloads Dependencies License Tips

A tiny middleware of RESTful API for koa.

  • Dependence on koa-ovenware(koa-router).
  • Support both JSON and XML format.
  • Support customize response fields.
  • Support global authentication.
  • Add OPTIONS route for access control(CORS) automatically
  • Write a controller and get all route pattern you want.
  • Compatible with other middlewares including view renders.

Install

npm install surface --save

Simple Usage

####Require...

var surface = require('surface');

####Config...

surface(app);

####Controller file Default path of controllers: ./lib/controllers/

in index.js:

exports.index = function *() {
  this.body = 'hello koa';
};

Checkout the examples.

####Response body Request the root of the app, for example: http://localhost:3000/, will be:

#####in JSON

{
  "request": "/",
  "code": 200,
  "message": "OK",
  "data": "hello koa"
}

#####in XML

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <request>/</request>
  <code>200</code>
  <message>OK</message>
  <data>hello koa</data>
</response>

Conventions

####Action Mapping

route           http method    function of ctrl
:resource       get            index
:resource       post           create
:resource/:id   get            get
:resource/:id   put            update
:resource/:id   del            del

All routes can be customized by setting, see Default values; and also can be changed by controller api singly, see APIs - Routes.

####Resource Resource name will be the file name of the controller, if there is no alias set for the controller, see APIs - Alias.

APIs

####Deprecated

this.wrap // since 0.6.0

options.totally // since 0.6.0

####Options

surface(app[, options])

options see Default values ####Options.authenticate To register a global authentication function. ####Options.deny To set a function to handle the failing authentication.

authenticate and deny have to be Generator Function.

suface(app, {
  /**
   * Global authentication
   * @return {Boolean}
   */
  authenticate: function *() {
    // do something and return true for authenticated, false for denied.
    // this === ctx
  },
  deny: function *() {
    // this.body...
    // this === ctx
  },
  authenticatePattern: /^\/api/i // default to the same as prefixPattern
});

####Controller APIs #####Alias Set alias for the controller.

exports.alias = 'name_you_want';

#####Routes Set routes for the controller.

exports.routes = {
  entry: {
    method: 'get',
    path: '/index'
  }
};

#####Register route directly To register route pattern directly, see koa-router.

app.register('http method', 'name of this route', 'route url pattern', callback);

#####Skip Set true to not format by surface.

ctx.skip_surface = true;

#####Model Get model object.

/**
 * get model object by given controller file name
 *
 * @param   {String}   modelName   optional, undefined for the model has
 *                                 the the same name as this controller
 * @return  {Object}               model object
 */
ctx.model([modelName])
exports.model([modelName])

for exmample:

exports.get = function *() {
  this.model('abc'); // this === ctx
};
// or
exports.todo = function() {
  this.model(); // this === exports
};

#####Ctrl Get controller object.

/**
 * get ctrl object by given controller file name
 *
 * @param   {String}   ctrlName   optional, undefined for self
 * @return  {Object}              ctrl object
 */
ctx.ctrl([ctrlName])
exports.ctrl([ctrlName])

for exmample:

exports.get = function *() {
  this.ctrl(); // this === ctx
  // => return this exports
};
// or
exports.todo = function() {
  this.ctrl('abc'); // this === exports
};

#####Format Get the specifying format

  • by query parameter
  • by header Accept
  • by default setting via options.format

parmeter > Accept > options

Global configuration

####Default values

{
  root: './lib',        // root dir
  ctrl: 'controllers',  // controllers dir
  model: 'models'       // model dir
  format: 'json',       // format by default
  prefix: false,        // true,  only format the route match the prefixPattern;
                        // false, format all routes;
                        // String / RegExp, as the prefix of ALL routes.
                        // When `prefix` is a string / regexp and `options.prefixPattern` is not given, options.prefixPattern =  `new RegExp(prefix)` / `prefix`.
  prefixPattern: /^\/api\/v?\d{1,3}(\.\d{1,3}){0,2}/i,
                        // Only format the route match this pattern. Default to (not setting prefix and prefixPattern by `options`):
                        // /api/v1.1.1/**
                        // /api/0.0.1/**
                        // /api/1/**
  nosniff: true,        // X-Content-Type-Options
                        // see http://msdn.microsoft.com/library/ie/gg622941(v=vs.85).aspx
  options: 'Accept,Content-Type',
                        // false, not add OPTIONS routes for crossing domain requests automatically;
                        // String, to set Access-Control-Allow-Headers;
                        // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
  origin: '*',          // false, not add Access-Control-Allow-Origin header automatically;
                        // String, as value of Access-Control-Allow-Origin for all routes;
  authenticate: false,
  fields: {
    path: 'request',    // request url
    status: 'code',     // http status code
    message: 'msg',     // http status message
    data: 'data'        // real data
  },
  aliases: {
    'index': ''
  },
  routes: {
    'index': {
      method: 'get',
      path: ''
    },
    'create': {
      method: 'post',
      path: ''
    },
    'get': {
      method: 'get',
      path: '/:id'
    },
    'update': {
      method: 'put',
      path: '/:id'
    },
    'del': {
      method: 'delete',
      path: '/:id'
    }
  }
}

TODO

  • API Docs

License

MIT