UNPKG

halfred

Version:

parses JSON HAL resources (Hypertext Application Language)

128 lines (107 loc) 3.37 kB
'use strict'; function Resource(links, curies, embedded, validationIssues) { var self = this; this._links = links || {}; this._initCuries(curies); this._embedded = embedded || {}; this._validation = validationIssues || []; } Resource.prototype._initCuries = function(curies) { this._curiesMap = {}; if (!curies) { this._curies = []; } else { this._curies = curies; for (var i = 0; i < this._curies.length; i++) { var curie = this._curies[i]; this._curiesMap[curie.name] = curie; } } this._preResolveCuries(); }; Resource.prototype._preResolveCuries = function() { this._resolvedCuriesMap = {}; for (var i = 0; i < this._curies.length; i++) { var curie = this._curies[i]; if (!curie.name) { continue; } for (var rel in this._links) { if (rel !== 'curies') { this._preResolveCurie(curie, rel); } } } }; Resource.prototype._preResolveCurie = function(curie, rel) { var link = this._links[rel]; var prefixAndReference = rel.split(/:(.+)/); var candidate = prefixAndReference[0]; if (curie.name === candidate) { if (curie.templated && prefixAndReference.length >= 1) { // TODO resolving templated CURIES should use a small uri template // lib, not coded here ad hoc var href = curie.href.replace(/(.*){(.*)}(.*)/, '$1' + prefixAndReference[1] + '$3'); this._resolvedCuriesMap[href] = rel; } else { this._resolvedCuriesMap[curie.href] = rel; } } }; Resource.prototype.allLinkArrays = function() { return this._links; }; Resource.prototype.linkArray = function(key) { return propertyArray(this._links, key); }; Resource.prototype.link = function(key, index) { return elementOfPropertyArray(this._links, key, index); }; Resource.prototype.hasCuries = function(key) { return this._curies.length > 0; }; Resource.prototype.curieArray = function(key) { return this._curies; }; Resource.prototype.curie = function(name) { return this._curiesMap[name]; }; Resource.prototype.reverseResolveCurie = function(fullUrl) { return this._resolvedCuriesMap[fullUrl]; }; Resource.prototype.allEmbeddedResourceArrays = function () { return this._embedded; }; Resource.prototype.embeddedResourceArray = function(key) { return propertyArray(this._embedded, key); }; Resource.prototype.embeddedResource = function(key, index) { return elementOfPropertyArray(this._embedded, key, index); }; Resource.prototype.original = function() { return this._original; }; function propertyArray(object, key) { return object != null ? object[key] : null; } function elementOfPropertyArray(object, key, index) { index = index || 0; var array = propertyArray(object, key); if (array != null && array.length >= 1) { return array[index]; } return null; } Resource.prototype.validationIssues = function() { return this._validation; }; // alias definitions Resource.prototype.allLinks = Resource.prototype.allLinkArrays; Resource.prototype.allEmbeddedArrays = Resource.prototype.allEmbeddedResources = Resource.prototype.allEmbeddedResourceArrays; Resource.prototype.embeddedArray = Resource.prototype.embeddedResourceArray; Resource.prototype.embedded = Resource.prototype.embeddedResource; Resource.prototype.validation = Resource.prototype.validationIssues; module.exports = Resource;