unsavedChildren.js 3.0 KB

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