backendless
Version:
Backendless JavaScript SDK for Node.js and the browser
792 lines (789 loc) • 33.4 kB
JavaScript
"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];
});
}
}();