@civet/core 0.6.9 → 1.0.0-rc3

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.
@@ -20,13 +20,26 @@ var AbortSignal = /*#__PURE__*/function () {
20
20
  _classCallCheck(this, AbortSignal);
21
21
 
22
22
  this.notifier = new _Notifier["default"]();
23
- this.locked = false;
24
- this.aborted = false;
23
+ Object.defineProperties(this, {
24
+ locked: {
25
+ value: false,
26
+ enumerable: true,
27
+ writable: false,
28
+ configurable: true
29
+ },
30
+ aborted: {
31
+ value: false,
32
+ enumerable: true,
33
+ writable: false,
34
+ configurable: true
35
+ }
36
+ });
25
37
  }
26
38
 
27
39
  _createClass(AbortSignal, [{
28
40
  key: "listen",
29
41
  value: function listen(cb) {
42
+ if (this.locked) return function () {};
30
43
  var alreadySubscribed = this.notifier.isSubscribed(cb);
31
44
  var unsubscribe = this.notifier.subscribe(cb);
32
45
  if (this.aborted && !alreadySubscribed) cb();
@@ -36,14 +49,44 @@ var AbortSignal = /*#__PURE__*/function () {
36
49
  key: "abort",
37
50
  value: function abort() {
38
51
  if (this.locked) return;
39
- this.locked = true;
40
- this.aborted = true;
52
+ this.lock();
53
+ Object.defineProperty(this, 'aborted', {
54
+ value: true,
55
+ enumerable: true,
56
+ writable: false,
57
+ configurable: false
58
+ });
41
59
  this.notifier.trigger();
42
60
  }
43
61
  }, {
44
62
  key: "lock",
45
63
  value: function lock() {
46
- this.locked = true;
64
+ if (this.locked) return;
65
+ Object.defineProperty(this, 'locked', {
66
+ value: true,
67
+ enumerable: true,
68
+ writable: false,
69
+ configurable: false
70
+ });
71
+ }
72
+ }, {
73
+ key: "proxy",
74
+ value: function proxy() {
75
+ var s = this;
76
+ return {
77
+ get notifier() {
78
+ return s.notifier;
79
+ },
80
+
81
+ get locked() {
82
+ return s.locked;
83
+ },
84
+
85
+ get aborted() {
86
+ return s.locked;
87
+ }
88
+
89
+ };
47
90
  }
48
91
  }]);
49
92
 
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
@@ -9,15 +7,11 @@ exports["default"] = void 0;
9
7
 
10
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
9
 
12
- var _react = _interopRequireWildcard(require("react"));
10
+ var _react = _interopRequireDefault(require("react"));
13
11
 
14
12
  var _context = require("./context");
15
13
 
16
- var _DataStore = require("./DataStore");
17
-
18
- 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); }
19
-
20
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(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; }
14
+ var _DataProvider = require("./DataProvider");
21
15
 
22
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
23
17
 
@@ -25,20 +19,22 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d
25
19
  * Provides general configuration to its descendants using React's context API.
26
20
  */
27
21
  function ConfigProvider(_ref) {
28
- var dataStore = _ref.dataStore,
22
+ var dataProvider = _ref.dataProvider,
29
23
  children = _ref.children;
30
- var context = (0, _react.useMemo)(function () {
24
+
25
+ var context = _react["default"].useMemo(function () {
31
26
  return {
32
- dataStore: dataStore
27
+ dataProvider: dataProvider
33
28
  };
34
- }, [dataStore]);
29
+ }, [dataProvider]);
30
+
35
31
  return /*#__PURE__*/_react["default"].createElement(_context.ConfigContext.Provider, {
36
32
  value: context
37
33
  }, children);
38
34
  }
39
35
 
40
36
  ConfigProvider.propTypes = {
41
- dataStore: _DataStore.dataStorePropType,
37
+ dataProvider: _DataProvider.dataProviderPropType,
42
38
  children: _propTypes["default"].node
43
39
  };
44
40
  var _default = ConfigProvider;
@@ -3,10 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.dataStorePropType = exports.isDataStore = exports["default"] = void 0;
6
+ exports.dataProviderPropType = exports.isDataProvider = exports["default"] = void 0;
7
7
 
8
8
  var _fastDeepEqual = _interopRequireDefault(require("fast-deep-equal"));
9
9
 
10
+ var _objectHash = _interopRequireDefault(require("object-hash"));
11
+
10
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
13
 
12
14
  var _AbortSignal = _interopRequireDefault(require("./AbortSignal"));
@@ -29,25 +31,41 @@ var getMeta = function getMeta(meta) {
29
31
  return meta instanceof _Meta["default"] ? meta : new _Meta["default"](meta);
30
32
  };
31
33
 
32
- var DataStore = /*#__PURE__*/function () {
33
- function DataStore() {
34
- var _this = this;
35
-
36
- _classCallCheck(this, DataStore);
34
+ var DataProvider = /*#__PURE__*/function () {
35
+ function DataProvider() {
36
+ _classCallCheck(this, DataProvider);
37
37
 
38
38
  _defineProperty(this, "notifier", new _ChannelNotifier["default"]());
39
39
 
40
- this.resourcePlugins = [];
40
+ var contextPlugins = [];
41
+ var uiPlugins = [];
41
42
  this.extend({
42
- resource: function resource(plugin) {
43
- if (!_this.resourcePlugins.includes(plugin)) {
44
- _this.resourcePlugins.push(plugin);
45
- }
43
+ context: function context(plugin) {
44
+ var plugins = contextPlugins;
45
+ if (plugin != null && !plugins.includes(plugin)) plugins.push(plugin);
46
+ },
47
+ ui: function ui(plugin) {
48
+ var plugins = uiPlugins;
49
+ if (plugin != null && !plugins.includes(plugin)) plugins.push(plugin);
50
+ }
51
+ });
52
+ Object.defineProperties(this, {
53
+ contextPlugins: {
54
+ value: Object.freeze(contextPlugins.slice()),
55
+ enumerable: true,
56
+ writable: false,
57
+ configurable: false
58
+ },
59
+ uiPlugins: {
60
+ value: Object.freeze(uiPlugins.slice()),
61
+ enumerable: true,
62
+ writable: false,
63
+ configurable: false
46
64
  }
47
65
  });
48
66
  }
49
67
 
50
- _createClass(DataStore, [{
68
+ _createClass(DataProvider, [{
51
69
  key: "extend",
52
70
  value: function extend() {}
53
71
  }, {
@@ -63,11 +81,11 @@ var DataStore = /*#__PURE__*/function () {
63
81
  }
64
82
  }, {
65
83
  key: "get",
66
- value: function get(resource, ids, query, options, meta) {
67
- var _this2 = this;
84
+ value: function get(resource, query, options, meta) {
85
+ var _this = this;
68
86
 
69
87
  return new Promise(function (resolve, reject) {
70
- return _this2.continuousGet(resource, ids, query, options, meta, function (error, done, result) {
88
+ return _this.continuousGet(resource, query, options, meta, function (error, done, result) {
71
89
  if (error != null) {
72
90
  reject(error);
73
91
  return;
@@ -79,84 +97,93 @@ var DataStore = /*#__PURE__*/function () {
79
97
  }
80
98
  }, {
81
99
  key: "continuousGet",
82
- value: function continuousGet(resource, ids, query, options, meta, callback, abortSignal) {
83
- var _this3 = this;
100
+ value: function continuousGet(resource, query, options, meta, callback, abortSignal) {
101
+ var _this2 = this;
84
102
 
103
+ var signal = abortSignal == null ? new _AbortSignal["default"]() : abortSignal;
85
104
  new Promise(function (resolve) {
86
- if (resource == null) throw new Error('No resource name specified');
87
- if (ids != null && !Array.isArray(ids)) throw new Error('IDs must be an array');
88
- var complete = false;
89
- var signal = abortSignal == null ? new _AbortSignal["default"]() : abortSignal; // result transformation
105
+ if (resource == null) throw new Error('No resource name specified'); // result transformation
90
106
 
91
107
  var cb = function cb(error, done, result) {
92
108
  // prevent updates after completion
93
- if (complete) return;
109
+ if (signal.locked) return;
94
110
 
95
111
  if (error != null || done) {
96
- complete = true;
97
112
  signal.lock();
98
113
  }
99
114
 
100
115
  if (error != null) callback(error, true, []);else if (result == null) callback(undefined, done, []);else if (Array.isArray(result)) callback(undefined, done, result);else callback(undefined, done, [result]);
101
116
  };
102
117
 
103
- resolve(Promise.resolve(_this3.handleGet(resource, ids, query, options, getMeta(meta))).then(function (result) {
118
+ resolve(Promise.resolve(_this2.handleGet(resource, query, options, getMeta(meta))).then(function (result) {
104
119
  if (typeof result === 'function') {
105
- result(cb, signal);
120
+ result(cb, signal.proxy());
106
121
  } else {
107
122
  cb(undefined, true, result);
108
123
  }
109
124
  }));
110
125
  })["catch"](function (e) {
111
- callback(e, true, []);
126
+ if (!signal.locked) callback(e, true, []);
112
127
  });
113
128
  }
114
129
  }, {
115
130
  key: "create",
116
131
  value: function create(resource, data, options, meta) {
117
- var _this4 = this;
132
+ var _this3 = this;
118
133
 
119
134
  return new Promise(function (resolve) {
120
135
  if (resource == null) throw new Error('No resource name specified');
121
136
  if (data == null) throw new Error('No data specified');
122
- resolve(Promise.resolve(_this4.handleCreate(resource, data, options, getMeta(meta))));
137
+ resolve(Promise.resolve(_this3.handleCreate(resource, data, options, getMeta(meta))));
123
138
  });
124
139
  }
125
140
  }, {
126
141
  key: "update",
127
- value: function update(resource, ids, query, data, options, meta) {
128
- var _this5 = this;
142
+ value: function update(resource, query, data, options, meta) {
143
+ var _this4 = this;
129
144
 
130
145
  return new Promise(function (resolve) {
131
146
  if (resource == null) throw new Error('No resource name specified');
132
- if (ids != null && !Array.isArray(ids)) throw new Error('IDs must be an array');
133
147
  if (data == null) throw new Error('No data specified');
134
- resolve(Promise.resolve(_this5.handleUpdate(resource, ids, query, data, options, getMeta(meta))));
148
+ resolve(Promise.resolve(_this4.handleUpdate(resource, query, data, options, getMeta(meta))));
135
149
  });
136
150
  }
137
151
  }, {
138
152
  key: "patch",
139
- value: function patch(resource, ids, query, data, options, meta) {
140
- var _this6 = this;
153
+ value: function patch(resource, query, data, options, meta) {
154
+ var _this5 = this;
141
155
 
142
156
  return new Promise(function (resolve) {
143
157
  if (resource == null) throw new Error('No resource name specified');
144
- if (ids != null && !Array.isArray(ids)) throw new Error('IDs must be an array');
145
158
  if (data == null) throw new Error('No data specified');
146
- resolve(Promise.resolve(_this6.handlePatch(resource, ids, query, data, options, getMeta(meta))));
159
+ resolve(Promise.resolve(_this5.handlePatch(resource, query, data, options, getMeta(meta))));
147
160
  });
148
161
  }
149
162
  }, {
150
163
  key: "remove",
151
- value: function remove(resource, ids, query, options, meta) {
152
- var _this7 = this;
164
+ value: function remove(resource, query, options, meta) {
165
+ var _this6 = this;
153
166
 
154
167
  return new Promise(function (resolve) {
155
168
  if (resource == null) throw new Error('No resource name specified');
156
- if (ids != null && !Array.isArray(ids)) throw new Error('IDs must be an array');
157
- resolve(Promise.resolve(_this7.handleRemove(resource, ids, query, options, getMeta(meta))));
169
+ resolve(Promise.resolve(_this6.handleRemove(resource, query, options, getMeta(meta))));
158
170
  });
159
171
  }
172
+ }, {
173
+ key: "compareRequests",
174
+ value: function compareRequests(prev, next) {
175
+ return (0, _fastDeepEqual["default"])(prev, next);
176
+ }
177
+ }, {
178
+ key: "compareItemVersions",
179
+ value: function compareItemVersions() {
180
+ return true;
181
+ }
182
+ }, {
183
+ key: "getItemIdentifier",
184
+ value: function getItemIdentifier(item) {
185
+ return (0, _objectHash["default"])(item);
186
+ }
160
187
  }, {
161
188
  key: "transition",
162
189
  value: function transition(nextData) {
@@ -164,27 +191,57 @@ var DataStore = /*#__PURE__*/function () {
164
191
  }
165
192
  }, {
166
193
  key: "recycleItems",
167
- value: function recycleItems(nextData) {
168
- return nextData;
169
- }
170
- }, {
171
- key: "compareRequests",
172
- value: function compareRequests(prev, next) {
173
- return (0, _fastDeepEqual["default"])(prev, next);
194
+ value: function recycleItems(nextData, prevData) {
195
+ var _this7 = this;
196
+
197
+ var prevMapping = {};
198
+
199
+ if (nextData.length > 0) {
200
+ prevData.forEach(function (item) {
201
+ var id = _this7.getItemIdentifier(item);
202
+
203
+ if (id != null) prevMapping[id] = item;
204
+ });
205
+ }
206
+
207
+ var result;
208
+
209
+ if (prevData.length > 0) {
210
+ result = nextData.map(function (nextItem) {
211
+ var id = _this7.getItemIdentifier(nextItem);
212
+
213
+ if (id != null && Object.prototype.hasOwnProperty.call(prevMapping, id)) {
214
+ var prevItem = prevMapping[id];
215
+ if (_this7.compareItemVersions(nextItem, prevItem)) return prevItem;
216
+ }
217
+
218
+ return nextItem;
219
+ });
220
+ } else {
221
+ result = nextData;
222
+ }
223
+
224
+ if (prevData.length === result.length && result.reduce(function (sum, item, i) {
225
+ return sum && Object.is(prevData[i], item);
226
+ }, true)) {
227
+ return prevData;
228
+ }
229
+
230
+ return result;
174
231
  }
175
232
  }]);
176
233
 
177
- return DataStore;
234
+ return DataProvider;
178
235
  }();
179
236
 
180
- var isDataStore = function isDataStore(dataStore) {
181
- return dataStore instanceof DataStore;
237
+ var isDataProvider = function isDataProvider(dataProvider) {
238
+ return dataProvider instanceof DataProvider;
182
239
  };
183
240
 
184
- exports.isDataStore = isDataStore;
241
+ exports.isDataProvider = isDataProvider;
185
242
 
186
- var dataStorePropType = _propTypes["default"].instanceOf(DataStore);
243
+ var dataProviderPropType = _propTypes["default"].instanceOf(DataProvider);
187
244
 
188
- exports.dataStorePropType = dataStorePropType;
189
- var _default = DataStore;
245
+ exports.dataProviderPropType = dataProviderPropType;
246
+ var _default = DataProvider;
190
247
  exports["default"] = _default;
package/lib/Meta.js CHANGED
@@ -72,9 +72,12 @@ var Meta = /*#__PURE__*/function () {
72
72
  }
73
73
  }, {
74
74
  key: "commit",
75
- value: function commit(prev) {
75
+ value: function commit(prev, ignore) {
76
76
  var next = _objectSpread({}, this.data);
77
77
 
78
+ (ignore || []).forEach(function (item) {
79
+ delete next[item];
80
+ });
78
81
  var keys = Object.keys(next);
79
82
 
80
83
  if (prev != null && Object.keys(prev).length === keys.length && keys.reduce(function (sum, key) {