unsavedChildren.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 _CoreManager = _interopRequireDefault(require("./CoreManager"));
  13. var _ParseFile = _interopRequireDefault(require("./ParseFile"));
  14. var _ParseRelation = _interopRequireDefault(require("./ParseRelation"));
  15. /**
  16. * Return an array of unsaved children, which are either Parse Objects or Files.
  17. * If it encounters any dirty Objects without Ids, it will throw an exception.
  18. *
  19. * @param {Parse.Object} obj
  20. * @param {boolean} allowDeepUnsaved
  21. * @returns {Array}
  22. */
  23. function unsavedChildren(obj, allowDeepUnsaved) {
  24. const encountered = {
  25. objects: {},
  26. files: []
  27. };
  28. const identifier = obj.className + ':' + obj._getId();
  29. encountered.objects[identifier] = obj.dirty() ? obj : true;
  30. const attributes = obj.attributes;
  31. for (const attr in attributes) {
  32. if (typeof attributes[attr] === 'object') {
  33. traverse(attributes[attr], encountered, false, !!allowDeepUnsaved);
  34. }
  35. }
  36. const unsaved = [];
  37. for (const id in encountered.objects) {
  38. if (id !== identifier && encountered.objects[id] !== true) {
  39. unsaved.push(encountered.objects[id]);
  40. }
  41. }
  42. return (0, _concat.default)(unsaved).call(unsaved, encountered.files);
  43. }
  44. function traverse(obj, encountered, shouldThrow, allowDeepUnsaved) {
  45. const ParseObject = _CoreManager.default.getParseObject();
  46. if (obj instanceof ParseObject) {
  47. if (!obj.id && shouldThrow) {
  48. throw new Error('Cannot create a pointer to an unsaved Object.');
  49. }
  50. const identifier = obj.className + ':' + obj._getId();
  51. if (!encountered.objects[identifier]) {
  52. encountered.objects[identifier] = obj.dirty() ? obj : true;
  53. const attributes = obj.attributes;
  54. for (const attr in attributes) {
  55. if (typeof attributes[attr] === 'object') {
  56. traverse(attributes[attr], encountered, !allowDeepUnsaved, allowDeepUnsaved);
  57. }
  58. }
  59. }
  60. return;
  61. }
  62. if (obj instanceof _ParseFile.default) {
  63. var _context;
  64. if (!obj.url() && (0, _indexOf.default)(_context = encountered.files).call(_context, obj) < 0) {
  65. encountered.files.push(obj);
  66. }
  67. return;
  68. }
  69. if (obj instanceof _ParseRelation.default) {
  70. return;
  71. }
  72. if ((0, _isArray.default)(obj)) {
  73. (0, _forEach.default)(obj).call(obj, el => {
  74. if (typeof el === 'object') {
  75. traverse(el, encountered, shouldThrow, allowDeepUnsaved);
  76. }
  77. });
  78. }
  79. for (const k in obj) {
  80. if (typeof obj[k] === 'object') {
  81. traverse(obj[k], encountered, shouldThrow, allowDeepUnsaved);
  82. }
  83. }
  84. }