UNPKG

backendless

Version:

Backendless JavaScript SDK for Node.js and the browser

792 lines (789 loc) 33.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof3 = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _utils = _interopRequireDefault(require("../utils")); var _expression = _interopRequireDefault(require("../expression")); var _rtHandlers = _interopRequireDefault(require("./rt-handlers")); var _dataQueryBuilder = _interopRequireDefault(require("./data-query-builder")); var _loadRelationsQueryBuilder = _interopRequireDefault(require("./load-relations-query-builder")); var _jsonUpdateBuilder = _interopRequireDefault(require("./json-update-builder")); var _geoConstructor = _interopRequireWildcard(require("./geo/geo-constructor")); var _geometry = _interopRequireDefault(require("./geo/geometry")); var _excluded = ["relationName", "relationModel"]; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function buildFindFirstLastQuery(queryBuilder, sortDir) { var query = queryBuilder instanceof _dataQueryBuilder["default"] ? queryBuilder.toJSON() : queryBuilder ? _objectSpread({}, queryBuilder) : {}; query.pageSize = 1; query.offset = 0; var sortBy = query.sortBy; if (!sortBy) { query.sortBy = ["created ".concat(sortDir)]; } return _dataQueryBuilder["default"].toRequestBody(query); } var DataStore = /*#__PURE__*/function () { function DataStore(model, dataService) { (0, _classCallCheck2["default"])(this, DataStore); this.app = dataService.app; this.classToTableMap = dataService.classToTableMap; if (typeof model === 'string') { this.className = model; this.model = this.classToTableMap[this.className]; } else { this.className = _utils["default"].getClassName(model); this.model = this.classToTableMap[this.className] || model; } if (!this.className) { throw new Error('Class name should be specified'); } } (0, _createClass2["default"])(DataStore, [{ key: "rt", value: function rt() { return this.rtHandlers = this.rtHandlers || new _rtHandlers["default"](this); } }, { key: "save", value: function () { var _save = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(object, isUpsert) { var _this = this; var url; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: url = isUpsert ? this.app.urls.dataTableUpsert(this.className) : this.app.urls.dataTable(this.className); return _context.abrupt("return", this.app.request.put({ url: url, data: convertToServerRecord(object) }).then(function (result) { return _this.parseResponse(result); })); case 2: case "end": return _context.stop(); } }, _callee, this); })); function save(_x, _x2) { return _save.apply(this, arguments); } return save; }() }, { key: "deepSave", value: function () { var _deepSave = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(object) { var _this2 = this; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: return _context2.abrupt("return", this.app.request.put({ url: this.app.urls.dataTableDeepSave(this.className), data: convertToServerRecord(object) }).then(function (result) { return _this2.parseResponse(result); })); case 1: case "end": return _context2.stop(); } }, _callee2, this); })); function deepSave(_x3) { return _deepSave.apply(this, arguments); } return deepSave; }() }, { key: "remove", value: function () { var _remove = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(object) { var objectId; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: objectId = object && object.objectId || object; if (!(!objectId || typeof objectId !== 'string' && typeof objectId !== 'number')) { _context3.next = 3; break; } throw new Error('Object Id must be provided and must be a string or number.'); case 3: return _context3.abrupt("return", this.app.request["delete"]({ url: this.app.urls.dataTableObject(this.className, objectId) })); case 4: case "end": return _context3.stop(); } }, _callee3, this); })); function remove(_x4) { return _remove.apply(this, arguments); } return remove; }() }, { key: "find", value: function () { var _find = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(query) { var _this3 = this; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: return _context4.abrupt("return", this.app.request.post({ url: this.app.urls.dataTableFind(this.className), data: _dataQueryBuilder["default"].toRequestBody(query) }).then(function (result) { return _this3.parseResponse(result); })); case 1: case "end": return _context4.stop(); } }, _callee4, this); })); function find(_x5) { return _find.apply(this, arguments); } return find; }() }, { key: "group", value: function () { var _group = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(query) { return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: return _context5.abrupt("return", this.app.request.post({ url: this.app.urls.dataGrouping(this.className), data: _dataQueryBuilder["default"].toRequestBody(query) })); case 1: case "end": return _context5.stop(); } }, _callee5, this); })); function group(_x6) { return _group.apply(this, arguments); } return group; }() }, { key: "countInGroup", value: function () { var _countInGroup = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(query) { return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: if (!(!query.groupPath || (0, _typeof2["default"])(query.groupPath) !== 'object')) { _context6.next = 2; break; } throw new Error('Group Path must be provided and must be an object.'); case 2: return _context6.abrupt("return", this.app.request.post({ url: "".concat(this.app.urls.dataGrouping(this.className), "/count"), data: _dataQueryBuilder["default"].toRequestBody(query) })); case 3: case "end": return _context6.stop(); } }, _callee6, this); })); function countInGroup(_x7) { return _countInGroup.apply(this, arguments); } return countInGroup; }() }, { key: "findById", value: function () { var _findById = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(objectId, query) { var result; return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: if (!(objectId && (0, _typeof2["default"])(objectId) === 'object' && !Array.isArray(objectId))) { _context7.next = 8; break; } if (Object.keys(objectId).length) { _context7.next = 3; break; } throw new Error('Provided object must have at least 1 primary keys.'); case 3: _context7.next = 5; return this.app.request.get({ url: this.app.urls.dataTablePrimaryKey(this.className), query: objectId }); case 5: result = _context7.sent; _context7.next = 14; break; case 8: if (!(!objectId || typeof objectId !== 'string' && typeof objectId !== 'number')) { _context7.next = 10; break; } throw new Error('Object Id must be provided and must be a string or number or an object of primary keys.'); case 10: if (query) { query.pageSize = null; query.offset = null; } _context7.next = 13; return this.app.request.get({ url: this.app.urls.dataTableObject(this.className, objectId), queryString: _dataQueryBuilder["default"].toQueryString(query) }); case 13: result = _context7.sent; case 14: return _context7.abrupt("return", this.parseResponse(result)); case 15: case "end": return _context7.stop(); } }, _callee7, this); })); function findById(_x8, _x9) { return _findById.apply(this, arguments); } return findById; }() }, { key: "findFirst", value: function () { var _findFirst = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(query) { var _this4 = this; return _regenerator["default"].wrap(function _callee8$(_context8) { while (1) switch (_context8.prev = _context8.next) { case 0: return _context8.abrupt("return", this.app.request.post({ url: this.app.urls.dataTableFind(this.className), data: buildFindFirstLastQuery(query, 'asc') }).then(function (result) { return _this4.parseResponse(result[0]); })); case 1: case "end": return _context8.stop(); } }, _callee8, this); })); function findFirst(_x10) { return _findFirst.apply(this, arguments); } return findFirst; }() }, { key: "findLast", value: function () { var _findLast = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(query) { var _this5 = this; return _regenerator["default"].wrap(function _callee9$(_context9) { while (1) switch (_context9.prev = _context9.next) { case 0: return _context9.abrupt("return", this.app.request.post({ url: this.app.urls.dataTableFind(this.className), data: buildFindFirstLastQuery(query, 'desc') }).then(function (result) { return _this5.parseResponse(result[0]); })); case 1: case "end": return _context9.stop(); } }, _callee9, this); })); function findLast(_x11) { return _findLast.apply(this, arguments); } return findLast; }() }, { key: "getObjectCount", value: function () { var _getObjectCount = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(condition) { var distinct, groupBy; return _regenerator["default"].wrap(function _callee10$(_context10) { while (1) switch (_context10.prev = _context10.next) { case 0: distinct = undefined; groupBy = undefined; if (!condition) { _context10.next = 11; break; } if (!(condition instanceof _dataQueryBuilder["default"])) { _context10.next = 9; break; } distinct = condition.getDistinct() || undefined; groupBy = condition.getGroupBy() || undefined; condition = condition.getWhereClause() || undefined; _context10.next = 11; break; case 9: if (!(typeof condition !== 'string')) { _context10.next = 11; break; } throw new Error('Condition must be a string or an instance of DataQueryBuilder.'); case 11: return _context10.abrupt("return", this.app.request.post({ url: this.app.urls.dataTableCount(this.className), data: { where: condition, distinct: distinct, groupBy: groupBy } })); case 12: case "end": return _context10.stop(); } }, _callee10, this); })); function getObjectCount(_x12) { return _getObjectCount.apply(this, arguments); } return getObjectCount; }() }, { key: "loadRelations", value: function () { var _loadRelations = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(parent, queryBuilder) { var _this6 = this; var parentObjectId, _ref, relationName, relationModel, query; return _regenerator["default"].wrap(function _callee11$(_context11) { while (1) switch (_context11.prev = _context11.next) { case 0: parentObjectId = parent && parent.objectId || parent; if (!(!parentObjectId || typeof parentObjectId !== 'string' && typeof parentObjectId !== 'number')) { _context11.next = 3; break; } throw new Error('Parent Object Id must be provided and must be a string or number.'); case 3: _ref = queryBuilder instanceof _loadRelationsQueryBuilder["default"] ? queryBuilder.toJSON() : queryBuilder, relationName = _ref.relationName, relationModel = _ref.relationModel, query = (0, _objectWithoutProperties2["default"])(_ref, _excluded); if (!(!relationName || typeof relationName !== 'string')) { _context11.next = 6; break; } throw new Error('Relation Name must be provided and must be a string.'); case 6: return _context11.abrupt("return", this.app.request.get({ url: this.app.urls.dataTableObjectRelation(this.className, parentObjectId, relationName), queryString: _loadRelationsQueryBuilder["default"].toQueryString(query) }).then(function (result) { return _this6.parseRelationsResponse(result, relationModel); })); case 7: case "end": return _context11.stop(); } }, _callee11, this); })); function loadRelations(_x13, _x14) { return _loadRelations.apply(this, arguments); } return loadRelations; }() }, { key: "setRelation", value: function () { var _setRelation = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(parent, columnName, children) { return _regenerator["default"].wrap(function _callee12$(_context12) { while (1) switch (_context12.prev = _context12.next) { case 0: return _context12.abrupt("return", this.changeRelation(this.app.request.Methods.POST, parent, columnName, children)); case 1: case "end": return _context12.stop(); } }, _callee12, this); })); function setRelation(_x15, _x16, _x17) { return _setRelation.apply(this, arguments); } return setRelation; }() }, { key: "addRelation", value: function () { var _addRelation = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(parent, columnName, children) { return _regenerator["default"].wrap(function _callee13$(_context13) { while (1) switch (_context13.prev = _context13.next) { case 0: return _context13.abrupt("return", this.changeRelation(this.app.request.Methods.PUT, parent, columnName, children)); case 1: case "end": return _context13.stop(); } }, _callee13, this); })); function addRelation(_x18, _x19, _x20) { return _addRelation.apply(this, arguments); } return addRelation; }() }, { key: "deleteRelation", value: function () { var _deleteRelation = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(parent, columnName, children) { return _regenerator["default"].wrap(function _callee14$(_context14) { while (1) switch (_context14.prev = _context14.next) { case 0: return _context14.abrupt("return", this.changeRelation(this.app.request.Methods.DELETE, parent, columnName, children)); case 1: case "end": return _context14.stop(); } }, _callee14, this); })); function deleteRelation(_x21, _x22, _x23) { return _deleteRelation.apply(this, arguments); } return deleteRelation; }() }, { key: "bulkCreate", value: function () { var _bulkCreate = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(objects) { var errorMessage; return _regenerator["default"].wrap(function _callee15$(_context15) { while (1) switch (_context15.prev = _context15.next) { case 0: errorMessage = 'Objects must be provided and must be an array of objects.'; if (!(!objects || !Array.isArray(objects))) { _context15.next = 3; break; } throw new Error(errorMessage); case 3: objects = objects.map(function (object) { if (!object || (0, _typeof2["default"])(object) !== 'object' || Array.isArray(object)) { throw new Error(errorMessage); } return object; }); return _context15.abrupt("return", this.app.request.post({ url: this.app.urls.dataBulkTable(this.className), data: objects })); case 5: case "end": return _context15.stop(); } }, _callee15, this); })); function bulkCreate(_x24) { return _bulkCreate.apply(this, arguments); } return bulkCreate; }() }, { key: "bulkUpsert", value: function () { var _bulkUpsert = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(objects) { var errorMessage; return _regenerator["default"].wrap(function _callee16$(_context16) { while (1) switch (_context16.prev = _context16.next) { case 0: errorMessage = 'Objects must be provided and must be an array of objects.'; if (!(!objects || !Array.isArray(objects) || !objects.length)) { _context16.next = 3; break; } throw new Error(errorMessage); case 3: objects = objects.map(function (object) { if (!object || (0, _typeof2["default"])(object) !== 'object' || Array.isArray(object)) { throw new Error(errorMessage); } return object; }); return _context16.abrupt("return", this.app.request.put({ url: this.app.urls.dataBulkTableUpsert(this.className), data: objects })); case 5: case "end": return _context16.stop(); } }, _callee16, this); })); function bulkUpsert(_x25) { return _bulkUpsert.apply(this, arguments); } return bulkUpsert; }() }, { key: "bulkUpdate", value: function () { var _bulkUpdate = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(condition, changes) { return _regenerator["default"].wrap(function _callee17$(_context17) { while (1) switch (_context17.prev = _context17.next) { case 0: if (!(!condition || typeof condition !== 'string')) { _context17.next = 2; break; } throw new Error('Condition must be provided and must be a string.'); case 2: if (!(!changes || (0, _typeof2["default"])(changes) !== 'object' || Array.isArray(changes))) { _context17.next = 4; break; } throw new Error('Changes must be provided and must be an object.'); case 4: return _context17.abrupt("return", this.app.request.put({ url: this.app.urls.dataBulkTable(this.className), query: { where: condition }, data: changes })); case 5: case "end": return _context17.stop(); } }, _callee17, this); })); function bulkUpdate(_x26, _x27) { return _bulkUpdate.apply(this, arguments); } return bulkUpdate; }() }, { key: "bulkDelete", value: function () { var _bulkDelete = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(condition) { var queryData, objectIds; return _regenerator["default"].wrap(function _callee18$(_context18) { while (1) switch (_context18.prev = _context18.next) { case 0: if (!(!condition || typeof condition !== 'string' && !Array.isArray(condition))) { _context18.next = 2; break; } throw new Error('Condition must be provided and must be a string or a list of objects.'); case 2: queryData = {}; if (typeof condition === 'string') { queryData.where = condition; } else { objectIds = condition.map(function (object) { var objectId = object && object.objectId || object; if (!objectId || typeof objectId !== 'string' && typeof objectId !== 'number') { throw new Error('Can not transform "objects" to "whereClause". ' + 'Item must be a string or number or an object with property "objectId" as string.'); } return "'".concat(objectId, "'"); }); queryData.where = "objectId in (".concat(objectIds.join(','), ")"); } return _context18.abrupt("return", this.app.request.post({ url: this.app.urls.dataBulkTableDelete(this.className), data: queryData })); case 5: case "end": return _context18.stop(); } }, _callee18, this); })); function bulkDelete(_x28) { return _bulkDelete.apply(this, arguments); } return bulkDelete; }() /** * @private * */ }, { key: "parseRelationsResponse", value: function parseRelationsResponse(result, RelationModel) { return convertToClientRecords(result, RelationModel, this); } /** * @private * */ }, { key: "parseResponse", value: function parseResponse(result) { return convertToClientRecords(result, this.model, this); } /** * @private * */ }, { key: "changeRelation", value: function changeRelation(method, parent, columnName, children) { var parentId = parent && parent.objectId || parent; if (!parentId || typeof parentId !== 'string' && typeof parentId !== 'number') { throw new Error('Relation Parent must be provided and must be a string or number or an object with objectId property.'); } if (!columnName || typeof columnName !== 'string') { throw new Error('Relation Column Name must be provided and must be a string.'); } if (!children || typeof children !== 'string' && !Array.isArray(children)) { throw new Error('Relation Children must be provided and must be a string or a list of objects.'); } var condition = {}; if (typeof children === 'string') { condition.whereClause = children; } else { condition.childrenIds = children.map(function (child) { var childId = child && child.objectId || child; if (!childId || typeof childId !== 'string' && typeof childId !== 'number') { throw new Error('Child Id must be provided and must be a string or number.'); } return childId; }); } var query = {}; if (condition.whereClause) { query.whereClause = condition.whereClause; } return this.app.request.send({ method: method, url: this.app.urls.dataTableObjectRelation(this.className, parentId, columnName), query: query, data: condition.childrenIds }); } }]); return DataStore; }(); exports["default"] = DataStore; var convertToServerRecord = function () { return function (sourceRecord) { var context = { instancesMap: new WeakMap() }; return processTargetProps(context, sourceRecord, {}); }; function processTargetProps(context, source, target) { for (var prop in source) { if (Array.isArray(source[prop])) { processTargetProps(context, source[prop], target[prop] = []); } else if (source[prop] && (0, _typeof2["default"])(source[prop]) === 'object' && !(source[prop] instanceof _geometry["default"]) && !(source[prop] instanceof _jsonUpdateBuilder["default"]) && !(source[prop] instanceof _expression["default"])) { if (source[prop] instanceof Date) { target[prop] = source[prop].getTime(); } else if (context.instancesMap.has(source[prop])) { var iteratedTarget = context.instancesMap.get(source[prop]); if (!iteratedTarget.__subID) { iteratedTarget.__subID = _utils["default"].uuid(); } target[prop] = { __originSubID: iteratedTarget.__subID }; } else { var _iteratedTarget = target[prop] = {}; context.instancesMap.set(source[prop], _iteratedTarget); processTargetProps(context, source[prop], _iteratedTarget); } } else { target[prop] = source[prop]; } } return target; } }(); var convertToClientRecords = function () { return function (records, RootModel, dataStore) { if (!records) { return records; } var context = { RootModel: RootModel, app: dataStore.app, classToTableMap: dataStore.classToTableMap, subIds: {}, postAssign: [] }; var result = Array.isArray(records) ? records.map(function (record) { return sanitizeItem(context, record); }) : sanitizeItem(context, records); assignPostRelations(context); return result; }; function createTargetRecord(context, source, target, prop) { var __subID = source[prop].__subID; if (__subID && context.subIds[__subID]) { target[prop] = context.subIds[__subID]; delete source[prop].__subID; } else { var Model = context.classToTableMap[source[prop].___class]; target[prop] = Model ? new Model() : {}; if (__subID && !context.subIds[__subID]) { context.subIds[__subID] = target[prop]; delete source[prop].__subID; } processTargetProps(context, source[prop], target[prop]); } } function processTargetProp(context, source, target, prop) { if (Array.isArray(source[prop])) { processTargetProps(context, source[prop], target[prop] = []); } else if (source[prop] && (0, _typeof2["default"])(source[prop]) === 'object') { if (_geoConstructor.GEO_CLASSES.includes(source[prop].___class)) { target[prop] = (0, _geoConstructor["default"])(source[prop]); } else if (source[prop].__originSubID) { context.postAssign.push([target, prop, source[prop].__originSubID]); } else { createTargetRecord(context, source, target, prop); } } else { target[prop] = source[prop]; } } function processTargetProps(context, source, target) { for (var prop in source) { processTargetProp(context, source, target, prop); } } function sanitizeItem(context, sourceRecord) { var Model = context.RootModel || context.classToTableMap[sourceRecord.___class]; var targetRecord = Model ? new Model() : {}; if (sourceRecord.__subID) { if (context.subIds[sourceRecord.__subID]) { return context.subIds[sourceRecord.__subID]; } context.subIds[sourceRecord.__subID] = targetRecord; delete sourceRecord.__subID; } processTargetProps(context, sourceRecord, targetRecord); return targetRecord; } function assignPostRelations(context) { context.postAssign.forEach(function (_ref2) { var _ref3 = (0, _slicedToArray2["default"])(_ref2, 3), target = _ref3[0], prop = _ref3[1], __originSubID = _ref3[2]; target[prop] = context.subIds[__originSubID]; }); } }();