From 37f2030d6db67c99e98b492432e68ded8ee91d73 Mon Sep 17 00:00:00 2001 From: sl-ffx Date: Thu, 14 Apr 2022 15:50:42 +0200 Subject: [PATCH 1/5] feat: add meta to Resource Identifier Objects --- lib/deserializer-utils.js | 6 ++++++ lib/serializer-utils.js | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/deserializer-utils.js b/lib/deserializer-utils.js index 1265fd4..189c56c 100644 --- a/lib/deserializer-utils.js +++ b/lib/deserializer-utils.js @@ -136,9 +136,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; } }); diff --git a/lib/serializer-utils.js b/lib/serializer-utils.js index 0786e6a..8fa30a1 100644 --- a/lib/serializer-utils.js +++ b/lib/serializer-utils.js @@ -230,7 +230,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) { From b95aacc4eb150ec968a66dfd493ebabc06968b0f Mon Sep 17 00:00:00 2001 From: sl-ffx Date: Mon, 27 Jun 2022 11:57:58 +0200 Subject: [PATCH 2/5] feat: add meta data if set --- browserify/jsonapi-serializer.js | 14 ++++++++++- package-lock.json | 43 +++++++++++++++++++++++--------- package.json | 4 +-- 3 files changed, 46 insertions(+), 15 deletions(-) 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/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..05b96a8 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.0", "description": "A Node.js framework agnostic library for serializing your data to JSON API", "main": "index.js", "scripts": { From 5bc24ad6259734572e46649fa6610816a3de0295 Mon Sep 17 00:00:00 2001 From: sl-ffx Date: Mon, 27 Jun 2022 12:14:22 +0200 Subject: [PATCH 3/5] fix: do not set relationships if no includes found --- lib/deserializer-utils.js | 20 +++++++++++++------- package.json | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/deserializer-utils.js b/lib/deserializer-utils.js index 189c56c..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,19 +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 { - if (relationshipData.meta) { - valueForRelationship.meta = relationshipData.meta - } - return valueForRelationship; } + + if (relationshipData.meta) { + valueForRelationship.meta = relationshipData.meta + } + + return valueForRelationship; }); } diff --git a/package.json b/package.json index 05b96a8..654b12d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@freshfx/jsonapi-serializer", - "version": "3.7.0", + "version": "3.7.1", "description": "A Node.js framework agnostic library for serializing your data to JSON API", "main": "index.js", "scripts": { From 6f584077e40fbb10b9e777378041934b9af4e872 Mon Sep 17 00:00:00 2001 From: sl-ffx Date: Wed, 20 Dec 2023 13:14:24 +0100 Subject: [PATCH 4/5] test: fix test for last changes --- test/deserializer.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) 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); }); From 54ea94a7f1c4bcc831f1029aebca2640c5940e92 Mon Sep 17 00:00:00 2001 From: sl-ffx Date: Wed, 20 Dec 2023 13:14:51 +0100 Subject: [PATCH 5/5] feat: allow nested option typeForAttribute --- lib/serializer-utils.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/serializer-utils.js b/lib/serializer-utils.js index 8fa30a1..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 = [];