Skip to content

cainus/hyper-json

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

hyper-json

Build Status Coverage Status NPM version

NPM

This is a fluent interface for adding links to json documents. Links are added in the Hyper+json style (documented here ).

This sort of library is useful if you want to create hypermedia apis using json.

A few examples:

Basic Usage (.toString())

Creates json strings from objects.

var hyperjson = require('hyperjson');
hyperjson({thisis : "a test"}).toString();  // '{"thisis":"a test"}'

.toObject()

Returns the resulting "json" object.

hyperjson({thisis : "a test"}).toObject();  // {"thisis":"a test"}

.property()

Adds a property to the json output.

hyperjson({thisis : "a test"})
  .property("prop1", {random : "value"})
  .toObject();                 /* { 
                                    thisis : "a test", 
                                    prop1 : {
                                      random : "value"}
                                  }
                               */

.link()

Adds a link to the json output.

hyperjson({thisis : "a test"})
  .link("self", "http://localhost:8080/api/test")
  .toObject();                 /* { 
                                    thisis : "a test", 
                                    _links : {
                                      self : {
                                        href : "http://localhost:8080/api/test"
                                      }
                                  }
                               */

This can be called multiple times to add more links. Note that if two links are assigned to the same key, the key will be mapped to an array of links.

hyperjson({thisis : "a test"})
  .link("self", "http://localhost:8080/api/test")
  .link("parent", "http://localhost:8080/api/")
  .link("kid", "http://localhost:8080/api/kid1")
  .link("kid", "http://localhost:8080/api/kid2")
  .toObject();                 /* { 
                                    thisis : "a test", 
                                    _links : {
                                      self : {
                                        href : "http://localhost:8080/api/test"
                                      },
                                      parent : {
                                        href : "http://localhost:8080/api/"
                                      },
                                      kid : [{
                                        href : "http://localhost:8080/api/kid1"
                                      },{
                                        href : "http://localhost:8080/api/kid2"
                                      }]
                                  }
                               */

link() can also be used to add non-traditional links for HTTP methods other than GET.

hyperjson({thisis : "a test"})
  .link("self", "http://percolatorjs.com", {type : 'application/json', schema : {}, method : 'POST'})
  .toObject();                  /* {  
                                      thisis : "a test", 
                                      _links : {
                                          self : { href : "http://percolatorjs.com",
                                                   type : 'application/json',
                                                   schema : {},
                                                   method : 'POST' }
                                      }
                                   }
                                */

In addition, the options argument of link() can also take a when property, which maps to a function or an expression. The link will be added if and only if this function or expression is truthy.

hyperjson({thisis : "a test"})
  .link("self", "http://percolatorjs.com", {when: 1 + 1 === 2, method: 'POST'})
  .toObject();                  /* {  
                                      thisis : "a test", 
                                      _links : {
                                          self : { 
                                            href : "http://percolatorjs.com",
                                            method: 'POST'
                                          }
                                      }
                                   }
                                */

hyperjson({thisis : "a test"})
  .link("self", "http://percolatorjs.com", {when: function(obj) {obj.thisis === "a test"})
  .toObject();                  /* {  
                                      thisis : "a test", 
                                      _links : {
                                          self : { href : "http://percolatorjs.com" }
                                      }
                                   }
                                */

hyperjson({thisis : "a test"})
  .link("self", "http://percolatorjs.com", {when: function(obj) {obj.thisis === "not a test"})
  .toObject();                  // {  thisis : "a test" } - no links are created
                                

Check out the hyper+json spec if you want to read more about these kinds of links.

About

Json with links!

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published