ar_sync 1.0.5 → 1.1.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.
data/core/ArSyncStore.js CHANGED
@@ -32,51 +32,55 @@ var __spreadArrays = (this && this.__spreadArrays) || function () {
32
32
  };
33
33
  Object.defineProperty(exports, "__esModule", { value: true });
34
34
  var ArSyncApi_1 = require("./ArSyncApi");
35
- var ModelBatchRequest = {
36
- timer: null,
37
- apiRequests: {},
38
- fetch: function (api, query, id) {
35
+ var ModelBatchRequest = /** @class */ (function () {
36
+ function ModelBatchRequest() {
37
+ this.timer = null;
38
+ this.apiRequests = new Map();
39
+ }
40
+ ModelBatchRequest.prototype.fetch = function (api, query, id) {
39
41
  var _this = this;
40
42
  this.setTimer();
41
- return new Promise(function (resolve) {
43
+ return new Promise(function (resolve, reject) {
42
44
  var queryJSON = JSON.stringify(query);
43
- var apiRequest = _this.apiRequests[api] = _this.apiRequests[api] || {};
44
- var queryRequests = apiRequest[queryJSON] = apiRequest[queryJSON] || { query: query, requests: {} };
45
- var request = queryRequests.requests[id] = queryRequests.requests[id] || { id: id, callbacks: [] };
46
- request.callbacks.push(resolve);
45
+ var apiRequest = _this.apiRequests.get(api);
46
+ if (!apiRequest)
47
+ _this.apiRequests.set(api, apiRequest = new Map());
48
+ var queryRequests = apiRequest.get(queryJSON);
49
+ if (!queryRequests)
50
+ apiRequest.set(queryJSON, queryRequests = { query: query, requests: new Map() });
51
+ var request = queryRequests.requests.get(id);
52
+ if (!request)
53
+ queryRequests.requests.set(id, request = { id: id, callbacks: [] });
54
+ request.callbacks.push({ resolve: resolve, reject: reject });
47
55
  });
48
- },
49
- batchFetch: function () {
50
- var apiRequests = this.apiRequests;
51
- for (var api in apiRequests) {
52
- var apiRequest = apiRequests[api];
53
- var _loop_1 = function (query, requests) {
54
- var ids = Object.values(requests).map(function (_a) {
55
- var id = _a.id;
56
- return id;
57
- });
56
+ };
57
+ ModelBatchRequest.prototype.batchFetch = function () {
58
+ this.apiRequests.forEach(function (apiRequest, api) {
59
+ apiRequest.forEach(function (_a) {
60
+ var query = _a.query, requests = _a.requests;
61
+ var ids = Array.from(requests.keys());
58
62
  ArSyncApi_1.default.syncFetch({ api: api, query: query, params: { ids: ids } }).then(function (models) {
59
63
  for (var _i = 0, models_1 = models; _i < models_1.length; _i++) {
60
64
  var model = models_1[_i];
61
- requests[model.id].model = model;
62
- }
63
- for (var _a = 0, _b = Object.values(requests); _a < _b.length; _a++) {
64
- var _c = _b[_a], model = _c.model, callbacks = _c.callbacks;
65
- for (var _d = 0, callbacks_1 = callbacks; _d < callbacks_1.length; _d++) {
66
- var callback = callbacks_1[_d];
67
- callback(model);
68
- }
65
+ var req = requests.get(model.id);
66
+ if (req)
67
+ req.model = model;
69
68
  }
69
+ requests.forEach(function (_a) {
70
+ var model = _a.model, callbacks = _a.callbacks;
71
+ callbacks.forEach(function (cb) { return cb.resolve(model); });
72
+ });
73
+ }).catch(function (e) {
74
+ requests.forEach(function (_a) {
75
+ var callbacks = _a.callbacks;
76
+ callbacks.forEach(function (cb) { return cb.reject(e); });
77
+ });
70
78
  });
71
- };
72
- for (var _i = 0, _a = Object.values(apiRequest); _i < _a.length; _i++) {
73
- var _b = _a[_i], query = _b.query, requests = _b.requests;
74
- _loop_1(query, requests);
75
- }
76
- }
77
- this.apiRequests = {};
78
- },
79
- setTimer: function () {
79
+ });
80
+ });
81
+ this.apiRequests.clear();
82
+ };
83
+ ModelBatchRequest.prototype.setTimer = function () {
80
84
  var _this = this;
81
85
  if (this.timer)
82
86
  return;
@@ -84,8 +88,10 @@ var ModelBatchRequest = {
84
88
  _this.timer = null;
85
89
  _this.batchFetch();
86
90
  }, 20);
87
- }
88
- };
91
+ };
92
+ return ModelBatchRequest;
93
+ }());
94
+ var modelBatchRequest = new ModelBatchRequest;
89
95
  var ArSyncContainerBase = /** @class */ (function () {
90
96
  function ArSyncContainerBase() {
91
97
  this.listeners = [];
@@ -94,9 +100,14 @@ var ArSyncContainerBase = /** @class */ (function () {
94
100
  ArSyncContainerBase.prototype.initForReload = function (request) {
95
101
  var _this = this;
96
102
  this.networkSubscriber = ArSyncStore.connectionManager.subscribeNetwork(function (state) {
97
- if (state) {
98
- ArSyncApi_1.default.syncFetch(request).then(function (data) {
99
- if (_this.data) {
103
+ if (!state) {
104
+ if (_this.onConnectionChange)
105
+ _this.onConnectionChange(false);
106
+ return;
107
+ }
108
+ if (request.id != null) {
109
+ modelBatchRequest.fetch(request.api, request.query, request.id).then(function (data) {
110
+ if (_this.data && data) {
100
111
  _this.replaceData(data);
101
112
  if (_this.onConnectionChange)
102
113
  _this.onConnectionChange(true);
@@ -106,8 +117,17 @@ var ArSyncContainerBase = /** @class */ (function () {
106
117
  });
107
118
  }
108
119
  else {
109
- if (_this.onConnectionChange)
110
- _this.onConnectionChange(false);
120
+ ArSyncApi_1.default.syncFetch(request).then(function (data) {
121
+ if (_this.data && data) {
122
+ _this.replaceData(data);
123
+ if (_this.onConnectionChange)
124
+ _this.onConnectionChange(true);
125
+ if (_this.onChange)
126
+ _this.onChange([], _this.data);
127
+ }
128
+ }).catch(function (e) {
129
+ console.error("failed to reload. " + e);
130
+ });
111
131
  }
112
132
  });
113
133
  };
@@ -154,7 +174,7 @@ var ArSyncContainerBase = /** @class */ (function () {
154
174
  return [true, false];
155
175
  if (keys.length === 1)
156
176
  return [keys[0], false];
157
- return [keys];
177
+ return [keys, false];
158
178
  }
159
179
  var needsEscape = attrs['attributes'] || attrs['params'] || attrs['as'];
160
180
  if (keys.length === 0)
@@ -180,13 +200,8 @@ var ArSyncContainerBase = /** @class */ (function () {
180
200
  result.attributes = attributes;
181
201
  return result;
182
202
  }
183
- try {
184
- var result = compactQuery(query);
185
- return result === true ? {} : result;
186
- }
187
- catch (e) {
188
- throw JSON.stringify(query) + e.stack;
189
- }
203
+ var result = compactQuery(query);
204
+ return result === true ? {} : result;
190
205
  };
191
206
  ArSyncContainerBase.parseQuery = function (query, attrsonly) {
192
207
  var attributes = {};
@@ -233,13 +248,21 @@ var ArSyncContainerBase = /** @class */ (function () {
233
248
  var api = _a.api, id = _a.id, params = _a.params, query = _a.query;
234
249
  var parsedQuery = ArSyncRecord.parseQuery(query);
235
250
  var compactQuery = ArSyncRecord.compactQuery(parsedQuery);
236
- if (id) {
237
- return ModelBatchRequest.fetch(api, compactQuery, id).then(function (data) { return new ArSyncRecord(parsedQuery, data, null, root); });
251
+ if (id != null) {
252
+ return modelBatchRequest.fetch(api, compactQuery, id).then(function (data) {
253
+ if (!data)
254
+ throw { retry: false };
255
+ var request = { api: api, id: id, query: compactQuery };
256
+ return new ArSyncRecord(parsedQuery, data, request, root);
257
+ });
238
258
  }
239
259
  else {
240
260
  var request_1 = { api: api, query: compactQuery, params: params };
241
261
  return ArSyncApi_1.default.syncFetch(request_1).then(function (response) {
242
- if (response.collection && response.order) {
262
+ if (!response) {
263
+ throw { retry: false };
264
+ }
265
+ else if (response.collection && response.order) {
243
266
  return new ArSyncCollection(response.sync_keys, 'collection', parsedQuery, response, request_1, root);
244
267
  }
245
268
  else if (response instanceof Array) {
@@ -278,16 +301,14 @@ var ArSyncRecord = /** @class */ (function (_super) {
278
301
  if (request)
279
302
  _this.initForReload(request);
280
303
  _this.query = query;
304
+ _this.queryAttributes = query.attributes || {};
281
305
  _this.data = {};
282
306
  _this.children = {};
283
307
  _this.replaceData(data);
284
308
  return _this;
285
309
  }
286
310
  ArSyncRecord.prototype.setSyncKeys = function (sync_keys) {
287
- this.sync_keys = sync_keys;
288
- if (!this.sync_keys) {
289
- this.sync_keys = [];
290
- }
311
+ this.sync_keys = sync_keys !== null && sync_keys !== void 0 ? sync_keys : [];
291
312
  };
292
313
  ArSyncRecord.prototype.replaceData = function (data) {
293
314
  this.setSyncKeys(data.sync_keys);
@@ -297,8 +318,8 @@ var ArSyncRecord = /** @class */ (function (_super) {
297
318
  this.data.id = data.id;
298
319
  }
299
320
  this.paths = [];
300
- for (var key in this.query.attributes) {
301
- var subQuery = this.query.attributes[key];
321
+ for (var key in this.queryAttributes) {
322
+ var subQuery = this.queryAttributes[key];
302
323
  var aliasName = subQuery.as || key;
303
324
  var subData = data[aliasName];
304
325
  var child = this.children[aliasName];
@@ -345,9 +366,9 @@ var ArSyncRecord = /** @class */ (function (_super) {
345
366
  }
346
367
  }
347
368
  }
348
- if (this.query.attributes['*']) {
369
+ if (this.queryAttributes['*']) {
349
370
  for (var key in data) {
350
- if (!this.query.attributes[key] && this.data[key] !== data[key]) {
371
+ if (!this.queryAttributes[key] && this.data[key] !== data[key]) {
351
372
  this.mark();
352
373
  this.data[key] = data[key];
353
374
  }
@@ -357,8 +378,8 @@ var ArSyncRecord = /** @class */ (function (_super) {
357
378
  };
358
379
  ArSyncRecord.prototype.onNotify = function (notifyData, path) {
359
380
  var _this = this;
360
- var action = notifyData.action, class_name = notifyData.class_name, id = notifyData.id;
361
- var query = path && this.query.attributes[path];
381
+ var action = notifyData.action, className = notifyData.class_name, id = notifyData.id;
382
+ var query = path && this.queryAttributes[path];
362
383
  var aliasName = (query && query.as) || path;
363
384
  if (action === 'remove') {
364
385
  var child = this.children[aliasName];
@@ -372,7 +393,7 @@ var ArSyncRecord = /** @class */ (function (_super) {
372
393
  else if (action === 'add') {
373
394
  if (this.data[aliasName] && this.data[aliasName].id === id)
374
395
  return;
375
- ModelBatchRequest.fetch(class_name, ArSyncRecord.compactQuery(query), id).then(function (data) {
396
+ modelBatchRequest.fetch(className, ArSyncRecord.compactQuery(query), id).then(function (data) {
376
397
  if (!data || !_this.data)
377
398
  return;
378
399
  var model = new ArSyncRecord(query, data, null, _this.root);
@@ -385,16 +406,21 @@ var ArSyncRecord = /** @class */ (function (_super) {
385
406
  model.parentModel = _this;
386
407
  model.parentKey = aliasName;
387
408
  _this.onChange([aliasName], model.data);
409
+ }).catch(function (e) {
410
+ console.error("failed to load " + className + ":" + id + " " + e);
388
411
  });
389
412
  }
390
413
  else {
391
414
  var field = notifyData.field;
392
415
  var query_2 = field ? this.patchQuery(field) : this.reloadQuery();
393
- if (query_2)
394
- ModelBatchRequest.fetch(class_name, query_2, id).then(function (data) {
395
- if (_this.data)
396
- _this.update(data);
397
- });
416
+ if (!query_2)
417
+ return;
418
+ modelBatchRequest.fetch(className, query_2, id).then(function (data) {
419
+ if (_this.data)
420
+ _this.update(data);
421
+ }).catch(function (e) {
422
+ console.error("failed to load patch " + className + ":" + id + " " + e);
423
+ });
398
424
  }
399
425
  };
400
426
  ArSyncRecord.prototype.subscribeAll = function () {
@@ -404,7 +430,7 @@ var ArSyncRecord = /** @class */ (function (_super) {
404
430
  var key = _a[_i];
405
431
  this.subscribe(key, callback);
406
432
  }
407
- var _loop_2 = function (path) {
433
+ var _loop_1 = function (path) {
408
434
  var pathCallback = function (data) { return _this.onNotify(data, path); };
409
435
  for (var _i = 0, _a = this_1.sync_keys; _i < _a.length; _i++) {
410
436
  var key = _a[_i];
@@ -414,11 +440,11 @@ var ArSyncRecord = /** @class */ (function (_super) {
414
440
  var this_1 = this;
415
441
  for (var _b = 0, _c = this.paths; _b < _c.length; _b++) {
416
442
  var path = _c[_b];
417
- _loop_2(path);
443
+ _loop_1(path);
418
444
  }
419
445
  };
420
446
  ArSyncRecord.prototype.patchQuery = function (key) {
421
- var val = this.query.attributes[key];
447
+ var val = this.queryAttributes[key];
422
448
  if (!val)
423
449
  return;
424
450
  var attributes = val.attributes, as = val.as, params = val.params;
@@ -440,10 +466,10 @@ var ArSyncRecord = /** @class */ (function (_super) {
440
466
  if (this.reloadQueryCache)
441
467
  return this.reloadQueryCache;
442
468
  var reloadQuery = this.reloadQueryCache = { attributes: [] };
443
- for (var key in this.query.attributes) {
469
+ for (var key in this.queryAttributes) {
444
470
  if (key === 'sync_keys')
445
471
  continue;
446
- var val = this.query.attributes[key];
472
+ var val = this.queryAttributes[key];
447
473
  if (!val || !val.attributes) {
448
474
  reloadQuery.attributes.push(key);
449
475
  }
@@ -455,7 +481,7 @@ var ArSyncRecord = /** @class */ (function (_super) {
455
481
  };
456
482
  ArSyncRecord.prototype.update = function (data) {
457
483
  for (var key in data) {
458
- var subQuery = this.query.attributes[key];
484
+ var subQuery = this.queryAttributes[key];
459
485
  if (subQuery && subQuery.attributes && Object.keys(subQuery.attributes).length > 0)
460
486
  continue;
461
487
  if (this.data[key] === data[key])
@@ -483,42 +509,39 @@ var ArSyncCollection = /** @class */ (function (_super) {
483
509
  __extends(ArSyncCollection, _super);
484
510
  function ArSyncCollection(sync_keys, path, query, data, request, root) {
485
511
  var _this = _super.call(this) || this;
486
- _this.order = { limit: null, mode: 'asc', key: 'id' };
512
+ _this.ordering = { orderBy: 'id', direction: 'asc' };
487
513
  _this.aliasOrderKey = 'id';
488
514
  _this.root = root;
489
515
  _this.path = path;
490
516
  _this.query = query;
517
+ _this.queryAttributes = query.attributes || {};
491
518
  _this.compactQuery = ArSyncRecord.compactQuery(query);
492
519
  if (request)
493
520
  _this.initForReload(request);
494
- if (query.params && (query.params.order || query.params.limit)) {
495
- _this.setOrdering(query.params.limit, query.params.order);
521
+ if (query.params) {
522
+ _this.setOrdering(query.params);
496
523
  }
497
524
  _this.data = [];
498
525
  _this.children = [];
499
526
  _this.replaceData(data, sync_keys);
500
527
  return _this;
501
528
  }
502
- ArSyncCollection.prototype.setOrdering = function (limit, order) {
503
- var mode = 'asc';
504
- var key = 'id';
505
- if (order === 'asc' || order === 'desc') {
506
- mode = order;
507
- }
508
- else if (typeof order === 'object' && order) {
509
- var keys = Object.keys(order);
510
- if (keys.length > 1)
511
- throw 'multiple order keys are not supported';
512
- if (keys.length === 1)
513
- key = keys[0];
514
- mode = order[key] === 'asc' ? 'asc' : 'desc';
515
- }
516
- var limitNumber = (typeof limit === 'number') ? limit : null;
517
- if (limitNumber !== null && key !== 'id')
518
- throw 'limit with custom order key is not supported';
519
- var subQuery = this.query.attributes[key];
520
- this.aliasOrderKey = (subQuery && subQuery.as) || key;
521
- this.order = { limit: limitNumber, mode: mode, key: key };
529
+ ArSyncCollection.prototype.setOrdering = function (ordering) {
530
+ var direction = 'asc';
531
+ var orderBy = 'id';
532
+ var first = undefined;
533
+ var last = undefined;
534
+ if (ordering.direction === 'desc')
535
+ direction = ordering.direction;
536
+ if (typeof ordering.orderBy === 'string')
537
+ orderBy = ordering.orderBy;
538
+ if (typeof ordering.first === 'number')
539
+ first = ordering.first;
540
+ if (typeof ordering.last === 'number')
541
+ last = ordering.last;
542
+ var subQuery = this.queryAttributes[orderBy];
543
+ this.aliasOrderKey = (subQuery && subQuery.as) || orderBy;
544
+ this.ordering = { first: first, last: last, direction: direction, orderBy: orderBy };
522
545
  };
523
546
  ArSyncCollection.prototype.setSyncKeys = function (sync_keys) {
524
547
  var _this = this;
@@ -531,31 +554,31 @@ var ArSyncCollection = /** @class */ (function (_super) {
531
554
  };
532
555
  ArSyncCollection.prototype.replaceData = function (data, sync_keys) {
533
556
  this.setSyncKeys(sync_keys);
534
- var existings = {};
557
+ var existings = new Map();
535
558
  for (var _i = 0, _a = this.children; _i < _a.length; _i++) {
536
559
  var child = _a[_i];
537
- existings[child.data.id] = child;
560
+ existings.set(child.data.id, child);
538
561
  }
539
562
  var collection;
540
- if ('collection' in data && 'order' in data) {
541
- collection = data.collection;
542
- this.setOrdering(data.order.limit, data.order.mode);
563
+ if (Array.isArray(data)) {
564
+ collection = data;
543
565
  }
544
566
  else {
545
- collection = data;
567
+ collection = data.collection;
568
+ this.setOrdering(data.ordering);
546
569
  }
547
570
  var newChildren = [];
548
571
  var newData = [];
549
572
  for (var _b = 0, collection_1 = collection; _b < collection_1.length; _b++) {
550
573
  var subData = collection_1[_b];
551
- var model = null;
552
- if (typeof (subData) === 'object' && subData && 'id' in subData)
553
- model = existings[subData.id];
574
+ var model = undefined;
575
+ if (typeof (subData) === 'object' && subData && 'sync_keys' in subData)
576
+ model = existings.get(subData.id);
554
577
  var data_1 = subData;
555
578
  if (model) {
556
579
  model.replaceData(subData);
557
580
  }
558
- else if (subData.id) {
581
+ else if (subData.sync_keys) {
559
582
  model = new ArSyncRecord(this.query, subData, null, this.root);
560
583
  model.parentModel = this;
561
584
  model.parentKey = subData.id;
@@ -568,7 +591,7 @@ var ArSyncCollection = /** @class */ (function (_super) {
568
591
  }
569
592
  while (this.children.length) {
570
593
  var child = this.children.pop();
571
- if (!existings[child.data.id])
594
+ if (!existings.has(child.data.id))
572
595
  child.release();
573
596
  }
574
597
  if (this.data.length || newChildren.length)
@@ -587,63 +610,94 @@ var ArSyncCollection = /** @class */ (function (_super) {
587
610
  };
588
611
  ArSyncCollection.prototype.consumeAdd = function (className, id) {
589
612
  var _this = this;
613
+ var _a = this.ordering, first = _a.first, last = _a.last, direction = _a.direction;
614
+ var limit = first || last;
590
615
  if (this.data.findIndex(function (a) { return a.id === id; }) >= 0)
591
616
  return;
592
- if (this.order.limit === this.data.length) {
593
- if (this.order.mode === 'asc') {
594
- var last = this.data[this.data.length - 1];
595
- if (last && last.id < id)
596
- return;
617
+ if (limit && limit <= this.data.length) {
618
+ var lastItem = this.data[this.data.length - 1];
619
+ var firstItem = this.data[0];
620
+ if (direction === 'asc') {
621
+ if (first) {
622
+ if (lastItem && lastItem.id < id)
623
+ return;
624
+ }
625
+ else {
626
+ if (firstItem && id < firstItem.id)
627
+ return;
628
+ }
597
629
  }
598
630
  else {
599
- var last = this.data[this.data.length - 1];
600
- if (last && last.id > id)
601
- return;
631
+ if (first) {
632
+ if (lastItem && id < lastItem.id)
633
+ return;
634
+ }
635
+ else {
636
+ if (firstItem && firstItem.id < id)
637
+ return;
638
+ }
602
639
  }
603
640
  }
604
- ModelBatchRequest.fetch(className, this.compactQuery, id).then(function (data) {
641
+ modelBatchRequest.fetch(className, this.compactQuery, id).then(function (data) {
605
642
  if (!data || !_this.data)
606
643
  return;
607
644
  var model = new ArSyncRecord(_this.query, data, null, _this.root);
608
645
  model.parentModel = _this;
609
646
  model.parentKey = id;
610
- var overflow = _this.order.limit && _this.order.limit === _this.data.length;
647
+ var overflow = limit && limit <= _this.data.length;
611
648
  var rmodel;
612
649
  _this.mark();
613
650
  var orderKey = _this.aliasOrderKey;
614
- if (_this.order.mode === 'asc') {
615
- var last = _this.data[_this.data.length - 1];
616
- _this.children.push(model);
617
- _this.data.push(model.data);
618
- if (last && last[orderKey] > data[orderKey])
619
- _this.markAndSort();
620
- if (overflow) {
621
- rmodel = _this.children.shift();
622
- rmodel.release();
623
- _this.data.shift();
651
+ var firstItem = _this.data[0];
652
+ var lastItem = _this.data[_this.data.length - 1];
653
+ if (direction === 'asc') {
654
+ if (firstItem && data[orderKey] < firstItem[orderKey]) {
655
+ _this.children.unshift(model);
656
+ _this.data.unshift(model.data);
657
+ }
658
+ else {
659
+ var skipSort = lastItem && lastItem[orderKey] < data[orderKey];
660
+ _this.children.push(model);
661
+ _this.data.push(model.data);
662
+ if (!skipSort)
663
+ _this.markAndSort();
624
664
  }
625
665
  }
626
666
  else {
627
- var first = _this.data[0];
628
- _this.children.unshift(model);
629
- _this.data.unshift(model.data);
630
- if (first && first[orderKey] > data[orderKey])
631
- _this.markAndSort();
632
- if (overflow) {
667
+ if (firstItem && data[orderKey] > firstItem[orderKey]) {
668
+ _this.children.unshift(model);
669
+ _this.data.unshift(model.data);
670
+ }
671
+ else {
672
+ var skipSort = lastItem && lastItem[orderKey] > data[orderKey];
673
+ _this.children.push(model);
674
+ _this.data.push(model.data);
675
+ if (!skipSort)
676
+ _this.markAndSort();
677
+ }
678
+ }
679
+ if (overflow) {
680
+ if (first) {
633
681
  rmodel = _this.children.pop();
634
- rmodel.release();
635
682
  _this.data.pop();
636
683
  }
684
+ else {
685
+ rmodel = _this.children.shift();
686
+ _this.data.shift();
687
+ }
688
+ rmodel.release();
637
689
  }
638
690
  _this.onChange([model.id], model.data);
639
691
  if (rmodel)
640
692
  _this.onChange([rmodel.id], null);
693
+ }).catch(function (e) {
694
+ console.error("failed to load " + className + ":" + id + " " + e);
641
695
  });
642
696
  };
643
697
  ArSyncCollection.prototype.markAndSort = function () {
644
698
  this.mark();
645
699
  var orderKey = this.aliasOrderKey;
646
- if (this.order.mode === 'asc') {
700
+ if (this.ordering.direction === 'asc') {
647
701
  this.children.sort(function (a, b) { return a.data[orderKey] < b.data[orderKey] ? -1 : +1; });
648
702
  this.data.sort(function (a, b) { return a[orderKey] < b[orderKey] ? -1 : +1; });
649
703
  }
@@ -11,7 +11,7 @@ export default class ConnectionManager {
11
11
  unsubscribe: () => void;
12
12
  };
13
13
  subscribe(key: any, func: any): {
14
- unsubscribe: () => void;
14
+ unsubscribe(): void;
15
15
  };
16
16
  connect(key: any): any;
17
17
  disconnect(key: any): void;
@@ -40,6 +40,8 @@ var ConnectionManager = /** @class */ (function () {
40
40
  };
41
41
  ConnectionManager.prototype.subscribe = function (key, func) {
42
42
  var _this = this;
43
+ if (!this.networkStatus)
44
+ return { unsubscribe: function () { } };
43
45
  var subscription = this.connect(key);
44
46
  var id = subscription.serial++;
45
47
  subscription.ref++;
data/core/DataType.d.ts CHANGED
@@ -3,9 +3,7 @@ declare type RecordType = {
3
3
  query: any;
4
4
  };
5
5
  };
6
- declare type Values<T> = T extends {
7
- [K in keyof T]: infer U;
8
- } ? U : never;
6
+ declare type Values<T> = T[keyof T];
9
7
  declare type AddNullable<Test, Type> = null extends Test ? Type | null : Type;
10
8
  declare type DataTypeExtractField<BaseType, Key extends keyof BaseType> = Exclude<BaseType[Key], null> extends RecordType ? AddNullable<BaseType[Key], {}> : BaseType[Key] extends RecordType[] ? {}[] : BaseType[Key];
11
9
  declare type DataTypeExtractFieldsFromQuery<BaseType, Fields> = '*' extends Fields ? {
@@ -33,17 +31,24 @@ declare type CheckAttributesField<P, Q> = Q extends {
33
31
  declare type IsAnyCompareLeftType = {
34
32
  __any: never;
35
33
  };
36
- declare type CollectExtraFields<Type, Path> = IsAnyCompareLeftType extends Type ? null : Type extends ExtraFieldErrorType ? Path : Type extends (infer R)[] ? _CollectExtraFields<R> : _CollectExtraFields<Type>;
37
- declare type _CollectExtraFields<Type> = Type extends object ? (keyof (Type) extends never ? null : Values<{
38
- [key in keyof Type]: CollectExtraFields<Type[key], key>;
39
- }>) : null;
34
+ declare type CollectExtraFields<Type, Key> = IsAnyCompareLeftType extends Type ? never : Type extends ExtraFieldErrorType ? Key : Type extends (infer R)[] ? {
35
+ 0: Values<{
36
+ [key in keyof R]: CollectExtraFields<R[key], key>;
37
+ }>;
38
+ 1: never;
39
+ }[R extends object ? 0 : 1] : {
40
+ 0: Values<{
41
+ [key in keyof Type]: CollectExtraFields<Type[key], key>;
42
+ }>;
43
+ 1: never;
44
+ }[Type extends object ? 0 : 1];
40
45
  declare type SelectString<T> = T extends string ? T : never;
41
46
  declare type _ValidateDataTypeExtraFileds<Extra, Type> = SelectString<Extra> extends never ? Type : {
42
47
  error: {
43
- extraFields: SelectString<Extra>;
48
+ extraFields: Extra;
44
49
  };
45
50
  };
46
- declare type ValidateDataTypeExtraFileds<Type> = _ValidateDataTypeExtraFileds<CollectExtraFields<Type, []>, Type>;
51
+ declare type ValidateDataTypeExtraFileds<Type> = _ValidateDataTypeExtraFileds<CollectExtraFields<Type, never>, Type>;
47
52
  declare type RequestBase = {
48
53
  api: string;
49
54
  query: any;
data/core/hooks.d.ts CHANGED
@@ -20,6 +20,7 @@ export declare type DataAndStatus<T> = [T | null, ModelStatus];
20
20
  export interface Request {
21
21
  api: string;
22
22
  params?: any;
23
+ id?: number;
23
24
  query: any;
24
25
  }
25
26
  export declare function useArSyncModel<T>(request: Request | null): DataAndStatus<T>;