dataflux 1.2.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,8 @@ var _fingerprint = _interopRequireDefault(require("./fingerprint"));
9
9
 
10
10
  var _uuid = require("uuid");
11
11
 
12
+ var _moment = _interopRequireDefault(require("moment/moment"));
13
+
12
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
13
15
 
14
16
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -33,8 +35,12 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
33
35
 
34
36
  function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
35
37
 
38
+ var dateRegex = new RegExp("^[0-9][0-9][0-9][0-9]-[0-9].*T[0-9].*Z$");
39
+
36
40
  var _loaded = /*#__PURE__*/new WeakMap();
37
41
 
42
+ var _setHidden = /*#__PURE__*/new WeakMap();
43
+
38
44
  var Obj = /*#__PURE__*/_createClass(function Obj(values, _model) {
39
45
  var _this = this;
40
46
 
@@ -45,6 +51,11 @@ var Obj = /*#__PURE__*/_createClass(function Obj(values, _model) {
45
51
  value: false
46
52
  });
47
53
 
54
+ _classPrivateFieldInitSpec(this, _setHidden, {
55
+ writable: true,
56
+ value: {}
57
+ });
58
+
48
59
  _defineProperty(this, "load", function () {
49
60
  if (_classPrivateFieldGet(_this, _loaded)) {
50
61
  return Promise.resolve(_this);
@@ -54,7 +65,7 @@ var Obj = /*#__PURE__*/_createClass(function Obj(values, _model) {
54
65
  return model.load(_this).then(function () {
55
66
  _classPrivateFieldSet(_this, _loaded, true);
56
67
 
57
- return model.getStore().update([_this]); // Propagate update
68
+ return model.getStore().update([_this], true); // Propagate update
58
69
  }).then(function () {
59
70
  return _this;
60
71
  }); // return always this
@@ -66,21 +77,25 @@ var Obj = /*#__PURE__*/_createClass(function Obj(values, _model) {
66
77
  });
67
78
 
68
79
  _defineProperty(this, "get", function (attribute) {
69
- return _this[attribute];
80
+ return _classPrivateFieldGet(_this, _setHidden)[attribute] || _this[attribute];
70
81
  });
71
82
 
72
83
  _defineProperty(this, "getRelation", function (type, filterFunction) {
73
84
  return _this.getModel().getRelation(_this, type, filterFunction);
74
85
  });
75
86
 
76
- _defineProperty(this, "set", function (attribute, value) {
77
- if (attribute === "id") {
78
- throw new Error("You cannot change the ID");
79
- }
87
+ _defineProperty(this, "set", function (attribute, value, hidden) {
88
+ if (hidden) {
89
+ _classPrivateFieldGet(_this, _setHidden)[attribute] = value;
90
+ } else {
91
+ if (attribute === "id") {
92
+ throw new Error("You cannot change the ID");
93
+ }
80
94
 
81
- _this[attribute] = value;
95
+ _this[attribute] = value;
96
+ }
82
97
 
83
- _this.getModel().getStore().update([_this]);
98
+ return _this.getModel().getStore().update([_this]);
84
99
  });
85
100
 
86
101
  _defineProperty(this, "save", function () {
@@ -98,7 +113,11 @@ var Obj = /*#__PURE__*/_createClass(function Obj(values, _model) {
98
113
  for (var _i = 0, _attrs = attrs; _i < _attrs.length; _i++) {
99
114
  var a = _attrs[_i];
100
115
 
101
- if (typeof _this[a] !== "function") {
116
+ if (_this[a] instanceof _moment["default"]) {
117
+ out[a] = _this[a].toISOString();
118
+ } else if (_this[a] instanceof Date) {
119
+ out[a] = (0, _moment["default"])(_this[a]).toISOString();
120
+ } else if (typeof _this[a] !== "function") {
102
121
  out[a] = _this[a];
103
122
  }
104
123
  }
@@ -114,9 +133,17 @@ var Obj = /*#__PURE__*/_createClass(function Obj(values, _model) {
114
133
  return _model;
115
134
  };
116
135
 
117
- Object.keys(values).forEach(function (key) {
118
- _this[key] = values[key];
119
- });
136
+ var frEach = _model.options.parseMoment ? function (key) {
137
+ if (dateRegex.test(values[key])) {
138
+ var mmnt = (0, _moment["default"])(values[key]);
139
+ _this[key] = mmnt.isValid() ? mmnt : values[key];
140
+ } else {
141
+ _this[key] = values[key];
142
+ }
143
+ } : function (key) {
144
+ return _this[key] = values[key];
145
+ };
146
+ Object.keys(values).forEach(frEach);
120
147
  var id;
121
148
 
122
149
  if (this.id && (typeof this.id === "string" || typeof this.id === "number")) {
@@ -17,8 +17,16 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d
17
17
 
18
18
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
19
19
 
20
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
21
+
22
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
23
+
20
24
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
21
25
 
26
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
27
+
28
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
29
+
22
30
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
23
31
 
24
32
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@@ -83,6 +91,22 @@ var ObserverStore = /*#__PURE__*/function (_PersistentStore) {
83
91
 
84
92
  _classPrivateMethodInitSpec(_assertThisInitialized(_this), _propagateInsertChange);
85
93
 
94
+ _defineProperty(_assertThisInitialized(_this), "multipleSubscribe", function (subscriptions, callback) {
95
+ return Promise.all(subscriptions.map(function (sub, index) {
96
+ var attrs = Array.from(Array(index + 1)).map(function () {
97
+ return null;
98
+ });
99
+ return _this.subscribe(sub[0], sub[1], function (data) {
100
+ attrs[index] = data;
101
+ return callback.apply(void 0, _toConsumableArray(attrs));
102
+ });
103
+ })).then(function (subKeys) {
104
+ var subKey = (0, _uuid.v4)();
105
+ _this._multipleSubscribed[subKey] = subKeys;
106
+ return subKey;
107
+ });
108
+ });
109
+
86
110
  _defineProperty(_assertThisInitialized(_this), "subscribe", function (type, callback, filterFunction) {
87
111
  var subKey = (0, _uuid.v4)();
88
112
 
@@ -104,14 +128,33 @@ var ObserverStore = /*#__PURE__*/function (_PersistentStore) {
104
128
  });
105
129
 
106
130
  _defineProperty(_assertThisInitialized(_this), "unsubscribe", function (key) {
107
- for (var type in _this._subscribed) {
108
- for (var id in _this._subscribed[type]) {
109
- _this._subscribed[type][id] = _this._subscribed[type][id].filter(function (i) {
110
- return i.subKey !== key;
111
- });
131
+ if (_this._multipleSubscribed[key]) {
132
+ var _iterator = _createForOfIteratorHelper(_this._multipleSubscribed[key]),
133
+ _step;
134
+
135
+ try {
136
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
137
+ var sub = _step.value;
112
138
 
113
- if (_this._subscribed[type][id].length === 0) {
114
- delete _this._subscribed[type][id];
139
+ _this.unsubscribe(sub);
140
+ }
141
+ } catch (err) {
142
+ _iterator.e(err);
143
+ } finally {
144
+ _iterator.f();
145
+ }
146
+
147
+ delete _this._multipleSubscribed[key];
148
+ } else {
149
+ for (var type in _this._subscribed) {
150
+ for (var id in _this._subscribed[type]) {
151
+ _this._subscribed[type][id] = _this._subscribed[type][id].filter(function (i) {
152
+ return i.subKey !== key;
153
+ });
154
+
155
+ if (_this._subscribed[type][id].length === 0) {
156
+ delete _this._subscribed[type][id];
157
+ }
115
158
  }
116
159
  }
117
160
  }
@@ -122,34 +165,34 @@ var ObserverStore = /*#__PURE__*/function (_PersistentStore) {
122
165
  value: function value(objects, type) {
123
166
  var out = {};
124
167
 
125
- var _iterator = _createForOfIteratorHelper(objects),
126
- _step;
168
+ var _iterator2 = _createForOfIteratorHelper(objects),
169
+ _step2;
127
170
 
128
171
  try {
129
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
130
- var object = _step.value;
172
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
173
+ var object = _step2.value;
131
174
  var objectId = object.getId();
132
175
  var typeChannel = _this._subscribed[type] || {};
133
176
  var subscribedToObject = typeChannel[objectId] || [];
134
177
 
135
- var _iterator2 = _createForOfIteratorHelper(subscribedToObject),
136
- _step2;
178
+ var _iterator3 = _createForOfIteratorHelper(subscribedToObject),
179
+ _step3;
137
180
 
138
181
  try {
139
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
140
- var sub = _step2.value;
182
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
183
+ var sub = _step3.value;
141
184
  out[sub.subKey] = out[sub.subKey] || sub;
142
185
  }
143
186
  } catch (err) {
144
- _iterator2.e(err);
187
+ _iterator3.e(err);
145
188
  } finally {
146
- _iterator2.f();
189
+ _iterator3.f();
147
190
  }
148
191
  }
149
192
  } catch (err) {
150
- _iterator.e(err);
193
+ _iterator2.e(err);
151
194
  } finally {
152
- _iterator.f();
195
+ _iterator2.f();
153
196
  }
154
197
 
155
198
  return Object.values(out);
@@ -180,12 +223,12 @@ var ObserverStore = /*#__PURE__*/function (_PersistentStore) {
180
223
  _classPrivateFieldInitSpec(_assertThisInitialized(_this), _subscribeToObjects, {
181
224
  writable: true,
182
225
  value: function value(type, objectsToSubscribe, item) {
183
- var _iterator3 = _createForOfIteratorHelper(objectsToSubscribe),
184
- _step3;
226
+ var _iterator4 = _createForOfIteratorHelper(objectsToSubscribe),
227
+ _step4;
185
228
 
186
229
  try {
187
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
188
- var object = _step3.value;
230
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
231
+ var object = _step4.value;
189
232
  var id = object.getId();
190
233
 
191
234
  if (!_this._subscribed[type][id]) {
@@ -195,21 +238,22 @@ var ObserverStore = /*#__PURE__*/function (_PersistentStore) {
195
238
  _this._subscribed[type][id].push(item);
196
239
  }
197
240
  } catch (err) {
198
- _iterator3.e(err);
241
+ _iterator4.e(err);
199
242
  } finally {
200
- _iterator3.f();
243
+ _iterator4.f();
201
244
  }
202
245
  }
203
246
  });
204
247
 
205
248
  _this._subscribed = {};
249
+ _this._multipleSubscribed = {};
206
250
  return _this;
207
251
  }
208
252
 
209
253
  _createClass(ObserverStore, [{
210
254
  key: "update",
211
- value: function update(objects) {
212
- return _get(_getPrototypeOf(ObserverStore.prototype), "update", this).call(this, objects).then(_classPrivateFieldGet(this, _propagateChange));
255
+ value: function update(objects, skipSave) {
256
+ return _get(_getPrototypeOf(ObserverStore.prototype), "update", this).call(this, objects, skipSave).then(_classPrivateFieldGet(this, _propagateChange));
213
257
  }
214
258
  }, {
215
259
  key: "insert",
@@ -243,21 +287,21 @@ function _propagateInsertChange2(type, newObjects) {
243
287
  for (var _i = 0, _objects = objects; _i < _objects.length; _i++) {
244
288
  var object = _objects[_i];
245
289
 
246
- var _iterator4 = _createForOfIteratorHelper(object),
247
- _step4;
290
+ var _iterator5 = _createForOfIteratorHelper(object),
291
+ _step5;
248
292
 
249
293
  try {
250
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
251
- var sub = _step4.value;
294
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
295
+ var sub = _step5.value;
252
296
 
253
297
  if (!uniqueSubs[sub.subKey]) {
254
298
  uniqueSubs[sub.subKey] = sub;
255
299
  }
256
300
  }
257
301
  } catch (err) {
258
- _iterator4.e(err);
302
+ _iterator5.e(err);
259
303
  } finally {
260
- _iterator4.f();
304
+ _iterator5.f();
261
305
  }
262
306
  }
263
307
 
@@ -272,12 +316,12 @@ function _propagateInsertChange2(type, newObjects) {
272
316
  return _this3.find(type, filterFunction).then(function (data) {
273
317
  var subKey;
274
318
 
275
- var _iterator5 = _createForOfIteratorHelper(data),
276
- _step5;
319
+ var _iterator6 = _createForOfIteratorHelper(data),
320
+ _step6;
277
321
 
278
322
  try {
279
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
280
- var d = _step5.value;
323
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
324
+ var d = _step6.value;
281
325
 
282
326
  var item = _this3._subscribed[d.getModel().getType()][d.getId()];
283
327
 
@@ -285,9 +329,9 @@ function _propagateInsertChange2(type, newObjects) {
285
329
  if (subKey) break;
286
330
  }
287
331
  } catch (err) {
288
- _iterator5.e(err);
332
+ _iterator6.e(err);
289
333
  } finally {
290
- _iterator5.f();
334
+ _iterator6.f();
291
335
  }
292
336
 
293
337
  _classPrivateFieldGet(_this3, _subscribeToObjects).call(_this3, type, objectsToSubscribe, {
@@ -49,11 +49,35 @@ var PersistentStore = /*#__PURE__*/function (_Store) {
49
49
 
50
50
  _this = _super.call(this, options);
51
51
 
52
+ _defineProperty(_assertThisInitialized(_this), "whenSaved", function (type) {
53
+ return _this.getDiff(type).then(function (_ref) {
54
+ var inserted = _ref.inserted,
55
+ updated = _ref.updated,
56
+ deleted = _ref.deleted;
57
+
58
+ if (inserted.length === 0 && updated.length === 0 && deleted.length === 0) {
59
+ return true;
60
+ } else if (_this.options.autoSave) {
61
+ return _this._saveDiff(type, {
62
+ inserted: inserted,
63
+ updated: updated,
64
+ deleted: deleted
65
+ });
66
+ } else {
67
+ return Promise.reject("Save must be invoked manually");
68
+ }
69
+ });
70
+ });
71
+
52
72
  _defineProperty(_assertThisInitialized(_this), "save", function () {
53
73
  _this._busy = true;
54
74
 
55
75
  _this.pubSub.publish("save", "start");
56
76
 
77
+ if (_this._delayedSaveTimer) {
78
+ clearTimeout(_this._delayedSaveTimer);
79
+ }
80
+
57
81
  return Promise.all(Object.keys(_this.models).map(_this._saveByType)).then(function (data) {
58
82
  _this._busy = false;
59
83
 
@@ -71,33 +95,43 @@ var PersistentStore = /*#__PURE__*/function (_Store) {
71
95
  });
72
96
  });
73
97
 
98
+ _defineProperty(_assertThisInitialized(_this), "_saveDiff", function (type, _ref2) {
99
+ var inserted = _ref2.inserted,
100
+ updated = _ref2.updated,
101
+ deleted = _ref2.deleted;
102
+ var model = _this.models[type].model; // Operations order:
103
+ // 1) insert
104
+ // 2) update
105
+ // 3) delete
106
+
107
+ return model.insertObjects(inserted.map(function (i) {
108
+ return i.object;
109
+ })).then(function () {
110
+ return _this.applyDiff({
111
+ inserted: inserted
112
+ }, type);
113
+ }).then(function () {
114
+ return model.updateObjects(updated.map(function (i) {
115
+ return i.object;
116
+ }));
117
+ }).then(function () {
118
+ return _this.applyDiff({
119
+ updated: updated
120
+ }, type);
121
+ }).then(function () {
122
+ return model.deleteObjects(deleted.map(function (i) {
123
+ return i.object;
124
+ }));
125
+ }).then(function () {
126
+ return _this.applyDiff({
127
+ deleted: deleted
128
+ }, type);
129
+ });
130
+ });
131
+
74
132
  _defineProperty(_assertThisInitialized(_this), "_saveByType", function (type) {
75
- return _this.getDiff(type).then(function (_ref) {
76
- var inserted = _ref.inserted,
77
- updated = _ref.updated,
78
- deleted = _ref.deleted;
79
- var model = _this.models[type].model; // Operations order:
80
- // 1) insert
81
- // 2) update
82
- // 3) delete
83
-
84
- return model.insertObjects(inserted).then(function () {
85
- return _this.applyDiff({
86
- inserted: inserted
87
- }, type);
88
- }).then(function () {
89
- return model.updateObjects(updated);
90
- }).then(function () {
91
- return _this.applyDiff({
92
- updated: updated
93
- }, type);
94
- }).then(function () {
95
- return model.deleteObjects(deleted);
96
- }).then(function () {
97
- return _this.applyDiff({
98
- deleted: deleted
99
- }, type);
100
- });
133
+ return _this.getDiff(type).then(function (diff) {
134
+ return _this._saveDiff(type, diff);
101
135
  });
102
136
  });
103
137
 
@@ -131,8 +165,7 @@ var PersistentStore = /*#__PURE__*/function (_Store) {
131
165
  var _this2 = this;
132
166
 
133
167
  this._busy = true;
134
-
135
- _get(_getPrototypeOf(PersistentStore.prototype), "addModel", this).call(this, model).then(function () {
168
+ return _get(_getPrototypeOf(PersistentStore.prototype), "addModel", this).call(this, model).then(function () {
136
169
  _this2._busy = false;
137
170
  });
138
171
  }
@@ -160,11 +193,13 @@ var PersistentStore = /*#__PURE__*/function (_Store) {
160
193
  }
161
194
  }, {
162
195
  key: "update",
163
- value: function update(objects) {
196
+ value: function update(objects, skipSave) {
164
197
  var _this5 = this;
165
198
 
166
199
  return _get(_getPrototypeOf(PersistentStore.prototype), "update", this).call(this, objects).then(function (data) {
167
- _this5.delayedSave();
200
+ if (!skipSave) {
201
+ _this5.delayedSave();
202
+ }
168
203
 
169
204
  return data;
170
205
  });