UNPKG

kitsu-core

Version:

Core serialisation and deserialsation functions for the kitsu JSON:API client

267 lines (220 loc) 8.95 kB
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator'; function deattribute() { return _deattribute.apply(this, arguments); } function _deattribute() { return _deattribute = _asyncToGenerator(function* (data) { return 'object' === typeof data && null !== data && (Array.isArray(data) ? yield data.map(function () { var _ref = _asyncToGenerator(function* (el) { return deattribute(el); }); return function () { return _ref.apply(this, arguments); }; }()) : data.attributes && data.attributes.constructor === Object && (Object.keys(data.attributes).forEach(key => { data[key] = data.attributes[key]; }), delete data.attributes)), data; }), _deattribute.apply(this, arguments); } function error(E) { if (E.response) { const e = E.response.data; e && e.errors && (E.errors = e.errors); } throw E; } function filterIncludes() { return _filterIncludes.apply(this, arguments); } function _filterIncludes() { return _filterIncludes = _asyncToGenerator(function* (included, { id, type }) { try { const filtered = included.filter(el => el.id === id && el.type === type)[0] || { id, type }; return Object.assign({}, filtered); } catch (E) { error(E); } }), _filterIncludes.apply(this, arguments); } function link() { return _link.apply(this, arguments); } function _link() { return _link = _asyncToGenerator(function* ({ id, type, meta }, included) { const filtered = yield filterIncludes(included, { id, type }); return filtered.relationships && (yield linkRelationships(filtered, included)), meta && (filtered.meta = meta), deattribute(filtered); }), _link.apply(this, arguments); } function linkArray() { return _linkArray.apply(this, arguments); } function _linkArray() { return _linkArray = _asyncToGenerator(function* (data, included, key) { data[key] = []; var _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0; try { for (var _step, _iterator = (yield data.relationships[key].data)[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) { let resource = _step.value; data[key].push((yield link(resource, included))); } } catch (err) { _didIteratorError = !0, _iteratorError = err; } finally { try { _iteratorNormalCompletion || null == _iterator.return || _iterator.return(); } finally { if (_didIteratorError) throw _iteratorError; } } }), _linkArray.apply(this, arguments); } function linkObject() { return _linkObject.apply(this, arguments); } function _linkObject() { return _linkObject = _asyncToGenerator(function* (data, included, key) { data[key] = yield link(data.relationships[key].data, included), delete data[key].relationships; }), _linkObject.apply(this, arguments); } function linkRelationships() { return _linkRelationships.apply(this, arguments); } function _linkRelationships() { return _linkRelationships = _asyncToGenerator(function* (data, included) { const relationships = data.relationships; let removeRelationships = !1; for (let key in yield relationships) relationships[key].data && Array.isArray(relationships[key].data) ? (yield linkArray(data, included, key), removeRelationships = !0) : relationships[key].data && (yield linkObject(data, included, key), removeRelationships = !0); return removeRelationships && delete data.relationships, data; }), _linkRelationships.apply(this, arguments); } function deserialiseArray() { return _deserialiseArray.apply(this, arguments); } function _deserialiseArray() { return _deserialiseArray = _asyncToGenerator(function* (obj) { var _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0; try { for (var _step, _iterator = (yield obj.data)[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) { let value = _step.value; obj.included && (value = yield linkRelationships(value, obj.included)), value.attributes && (value = yield deattribute(value)), obj.data[obj.data.indexOf(value)] = value; } } catch (err) { _didIteratorError = !0, _iteratorError = err; } finally { try { _iteratorNormalCompletion || null == _iterator.return || _iterator.return(); } finally { if (_didIteratorError) throw _iteratorError; } } return obj; }), _deserialiseArray.apply(this, arguments); } function deserialise() { return _deserialise.apply(this, arguments); } function _deserialise() { return _deserialise = _asyncToGenerator(function* (obj) { return obj.data && obj.data.constructor === Array ? obj = yield deserialiseArray(obj) : obj.included && (obj.data = yield linkRelationships(obj.data, obj.included)), delete obj.included, obj.data && obj.data.attributes && (obj.data = yield deattribute(obj.data)), obj; }), _deserialise.apply(this, arguments); } function queryFormat(value, key) { return null !== value && 'object' === typeof value ? query(value, key) : encodeURIComponent(key) + '=' + encodeURIComponent(value); } function query(params, prefix = null) { const str = []; for (const param in params) params.hasOwnProperty(param) && str.push(queryFormat(params[param], prefix ? `${prefix}[${param}]` : param)); return str.join('&'); } const requiresID = (method, key) => `${method} requires an ID for the ${key} relationships`; function isValid() { return _isValid.apply(this, arguments); } function _isValid() { return _isValid = _asyncToGenerator(function* (obj, method, type) { if (obj.constructor !== Object || 0 === Object.keys(obj).length) throw new Error(`${method} requires a JSON object body`); if ('POST' !== method && !obj.id) throw new Error(`${method} requires an ID for the ${type} type`); }), _isValid.apply(this, arguments); } function serialiseObject() { return _serialiseObject.apply(this, arguments); } function _serialiseObject() { return _serialiseObject = _asyncToGenerator(function* (node, nodeType, key, data, method) { if ('string' !== typeof node.id) throw new Error(requiresID(method, key)); return data.relationships || (data.relationships = {}), node.type || (node.type = nodeType), data.relationships[key] = { data: Object.assign(node) }, data; }), _serialiseObject.apply(this, arguments); } function serialiseArray() { return _serialiseArray.apply(this, arguments); } function _serialiseArray() { return _serialiseArray = _asyncToGenerator(function* (node, nodeType, key, data, method) { return data.relationships || (data.relationships = {}), data.relationships[key] = { data: node.map(({ id, type }) => { if (!id) throw new Error(requiresID(method, key)); return { id, type: type || nodeType }; }) }, data; }), _serialiseArray.apply(this, arguments); } function serialiseAttr() { return _serialiseAttr.apply(this, arguments); } function _serialiseAttr() { return _serialiseAttr = _asyncToGenerator(function* (node, key, data) { return data.attributes || (data.attributes = {}), data.attributes[key] = node, data; }), _serialiseAttr.apply(this, arguments); } function serialise() { return _serialise.apply(this, arguments); } function _serialise() { return _serialise = _asyncToGenerator(function* (model, obj = {}, method = 'POST') { try { const type = this.plural(this.camel(model)); let data = { type }; for (let key in yield isValid(obj, method, type), 'POST' !== method && (data.id = obj.id + ""), obj) { const node = obj[key], nodeType = this.plural(this.camel(key)); null !== node & node.constructor === Object ? data = yield serialiseObject(node, nodeType, key, data, method) : null !== node && Array.isArray(node) ? data = yield serialiseArray(node, nodeType, key, data, method) : 'id' !== key && 'type' !== key && (data = yield serialiseAttr(node, key, data)); } return { data }; } catch (E) { throw error(E); } }), _serialise.apply(this, arguments); } var index = (s => s.replace(/[-_][a-z\u00E0-\u00F6\u00F8-\u00FE]/g, match => match.slice(1).toUpperCase())); var index$1 = (s => s.charAt(0).toLowerCase() + s.slice(1).replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, match => '-' + match.toLowerCase())); var index$2 = (s => s.charAt(0).toLowerCase() + s.slice(1).replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, match => '_' + match.toLowerCase())); export { index as camel, index$1 as kebab, index$2 as snake, deattribute, deserialise, error, filterIncludes, linkRelationships, query, serialise };