From 0a4bfd45517cd285cce0b5e12bd5854f03c00fa9 Mon Sep 17 00:00:00 2001 From: schneefux Date: Mon, 24 Apr 2017 13:58:21 +0200 Subject: move jsonapi tool to orm --- jsonapi.js | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 jsonapi.js (limited to 'jsonapi.js') diff --git a/jsonapi.js b/jsonapi.js new file mode 100644 index 0000000..fa3b6ef --- /dev/null +++ b/jsonapi.js @@ -0,0 +1,64 @@ +#!/usr/bin/node +/* https://github.com/alex94puchades/superagent-jsonapify/blob/master/common.js */ + +"use strict"; + +var _isUndefined = require('lodash/isUndefined'); +var _isArray = require('lodash/isArray'); +var _map = require('lodash/map'); +var _partial = require('lodash/partial'); +var _each = require('lodash/each'); +var _camelCase = require('lodash/camelCase'); +var _memoize = require('lodash/memoize'); +var _chain = require('lodash/chain'); +var _find = require('lodash/find'); +var _clone = require('lodash/clone'); +var _compact = require('lodash/compact'); + +exports.parse = (obj) => { + let response = obj, + data = obj.data; + if (!data) { + return data; + } else if (_isArray(data)) { + return _map(data, _partial(parseResourceDataObject, response)); + } else { + return parseResourceDataObject(response, data); + } +} + +function parseResourceDataObject(response, data) { + var result = _clone(data); + _each(data.attributes, function(value, name) { + Object.defineProperty(result, _camelCase(name), { value: value, enumerable: true }); + }); + _each(data.relationships, function(value, name) { + if (_isArray(value.data)) { + Object.defineProperty(result, _camelCase(name), { + get: _memoize(function() { + const related = _map(value.data, function(related) { + var resdata = _find(response.included, function(included) { + return included.id === related.id && included.type === related.type; + }); + if(resdata) + return parseResourceDataObject(response, resdata); + }); + return _compact(related); + }), + enumerable: true + }); + } else if (value.data) { + Object.defineProperty(result, _camelCase(name), { + get: _memoize(function() { + var resdata = _find(response.included, function(included) { + return included.id === value.data.id && included.type === value.data.type; + }); + return resdata ? parseResourceDataObject(response, resdata) + : null; + }), + enumerable: true + }); + } + }); + return result; +} -- cgit v1.3.1