From c4a21e2d0caebb321202bde9c694d1ea8d71eb48 Mon Sep 17 00:00:00 2001 From: Mandar Date: Fri, 5 Jul 2024 14:54:47 +0530 Subject: [PATCH 1/4] bug: JSON array conversion logic converting normal JSON to array --- integration/test/ParseObjectTest.js | 34 +++++++++++++++++++++++++++++ src/ObjectStateMutations.ts | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/integration/test/ParseObjectTest.js b/integration/test/ParseObjectTest.js index ef3aed26a..7f21d21ee 100644 --- a/integration/test/ParseObjectTest.js +++ b/integration/test/ParseObjectTest.js @@ -2187,4 +2187,38 @@ describe('Parse Object', () => { Parse.allowCustomObjectId = false; }); }); + + it.only('returns correct field values', async () => { + const values = [ + // { field: 'string', value: 'string' }, + // { field: 'number', value: 1 }, + // { field: 'boolean', value: true }, + // { field: 'array', value: [1, 2, 3] }, + // { field: 'object', value: { key: 'value' } }, + // { field: 'object', value: { key1: 'value1', key2: 'value2' } }, + // { field: 'object', value: { key1: 1, key2: 2 } }, + { field: 'object', value: { '1x1': 1, '2': 1, '1': 2 } }, + { field: 'object', value: { '1': 1 } }, + // { field: 'date', value: new Date() }, + // { + // field: 'file', + // value: Parse.File.fromJSON({ + // __type: 'File', + // name: 'name', + // url: 'http://localhost:1337/parse/files/integration/name', + // }), + // }, + // { field: 'geoPoint', value: new Parse.GeoPoint(40, -30) }, + // { field: 'bytes', value: { __type: 'Bytes', base64: 'ZnJveW8=' } }, + ]; + for (const value of values) { + const object = new TestObject(); + object.set(value.field, value.value); + await object.save(); + const query = new Parse.Query(TestObject); + const objectAgain = await query.get(object.id); + console.log('>>>>>>>', objectAgain.get(value.field), value.value) + expect(objectAgain.get(value.field)).toEqual(value.value); + } + }); }); diff --git a/src/ObjectStateMutations.ts b/src/ObjectStateMutations.ts index 3292fb88e..2d01218ae 100644 --- a/src/ObjectStateMutations.ts +++ b/src/ObjectStateMutations.ts @@ -191,7 +191,7 @@ export function commitServerChanges( typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length > 0 && - Object.keys(val).some(k => !isNaN(parseInt(k))) && + Object.keys(val).some(k => k === String(Number(k)) && Number.isInteger(Number(k))) && !['sentPerUTCOffset', 'failedPerUTCOffset'].includes(attr) ) { val = Object.values(val); From 524a68cef1dd4a2914d1537768768beb726b2ace Mon Sep 17 00:00:00 2001 From: Mandar Date: Fri, 5 Jul 2024 15:14:52 +0530 Subject: [PATCH 2/4] fix: Objects wrongly getting converted to Array --- integration/test/ParseObjectTest.js | 5 ++--- src/ObjectStateMutations.ts | 8 +++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/integration/test/ParseObjectTest.js b/integration/test/ParseObjectTest.js index 7f21d21ee..98f5a661e 100644 --- a/integration/test/ParseObjectTest.js +++ b/integration/test/ParseObjectTest.js @@ -2188,7 +2188,7 @@ describe('Parse Object', () => { }); }); - it.only('returns correct field values', async () => { + fit('returns correct field values', async () => { const values = [ // { field: 'string', value: 'string' }, // { field: 'number', value: 1 }, @@ -2197,7 +2197,7 @@ describe('Parse Object', () => { // { field: 'object', value: { key: 'value' } }, // { field: 'object', value: { key1: 'value1', key2: 'value2' } }, // { field: 'object', value: { key1: 1, key2: 2 } }, - { field: 'object', value: { '1x1': 1, '2': 1, '1': 2 } }, + { field: 'object', value: { '1x1': 1, '2': 2, '3': 3 } }, { field: 'object', value: { '1': 1 } }, // { field: 'date', value: new Date() }, // { @@ -2217,7 +2217,6 @@ describe('Parse Object', () => { await object.save(); const query = new Parse.Query(TestObject); const objectAgain = await query.get(object.id); - console.log('>>>>>>>', objectAgain.get(value.field), value.value) expect(objectAgain.get(value.field)).toEqual(value.value); } }); diff --git a/src/ObjectStateMutations.ts b/src/ObjectStateMutations.ts index 2d01218ae..1c93d74b9 100644 --- a/src/ObjectStateMutations.ts +++ b/src/ObjectStateMutations.ts @@ -177,6 +177,12 @@ function nestedSet(obj, key, value) { } } +function isJSONArray(val) { + const keys = Object.keys(val); + const indexes = keys.map((k, i) => `${i}`); + return keys.every(k => indexes.includes(k)); +} + export function commitServerChanges( serverData: AttributeMap, objectCache: ObjectCache, @@ -191,7 +197,7 @@ export function commitServerChanges( typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length > 0 && - Object.keys(val).some(k => k === String(Number(k)) && Number.isInteger(Number(k))) && + isJSONArray(val) && !['sentPerUTCOffset', 'failedPerUTCOffset'].includes(attr) ) { val = Object.values(val); From 12787a64a4ea093215b1529e7d0c7361d2b26167 Mon Sep 17 00:00:00 2001 From: Mandar Date: Sat, 6 Jul 2024 23:44:09 +0530 Subject: [PATCH 3/4] fix: uncommented test cases --- integration/test/ParseObjectTest.js | 36 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/integration/test/ParseObjectTest.js b/integration/test/ParseObjectTest.js index 98f5a661e..b6effa25a 100644 --- a/integration/test/ParseObjectTest.js +++ b/integration/test/ParseObjectTest.js @@ -2190,26 +2190,26 @@ describe('Parse Object', () => { fit('returns correct field values', async () => { const values = [ - // { field: 'string', value: 'string' }, - // { field: 'number', value: 1 }, - // { field: 'boolean', value: true }, - // { field: 'array', value: [1, 2, 3] }, - // { field: 'object', value: { key: 'value' } }, - // { field: 'object', value: { key1: 'value1', key2: 'value2' } }, - // { field: 'object', value: { key1: 1, key2: 2 } }, + { field: 'string', value: 'string' }, + { field: 'number', value: 1 }, + { field: 'boolean', value: true }, + { field: 'array', value: [1, 2, 3] }, + { field: 'object', value: { key: 'value' } }, + { field: 'object', value: { key1: 'value1', key2: 'value2' } }, + { field: 'object', value: { key1: 1, key2: 2 } }, { field: 'object', value: { '1x1': 1, '2': 2, '3': 3 } }, { field: 'object', value: { '1': 1 } }, - // { field: 'date', value: new Date() }, - // { - // field: 'file', - // value: Parse.File.fromJSON({ - // __type: 'File', - // name: 'name', - // url: 'http://localhost:1337/parse/files/integration/name', - // }), - // }, - // { field: 'geoPoint', value: new Parse.GeoPoint(40, -30) }, - // { field: 'bytes', value: { __type: 'Bytes', base64: 'ZnJveW8=' } }, + { field: 'date', value: new Date() }, + { + field: 'file', + value: Parse.File.fromJSON({ + __type: 'File', + name: 'name', + url: 'http://localhost:1337/parse/files/integration/name', + }), + }, + { field: 'geoPoint', value: new Parse.GeoPoint(40, -30) }, + { field: 'bytes', value: { __type: 'Bytes', base64: 'ZnJveW8=' } }, ]; for (const value of values) { const object = new TestObject(); From 0508e17ed86103b8512268097f3aeaf67e9f7f0a Mon Sep 17 00:00:00 2001 From: Mandar Date: Sat, 6 Jul 2024 23:45:22 +0530 Subject: [PATCH 4/4] cleanup --- src/ObjectStateMutations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ObjectStateMutations.ts b/src/ObjectStateMutations.ts index 1c93d74b9..e9e89bcdb 100644 --- a/src/ObjectStateMutations.ts +++ b/src/ObjectStateMutations.ts @@ -178,6 +178,7 @@ function nestedSet(obj, key, value) { } function isJSONArray(val) { + // Check for JSON array { '0': { something }, '1': { something } } const keys = Object.keys(val); const indexes = keys.map((k, i) => `${i}`); return keys.every(k => indexes.includes(k)); @@ -191,7 +192,6 @@ export function commitServerChanges( const ParseObject = CoreManager.getParseObject(); for (const attr in changes) { let val = changes[attr]; - // Check for JSON array { '0': { something }, '1': { something } } if ( val && typeof val === 'object' &&