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
			| 
											3 years ago
										 | /**  | ||
|  |  * 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; | ||
|  | })); |