service-creator 0.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Roy Riojas
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # create-service
2
+
3
+ A simple abstraction to create "services", plain objects that can be used to perform fetch calls in a convention over configuration fashion.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install create-service
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```js
14
+ import { createService } from 'create-service';
15
+ import { v4 as uuid } from 'uuid';
16
+
17
+ const fetcher = {
18
+ fetch: async (url, opts) => {
19
+ const resp = await fetch(url, opts);
20
+ return resp.json();
21
+ },
22
+ };
23
+
24
+ // defining the interface of the service is helpful to have good typings
25
+ // service methods are async functions that return a promise that resolves to the response
26
+ // expected to be received from the fetch/xhr calls
27
+ export interface PPService {
28
+ getSomeData: (prompt: string) => Promise<SomeData[]>;
29
+ getDataById: (id: string) => Promise<SomeData>;
30
+ }
31
+
32
+ const commonHeadersFn = () => {
33
+ const appCtx = getCtx();
34
+
35
+ return {
36
+ 'x-req-id': uuid(),
37
+ };
38
+ };
39
+
40
+ const service = createService({
41
+ endpoints: {
42
+ getSomeData: {
43
+ method: 'GET',
44
+ url: '/v1/get-some-data',
45
+ body: ({ prompt }) => ({ prompt }),
46
+ headers: commonHeadersFn,
47
+ },
48
+ getDataById: {
49
+ method: 'GET',
50
+ headers: commonHeadersFn,
51
+ url: ({ id }) => `/v1/get-some-data-by-id/${id}`,
52
+ },
53
+ },
54
+ basePath: api,
55
+ fetcher,
56
+ });
57
+
58
+ const data = await service.getSomeData({ prompt: 'hello world' });
59
+
60
+ console.log(data); // expected an array of SomeData
61
+
62
+ const dataById = await service.getDataById({ id: '1' });
63
+
64
+ console.log(dataById); // expected a single SomeData
65
+ ```
66
+
67
+ ## License
68
+
69
+ MIT
@@ -0,0 +1 @@
1
+ export declare const combinePathWithBase: (host: string, path: string) => string;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.combinePathWithBase = void 0;
7
+
8
+ var combinePathWithBase = function combinePathWithBase(host, path) {
9
+ host = host.replace(/\/$/, '');
10
+ path = path.replace(/^\//, '');
11
+ return "".concat(host, "/").concat(path);
12
+ };
13
+
14
+ exports.combinePathWithBase = combinePathWithBase;
15
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21iaW5lUGF0aFdpdGhCYXNlLnRzIl0sIm5hbWVzIjpbImNvbWJpbmVQYXRoV2l0aEJhc2UiLCJob3N0IiwicGF0aCIsInJlcGxhY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBTyxJQUFNQSxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQXNCLENBQUNDLElBQUQsRUFBZUMsSUFBZixFQUFnQztBQUNqRUQsRUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNFLE9BQUwsQ0FBYSxLQUFiLEVBQW9CLEVBQXBCLENBQVA7QUFDQUQsRUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNDLE9BQUwsQ0FBYSxLQUFiLEVBQW9CLEVBQXBCLENBQVA7QUFDQSxtQkFBVUYsSUFBVixjQUFrQkMsSUFBbEI7QUFDRCxDQUpNIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGNvbWJpbmVQYXRoV2l0aEJhc2UgPSAoaG9zdDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgaG9zdCA9IGhvc3QucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgcmV0dXJuIGAke2hvc3R9LyR7cGF0aH1gO1xufTtcbiJdfQ==
@@ -0,0 +1,25 @@
1
+ import { Fetcher, FetchOptions } from './fetch-types';
2
+ export declare const combine: (host: string, path: string) => string;
3
+ export interface Fn<T extends Array<any>> {
4
+ (...args: T): string;
5
+ }
6
+ export type ServiceFn = (...args: any[]) => Promise<any>;
7
+ export type StringOrFn<T extends ServiceFn> = string | Fn<Parameters<T>>;
8
+ export type ObjectOrFn<T extends ServiceFn> = object | Fn<Parameters<T>>;
9
+ export interface Descriptor<K extends ServiceFn> {
10
+ url: StringOrFn<K>;
11
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS' | 'TRACE' | 'CONNECT';
12
+ body?: ObjectOrFn<K>;
13
+ headers?: ObjectOrFn<K>;
14
+ params?: ObjectOrFn<K>;
15
+ fetchOpts?: FetchOptions;
16
+ }
17
+ export type ServiceDescriptor<T> = {
18
+ [K in keyof T]: Descriptor<T[K] extends ServiceFn ? T[K] : never>;
19
+ };
20
+ export interface CreateServiceArgs<T> {
21
+ endpoints: ServiceDescriptor<T>;
22
+ basePath: string | undefined;
23
+ fetcher: Fetcher;
24
+ }
25
+ export declare const createService: <T>({ endpoints, basePath, fetcher }: CreateServiceArgs<T>) => T;
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createService = exports.combine = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
+
16
+ var _combinePathWithBase = require("./combinePathWithBase");
17
+
18
+ var _urlHelpers = require("./url-helpers");
19
+
20
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
+
22
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
23
+
24
+ var combine = function combine(host, path) {
25
+ host = host.replace(/\/$/, '');
26
+ path = path.replace(/^\//, '');
27
+ return "".concat(host, "/").concat(path);
28
+ };
29
+
30
+ exports.combine = combine;
31
+
32
+ var getDefaultData = function getDefaultData() {
33
+ var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
34
+ return args.length > 0 ? args[0] : undefined;
35
+ };
36
+
37
+ var tryCall = /*#__PURE__*/function () {
38
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(fn) {
39
+ var _len,
40
+ args,
41
+ _key,
42
+ fnName,
43
+ _args = arguments;
44
+
45
+ return _regenerator.default.wrap(function _callee$(_context) {
46
+ while (1) {
47
+ switch (_context.prev = _context.next) {
48
+ case 0:
49
+ for (_len = _args.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
50
+ args[_key - 1] = _args[_key];
51
+ }
52
+
53
+ _context.prev = 1;
54
+ _context.next = 4;
55
+ return fn.apply(void 0, args);
56
+
57
+ case 4:
58
+ return _context.abrupt("return", _context.sent);
59
+
60
+ case 7:
61
+ _context.prev = 7;
62
+ _context.t0 = _context["catch"](1);
63
+ fnName = fn ? fn.name : 'anonymous';
64
+ console.warn("[CreateService Error] ".concat(fnName, " failed with args:"), args);
65
+ return _context.abrupt("return", undefined);
66
+
67
+ case 12:
68
+ case "end":
69
+ return _context.stop();
70
+ }
71
+ }
72
+ }, _callee, null, [[1, 7]]);
73
+ }));
74
+
75
+ return function tryCall(_x) {
76
+ return _ref.apply(this, arguments);
77
+ };
78
+ }();
79
+
80
+ var createService = function createService(_ref2) {
81
+ var endpoints = _ref2.endpoints,
82
+ basePath = _ref2.basePath,
83
+ fetcher = _ref2.fetcher;
84
+ return Object.keys(endpoints).reduce(function (service, serviceName) {
85
+ service[serviceName] = /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
86
+ var _len2,
87
+ args,
88
+ _key2,
89
+ _endpoints,
90
+ url,
91
+ body,
92
+ headers,
93
+ method,
94
+ params,
95
+ fetchOpts,
96
+ urlToUse,
97
+ getDefault,
98
+ bodyToUse,
99
+ headersToUse,
100
+ paramsToUse,
101
+ opts,
102
+ _args2 = arguments;
103
+
104
+ return _regenerator.default.wrap(function _callee2$(_context2) {
105
+ while (1) {
106
+ switch (_context2.prev = _context2.next) {
107
+ case 0:
108
+ for (_len2 = _args2.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
109
+ args[_key2] = _args2[_key2];
110
+ }
111
+
112
+ _endpoints = endpoints[serviceName], url = _endpoints.url, body = _endpoints.body, headers = _endpoints.headers, method = _endpoints.method, params = _endpoints.params, fetchOpts = _endpoints.fetchOpts;
113
+
114
+ if (!(typeof url === 'function')) {
115
+ _context2.next = 8;
116
+ break;
117
+ }
118
+
119
+ _context2.next = 5;
120
+ return tryCall.apply(void 0, [url].concat(args));
121
+
122
+ case 5:
123
+ _context2.t0 = _context2.sent;
124
+ _context2.next = 9;
125
+ break;
126
+
127
+ case 8:
128
+ _context2.t0 = url;
129
+
130
+ case 9:
131
+ urlToUse = _context2.t0;
132
+
133
+ if (!(typeof urlToUse !== 'string')) {
134
+ _context2.next = 13;
135
+ break;
136
+ }
137
+
138
+ console.error('[Create Service Error]: URL must be a string or a function returning a string', urlToUse);
139
+ throw new Error("URL must be a string or a function returning a string for method ".concat(serviceName, "."));
140
+
141
+ case 13:
142
+ // TODO: detect absolute urlToUse and prevent adding the base path
143
+ if (basePath) {
144
+ urlToUse = (0, _combinePathWithBase.combinePathWithBase)(basePath, urlToUse);
145
+ }
146
+
147
+ getDefault = function getDefault() {
148
+ return method !== 'GET' ? getDefaultData(args) : undefined;
149
+ }; // if data is a function we pass all the arguments to the function so it creates
150
+ // the payload with all the provided arguments, expecting it to return a single object
151
+ // if the data is not a function then we get the first argument passed to the function as the
152
+ // data payload. If this is an object it will be serialized using json stringify before sending it
153
+
154
+
155
+ if (!(typeof body === 'function')) {
156
+ _context2.next = 21;
157
+ break;
158
+ }
159
+
160
+ _context2.next = 18;
161
+ return tryCall.apply(void 0, [body].concat(args));
162
+
163
+ case 18:
164
+ _context2.t1 = _context2.sent;
165
+ _context2.next = 22;
166
+ break;
167
+
168
+ case 21:
169
+ _context2.t1 = getDefault();
170
+
171
+ case 22:
172
+ bodyToUse = _context2.t1;
173
+
174
+ if (!(typeof headers === 'function')) {
175
+ _context2.next = 29;
176
+ break;
177
+ }
178
+
179
+ _context2.next = 26;
180
+ return tryCall.apply(void 0, [headers].concat(args));
181
+
182
+ case 26:
183
+ _context2.t2 = _context2.sent;
184
+ _context2.next = 30;
185
+ break;
186
+
187
+ case 29:
188
+ _context2.t2 = headers;
189
+
190
+ case 30:
191
+ headersToUse = _context2.t2;
192
+
193
+ if (!(typeof params === 'function')) {
194
+ _context2.next = 37;
195
+ break;
196
+ }
197
+
198
+ _context2.next = 34;
199
+ return tryCall.apply(void 0, [params].concat(args));
200
+
201
+ case 34:
202
+ _context2.t3 = _context2.sent;
203
+ _context2.next = 38;
204
+ break;
205
+
206
+ case 37:
207
+ _context2.t3 = params;
208
+
209
+ case 38:
210
+ paramsToUse = _context2.t3;
211
+ opts = _objectSpread(_objectSpread({}, fetchOpts || {}), {}, {
212
+ body: bodyToUse,
213
+ headers: headersToUse,
214
+ method: method
215
+ });
216
+
217
+ if (paramsToUse) {
218
+ urlToUse = (0, _urlHelpers.setQueryParams)(urlToUse, paramsToUse);
219
+ }
220
+
221
+ return _context2.abrupt("return", fetcher.fetch(urlToUse, opts));
222
+
223
+ case 42:
224
+ case "end":
225
+ return _context2.stop();
226
+ }
227
+ }
228
+ }, _callee2);
229
+ }));
230
+ return service;
231
+ }, {});
232
+ };
233
+
234
+ exports.createService = createService;
235
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jcmVhdGUtc2VydmljZS50cyJdLCJuYW1lcyI6WyJjb21iaW5lIiwiaG9zdCIsInBhdGgiLCJyZXBsYWNlIiwiZ2V0RGVmYXVsdERhdGEiLCJhcmdzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwidHJ5Q2FsbCIsImZuIiwiZm5OYW1lIiwibmFtZSIsImNvbnNvbGUiLCJ3YXJuIiwiY3JlYXRlU2VydmljZSIsImVuZHBvaW50cyIsImJhc2VQYXRoIiwiZmV0Y2hlciIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJzZXJ2aWNlIiwic2VydmljZU5hbWUiLCJ1cmwiLCJib2R5IiwiaGVhZGVycyIsIm1ldGhvZCIsInBhcmFtcyIsImZldGNoT3B0cyIsInVybFRvVXNlIiwiZXJyb3IiLCJFcnJvciIsImdldERlZmF1bHQiLCJib2R5VG9Vc2UiLCJoZWFkZXJzVG9Vc2UiLCJwYXJhbXNUb1VzZSIsIm9wdHMiLCJmZXRjaCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7Ozs7OztBQUVPLElBQU1BLE9BQU8sR0FBRyxTQUFWQSxPQUFVLENBQUNDLElBQUQsRUFBZUMsSUFBZixFQUFnQztBQUNyREQsRUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNFLE9BQUwsQ0FBYSxLQUFiLEVBQW9CLEVBQXBCLENBQVA7QUFDQUQsRUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNDLE9BQUwsQ0FBYSxLQUFiLEVBQW9CLEVBQXBCLENBQVA7QUFDQSxtQkFBVUYsSUFBVixjQUFrQkMsSUFBbEI7QUFDRCxDQUpNOzs7O0FBTVAsSUFBTUUsY0FBYyxHQUFHLFNBQWpCQSxjQUFpQjtBQUFBLE1BQUNDLElBQUQsdUVBQWUsRUFBZjtBQUFBLFNBQXVCQSxJQUFJLENBQUNDLE1BQUwsR0FBYyxDQUFkLEdBQWtCRCxJQUFJLENBQUMsQ0FBRCxDQUF0QixHQUE0QkUsU0FBbkQ7QUFBQSxDQUF2Qjs7QUFFQSxJQUFNQyxPQUFPO0FBQUEscUZBQUcsaUJBQU9D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QixPQUFSLFNBQW9CcEIsSUFBcEIsRUE1Qm5COztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsNkJBNEIrQ29CLE9BNUIvQzs7QUFBQTtBQTJCZlMsY0FBQUEsWUEzQmU7O0FBQUEsb0JBOEJELE9BQU9QLE1BQVAsS0FBa0IsVUE5QmpCO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEscUJBOEJvQ25CLE9BQU8sTUFBUCxVQUFRbUIsTUFBUixTQUFtQnRCLElBQW5CLEVBOUJwQzs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLDZCQThCK0RzQixNQTlCL0Q7O0FBQUE7QUE4QmZRLGNBQUFBLFdBOUJlO0FBK0JmQyxjQUFBQSxJQS9CZSxtQ0ErQkZSLFNBQVMsSUFBSSxFQS9CWDtBQStCZ0JKLGdCQUFBQSxJQUFJLEVBQUVTLFNBL0J0QjtBQStCaUNSLGdCQUFBQSxPQUFPLEVBQUVTLFlBL0IxQztBQStCd0RSLGdCQUFBQSxNQUFNLEVBQU5BO0FBL0J4RDs7QUFpQ3JCLGtCQUFJUyxXQUFKLEVBQWlCO0FBQ2ZOLGdCQUFBQSxRQUFRLEdBQUcsZ0NBQWVBLFFBQWYsRUFBeUJNLFdBQXpCLENBQVg7QUFDRDs7QUFuQ29CLGdEQXFDZGxCLE9BQU8sQ0FBQ29CLEtBQVIsQ0FBY1IsUUFBZCxFQUF3Qk8sSUFBeEIsQ0FyQ2M7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBdkI7QUF3Q0EsV0FBT2YsT0FBUDtBQUNELEdBMUNELEVBMENHLEVBMUNILENBRDJCO0FBQUEsQ0FBdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21iaW5lUGF0aFdpdGhCYXNlIH0gZnJvbSAnLi9jb21iaW5lUGF0aFdpdGhCYXNlJztcbmltcG9ydCB7IEZldGNoZXIsIEZldGNoT3B0aW9ucyB9IGZyb20gJy4vZmV0Y2gtdHlwZXMnO1xuaW1wb3J0IHsgc2V0UXVlcnlQYXJhbXMgfSBmcm9tICcuL3VybC1oZWxwZXJzJztcblxuZXhwb3J0IGNvbnN0IGNvbWJpbmUgPSAoaG9zdDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgaG9zdCA9IGhvc3QucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgcmV0dXJuIGAke2hvc3R9LyR7cGF0aH1gO1xufTtcblxuY29uc3QgZ2V0RGVmYXVsdERhdGEgPSAoYXJnczogYW55W10gPSBbXSkgPT4gKGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3NbMF0gOiB1bmRlZmluZWQpO1xuXG5jb25zdCB0cnlDYWxsID0gYXN5bmMgKGZuOiBGdW5jdGlvbiwgLi4uYXJnczogYW55W10pID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IGZuTmFtZSA9IGZuID8gZm4ubmFtZSA6ICdhbm9ueW1vdXMnO1xuICAgIGNvbnNvbGUud2FybihgW0NyZWF0ZVNlcnZpY2UgRXJyb3JdICR7Zm5OYW1lfSBmYWlsZWQgd2l0aCBhcmdzOmAsIGFyZ3MpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm48VCBleHRlbmRzIEFycmF5PGFueT4+IHtcbiAgKC4uLmFyZ3M6IFQpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFNlcnZpY2VGbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+O1xuXG5leHBvcnQgdHlwZSBTdHJpbmdPckZuPFQgZXh0ZW5kcyBTZXJ2aWNlRm4+ID0gc3RyaW5nIHwgRm48UGFyYW1ldGVyczxUPj47XG5leHBvcnQgdHlwZSBPYmplY3RPckZuPFQgZXh0ZW5kcyBTZXJ2aWNlRm4+ID0gb2JqZWN0IHwgRm48UGFyYW1ldGVyczxUPj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpcHRvcjxLIGV4dGVuZHMgU2VydmljZUZuPiB7XG4gIHVybDogU3RyaW5nT3JGbjxLPjtcbiAgbWV0aG9kPzogJ0dFVCcgfCAnUE9TVCcgfCAnUFVUJyB8ICdERUxFVEUnIHwgJ1BBVENIJyB8ICdIRUFEJyB8ICdPUFRJT05TJyB8ICdUUkFDRScgfCAnQ09OTkVDVCc7XG4gIGJvZHk/OiBPYmplY3RPckZuPEs+O1xuICBoZWFkZXJzPzogT2JqZWN0T3JGbjxLPjtcbiAgcGFyYW1zPzogT2JqZWN0T3JGbjxLPjtcbiAgZmV0Y2hPcHRzPzogRmV0Y2hPcHRpb25zO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2aWNlRGVzY3JpcHRvcjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IERlc2NyaXB0b3I8VFtLXSBleHRlbmRzIFNlcnZpY2VGbiA/IFRbS10gOiBuZXZlcj47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVNlcnZpY2VBcmdzPFQ+IHtcbiAgZW5kcG9pbnRzOiBTZXJ2aWNlRGVzY3JpcHRvcjxUPjtcbiAgYmFzZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZmV0Y2hlcjogRmV0Y2hlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNlcnZpY2UgPSA8VD4oeyBlbmRwb2ludHMsIGJhc2VQYXRoLCBmZXRjaGVyIH06IENyZWF0ZVNlcnZpY2VBcmdzPFQ+KTogVCA9PlxuICBPYmplY3Qua2V5cyhlbmRwb2ludHMpLnJlZHVjZSgoc2VydmljZSwgc2VydmljZU5hbWUpID0+IHtcbiAgICBzZXJ2aWNlW3NlcnZpY2VOYW1lXSA9IGFzeW5jICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgY29uc3QgeyB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGhvZCwgcGFyYW1zLCBmZXRjaE9wdHMgfSA9XG4gICAgICAgIGVuZHBvaW50c1tzZXJ2aWNlTmFtZSBhcyBrZXlvZiBTZXJ2aWNlRGVzY3JpcHRvcjxUPl07XG5cbiAgICAgIGxldCB1cmxUb1VzZTogc3RyaW5nID0gdHlwZW9mIHVybCA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IHRyeUNhbGwodXJsLCAuLi5hcmdzKSA6IHVybDtcbiAgICAgIGlmICh0eXBlb2YgdXJsVG9Vc2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ1tDcmVhdGUgU2VydmljZSBFcnJvcl06IFVSTCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgc3RyaW5nJyxcbiAgICAgICAgICB1cmxUb1VzZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVUkwgbXVzdCBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHN0cmluZyBmb3IgbWV0aG9kICR7c2VydmljZU5hbWV9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IGRldGVjdCBhYnNvbHV0ZSB1cmxUb1VzZSBhbmQgcHJldmVudCBhZGRpbmcgdGhlIGJhc2UgcGF0aFxuICAgICAgaWYgKGJhc2VQYXRoKSB7XG4gICAgICAgIHVybFRvVXNlID0gY29tYmluZVBhdGhXaXRoQmFzZShiYXNlUGF0aCwgdXJsVG9Vc2UpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBnZXREZWZhdWx0ID0gKCkgPT4gKG1ldGhvZCAhPT0gJ0dFVCcgPyBnZXREZWZhdWx0RGF0YShhcmdzKSA6IHVuZGVmaW5lZCk7XG5cbiAgICAgIC8vIGlmIGRhdGEgaXMgYSBmdW5jdGlvbiB3ZSBwYXNzIGFsbCB0aGUgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbiBzbyBpdCBjcmVhdGVzXG4gICAgICAvLyB0aGUgcGF5bG9hZCB3aXRoIGFsbCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLCBleHBlY3RpbmcgaXQgdG8gcmV0dXJuIGEgc2luZ2xlIG9iamVjdFxuICAgICAgLy8gaWYgdGhlIGRhdGEgaXMgbm90IGEgZnVuY3Rpb24gdGhlbiB3ZSBnZXQgdGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXMgdGhlXG4gICAgICAvLyBkYXRhIHBheWxvYWQuIElmIHRoaXMgaXMgYW4gb2JqZWN0IGl0IHdpbGwgYmUgc2VyaWFsaXplZCB1c2luZyBqc29uIHN0cmluZ2lmeSBiZWZvcmUgc2VuZGluZyBpdFxuICAgICAgY29uc3QgYm9keVRvVXNlID0gdHlwZW9mIGJvZHkgPT09ICdmdW5jdGlvbicgPyBhd2FpdCB0cnlDYWxsKGJvZHksIC4uLmFyZ3MpIDogZ2V0RGVmYXVsdCgpO1xuICAgICAgY29uc3QgaGVhZGVyc1RvVXNlID1cbiAgICAgICAgdHlwZW9mIGhlYWRlcnMgPT09ICdmdW5jdGlvbicgPyBhd2FpdCB0cnlDYWxsKGhlYWRlcnMsIC4uLmFyZ3MpIDogaGVhZGVycztcblxuICAgICAgY29uc3QgcGFyYW1zVG9Vc2UgPSB0eXBlb2YgcGFyYW1zID09PSAnZnVuY3Rpb24nID8gYXdhaXQgdHJ5Q2FsbChwYXJhbXMsIC4uLmFyZ3MpIDogcGFyYW1zO1xuICAgICAgY29uc3Qgb3B0cyA9IHsgLi4uKGZldGNoT3B0cyB8fCB7fSksIGJvZHk6IGJvZHlUb1VzZSwgaGVhZGVyczogaGVhZGVyc1RvVXNlLCBtZXRob2QgfTtcblxuICAgICAgaWYgKHBhcmFtc1RvVXNlKSB7XG4gICAgICAgIHVybFRvVXNlID0gc2V0UXVlcnlQYXJhbXModXJsVG9Vc2UsIHBhcmFtc1RvVXNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZldGNoZXIuZmV0Y2godXJsVG9Vc2UsIG9wdHMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gc2VydmljZTtcbiAgfSwge30gYXMgYW55KTtcbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import { FetchFn } from './fetchJSON';
2
+ export type FetchJSONArgs = Parameters<typeof fetch>;
3
+ export type FetchURL = FetchJSONArgs[0];
4
+ export type FetchOptions = Exclude<FetchJSONArgs[1], null | undefined>;
5
+ export interface SerializeBodyProps<T> extends Omit<FetchOptions, 'body'> {
6
+ body?: FetchOptions['body'] | T;
7
+ serializeBody?: boolean;
8
+ }
9
+ export interface Fetcher {
10
+ fetch: FetchFn;
11
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,10 @@
1
+ import { FetchURL, SerializeBodyProps } from './fetch-types';
2
+ export interface ErrorData {
3
+ error: string;
4
+ }
5
+ export declare class ResponseError extends Error {
6
+ response?: Response;
7
+ data?: ErrorData;
8
+ }
9
+ export declare function fetchJSON<T, K>(url: FetchURL, params: SerializeBodyProps<K>): Promise<T>;
10
+ export type FetchFn = typeof fetchJSON;
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ResponseError = void 0;
9
+ exports.fetchJSON = fetchJSON;
10
+
11
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
+
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
+
15
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
16
+
17
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
18
+
19
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
20
+
21
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
22
+
23
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
24
+
25
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
26
+
27
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
28
+
29
+ var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
30
+
31
+ var _excluded = ["serializeBody", "method"];
32
+
33
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
34
+
35
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
36
+
37
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
38
+
39
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
40
+
41
+ var ResponseError = /*#__PURE__*/function (_Error) {
42
+ (0, _inherits2.default)(ResponseError, _Error);
43
+
44
+ var _super = _createSuper(ResponseError);
45
+
46
+ function ResponseError() {
47
+ (0, _classCallCheck2.default)(this, ResponseError);
48
+ return _super.apply(this, arguments);
49
+ }
50
+
51
+ return (0, _createClass2.default)(ResponseError);
52
+ }( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
53
+
54
+ exports.ResponseError = ResponseError;
55
+
56
+ function fetchJSON(_x, _x2) {
57
+ return _fetchJSON.apply(this, arguments);
58
+ }
59
+
60
+ function _fetchJSON() {
61
+ _fetchJSON = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(url, params) {
62
+ var _params$serializeBody, serializeBody, method, rest, fetchMethod, props, resp, _data, error, data;
63
+
64
+ return _regenerator.default.wrap(function _callee$(_context) {
65
+ while (1) {
66
+ switch (_context.prev = _context.next) {
67
+ case 0:
68
+ _params$serializeBody = params.serializeBody, serializeBody = _params$serializeBody === void 0 ? true : _params$serializeBody, method = params.method, rest = (0, _objectWithoutProperties2.default)(params, _excluded);
69
+ fetchMethod = method !== null && method !== void 0 ? method : 'GET';
70
+ props = _objectSpread(_objectSpread({}, rest), {}, {
71
+ method: fetchMethod,
72
+ headers: _objectSpread({
73
+ 'Content-type': 'application/json'
74
+ }, rest.headers),
75
+ body: fetchMethod === 'GET' ? undefined : serializeBody ? JSON.stringify(params === null || params === void 0 ? void 0 : params.body) : params === null || params === void 0 ? void 0 : params.body
76
+ });
77
+ _context.prev = 3;
78
+ _context.next = 6;
79
+ return fetch(url, props);
80
+
81
+ case 6:
82
+ resp = _context.sent;
83
+
84
+ if (!(resp.status < 200 || resp.status > 300)) {
85
+ _context.next = 21;
86
+ break;
87
+ }
88
+
89
+ _context.prev = 8;
90
+ _context.next = 11;
91
+ return resp.json();
92
+
93
+ case 11:
94
+ _data = _context.sent;
95
+ _context.next = 17;
96
+ break;
97
+
98
+ case 14:
99
+ _context.prev = 14;
100
+ _context.t0 = _context["catch"](8);
101
+ _data = {
102
+ error: 'JSON_ERROR_NOT_RECEIVED'
103
+ };
104
+
105
+ case 17:
106
+ error = new ResponseError(_data.error);
107
+ error.response = resp;
108
+ error.data = _data;
109
+ throw error;
110
+
111
+ case 21:
112
+ _context.next = 23;
113
+ return resp.json();
114
+
115
+ case 23:
116
+ data = _context.sent;
117
+ return _context.abrupt("return", data);
118
+
119
+ case 27:
120
+ _context.prev = 27;
121
+ _context.t1 = _context["catch"](3);
122
+ console.error('>>> err', _context.t1);
123
+ throw _context.t1;
124
+
125
+ case 31:
126
+ case "end":
127
+ return _context.stop();
128
+ }
129
+ }
130
+ }, _callee, null, [[3, 27], [8, 14]]);
131
+ }));
132
+ return _fetchJSON.apply(this, arguments);
133
+ }
134
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9mZXRjaEpTT04udHMiXSwibmFtZXMiOlsiUmVzcG9uc2VFcnJvciIsIkVycm9yIiwiZmV0Y2hKU09OIiwidXJsIiwicGFyYW1zIiwic2VyaWFsaXplQm9keSIsIm1ldGhvZCIsInJlc3QiLCJmZXRjaE1ldGhvZCIsInByb3BzIiwiaGVhZGVycyIsImJvZHkiLCJ1bmRlZmluZWQiLCJKU09OIiwic3RyaW5naWZ5IiwiZmV0Y2giLCJyZXNwIiwic3RhdHVzIiwianNvbiIsImRhdGEiLCJlcnJvciIsInJlc3BvbnNlIiwiY29uc29sZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUthQSxhOzs7Ozs7Ozs7OzsrQ0FBc0JDLEs7Ozs7U0FNYkMsUzs7Ozs7dUZBQWYsaUJBQStCQyxHQUEvQixFQUE4Q0MsTUFBOUM7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9DQUM2Q0EsTUFEN0MsQ0FDR0MsYUFESCxFQUNHQSxhQURILHNDQUNtQixJQURuQiwwQkFDeUJDLE1BRHpCLEdBQzZDRixNQUQ3QyxDQUN5QkUsTUFEekIsRUFDb0NDLElBRHBDLDBDQUM2Q0gsTUFEN0M7QUFFQ0ksWUFBQUEsV0FGRCxHQUVlRixNQUZmLGFBRWVBLE1BRmYsY0FFZUEsTUFGZixHQUV5QixLQUZ6QjtBQUlDRyxZQUFBQSxLQUpELG1DQUtBRixJQUxBO0FBTUhELGNBQUFBLE1BQU0sRUFBRUUsV0FOTDtBQU9IRSxjQUFBQSxPQUFPO0FBQ0wsZ0NBQWdCO0FBRFgsaUJBRUZILElBQUksQ0FBQ0csT0FGSCxDQVBKO0FBV0hDLGNBQUFBLElBQUksRUFDRkgsV0FBVyxLQUFLLEtBQWhCLEdBQ0lJLFNBREosR0FFTVAsYUFBYSxHQUFHUSxJQUFJLENBQUNDLFNBQUwsQ0FBZVYsTUFBZixhQUFlQSxNQUFmLHVCQUFlQSxNQUFNLENBQUVPLElBQXZCLENBQUgsR0FBa0NQLE1BQWxDLGFBQWtDQSxNQUFsQyx1QkFBa0NBLE1BQU0sQ0FBRU87QUFkNUQ7QUFBQTtBQUFBO0FBQUEsbUJBa0JnQkksS0FBSyxDQUFDWixHQUFELEVBQU1NLEtBQU4sQ0FsQnJCOztBQUFBO0FBa0JHTyxZQUFBQSxJQWxCSDs7QUFBQSxrQkFtQkNBLElBQUksQ0FBQ0MsTUFBTCxHQUFjLEdBQWQsSUFBcUJELElBQUksQ0FBQ0MsTUFBTCxHQUFjLEdBbkJwQztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUEsbUJBc0JjRCxJQUFJLENBQUNFLElBQUwsRUF0QmQ7O0FBQUE7QUFzQkNDLFlBQUFBLEtBdEJEO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUF3QkNBLFlBQUFBLEtBQUksR0FBRztBQUFFQyxjQUFBQSxLQUFLLEVBQUU7QUFBVCxhQUFQOztBQXhCRDtBQTBCS0EsWUFBQUEsS0ExQkwsR0EwQmEsSUFBSXBCLGFBQUosQ0FBa0JtQixLQUFJLENBQUNDLEtBQXZCLENBMUJiO0FBMkJEQSxZQUFBQSxLQUFLLENBQUNDLFFBQU4sR0FBaUJMLElBQWpCO0FBQ0FJLFlBQUFBLEtBQUssQ0FBQ0QsSUFBTixHQUFhQSxLQUFiO0FBNUJDLGtCQThCS0MsS0E5Qkw7O0FBQUE7QUFBQTtBQUFBLG1CQWdDZ0JKLElBQUksQ0FBQ0UsSUFBTCxFQWhDaEI7O0FBQUE7QUFnQ0dDLFlBQUFBLElBaENIO0FBQUEsNkNBaUNJQSxJQWpDSjs7QUFBQTtBQUFBO0FBQUE7QUFtQ0hHLFlBQUFBLE9BQU8sQ0FBQ0YsS0FBUixDQUFjLFNBQWQ7QUFuQ0c7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZldGNoT3B0aW9ucywgRmV0Y2hVUkwsIFNlcmlhbGl6ZUJvZHlQcm9wcyB9IGZyb20gJy4vZmV0Y2gtdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yRGF0YSB7XG4gIGVycm9yOiBzdHJpbmc7XG59XG5leHBvcnQgY2xhc3MgUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVzcG9uc2U/OiBSZXNwb25zZTtcblxuICBkYXRhPzogRXJyb3JEYXRhO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hKU09OPFQsIEs+KHVybDogRmV0Y2hVUkwsIHBhcmFtczogU2VyaWFsaXplQm9keVByb3BzPEs+KTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHsgc2VyaWFsaXplQm9keSA9IHRydWUsIG1ldGhvZCwgLi4ucmVzdCB9ID0gcGFyYW1zO1xuICBjb25zdCBmZXRjaE1ldGhvZCA9IG1ldGhvZCA/PyAnR0VUJztcblxuICBjb25zdCBwcm9wczogRmV0Y2hPcHRpb25zID0ge1xuICAgIC4uLnJlc3QsXG4gICAgbWV0aG9kOiBmZXRjaE1ldGhvZCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgLi4ucmVzdC5oZWFkZXJzLFxuICAgIH0sXG4gICAgYm9keTpcbiAgICAgIGZldGNoTWV0aG9kID09PSAnR0VUJ1xuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6ICgoc2VyaWFsaXplQm9keSA/IEpTT04uc3RyaW5naWZ5KHBhcmFtcz8uYm9keSkgOiBwYXJhbXM/LmJvZHkpIGFzIEZldGNoT3B0aW9uc1snYm9keSddKSxcbiAgfTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHByb3BzKTtcbiAgICBpZiAocmVzcC5zdGF0dXMgPCAyMDAgfHwgcmVzcC5zdGF0dXMgPiAzMDApIHtcbiAgICAgIGxldCBkYXRhOiBFcnJvckRhdGE7XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgICAgIGRhdGEgPSB7IGVycm9yOiAnSlNPTl9FUlJPUl9OT1RfUkVDRUlWRUQnIH07XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBSZXNwb25zZUVycm9yKGRhdGEuZXJyb3IpO1xuICAgICAgZXJyb3IucmVzcG9uc2UgPSByZXNwO1xuICAgICAgZXJyb3IuZGF0YSA9IGRhdGE7XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJz4+PiBlcnInLCBlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBGZXRjaEZuID0gdHlwZW9mIGZldGNoSlNPTjtcbiJdfQ==
@@ -0,0 +1,8 @@
1
+ export * from './create-service';
2
+ export * from './fetch-types';
3
+ export * from './fetchJSON';
4
+ export * from './withRetries';
5
+ export * from './combinePathWithBase';
6
+ export * from './url-helpers';
7
+ export * from './try-parse';
8
+ export * from './ls';
package/dist/index.js ADDED
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _createService = require("./create-service");
8
+
9
+ Object.keys(_createService).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _createService[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _createService[key];
16
+ }
17
+ });
18
+ });
19
+
20
+ var _fetchTypes = require("./fetch-types");
21
+
22
+ Object.keys(_fetchTypes).forEach(function (key) {
23
+ if (key === "default" || key === "__esModule") return;
24
+ if (key in exports && exports[key] === _fetchTypes[key]) return;
25
+ Object.defineProperty(exports, key, {
26
+ enumerable: true,
27
+ get: function get() {
28
+ return _fetchTypes[key];
29
+ }
30
+ });
31
+ });
32
+
33
+ var _fetchJSON = require("./fetchJSON");
34
+
35
+ Object.keys(_fetchJSON).forEach(function (key) {
36
+ if (key === "default" || key === "__esModule") return;
37
+ if (key in exports && exports[key] === _fetchJSON[key]) return;
38
+ Object.defineProperty(exports, key, {
39
+ enumerable: true,
40
+ get: function get() {
41
+ return _fetchJSON[key];
42
+ }
43
+ });
44
+ });
45
+
46
+ var _withRetries = require("./withRetries");
47
+
48
+ Object.keys(_withRetries).forEach(function (key) {
49
+ if (key === "default" || key === "__esModule") return;
50
+ if (key in exports && exports[key] === _withRetries[key]) return;
51
+ Object.defineProperty(exports, key, {
52
+ enumerable: true,
53
+ get: function get() {
54
+ return _withRetries[key];
55
+ }
56
+ });
57
+ });
58
+
59
+ var _combinePathWithBase = require("./combinePathWithBase");
60
+
61
+ Object.keys(_combinePathWithBase).forEach(function (key) {
62
+ if (key === "default" || key === "__esModule") return;
63
+ if (key in exports && exports[key] === _combinePathWithBase[key]) return;
64
+ Object.defineProperty(exports, key, {
65
+ enumerable: true,
66
+ get: function get() {
67
+ return _combinePathWithBase[key];
68
+ }
69
+ });
70
+ });
71
+
72
+ var _urlHelpers = require("./url-helpers");
73
+
74
+ Object.keys(_urlHelpers).forEach(function (key) {
75
+ if (key === "default" || key === "__esModule") return;
76
+ if (key in exports && exports[key] === _urlHelpers[key]) return;
77
+ Object.defineProperty(exports, key, {
78
+ enumerable: true,
79
+ get: function get() {
80
+ return _urlHelpers[key];
81
+ }
82
+ });
83
+ });
84
+
85
+ var _tryParse = require("./try-parse");
86
+
87
+ Object.keys(_tryParse).forEach(function (key) {
88
+ if (key === "default" || key === "__esModule") return;
89
+ if (key in exports && exports[key] === _tryParse[key]) return;
90
+ Object.defineProperty(exports, key, {
91
+ enumerable: true,
92
+ get: function get() {
93
+ return _tryParse[key];
94
+ }
95
+ });
96
+ });
97
+
98
+ var _ls = require("./ls");
99
+
100
+ Object.keys(_ls).forEach(function (key) {
101
+ if (key === "default" || key === "__esModule") return;
102
+ if (key in exports && exports[key] === _ls[key]) return;
103
+ Object.defineProperty(exports, key, {
104
+ enumerable: true,
105
+ get: function get() {
106
+ return _ls[key];
107
+ }
108
+ });
109
+ });
110
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY3JlYXRlLXNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9mZXRjaC10eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2ZldGNoSlNPTic7XG5leHBvcnQgKiBmcm9tICcuL3dpdGhSZXRyaWVzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tYmluZVBhdGhXaXRoQmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL3VybC1oZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vdHJ5LXBhcnNlJztcbmV4cG9ydCAqIGZyb20gJy4vbHMnO1xuIl19
package/dist/ls.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare const getItem: <T>(key: string, defaultValue: T) => {} | T;
2
+ export declare const setItem: <T>(key: string, entity: T) => void;
3
+ export declare const removeItem: (key: string) => void;
package/dist/ls.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.setItem = exports.removeItem = exports.getItem = void 0;
7
+
8
+ var _tryParse2 = require("./try-parse");
9
+
10
+ var getItem = function getItem(key, defaultValue) {
11
+ var _tryParse;
12
+
13
+ var entity = localStorage.getItem(key);
14
+ return (_tryParse = (0, _tryParse2.tryParse)(entity)) !== null && _tryParse !== void 0 ? _tryParse : defaultValue;
15
+ };
16
+
17
+ exports.getItem = getItem;
18
+
19
+ var setItem = function setItem(key, entity) {
20
+ var str = JSON.stringify(entity);
21
+ localStorage.setItem(key, str);
22
+ };
23
+
24
+ exports.setItem = setItem;
25
+
26
+ var removeItem = function removeItem(key) {
27
+ localStorage.removeItem(key);
28
+ };
29
+
30
+ exports.removeItem = removeItem;
31
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9scy50cyJdLCJuYW1lcyI6WyJnZXRJdGVtIiwia2V5IiwiZGVmYXVsdFZhbHVlIiwiZW50aXR5IiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInN0ciIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZW1vdmVJdGVtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBRU8sSUFBTUEsT0FBTyxHQUFHLFNBQVZBLE9BQVUsQ0FBSUMsR0FBSixFQUFpQkMsWUFBakIsRUFBcUM7QUFBQTs7QUFDMUQsTUFBTUMsTUFBTSxHQUFHQyxZQUFZLENBQUNKLE9BQWIsQ0FBcUJDLEdBQXJCLENBQWY7QUFFQSxzQkFBTyx5QkFBU0UsTUFBVCxDQUFQLGlEQUEyQkQsWUFBM0I7QUFDRCxDQUpNOzs7O0FBTUEsSUFBTUcsT0FBTyxHQUFHLFNBQVZBLE9BQVUsQ0FBSUosR0FBSixFQUFpQkUsTUFBakIsRUFBK0I7QUFDcEQsTUFBTUcsR0FBRyxHQUFHQyxJQUFJLENBQUNDLFNBQUwsQ0FBZUwsTUFBZixDQUFaO0FBRUFDLEVBQUFBLFlBQVksQ0FBQ0MsT0FBYixDQUFxQkosR0FBckIsRUFBMEJLLEdBQTFCO0FBQ0QsQ0FKTTs7OztBQU1BLElBQU1HLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUNSLEdBQUQsRUFBaUI7QUFDekNHLEVBQUFBLFlBQVksQ0FBQ0ssVUFBYixDQUF3QlIsR0FBeEI7QUFDRCxDQUZNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHJ5UGFyc2UgfSBmcm9tICcuL3RyeS1wYXJzZSc7XG5cbmV4cG9ydCBjb25zdCBnZXRJdGVtID0gPFQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IFQpID0+IHtcbiAgY29uc3QgZW50aXR5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcblxuICByZXR1cm4gdHJ5UGFyc2UoZW50aXR5KSA/PyBkZWZhdWx0VmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0SXRlbSA9IDxUPihrZXk6IHN0cmluZywgZW50aXR5OiBUKSA9PiB7XG4gIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGVudGl0eSk7XG5cbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBzdHIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUl0ZW0gPSAoa2V5OiBzdHJpbmcpID0+IHtcbiAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbn07XG4iXX0=
@@ -0,0 +1 @@
1
+ export declare const tryParse: <T>(val: string | null, def?: T) => T | undefined;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.tryParse = void 0;
7
+
8
+ var tryParse = function tryParse(val, def) {
9
+ try {
10
+ return JSON.parse(val);
11
+ } catch (err) {
12
+ return def;
13
+ }
14
+ };
15
+
16
+ exports.tryParse = tryParse;
17
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90cnktcGFyc2UudHMiXSwibmFtZXMiOlsidHJ5UGFyc2UiLCJ2YWwiLCJkZWYiLCJKU09OIiwicGFyc2UiLCJlcnIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBTyxJQUFNQSxRQUFRLEdBQUcsU0FBWEEsUUFBVyxDQUFJQyxHQUFKLEVBQXdCQyxHQUF4QixFQUFvQztBQUMxRCxNQUFJO0FBQ0YsV0FBT0MsSUFBSSxDQUFDQyxLQUFMLENBQVdILEdBQVgsQ0FBUDtBQUNELEdBRkQsQ0FFRSxPQUFPSSxHQUFQLEVBQVk7QUFDWixXQUFPSCxHQUFQO0FBQ0Q7QUFDRixDQU5NIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyeVBhcnNlID0gPFQ+KHZhbDogc3RyaW5nIHwgbnVsbCwgZGVmPzogVCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHZhbCEpIGFzIFQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBkZWY7XG4gIH1cbn07XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export declare const paramsToURLSearchParams: <T extends object>(params: T, urlParams?: URLSearchParams) => URLSearchParams;
2
+ export declare const setQueryParams: <T extends object>(url: string, params: T) => string;
3
+ export declare const removeQueryParam: (url: string, params: string[]) => string;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.setQueryParams = exports.removeQueryParam = exports.paramsToURLSearchParams = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var paramsToURLSearchParams = function paramsToURLSearchParams(params, urlParams) {
13
+ var urlSearchParams = urlParams !== null && urlParams !== void 0 ? urlParams : new URLSearchParams();
14
+ var keys = Object.keys(params);
15
+ keys.forEach(function (key) {
16
+ var val = params[key];
17
+
18
+ if (typeof val !== 'undefined') {
19
+ urlSearchParams.set(key, "".concat(val));
20
+ }
21
+ });
22
+ return urlSearchParams;
23
+ };
24
+
25
+ exports.paramsToURLSearchParams = paramsToURLSearchParams;
26
+
27
+ var setQueryParams = function setQueryParams(url, params) {
28
+ var _url$split = url.split(/\?/),
29
+ _url$split2 = (0, _slicedToArray2.default)(_url$split, 2),
30
+ baseString = _url$split2[0],
31
+ searchString = _url$split2[1];
32
+
33
+ var urlParams = new URLSearchParams(searchString);
34
+ var mergeParams = paramsToURLSearchParams(params, urlParams);
35
+ var parts = [baseString];
36
+ var paramsToAdd = mergeParams.toString();
37
+
38
+ if (paramsToAdd.length > 0) {
39
+ parts.push("?".concat(paramsToAdd));
40
+ }
41
+
42
+ return parts.join('');
43
+ };
44
+
45
+ exports.setQueryParams = setQueryParams;
46
+
47
+ var removeQueryParam = function removeQueryParam(url, params) {
48
+ var _url$split3 = url.split(/\?/),
49
+ _url$split4 = (0, _slicedToArray2.default)(_url$split3, 2),
50
+ baseString = _url$split4[0],
51
+ searchString = _url$split4[1];
52
+
53
+ var urlParams = new URLSearchParams(searchString);
54
+ params.forEach(function (param) {
55
+ urlParams.delete(param);
56
+ });
57
+ var parts = [baseString];
58
+ var paramsToAdd = urlParams.toString();
59
+
60
+ if (paramsToAdd.length > 0) {
61
+ parts.push("?".concat(paramsToAdd));
62
+ }
63
+
64
+ return parts.join('');
65
+ };
66
+
67
+ exports.removeQueryParam = removeQueryParam;
68
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91cmwtaGVscGVycy50cyJdLCJuYW1lcyI6WyJwYXJhbXNUb1VSTFNlYXJjaFBhcmFtcyIsInBhcmFtcyIsInVybFBhcmFtcyIsInVybFNlYXJjaFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsImtleXMiLCJPYmplY3QiLCJmb3JFYWNoIiwia2V5IiwidmFsIiwic2V0Iiwic2V0UXVlcnlQYXJhbXMiLCJ1cmwiLCJzcGxpdCIsImJhc2VTdHJpbmciLCJzZWFyY2hTdHJpbmciLCJtZXJnZVBhcmFtcyIsInBhcnRzIiwicGFyYW1zVG9BZGQiLCJ0b1N0cmluZyIsImxlbmd0aCIsInB1c2giLCJqb2luIiwicmVtb3ZlUXVlcnlQYXJhbSIsInBhcmFtIiwiZGVsZXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFPLElBQU1BLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBMEIsQ0FDckNDLE1BRHFDLEVBRXJDQyxTQUZxQyxFQUdsQztBQUNILE1BQU1DLGVBQWUsR0FBR0QsU0FBSCxhQUFHQSxTQUFILGNBQUdBLFNBQUgsR0FBZ0IsSUFBSUUsZUFBSixFQUFyQztBQUVBLE1BQU1DLElBQUksR0FBR0MsTUFBTSxDQUFDRCxJQUFQLENBQVlKLE1BQVosQ0FBYjtBQUNBSSxFQUFBQSxJQUFJLENBQUNFLE9BQUwsQ0FBYSxVQUFDQyxHQUFELEVBQVM7QUFDcEIsUUFBTUMsR0FBRyxHQUFHUixNQUFNLENBQUNPLEdBQUQsQ0FBbEI7O0FBQ0EsUUFBSSxPQUFPQyxHQUFQLEtBQWUsV0FBbkIsRUFBZ0M7QUFDOUJOLE1BQUFBLGVBQWUsQ0FBQ08sR0FBaEIsQ0FBb0JGLEdBQXBCLFlBQTRCQyxHQUE1QjtBQUNEO0FBQ0YsR0FMRDtBQU9BLFNBQU9OLGVBQVA7QUFDRCxDQWZNOzs7O0FBaUJBLElBQU1RLGNBQWMsR0FBRyxTQUFqQkEsY0FBaUIsQ0FBbUJDLEdBQW5CLEVBQWdDWCxNQUFoQyxFQUE4QztBQUMxRSxtQkFBbUNXLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLElBQVYsQ0FBbkM7QUFBQTtBQUFBLE1BQU9DLFVBQVA7QUFBQSxNQUFtQkMsWUFBbkI7O0FBRUEsTUFBTWIsU0FBUyxHQUFHLElBQUlFLGVBQUosQ0FBb0JXLFlBQXBCLENBQWxCO0FBQ0EsTUFBTUMsV0FBVyxHQUFHaEIsdUJBQXVCLENBQUNDLE1BQUQsRUFBU0MsU0FBVCxDQUEzQztBQUVBLE1BQU1lLEtBQUssR0FBRyxDQUFDSCxVQUFELENBQWQ7QUFFQSxNQUFNSSxXQUFXLEdBQUdGLFdBQVcsQ0FBQ0csUUFBWixFQUFwQjs7QUFFQSxNQUFJRCxXQUFXLENBQUNFLE1BQVosR0FBcUIsQ0FBekIsRUFBNEI7QUFDMUJILElBQUFBLEtBQUssQ0FBQ0ksSUFBTixZQUFlSCxXQUFmO0FBQ0Q7O0FBRUQsU0FBT0QsS0FBSyxDQUFDSyxJQUFOLENBQVcsRUFBWCxDQUFQO0FBQ0QsQ0FmTTs7OztBQWlCQSxJQUFNQyxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQW1CLENBQUNYLEdBQUQsRUFBY1gsTUFBZCxFQUFtQztBQUNqRSxvQkFBbUNXLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLElBQVYsQ0FBbkM7QUFBQTtBQUFBLE1BQU9DLFVBQVA7QUFBQSxNQUFtQkMsWUFBbkI7O0FBRUEsTUFBTWIsU0FBUyxHQUFHLElBQUlFLGVBQUosQ0FBb0JXLFlBQXBCLENBQWxCO0FBRUFkLEVBQUFBLE1BQU0sQ0FBQ00sT0FBUCxDQUFlLFVBQUNpQixLQUFELEVBQVc7QUFDeEJ0QixJQUFBQSxTQUFTLENBQUN1QixNQUFWLENBQWlCRCxLQUFqQjtBQUNELEdBRkQ7QUFJQSxNQUFNUCxLQUFLLEdBQUcsQ0FBQ0gsVUFBRCxDQUFkO0FBRUEsTUFBTUksV0FBVyxHQUFHaEIsU0FBUyxDQUFDaUIsUUFBVixFQUFwQjs7QUFFQSxNQUFJRCxXQUFXLENBQUNFLE1BQVosR0FBcUIsQ0FBekIsRUFBNEI7QUFDMUJILElBQUFBLEtBQUssQ0FBQ0ksSUFBTixZQUFlSCxXQUFmO0FBQ0Q7O0FBRUQsU0FBT0QsS0FBSyxDQUFDSyxJQUFOLENBQVcsRUFBWCxDQUFQO0FBQ0QsQ0FsQk0iLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgcGFyYW1zVG9VUkxTZWFyY2hQYXJhbXMgPSA8VCBleHRlbmRzIG9iamVjdD4oXG4gIHBhcmFtczogVCxcbiAgdXJsUGFyYW1zPzogVVJMU2VhcmNoUGFyYW1zLFxuKSA9PiB7XG4gIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IHVybFBhcmFtcyA/PyBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtcyk7XG4gIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgdmFsID0gcGFyYW1zW2tleSBhcyBrZXlvZiBUXTtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHVybFNlYXJjaFBhcmFtcy5zZXQoa2V5LCBgJHt2YWx9YCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdXJsU2VhcmNoUGFyYW1zO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFF1ZXJ5UGFyYW1zID0gPFQgZXh0ZW5kcyBvYmplY3Q+KHVybDogc3RyaW5nLCBwYXJhbXM6IFQpID0+IHtcbiAgY29uc3QgW2Jhc2VTdHJpbmcsIHNlYXJjaFN0cmluZ10gPSB1cmwuc3BsaXQoL1xcPy8pO1xuXG4gIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoU3RyaW5nKTtcbiAgY29uc3QgbWVyZ2VQYXJhbXMgPSBwYXJhbXNUb1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIHVybFBhcmFtcyk7XG5cbiAgY29uc3QgcGFydHMgPSBbYmFzZVN0cmluZ107XG5cbiAgY29uc3QgcGFyYW1zVG9BZGQgPSBtZXJnZVBhcmFtcy50b1N0cmluZygpO1xuXG4gIGlmIChwYXJhbXNUb0FkZC5sZW5ndGggPiAwKSB7XG4gICAgcGFydHMucHVzaChgPyR7cGFyYW1zVG9BZGR9YCk7XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJyk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlUXVlcnlQYXJhbSA9ICh1cmw6IHN0cmluZywgcGFyYW1zOiBzdHJpbmdbXSkgPT4ge1xuICBjb25zdCBbYmFzZVN0cmluZywgc2VhcmNoU3RyaW5nXSA9IHVybC5zcGxpdCgvXFw/Lyk7XG5cbiAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhzZWFyY2hTdHJpbmcpO1xuXG4gIHBhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgIHVybFBhcmFtcy5kZWxldGUocGFyYW0pO1xuICB9KTtcblxuICBjb25zdCBwYXJ0cyA9IFtiYXNlU3RyaW5nXTtcblxuICBjb25zdCBwYXJhbXNUb0FkZCA9IHVybFBhcmFtcy50b1N0cmluZygpO1xuXG4gIGlmIChwYXJhbXNUb0FkZC5sZW5ndGggPiAwKSB7XG4gICAgcGFydHMucHVzaChgPyR7cGFyYW1zVG9BZGR9YCk7XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJyk7XG59O1xuIl19
@@ -0,0 +1,6 @@
1
+ export interface WithRetriesOpts<K> {
2
+ retries?: number;
3
+ onFail?: (error: Error, args: K) => Promise<void> | void;
4
+ onTryError?: (error: Error, args: K, attemptIndex: number) => Promise<void> | void;
5
+ }
6
+ export declare const withRetries: <K extends any[], T>(fn: (...args: K) => Promise<T>, { retries, onTryError, onFail }?: WithRetriesOpts<K>) => (...args: K) => Promise<T>;
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.withRetries = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var withRetries = function withRetries(fn) {
15
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
16
+ _ref$retries = _ref.retries,
17
+ retries = _ref$retries === void 0 ? 2 : _ref$retries,
18
+ onTryError = _ref.onTryError,
19
+ onFail = _ref.onFail;
20
+
21
+ var retFn = /*#__PURE__*/function () {
22
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
23
+ var attemptIndex,
24
+ _len,
25
+ args,
26
+ _key,
27
+ ret,
28
+ _args = arguments;
29
+
30
+ return _regenerator.default.wrap(function _callee$(_context) {
31
+ while (1) {
32
+ switch (_context.prev = _context.next) {
33
+ case 0:
34
+ attemptIndex = 0;
35
+
36
+ for (_len = _args.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
37
+ args[_key] = _args[_key];
38
+ }
39
+
40
+ case 2:
41
+ if (!(attemptIndex < retries)) {
42
+ _context.next = 30;
43
+ break;
44
+ }
45
+
46
+ _context.prev = 3;
47
+ _context.next = 6;
48
+ return fn.apply(void 0, args);
49
+
50
+ case 6:
51
+ ret = _context.sent;
52
+ return _context.abrupt("return", ret);
53
+
54
+ case 10:
55
+ _context.prev = 10;
56
+ _context.t0 = _context["catch"](3);
57
+
58
+ if (!(attemptIndex < retries)) {
59
+ _context.next = 23;
60
+ break;
61
+ }
62
+
63
+ _context.prev = 13;
64
+ _context.next = 16;
65
+ return onTryError === null || onTryError === void 0 ? void 0 : onTryError(_context.t0, args, attemptIndex);
66
+
67
+ case 16:
68
+ _context.next = 23;
69
+ break;
70
+
71
+ case 18:
72
+ _context.prev = 18;
73
+ _context.t1 = _context["catch"](13);
74
+ _context.next = 22;
75
+ return onFail === null || onFail === void 0 ? void 0 : onFail(_context.t1, args);
76
+
77
+ case 22:
78
+ throw _context.t1;
79
+
80
+ case 23:
81
+ attemptIndex += 1;
82
+
83
+ if (!(attemptIndex >= retries)) {
84
+ _context.next = 28;
85
+ break;
86
+ }
87
+
88
+ _context.next = 27;
89
+ return onFail === null || onFail === void 0 ? void 0 : onFail(_context.t0, args);
90
+
91
+ case 27:
92
+ throw _context.t0;
93
+
94
+ case 28:
95
+ _context.next = 2;
96
+ break;
97
+
98
+ case 30:
99
+ case "end":
100
+ return _context.stop();
101
+ }
102
+ }
103
+ }, _callee, null, [[3, 10], [13, 18]]);
104
+ }));
105
+
106
+ return function retFn() {
107
+ return _ref2.apply(this, arguments);
108
+ };
109
+ }();
110
+
111
+ return retFn;
112
+ };
113
+
114
+ exports.withRetries = withRetries;
115
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93aXRoUmV0cmllcy50cyJdLCJuYW1lcyI6WyJ3aXRoUmV0cmllcyIsImZuIiwicmV0cmllcyIsIm9uVHJ5RXJyb3IiLCJvbkZhaWwiLCJyZXRGbiIsImF0dGVtcHRJbmRleCIsImFyZ3MiLCJyZXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFNTyxJQUFNQSxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUN6QkMsRUFEeUIsRUFHdEI7QUFBQSxpRkFEdUQsRUFDdkQ7QUFBQSwwQkFEREMsT0FDQztBQUFBLE1BRERBLE9BQ0MsNkJBRFMsQ0FDVDtBQUFBLE1BRFlDLFVBQ1osUUFEWUEsVUFDWjtBQUFBLE1BRHdCQyxNQUN4QixRQUR3QkEsTUFDeEI7O0FBQ0gsTUFBTUMsS0FBSztBQUFBLHdGQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1JDLGNBQUFBLFlBRFEsR0FDTyxDQURQOztBQUFBLHdDQUFVQyxJQUFWO0FBQVVBLGdCQUFBQSxJQUFWO0FBQUE7O0FBQUE7QUFBQSxvQkFHTEQsWUFBWSxHQUFHSixPQUhWO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQSxxQkFLVUQsRUFBRSxNQUFGLFNBQU1NLElBQU4sQ0FMVjs7QUFBQTtBQUtGQyxjQUFBQSxHQUxFO0FBQUEsK0NBT0RBLEdBUEM7O0FBQUE7QUFBQTtBQUFBOztBQUFBLG9CQVNKRixZQUFZLEdBQUdKLE9BVFg7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBLHFCQVdFQyxVQVhGLGFBV0VBLFVBWEYsdUJBV0VBLFVBQVUsY0FBaUJJLElBQWpCLEVBQXVCRCxZQUF2QixDQVhaOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQWFFRixNQWJGLGFBYUVBLE1BYkYsdUJBYUVBLE1BQU0sY0FBbUJHLElBQW5CLENBYlI7O0FBQUE7QUFBQTs7QUFBQTtBQWlCUkQsY0FBQUEsWUFBWSxJQUFJLENBQWhCOztBQWpCUSxvQkFrQkpBLFlBQVksSUFBSUosT0FsQlo7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxxQkFtQkFFLE1BbkJBLGFBbUJBQSxNQW5CQSx1QkFtQkFBLE1BQU0sY0FBaUJHLElBQWpCLENBbkJOOztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBQUg7O0FBQUEsb0JBQUxGLEtBQUs7QUFBQTtBQUFBO0FBQUEsS0FBWDs7QUEwQkEsU0FBT0EsS0FBUDtBQUNELENBL0JNIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBXaXRoUmV0cmllc09wdHM8Sz4ge1xuICByZXRyaWVzPzogbnVtYmVyO1xuICBvbkZhaWw/OiAoZXJyb3I6IEVycm9yLCBhcmdzOiBLKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgb25UcnlFcnJvcj86IChlcnJvcjogRXJyb3IsIGFyZ3M6IEssIGF0dGVtcHRJbmRleDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IHdpdGhSZXRyaWVzID0gPEsgZXh0ZW5kcyBhbnlbXSwgVD4oXG4gIGZuOiAoLi4uYXJnczogSykgPT4gUHJvbWlzZTxUPixcbiAgeyByZXRyaWVzID0gMiwgb25UcnlFcnJvciwgb25GYWlsIH06IFdpdGhSZXRyaWVzT3B0czxLPiA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHJldEZuID0gYXN5bmMgKC4uLmFyZ3M6IEspID0+IHtcbiAgICBsZXQgYXR0ZW1wdEluZGV4ID0gMDtcblxuICAgIHdoaWxlIChhdHRlbXB0SW5kZXggPCByZXRyaWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBmbiguLi5hcmdzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1hd2FpdC1pbi1sb29wXG5cbiAgICAgICAgcmV0dXJuIHJldCBhcyBUO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChhdHRlbXB0SW5kZXggPCByZXRyaWVzKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG9uVHJ5RXJyb3I/LihlcnIgYXMgRXJyb3IsIGFyZ3MsIGF0dGVtcHRJbmRleCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCBvbkZhaWw/LihlcnJvciBhcyBFcnJvciwgYXJncyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF0dGVtcHRJbmRleCArPSAxO1xuICAgICAgICBpZiAoYXR0ZW1wdEluZGV4ID49IHJldHJpZXMpIHtcbiAgICAgICAgICBhd2FpdCBvbkZhaWw/LihlcnIgYXMgRXJyb3IsIGFyZ3MpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHJldEZuIGFzICguLi5hcmdzOiBLKSA9PiBQcm9taXNlPFQ+O1xufTtcbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "service-creator",
3
+ "version": "0.0.2",
4
+ "description": "A simple abstraction to create \"services\", plain objects that can be used to perform fetch calls in a convention over configuration fashion.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "license": "MIT",
8
+ "author": "royriojas",
9
+ "keywords": [
10
+ "create-service",
11
+ "create services",
12
+ "xhr",
13
+ "fetch",
14
+ "fetcher",
15
+ "service"
16
+ ],
17
+ "files": [
18
+ "dist/**/*"
19
+ ],
20
+ "scripts": {
21
+ "test": "TZ=UTC jest",
22
+ "lint": "eslint --cache --cache-location=node_modules/.cache/ ./src/ --ext .ts,.tsx,.js",
23
+ "check:types": "tsc",
24
+ "verify": "yarn lint && yarn check:types",
25
+ "autofix": "yarn lint --fix",
26
+ "build": "npm run build:types && npm run build:js",
27
+ "build:types": "tsc --emitDeclarationOnly",
28
+ "build:js": "babel src --out-dir dist --extensions \".ts,.tsx,.js\" --source-maps inline",
29
+ "changelog": "changelogx -f markdown -o ./changelog.md",
30
+ "do-changelog": "npm run changelog && git add ./changelog.md && git commit -m 'DOC: Generate changelog' --no-verify",
31
+ "install-hooks": "changelogx install-hook",
32
+ "pre-v": "npm run verify",
33
+ "post-v": "npm run do-changelog && git push --no-verify && git push --tags --no-verify",
34
+ "bump-major": "npm run pre-v && npm version major -m 'BLD: Release v%s' && npm run post-v",
35
+ "bump-minor": "npm run pre-v && npm version minor -m 'BLD: Release v%s' && npm run post-v",
36
+ "bump-patch": "npm run pre-v && npm version patch -m 'BLD: Release v%s' && npm run post-v",
37
+ "bump-prerelease": "npm run pre-v && npm version prerelease -m 'BLD: Release v%s' && npm run post-v",
38
+ "prepublishOnly": "npm run build"
39
+ },
40
+ "devDependencies": {
41
+ "@babel/cli": "7.16.0",
42
+ "@babel/core": "7.16.0",
43
+ "@babel/plugin-transform-runtime": "7.16.0",
44
+ "@babel/preset-env": "7.16.4",
45
+ "@babel/preset-react": "7.16.7",
46
+ "@babel/preset-typescript": "7.16.0",
47
+ "@babel/register": "7.16.0",
48
+ "@types/eslint": "^7.2.5",
49
+ "@types/jest": "27.0.2",
50
+ "@types/node": "17.0.14",
51
+ "@typescript-eslint/eslint-plugin": "^4.8.2",
52
+ "@typescript-eslint/parser": "^4.8.2",
53
+ "babel-jest": "27.4.6",
54
+ "changelogx": "5.0.6",
55
+ "eslint": "^7.14.0",
56
+ "eslint-config-airbnb": "^18.2.1",
57
+ "eslint-config-prettier": "^6.15.0",
58
+ "eslint-import-resolver-webpack": "^0.13.0",
59
+ "eslint-plugin-import": "^2.22.1",
60
+ "eslint-plugin-jest": "^24.1.3",
61
+ "eslint-plugin-jest-playwright": "^0.2.1",
62
+ "eslint-plugin-jsx-a11y": "^6.4.1",
63
+ "eslint-plugin-prettier": "^3.1.4",
64
+ "eslint-plugin-react": "^7.21.5",
65
+ "eslint-plugin-react-hooks": "^4.2.0",
66
+ "jest": "27.4.7",
67
+ "prettier": "2.4.1",
68
+ "tslib": "2.7.0",
69
+ "typescript": "5.6.2"
70
+ },
71
+ "dependencies": {
72
+ "@babel/runtime": "7.16.3"
73
+ }
74
+ }