"use strict"; var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); _Object$defineProperty(exports, "__esModule", { value: true }); exports.default = unsavedChildren; var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat")); var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of")); var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array")); var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each")); var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof")); var _ParseFile = _interopRequireDefault(require("./ParseFile")); var _ParseObject = _interopRequireDefault(require("./ParseObject")); var _ParseRelation = _interopRequireDefault(require("./ParseRelation")); /** * @flow */ /*:: type EncounterMap = { objects: { [identifier: string]: ParseObject | boolean }, files: Array, };*/ /** * Return an array of unsaved children, which are either Parse Objects or Files. * If it encounters any dirty Objects without Ids, it will throw an exception. * * @param {Parse.Object} obj * @param {boolean} allowDeepUnsaved * @returns {Array} */ function unsavedChildren(obj /*: ParseObject*/, allowDeepUnsaved /*:: ?: boolean*/) /*: Array*/{ var encountered = { objects: {}, files: [] }; var identifier = obj.className + ':' + obj._getId(); encountered.objects[identifier] = obj.dirty() ? obj : true; var attributes = obj.attributes; for (var attr in attributes) { if ((0, _typeof2.default)(attributes[attr]) === 'object') { traverse(attributes[attr], encountered, false, !!allowDeepUnsaved); } } var unsaved = []; for (var id in encountered.objects) { if (id !== identifier && encountered.objects[id] !== true) { unsaved.push(encountered.objects[id]); } } return (0, _concat.default)(unsaved).call(unsaved, encountered.files); } function traverse(obj /*: ParseObject*/, encountered /*: EncounterMap*/, shouldThrow /*: boolean*/, allowDeepUnsaved /*: boolean*/) { if (obj instanceof _ParseObject.default) { if (!obj.id && shouldThrow) { throw new Error('Cannot create a pointer to an unsaved Object.'); } var _identifier = obj.className + ':' + obj._getId(); if (!encountered.objects[_identifier]) { encountered.objects[_identifier] = obj.dirty() ? obj : true; var attributes = obj.attributes; for (var attr in attributes) { if ((0, _typeof2.default)(attributes[attr]) === 'object') { traverse(attributes[attr], encountered, !allowDeepUnsaved, allowDeepUnsaved); } } } return; } if (obj instanceof _ParseFile.default) { var _context; if (!obj.url() && (0, _indexOf.default)(_context = encountered.files).call(_context, obj) < 0) { encountered.files.push(obj); } return; } if (obj instanceof _ParseRelation.default) { return; } if ((0, _isArray.default)(obj)) { (0, _forEach.default)(obj).call(obj, function (el) { if ((0, _typeof2.default)(el) === 'object') { traverse(el, encountered, shouldThrow, allowDeepUnsaved); } }); } for (var k in obj) { if ((0, _typeof2.default)(obj[k]) === 'object') { traverse(obj[k], encountered, shouldThrow, allowDeepUnsaved); } } }