@3plus/redux-api 1.0.5 → 1.1.2
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/PubSub.js +16 -39
- package/lib/actionFn.js +163 -257
- package/lib/adapters/fetch.js +20 -28
- package/lib/async.js +6 -28
- package/lib/createHolder.js +8 -13
- package/lib/fetchResolver.js +3 -13
- package/lib/helpers.js +15 -43
- package/lib/index.js +73 -136
- package/lib/reducerFn.js +52 -59
- package/lib/transformers.js +7 -16
- package/lib/urlTransform.js +47 -55
- package/lib/utils/cache.js +29 -35
- package/lib/utils/get.js +3 -21
- package/lib/utils/merge.js +8 -19
- package/lib/utils/omit.js +6 -17
- package/package.json +14 -8
package/lib/PubSub.js
CHANGED
|
@@ -1,43 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports["default"] = void 0;
|
|
7
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
8
|
-
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
|
9
|
-
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
|
10
|
-
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
11
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
12
|
-
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
13
|
-
var PubSub = exports["default"] = /*#__PURE__*/function () {
|
|
14
|
-
function PubSub() {
|
|
15
|
-
_classCallCheck(this, PubSub);
|
|
3
|
+
export default class PubSub {
|
|
4
|
+
constructor() {
|
|
16
5
|
this.container = [];
|
|
17
6
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}, {
|
|
33
|
-
key: "reject",
|
|
34
|
-
value: function reject(err) {
|
|
35
|
-
var container = this.container;
|
|
36
|
-
this.container = [];
|
|
37
|
-
container.forEach(function (cb) {
|
|
38
|
-
return cb(err);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
}]);
|
|
42
|
-
}();
|
|
43
|
-
module.exports = exports.default;
|
|
7
|
+
push(cb) {
|
|
8
|
+
cb instanceof Function && this.container.push(cb);
|
|
9
|
+
}
|
|
10
|
+
resolve(data) {
|
|
11
|
+
const container = this.container;
|
|
12
|
+
this.container = [];
|
|
13
|
+
container.forEach(cb => cb(null, data));
|
|
14
|
+
}
|
|
15
|
+
reject(err) {
|
|
16
|
+
const container = this.container;
|
|
17
|
+
this.container = [];
|
|
18
|
+
container.forEach(cb => cb(err));
|
|
19
|
+
}
|
|
20
|
+
}
|
package/lib/actionFn.js
CHANGED
|
@@ -1,104 +1,78 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
23
|
-
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
24
|
-
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
25
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
26
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
27
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
28
|
-
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
29
|
-
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
30
|
-
/**
|
|
31
|
-
* Constructor for create action
|
|
32
|
-
* @param {String} url endpoint's url
|
|
33
|
-
* @param {String} name action name
|
|
34
|
-
* @param {Object} options action configuration
|
|
35
|
-
* @param {Object} ACTIONS map of actions
|
|
36
|
-
* @param {[type]} fetchAdapter adapter for fetching data
|
|
37
|
-
* @return {Function+Object} action function object
|
|
38
|
-
*/
|
|
39
|
-
function actionFn(url, name, options) {
|
|
40
|
-
var ACTIONS = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
41
|
-
var meta = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
|
|
42
|
-
var actionFetch = ACTIONS.actionFetch,
|
|
43
|
-
actionSuccess = ACTIONS.actionSuccess,
|
|
44
|
-
actionFail = ACTIONS.actionFail,
|
|
45
|
-
actionReset = ACTIONS.actionReset,
|
|
46
|
-
actionCache = ACTIONS.actionCache,
|
|
47
|
-
actionAbort = ACTIONS.actionAbort;
|
|
48
|
-
var pubsub = new _PubSub["default"]();
|
|
49
|
-
var requestHolder = (0, _createHolder["default"])();
|
|
3
|
+
import urlTransform from "./urlTransform";
|
|
4
|
+
import merge from "./utils/merge";
|
|
5
|
+
import get from "./utils/get";
|
|
6
|
+
import fetchResolver from "./fetchResolver";
|
|
7
|
+
import PubSub from "./PubSub";
|
|
8
|
+
import createHolder from "./createHolder";
|
|
9
|
+
import { none, extractArgs, defaultMiddlewareArgsParser, CRUD } from "./helpers";
|
|
10
|
+
import { getCacheManager } from "./utils/cache";
|
|
11
|
+
export default function actionFn(url, name, options, ACTIONS = {}, meta = {}) {
|
|
12
|
+
const {
|
|
13
|
+
actionFetch,
|
|
14
|
+
actionSuccess,
|
|
15
|
+
actionFail,
|
|
16
|
+
actionReset,
|
|
17
|
+
actionCache,
|
|
18
|
+
actionAbort
|
|
19
|
+
} = ACTIONS;
|
|
20
|
+
const pubsub = new PubSub();
|
|
21
|
+
const requestHolder = createHolder();
|
|
50
22
|
function getOptions(urlT, params, getState) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return (
|
|
23
|
+
const globalOptions = !meta.holder ? {} : meta.holder.options instanceof Function ? meta.holder.options(urlT, params, getState) : meta.holder.options;
|
|
24
|
+
const baseOptions = !(options instanceof Function) ? options : options(urlT, params, getState);
|
|
25
|
+
return merge({}, globalOptions, baseOptions, params);
|
|
54
26
|
}
|
|
55
27
|
function getUrl(pathvars, params, getState) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
28
|
+
const resultUrlT = urlTransform(url, pathvars, meta.urlOptions);
|
|
29
|
+
let urlT = resultUrlT;
|
|
30
|
+
let rootUrl = get(meta, "holder", "rootUrl");
|
|
59
31
|
rootUrl = !(rootUrl instanceof Function) ? rootUrl : rootUrl(urlT, params, getState);
|
|
60
32
|
if (rootUrl) {
|
|
61
|
-
|
|
62
|
-
|
|
33
|
+
let urlObject = {};
|
|
34
|
+
try {
|
|
35
|
+
urlObject = new URL(urlT);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
urlObject = {
|
|
38
|
+
pathname: urlT
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const rootUrlObject = new URL(rootUrl);
|
|
63
42
|
if (!urlObject.host) {
|
|
64
|
-
|
|
65
|
-
urlT =
|
|
43
|
+
const urlPath = (rootUrlObject.pathname ? rootUrlObject.pathname.replace(/\/$/, "") : "") + "/" + (urlObject.pathname ? urlObject.pathname.replace(/^\//, "") : "");
|
|
44
|
+
urlT = `${rootUrlObject.protocol}//${rootUrlObject.host}${urlPath}`;
|
|
66
45
|
}
|
|
67
46
|
}
|
|
68
47
|
return urlT;
|
|
69
48
|
}
|
|
70
|
-
function fetch(pathvars, params) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (cacheManager && getState !== _helpers.none) {
|
|
79
|
-
var state = getState();
|
|
80
|
-
var cache = (0, _get["default"])(state, meta.prefix, meta.reducerName, "cache");
|
|
49
|
+
function fetch(pathvars, params, options = {}, getState = none, dispatch = none) {
|
|
50
|
+
const urlT = getUrl(pathvars, params, getState);
|
|
51
|
+
const opts = getOptions(urlT, params, getState);
|
|
52
|
+
let id = meta.reducerName || "";
|
|
53
|
+
const cacheManager = getCacheManager(options.expire, meta.cache);
|
|
54
|
+
if (cacheManager && getState !== none) {
|
|
55
|
+
const state = getState();
|
|
56
|
+
const cache = get(state, meta.prefix, meta.reducerName, "cache");
|
|
81
57
|
id += "_" + cacheManager.id(pathvars, params);
|
|
82
|
-
|
|
58
|
+
const data = cacheManager.getData(cache && id && cache[id] !== undefined && cache[id]);
|
|
83
59
|
if (data !== undefined) {
|
|
84
60
|
if (cache[id].persisted) {
|
|
85
61
|
Object.defineProperty(data, "persisted", {
|
|
86
62
|
value: true
|
|
87
63
|
});
|
|
88
|
-
// expire persisted cache immediately after consumption
|
|
89
|
-
// because we will try to reload and persist new data
|
|
90
64
|
cache[id].expire = true;
|
|
91
65
|
}
|
|
92
66
|
return Promise.resolve(data);
|
|
93
67
|
}
|
|
94
68
|
}
|
|
95
|
-
|
|
96
|
-
if (cacheManager && dispatch !==
|
|
97
|
-
response.then(
|
|
69
|
+
const response = meta.fetch(urlT, opts, options);
|
|
70
|
+
if (cacheManager && dispatch !== none && id) {
|
|
71
|
+
response.then(data => {
|
|
98
72
|
dispatch({
|
|
99
73
|
type: actionCache,
|
|
100
|
-
id
|
|
101
|
-
data
|
|
74
|
+
id,
|
|
75
|
+
data,
|
|
102
76
|
expire: cacheManager.expire
|
|
103
77
|
});
|
|
104
78
|
});
|
|
@@ -106,99 +80,70 @@ function actionFn(url, name, options) {
|
|
|
106
80
|
return response;
|
|
107
81
|
}
|
|
108
82
|
function abort() {
|
|
109
|
-
|
|
110
|
-
|
|
83
|
+
const defer = requestHolder.pop();
|
|
84
|
+
const err = new Error("Application abort request");
|
|
111
85
|
defer && defer.reject(err);
|
|
112
86
|
return err;
|
|
113
87
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
function request(pathvars, params, options) {
|
|
122
|
-
var getState = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _helpers.none;
|
|
123
|
-
var dispatch = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _helpers.none;
|
|
124
|
-
var response = fetch(pathvars, params, options, getState, dispatch);
|
|
125
|
-
var result = !meta.validation ? response : response.then(function (data) {
|
|
126
|
-
return new Promise(function (resolve, reject) {
|
|
127
|
-
meta.validation(data, function (err) {
|
|
128
|
-
return err ? reject(err) : resolve(data);
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
var ret = result;
|
|
133
|
-
var responseHandler = (0, _get["default"])(meta, "holder", "responseHandler");
|
|
88
|
+
function request(pathvars, params, options, getState = none, dispatch = none) {
|
|
89
|
+
const response = fetch(pathvars, params, options, getState, dispatch);
|
|
90
|
+
const result = !meta.validation ? response : response.then(data => new Promise((resolve, reject) => {
|
|
91
|
+
meta.validation(data, err => err ? reject(err) : resolve(data));
|
|
92
|
+
}));
|
|
93
|
+
let ret = result;
|
|
94
|
+
const responseHandler = get(meta, "holder", "responseHandler");
|
|
134
95
|
if (responseHandler) {
|
|
135
96
|
if (result && result.then) {
|
|
136
|
-
ret = result.then(
|
|
137
|
-
|
|
97
|
+
ret = result.then(data => {
|
|
98
|
+
const res = responseHandler(null, data);
|
|
138
99
|
if (res === undefined) {
|
|
139
100
|
return data;
|
|
140
101
|
} else {
|
|
141
102
|
return res;
|
|
142
103
|
}
|
|
143
|
-
},
|
|
144
|
-
return responseHandler(err);
|
|
145
|
-
});
|
|
104
|
+
}, err => responseHandler(err));
|
|
146
105
|
} else {
|
|
147
106
|
ret = responseHandler(result);
|
|
148
107
|
}
|
|
149
108
|
}
|
|
150
|
-
ret && ret
|
|
109
|
+
ret && ret.catch && ret.catch(none);
|
|
151
110
|
return ret;
|
|
152
111
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
* @param {Object} pathvars path vars for url
|
|
157
|
-
* @param {Object} params fetch params
|
|
158
|
-
* @param {Function} callback) callback execute after end request
|
|
159
|
-
*/
|
|
160
|
-
function fn() {
|
|
161
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
162
|
-
args[_key] = arguments[_key];
|
|
163
|
-
}
|
|
164
|
-
var _extractArgs = (0, _helpers.extractArgs)(args),
|
|
165
|
-
_extractArgs2 = _slicedToArray(_extractArgs, 3),
|
|
166
|
-
pathvars = _extractArgs2[0],
|
|
167
|
-
params = _extractArgs2[1],
|
|
168
|
-
callback = _extractArgs2[2];
|
|
169
|
-
var syncing = params ? !!params.syncing : false;
|
|
112
|
+
function fn(...args) {
|
|
113
|
+
const [pathvars, params, callback] = extractArgs(args);
|
|
114
|
+
const syncing = params ? !!params.syncing : false;
|
|
170
115
|
params && delete params.syncing;
|
|
171
116
|
pubsub.push(callback);
|
|
172
|
-
return
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
dispatch
|
|
176
|
-
getState
|
|
177
|
-
|
|
178
|
-
|
|
117
|
+
return (...middlewareArgs) => {
|
|
118
|
+
const middlewareParser = get(meta, "holder", "middlewareParser") || defaultMiddlewareArgsParser;
|
|
119
|
+
const {
|
|
120
|
+
dispatch,
|
|
121
|
+
getState
|
|
122
|
+
} = middlewareParser(...middlewareArgs);
|
|
123
|
+
const state = getState();
|
|
124
|
+
const isLoading = get(state, meta.prefix, meta.reducerName, "loading");
|
|
179
125
|
if (isLoading) {
|
|
180
126
|
return Promise.reject("isLoading-" + meta.prefix + "-" + meta.reducerName);
|
|
181
127
|
}
|
|
182
|
-
|
|
183
|
-
pathvars
|
|
184
|
-
params
|
|
128
|
+
const requestOptions = {
|
|
129
|
+
pathvars,
|
|
130
|
+
params
|
|
185
131
|
};
|
|
186
132
|
dispatch({
|
|
187
133
|
type: actionFetch,
|
|
188
|
-
syncing
|
|
134
|
+
syncing,
|
|
189
135
|
request: requestOptions
|
|
190
136
|
});
|
|
191
|
-
|
|
192
|
-
dispatch
|
|
193
|
-
getState
|
|
137
|
+
const fetchResolverOpts = {
|
|
138
|
+
dispatch,
|
|
139
|
+
getState,
|
|
194
140
|
request: requestOptions,
|
|
195
141
|
actions: meta.actions,
|
|
196
142
|
prefetch: meta.prefetch
|
|
197
143
|
};
|
|
198
144
|
if (Object.defineProperty) {
|
|
199
145
|
Object.defineProperty(fetchResolverOpts, "requestOptions", {
|
|
200
|
-
get
|
|
201
|
-
/* eslint no-console: 0 */
|
|
146
|
+
get() {
|
|
202
147
|
console.warn("Deprecated option, use `request` option");
|
|
203
148
|
return requestOptions;
|
|
204
149
|
}
|
|
@@ -206,8 +151,8 @@ function actionFn(url, name, options) {
|
|
|
206
151
|
} else {
|
|
207
152
|
fetchResolverOpts.requestOptions = requestOptions;
|
|
208
153
|
}
|
|
209
|
-
|
|
210
|
-
(0,
|
|
154
|
+
const result = new Promise((done, fail) => {
|
|
155
|
+
fetchResolver(0, fetchResolverOpts, err => {
|
|
211
156
|
if (err) {
|
|
212
157
|
dispatch({
|
|
213
158
|
error: err,
|
|
@@ -219,42 +164,42 @@ function actionFn(url, name, options) {
|
|
|
219
164
|
pubsub.reject(err);
|
|
220
165
|
return fail(err);
|
|
221
166
|
}
|
|
222
|
-
new Promise(
|
|
167
|
+
new Promise((resolve, reject) => {
|
|
223
168
|
requestHolder.set({
|
|
224
|
-
resolve
|
|
225
|
-
reject
|
|
169
|
+
resolve,
|
|
170
|
+
reject,
|
|
226
171
|
promise: request(pathvars, params, fetchResolverOpts.request, getState, dispatch).then(resolve, reject)
|
|
227
172
|
});
|
|
228
|
-
}).then(
|
|
173
|
+
}).then(d => {
|
|
229
174
|
requestHolder.pop();
|
|
230
|
-
|
|
231
|
-
|
|
175
|
+
const prevData = get(state, meta.prefix, meta.reducerName, "data");
|
|
176
|
+
const data = meta.transformer(d, prevData, {
|
|
232
177
|
type: actionSuccess,
|
|
233
178
|
request: requestOptions
|
|
234
179
|
}, getState);
|
|
235
180
|
dispatch({
|
|
236
|
-
data
|
|
181
|
+
data,
|
|
237
182
|
origData: d,
|
|
238
183
|
type: actionSuccess,
|
|
239
184
|
syncing: false,
|
|
240
185
|
request: requestOptions
|
|
241
186
|
});
|
|
242
187
|
if (meta.broadcast) {
|
|
243
|
-
meta.broadcast.forEach(
|
|
188
|
+
meta.broadcast.forEach(type => {
|
|
244
189
|
dispatch({
|
|
245
|
-
type
|
|
246
|
-
data
|
|
190
|
+
type,
|
|
191
|
+
data,
|
|
247
192
|
origData: d,
|
|
248
193
|
request: requestOptions
|
|
249
194
|
});
|
|
250
195
|
});
|
|
251
196
|
}
|
|
252
197
|
if (meta.postfetch) {
|
|
253
|
-
meta.postfetch.forEach(
|
|
198
|
+
meta.postfetch.forEach(postfetch => {
|
|
254
199
|
postfetch instanceof Function && postfetch({
|
|
255
|
-
data
|
|
256
|
-
getState
|
|
257
|
-
dispatch
|
|
200
|
+
data,
|
|
201
|
+
getState,
|
|
202
|
+
dispatch,
|
|
258
203
|
actions: meta.actions,
|
|
259
204
|
request: requestOptions
|
|
260
205
|
});
|
|
@@ -262,13 +207,12 @@ function actionFn(url, name, options) {
|
|
|
262
207
|
}
|
|
263
208
|
pubsub.resolve(data);
|
|
264
209
|
done(data);
|
|
265
|
-
// special case where we will try to relaod data if persisted cache is consumed
|
|
266
210
|
if (d && d.persisted && meta.cache && meta.cache.reloadPersisted) {
|
|
267
|
-
fn.force
|
|
211
|
+
fn.force(...args)(dispatch, getState);
|
|
268
212
|
}
|
|
269
|
-
},
|
|
213
|
+
}, error => {
|
|
270
214
|
dispatch({
|
|
271
|
-
error
|
|
215
|
+
error,
|
|
272
216
|
type: actionFail,
|
|
273
217
|
loading: false,
|
|
274
218
|
syncing: false,
|
|
@@ -279,141 +223,103 @@ function actionFn(url, name, options) {
|
|
|
279
223
|
});
|
|
280
224
|
});
|
|
281
225
|
});
|
|
282
|
-
result
|
|
226
|
+
result.catch(none);
|
|
283
227
|
return result;
|
|
284
228
|
};
|
|
285
229
|
}
|
|
286
|
-
|
|
287
|
-
/*
|
|
288
|
-
Pure rest request
|
|
289
|
-
*/
|
|
290
230
|
fn.request = function (pathvars, params, options) {
|
|
291
231
|
return request(pathvars, params, options || {});
|
|
292
232
|
};
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Reset store to initial state
|
|
296
|
-
*/
|
|
297
|
-
fn.reset = function (mutation) {
|
|
233
|
+
fn.reset = mutation => {
|
|
298
234
|
abort();
|
|
299
235
|
return mutation === "sync" ? {
|
|
300
236
|
type: actionReset,
|
|
301
|
-
mutation
|
|
237
|
+
mutation
|
|
302
238
|
} : {
|
|
303
239
|
type: actionReset
|
|
304
240
|
};
|
|
305
241
|
};
|
|
306
|
-
|
|
307
|
-
/*
|
|
308
|
-
Abort request
|
|
309
|
-
*/
|
|
310
242
|
fn.abort = function () {
|
|
311
|
-
|
|
243
|
+
const error = abort();
|
|
312
244
|
return {
|
|
313
245
|
type: actionAbort,
|
|
314
|
-
error
|
|
246
|
+
error
|
|
315
247
|
};
|
|
316
248
|
};
|
|
317
|
-
fn.force = function () {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
return function (dispatch, getState) {
|
|
322
|
-
var state = getState();
|
|
323
|
-
var isLoading = (0, _get["default"])(state, meta.prefix, meta.reducerName, "loading");
|
|
249
|
+
fn.force = function (...args) {
|
|
250
|
+
return (dispatch, getState) => {
|
|
251
|
+
const state = getState();
|
|
252
|
+
const isLoading = get(state, meta.prefix, meta.reducerName, "loading");
|
|
324
253
|
if (isLoading) {
|
|
325
254
|
dispatch(fn.abort());
|
|
326
255
|
}
|
|
327
|
-
return fn
|
|
256
|
+
return fn(...args)(dispatch, getState);
|
|
328
257
|
};
|
|
329
258
|
};
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
* @param {Function} callback) callback execute after end request
|
|
337
|
-
*/
|
|
338
|
-
fn.sync = function () {
|
|
339
|
-
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
340
|
-
args[_key3] = arguments[_key3];
|
|
341
|
-
}
|
|
342
|
-
var _extractArgs3 = (0, _helpers.extractArgs)(args),
|
|
343
|
-
_extractArgs4 = _slicedToArray(_extractArgs3, 3),
|
|
344
|
-
pathvars = _extractArgs4[0],
|
|
345
|
-
params = _extractArgs4[1],
|
|
346
|
-
callback = _extractArgs4[2];
|
|
347
|
-
var isServer = meta.holder ? meta.holder.server : false;
|
|
348
|
-
return function (dispatch, getState) {
|
|
349
|
-
var state = getState();
|
|
350
|
-
var store = (0, _get["default"])(state, meta.prefix, name);
|
|
259
|
+
fn.sync = (...args) => {
|
|
260
|
+
const [pathvars, params, callback] = extractArgs(args);
|
|
261
|
+
const isServer = meta.holder ? meta.holder.server : false;
|
|
262
|
+
return (dispatch, getState) => {
|
|
263
|
+
const state = getState();
|
|
264
|
+
const store = get(state, meta.prefix, name);
|
|
351
265
|
if (!isServer && store && store.sync) {
|
|
352
266
|
callback(null, store.data);
|
|
353
267
|
return;
|
|
354
268
|
}
|
|
355
|
-
|
|
269
|
+
const modifyParams = {
|
|
270
|
+
...params,
|
|
356
271
|
syncing: true
|
|
357
|
-
}
|
|
272
|
+
};
|
|
358
273
|
return fn(pathvars, modifyParams, callback)(dispatch, getState);
|
|
359
274
|
};
|
|
360
275
|
};
|
|
361
|
-
|
|
276
|
+
let helpers = meta.helpers || {};
|
|
362
277
|
if (meta.crud) {
|
|
363
|
-
helpers =
|
|
278
|
+
helpers = {
|
|
279
|
+
...CRUD,
|
|
280
|
+
...helpers
|
|
281
|
+
};
|
|
364
282
|
}
|
|
365
|
-
|
|
283
|
+
const fnHelperCallback = (memo, func, helpername) => {
|
|
366
284
|
if (memo[helpername]) {
|
|
367
|
-
throw new Error(
|
|
285
|
+
throw new Error(`Helper name: "${helpername}" for endpoint "${name}" has been already reserved`);
|
|
368
286
|
}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
call
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
var _helpersResult = _slicedToArray(helpersResult, 2),
|
|
404
|
-
pathvars = _helpersResult[0],
|
|
405
|
-
params = _helpersResult[1];
|
|
406
|
-
(0, _fastApply["default"])(sync ? fn.sync : fn, null, [pathvars, params, callback])(dispatch, getState);
|
|
407
|
-
}
|
|
408
|
-
});
|
|
409
|
-
result["catch"](_helpers.none);
|
|
410
|
-
return result;
|
|
411
|
-
};
|
|
287
|
+
const {
|
|
288
|
+
sync,
|
|
289
|
+
call
|
|
290
|
+
} = func instanceof Function ? {
|
|
291
|
+
call: func
|
|
292
|
+
} : func;
|
|
293
|
+
memo[helpername] = (...args) => (dispatch, getState) => {
|
|
294
|
+
const index = args.length - 1;
|
|
295
|
+
const callbackFn = args[index] instanceof Function ? args[index] : none;
|
|
296
|
+
const helpersResult = call.apply({
|
|
297
|
+
getState,
|
|
298
|
+
dispatch,
|
|
299
|
+
actions: meta.actions
|
|
300
|
+
}, args);
|
|
301
|
+
const result = new Promise((resolve, reject) => {
|
|
302
|
+
const callback = (err, data) => {
|
|
303
|
+
err ? reject(err) : resolve(data);
|
|
304
|
+
callbackFn(err, data);
|
|
305
|
+
};
|
|
306
|
+
if (helpersResult instanceof Function) {
|
|
307
|
+
helpersResult((error, newArgs = []) => {
|
|
308
|
+
if (error) {
|
|
309
|
+
callback(error);
|
|
310
|
+
} else {
|
|
311
|
+
(sync ? fn.sync : fn)(...newArgs.concat(callback))(dispatch, getState);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
} else {
|
|
315
|
+
const [pathvars, params] = helpersResult;
|
|
316
|
+
(sync ? fn.sync : fn)(pathvars, params, callback)(dispatch, getState);
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
result.catch(none);
|
|
320
|
+
return result;
|
|
412
321
|
};
|
|
413
322
|
return memo;
|
|
414
323
|
};
|
|
415
|
-
return Object.keys(helpers).reduce(
|
|
416
|
-
|
|
417
|
-
}, fn);
|
|
418
|
-
}
|
|
419
|
-
module.exports = exports.default;
|
|
324
|
+
return Object.keys(helpers).reduce((memo, key) => fnHelperCallback(memo, helpers[key], key, helpers), fn);
|
|
325
|
+
}
|