ObjectStateMutations.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  15. var _encode = _interopRequireDefault(require("./encode"));
  16. var _CoreManager = _interopRequireDefault(require("./CoreManager"));
  17. var _ParseFile = _interopRequireDefault(require("./ParseFile"));
  18. var _ParseRelation = _interopRequireDefault(require("./ParseRelation"));
  19. var _TaskQueue = _interopRequireDefault(require("./TaskQueue"));
  20. var _ParseOp = require("./ParseOp");
  21. function defaultState() {
  22. return {
  23. serverData: {},
  24. pendingOps: [{}],
  25. objectCache: {},
  26. tasks: new _TaskQueue.default(),
  27. existed: false
  28. };
  29. }
  30. function setServerData(serverData, attributes) {
  31. for (var _attr in attributes) {
  32. if (typeof attributes[_attr] !== 'undefined') {
  33. serverData[_attr] = attributes[_attr];
  34. } else {
  35. delete serverData[_attr];
  36. }
  37. }
  38. }
  39. function setPendingOp(pendingOps, attr, op) {
  40. var last = pendingOps.length - 1;
  41. if (op) {
  42. pendingOps[last][attr] = op;
  43. } else {
  44. delete pendingOps[last][attr];
  45. }
  46. }
  47. function pushPendingState(pendingOps) {
  48. pendingOps.push({});
  49. }
  50. function popPendingState(pendingOps) {
  51. var first = pendingOps.shift();
  52. if (!pendingOps.length) {
  53. pendingOps[0] = {};
  54. }
  55. return first;
  56. }
  57. function mergeFirstPendingState(pendingOps) {
  58. var first = popPendingState(pendingOps);
  59. var next = pendingOps[0];
  60. for (var _attr2 in first) {
  61. if (next[_attr2] && first[_attr2]) {
  62. var merged = next[_attr2].mergeWith(first[_attr2]);
  63. if (merged) {
  64. next[_attr2] = merged;
  65. }
  66. } else {
  67. next[_attr2] = first[_attr2];
  68. }
  69. }
  70. }
  71. function estimateAttribute(serverData, pendingOps, object, attr) {
  72. var value = serverData[attr];
  73. for (var i = 0; i < pendingOps.length; i++) {
  74. if (pendingOps[i][attr]) {
  75. if (pendingOps[i][attr] instanceof _ParseOp.RelationOp) {
  76. if (object.id) {
  77. value = pendingOps[i][attr].applyTo(value, object, attr);
  78. }
  79. } else {
  80. value = pendingOps[i][attr].applyTo(value);
  81. }
  82. }
  83. }
  84. return value;
  85. }
  86. function estimateAttributes(serverData, pendingOps, object) {
  87. var data = {};
  88. for (var attr in serverData) {
  89. data[attr] = serverData[attr];
  90. }
  91. for (var i = 0; i < pendingOps.length; i++) {
  92. for (attr in pendingOps[i]) {
  93. if (pendingOps[i][attr] instanceof _ParseOp.RelationOp) {
  94. if (object.id) {
  95. data[attr] = pendingOps[i][attr].applyTo(data[attr], object, attr);
  96. }
  97. } else {
  98. if (attr.includes('.')) {
  99. var fields = attr.split('.');
  100. var last = fields[fields.length - 1];
  101. var _object = data;
  102. for (var _i = 0; _i < fields.length - 1; _i++) {
  103. var key = fields[_i];
  104. if (!(key in _object)) {
  105. var nextKey = fields[_i + 1];
  106. if (!isNaN(nextKey)) {
  107. _object[key] = [];
  108. } else {
  109. _object[key] = {};
  110. }
  111. } else {
  112. if (Array.isArray(_object[key])) {
  113. _object[key] = (0, _toConsumableArray2.default)(_object[key]);
  114. } else {
  115. _object[key] = Object.assign({}, _object[key]);
  116. }
  117. }
  118. _object = _object[key];
  119. }
  120. _object[last] = pendingOps[i][attr].applyTo(_object[last]);
  121. } else {
  122. data[attr] = pendingOps[i][attr].applyTo(data[attr]);
  123. }
  124. }
  125. }
  126. }
  127. return data;
  128. }
  129. function nestedSet(obj, key, value) {
  130. var paths = key.split('.');
  131. for (var i = 0; i < paths.length - 1; i++) {
  132. var path = paths[i];
  133. if (!(path in obj)) {
  134. var nextPath = paths[i + 1];
  135. if (!isNaN(nextPath)) {
  136. obj[path] = [];
  137. } else {
  138. obj[path] = {};
  139. }
  140. }
  141. obj = obj[path];
  142. }
  143. if (typeof value === 'undefined') {
  144. delete obj[paths[paths.length - 1]];
  145. } else {
  146. obj[paths[paths.length - 1]] = value;
  147. }
  148. }
  149. function commitServerChanges(serverData, objectCache, changes) {
  150. var ParseObject = _CoreManager.default.getParseObject();
  151. for (var _attr3 in changes) {
  152. var val = changes[_attr3];
  153. nestedSet(serverData, _attr3, val);
  154. if (val && typeof val === 'object' && !(val instanceof ParseObject) && !(val instanceof _ParseFile.default) && !(val instanceof _ParseRelation.default)) {
  155. var json = (0, _encode.default)(val, false, true);
  156. objectCache[_attr3] = JSON.stringify(json);
  157. }
  158. }
  159. }