ObjectStateMutations.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.commitServerChanges = commitServerChanges;
  6. exports.defaultState = defaultState;
  7. exports.estimateAttribute = estimateAttribute;
  8. exports.estimateAttributes = estimateAttributes;
  9. exports.mergeFirstPendingState = mergeFirstPendingState;
  10. exports.popPendingState = popPendingState;
  11. exports.pushPendingState = pushPendingState;
  12. exports.setPendingOp = setPendingOp;
  13. exports.setServerData = setServerData;
  14. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  15. var _encode = _interopRequireDefault(require("./encode"));
  16. var _ParseFile = _interopRequireDefault(require("./ParseFile"));
  17. var _ParseObject = _interopRequireDefault(require("./ParseObject"));
  18. var _ParseRelation = _interopRequireDefault(require("./ParseRelation"));
  19. var _TaskQueue = _interopRequireDefault(require("./TaskQueue"));
  20. var _ParseOp = require("./ParseOp");
  21. function ownKeys(object, enumerableOnly) {
  22. var keys = Object.keys(object);
  23. if (Object.getOwnPropertySymbols) {
  24. var symbols = Object.getOwnPropertySymbols(object);
  25. enumerableOnly && (symbols = symbols.filter(function (sym) {
  26. return Object.getOwnPropertyDescriptor(object, sym).enumerable;
  27. })), keys.push.apply(keys, symbols);
  28. }
  29. return keys;
  30. }
  31. function _objectSpread(target) {
  32. for (var i = 1; i < arguments.length; i++) {
  33. var source = null != arguments[i] ? arguments[i] : {};
  34. i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
  35. (0, _defineProperty2.default)(target, key, source[key]);
  36. }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
  37. Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
  38. });
  39. }
  40. return target;
  41. }
  42. function defaultState() {
  43. return {
  44. serverData: {},
  45. pendingOps: [{}],
  46. objectCache: {},
  47. tasks: new _TaskQueue.default(),
  48. existed: false
  49. };
  50. }
  51. function setServerData(serverData, attributes) {
  52. for (var _attr in attributes) {
  53. if (typeof attributes[_attr] !== 'undefined') {
  54. serverData[_attr] = attributes[_attr];
  55. } else {
  56. delete serverData[_attr];
  57. }
  58. }
  59. }
  60. function setPendingOp(pendingOps, attr, op) {
  61. var last = pendingOps.length - 1;
  62. if (op) {
  63. pendingOps[last][attr] = op;
  64. } else {
  65. delete pendingOps[last][attr];
  66. }
  67. }
  68. function pushPendingState(pendingOps) {
  69. pendingOps.push({});
  70. }
  71. function popPendingState(pendingOps) {
  72. var first = pendingOps.shift();
  73. if (!pendingOps.length) {
  74. pendingOps[0] = {};
  75. }
  76. return first;
  77. }
  78. function mergeFirstPendingState(pendingOps) {
  79. var first = popPendingState(pendingOps);
  80. var next = pendingOps[0];
  81. for (var _attr2 in first) {
  82. if (next[_attr2] && first[_attr2]) {
  83. var merged = next[_attr2].mergeWith(first[_attr2]);
  84. if (merged) {
  85. next[_attr2] = merged;
  86. }
  87. } else {
  88. next[_attr2] = first[_attr2];
  89. }
  90. }
  91. }
  92. function estimateAttribute(serverData, pendingOps, className, id, attr) {
  93. var value = serverData[attr];
  94. for (var i = 0; i < pendingOps.length; i++) {
  95. if (pendingOps[i][attr]) {
  96. if (pendingOps[i][attr] instanceof _ParseOp.RelationOp) {
  97. if (id) {
  98. value = pendingOps[i][attr].applyTo(value, {
  99. className: className,
  100. id: id
  101. }, attr);
  102. }
  103. } else {
  104. value = pendingOps[i][attr].applyTo(value);
  105. }
  106. }
  107. }
  108. return value;
  109. }
  110. function estimateAttributes(serverData, pendingOps, className, id) {
  111. var data = {};
  112. for (var attr in serverData) {
  113. data[attr] = serverData[attr];
  114. }
  115. for (var i = 0; i < pendingOps.length; i++) {
  116. for (attr in pendingOps[i]) {
  117. if (pendingOps[i][attr] instanceof _ParseOp.RelationOp) {
  118. if (id) {
  119. data[attr] = pendingOps[i][attr].applyTo(data[attr], {
  120. className: className,
  121. id: id
  122. }, attr);
  123. }
  124. } else {
  125. if (attr.includes('.')) {
  126. var fields = attr.split('.');
  127. var first = fields[0];
  128. var last = fields[fields.length - 1];
  129. data[first] = _objectSpread({}, serverData[first]);
  130. var object = _objectSpread({}, data);
  131. for (var _i = 0; _i < fields.length - 1; _i++) {
  132. var key = fields[_i];
  133. if (!(key in object)) {
  134. object[key] = {};
  135. }
  136. object = object[key];
  137. }
  138. object[last] = pendingOps[i][attr].applyTo(object[last]);
  139. } else {
  140. data[attr] = pendingOps[i][attr].applyTo(data[attr]);
  141. }
  142. }
  143. }
  144. }
  145. return data;
  146. }
  147. function nestedSet(obj, key, value) {
  148. var path = key.split('.');
  149. for (var i = 0; i < path.length - 1; i++) {
  150. if (!(path[i] in obj)) obj[path[i]] = {};
  151. obj = obj[path[i]];
  152. }
  153. if (typeof value === 'undefined') {
  154. delete obj[path[path.length - 1]];
  155. } else {
  156. obj[path[path.length - 1]] = value;
  157. }
  158. }
  159. function commitServerChanges(serverData, objectCache, changes) {
  160. for (var _attr3 in changes) {
  161. var val = changes[_attr3];
  162. nestedSet(serverData, _attr3, val);
  163. if (val && typeof val === 'object' && !(val instanceof _ParseObject.default) && !(val instanceof _ParseFile.default) && !(val instanceof _ParseRelation.default)) {
  164. var json = (0, _encode.default)(val, false, true);
  165. objectCache[_attr3] = JSON.stringify(json);
  166. }
  167. }
  168. }