halfred
Version:
parses JSON HAL resources (Hypertext Application Language)
128 lines (107 loc) • 3.37 kB
JavaScript
'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;