ngx-airbrush
Version:
Angular client for jsonapi/Graphiti backends
344 lines • 21.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import Jsona from 'jsona';
import { v4 as uuid } from 'uuid';
var JsonapiConverter = /** @class */ (function () {
function JsonapiConverter() {
this.jsona = new Jsona();
}
/**
* @param {?} data
* @return {?}
*/
JsonapiConverter.prototype.deserialize = /**
* @param {?} data
* @return {?}
*/
function (data) {
return this.jsona.deserialize(data);
};
/**
* @param {?} data
* @param {?=} includedKeys
* @return {?}
*/
JsonapiConverter.prototype.serialize = /**
* @param {?} data
* @param {?=} includedKeys
* @return {?}
*/
function (data, includedKeys) {
if (!data) {
return;
}
// data preparation
this.defineTempIds(data);
/** @type {?} */
var body = (/** @type {?} */ (this.jsona.serialize({ stuff: data, includeNames: includedKeys })));
if (!body) {
return;
}
// Fix relationships and includes
if (!body.data.id) {
delete body.data.id;
}
this.addMethodsInRelations(data, body);
this.deleteMethodsInIncludes(body);
this.renameTempIdKeys(body);
return (/** @type {?} */ (body));
};
/**
* @private
* @param {?} data
* @return {?}
*/
JsonapiConverter.prototype.defineTempIds = /**
* @private
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
this.getRelationsKeys(data).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
/** @type {?} */
var resources = data[key];
_this.execOnElementOrArray(resources, (/**
* @param {?} elt
* @return {?}
*/
function (elt) {
if (elt.__method === 'create') {
elt.id = elt.id || uuid();
}
_this.defineTempIds(elt);
}));
}));
};
/**
* @private
* @param {?} data
* @param {?} body
* @return {?}
*/
JsonapiConverter.prototype.addMethodsInRelations = /**
* @private
* @param {?} data
* @param {?} body
* @return {?}
*/
function (data, body) {
var _this = this;
this.updateMethods(data, body.data);
this.getRelationsKeys(data).filter((/**
* @param {?} key
* @return {?}
*/
function (key) { return data[key]; })).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.execOnElementOrArray(data[key], (/**
* @param {?} elt
* @return {?}
*/
function (elt) { return _this.updateMethodsInculdes(elt, body.included); }));
}));
};
/**
* @private
* @param {?} data
* @param {?} includes
* @return {?}
*/
JsonapiConverter.prototype.updateMethodsInculdes = /**
* @private
* @param {?} data
* @param {?} includes
* @return {?}
*/
function (data, includes) {
var _this = this;
/** @type {?} */
var found = includes && includes.find((/**
* @param {?} incl
* @return {?}
*/
function (incl) { return (incl.id === data.id && incl.type === data.type); }));
if (!found) {
return;
}
this.updateMethods(data, found);
this.getRelationsKeys(data).filter((/**
* @param {?} key
* @return {?}
*/
function (key) { return data[key]; })).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.updateMethodsInculdes(data[key], includes);
}));
};
/**
* @private
* @param {?} data
* @param {?} resource
* @return {?}
*/
JsonapiConverter.prototype.updateMethods = /**
* @private
* @param {?} data
* @param {?} resource
* @return {?}
*/
function (data, resource) {
var _this = this;
/** @type {?} */
var relations = resource.relationships;
if (!relations) {
return;
}
this.getRelationsKeys(data).filter((/**
* @param {?} key
* @return {?}
*/
function (key) { return relations[key]; })).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.execOnElementOrArray(relations[key].data, (/**
* @param {?} elt
* @return {?}
*/
function (elt) { return elt.method = data[key].__method; }), (/**
* @param {?} elt
* @return {?}
*/
function (elt) {
/** @type {?} */
var method = data[key].find((/**
* @param {?} itm
* @return {?}
*/
function (itm) { return itm.id === elt.id; })).__method;
elt.method = method;
}));
}));
};
/**
* @private
* @param {?} body
* @return {?}
*/
JsonapiConverter.prototype.deleteMethodsInIncludes = /**
* @private
* @param {?} body
* @return {?}
*/
function (body) {
/** @type {?} */
var includes = body.included || [];
includes.forEach((/**
* @param {?} incl
* @return {?}
*/
function (incl) {
delete incl.attributes.__method;
}));
};
/**
* @private
* @param {?} body
* @return {?}
*/
JsonapiConverter.prototype.renameTempIdKeys = /**
* @private
* @param {?} body
* @return {?}
*/
function (body) {
var _this = this;
/** @type {?} */
var includes = body.included;
if (!includes) {
return;
}
this.setTempId(body.data, includes);
includes.forEach((/**
* @param {?} elt
* @return {?}
*/
function (elt) {
_this.setTempId(elt, includes);
}));
};
/**
* @private
* @param {?} resource
* @param {?} includes
* @return {?}
*/
JsonapiConverter.prototype.setTempId = /**
* @private
* @param {?} resource
* @param {?} includes
* @return {?}
*/
function (resource, includes) {
var _this = this;
/** @type {?} */
var relations = resource.relationships;
if (!relations) {
return;
}
/** @type {?} */
var keys = Object.keys(relations).filter((/**
* @param {?} key
* @return {?}
*/
function (key) { return (relations.hasOwnProperty(key) && relations[key]); }));
keys.forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.execOnElementOrArray(relations[key].data, (/**
* @param {?} elt
* @return {?}
*/
function (elt) {
if (elt.method === 'create') {
/** @type {?} */
var included = includes.find((/**
* @param {?} itm
* @return {?}
*/
function (itm) { return itm.id === elt.id && itm.type === elt.type; }));
included['temp-id'] = included.id;
elt['temp-id'] = elt.id;
delete included.id;
delete elt.id;
}
}));
}));
};
/**
* @private
* @param {?} resource
* @return {?}
*/
JsonapiConverter.prototype.getRelationsKeys = /**
* @private
* @param {?} resource
* @return {?}
*/
function (resource) {
return resource.relationshipNames || [];
};
/**
* @private
* @param {?} elements
* @param {?} callback
* @param {?=} callBackArray
* @return {?}
*/
JsonapiConverter.prototype.execOnElementOrArray = /**
* @private
* @param {?} elements
* @param {?} callback
* @param {?=} callBackArray
* @return {?}
*/
function (elements, callback, callBackArray) {
callBackArray = callBackArray || callback;
if (Array.isArray(elements)) {
elements.forEach((/**
* @param {?} elt
* @return {?}
*/
function (elt) { return callBackArray(elt); }));
}
else {
callback(elements);
}
};
return JsonapiConverter;
}());
export { JsonapiConverter };
if (false) {
/**
* @type {?}
* @private
*/
JsonapiConverter.prototype.jsona;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmFwaS5jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYWlyYnJ1c2gvIiwic291cmNlcyI6WyJsaWIvY29udmVydGVycy9qc29uYXBpLmNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBU2xDO0lBQUE7UUFDVSxVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQW9IOUIsQ0FBQzs7Ozs7SUFsSEMsc0NBQVc7Ozs7SUFBWCxVQUFZLElBQXVCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQzs7Ozs7O0lBRUQsb0NBQVM7Ozs7O0lBQVQsVUFBVSxJQUF1QixFQUFFLFlBQXVCO1FBQ3hELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFdEIsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBRW5CLElBQUksR0FBRyxtQkFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBQyxDQUFDLEVBQU87UUFDcEYsSUFBSSxDQUFDLElBQUksRUFBRTtZQUFFLE9BQU87U0FBRTtRQUV0QixpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztTQUFFO1FBQzNDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FB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Q0FBb0I7Ozs7Ozs7SUFBNUIsVUFBNkIsUUFBYSxFQUFFLFFBQTRCLEVBQUUsYUFBa0M7UUFDMUcsYUFBYSxHQUFHLGFBQWEsSUFBSSxRQUFRLENBQUM7UUFDMUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzNCLFFBQVEsQ0FBQyxPQUFPOzs7O1lBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQWxCLENBQWtCLEVBQUMsQ0FBQztTQUM3QzthQUFNO1lBQ0wsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUNILHVCQUFDO0FBQUQsQ0FBQyxBQXJIRCxJQXFIQzs7Ozs7OztJQXBIQyxpQ0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSnNvbmEgZnJvbSAnanNvbmEnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuXG5pbXBvcnQgeyBQcm9wZXJ0eUNvbnZlcnRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvcHJvcGVydHktY29udmVydGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBKc29uYXBpRG9jdW1lbnQsIEpzb25hcGlDb2xsZWN0aW9uLCBKc29uYXBpUmVzb3VyY2VSZXF1ZXN0LCBKc29uYXBpUmVzb3VyY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2pzb25hcGkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRKc29uYU1vZGVsIH0gZnJvbSAnanNvbmEvbGliL0pzb25hVHlwZXMnO1xuXG5cbnR5cGUgSnNvbmFwaUJvZHkgPSBKc29uYXBpRG9jdW1lbnQgfCBKc29uYXBpQ29sbGVjdGlvbiB8IFRKc29uYU1vZGVsIHwgQXJyYXk8VEpzb25hTW9kZWw+O1xuXG5leHBvcnQgY2xhc3MgSnNvbmFwaUNvbnZlcnRlciBpbXBsZW1lbnRzIFByb3BlcnR5Q29udmVydGVyIHtcbiAgcHJpdmF0ZSBqc29uYSA9IG5ldyBKc29uYSgpO1xuXG4gIGRlc2VyaWFsaXplKGRhdGE6IEpzb25hcGlCb2R5IHwgYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuanNvbmEuZGVzZXJpYWxpemUoZGF0YSk7XG4gIH1cblxuICBzZXJpYWxpemUoZGF0YTogVEpzb25hTW9kZWwgfCBhbnksIGluY2x1ZGVkS2V5cz86IHN0cmluZ1tdKSB7XG4gICAgaWYgKCFkYXRhKSB7IHJldHVybjsgfVxuXG4gICAgLy8gZGF0YSBwcmVwYXJhdGlvblxuICAgIHRoaXMuZGVmaW5lVGVtcElkcyhkYXRhKTtcblxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmpzb25hLnNlcmlhbGl6ZSh7IHN0dWZmOiBkYXRhLCBpbmNsdWRlTmFtZXM6IGluY2x1ZGVkS2V5c30pIGFzIGFueTtcbiAgICBpZiAoIWJvZHkpIHsgcmV0dXJuOyB9XG5cbiAgICAvLyBGaXggcmVsYXRpb25zaGlwcyBhbmQgaW5jbHVkZXNcbiAgICBpZiAoIWJvZHkuZGF0YS5pZCkgeyBkZWxldGUgYm9keS5kYXRhLmlkOyB9XG4gICAgdGhpcy5hZGRNZXRob2RzSW5SZWxhdGlvbnMoZGF0YSwgYm9keSk7XG4gICAgdGhpcy5kZWxldGVNZXRob2RzSW5JbmNsdWRlcyhib2R5KTtcbiAgICB0aGlzLnJlbmFtZVRlbXBJZEtleXMoYm9keSk7XG5cbiAgICByZXR1cm4gYm9keSBhcyBKc29uYXBpUmVzb3VyY2VSZXF1ZXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZpbmVUZW1wSWRzKGRhdGE6IEpzb25hcGlCb2R5KSB7XG4gICAgdGhpcy5nZXRSZWxhdGlvbnNLZXlzKGRhdGEpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IGRhdGFba2V5XTtcbiAgICAgIHRoaXMuZXhlY09uRWxlbWVudE9yQXJyYXkocmVzb3VyY2VzLCBlbHQgPT4ge1xuICAgICAgICBpZiAoZWx0Ll9fbWV0aG9kID09PSAnY3JlYXRlJykge1xuICAgICAgICAgIGVsdC5pZCA9IGVsdC5pZCB8fCB1dWlkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWZpbmVUZW1wSWRzKGVsdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTWV0aG9kc0luUmVsYXRpb25zKGRhdGE6IEpzb25hcGlCb2R5LCBib2R5OiBKc29uYXBpUmVzb3VyY2VSZXF1ZXN0KSB7XG4gICAgdGhpcy51cGRhdGVNZXRob2RzKGRhdGEsIGJvZHkuZGF0YSk7XG4gICAgdGhpcy5nZXRSZWxhdGlvbnNLZXlzKGRhdGEpLmZpbHRlcihrZXkgPT4gZGF0YVtrZXldKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5leGVjT25FbGVtZW50T3JBcnJheShkYXRhW2tleV0sIGVsdCA9PiB0aGlzLnVwZGF0ZU1ldGhvZHNJbmN1bGRlcyhlbHQsIGJvZHkuaW5jbHVkZWQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWV0aG9kc0luY3VsZGVzKGRhdGE6IFRKc29uYU1vZGVsLCBpbmNsdWRlczogSnNvbmFwaVJlc291cmNlW10pIHtcbiAgICBjb25zdCBmb3VuZCA9IGluY2x1ZGVzICYmIGluY2x1ZGVzLmZpbmQoaW5jbCA9PiAoaW5jbC5pZCA9PT0gZGF0YS5pZCAmJiBpbmNsLnR5cGUgPT09IGRhdGEudHlwZSkpO1xuICAgIGlmICghZm91bmQpIHsgcmV0dXJuOyB9XG5cbiAgICB0aGlzLnVwZGF0ZU1ldGhvZHMoZGF0YSwgZm91bmQpO1xuICAgIHRoaXMuZ2V0UmVsYXRpb25zS2V5cyhkYXRhKS5maWx0ZXIoa2V5ID0+IGRhdGFba2V5XSkuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlTWV0aG9kc0luY3VsZGVzKGRhdGFba2V5XSwgaW5jbHVkZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNZXRob2RzKGRhdGE6IFRKc29uYU1vZGVsLCByZXNvdXJjZTogSnNvbmFwaVJlc291cmNlKSB7XG4gICAgY29uc3QgcmVsYXRpb25zID0gcmVzb3VyY2UucmVsYXRpb25zaGlwcztcbiAgICBpZiAoIXJlbGF0aW9ucykgeyByZXR1cm47IH1cblxuICAgIHRoaXMuZ2V0UmVsYXRpb25zS2V5cyhkYXRhKS5maWx0ZXIoa2V5ID0+IHJlbGF0aW9uc1trZXldKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5leGVjT25FbGVtZW50T3JBcnJheShcbiAgICAgICAgcmVsYXRpb25zW2tleV0uZGF0YSxcbiAgICAgICAgZWx0ID0+IGVsdC5tZXRob2QgPSBkYXRhW2tleV0uX19tZXRob2QsXG4gICAgICAgIGVsdCA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0aG9kID0gZGF0YVtrZXldLmZpbmQoaXRtID0+IGl0bS5pZCA9PT0gZWx0LmlkKS5fX21ldGhvZDtcbiAgICAgICAgICBlbHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVNZXRob2RzSW5JbmNsdWRlcyhib2R5OiBKc29uYXBpUmVzb3VyY2VSZXF1ZXN0KSB7XG4gICAgY29uc3QgaW5jbHVkZXMgPSBib2R5LmluY2x1ZGVkIHx8IFtdO1xuICAgIGluY2x1ZGVzLmZvckVhY2goaW5jbCA9PiB7XG4gICAgICBkZWxldGUgaW5jbC5hdHRyaWJ1dGVzLl9fbWV0aG9kO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5hbWVUZW1wSWRLZXlzKGJvZHk6IEpzb25hcGlSZXNvdXJjZVJlcXVlc3QpIHtcbiAgICBjb25zdCBpbmNsdWRlcyA9IGJvZHkuaW5jbHVkZWQ7XG4gICAgaWYgKCFpbmNsdWRlcykgeyByZXR1cm47IH1cbiAgICB0aGlzLnNldFRlbXBJZChib2R5LmRhdGEsIGluY2x1ZGVzKTtcbiAgICBpbmNsdWRlcy5mb3JFYWNoKGVsdCA9PiB7XG4gICAgICB0aGlzLnNldFRlbXBJZChlbHQsIGluY2x1ZGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VGVtcElkKHJlc291cmNlOiBKc29uYXBpUmVzb3VyY2UsIGluY2x1ZGVzOiBKc29uYXBpUmVzb3VyY2VbXSkge1xuICAgIGNvbnN0IHJlbGF0aW9ucyA9IHJlc291cmNlLnJlbGF0aW9uc2hpcHM7XG4gICAgaWYgKCFyZWxhdGlvbnMpIHsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpb25zKS5maWx0ZXIoa2V5ID0+IChyZWxhdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiByZWxhdGlvbnNba2V5XSkpO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuZXhlY09uRWxlbWVudE9yQXJyYXkoXG4gICAgICAgIHJlbGF0aW9uc1trZXldLmRhdGEsIGVsdCA9PiB7XG4gICAgICAgICAgaWYgKGVsdC5tZXRob2QgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBpbmNsdWRlZCA9IGluY2x1ZGVzLmZpbmQoaXRtID0+IGl0bS5pZCA9PT0gZWx0LmlkICYmIGl0bS50eXBlID09PSBlbHQudHlwZSk7XG4gICAgICAgICAgICBpbmNsdWRlZFsndGVtcC1pZCddID0gaW5jbHVkZWQuaWQ7XG4gICAgICAgICAgICBlbHRbJ3RlbXAtaWQnXSA9IGVsdC5pZDtcbiAgICAgICAgICAgIGRlbGV0ZSBpbmNsdWRlZC5pZDtcbiAgICAgICAgICAgIGRlbGV0ZSBlbHQuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVsYXRpb25zS2V5cyhyZXNvdXJjZSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gcmVzb3VyY2UucmVsYXRpb25zaGlwTmFtZXMgfHwgW107XG4gIH1cblxuICBwcml2YXRlIGV4ZWNPbkVsZW1lbnRPckFycmF5KGVsZW1lbnRzOiBhbnksIGNhbGxiYWNrOiAoZWx0OiBhbnkpID0+IHZvaWQsIGNhbGxCYWNrQXJyYXk/OiAoZWx0OiBhbnkpID0+IHZvaWQpIHtcbiAgICBjYWxsQmFja0FycmF5ID0gY2FsbEJhY2tBcnJheSB8fCBjYWxsYmFjaztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50cykpIHtcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goZWx0ID0+IGNhbGxCYWNrQXJyYXkoZWx0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKGVsZW1lbnRzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==