From 2b69b26bb07fa6abf1df0d49ea553414f87e9049 Mon Sep 17 00:00:00 2001 From: Morten Moeller Date: Sat, 13 Apr 2024 20:39:50 -0500 Subject: [PATCH 1/4] Support `Parse.EventuallyQueue` setting and getting using `CoreManager`. --- src/Parse.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Parse.ts b/src/Parse.ts index dbf3a0983..1728dc891 100644 --- a/src/Parse.ts +++ b/src/Parse.ts @@ -120,7 +120,6 @@ const Parse: ParseType = { CoreManager: CoreManager, Config: Config, Error: ParseError, - EventuallyQueue: EventuallyQueue, FacebookUtils: FacebookUtils, File: File, GeoPoint: GeoPoint, @@ -151,6 +150,18 @@ const Parse: ParseType = { Hooks: undefined, Parse: undefined, + /** + * @member {EventuallyQueue} Parse.EventuallyQueue + * @static + */ + set EventuallyQueue(queue: EventuallyQueue) { + CoreManager.setEventuallyQueue(queue); + }, + + get EventuallyQueue() { + return CoreManager.getEventuallyQueue(); + }, + /** * Call this method first to set up your authentication tokens for Parse. * From 4ff19500b70c9412b63f68624c69afa590bc1009 Mon Sep 17 00:00:00 2001 From: Morten Moeller Date: Sat, 27 Apr 2024 08:32:10 -0500 Subject: [PATCH 2/4] Revert "Support `Parse.EventuallyQueue` setting and getting using `CoreManager`." This reverts commit 2b69b26bb07fa6abf1df0d49ea553414f87e9049. --- src/Parse.ts | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/Parse.ts b/src/Parse.ts index 1728dc891..dbf3a0983 100644 --- a/src/Parse.ts +++ b/src/Parse.ts @@ -120,6 +120,7 @@ const Parse: ParseType = { CoreManager: CoreManager, Config: Config, Error: ParseError, + EventuallyQueue: EventuallyQueue, FacebookUtils: FacebookUtils, File: File, GeoPoint: GeoPoint, @@ -150,18 +151,6 @@ const Parse: ParseType = { Hooks: undefined, Parse: undefined, - /** - * @member {EventuallyQueue} Parse.EventuallyQueue - * @static - */ - set EventuallyQueue(queue: EventuallyQueue) { - CoreManager.setEventuallyQueue(queue); - }, - - get EventuallyQueue() { - return CoreManager.getEventuallyQueue(); - }, - /** * Call this method first to set up your authentication tokens for Parse. * From 255d531ef8cc7f122496de65db78f37e25ae8a8e Mon Sep 17 00:00:00 2001 From: Morten Moeller Date: Sat, 27 Apr 2024 08:35:21 -0500 Subject: [PATCH 3/4] Fixes issue where you have multiple Ops on the same properties (using sub-property syntax like `data.a` on set). --- src/ObjectStateMutations.js | 3 ++- src/__tests__/ParseObject-test.js | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/ObjectStateMutations.js b/src/ObjectStateMutations.js index 271e4f6b5..114842ac8 100644 --- a/src/ObjectStateMutations.js +++ b/src/ObjectStateMutations.js @@ -122,7 +122,8 @@ export function estimateAttributes( const fields = attr.split('.'); const first = fields[0]; const last = fields[fields.length - 1]; - data[first] = { ...serverData[first] }; + // data could be locally set/updated and not saved yet, or multiple ops a.b and a.c can have been processed already + data[first] = { ...(data[first] || serverData[first]) }; let object = { ...data }; for (let i = 0; i < fields.length - 1; i++) { const key = fields[i]; diff --git a/src/__tests__/ParseObject-test.js b/src/__tests__/ParseObject-test.js index 2066a8979..a41426850 100644 --- a/src/__tests__/ParseObject-test.js +++ b/src/__tests__/ParseObject-test.js @@ -499,6 +499,26 @@ describe('ParseObject', () => { expect(o.has('age')).toBe(true); }); + it('setting multiple properties in an object', () => { + const o = new ParseObject('Person'); + o._finishFetch({ + objectId: 'p98', + age: 28, + data: { foo: 'bar' }, + }); + expect(o.dirty()).toBe(false); + expect(o.dirty()).toBe(false); + expect(o.has('data')).toBe(true); + + o.set('data.score', 10); + expect(o.get('data')).toEqual({ foo: 'bar', score: 10 }); + expect(o.dirty('data')).toBe(true); + + o.set('data.score2', 12); + expect(o.get('data')).toEqual({ foo: 'bar', score: 10, score2: 12 }); + expect(o.dirty('data')).toBe(true); + }); + it('can tell if a field is dirty', () => { const o = new ParseObject('Person'); o._finishFetch({ From 3c913ce32b7b3422f2ae5cd05cdbc2947c31075e Mon Sep 17 00:00:00 2001 From: Morten Moeller Date: Sun, 28 Apr 2024 20:24:37 -0500 Subject: [PATCH 4/4] Test from #1450 --- src/__tests__/ParseObject-test.js | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/__tests__/ParseObject-test.js b/src/__tests__/ParseObject-test.js index a41426850..b22cee63b 100644 --- a/src/__tests__/ParseObject-test.js +++ b/src/__tests__/ParseObject-test.js @@ -507,7 +507,6 @@ describe('ParseObject', () => { data: { foo: 'bar' }, }); expect(o.dirty()).toBe(false); - expect(o.dirty()).toBe(false); expect(o.has('data')).toBe(true); o.set('data.score', 10); @@ -519,6 +518,33 @@ describe('ParseObject', () => { expect(o.dirty('data')).toBe(true); }); + it('can set multiple nested fields (regression test for #1450)', () => { + const o = new ParseObject('Person'); + o._finishFetch({ + objectId: 'setNested2_1450', + objectField: { + number: 5, + letter: 'a', + }, + }); + + expect(o.attributes).toEqual({ + objectField: { number: 5, letter: 'a' }, + }); + o.set('objectField.number', 20); + o.set('objectField.letter', 'b'); + + expect(o.attributes).toEqual({ + objectField: { number: 20, letter: 'b' }, + }); + expect(o.op('objectField.number') instanceof SetOp).toBe(true); + expect(o.dirtyKeys()).toEqual(['objectField.number', 'objectField.letter', 'objectField']); + expect(o._getSaveJSON()).toEqual({ + 'objectField.number': 20, + 'objectField.letter': 'b', + }); + }); + it('can tell if a field is dirty', () => { const o = new ParseObject('Person'); o._finishFetch({