@gooddata/gooddata-js
Version:
GoodData JavaScript SDK
123 lines (122 loc) • 5.02 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var isEmpty_1 = __importDefault(require("lodash/isEmpty"));
var omit_1 = __importDefault(require("lodash/omit"));
var isArray_1 = __importDefault(require("lodash/isArray"));
var isObject_1 = __importDefault(require("lodash/isObject"));
var isString_1 = __importDefault(require("lodash/isString"));
var json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
var uuid_1 = require("uuid");
var uri_1 = require("./DataLayer/helpers/uri");
/*
* Helpers
*/
var getReferenceValue = function (id, references) { return references[id]; };
var getReferenceId = function (value, references) {
return Object.keys(references).find(function (id) { return references[id] === value; });
};
var defaultIdGenerator = function () { return uuid_1.v4().replace(/-/g, ""); };
/**
* Recursively traverses the object and tries to apply a conversion to every string value
*/
var traverse = function (obj, convert) {
if (isArray_1.default(obj)) {
return obj.map(function (a) { return traverse(a, convert); });
}
else if (isObject_1.default(obj)) {
var object_1 = obj;
return Object.keys(object_1).reduce(function (result, key) {
result[key] = traverse(object_1[key], convert);
return result;
}, {});
}
else if (isString_1.default(obj)) {
return convert(obj);
}
else {
return obj;
}
};
var createConverter = function (conversionFunction) { return function (mdObject, idGenerator) {
if (idGenerator === void 0) { idGenerator = defaultIdGenerator; }
var content = mdObject.content;
if (!content) {
return mdObject;
}
var properties = content.properties;
if (!properties) {
return mdObject;
}
// prepare result objects
var originalProperties = JSON.parse(properties);
var originalReferences = content.references || {};
var _a = conversionFunction(originalProperties, originalReferences, idGenerator), convertedProperties = _a.convertedProperties, convertedReferences = _a.convertedReferences;
// set the new properties and references
var referencesProp = isEmpty_1.default(convertedReferences) ? undefined : { references: convertedReferences };
var result = __assign({}, mdObject, { content: __assign({}, omit_1.default(mdObject.content, "references"), { properties: json_stable_stringify_1.default(convertedProperties) }, referencesProp) });
return result;
}; };
/*
* Conversion from References to URIs
*/
var convertReferenceToUri = function (references) { return function (value) { return getReferenceValue(value, references) || value; }; };
/**
* Converts reference based values to actual URIs
*
* @param mdObject The object to convert properties of
* @param [idGenerator=uuid] Function that returns unique ids
*/
exports.convertReferencesToUris = createConverter(function (originalProperties, originalReferences) {
var convertedProperties = traverse(originalProperties, convertReferenceToUri(originalReferences));
return {
convertedProperties: convertedProperties,
convertedReferences: originalReferences,
};
});
/*
* Conversion from URIs to References
*/
var createUriToReferenceConverter = function (originalReferences, idGenerator) {
var convertedReferences = {};
return {
convertedReferences: convertedReferences,
conversion: function (value) {
if (!uri_1.isUri(value)) {
return value;
}
var id = getReferenceId(value, originalReferences) || // try to reuse original references
getReferenceId(value, convertedReferences) || // or use already converted new references
idGenerator(); // or get a completely new id
convertedReferences[id] = value;
return id;
},
};
};
/**
* Converts URIs to reference based values
*
* @param mdObject The object to convert properties of
* @param [idGenerator=uuid] Function that returns unique ids
*/
exports.convertUrisToReferences = createConverter(function (originalProperties, originalReferences, idGenerator) {
var converter = createUriToReferenceConverter(originalReferences, idGenerator);
var convertedProperties = traverse(originalProperties, converter.conversion);
return {
convertedProperties: convertedProperties,
convertedReferences: converter.convertedReferences,
};
});