UNPKG

js-data-jsonapi-light

Version:

JsonApi adapter serializer/dezerializer light.

115 lines 4.93 kB
"use strict"; var utils_1 = require("./utils"); var js_data_1 = require("js-data"); var strings_1 = require("./strings"); function wrapDeserialize(self) { return function (mapper, res, opts) { var beforeDeserialize = opts.beforeDeserialize || mapper.beforeDeserialize || self.options.beforeDeserialize, afterDeserialize = opts.afterDeserialize || mapper.afterDeserialize || self.options.afterDeserialize; if (beforeDeserialize) res = beforeDeserialize.call(self, mapper, res, opts); res = jsonApiDeserialize.call(self, mapper, res, opts); if (afterDeserialize) res = afterDeserialize.call(self, mapper, res, opts); return res; }; } exports.wrapDeserialize = wrapDeserialize; function jsonApiDeserialize(mapper, res, opts) { if (!res.data || !res.data.data) return; var store = mapper.datastore; var collectionReceived = js_data_1.utils.isArray(res.data.data); var itemsIndexed = {}; var itemCollection = [].concat(res.data.included || []) .concat(res.data.data || []); var i = itemCollection.length; while (i--) { var item = itemCollection[i]; if (!item.type || !item.id) { itemCollection.splice(i, 1); continue; } if (!itemsIndexed[item.type]) itemsIndexed[item.type] = {}; itemsIndexed[item.type][item.id] = item; } for (var type in itemsIndexed) { var resource = store.getMapper(type); if (!resource) { this.warn(strings_1.WARNING.NO_RESSOURCE(type)); continue; } utils_1.mapperCacheRelationByField(resource); for (var id in itemsIndexed[type]) { var item = itemsIndexed[type][id]; item.attributes[resource.idAttribute] = id; if (!item.relationships || !Object.keys(item.relationships)) continue; for (var relationField in (item.relationships || {})) { var relation = resource.relationByField[relationField]; if (!relation || !item.relationships[relationField] || !item.relationships[relationField].data) { continue; } if (relation.type === 'belongsTo' || relation.type === 'hasOne') { var link = item.relationships[relationField].data; if (!js_data_1.utils.isObject(link)) { this.warn(strings_1.WARNING.WRONG_RELATION_OBJECT_EXPECTED, relation); continue; } if (relation.type === 'belongsTo') { if (!relation.foreignKey) { this.warn(strings_1.WARNING.NO_FOREIGN_KEY, relation); } else { item.attributes[relation.foreignKey] = link.id; } } if (itemsIndexed[link.type] && itemsIndexed[link.type][link.id]) { var remoteIdAttribute = relation.relatedCollection.idAttribute; var itemLinked = itemsIndexed[link.type][link.id]; itemLinked.attributes[remoteIdAttribute] = link.id; item.attributes[relation.localField] = itemLinked.attributes; } } else if (relation.type === 'hasMany') { var links = item.relationships[relationField].data; if (!js_data_1.utils.isArray(links)) { this.warn(strings_1.WARNING.WRONG_RELATION_ARRAY_EXPECTED); continue; } item.attributes[relation.localField] = []; for (var i_1 = 0, l = links.length; i_1 < l; i_1++) { var link = links[i_1]; if (itemsIndexed[link.type] && itemsIndexed[link.type][link.id]) { var itemLinkd = itemsIndexed[link.type][link.id]; item.attributes[relation.localField].push(itemLinkd.attributes); } } } else { this.warn(strings_1.WARNING.RELATION_UNKNOWN); continue; } } } } var outputDatas; if (!collectionReceived) { outputDatas = res.data.data.attributes; } else { outputDatas = []; for (var i_2 = 0, l = res.data.data.length; i_2 < l; i_2++) { outputDatas.push(res.data.data[i_2].attributes); } } if (!opts.raw) { return outputDatas; } return { result: outputDatas, meta: res.data.meta }; } exports.jsonApiDeserialize = jsonApiDeserialize; //# sourceMappingURL=deserializer.js.map