@suprsend/node-sdk 1.8.1 → 1.8.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.
@@ -1,54 +1,33 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.BulkEventsFactory = void 0;
9
-
10
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
-
12
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
11
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
-
18
12
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
19
-
20
13
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
21
-
22
14
  var _constants = require("./constants");
23
-
24
15
  var _signature = _interopRequireDefault(require("./signature"));
25
-
26
16
  var _bulk_response = _interopRequireDefault(require("./bulk_response"));
27
-
28
17
  var _event = _interopRequireDefault(require("./event"));
29
-
30
18
  var _utils = require("./utils");
31
-
32
19
  var _lodash = require("lodash");
33
-
34
20
  var _axios = _interopRequireDefault(require("axios"));
35
-
36
21
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
37
-
38
22
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
39
-
40
23
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
41
-
42
24
  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; }
43
-
44
25
  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; }
45
-
46
26
  var BulkEventsFactory = /*#__PURE__*/function () {
47
27
  function BulkEventsFactory(config) {
48
28
  (0, _classCallCheck2["default"])(this, BulkEventsFactory);
49
29
  this.config = config;
50
30
  }
51
-
52
31
  (0, _createClass2["default"])(BulkEventsFactory, [{
53
32
  key: "new_instance",
54
33
  value: function new_instance() {
@@ -57,9 +36,7 @@ var BulkEventsFactory = /*#__PURE__*/function () {
57
36
  }]);
58
37
  return BulkEventsFactory;
59
38
  }();
60
-
61
39
  exports.BulkEventsFactory = BulkEventsFactory;
62
-
63
40
  var _BulkEventsChunk = /*#__PURE__*/function () {
64
41
  function _BulkEventsChunk(config) {
65
42
  (0, _classCallCheck2["default"])(this, _BulkEventsChunk);
@@ -71,7 +48,6 @@ var _BulkEventsChunk = /*#__PURE__*/function () {
71
48
  this.__running_length = 0;
72
49
  this.response;
73
50
  }
74
-
75
51
  (0, _createClass2["default"])(_BulkEventsChunk, [{
76
52
  key: "__get_url",
77
53
  value: function __get_url() {
@@ -98,9 +74,7 @@ var _BulkEventsChunk = /*#__PURE__*/function () {
98
74
  value: function __add_event_to_chunk(event, event_size) {
99
75
  // First add size, then body to reduce effects of race condition
100
76
  this.__running_size += event_size;
101
-
102
77
  this.__chunk.push(event);
103
-
104
78
  this.__running_length += 1;
105
79
  }
106
80
  }, {
@@ -118,25 +92,19 @@ var _BulkEventsChunk = /*#__PURE__*/function () {
118
92
  if (!event) {
119
93
  return true;
120
94
  }
121
-
122
95
  if (this.__check_limit_reached()) {
123
96
  return false;
124
97
  }
125
-
126
98
  if (event_size > _constants.SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES) {
127
99
  throw new _utils.InputValueError("Event properties too big - ".concat(event_size, " Bytes, must not cross ").concat(_constants.SINGLE_EVENT_MAX_APPARENT_SIZE_IN_BYTES_READABLE));
128
100
  }
129
-
130
101
  if (this.__running_size + event_size > _constants.BODY_MAX_APPARENT_SIZE_IN_BYTES) {
131
102
  return false;
132
103
  }
133
-
134
104
  if (!_constants.ALLOW_ATTACHMENTS_IN_BULK_API) {
135
105
  delete event.properties["$attachments"];
136
106
  }
137
-
138
107
  this.__add_event_to_chunk(event, event_size);
139
-
140
108
  return true;
141
109
  }
142
110
  }, {
@@ -157,11 +125,9 @@ var _BulkEventsChunk = /*#__PURE__*/function () {
157
125
  return _axios["default"].post(this.__url, content_text, {
158
126
  headers: headers
159
127
  });
160
-
161
128
  case 7:
162
129
  response = _context.sent;
163
130
  ok_response = Math.floor(response.status / 100) == 2;
164
-
165
131
  if (ok_response) {
166
132
  this.response = {
167
133
  status: "success",
@@ -187,10 +153,8 @@ var _BulkEventsChunk = /*#__PURE__*/function () {
187
153
  })
188
154
  };
189
155
  }
190
-
191
156
  _context.next = 16;
192
157
  break;
193
-
194
158
  case 12:
195
159
  _context.prev = 12;
196
160
  _context.t0 = _context["catch"](4);
@@ -210,7 +174,6 @@ var _BulkEventsChunk = /*#__PURE__*/function () {
210
174
  };
211
175
  })
212
176
  };
213
-
214
177
  case 16:
215
178
  case "end":
216
179
  return _context.stop();
@@ -218,17 +181,14 @@ var _BulkEventsChunk = /*#__PURE__*/function () {
218
181
  }
219
182
  }, _callee, this, [[4, 12]]);
220
183
  }));
221
-
222
184
  function trigger() {
223
185
  return _trigger.apply(this, arguments);
224
186
  }
225
-
226
187
  return trigger;
227
188
  }()
228
189
  }]);
229
190
  return _BulkEventsChunk;
230
191
  }();
231
-
232
192
  var BulkEvents = /*#__PURE__*/function () {
233
193
  function BulkEvents(config) {
234
194
  (0, _classCallCheck2["default"])(this, BulkEvents);
@@ -236,33 +196,27 @@ var BulkEvents = /*#__PURE__*/function () {
236
196
  this.__events = [];
237
197
  this.__pending_records = [];
238
198
  this.chunks = [];
239
- this.response = new _bulk_response["default"](); // invalid_record json: {"record": event-json, "error": error_str, "code": 500}
240
-
199
+ this.response = new _bulk_response["default"]();
200
+ // invalid_record json: {"record": event-json, "error": error_str, "code": 500}
241
201
  this.__invalid_records = [];
242
202
  }
243
-
244
203
  (0, _createClass2["default"])(BulkEvents, [{
245
204
  key: "__validate_events",
246
205
  value: function __validate_events() {
247
206
  var _iterator = _createForOfIteratorHelper(this.__events),
248
- _step;
249
-
207
+ _step;
250
208
  try {
251
209
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
252
210
  var ev = _step.value;
253
-
254
211
  try {
255
212
  var is_part_of_bulk = true;
256
-
257
213
  var _ev$get_final_json = ev.get_final_json(this.config, is_part_of_bulk),
258
- _ev$get_final_json2 = (0, _slicedToArray2["default"])(_ev$get_final_json, 2),
259
- ev_json = _ev$get_final_json2[0],
260
- body_size = _ev$get_final_json2[1];
261
-
214
+ _ev$get_final_json2 = (0, _slicedToArray2["default"])(_ev$get_final_json, 2),
215
+ ev_json = _ev$get_final_json2[0],
216
+ body_size = _ev$get_final_json2[1];
262
217
  this.__pending_records.push([ev_json, body_size]);
263
218
  } catch (ex) {
264
219
  var inv_rec = (0, _utils.invalid_record_json)(ev.as_json(), ex);
265
-
266
220
  this.__invalid_records.push(inv_rec);
267
221
  }
268
222
  }
@@ -278,25 +232,19 @@ var BulkEvents = /*#__PURE__*/function () {
278
232
  var start_idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
279
233
  var curr_chunk = new _BulkEventsChunk(this.config);
280
234
  this.chunks.push(curr_chunk);
281
-
282
235
  var entries = this.__pending_records.slice(start_idx).entries();
283
-
284
236
  var _iterator2 = _createForOfIteratorHelper(entries),
285
- _step2;
286
-
237
+ _step2;
287
238
  try {
288
239
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
289
240
  var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
290
- rel_idx = _step2$value[0],
291
- rec = _step2$value[1];
292
-
241
+ rel_idx = _step2$value[0],
242
+ rec = _step2$value[1];
293
243
  var is_added = curr_chunk.try_to_add_into_chunk(rec[0], rec[1]);
294
-
295
244
  if (!is_added) {
296
245
  // create chunks from remaining records
297
- this.__chunkify(start_idx + rel_idx); // Don't forget to break. As current loop must not continue further
298
-
299
-
246
+ this.__chunkify(start_idx + rel_idx);
247
+ // Don't forget to break. As current loop must not continue further
300
248
  break;
301
249
  }
302
250
  }
@@ -312,17 +260,13 @@ var BulkEvents = /*#__PURE__*/function () {
312
260
  for (var _len = arguments.length, events = new Array(_len), _key = 0; _key < _len; _key++) {
313
261
  events[_key] = arguments[_key];
314
262
  }
315
-
316
263
  if (!events) {
317
264
  return;
318
265
  }
319
-
320
266
  for (var _i = 0, _events = events; _i < _events.length; _i++) {
321
267
  var ev = _events[_i];
322
-
323
268
  if (ev && ev instanceof _event["default"]) {
324
269
  var ev_copy = (0, _lodash.cloneDeep)(ev);
325
-
326
270
  this.__events.push(ev_copy);
327
271
  }
328
272
  }
@@ -332,85 +276,63 @@ var BulkEvents = /*#__PURE__*/function () {
332
276
  value: function () {
333
277
  var _trigger2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
334
278
  var ch_response, _iterator3, _step3, _step3$value, c_idx, ch;
335
-
336
279
  return _regenerator["default"].wrap(function _callee2$(_context2) {
337
280
  while (1) {
338
281
  switch (_context2.prev = _context2.next) {
339
282
  case 0:
340
283
  this.__validate_events();
341
-
342
284
  if (this.__invalid_records.length > 0) {
343
285
  ch_response = _bulk_response["default"].invalid_records_chunk_response(this.__invalid_records);
344
286
  this.response.merge_chunk_response(ch_response);
345
287
  }
346
-
347
288
  if (!this.__pending_records.length) {
348
289
  _context2.next = 25;
349
290
  break;
350
291
  }
351
-
352
292
  this.__chunkify();
353
-
354
293
  _iterator3 = _createForOfIteratorHelper(this.chunks.entries());
355
294
  _context2.prev = 5;
356
-
357
295
  _iterator3.s();
358
-
359
296
  case 7:
360
297
  if ((_step3 = _iterator3.n()).done) {
361
298
  _context2.next = 15;
362
299
  break;
363
300
  }
364
-
365
301
  _step3$value = (0, _slicedToArray2["default"])(_step3.value, 2), c_idx = _step3$value[0], ch = _step3$value[1];
366
-
367
302
  if (this.config.req_log_level > 0) {
368
303
  console.log("DEBUG: triggering api call for chunk: ".concat(c_idx));
369
- } // do api call
370
-
371
-
304
+ }
305
+ // do api call
372
306
  _context2.next = 12;
373
307
  return ch.trigger();
374
-
375
308
  case 12:
376
309
  // merge response
377
310
  this.response.merge_chunk_response(ch.response);
378
-
379
311
  case 13:
380
312
  _context2.next = 7;
381
313
  break;
382
-
383
314
  case 15:
384
315
  _context2.next = 20;
385
316
  break;
386
-
387
317
  case 17:
388
318
  _context2.prev = 17;
389
319
  _context2.t0 = _context2["catch"](5);
390
-
391
320
  _iterator3.e(_context2.t0);
392
-
393
321
  case 20:
394
322
  _context2.prev = 20;
395
-
396
323
  _iterator3.f();
397
-
398
324
  return _context2.finish(20);
399
-
400
325
  case 23:
401
326
  _context2.next = 26;
402
327
  break;
403
-
404
328
  case 25:
405
329
  // if no records. i.e. invalid_records.length and pending_records.length both are 0
406
330
  // then add empty success response
407
331
  if (this.__invalid_records.length === 0) {
408
332
  this.response.merge_chunk_response(_bulk_response["default"].empty_chunk_success_response());
409
333
  }
410
-
411
334
  case 26:
412
335
  return _context2.abrupt("return", this.response);
413
-
414
336
  case 27:
415
337
  case "end":
416
338
  return _context2.stop();
@@ -418,11 +340,9 @@ var BulkEvents = /*#__PURE__*/function () {
418
340
  }
419
341
  }, _callee2, this, [[5, 17, 20, 23]]);
420
342
  }));
421
-
422
343
  function trigger() {
423
344
  return _trigger2.apply(this, arguments);
424
345
  }
425
-
426
346
  return trigger;
427
347
  }()
428
348
  }]);
package/dist/index.js CHANGED
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  var _typeof = require("@babel/runtime/helpers/typeof");
6
-
7
5
  Object.defineProperty(exports, "__esModule", {
8
6
  value: true
9
7
  });
@@ -26,39 +24,22 @@ Object.defineProperty(exports, "Workflow", {
26
24
  return _workflow["default"];
27
25
  }
28
26
  });
29
-
30
27
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
31
-
32
28
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
33
-
34
29
  var _utils = require("./utils");
35
-
36
30
  var _attachment = _interopRequireDefault(require("./attachment"));
37
-
38
31
  var _workflow = _interopRequireWildcard(require("./workflow"));
39
-
40
32
  var _workflows_bulk = require("./workflows_bulk");
41
-
42
33
  var _event = _interopRequireWildcard(require("./event"));
43
-
44
34
  var _events_bulk = require("./events_bulk");
45
-
46
35
  var _subscriber = _interopRequireDefault(require("./subscriber"));
47
-
48
36
  var _subscribers_bulk = _interopRequireDefault(require("./subscribers_bulk"));
49
-
50
37
  var _subscriber_list = require("./subscriber_list");
51
-
52
38
  var _brands = _interopRequireDefault(require("./brands"));
53
-
54
39
  var _constants = require("./constants");
55
-
56
40
  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); }
57
-
58
41
  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; }
59
-
60
42
  var package_json = require("../package.json");
61
-
62
43
  var Suprsend = /*#__PURE__*/function () {
63
44
  function Suprsend(workspace_key, workspace_secret) {
64
45
  var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
@@ -76,10 +57,8 @@ var Suprsend = /*#__PURE__*/function () {
76
57
  this._user = new _subscriber["default"](this);
77
58
  this.brands = new _brands["default"](this);
78
59
  this.subscriber_lists = new _subscriber_list.SubscriberListsApi(this);
79
-
80
60
  this._validate();
81
61
  }
82
-
83
62
  (0, _createClass2["default"])(Suprsend, [{
84
63
  key: "bulk_workflows",
85
64
  get: function get() {
@@ -117,7 +96,6 @@ var Suprsend = /*#__PURE__*/function () {
117
96
  if (base_url) {
118
97
  base_url = base_url.trim();
119
98
  }
120
-
121
99
  if (!base_url) {
122
100
  if (this.config.is_staging) {
123
101
  base_url = _constants.DEFAULT_UAT_URL;
@@ -125,38 +103,29 @@ var Suprsend = /*#__PURE__*/function () {
125
103
  base_url = _constants.DEFAULT_URL;
126
104
  }
127
105
  }
128
-
129
106
  base_url = base_url.trim();
130
-
131
107
  if (!base_url.endsWith("/")) {
132
108
  base_url += "/";
133
109
  }
134
-
135
110
  return base_url;
136
111
  }
137
112
  }, {
138
113
  key: "add_attachment",
139
114
  value: function add_attachment(body, file_path) {
140
115
  var _kwargs$ignore_if_err;
141
-
142
116
  var kwargs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
143
117
  var file_name = kwargs === null || kwargs === void 0 ? void 0 : kwargs.file_name;
144
118
  var ignore_if_error = (_kwargs$ignore_if_err = kwargs === null || kwargs === void 0 ? void 0 : kwargs.ignore_if_error) !== null && _kwargs$ignore_if_err !== void 0 ? _kwargs$ignore_if_err : false;
145
-
146
119
  if (!(body !== null && body !== void 0 && body.data)) {
147
120
  body.data = {};
148
121
  }
149
-
150
122
  if (!(body.data instanceof Object)) {
151
123
  throw new _utils.InputValueError("data must be an object");
152
124
  }
153
-
154
125
  var attachment = (0, _attachment["default"])(file_path, file_name, ignore_if_error);
155
-
156
126
  if (!body.data["$attachments"]) {
157
127
  body["data"]["$attachments"] = [];
158
128
  }
159
-
160
129
  body["data"]["$attachments"].push(attachment);
161
130
  return body;
162
131
  }
@@ -164,13 +133,11 @@ var Suprsend = /*#__PURE__*/function () {
164
133
  key: "trigger_workflow",
165
134
  value: function trigger_workflow(data) {
166
135
  var wf_ins;
167
-
168
136
  if (data instanceof _workflow["default"]) {
169
137
  wf_ins = data;
170
138
  } else {
171
139
  wf_ins = new _workflow["default"](data);
172
140
  }
173
-
174
141
  return this._workflow_trigger.trigger(wf_ins);
175
142
  }
176
143
  }, {
@@ -187,11 +154,9 @@ var Suprsend = /*#__PURE__*/function () {
187
154
  if (!(event instanceof _event["default"])) {
188
155
  throw new _utils.InputValueError("argument must be an instance of suprsend.Event");
189
156
  }
190
-
191
157
  return this._eventcollector.collect(event);
192
158
  }
193
159
  }]);
194
160
  return Suprsend;
195
161
  }();
196
-
197
162
  exports.Suprsend = Suprsend;
@@ -1,14 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports["default"] = void 0;
9
-
10
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
-
12
9
  var LANG_CODE_NAME_MAPPING = {
13
10
  aa: "Afar",
14
11
  ab: "Abkhazian",
package/dist/signature.js CHANGED
@@ -1,33 +1,24 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports["default"] = get_request_signature;
9
-
10
8
  var _crypto = _interopRequireDefault(require("crypto"));
11
-
12
9
  function get_path(url) {
13
10
  var url_info = new URL(url);
14
11
  return url_info.pathname + url_info.search;
15
12
  }
16
-
17
13
  function get_request_signature(url, http_verb, content, headers, secret) {
18
14
  var content_md5 = "";
19
15
  var content_type = headers["Content-Type"] || "";
20
-
21
16
  if (content) {
22
17
  content_md5 = _crypto["default"].createHash("md5").update(content).digest("hex");
23
18
  }
24
-
25
19
  var request_uri = get_path(url);
26
20
  var sign_string = http_verb + "\n" + content_md5 + "\n" + content_type + "\n" + headers["Date"] + "\n" + request_uri;
27
-
28
21
  var hash = _crypto["default"].createHmac("sha256", secret).update(sign_string);
29
-
30
22
  return hash.digest("base64");
31
23
  }
32
-
33
24
  module.exports = exports.default;