unsavedChildren.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. "use strict";
  2. var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
  3. var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
  4. _Object$defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = unsavedChildren;
  8. var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof"));
  9. var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
  10. var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));
  11. var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));
  12. var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
  13. var _ParseFile = _interopRequireDefault(require("./ParseFile"));
  14. var _ParseObject = _interopRequireDefault(require("./ParseObject"));
  15. var _ParseRelation = _interopRequireDefault(require("./ParseRelation"));
  16. /**
  17. * Copyright (c) 2015-present, Parse, LLC.
  18. * All rights reserved.
  19. *
  20. * This source code is licensed under the BSD-style license found in the
  21. * LICENSE file in the root directory of this source tree. An additional grant
  22. * of patent rights can be found in the PATENTS file in the same directory.
  23. *
  24. * @flow
  25. */
  26. /**
  27. * Return an array of unsaved children, which are either Parse Objects or Files.
  28. * If it encounters any dirty Objects without Ids, it will throw an exception.
  29. *
  30. * @param {Parse.Object} obj
  31. * @param {boolean} allowDeepUnsaved
  32. * @returns {Array}
  33. */
  34. function unsavedChildren(obj
  35. /*: ParseObject*/
  36. , allowDeepUnsaved
  37. /*:: ?: boolean*/
  38. )
  39. /*: Array<ParseFile | ParseObject>*/
  40. {
  41. var _context;
  42. var encountered = {
  43. objects: {},
  44. files: []
  45. };
  46. var identifier = (0, _concat.default)(_context = "".concat(obj.className, ":")).call(_context, obj._getId());
  47. encountered.objects[identifier] = obj.dirty() ? obj : true;
  48. var attributes = obj.attributes;
  49. for (var attr in attributes) {
  50. if ((0, _typeof2.default)(attributes[attr]) === 'object') {
  51. traverse(attributes[attr], encountered, false, !!allowDeepUnsaved);
  52. }
  53. }
  54. var unsaved = [];
  55. for (var id in encountered.objects) {
  56. if (id !== identifier && encountered.objects[id] !== true) {
  57. unsaved.push(encountered.objects[id]);
  58. }
  59. }
  60. return (0, _concat.default)(unsaved).call(unsaved, encountered.files);
  61. }
  62. function traverse(obj
  63. /*: ParseObject*/
  64. , encountered
  65. /*: EncounterMap*/
  66. , shouldThrow
  67. /*: boolean*/
  68. , allowDeepUnsaved
  69. /*: boolean*/
  70. ) {
  71. if (obj instanceof _ParseObject.default) {
  72. var _context2;
  73. if (!obj.id && shouldThrow) {
  74. throw new Error('Cannot create a pointer to an unsaved Object.');
  75. }
  76. var _identifier = (0, _concat.default)(_context2 = "".concat(obj.className, ":")).call(_context2, obj._getId());
  77. if (!encountered.objects[_identifier]) {
  78. encountered.objects[_identifier] = obj.dirty() ? obj : true;
  79. var attributes = obj.attributes;
  80. for (var attr in attributes) {
  81. if ((0, _typeof2.default)(attributes[attr]) === 'object') {
  82. traverse(attributes[attr], encountered, !allowDeepUnsaved, allowDeepUnsaved);
  83. }
  84. }
  85. }
  86. return;
  87. }
  88. if (obj instanceof _ParseFile.default) {
  89. var _context3;
  90. if (!obj.url() && (0, _indexOf.default)(_context3 = encountered.files).call(_context3, obj) < 0) {
  91. encountered.files.push(obj);
  92. }
  93. return;
  94. }
  95. if (obj instanceof _ParseRelation.default) {
  96. return;
  97. }
  98. if ((0, _isArray.default)(obj)) {
  99. (0, _forEach.default)(obj).call(obj, function (el) {
  100. if ((0, _typeof2.default)(el) === 'object') {
  101. traverse(el, encountered, shouldThrow, allowDeepUnsaved);
  102. }
  103. });
  104. }
  105. for (var k in obj) {
  106. if ((0, _typeof2.default)(obj[k]) === 'object') {
  107. traverse(obj[k], encountered, shouldThrow, allowDeepUnsaved);
  108. }
  109. }
  110. }