diff --git a/build.sh b/build.sh index 04d6d34..ffcfd6c 100755 --- a/build.sh +++ b/build.sh @@ -1,3 +1,14 @@ +#!/bin/sh + ./node_modules/.bin/jshint jsonrest-api.js ./node_modules/.bin/docco jsonrest-api.js -o doc -cp -r doc/* ../gh-pages/seneca-jsonrest-api/doc + +PAGES_ROOT=../gh-pages +DOC_DIR=seneca-jsonrest-api/doc + +if [ -d "$PAGES_ROOT" ]; then + if [ ! -d "$PAGES_ROOT/$DOC_DIR" ]; then + mkdir -p "$PAGES_ROOT/$DOC_DIR" + fi + cp -r doc/* "$PAGES_ROOT/$DOC_DIR" +fi diff --git a/doc/jsonrest-api.html b/doc/jsonrest-api.html index 84588e9..b8c7ec7 100644 --- a/doc/jsonrest-api.html +++ b/doc/jsonrest-api.html @@ -32,108 +32,99 @@

jsonrest-api.js

/* Copyright (c) 2013-2015 Richard Rodger, MIT License */
 /* jshint node:true, asi:true, eqnull:true */
-"use strict";
-
+'use strict'
 
 var _ = require('lodash')
 
-
-function noware(req,res,next) {
+function noware (req, res, next) {
   next()
 }
 
-
-function parseJSON(o) {
+function parseJSON (o) {
   return null == o ? {} : _.isString(o) ? JSON.parse(o) : o
 }
 
-var notfoundres = {httpstatus$:404}
+var notfoundres = {httpstatus$: 404}
 
 var mark = '-'
 
-
-module.exports = function( options ) {
+module.exports = function (options) {
   /* jshint validthis:true */
   var seneca = this
-  var plugin = "jsonrest-api"
+  var plugin = 'jsonrest-api'
 
   options = seneca.util.deepextend({
-    prefix:'/api/rest',
-    aspect:false,
-    list:{embed:false},
-    allow_id:false,
+    prefix: '/api/rest',
+    aspect: false,
+    list: {embed: false},
+    allow_id: false,
 
-    startware:noware,
-    premap:noware,
-    postmap:noware,
-    endware:noware,
+    startware: noware,
+    premap: noware,
+    postmap: noware,
+    endware: noware,
 
-    meta:true,
-    canonalias:{},
-    pin:null
-  },options)
+    meta: true,
+    canonalias: {},
+    pin: null
+  }, options)
 
-  
-
-  var validprops = {zone:1,base:1,name:1}
+  var validprops = {zone: 1, base: 1, name: 1}
 
   var pins = options.pin
 
   pins = pins ? _.isArray(pins) ? pins : [pins] : []
 
-  _.map(pins,function(pin){
+  _.map(pins, function (pin) {
     pin = _.isString(pin) ? seneca.util.parsecanon(pin) : pin
-    _.each(pin,function(v,k){
-      if( null == v || '' === v || '*' === v || !validprops[k]) {
+    _.each(pin, function (v, k) {
+      if (null == v || '' === v || '*' === v || !validprops[k]) {
         delete pin[k]
       }
-      _.each(validprops, function(z,vp){
-        if( null == pin[vp] ) {
+      _.each(validprops, function (z, vp) {
+        if (null == pin[vp]) {
           pin[vp] = mark
         }
       })
-
     })
   })
-  if( 0 === pins.length ) {
+  if (0 === pins.length) {
     pins.push({})
   }
 
-
-  function parse_ent(args) {
+  function parse_ent (args) {
     var out = {
-      name:  mark==args.name ? void 0 : args.name,
-      base:  mark==args.base ? void 0 : args.base,
-      zone:  mark==args.zone ? void 0 : args.zone,
+      name: mark === args.name ? void 0 : args.name,
+      base: mark === args.base ? void 0 : args.base,
+      zone: mark === args.zone ? void 0 : args.zone,
       entid: args.id
     }
 
     return out
   }
 
-
-  function make_aspect(kind){
-    return function (si,ctxt,done,func){
-      if( options.aspect ) {
+  function make_aspect (kind) {
+    return function (si, ctxt, done, func) {
+      if (options.aspect) {
         si.act(
-          {role:plugin,prefix:options.prefix,aspect:kind, 
-           advice:'before', ctxt:ctxt, default$:ctxt}, 
-          function(err,ctxt) {
-            if( err ) return done(err);
+          {role: plugin, prefix: options.prefix, aspect: kind,
+          advice: 'before', ctxt: ctxt, default$: ctxt},
+          function (err, ctxt) {
+            if (err) return done(err)
 
-            func.call(si,ctxt,function(err,out){
-              if( err ) return done(err);
+            func.call(si, ctxt, function (err, out) {
+              if (err) return done(err)
 
               ctxt.out = out
               si.act(
-                {role:plugin,prefix:options.prefix,aspect:kind, 
-                 advice:'after', ctxt:ctxt, default$:out},
+                {role: plugin, prefix: options.prefix, aspect: kind,
+                advice: 'after', ctxt: ctxt, default$: out},
                 done
               )
             })
           })
       }
-      else return func.call(si,ctxt,done)
+      else return func.call(si, ctxt, done)
     }
   }
 
@@ -142,79 +133,72 @@ 

jsonrest-api.js

var save_aspect = make_aspect('save') var remove_aspect = make_aspect('remove') - - _.each(pins,function(pin){ - + _.each(pins, function (pin) { seneca.add( - _.extend({},pin,{role:plugin,prefix:options.prefix,method:'get'}), + _.extend({}, pin, {role: plugin, prefix: options.prefix, method: 'get'}), action_get) seneca.add( - _.extend({},pin,{role:plugin,prefix:options.prefix,method:'put'}), - function(args,done){ - action_putpost(this,args,done) + _.extend({}, pin, {role: plugin, prefix: options.prefix, method: 'put'}), + function (args, done) { + action_putpost(this, args, done) }) seneca.add( - _.extend({},pin,{role:plugin,prefix:options.prefix,method:'post'}), - function(args,done){ - action_putpost(this,args,done) + _.extend({}, pin, {role: plugin, prefix: options.prefix, method: 'post'}), + function (args, done) { + action_putpost(this, args, done) }) seneca.add( - _.extend({},pin,{role:plugin,prefix:options.prefix,method:'delete'}), + _.extend({}, pin, {role: plugin, prefix: options.prefix, method: 'delete'}), action_delete) }) + function action_get (args, done) { + var ent_type = parse_ent(args) + var qent = this.make(ent_type.zone, ent_type.base, ent_type.name) - - - function action_get(args,done){ - var ent_type = parse_ent(args) - - var qent = this.make(ent_type.zone,ent_type.base,ent_type.name) - - if( ent_type.entid ) { - load_aspect(this,{args:args,qent:qent},done,function(ctxt,done){ - ctxt.qent.load$(ent_type.entid,function(err,ent){ - var data = ent ? ent.data$(options.meta,'string') : notfoundres - done( err, data ) + if (ent_type.entid) { + load_aspect(this, {args: args, qent: qent}, done, function (ctxt, done) { + ctxt.qent.load$(ent_type.entid, function (err, ent) { + var data = ent ? ent.data$(options.meta, 'string') : notfoundres + done(err, data) }) }) - } - else { + } else { var q = parseJSON(args.q) - if( args.limit ) { - q.limit$ = parseInt(args.limit,10) + if (args.limit) { + q.limit$ = parseInt(args.limit, 10) } - if( args.skip ) { - q.skip$ = parseInt(args.skip,10) + if (args.skip) { + q.skip$ = parseInt(args.skip, 10) } - if( args.sort ) { - q.sort$ = parseJSON( args.sort ) + if (args.sort) { + q.sort$ = parseJSON(args.sort) } + list_aspect(this, {args: args, q: q, qent: qent}, done, function (ctxt, done) { + ctxt.qent.list$(ctxt.q, function (err, list) { + if (err) return done(err) - list_aspect(this,{args:args,q:q,qent:qent},done,function(ctxt,done){ - ctxt.qent.list$(ctxt.q,function(err,list){ - if( err ) return done(err); - - var out, data = _.map(list,function(ent){ - var data = ent.data$(options.meta,'string') + var out + var data = _.map(list, function (ent) { + var data = ent.data$(options.meta, 'string') return data }) - if( _.isString(options.list.embed) ) { + if (_.isString(options.list.embed)) { out = {} out[options.list.embed] = data } - else out = data; + else out = data - done(err,out) + done(err, out) }) }) } @@ -233,72 +217,65 @@

jsonrest-api.js

-
  function action_putpost(si,args,done) {
+            
  function action_putpost (si, args, done) {
     var ent_type = parse_ent(args)
 
-    var ent = si.make(ent_type.zone,ent_type.base,ent_type.name)
+    var ent = si.make(ent_type.zone, ent_type.base, ent_type.name)
 
     var data = args.data || {}
 
-    var good = _.filter(_.keys(data),function(k){return !~k.indexOf('$')})
+    var good = _.filter(_.keys(data), function (k) { return !~k.indexOf('$') })
 
-    var fields = _.pick(data,good)
+    var fields = _.pick(data, good)
     ent.data$(fields)
 
-    if( null != ent_type.entid ) {
+    if (null != ent_type.entid) {
       ent.id = ent_type.entid
     }
-    else if( null != data.id$ && options.allow_id ) {
+    else if (null != data.id$ && options.allow_id) {
       ent.id$ = data.id$
     }
 
-    save_aspect(si,{args:args,ent:ent},done,function(ctxt,done){
-      ctxt.ent.save$(function(err,ent){
-        var data = ent ? ent.data$(true,'string') : null
+    save_aspect(si, {args: args, ent: ent}, done, function (ctxt, done) {
+      ctxt.ent.save$(function (err, ent) {
+        var data = ent ? ent.data$(true, 'string') : null
         done(err, data)
       })
     })
   }
 
-
-
-
-
-
-  function action_delete(args,done){
+  function action_delete (args, done) {
     var ent_type = parse_ent(args)
 
-    if( ent_type.entid ) {
-      var ent = this.make(ent_type.zone,ent_type.base,ent_type.name)
+    if (ent_type.entid) {
+      var ent = this.make(ent_type.zone, ent_type.base, ent_type.name)
 
-      remove_aspect(this,{args:args,ent:ent},done,function(ctxt,done){
-        ctxt.ent.remove$(ent_type.entid,function(err){
-          return done(null,{id:ent_type.entid})
+      remove_aspect(this, {args: args, ent: ent}, done, function (ctxt, done) {
+        ctxt.ent.remove$(ent_type.entid, function (err) {
+          return done(null, {id: ent_type.entid})
         })
       })
     }
-    else return done(null,{id:null})
+    else return done(null, {id: null})
   }
 
-
-  
-  function resolve(req,res,args,act,respond) {
-    var kind  = options.canonalias[req.params.kind] || req.params.kind
+  function resolve (req, res, args, act, respond) {
+    var kind = options.canonalias[req.params.kind] || req.params.kind
     var parts = kind.split('_')
-    
-    function def(p) { return _.isString(p) ? (0 < p.length ? p : void 0) : void 0 }
 
-    if( 3 == parts.length ) {
+    function def (p) { return _.isString(p) ? (0 < p.length ? p : void 0) : void 0 }
+
+    if (3 == parts.length) {
       args.zone = def(parts[0])
       args.base = def(parts[1])
       args.name = def(parts[2])
     }
-    else if( 2 == parts.length ) {
+    else if (2 == parts.length) {
       args.zone = mark
       args.base = def(parts[0])
       args.name = def(parts[1])
     }
-    else if( 1 == parts.length ) {
+    else if (1 == parts.length) {
       args.zone = mark
       args.base = mark
       args.name = def(parts[0])
@@ -319,36 +296,35 @@ 

jsonrest-api.js

-    if( req.query ) {
-      args.q = seneca.util.clean( _.extend({},args.q$,req.query) )
+    if (req.query) {
+      args.q = seneca.util.clean(_.extend({}, args.q$, req.query))
 
-      if( req.query.q$ ) {
-        args.q = _.extend(JSON.parse(req.query.q$),args.q)
+      if (req.query.q$) {
+        args.q = _.extend(JSON.parse(req.query.q$), args.q)
       }
 
-      if( req.query.skip$ ) {
-        args.skip = parseInt(req.query.skip$)
+      if (req.query.skip$) {
+        args.skip = parseInt(req.query.skip$, 10)
       }
 
-      if( req.query.limit$ ) {
-        args.limit = parseInt(req.query.limit$)
+      if (req.query.limit$) {
+        args.limit = parseInt(req.query.limit$, 10)
       }
 
-      if( req.query.sort$ ) {
+      if (req.query.sort$) {
         args.sort = req.query.sort$
       }
     }
-    
-    act(args,respond)
+
+    act(args, respond)
   }
 
+  _.each(pins, function (pin) {
+    pin = _.extend({}, pin, {role: plugin, prefix: options.prefix, method: '*'})
 
-  _.each(pins, function(pin){
-    pin = _.extend({},pin,{role:plugin,prefix:options.prefix,method:'*'})
-    
-    seneca.act({role:'web',use:{
-      prefix:options.prefix,
-      pin:pin,
+ seneca.act({role: 'web', use: { + prefix: options.prefix, + pin: pin,
@@ -363,22 +339,21 @@

jsonrest-api.js

-
      startware:options.startware,
-      premap:options.premap,
-      map:{
-        get:{GET:resolve,alias:':kind/:id?'},
-        put:{PUT:resolve,alias:':kind/:id?',data:true},
-        post:{POST:resolve,alias:':kind/:id?',data:true},
-        delete:{DELETE:resolve,alias:':kind/:id'}
+            
      startware: options.startware,
+      premap: options.premap,
+      map: {
+        get: {GET: resolve, alias: ':kind/:id?'},
+        put: {PUT: resolve, alias: ':kind/:id?', data: true},
+        post: {POST: resolve, alias: ':kind/:id?', data: true},
+        delete: {DELETE: resolve, alias: ':kind/:id'}
       },
-      postmap:options.postmap,
-      endware:options.endware,
+      postmap: options.postmap,
+      endware: options.endware
     }})
   })
 
-
   return {
-    name:plugin
+    name: plugin
   }
 }
diff --git a/jsonrest-api.js b/jsonrest-api.js index 7647061..cbcdb07 100644 --- a/jsonrest-api.js +++ b/jsonrest-api.js @@ -1,107 +1,102 @@ /* Copyright (c) 2013-2015 Richard Rodger, MIT License */ /* jshint node:true, asi:true, eqnull:true */ -"use strict"; - +'use strict' var _ = require('lodash') - -function noware(req,res,next) { +function noware (req, res, next) { next() } - -function parseJSON(o) { - return null == o ? {} : _.isString(o) ? JSON.parse(o) : o +function parseJSON (o) { + return o == null ? {} : _.isString(o) ? JSON.parse(o) : o } -var notfoundres = {httpstatus$:404} +var notfoundres = { + httpstatus$: 404, + code: 404, + message: 'Resource not found' +} var mark = '-' - -module.exports = function( options ) { +module.exports = function (options) { /* jshint validthis:true */ var seneca = this - var plugin = "jsonrest-api" + var plugin = 'jsonrest-api' options = seneca.util.deepextend({ - prefix:'/api/rest', - aspect:false, - list:{embed:false}, - allow_id:false, + prefix: '/api/rest', + aspect: false, + list: {embed: false}, + allow_id: false, - startware:noware, - premap:noware, - postmap:noware, - endware:noware, + startware: noware, + premap: noware, + postmap: noware, + endware: noware, - meta:true, - canonalias:{}, - pin:null - },options) + meta: true, + canonalias: {}, + pin: null + }, options) - - - var validprops = {zone:1,base:1,name:1} + var validprops = {zone: 1, base: 1, name: 1} var pins = options.pin pins = pins ? _.isArray(pins) ? pins : [pins] : [] - _.map(pins,function(pin){ + _.map(pins, function (pin) { pin = _.isString(pin) ? seneca.util.parsecanon(pin) : pin - _.each(pin,function(v,k){ - if( null == v || '' === v || '*' === v || !validprops[k]) { + _.each(pin, function (v, k) { + if (v == null || v === '' || v === '*' || !validprops[k]) { delete pin[k] } - _.each(validprops, function(z,vp){ - if( null == pin[vp] ) { + _.each(validprops, function (z, vp) { + if (pin[vp] == null) { pin[vp] = mark } }) - }) }) - if( 0 === pins.length ) { + if (pins.length === 0) { pins.push({}) } - - function parse_ent(args) { + function parse_ent (args) { var out = { - name: mark==args.name ? void 0 : args.name, - base: mark==args.base ? void 0 : args.base, - zone: mark==args.zone ? void 0 : args.zone, + name: mark === args.name ? void 0 : args.name, + base: mark === args.base ? void 0 : args.base, + zone: mark === args.zone ? void 0 : args.zone, entid: args.id } return out } - - function make_aspect(kind){ - return function (si,ctxt,done,func){ - if( options.aspect ) { + function make_aspect (kind) { + return function (si, ctxt, done, func) { + if (options.aspect) { si.act( - {role:plugin,prefix:options.prefix,aspect:kind, - advice:'before', ctxt:ctxt, default$:ctxt}, - function(err,ctxt) { - if( err ) return done(err); + {role: plugin, prefix: options.prefix, aspect: kind, + advice: 'before', ctxt: ctxt, default$: ctxt}, + function (err, ctxt) { + if (err) return done(err) - func.call(si,ctxt,function(err,out){ - if( err ) return done(err); + func.call(si, ctxt, function (err, out) { + if (err) return done(err) ctxt.out = out si.act( - {role:plugin,prefix:options.prefix,aspect:kind, - advice:'after', ctxt:ctxt, default$:out}, + {role: plugin, prefix: options.prefix, aspect: kind, + advice: 'after', ctxt: ctxt, default$: out}, done ) }) }) } - else return func.call(si,ctxt,done) + else return func.call(si, ctxt, done) } } @@ -110,211 +105,187 @@ module.exports = function( options ) { var save_aspect = make_aspect('save') var remove_aspect = make_aspect('remove') - - _.each(pins,function(pin){ - + _.each(pins, function (pin) { seneca.add( - _.extend({},pin,{role:plugin,prefix:options.prefix,method:'get'}), + _.extend({}, pin, {role: plugin, prefix: options.prefix, method: 'get'}), action_get) seneca.add( - _.extend({},pin,{role:plugin,prefix:options.prefix,method:'put'}), - function(args,done){ - action_putpost(this,args,done) + _.extend({}, pin, {role: plugin, prefix: options.prefix, method: 'put'}), + function (args, done) { + action_putpost(this, args, done) }) seneca.add( - _.extend({},pin,{role:plugin,prefix:options.prefix,method:'post'}), - function(args,done){ - action_putpost(this,args,done) + _.extend({}, pin, {role: plugin, prefix: options.prefix, method: 'post'}), + function (args, done) { + action_putpost(this, args, done) }) seneca.add( - _.extend({},pin,{role:plugin,prefix:options.prefix,method:'delete'}), + _.extend({}, pin, {role: plugin, prefix: options.prefix, method: 'delete'}), action_delete) }) + function action_get (args, done) { + var ent_type = parse_ent(args) + var qent = this.make(ent_type.zone, ent_type.base, ent_type.name) - - - function action_get(args,done){ - var ent_type = parse_ent(args) - - var qent = this.make(ent_type.zone,ent_type.base,ent_type.name) - - if( ent_type.entid ) { - load_aspect(this,{args:args,qent:qent},done,function(ctxt,done){ - ctxt.qent.load$(ent_type.entid,function(err,ent){ - var data = ent ? ent.data$(options.meta,'string') : notfoundres - done( err, data ) + if (ent_type.entid) { + load_aspect(this, {args: args, qent: qent}, done, function (ctxt, done) { + ctxt.qent.load$(ent_type.entid, function (err, ent) { + var data = ent ? ent.data$(options.meta, 'string') : notfoundres + done(err, data) }) }) - } - else { + } else { var q = parseJSON(args.q) - if( args.limit ) { - q.limit$ = parseInt(args.limit,10) + if (args.limit) { + q.limit$ = parseInt(args.limit, 10) } - if( args.skip ) { - q.skip$ = parseInt(args.skip,10) + if (args.skip) { + q.skip$ = parseInt(args.skip, 10) } - if( args.sort ) { - q.sort$ = parseJSON( args.sort ) + if (args.sort) { + q.sort$ = parseJSON(args.sort) } + list_aspect(this, {args: args, q: q, qent: qent}, done, function (ctxt, done) { + ctxt.qent.list$(ctxt.q, function (err, list) { + if (err) return done(err) - list_aspect(this,{args:args,q:q,qent:qent},done,function(ctxt,done){ - ctxt.qent.list$(ctxt.q,function(err,list){ - if( err ) return done(err); - - var out, data = _.map(list,function(ent){ - var data = ent.data$(options.meta,'string') + var out + var data = _.map(list, function (ent) { + var data = ent.data$(options.meta, 'string') return data }) - if( _.isString(options.list.embed) ) { + if (_.isString(options.list.embed)) { out = {} out[options.list.embed] = data } - else out = data; + else out = data - done(err,out) + done(err, out) }) }) } } - - // lenient with PUT and POST - treat them as aliases, and both can create new entities - function action_putpost(si,args,done) { + function action_putpost (si, args, done) { var ent_type = parse_ent(args) - var ent = si.make(ent_type.zone,ent_type.base,ent_type.name) + var ent = si.make(ent_type.zone, ent_type.base, ent_type.name) var data = args.data || {} - var good = _.filter(_.keys(data),function(k){return !~k.indexOf('$')}) + var good = _.filter(_.keys(data), function (k) { return !~k.indexOf('$') }) - var fields = _.pick(data,good) + var fields = _.pick(data, good) ent.data$(fields) - if( null != ent_type.entid ) { + if (ent_type.entid != null) { ent.id = ent_type.entid - } - else if( null != data.id$ && options.allow_id ) { + } else if (data.id$ != null && options.allow_id) { ent.id$ = data.id$ } - save_aspect(si,{args:args,ent:ent},done,function(ctxt,done){ - ctxt.ent.save$(function(err,ent){ - var data = ent ? ent.data$(true,'string') : null + save_aspect(si, {args: args, ent: ent}, done, function (ctxt, done) { + ctxt.ent.save$(function (err, ent) { + var data = ent ? ent.data$(true, 'string') : null done(err, data) }) }) } - - - - - - function action_delete(args,done){ + function action_delete (args, done) { var ent_type = parse_ent(args) - if( ent_type.entid ) { - var ent = this.make(ent_type.zone,ent_type.base,ent_type.name) + if (ent_type.entid) { + var ent = this.make(ent_type.zone, ent_type.base, ent_type.name) - remove_aspect(this,{args:args,ent:ent},done,function(ctxt,done){ - ctxt.ent.remove$(ent_type.entid,function(err){ - return done(null,{id:ent_type.entid}) + remove_aspect(this, {args: args, ent: ent}, done, function (ctxt, done) { + ctxt.ent.remove$(ent_type.entid, function (err) { + if (err) return done(err) + return done(null, {id: ent_type.entid}) }) }) } - else return done(null,{id:null}) + else return done(null, {id: null}) } - - - function resolve(req,res,args,act,respond) { - var kind = options.canonalias[req.params.kind] || req.params.kind + function resolve (req, res, args, act, respond) { + var kind = options.canonalias[req.params.kind] || req.params.kind var parts = kind.split('_') - - function def(p) { return _.isString(p) ? (0 < p.length ? p : void 0) : void 0 } - if( 3 == parts.length ) { + function def (p) { return _.isString(p) ? (p.length > 0 ? p : void 0) : void 0 } + + if (parts.length === 3) { args.zone = def(parts[0]) args.base = def(parts[1]) args.name = def(parts[2]) - } - else if( 2 == parts.length ) { + } else if (parts.length === 2) { args.zone = mark args.base = def(parts[0]) args.name = def(parts[1]) - } - else if( 1 == parts.length ) { + } else if (parts.length === 1) { args.zone = mark args.base = mark args.name = def(parts[0]) } - // query properties are verbatim // query meta data params use $ suffix - if( req.query ) { - args.q = seneca.util.clean( _.extend({},args.q$,req.query) ) + if (req.query) { + args.q = seneca.util.clean(_.extend({}, args.q$, req.query)) - if( req.query.q$ ) { - args.q = _.extend(JSON.parse(req.query.q$),args.q) + if (req.query.q$) { + args.q = _.extend(JSON.parse(req.query.q$), args.q) } - if( req.query.skip$ ) { - args.skip = parseInt(req.query.skip$) + if (req.query.skip$) { + args.skip = parseInt(req.query.skip$, 10) } - if( req.query.limit$ ) { - args.limit = parseInt(req.query.limit$) + if (req.query.limit$) { + args.limit = parseInt(req.query.limit$, 10) } - if( req.query.sort$ ) { + if (req.query.sort$) { args.sort = req.query.sort$ } } - - act(args,respond) - } + act(args, respond) + } - _.each(pins, function(pin){ - pin = _.extend({},pin,{role:plugin,prefix:options.prefix,method:'*'}) - - seneca.act({role:'web',use:{ - prefix:options.prefix, - pin:pin, - //pin:{role:plugin,prefix:options.prefix,method:'*'}, - startware:options.startware, - premap:options.premap, - map:{ - get:{GET:resolve,alias:':kind/:id?'}, - put:{PUT:resolve,alias:':kind/:id?',data:true}, - post:{POST:resolve,alias:':kind/:id?',data:true}, - delete:{DELETE:resolve,alias:':kind/:id'} + _.each(pins, function (pin) { + pin = _.extend({}, pin, {role: plugin, prefix: options.prefix, method: '*'}) + + seneca.act({role: 'web', use: { + prefix: options.prefix, + pin: pin, + // pin:{role:plugin,prefix:options.prefix,method:'*'}, + startware: options.startware, + premap: options.premap, + map: { + get: {GET: resolve, alias: ':kind/:id?'}, + put: {PUT: resolve, alias: ':kind/:id?', data: true}, + post: {POST: resolve, alias: ':kind/:id?', data: true}, + delete: {DELETE: resolve, alias: ':kind/:id'} }, - postmap:options.postmap, - endware:options.endware, + postmap: options.postmap, + endware: options.endware }}) }) - return { - name:plugin + name: plugin } } - - - diff --git a/package.json b/package.json index c91335c..5dcdea7 100644 --- a/package.json +++ b/package.json @@ -20,17 +20,17 @@ "author": "Richard Rodger (@rjrodger)", "license": "MIT", "devDependencies": { - "body-parser": "~1.11.0", - "connect": "~3.3.4", - "docco": "~0.6.3", - "gex": "~0.2.0", - "jshint": "~2.6.0", - "mocha": "~2.1.0", + "body-parser": "^1.14.1", + "connect": "^3.4.0", + "docco": "^0.7.0", + "gex": "^0.2.2", + "jshint": "^2.8.0", + "mocha": "^2.3.4", "seneca": "plugin", - "serve-static": "~1.8.1" + "serve-static": "^1.10.0" }, "dependencies": { - "lodash": "~2.4.1" + "lodash": "^3.10.1" }, "files": [ "README.md", diff --git a/test.sh b/test.sh index bc2a00b..914d2dc 100755 --- a/test.sh +++ b/test.sh @@ -10,31 +10,30 @@ POST_FOO_a0=`curl -m 1 -s -d '{"tag":"AA","zed":1}' -H "Content-Type: applicatio GET_FOO_a1=`curl -m 1 -s http://localhost:3000/api/rest/foo/a` kill -9 $NODE_PID -if [ $GET_FOO_a0 != '{"entity$":"-/-/foo","tag":"A","id":"a"}' ]; then +if [ $GET_FOO_a0 != '{"tag":"A","id":"a"}' ]; then echo "FAIL: $GET_FOO_a0" exit 1 else echo "PASS: $GET_FOO_a0" fi -if [ $GET_FOO_b0 != '{"entity$":"-/-/foo","tag":"B","id":"b"}' ]; then +if [ $GET_FOO_b0 != '{"tag":"B","id":"b"}' ]; then echo "FAIL: $GET_FOO_b0" exit 1 else echo "PASS: $GET_FOO_b0" fi -if [ $POST_FOO_a0 != '{"entity$":"-/-/foo","tag":"AA","zed":1,"id":"a"}' ]; then +if [ $POST_FOO_a0 != '{"tag":"AA","zed":1,"id":"a"}' ]; then echo "FAIL: $POST_FOO_a0" exit 1 else echo "PASS: $POST_FOO_a0" fi -if [ $GET_FOO_a1 != '{"entity$":"-/-/foo","tag":"AA","zed":1,"id":"a"}' ]; then +if [ $GET_FOO_a1 != '{"tag":"AA","zed":1,"id":"a"}' ]; then echo "FAIL: $GET_FOO_a1" exit 1 else echo "PASS: $GET_FOO_a1" fi - diff --git a/test/basic.app.js b/test/basic.app.js index 11795c0..fc4c418 100644 --- a/test/basic.app.js +++ b/test/basic.app.js @@ -1,30 +1,24 @@ /* Copyright (c) 2013-2015 Richard Rodger */ -"use strict"; +'use strict' - -// node basic.app.js +// node basic.app.js // must be run inside test folder so static works -var connect = require('connect') +var connect = require('connect') var serveStatic = require('serve-static') -var bodyParser = require('body-parser') +var bodyParser = require('body-parser') var seneca = require('seneca')() -seneca.use( require('..') ) - - +seneca.use(require('..')) var app = connect() -app.use( serveStatic('./public') ) -app.use( bodyParser.json() ) -app.use( seneca.export('web') ) +app.use(serveStatic('./public')) +app.use(bodyParser.json()) +app.use(seneca.export('web')) app.listen(3000) - var foo_ent = seneca.make('foo') -foo_ent.make$({id$:'a',tag:'A'}).save$() -foo_ent.make$({id$:'b',tag:'B'}).save$() - - +foo_ent.make$({id$: 'a', tag: 'A'}).save$() +foo_ent.make$({id$: 'b', tag: 'B'}).save$() diff --git a/test/jsonrest-api.test.js b/test/jsonrest-api.test.js index 2d02d35..1618f6c 100644 --- a/test/jsonrest-api.test.js +++ b/test/jsonrest-api.test.js @@ -1,112 +1,95 @@ /* Copyright (c) 2013-2015 Richard Rodger */ -"use strict"; +'use strict' +/* global it describe*/ // mocha jsonrest-api.test.js +var assert = require('assert') - -var assert = require('assert') -var util = require('util') - - -var _ = require('lodash') -var gex = require('gex') - - -var jsonrest_api = require('..') - +var gex = require('gex') var seneca = require('seneca')() +seneca.use(require('..')) +seneca.use(require('..'), {tag$: 'aspects', aspect: true, prefix: '/aspects/rest'}) +seneca.use(require('..'), {tag$: 'injects', aspect: true, prefix: '/inject/rest'}) +seneca.use(require('..'), {tag$: 'access', aspect: 'user-access', prefix: '/access/rest'}) -seneca.use( require('..') ) -seneca.use( require('..'), {tag$:'aspects', aspect:true, prefix:'/aspects/rest'}) -seneca.use( require('..'), {tag$:'injects', aspect:true, prefix:'/inject/rest'}) -seneca.use( require('..'), {tag$:'access', aspect:'user-access', prefix:'/access/rest'}) - - -var jsonrestapi = seneca.pin({role:'jsonrest-api',prefix:'/api/rest',method:'*'}) -var jsonrestapi_aspects = seneca.pin({role:'jsonrest-api',prefix:'/aspects/rest',method:'*'}) -var jsonrestapi_inject = seneca.pin({role:'jsonrest-api',prefix:'/inject/rest',method:'*'}) -var jsonrestapi_access = seneca.pin({role:'jsonrest-api',prefix:'/access/rest',method:'*'}) +var jsonrestapi = seneca.pin({role: 'jsonrest-api', prefix: '/api/rest', method: '*'}) +var jsonrestapi_aspects = seneca.pin({role: 'jsonrest-api', prefix: '/aspects/rest', method: '*'}) +var jsonrestapi_inject = seneca.pin({role: 'jsonrest-api', prefix: '/inject/rest', method: '*'}) - -seneca.add({role:'jsonrest-api',prefix:'/inject/rest',aspect:'save',advice:'before'},function(args,done){ - args.ctxt.ent.b=2 - done(null,args.ctxt) +seneca.add({role: 'jsonrest-api', prefix: '/inject/rest', aspect: 'save', advice: 'before'}, function (args, done) { + args.ctxt.ent.b = 2 + done(null, args.ctxt) }) -seneca.add({role:'jsonrest-api',prefix:'/inject/rest',aspect:'load',advice:'after'},function(args,done){ - args.ctxt.out.b=3 - done(null,args.ctxt.out) +seneca.add({role: 'jsonrest-api', prefix: '/inject/rest', aspect: 'load', advice: 'after'}, function (args, done) { + args.ctxt.out.b = 3 + done(null, args.ctxt.out) }) -seneca.add({role:'jsonrest-api',prefix:'/inject/rest',aspect:'list',advice:'before'},function(args,done){ +seneca.add({role: 'jsonrest-api', prefix: '/inject/rest', aspect: 'list', advice: 'before'}, function (args, done) { // still 2, as after advice did not change persistent version - args.ctxt.q.b=2 - done(null,args.ctxt) + args.ctxt.q.b = 2 + done(null, args.ctxt) }) -seneca.add({role:'jsonrest-api',prefix:'/inject/rest',aspect:'remove',advice:'after'},function(args,done){ - args.ctxt.out.b=4 - done(null,args.ctxt.out) +seneca.add({role: 'jsonrest-api', prefix: '/inject/rest', aspect: 'remove', advice: 'after'}, function (args, done) { + args.ctxt.out.b = 4 + done(null, args.ctxt.out) }) - - -function squish(obj) { return util.inspect(obj).replace(/\s+/g,'') } - - -describe('jsonrest-api', function() { - - it('version', function() { - assert.ok(gex(seneca.version),'0.5.*') +describe('jsonrest-api', function () { + it('version', function () { + assert.ok(gex(seneca.version), '0.5.*') }) - - function do_methods(pin,entname,vals) { - return function() { - ;pin.post({name:entname,data:{a:1}},function(err,saved){ - assert.ok(null==err) + function do_methods (pin, entname, vals) { + return function () { + ;pin.post({name: entname, data: {a: 1}}, function (err, saved) { + assert.ok(err == null) assert.ok(saved.id) - assert.equal(saved.a,1) - assert.equal(seneca.util.parsecanon(saved.entity$).name,entname) - if( vals ) { assert.equal(saved.b,vals[0]) } - - ;pin.get({name:entname,id:saved.id},function(err,loaded){ - //console.dir(loaded) - assert.ok(null==err) - assert.equal(loaded.id,saved.id) - assert.equal(loaded.a,1) - assert.equal(seneca.util.parsecanon(loaded.entity$).name,entname) - if( vals ) { assert.equal(loaded.b,vals[1]) } - - ;pin.get({name:entname},function(err,list){ - //console.dir(list) - assert.ok(null==err) - assert.equal(1,list.length) - assert.equal(list[0].a,1) - assert.equal(seneca.util.parsecanon(list[0].entity$).name,entname) - if( vals ) { assert.equal(list[0].b,vals[0]) } - - ;pin.delete({name:entname,id:saved.id},function(err,deleted){ - //console.dir(deleted) - assert.ok(null==err) - assert.equal(loaded.id,deleted.id) - if( vals ) { assert.equal(deleted.b,vals[2]) } - - ;pin.get({name:entname},function(err,list){ - //console.dir(list) - assert.ok(null==err) - assert.equal(0,list.length) - - }) }) }) }) }) + assert.equal(saved.a, 1) + assert.equal(seneca.util.parsecanon(saved.entity$).name, entname) + if (vals) { assert.equal(saved.b, vals[0]) } + + ;pin.get({name: entname, id: saved.id}, function (err, loaded) { + // console.dir(loaded) + assert.ok(err == null) + assert.equal(loaded.id, saved.id) + assert.equal(loaded.a, 1) + assert.equal(seneca.util.parsecanon(loaded.entity$).name, entname) + if (vals) { assert.equal(loaded.b, vals[1]) } + + ;pin.get({name: entname}, function (err, list) { + // console.dir(list) + assert.ok(err == null) + assert.equal(1, list.length) + assert.equal(list[0].a, 1) + assert.equal(seneca.util.parsecanon(list[0].entity$).name, entname) + if (vals) { assert.equal(list[0].b, vals[0]) } + + ;pin.delete({name: entname, id: saved.id}, function (err, deleted) { + // console.dir(deleted) + assert.ok(err == null) + assert.equal(loaded.id, deleted.id) + if (vals) { assert.equal(deleted.b, vals[2]) } + + ;pin.get({name: entname}, function (err, list) { + // console.dir(list) + assert.ok(err == null) + assert.equal(0, list.length) + }) + }) + }) + }) + }) } } - - it('happy', do_methods(jsonrestapi,'foo')) - it('aspect_defaults', do_methods(jsonrestapi_aspects,'bar')) - it('aspect_inject', do_methods(jsonrestapi_inject,'zoo',[2,3,4])) + it('happy', do_methods(jsonrestapi, 'foo')) + it('aspect_defaults', do_methods(jsonrestapi_aspects, 'bar')) + it('aspect_inject', do_methods(jsonrestapi_inject, 'zoo', [2, 3, 4])) }) diff --git a/test/public/index.html b/test/public/index.html index ca8fb02..c8f5a9c 100644 --- a/test/public/index.html +++ b/test/public/index.html @@ -1,3 +1,2 @@ - seneca-jsonrest-api