UNPKG

ngx-airbrush

Version:

Angular client for jsonapi/Graphiti backends

276 lines 19.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import Jsona from 'jsona'; import { v4 as uuid } from 'uuid'; export class JsonapiConverter { constructor() { this.jsona = new Jsona(); } /** * @param {?} data * @return {?} */ deserialize(data) { return this.jsona.deserialize(data); } /** * @param {?} data * @param {?=} includedKeys * @return {?} */ serialize(data, includedKeys) { if (!data) { return; } // data preparation this.defineTempIds(data); /** @type {?} */ const 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 {?} */ defineTempIds(data) { this.getRelationsKeys(data).forEach((/** * @param {?} key * @return {?} */ key => { /** @type {?} */ const resources = data[key]; this.execOnElementOrArray(resources, (/** * @param {?} elt * @return {?} */ elt => { if (elt.__method === 'create') { elt.id = elt.id || uuid(); } this.defineTempIds(elt); })); })); } /** * @private * @param {?} data * @param {?} body * @return {?} */ addMethodsInRelations(data, body) { this.updateMethods(data, body.data); this.getRelationsKeys(data).filter((/** * @param {?} key * @return {?} */ key => data[key])).forEach((/** * @param {?} key * @return {?} */ (key) => { this.execOnElementOrArray(data[key], (/** * @param {?} elt * @return {?} */ elt => this.updateMethodsInculdes(elt, body.included))); })); } /** * @private * @param {?} data * @param {?} includes * @return {?} */ updateMethodsInculdes(data, includes) { /** @type {?} */ const found = includes && includes.find((/** * @param {?} incl * @return {?} */ incl => (incl.id === data.id && incl.type === data.type))); if (!found) { return; } this.updateMethods(data, found); this.getRelationsKeys(data).filter((/** * @param {?} key * @return {?} */ key => data[key])).forEach((/** * @param {?} key * @return {?} */ (key) => { this.updateMethodsInculdes(data[key], includes); })); } /** * @private * @param {?} data * @param {?} resource * @return {?} */ updateMethods(data, resource) { /** @type {?} */ const relations = resource.relationships; if (!relations) { return; } this.getRelationsKeys(data).filter((/** * @param {?} key * @return {?} */ key => relations[key])).forEach((/** * @param {?} key * @return {?} */ (key) => { this.execOnElementOrArray(relations[key].data, (/** * @param {?} elt * @return {?} */ elt => elt.method = data[key].__method), (/** * @param {?} elt * @return {?} */ elt => { /** @type {?} */ const method = data[key].find((/** * @param {?} itm * @return {?} */ itm => itm.id === elt.id)).__method; elt.method = method; })); })); } /** * @private * @param {?} body * @return {?} */ deleteMethodsInIncludes(body) { /** @type {?} */ const includes = body.included || []; includes.forEach((/** * @param {?} incl * @return {?} */ incl => { delete incl.attributes.__method; })); } /** * @private * @param {?} body * @return {?} */ renameTempIdKeys(body) { /** @type {?} */ const includes = body.included; if (!includes) { return; } this.setTempId(body.data, includes); includes.forEach((/** * @param {?} elt * @return {?} */ elt => { this.setTempId(elt, includes); })); } /** * @private * @param {?} resource * @param {?} includes * @return {?} */ setTempId(resource, includes) { /** @type {?} */ const relations = resource.relationships; if (!relations) { return; } /** @type {?} */ const keys = Object.keys(relations).filter((/** * @param {?} key * @return {?} */ key => (relations.hasOwnProperty(key) && relations[key]))); keys.forEach((/** * @param {?} key * @return {?} */ (key) => { this.execOnElementOrArray(relations[key].data, (/** * @param {?} elt * @return {?} */ elt => { if (elt.method === 'create') { /** @type {?} */ const included = includes.find((/** * @param {?} itm * @return {?} */ itm => 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 {?} */ getRelationsKeys(resource) { return resource.relationshipNames || []; } /** * @private * @param {?} elements * @param {?} callback * @param {?=} callBackArray * @return {?} */ execOnElementOrArray(elements, callback, callBackArray) { callBackArray = callBackArray || callback; if (Array.isArray(elements)) { elements.forEach((/** * @param {?} elt * @return {?} */ elt => callBackArray(elt))); } else { callback(elements); } } } if (false) { /** * @type {?} * @private */ JsonapiConverter.prototype.jsona; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmFwaS5jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYWlyYnJ1c2gvIiwic291cmNlcyI6WyJsaWIvY29udmVydGVycy9qc29uYXBpLmNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBU2xDLE1BQU0sT0FBTyxnQkFBZ0I7SUFBN0I7UUFDVSxVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQW9IOUIsQ0FBQzs7Ozs7SUFsSEMsV0FBVyxDQUFDLElBQXVCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQzs7Ozs7O0lBRUQsU0FBUyxDQUFDLElBQXVCLEVBQUUsWUFBdUI7UUFDeEQsSUFBSSxDQUFDLElBQUksRUFBRTtZQUFFLE9BQU87U0FBRTtRQUV0QixtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Y0FFbkIsSUFBSSxHQUFHLG1CQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFDLENBQUMsRUFBTztRQUNwRixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRXRCLGlDQUFpQztRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQUU7UUFDM0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFD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QUM7U0FDN0M7YUFBTTtZQUNMLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNwQjtJQUNILENBQUM7Q0FDRjs7Ozs7O0lBcEhDLGlDQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBKc29uYSBmcm9tICdqc29uYSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSAndXVpZCc7XG5cbmltcG9ydCB7IFByb3BlcnR5Q29udmVydGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wcm9wZXJ0eS1jb252ZXJ0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEpzb25hcGlEb2N1bWVudCwgSnNvbmFwaUNvbGxlY3Rpb24sIEpzb25hcGlSZXNvdXJjZVJlcXVlc3QsIEpzb25hcGlSZXNvdXJjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvanNvbmFwaS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVEpzb25hTW9kZWwgfSBmcm9tICdqc29uYS9saWIvSnNvbmFUeXBlcyc7XG5cblxudHlwZSBKc29uYXBpQm9keSA9IEpzb25hcGlEb2N1bWVudCB8IEpzb25hcGlDb2xsZWN0aW9uIHwgVEpzb25hTW9kZWwgfCBBcnJheTxUSnNvbmFNb2RlbD47XG5cbmV4cG9ydCBjbGFzcyBKc29uYXBpQ29udmVydGVyIGltcGxlbWVudHMgUHJvcGVydHlDb252ZXJ0ZXIge1xuICBwcml2YXRlIGpzb25hID0gbmV3IEpzb25hKCk7XG5cbiAgZGVzZXJpYWxpemUoZGF0YTogSnNvbmFwaUJvZHkgfCBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5qc29uYS5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZShkYXRhOiBUSnNvbmFNb2RlbCB8IGFueSwgaW5jbHVkZWRLZXlzPzogc3RyaW5nW10pIHtcbiAgICBpZiAoIWRhdGEpIHsgcmV0dXJuOyB9XG5cbiAgICAvLyBkYXRhIHByZXBhcmF0aW9uXG4gICAgdGhpcy5kZWZpbmVUZW1wSWRzKGRhdGEpO1xuXG4gICAgY29uc3QgYm9keSA9IHRoaXMuanNvbmEuc2VyaWFsaXplKHsgc3R1ZmY6IGRhdGEsIGluY2x1ZGVOYW1lczogaW5jbHVkZWRLZXlzfSkgYXMgYW55O1xuICAgIGlmICghYm9keSkgeyByZXR1cm47IH1cblxuICAgIC8vIEZpeCByZWxhdGlvbnNoaXBzIGFuZCBpbmNsdWRlc1xuICAgIGlmICghYm9keS5kYXRhLmlkKSB7IGRlbGV0ZSBib2R5LmRhdGEuaWQ7IH1cbiAgICB0aGlzLmFkZE1ldGhvZHNJblJlbGF0aW9ucyhkYXRhLCBib2R5KTtcbiAgICB0aGlzLmRlbGV0ZU1ldGhvZHNJbkluY2x1ZGVzKGJvZHkpO1xuICAgIHRoaXMucmVuYW1lVGVtcElkS2V5cyhib2R5KTtcblxuICAgIHJldHVybiBib2R5IGFzIEpzb25hcGlSZXNvdXJjZVJlcXVlc3Q7XG4gIH1cblxuICBwcml2YXRlIGRlZmluZVRlbXBJZHMoZGF0YTogSnNvbmFwaUJvZHkpIHtcbiAgICB0aGlzLmdldFJlbGF0aW9uc0tleXMoZGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgcmVzb3VyY2VzID0gZGF0YVtrZXldO1xuICAgICAgdGhpcy5leGVjT25FbGVtZW50T3JBcnJheShyZXNvdXJjZXMsIGVsdCA9PiB7XG4gICAgICAgIGlmIChlbHQuX19tZXRob2QgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgICAgZWx0LmlkID0gZWx0LmlkIHx8IHV1aWQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlZmluZVRlbXBJZHMoZWx0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNZXRob2RzSW5SZWxhdGlvbnMoZGF0YTogSnNvbmFwaUJvZHksIGJvZHk6IEpzb25hcGlSZXNvdXJjZVJlcXVlc3QpIHtcbiAgICB0aGlzLnVwZGF0ZU1ldGhvZHMoZGF0YSwgYm9keS5kYXRhKTtcbiAgICB0aGlzLmdldFJlbGF0aW9uc0tleXMoZGF0YSkuZmlsdGVyKGtleSA9PiBkYXRhW2tleV0pLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmV4ZWNPbkVsZW1lbnRPckFycmF5KGRhdGFba2V5XSwgZWx0ID0+IHRoaXMudXBkYXRlTWV0aG9kc0luY3VsZGVzKGVsdCwgYm9keS5pbmNsdWRlZCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNZXRob2RzSW5jdWxkZXMoZGF0YTogVEpzb25hTW9kZWwsIGluY2x1ZGVzOiBKc29uYXBpUmVzb3VyY2VbXSkge1xuICAgIGNvbnN0IGZvdW5kID0gaW5jbHVkZXMgJiYgaW5jbHVkZXMuZmluZChpbmNsID0+IChpbmNsLmlkID09PSBkYXRhLmlkICYmIGluY2wudHlwZSA9PT0gZGF0YS50eXBlKSk7XG4gICAgaWYgKCFmb3VuZCkgeyByZXR1cm47IH1cblxuICAgIHRoaXMudXBkYXRlTWV0aG9kcyhkYXRhLCBmb3VuZCk7XG4gICAgdGhpcy5nZXRSZWxhdGlvbnNLZXlzKGRhdGEpLmZpbHRlcihrZXkgPT4gZGF0YVtrZXldKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy51cGRhdGVNZXRob2RzSW5jdWxkZXMoZGF0YVtrZXldLCBpbmNsdWRlcyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1ldGhvZHMoZGF0YTogVEpzb25hTW9kZWwsIHJlc291cmNlOiBKc29uYXBpUmVzb3VyY2UpIHtcbiAgICBjb25zdCByZWxhdGlvbnMgPSByZXNvdXJjZS5yZWxhdGlvbnNoaXBzO1xuICAgIGlmICghcmVsYXRpb25zKSB7IHJldHVybjsgfVxuXG4gICAgdGhpcy5nZXRSZWxhdGlvbnNLZXlzKGRhdGEpLmZpbHRlcihrZXkgPT4gcmVsYXRpb25zW2tleV0pLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmV4ZWNPbkVsZW1lbnRPckFycmF5KFxuICAgICAgICByZWxhdGlvbnNba2V5XS5kYXRhLFxuICAgICAgICBlbHQgPT4gZWx0Lm1ldGhvZCA9IGRhdGFba2V5XS5fX21ldGhvZCxcbiAgICAgICAgZWx0ID0+IHtcbiAgICAgICAgICBjb25zdCBtZXRob2QgPSBkYXRhW2tleV0uZmluZChpdG0gPT4gaXRtLmlkID09PSBlbHQuaWQpLl9fbWV0aG9kO1xuICAgICAgICAgIGVsdC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZU1ldGhvZHNJbkluY2x1ZGVzKGJvZHk6IEpzb25hcGlSZXNvdXJjZVJlcXVlc3QpIHtcbiAgICBjb25zdCBpbmNsdWRlcyA9IGJvZHkuaW5jbHVkZWQgfHwgW107XG4gICAgaW5jbHVkZXMuZm9yRWFjaChpbmNsID0+IHtcbiAgICAgIGRlbGV0ZSBpbmNsLmF0dHJpYnV0ZXMuX19tZXRob2Q7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmFtZVRlbXBJZEtleXMoYm9keTogSnNvbmFwaVJlc291cmNlUmVxdWVzdCkge1xuICAgIGNvbnN0IGluY2x1ZGVzID0gYm9keS5pbmNsdWRlZDtcbiAgICBpZiAoIWluY2x1ZGVzKSB7IHJldHVybjsgfVxuICAgIHRoaXMuc2V0VGVtcElkKGJvZHkuZGF0YSwgaW5jbHVkZXMpO1xuICAgIGluY2x1ZGVzLmZvckVhY2goZWx0ID0+IHtcbiAgICAgIHRoaXMuc2V0VGVtcElkKGVsdCwgaW5jbHVkZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUZW1wSWQocmVzb3VyY2U6IEpzb25hcGlSZXNvdXJjZSwgaW5jbHVkZXM6IEpzb25hcGlSZXNvdXJjZVtdKSB7XG4gICAgY29uc3QgcmVsYXRpb25zID0gcmVzb3VyY2UucmVsYXRpb25zaGlwcztcbiAgICBpZiAoIXJlbGF0aW9ucykgeyByZXR1cm47IH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGlvbnMpLmZpbHRlcihrZXkgPT4gKHJlbGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHJlbGF0aW9uc1trZXldKSk7XG4gICAga2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5leGVjT25FbGVtZW50T3JBcnJheShcbiAgICAgICAgcmVsYXRpb25zW2tleV0uZGF0YSwgZWx0ID0+IHtcbiAgICAgICAgICBpZiAoZWx0Lm1ldGhvZCA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVkID0gaW5jbHVkZXMuZmluZChpdG0gPT4gaXRtLmlkID09PSBlbHQuaWQgJiYgaXRtLnR5cGUgPT09IGVsdC50eXBlKTtcbiAgICAgICAgICAgIGluY2x1ZGVkWyd0ZW1wLWlkJ10gPSBpbmNsdWRlZC5pZDtcbiAgICAgICAgICAgIGVsdFsndGVtcC1pZCddID0gZWx0LmlkO1xuICAgICAgICAgICAgZGVsZXRlIGluY2x1ZGVkLmlkO1xuICAgICAgICAgICAgZGVsZXRlIGVsdC5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWxhdGlvbnNLZXlzKHJlc291cmNlKTogc3RyaW5nW10ge1xuICAgIHJldHVybiByZXNvdXJjZS5yZWxhdGlvbnNoaXBOYW1lcyB8fCBbXTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY09uRWxlbWVudE9yQXJyYXkoZWxlbWVudHM6IGFueSwgY2FsbGJhY2s6IChlbHQ6IGFueSkgPT4gdm9pZCwgY2FsbEJhY2tBcnJheT86IChlbHQ6IGFueSkgPT4gdm9pZCkge1xuICAgIGNhbGxCYWNrQXJyYXkgPSBjYWxsQmFja0FycmF5IHx8IGNhbGxiYWNrO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnRzKSkge1xuICAgICAgZWxlbWVudHMuZm9yRWFjaChlbHQgPT4gY2FsbEJhY2tBcnJheShlbHQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soZWxlbWVudHMpO1xuICAgIH1cbiAgfVxufVxuIl19