Skip to content

Commit b462e5c

Browse files
authored
Merge branch 'alpha' into fix-1798
2 parents 494cb81 + 8717ed6 commit b462e5c

File tree

8 files changed

+108
-11
lines changed

8 files changed

+108
-11
lines changed

changelogs/CHANGELOG_alpha.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
# [5.1.0-alpha.8](https://github.com/parse-community/Parse-SDK-JS/compare/5.1.0-alpha.7...5.1.0-alpha.8) (2024-05-02)
2+
3+
4+
### Bug Fixes
5+
6+
* Pending updates to nested field causes `ParseObject.toJSON()` to return incorrect object ([#1453](https://github.com/parse-community/Parse-SDK-JS/issues/1453)) ([23cc573](https://github.com/parse-community/Parse-SDK-JS/commit/23cc573ccae9e11288aaeff61f478e59bf9bae0c))
7+
8+
# [5.1.0-alpha.7](https://github.com/parse-community/Parse-SDK-JS/compare/5.1.0-alpha.6...5.1.0-alpha.7) (2024-05-01)
9+
10+
11+
### Bug Fixes
12+
13+
* Multiple object updates of nested keys overwrite each other ([#1451](https://github.com/parse-community/Parse-SDK-JS/issues/1451)) ([fa4341a](https://github.com/parse-community/Parse-SDK-JS/commit/fa4341a8c0ce5a9c478435250b4af6ea020a45bd))
14+
115
# [5.1.0-alpha.6](https://github.com/parse-community/Parse-SDK-JS/compare/5.1.0-alpha.5...5.1.0-alpha.6) (2024-04-25)
216

317

integration/test/ParseObjectTest.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,18 @@ describe('Parse Object', () => {
292292
assert.strictEqual(result.get('a').b.c.d, 2);
293293
});
294294

295+
it('can set nested fields without repeating pending operations on toJSON (regression test for #1452)', async () => {
296+
const a = new Parse.Object('MyObject');
297+
a.set('obj', {});
298+
await a.save();
299+
a.set('obj.a', 0);
300+
const json = a.toJSON();
301+
expect(json.obj).toEqual({ a: 0 });
302+
expect(new Set(Object.keys(json))).toEqual(
303+
new Set(['objectId', 'createdAt', 'updatedAt', 'obj'])
304+
);
305+
});
306+
295307
it('can increment nested field and retain full object', async () => {
296308
const obj = new Parse.Object('TestIncrementObject');
297309
obj.set('objectField', { number: 5, letter: 'a' });

jsdoc-conf.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
{
22
"plugins": ["node_modules/jsdoc-babel", "plugins/markdown"],
33
"babel": {
4-
"plugins": ["@babel/plugin-transform-flow-comments"]
4+
"babelrc": false,
5+
"extensions": ["js", "ts", "jsx", "tsx"],
6+
"plugins": ["@babel/plugin-transform-flow-comments"],
7+
"presets": ["@babel/preset-typescript"]
58
},
69
"source": {
710
"include": ["./README.md"],
11+
"includePattern": "\\.(jsx|js|ts|tsx)$",
812
"excludePattern": "(^|\\/|\\\\)_"
913
},
1014
"templates": {

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "parse",
3-
"version": "5.1.0-alpha.6",
3+
"version": "5.1.0-alpha.8",
44
"description": "Parse JavaScript SDK",
55
"homepage": "https://parseplatform.org",
66
"keywords": [

src/ObjectStateMutations.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,14 @@ export function estimateAttributes(
120120
if (attr.includes('.')) {
121121
// convert a.b.c into { a: { b: { c: value } } }
122122
const fields = attr.split('.');
123-
const first = fields[0];
124123
const last = fields[fields.length - 1];
125-
data[first] = { ...serverData[first] };
126-
let object = { ...data };
124+
let object = data;
127125
for (let i = 0; i < fields.length - 1; i++) {
128126
const key = fields[i];
129127
if (!(key in object)) {
130128
object[key] = {};
129+
} else {
130+
object[key] = { ...object[key] };
131131
}
132132
object = object[key];
133133
}

src/ParseObject.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -472,10 +472,6 @@ class ParseObject {
472472
json[attr] = encode(attrs[attr], false, false, seen, offline);
473473
}
474474
}
475-
const pending = this._getPendingOps();
476-
for (const attr in pending[0]) {
477-
json[attr] = pending[0][attr].toJSON(offline);
478-
}
479475

480476
if (this.id) {
481477
json.objectId = this.id;

src/__tests__/ParseObject-test.js

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,77 @@ describe('ParseObject', () => {
759759
'objectField.number': 20,
760760
otherField: { hello: 'world' },
761761
});
762+
expect(o.toJSON()).toEqual({
763+
objectField: {
764+
number: 20,
765+
letter: 'a',
766+
},
767+
otherField: { hello: 'world' },
768+
objectId: 'setNested',
769+
});
770+
});
771+
772+
it('can set multiple nested fields (regression test for #1450)', () => {
773+
const o = new ParseObject('Person');
774+
o._finishFetch({
775+
objectId: 'setNested2_1450',
776+
objectField: {
777+
number: 5,
778+
letter: 'a',
779+
nested: {
780+
number: 0,
781+
letter: 'b',
782+
},
783+
},
784+
});
785+
786+
expect(o.attributes).toEqual({
787+
objectField: { number: 5, letter: 'a', nested: { number: 0, letter: 'b' } },
788+
});
789+
o.set('objectField.number', 20);
790+
o.set('objectField.letter', 'b');
791+
o.set('objectField.nested.number', 1);
792+
o.set('objectField.nested.letter', 'c');
793+
794+
expect(o.attributes).toEqual({
795+
objectField: { number: 20, letter: 'b', nested: { number: 1, letter: 'c' } },
796+
});
797+
expect(o.op('objectField.number') instanceof SetOp).toBe(true);
798+
expect(o.dirtyKeys()).toEqual([
799+
'objectField.number',
800+
'objectField.letter',
801+
'objectField.nested.number',
802+
'objectField.nested.letter',
803+
'objectField',
804+
]);
805+
expect(o._getSaveJSON()).toEqual({
806+
'objectField.number': 20,
807+
'objectField.letter': 'b',
808+
'objectField.nested.number': 1,
809+
'objectField.nested.letter': 'c',
810+
});
811+
812+
o.revert('objectField.nested.number');
813+
o.revert('objectField.nested.letter');
814+
expect(o._getSaveJSON()).toEqual({
815+
'objectField.number': 20,
816+
'objectField.letter': 'b',
817+
});
818+
expect(o.attributes).toEqual({
819+
objectField: { number: 20, letter: 'b', nested: { number: 0, letter: 'b' } },
820+
});
821+
822+
// Also test setting new root fields using the dot notation
823+
o.set('objectField2.number', 0);
824+
expect(o._getSaveJSON()).toEqual({
825+
'objectField.number': 20,
826+
'objectField.letter': 'b',
827+
'objectField2.number': 0,
828+
});
829+
expect(o.attributes).toEqual({
830+
objectField: { number: 20, letter: 'b', nested: { number: 0, letter: 'b' } },
831+
objectField2: { number: 0 },
832+
});
762833
});
763834

764835
it('can increment a nested field', () => {

0 commit comments

Comments
 (0)