diff --git a/browserify/jsonapi-serializer.js b/browserify/jsonapi-serializer.js index 0ee2ae9..163c55d 100644 --- a/browserify/jsonapi-serializer.js +++ b/browserify/jsonapi-serializer.js @@ -137,9 +137,15 @@ module.exports = function (jsonapi, data, opts) { if (valueForRelationship && isFunction(valueForRelationship.then)) { return valueForRelationship.then(function (value) { + if (relationshipData.meta) { + value.meta = relationshipData.meta + } return value; }); } else { + if (relationshipData.meta) { + valueForRelationship.meta = relationshipData.meta + } return valueForRelationship; } }); @@ -532,7 +538,13 @@ module.exports = function (collectionName, record, payload, opts) { if (typeof id !== 'undefined') { pushToIncluded(payload, included); } } - return typeof id !== 'undefined' ? { type: type, id: id } : null; + var json = typeof id !== 'undefined' ? { type: type, id: id } : null; + + if (dest && dest.meta) { + json.meta = dest.meta + } + + return json }; this.serializeNested = function (dest, current, attribute, opts) { diff --git a/lib/deserializer-utils.js b/lib/deserializer-utils.js index 1265fd4..74e51aa 100644 --- a/lib/deserializer-utils.js +++ b/lib/deserializer-utils.js @@ -114,7 +114,8 @@ module.exports = function (jsonapi, data, opts) { return extractIncludes(relationshipData, ancestry); })) .then(function (includes) { - if (includes) { dest[keyForAttribute(key)] = includes; } + var filteredIncludes = includes.filter(item => Boolean(item)); + if (filteredIncludes.length) { dest[keyForAttribute(key)] = filteredIncludes; } }); } else { return extractIncludes(relationship.data, ancestry) @@ -134,13 +135,24 @@ module.exports = function (jsonapi, data, opts) { var valueForRelationship = getValueForRelationship(relationshipData, included); - if (valueForRelationship && isFunction(valueForRelationship.then)) { + if (!valueForRelationship) { + return null + } + + if (isFunction(valueForRelationship.then)) { return valueForRelationship.then(function (value) { + if (relationshipData.meta) { + value.meta = relationshipData.meta + } return value; }); - } else { - return valueForRelationship; } + + if (relationshipData.meta) { + valueForRelationship.meta = relationshipData.meta + } + + return valueForRelationship; }); } diff --git a/lib/serializer-utils.js b/lib/serializer-utils.js index 0786e6a..f074648 100644 --- a/lib/serializer-utils.js +++ b/lib/serializer-utils.js @@ -65,11 +65,16 @@ module.exports = function (collectionName, record, payload, opts) { } } - function getType(str, attrVal) { + function getType(str, attrVal, attrOpts) { var type; attrVal = attrVal || {}; + attrOpts = attrOpts || {}; - if (isFunction(opts.typeForAttribute)) { + if (isFunction(attrOpts.typeForAttribute)) { + type = attrOpts.typeForAttribute(str, attrVal); + } + + if (type === undefined && isFunction(opts.typeForAttribute)) { type = opts.typeForAttribute(str, attrVal); } @@ -190,7 +195,7 @@ module.exports = function (collectionName, record, payload, opts) { this.serializeRef = function (dest, current, attribute, opts) { var that = this; var id = getRef(current, dest, opts); - var type = getType(attribute, dest); + var type = getType(attribute, dest, opts); var relationships = []; var includedAttrs = []; @@ -230,7 +235,13 @@ module.exports = function (collectionName, record, payload, opts) { if (typeof id !== 'undefined') { pushToIncluded(payload, included); } } - return typeof id !== 'undefined' ? { type: type, id: id } : null; + var json = typeof id !== 'undefined' ? { type: type, id: id } : null; + + if (dest && dest.meta) { + json.meta = dest.meta + } + + return json }; this.serializeNested = function (dest, current, attribute, opts) { diff --git a/package-lock.json b/package-lock.json index 8b76b04..4f0447d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "jsonapi-serializer", - "version": "3.6.3", + "version": "3.7.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1289,7 +1289,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -1310,12 +1311,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1330,17 +1333,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1457,7 +1463,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1469,6 +1476,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1483,6 +1491,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1490,12 +1499,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -1514,6 +1525,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -1594,7 +1606,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -1606,6 +1619,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -1691,7 +1705,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -1727,6 +1742,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -1746,6 +1762,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -1789,12 +1806,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, diff --git a/package.json b/package.json index d4937d3..654b12d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "jsonapi-serializer", - "version": "3.6.7", + "name": "@freshfx/jsonapi-serializer", + "version": "3.7.1", "description": "A Node.js framework agnostic library for serializing your data to JSON API", "main": "index.js", "scripts": { diff --git a/test/deserializer.js b/test/deserializer.js index bd5ae42..1634e49 100644 --- a/test/deserializer.js +++ b/test/deserializer.js @@ -478,7 +478,7 @@ describe('JSON API Deserializer', function () { .deserialize(dataSet, function (err, json) { expect(json).to.be.an('object'); - expect(json).to.have.key('id', 'first-name', 'last-name', + expect(json).to.have.key('id', 'first-name', 'last-name', 'username', 'images'); expect(json.images).to.be.an('array').with.length(2) @@ -553,7 +553,7 @@ describe('JSON API Deserializer', function () { id: '2', type: 'stores', attributes: { - name: 'Fashionable Clothes' + name: 'Fashionable Clothes' }, relationships: { deals: { @@ -619,7 +619,7 @@ describe('JSON API Deserializer', function () { name: 'Twin Pines Mall', id: '1', stores: [ - { + { name: 'Tasty Food', id: '1', deals: [ @@ -634,10 +634,10 @@ describe('JSON API Deserializer', function () { id: '2', stores: [ { name: 'Tasty Food', id: '1' } - ] - } + ] + } ] - }, { + }, { name: 'Fashionable Clothes', id: '2', deals: [ @@ -649,10 +649,10 @@ describe('JSON API Deserializer', function () { ] } ] - }, { + }, { name: 'Readable Books', id: '3' - } + } ], deals: [ { @@ -696,7 +696,7 @@ describe('JSON API Deserializer', function () { } ] } - ] + ] }); done(null, json); @@ -1180,8 +1180,7 @@ describe('JSON API Deserializer', function () { expect(json).eql({ id: '54735750e16638ba1eee59cb', 'first-name': 'Sandro', - 'last-name': 'Munda', - 'addresses': [] + 'last-name': 'Munda' }); done(null, json); });