You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.1 KiB
65 lines
2.1 KiB
/** |
|
* JSON Schema link handler |
|
* Licensed under AFL-2.1 OR BSD-3-Clause |
|
*/ |
|
(function (root, factory) { |
|
if (typeof define === 'function' && define.amd) { |
|
// AMD. Register as an anonymous module. |
|
define([], function () { |
|
return factory(); |
|
}); |
|
} else if (typeof module === 'object' && module.exports) { |
|
// Node. Does not work with strict CommonJS, but |
|
// only CommonJS-like environments that support module.exports, |
|
// like Node. |
|
module.exports = factory(); |
|
} else { |
|
// Browser globals |
|
root.jsonSchemaLinks = factory(); |
|
} |
|
}(this, function () {// setup primitive classes to be JSON Schema types |
|
var exports = {}; |
|
exports.cacheLinks = true; |
|
exports.getLink = function(relation, instance, schema){ |
|
// gets the URI of the link for the given relation based on the instance and schema |
|
// for example: |
|
// getLink( |
|
// "brother", |
|
// {"brother_id":33}, |
|
// {links:[{rel:"brother", href:"Brother/{brother_id}"}]}) -> |
|
// "Brother/33" |
|
var links = schema.__linkTemplates; |
|
if(!links){ |
|
links = {}; |
|
var schemaLinks = schema.links; |
|
if(schemaLinks && schemaLinks instanceof Array){ |
|
schemaLinks.forEach(function(link){ |
|
/* // TODO: allow for multiple same-name relations |
|
if(links[link.rel]){ |
|
if(!(links[link.rel] instanceof Array)){ |
|
links[link.rel] = [links[link.rel]]; |
|
} |
|
}*/ |
|
links[link.rel] = link.href; |
|
}); |
|
} |
|
if(exports.cacheLinks){ |
|
schema.__linkTemplates = links; |
|
} |
|
} |
|
var linkTemplate = links[relation]; |
|
return linkTemplate && exports.substitute(linkTemplate, instance); |
|
}; |
|
|
|
exports.substitute = function(linkTemplate, instance){ |
|
return linkTemplate.replace(/\{([^\}]*)\}/g, function(t, property){ |
|
var value = instance[decodeURIComponent(property)]; |
|
if(value instanceof Array){ |
|
// 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 |
|
return '(' + value.join(',') + ')'; |
|
} |
|
return value; |
|
}); |
|
}; |
|
return exports; |
|
})); |