diff --git a/integration/test/ParseObjectTest.js b/integration/test/ParseObjectTest.js index ef3aed26a..b6effa25a 100644 --- a/integration/test/ParseObjectTest.js +++ b/integration/test/ParseObjectTest.js @@ -2187,4 +2187,37 @@ describe('Parse Object', () => { Parse.allowCustomObjectId = false; }); }); + + 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: '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=' } }, + ]; + 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); + expect(objectAgain.get(value.field)).toEqual(value.value); + } + }); }); diff --git a/src/ObjectStateMutations.ts b/src/ObjectStateMutations.ts index 3292fb88e..e9e89bcdb 100644 --- a/src/ObjectStateMutations.ts +++ b/src/ObjectStateMutations.ts @@ -177,6 +177,13 @@ 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)); +} + export function commitServerChanges( serverData: AttributeMap, objectCache: ObjectCache, @@ -185,13 +192,12 @@ 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' && !Array.isArray(val) && Object.keys(val).length > 0 && - Object.keys(val).some(k => !isNaN(parseInt(k))) && + isJSONArray(val) && !['sentPerUTCOffset', 'failedPerUTCOffset'].includes(attr) ) { val = Object.values(val);