@civet/core 0.6.8 → 1.0.0-rc2
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.
- package/lib/AbortSignal.js +48 -5
- package/lib/ConfigProvider.js +9 -13
- package/lib/{DataStore.js → DataProvider.js} +111 -54
- package/lib/Meta.js +4 -1
- package/lib/Resource.js +22 -382
- package/lib/context.js +4 -8
- package/lib/createPlugin.js +8 -8
- package/lib/index.js +7 -15
- package/lib/useResource.js +265 -0
- package/package.json +5 -5
- package/src/AbortSignal.js +44 -5
- package/src/ConfigProvider.js +5 -5
- package/src/DataProvider.js +182 -0
- package/src/Meta.js +4 -1
- package/src/Resource.js +15 -247
- package/src/context.js +3 -3
- package/src/createPlugin.js +6 -6
- package/src/index.js +1 -2
- package/src/useResource.js +208 -0
- package/lib/DefaultDataStore.js +0 -93
- package/src/DataStore.js +0 -141
- package/src/DefaultDataStore.js +0 -38
package/lib/AbortSignal.js
CHANGED
|
@@ -20,13 +20,26 @@ var AbortSignal = /*#__PURE__*/function () {
|
|
|
20
20
|
_classCallCheck(this, AbortSignal);
|
|
21
21
|
|
|
22
22
|
this.notifier = new _Notifier["default"]();
|
|
23
|
-
this
|
|
24
|
-
|
|
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.
|
|
40
|
-
this
|
|
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
|
|
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
|
|
package/lib/ConfigProvider.js
CHANGED
|
@@ -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 =
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
13
11
|
|
|
14
12
|
var _context = require("./context");
|
|
15
13
|
|
|
16
|
-
var
|
|
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
|
|
22
|
+
var dataProvider = _ref.dataProvider,
|
|
29
23
|
children = _ref.children;
|
|
30
|
-
|
|
24
|
+
|
|
25
|
+
var context = _react["default"].useMemo(function () {
|
|
31
26
|
return {
|
|
32
|
-
|
|
27
|
+
dataProvider: dataProvider
|
|
33
28
|
};
|
|
34
|
-
}, [
|
|
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
|
-
|
|
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.
|
|
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
|
|
33
|
-
function
|
|
34
|
-
|
|
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
|
-
|
|
40
|
+
var contextPlugins = [];
|
|
41
|
+
var uiPlugins = [];
|
|
41
42
|
this.extend({
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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(
|
|
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,
|
|
67
|
-
var
|
|
84
|
+
value: function get(resource, query, options, meta) {
|
|
85
|
+
var _this = this;
|
|
68
86
|
|
|
69
87
|
return new Promise(function (resolve, reject) {
|
|
70
|
-
return
|
|
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,
|
|
83
|
-
var
|
|
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 (
|
|
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(
|
|
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
|
|
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(
|
|
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,
|
|
128
|
-
var
|
|
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(
|
|
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,
|
|
140
|
-
var
|
|
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(
|
|
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,
|
|
152
|
-
var
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
|
234
|
+
return DataProvider;
|
|
178
235
|
}();
|
|
179
236
|
|
|
180
|
-
var
|
|
181
|
-
return
|
|
237
|
+
var isDataProvider = function isDataProvider(dataProvider) {
|
|
238
|
+
return dataProvider instanceof DataProvider;
|
|
182
239
|
};
|
|
183
240
|
|
|
184
|
-
exports.
|
|
241
|
+
exports.isDataProvider = isDataProvider;
|
|
185
242
|
|
|
186
|
-
var
|
|
243
|
+
var dataProviderPropType = _propTypes["default"].instanceOf(DataProvider);
|
|
187
244
|
|
|
188
|
-
exports.
|
|
189
|
-
var _default =
|
|
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) {
|