unsavedChildren.js 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
  9. var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));
  10. var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));
  11. var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
  12. var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof"));
  13. var _ParseFile = _interopRequireDefault(require("./ParseFile"));
  14. var _ParseObject = _interopRequireDefault(require("./ParseObject"));
  15. var _ParseRelation = _interopRequireDefault(require("./ParseRelation"));
  16. /**
  17. * @flow
  18. */
  19. /*:: type EncounterMap = {
  20. objects: { [identifier: string]: ParseObject | boolean },
  21. files: Array<ParseFile>,
  22. };*/
  23. /**
  24. * Return an array of unsaved children, which are either Parse Objects or Files.
  25. * If it encounters any dirty Objects without Ids, it will throw an exception.
  26. *
  27. * @param {Parse.Object} obj
  28. * @param {boolean} allowDeepUnsaved
  29. * @returns {Array}
  30. */
  31. function unsavedChildren(obj /*: ParseObject*/, allowDeepUnsaved /*:: ?: boolean*/) /*: Array<ParseFile | ParseObject>*/{
  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 (0, _concat.default)(unsaved).call(unsaved, encountered.files);
  51. }
  52. function traverse(obj /*: ParseObject*/, encountered /*: EncounterMap*/, shouldThrow /*: boolean*/, allowDeepUnsaved /*: boolean*/) {
  53. if (obj instanceof _ParseObject.default) {
  54. if (!obj.id && shouldThrow) {
  55. throw new Error('Cannot create a pointer to an unsaved Object.');
  56. }
  57. var _identifier = obj.className + ':' + obj._getId();
  58. if (!encountered.objects[_identifier]) {
  59. encountered.objects[_identifier] = obj.dirty() ? obj : true;
  60. var attributes = obj.attributes;
  61. for (var attr in attributes) {
  62. if ((0, _typeof2.default)(attributes[attr]) === 'object') {
  63. traverse(attributes[attr], encountered, !allowDeepUnsaved, allowDeepUnsaved);
  64. }
  65. }
  66. }
  67. return;
  68. }
  69. if (obj instanceof _ParseFile.default) {
  70. var _context;
  71. if (!obj.url() && (0, _indexOf.default)(_context = encountered.files).call(_context, obj) < 0) {
  72. encountered.files.push(obj);
  73. }
  74. return;
  75. }
  76. if (obj instanceof _ParseRelation.default) {
  77. return;
  78. }
  79. if ((0, _isArray.default)(obj)) {
  80. (0, _forEach.default)(obj).call(obj, function (el) {
  81. if ((0, _typeof2.default)(el) === 'object') {
  82. traverse(el, encountered, shouldThrow, allowDeepUnsaved);
  83. }
  84. });
  85. }
  86. for (var k in obj) {
  87. if ((0, _typeof2.default)(obj[k]) === 'object') {
  88. traverse(obj[k], encountered, shouldThrow, allowDeepUnsaved);
  89. }
  90. }
  91. }