Skip to content

Commit 2b84d59

Browse files
committed
Merge pull request #66 from contentful/stringify-sync
feat: Add stringifySafe and toPlainObject to sync responses
2 parents 9563a59 + 32a7a56 commit 2b84d59

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

lib/sync.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import {filter} from 'lodash/collection'
66
import {cloneDeep} from 'lodash/lang'
77
import createRequestConfig from './create-request-config'
88
import mixinLinkGetters from './mixins/link-getters'
9+
import mixinStringifySafe from './mixins/stringify-safe'
10+
import mixinToPlainObject from './mixins/to-plain-object'
911

1012
/**
1113
* @memberof Sync
@@ -15,6 +17,8 @@ import mixinLinkGetters from './mixins/link-getters'
1517
* @prop {Array<Sync.DeletedEntry>} deletedEntries - List of deleted Entries since last sync
1618
* @prop {Array<Sync.DeletedAsset>} deletedAssets - List of deleted Assets since last sync
1719
* @prop {string} nextSyncToken - Token to be sent to the next sync call
20+
* @prop {function(): Object} toPlainObject() - Returns this Sync collection as a plain JS object
21+
* @prop {function(?function=, space=): Object} stringifySafe(replacer,space) - Stringifies the Sync collection, accounting for circular references. Circular references will be replaced with just a Link object, with a <code>circular</code> property set to <code>true</code>. See <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify">MDN</a> and <a href="https://www.npmjs.com/package/json-stringify-safe">json-stringify-safe</a> for more details on the arguments this method can take.
1822
*/
1923

2024
/**
@@ -65,7 +69,7 @@ export default function pagedSync (http, query, resolveLinks) {
6569
// maps response items again after getters are attached
6670
const mappedResponseItems = mapResponseItems(response.items)
6771
mappedResponseItems.nextSyncToken = response.nextSyncToken
68-
return Object.freeze(mappedResponseItems)
72+
return Object.freeze(mixinStringifySafe(mixinToPlainObject(mappedResponseItems)))
6973
}, error => {
7074
throw error.data
7175
})

test/unit/sync-test.js

+8-6
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ test('Initial sync with one page and filter', t => {
111111
})
112112

113113
test('Initial sync with multiple pages', t => {
114-
t.plan(8)
114+
t.plan(9)
115115
const http = {get: sinon.stub()}
116116
http.get.withArgs('sync', {params: {initial: true}}).returns(Promise.resolve({
117117
data: {
@@ -148,14 +148,16 @@ test('Initial sync with multiple pages', t => {
148148

149149
return pagedSync(http, {initial: true}, true)
150150
.then(response => {
151+
const objResponse = response.toPlainObject()
151152
t.ok(http.get.args[0][1].params.initial, 'http request has initial param')
152153
t.equal(http.get.args[1][1].params.sync_token, 'nextpage1', 'http request param for first page')
153154
t.equal(http.get.args[2][1].params.sync_token, 'nextpage2', 'http request param for second page')
154-
t.equal(response.entries.length, 3, 'entries length')
155-
t.equal(response.deletedEntries.length, 2, 'deleted entries length')
156-
t.equal(response.assets.length, 3, 'entries length')
157-
t.equal(response.deletedAssets.length, 1, 'deleted assets length')
158-
t.equal(response.nextSyncToken, 'nextsynctoken', 'next sync token')
155+
t.equal(objResponse.entries.length, 3, 'entries length')
156+
t.equal(objResponse.deletedEntries.length, 2, 'deleted entries length')
157+
t.equal(objResponse.assets.length, 3, 'entries length')
158+
t.equal(objResponse.deletedAssets.length, 1, 'deleted assets length')
159+
t.equal(objResponse.nextSyncToken, 'nextsynctoken', 'next sync token')
160+
t.ok(response.stringifySafe(), 'stringifies response')
159161
})
160162
})
161163

0 commit comments

Comments
 (0)