1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = unsavedChildren;
- var _ParseFile = _interopRequireDefault(require("./ParseFile"));
- var _ParseObject = _interopRequireDefault(require("./ParseObject"));
- var _ParseRelation = _interopRequireDefault(require("./ParseRelation"));
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {
- default: obj
- };
- }
- /**
- * @flow
- */
- /*:: type EncounterMap = {
- objects: { [identifier: string]: ParseObject | boolean },
- files: Array<ParseFile>,
- };*/
- /**
- * 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<ParseFile | ParseObject>*/{
- const encountered = {
- objects: {},
- files: []
- };
- const identifier = obj.className + ':' + obj._getId();
- encountered.objects[identifier] = obj.dirty() ? obj : true;
- const attributes = obj.attributes;
- for (const attr in attributes) {
- if (typeof attributes[attr] === 'object') {
- traverse(attributes[attr], encountered, false, !!allowDeepUnsaved);
- }
- }
- const unsaved = [];
- for (const id in encountered.objects) {
- if (id !== identifier && encountered.objects[id] !== true) {
- unsaved.push(encountered.objects[id]);
- }
- }
- return unsaved.concat(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.');
- }
- const identifier = obj.className + ':' + obj._getId();
- if (!encountered.objects[identifier]) {
- encountered.objects[identifier] = obj.dirty() ? obj : true;
- const attributes = obj.attributes;
- for (const attr in attributes) {
- if (typeof attributes[attr] === 'object') {
- traverse(attributes[attr], encountered, !allowDeepUnsaved, allowDeepUnsaved);
- }
- }
- }
- return;
- }
- if (obj instanceof _ParseFile.default) {
- if (!obj.url() && encountered.files.indexOf(obj) < 0) {
- encountered.files.push(obj);
- }
- return;
- }
- if (obj instanceof _ParseRelation.default) {
- return;
- }
- if (Array.isArray(obj)) {
- obj.forEach(el => {
- if (typeof el === 'object') {
- traverse(el, encountered, shouldThrow, allowDeepUnsaved);
- }
- });
- }
- for (const k in obj) {
- if (typeof obj[k] === 'object') {
- traverse(obj[k], encountered, shouldThrow, allowDeepUnsaved);
- }
- }
- }
|