Skip to content

Commit e0c51ab

Browse files
omairvaiyaniflovilmart
authored andcommitted
Allow specific keys to be reverted in unsaved objects (#565)
* Allow specific keys to be reverted in unsaved objects * fix(Parse.Object): disallow array params in 'revert' Contains general cleanup and type fixes. * chore(Parse.Object): use const in test cases * chore(Parse.Object): use const in for-loop
1 parent 1084fb7 commit e0c51ab

File tree

2 files changed

+89
-5
lines changed

2 files changed

+89
-5
lines changed

src/ParseObject.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,14 @@ class ParseObject {
224224
return stateController.getPendingOps(this._getStateIdentifier());
225225
}
226226

227-
_clearPendingOps() {
227+
/**
228+
* @param {Array<string>} [keysToClear] - if specified, only ops matching
229+
* these fields will be cleared
230+
*/
231+
_clearPendingOps(keysToClear?: Array<string>) {
228232
var pending = this._getPendingOps();
229233
var latest = pending[pending.length - 1];
230-
var keys = Object.keys(latest);
234+
var keys = keysToClear || Object.keys(latest);
231235
keys.forEach((key) => {
232236
delete latest[key];
233237
});
@@ -932,10 +936,22 @@ class ParseObject {
932936
}
933937

934938
/**
935-
* Clears any changes to this object made since the last call to save()
939+
* Clears any (or specific) changes to this object made since the last call to save()
940+
* @param {string} [keys] - specify which fields to revert
936941
*/
937-
revert(): void {
938-
this._clearPendingOps();
942+
revert(...keys: Array<string>): void {
943+
let keysToRevert;
944+
if(keys.length) {
945+
keysToRevert = [];
946+
for(const key of keys) {
947+
if(typeof(key) === "string") {
948+
keysToRevert.push(key);
949+
} else {
950+
throw new Error("Parse.Object#revert expects either no, or a list of string, arguments.");
951+
}
952+
}
953+
}
954+
this._clearPendingOps(keysToRevert);
939955
}
940956

941957
/**

src/__tests__/ParseObject-test.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,74 @@ describe('ParseObject', () => {
851851
expect(o.op('count')).toBe(undefined);
852852
});
853853

854+
it('can revert a specific field in unsaved ops', () => {
855+
const o = ParseObject.fromJSON({
856+
className: 'Item',
857+
objectId: 'canrevertspecific',
858+
count: 5
859+
});
860+
o.set({ cool: true });
861+
o.increment('count');
862+
expect(o.get('cool')).toBe(true);
863+
expect(o.get('count')).toBe(6);
864+
o.revert('cool');
865+
expect(o.get('cool')).toBe(undefined);
866+
expect(o.op('cool')).toBe(undefined);
867+
expect(o.get('count')).toBe(6);
868+
expect(o.op('count')).not.toBe(undefined);
869+
});
870+
871+
it('can revert multiple fields in unsaved ops', () => {
872+
const o = ParseObject.fromJSON({
873+
className: 'Item',
874+
objectId: 'canrevertmultiple',
875+
count: 5,
876+
age: 18,
877+
gender: 'female'
878+
});
879+
o.set({ cool: true, gender: 'male' });
880+
o.increment('count');
881+
o.increment('age');
882+
expect(o.get('cool')).toBe(true);
883+
expect(o.get('count')).toBe(6);
884+
expect(o.get('age')).toBe(19);
885+
expect(o.get('gender')).toBe('male');
886+
o.revert('age', 'count', 'gender');
887+
expect(o.get('cool')).toBe(true);
888+
expect(o.op('cool')).not.toBe(undefined);
889+
expect(o.get('count')).toBe(5);
890+
expect(o.op('count')).toBe(undefined);
891+
expect(o.get('age')).toBe(18);
892+
expect(o.op('age')).toBe(undefined);
893+
expect(o.get('gender')).toBe('female');
894+
expect(o.op('gender')).toBe(undefined);
895+
});
896+
897+
it('throws if an array is provided', () => {
898+
const o = ParseObject.fromJSON({
899+
className: 'Item',
900+
objectId: 'throwforarray',
901+
count: 5,
902+
age: 18,
903+
gender: 'female'
904+
});
905+
o.set({ cool: true, gender: 'male' });
906+
907+
const err = "Parse.Object#revert expects either no, or a list of string, arguments.";
908+
909+
expect(function() {
910+
o.revert(['age'])
911+
}).toThrow(err);
912+
913+
expect(function() {
914+
o.revert([])
915+
}).toThrow(err);
916+
917+
expect(function() {
918+
o.revert('gender', ['age'])
919+
}).toThrow(err);
920+
});
921+
854922
it('can fetchWithInclude', async () => {
855923
const objectController = CoreManager.getObjectController();
856924
const spy = jest.spyOn(

0 commit comments

Comments
 (0)