ObjectStateMutations.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. "use strict";
  2. var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");
  3. var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");
  4. var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");
  5. var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
  6. var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
  7. var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");
  8. var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");
  9. var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
  10. var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
  11. _Object$defineProperty(exports, "__esModule", {
  12. value: true
  13. });
  14. exports.commitServerChanges = commitServerChanges;
  15. exports.defaultState = defaultState;
  16. exports.estimateAttribute = estimateAttribute;
  17. exports.estimateAttributes = estimateAttributes;
  18. exports.mergeFirstPendingState = mergeFirstPendingState;
  19. exports.popPendingState = popPendingState;
  20. exports.pushPendingState = pushPendingState;
  21. exports.setPendingOp = setPendingOp;
  22. exports.setServerData = setServerData;
  23. var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof"));
  24. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
  25. var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
  26. var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));
  27. var _encode = _interopRequireDefault(require("./encode"));
  28. var _ParseFile = _interopRequireDefault(require("./ParseFile"));
  29. var _ParseObject = _interopRequireDefault(require("./ParseObject"));
  30. var _ParseRelation = _interopRequireDefault(require("./ParseRelation"));
  31. var _TaskQueue = _interopRequireDefault(require("./TaskQueue"));
  32. var _ParseOp = require("./ParseOp");
  33. function ownKeys(object, enumerableOnly) {
  34. var keys = _Object$keys(object);
  35. if (_Object$getOwnPropertySymbols) {
  36. var symbols = _Object$getOwnPropertySymbols(object);
  37. enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
  38. return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
  39. })), keys.push.apply(keys, symbols);
  40. }
  41. return keys;
  42. }
  43. function _objectSpread(target) {
  44. for (var i = 1; i < arguments.length; i++) {
  45. var _context, _context2;
  46. var source = null != arguments[i] ? arguments[i] : {};
  47. i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) {
  48. (0, _defineProperty2.default)(target, key, source[key]);
  49. }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) {
  50. _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
  51. });
  52. }
  53. return target;
  54. } /**
  55. * @flow
  56. */
  57. /*:: import type { Op } from './ParseOp';*/
  58. /*:: export type AttributeMap = { [attr: string]: any };*/
  59. /*:: export type OpsMap = { [attr: string]: Op };*/
  60. /*:: export type ObjectCache = { [attr: string]: string };*/
  61. /*:: export type State = {
  62. serverData: AttributeMap,
  63. pendingOps: Array<OpsMap>,
  64. objectCache: ObjectCache,
  65. tasks: TaskQueue,
  66. existed: boolean,
  67. };*/
  68. function defaultState() /*: State*/{
  69. return {
  70. serverData: {},
  71. pendingOps: [{}],
  72. objectCache: {},
  73. tasks: new _TaskQueue.default(),
  74. existed: false
  75. };
  76. }
  77. function setServerData(serverData /*: AttributeMap*/, attributes /*: AttributeMap*/) {
  78. for (var _attr in attributes) {
  79. if (typeof attributes[_attr] !== 'undefined') {
  80. serverData[_attr] = attributes[_attr];
  81. } else {
  82. delete serverData[_attr];
  83. }
  84. }
  85. }
  86. function setPendingOp(pendingOps /*: Array<OpsMap>*/, attr /*: string*/, op /*: ?Op*/) {
  87. var last = pendingOps.length - 1;
  88. if (op) {
  89. pendingOps[last][attr] = op;
  90. } else {
  91. delete pendingOps[last][attr];
  92. }
  93. }
  94. function pushPendingState(pendingOps /*: Array<OpsMap>*/) {
  95. pendingOps.push({});
  96. }
  97. function popPendingState(pendingOps /*: Array<OpsMap>*/) /*: OpsMap*/{
  98. var first = pendingOps.shift();
  99. if (!pendingOps.length) {
  100. pendingOps[0] = {};
  101. }
  102. return first;
  103. }
  104. function mergeFirstPendingState(pendingOps /*: Array<OpsMap>*/) {
  105. var first = popPendingState(pendingOps);
  106. var next = pendingOps[0];
  107. for (var _attr2 in first) {
  108. if (next[_attr2] && first[_attr2]) {
  109. var merged = next[_attr2].mergeWith(first[_attr2]);
  110. if (merged) {
  111. next[_attr2] = merged;
  112. }
  113. } else {
  114. next[_attr2] = first[_attr2];
  115. }
  116. }
  117. }
  118. function estimateAttribute(serverData /*: AttributeMap*/, pendingOps /*: Array<OpsMap>*/, className /*: string*/, id /*: ?string*/, attr /*: string*/) /*: mixed*/{
  119. var value = serverData[attr];
  120. for (var i = 0; i < pendingOps.length; i++) {
  121. if (pendingOps[i][attr]) {
  122. if (pendingOps[i][attr] instanceof _ParseOp.RelationOp) {
  123. if (id) {
  124. value = pendingOps[i][attr].applyTo(value, {
  125. className: className,
  126. id: id
  127. }, attr);
  128. }
  129. } else {
  130. value = pendingOps[i][attr].applyTo(value);
  131. }
  132. }
  133. }
  134. return value;
  135. }
  136. function estimateAttributes(serverData /*: AttributeMap*/, pendingOps /*: Array<OpsMap>*/, className /*: string*/, id /*: ?string*/) /*: AttributeMap*/{
  137. var data = {};
  138. for (var attr in serverData) {
  139. data[attr] = serverData[attr];
  140. }
  141. for (var i = 0; i < pendingOps.length; i++) {
  142. for (attr in pendingOps[i]) {
  143. if (pendingOps[i][attr] instanceof _ParseOp.RelationOp) {
  144. if (id) {
  145. data[attr] = pendingOps[i][attr].applyTo(data[attr], {
  146. className: className,
  147. id: id
  148. }, attr);
  149. }
  150. } else {
  151. if ((0, _includes.default)(attr).call(attr, '.')) {
  152. // convert a.b.c into { a: { b: { c: value } } }
  153. var fields = attr.split('.');
  154. var first = fields[0];
  155. var last = fields[fields.length - 1];
  156. data[first] = _objectSpread({}, serverData[first]);
  157. var object = _objectSpread({}, data);
  158. for (var _i = 0; _i < fields.length - 1; _i++) {
  159. var key = fields[_i];
  160. if (!(key in object)) {
  161. object[key] = {};
  162. }
  163. object = object[key];
  164. }
  165. object[last] = pendingOps[i][attr].applyTo(object[last]);
  166. } else {
  167. data[attr] = pendingOps[i][attr].applyTo(data[attr]);
  168. }
  169. }
  170. }
  171. }
  172. return data;
  173. }
  174. function nestedSet(obj, key, value) {
  175. var path = key.split('.');
  176. for (var i = 0; i < path.length - 1; i++) {
  177. if (!(path[i] in obj)) obj[path[i]] = {};
  178. obj = obj[path[i]];
  179. }
  180. if (typeof value === 'undefined') {
  181. delete obj[path[path.length - 1]];
  182. } else {
  183. obj[path[path.length - 1]] = value;
  184. }
  185. }
  186. function commitServerChanges(serverData /*: AttributeMap*/, objectCache /*: ObjectCache*/, changes /*: AttributeMap*/) {
  187. for (var _attr3 in changes) {
  188. var val = changes[_attr3];
  189. nestedSet(serverData, _attr3, val);
  190. if (val && (0, _typeof2.default)(val) === 'object' && !(val instanceof _ParseObject.default) && !(val instanceof _ParseFile.default) && !(val instanceof _ParseRelation.default)) {
  191. var json = (0, _encode.default)(val, false, true);
  192. objectCache[_attr3] = (0, _stringify.default)(json);
  193. }
  194. }
  195. }