Skip to content

Commit 5921ba2

Browse files
authored
fix: Parse.Object.get returns array instead of object if key name is number-like (#2201)
1 parent 17db8ba commit 5921ba2

File tree

3 files changed

+42
-14
lines changed

3 files changed

+42
-14
lines changed

integration/test/ParseObjectTest.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2056,6 +2056,44 @@ describe('Parse Object', () => {
20562056
expect(obj.get('string')).toBeInstanceOf(String);
20572057
});
20582058

2059+
it('returns correct field values', async () => {
2060+
const values = [
2061+
{ field: 'string', value: 'string' },
2062+
{ field: 'number', value: 1 },
2063+
{ field: 'boolean', value: true },
2064+
{ field: 'array', value: [0, 1, 2] },
2065+
{ field: 'array', value: [1, 2, 3] },
2066+
{ field: 'array', value: [{ '0': 'a' }, 2, 3] },
2067+
{ field: 'object', value: { key: 'value' } },
2068+
{ field: 'object', value: { key1: 'value1', key2: 'value2' } },
2069+
{ field: 'object', value: { key1: 1, key2: 2 } },
2070+
{ field: 'object', value: { '1x1': 1 } },
2071+
{ field: 'object', value: { '1x1': 1, '2': 2 } },
2072+
{ field: 'object', value: { '0': 0 } },
2073+
{ field: 'object', value: { '1': 1 } },
2074+
{ field: 'object', value: { '0': { '0': 'a', '1': 'b' } } },
2075+
{ field: 'date', value: new Date() },
2076+
{
2077+
field: 'file',
2078+
value: Parse.File.fromJSON({
2079+
__type: 'File',
2080+
name: 'name',
2081+
url: 'http://localhost:1337/parse/files/integration/name',
2082+
}),
2083+
},
2084+
{ field: 'geoPoint', value: new Parse.GeoPoint(40, -30) },
2085+
{ field: 'bytes', value: { __type: 'Bytes', base64: 'ZnJveW8=' } },
2086+
];
2087+
for (const value of values) {
2088+
const object = new TestObject();
2089+
object.set(value.field, value.value);
2090+
await object.save();
2091+
const query = new Parse.Query(TestObject);
2092+
const objectAgain = await query.get(object.id);
2093+
expect(objectAgain.get(value.field)).toEqual(value.value);
2094+
}
2095+
});
2096+
20592097
describe('allowCustomObjectId', () => {
20602098
it('can save without setting an objectId', async () => {
20612099
await reconfigureServer({ allowCustomObjectId: true });

src/ObjectStateMutations.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -184,18 +184,7 @@ export function commitServerChanges(
184184
) {
185185
const ParseObject = CoreManager.getParseObject();
186186
for (const attr in changes) {
187-
let val = changes[attr];
188-
// Check for JSON array { '0': { something }, '1': { something } }
189-
if (
190-
val &&
191-
typeof val === 'object' &&
192-
!Array.isArray(val) &&
193-
Object.keys(val).length > 0 &&
194-
Object.keys(val).some(k => !isNaN(parseInt(k))) &&
195-
!['sentPerUTCOffset', 'failedPerUTCOffset'].includes(attr)
196-
) {
197-
val = Object.values(val);
198-
}
187+
const val = changes[attr];
199188
nestedSet(serverData, attr, val);
200189
if (
201190
val &&

src/__tests__/ObjectStateMutations-test.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,9 @@ describe('ObjectStateMutations', () => {
319319
ObjectStateMutations.commitServerChanges(serverData, objectCache, {
320320
items: { '0': { count: 20 }, '1': { count: 5 } },
321321
});
322-
expect(serverData).toEqual({ items: [{ count: 20 }, { count: 5 }] });
323-
expect(objectCache).toEqual({ items: '[{"count":20},{"count":5}]' });
322+
// Should not transform
323+
expect(serverData).toEqual({ items: { '0': { count: 20 }, '1': { count: 5 } } });
324+
expect(objectCache).toEqual({ items: '{"0":{"count":20},"1":{"count":5}}' });
324325
});
325326

326327
it('can commit json array with PushStatus offset fields', () => {

0 commit comments

Comments
 (0)