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