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 | })); |
---|