ObjectStateMutations.js 4.4 KB

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