[6a3a178] | 1 | /**
|
---|
| 2 | * JSON Schema link handler
|
---|
| 3 | * Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com)
|
---|
| 4 | * Licensed under the MIT (MIT-LICENSE.txt) license.
|
---|
| 5 | */
|
---|
| 6 | (function (root, factory) {
|
---|
| 7 | if (typeof define === 'function' && define.amd) {
|
---|
| 8 | // AMD. Register as an anonymous module.
|
---|
| 9 | define([], function () {
|
---|
| 10 | return factory();
|
---|
| 11 | });
|
---|
| 12 | } else if (typeof module === 'object' && module.exports) {
|
---|
| 13 | // Node. Does not work with strict CommonJS, but
|
---|
| 14 | // only CommonJS-like environments that support module.exports,
|
---|
| 15 | // like Node.
|
---|
| 16 | module.exports = factory();
|
---|
| 17 | } else {
|
---|
| 18 | // Browser globals
|
---|
| 19 | root.jsonSchemaLinks = factory();
|
---|
| 20 | }
|
---|
| 21 | }(this, function () {// setup primitive classes to be JSON Schema types
|
---|
| 22 | var exports = {};
|
---|
| 23 | exports.cacheLinks = true;
|
---|
| 24 | exports.getLink = function(relation, instance, schema){
|
---|
| 25 | // gets the URI of the link for the given relation based on the instance and schema
|
---|
| 26 | // for example:
|
---|
| 27 | // getLink(
|
---|
| 28 | // "brother",
|
---|
| 29 | // {"brother_id":33},
|
---|
| 30 | // {links:[{rel:"brother", href:"Brother/{brother_id}"}]}) ->
|
---|
| 31 | // "Brother/33"
|
---|
| 32 | var links = schema.__linkTemplates;
|
---|
| 33 | if(!links){
|
---|
| 34 | links = {};
|
---|
| 35 | var schemaLinks = schema.links;
|
---|
| 36 | if(schemaLinks && schemaLinks instanceof Array){
|
---|
| 37 | schemaLinks.forEach(function(link){
|
---|
| 38 | /* // TODO: allow for multiple same-name relations
|
---|
| 39 | if(links[link.rel]){
|
---|
| 40 | if(!(links[link.rel] instanceof Array)){
|
---|
| 41 | links[link.rel] = [links[link.rel]];
|
---|
| 42 | }
|
---|
| 43 | }*/
|
---|
| 44 | links[link.rel] = link.href;
|
---|
| 45 | });
|
---|
| 46 | }
|
---|
| 47 | if(exports.cacheLinks){
|
---|
| 48 | schema.__linkTemplates = links;
|
---|
| 49 | }
|
---|
| 50 | }
|
---|
| 51 | var linkTemplate = links[relation];
|
---|
| 52 | return linkTemplate && exports.substitute(linkTemplate, instance);
|
---|
| 53 | };
|
---|
| 54 |
|
---|
| 55 | exports.substitute = function(linkTemplate, instance){
|
---|
| 56 | return linkTemplate.replace(/\{([^\}]*)\}/g, function(t, property){
|
---|
| 57 | var value = instance[decodeURIComponent(property)];
|
---|
| 58 | if(value instanceof Array){
|
---|
| 59 | // the value is an array, it should produce a URI like /Table/(4,5,8) and store.get() should handle that as an array of values
|
---|
| 60 | return '(' + value.join(',') + ')';
|
---|
| 61 | }
|
---|
| 62 | return value;
|
---|
| 63 | });
|
---|
| 64 | };
|
---|
| 65 | return exports;
|
---|
| 66 | })); |
---|