UNPKG

8.84 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = undefined;
7
8var _assign = require('babel-runtime/core-js/object/assign');
9
10var _assign2 = _interopRequireDefault(_assign);
11
12var _keys = require('babel-runtime/core-js/object/keys');
13
14var _keys2 = _interopRequireDefault(_keys);
15
16var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
17
18var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
19
20var _createClass2 = require('babel-runtime/helpers/createClass');
21
22var _createClass3 = _interopRequireDefault(_createClass2);
23
24var _extends2 = require('babel-runtime/helpers/extends');
25
26var _extends3 = _interopRequireDefault(_extends2);
27
28var _promise = require('babel-runtime/core-js/promise');
29
30var _promise2 = _interopRequireDefault(_promise);
31
32var _qs = require('qs');
33
34var _urlPluck = require('./url-pluck');
35
36var _urlPluck2 = _interopRequireDefault(_urlPluck);
37
38function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
40var exec = function exec(_ref) {
41 var dispatch = _ref.dispatch,
42 client = _ref.client,
43 url = _ref.url,
44 method = _ref.method,
45 values = _ref.values,
46 start = _ref.start,
47 success = _ref.success,
48 fail = _ref.fail,
49 mode = _ref.mode,
50 credentials = _ref.credentials,
51 headers = _ref.headers,
52 _ref$after = _ref.after,
53 after = _ref$after === undefined ? function (_values, res) {
54 return new _promise2.default(function (resolve) {
55 return resolve(res.body);
56 });
57 } : _ref$after,
58 next = _ref.next,
59 cache = _ref.cache;
60
61 dispatch(start(fetch.values));
62 return client.fetchJSON({
63 url: url,
64 method: method,
65 values: values,
66 mode: mode,
67 credentials: credentials,
68 headers: headers,
69 cache: cache
70 }).then(function (res) {
71 return after(values, res).then(function (converted) {
72 dispatch(success({
73 body: converted,
74 res: res,
75 next: next ? next(converted) : ''
76 }));
77 return _promise2.default.resolve({
78 body: converted,
79 res: res.res
80 });
81 });
82 }, function (res) {
83 dispatch(fail(res));
84 return _promise2.default.reject({
85 body: res.body,
86 res: res.res
87 });
88 });
89};
90
91var getExecOptions = function getExecOptions(applyWith, _ref2) {
92 var options = _ref2.options,
93 values = _ref2.values,
94 urls = _ref2.urls,
95 dispatch = _ref2.dispatch,
96 client = _ref2.client,
97 resource = _ref2.resource,
98 action = _ref2.action,
99 type = _ref2.type;
100 return {
101 dispatch: dispatch,
102 client: client,
103 url: urls[resource][action].url,
104 method: urls[resource][action].method,
105 after: urls[resource][action].after,
106 next: urls[resource][action].next,
107 cache: urls[resource][action].cache && urls[resource][action].cache[type],
108 mode: options.mode !== undefined ? options.mode : urls[resource][action].mode,
109 credentials: options.credentials !== undefined ? options.credentials : urls[resource][action].credentials,
110 headers: options.headers !== undefined ? options.headers : urls[resource][action].headers,
111 values: values,
112 start: function start() {
113 return {
114 values: values,
115 type: resource + '/' + action.toUpperCase() + '_START'
116 };
117 },
118 success: function success(_ref3) {
119 var body = _ref3.body,
120 res = _ref3.res,
121 next = _ref3.next;
122
123 applyWith[resource][action].nextUrl = next;
124 applyWith[resource][action].next = function () {
125 return generateNext(applyWith, { // eslint-disable-line no-use-before-define
126 action: action,
127 options: options,
128 resource: resource,
129 urls: urls,
130 next: next,
131 dispatch: dispatch,
132 client: client
133 });
134 };
135 return {
136 values: values,
137 body: body,
138 res: res,
139 type: resource + '/' + action.toUpperCase() + '_SUCCESS',
140 hasNext: urls[resource][action].next && next ? true : false
141 };
142 },
143 fail: function fail(_ref4) {
144 var body = _ref4.body,
145 res = _ref4.res,
146 err = _ref4.err;
147 return {
148 values: values,
149 body: body,
150 res: res,
151 err: err,
152 type: resource + '/' + action.toUpperCase() + '_FAIL'
153 };
154 }
155 };
156};
157
158var generateNext = function generateNext(applyWith, _ref5) {
159 var action = _ref5.action,
160 options = _ref5.options,
161 resource = _ref5.resource,
162 urls = _ref5.urls,
163 next = _ref5.next,
164 dispatch = _ref5.dispatch,
165 client = _ref5.client;
166
167
168 if (!next) {
169 return _promise2.default.resolve();
170 }
171 var values = (0, _qs.parse)((0, _urlPluck2.default)(next, ['query']));
172 return exec((0, _extends3.default)({}, getExecOptions(applyWith, { options: options, urls: urls, dispatch: dispatch, client: client, resource: resource, action: action }), {
173 start: function start() {
174 return {
175 values: values,
176 type: resource + '/' + action.toUpperCase() + '_NEXT_START'
177 };
178 },
179 success: function success(_ref6) {
180 var body = _ref6.body,
181 res = _ref6.res,
182 _next = _ref6.next;
183
184 applyWith[resource][action].nextUrl = _next;
185 applyWith[resource][action].next = function () {
186 return generateNext(applyWith, {
187 action: action,
188 options: options,
189 resource: resource,
190 urls: urls,
191 next: _next,
192 dispatch: dispatch,
193 client: client
194 });
195 };
196 return {
197 values: values,
198 body: body,
199 res: res,
200 type: resource + '/' + action.toUpperCase() + '_NEXT_SUCCESS',
201 hasNext: urls[resource][action].next && _next ? true : false
202 };
203 },
204 fail: function fail(_ref7) {
205 var body = _ref7.body,
206 res = _ref7.res,
207 err = _ref7.err;
208 return {
209 values: values,
210 body: body,
211 res: res,
212 err: err,
213 type: resource + '/' + action.toUpperCase() + '_NEXT_FAIL'
214 };
215 },
216 values: values,
217 url: (0, _urlPluck2.default)(next, ['protocol', 'auth', 'host', 'pathname'])
218 }));
219};
220
221var deserialize = function deserialize(applyWith, _ref8) {
222 var serialized = _ref8.serialized,
223 resource = _ref8.resource,
224 action = _ref8.action,
225 urls = _ref8.urls,
226 dispatch = _ref8.dispatch,
227 client = _ref8.client;
228
229 if (serialized && serialized[resource] && serialized[resource][action] && serialized[resource][action].nextUrl) {
230 applyWith[resource][action].next = function () {
231 return generateNext(applyWith, {
232 action: action,
233 options: serialized[resource][action].options,
234 resource: resource,
235 urls: urls,
236 next: serialized[resource][action].nextUrl,
237 dispatch: dispatch,
238 client: client
239 });
240 };
241 } else {
242 applyWith[resource][action].next = function () {
243 return _promise2.default.resolve();
244 };
245 }
246};
247
248var fetcher = function () {
249 function fetcher(_ref9) {
250 var _this = this;
251
252 var urls = _ref9.urls,
253 dispatch = _ref9.dispatch,
254 client = _ref9.client,
255 serialized = _ref9.serialized,
256 type = _ref9.type;
257 (0, _classCallCheck3.default)(this, fetcher);
258
259
260 (0, _keys2.default)(urls).map(function (resource) {
261 _this[resource] = {};
262
263 (0, _keys2.default)(urls[resource]).map(function (action) {
264 _this[resource][action] = function (_values) {
265 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
266
267 var values = (0, _assign2.default)({}, urls[resource][action].defaults || {}, _values);
268 var execOptions = getExecOptions(_this, { options: options, values: values, urls: urls, dispatch: dispatch, client: client, resource: resource, action: action, type: type });
269 _this[resource][action].options = options;
270 var promise = exec(execOptions);
271 return promise;
272 };
273 deserialize(_this, { serialized: serialized, resource: resource, action: action, urls: urls, dispatch: dispatch, client: client });
274 });
275 });
276 }
277
278 (0, _createClass3.default)(fetcher, [{
279 key: 'get',
280 value: function get(urls) {
281 var _this2 = this;
282
283 var serialized = {};
284 (0, _keys2.default)(urls).map(function (resource) {
285 serialized[resource] = {};
286 (0, _keys2.default)(urls[resource]).map(function (action) {
287 serialized[resource][action] = {
288 nextUrl: _this2[resource][action].nextUrl,
289 options: _this2[resource][action].options
290 };
291 });
292 });
293 return serialized;
294 }
295 }]);
296 return fetcher;
297}();
298
299exports.default = fetcher;
300module.exports = exports['default'];
\No newline at end of file