@bigbinary/neeto-commons-frontend 2.0.1 → 2.0.4

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/initializers.js CHANGED
@@ -1,17 +1,19 @@
1
- 'use strict';
1
+ import { curry, isNil, values, evolve, omit, modify, either, isEmpty, mergeDeepLeft } from 'ramda';
2
+ import { Toastr } from '@bigbinary/neetoui';
3
+ import axios from 'axios';
4
+ import i18next from 'i18next';
5
+ import mixpanel from 'mixpanel-browser';
6
+ import { initReactI18next } from 'react-i18next';
2
7
 
3
- var ramda = require('ramda');
4
- var neetoui = require('@bigbinary/neetoui');
5
- var axios = require('axios');
6
- var i18next = require('i18next');
7
- var mixpanel = require('mixpanel-browser');
8
- var reactI18next = require('react-i18next');
9
-
10
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
+ function _typeof(obj) {
9
+ "@babel/helpers - typeof";
11
10
 
12
- var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
13
- var i18next__default = /*#__PURE__*/_interopDefaultLegacy(i18next);
14
- var mixpanel__default = /*#__PURE__*/_interopDefaultLegacy(mixpanel);
11
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
12
+ return typeof obj;
13
+ } : function (obj) {
14
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
15
+ }, _typeof(obj);
16
+ }
15
17
 
16
18
  function _arrayWithHoles(arr) {
17
19
  if (Array.isArray(arr)) return arr;
@@ -74,16 +76,6 @@ function _slicedToArray(arr, i) {
74
76
  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
75
77
  }
76
78
 
77
- function _typeof(obj) {
78
- "@babel/helpers - typeof";
79
-
80
- return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
81
- return typeof obj;
82
- } : function (obj) {
83
- return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
84
- }, _typeof(obj);
85
- }
86
-
87
79
  var snakeToCamelCase = function snakeToCamelCase(string) {
88
80
  return string.replace(/(_\w)/g, function (letter) {
89
81
  return letter[1].toUpperCase();
@@ -117,6 +109,22 @@ var keysToCamelCase = function keysToCamelCase(object) {
117
109
  return [snakeToCamelCase(key), value];
118
110
  });
119
111
  };
112
+ var serializeKeysToSnakeCase = function serializeKeysToSnakeCase(object) {
113
+ if (Array.isArray(object)) {
114
+ return object.map(serializeKeysToSnakeCase);
115
+ } else if (object === null || _typeof(object) !== "object") {
116
+ return object;
117
+ }
118
+
119
+ return Object.fromEntries(Object.entries(object).map(function (_ref3) {
120
+ var _ref4 = _slicedToArray(_ref3, 2),
121
+ key = _ref4[0],
122
+ value = _ref4[1];
123
+
124
+ var val = typeof (value === null || value === void 0 ? void 0 : value.toJSON) === "function" ? value.toJSON() : value;
125
+ return [camelToSnakeCase(key), serializeKeysToSnakeCase(val)];
126
+ }));
127
+ };
120
128
  var deepFreezeObject = function deepFreezeObject(object) {
121
129
  if (object && _typeof(object) === "object" && !Object.isFrozen(object)) {
122
130
  Object.keys(object).forEach(function (property) {
@@ -127,25 +135,28 @@ var deepFreezeObject = function deepFreezeObject(object) {
127
135
 
128
136
  return object;
129
137
  };
130
- var matches = ramda.curry(function (pattern, object) {
138
+ var matches = curry(function (pattern, object) {
131
139
  var __parent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : object;
132
140
 
133
141
  if (object === pattern) return true;
134
142
  if (typeof pattern === "function" && pattern(object, __parent)) return true;
135
- if (ramda.isNil(pattern) || ramda.isNil(object)) return false;
143
+ if (isNil(pattern) || isNil(object)) return false;
136
144
  if (_typeof(pattern) !== "object") return false;
137
- return Object.entries(pattern).every(function (_ref3) {
138
- var _ref4 = _slicedToArray(_ref3, 2),
139
- key = _ref4[0],
140
- value = _ref4[1];
145
+ return Object.entries(pattern).every(function (_ref5) {
146
+ var _ref6 = _slicedToArray(_ref5, 2),
147
+ key = _ref6[0],
148
+ value = _ref6[1];
141
149
 
142
150
  return matches(value, object[key], __parent);
143
151
  });
144
152
  });
145
153
 
146
- var _document$getElements, _document$getElements2;
147
- window.globalProps = keysToCamelCase(JSON.parse(((_document$getElements = document.getElementsByClassName("root-container")[0]) === null || _document$getElements === void 0 ? void 0 : (_document$getElements2 = _document$getElements.dataset) === null || _document$getElements2 === void 0 ? void 0 : _document$getElements2.reactProps) || "{}"));
148
- deepFreezeObject(window.globalProps);
154
+ function initializeGlobalProps() {
155
+ var _document$getElements, _document$getElements2;
156
+
157
+ window.globalProps = keysToCamelCase(JSON.parse(((_document$getElements = document.getElementsByClassName("root-container")[0]) === null || _document$getElements === void 0 ? void 0 : (_document$getElements2 = _document$getElements.dataset) === null || _document$getElements2 === void 0 ? void 0 : _document$getElements2.reactProps) || "{}"));
158
+ deepFreezeObject(window.globalProps);
159
+ }
149
160
 
150
161
  function _defineProperty(obj, key, value) {
151
162
  if (key in obj) {
@@ -169,21 +180,19 @@ var HEADERS_KEYS = {
169
180
  };
170
181
 
171
182
  var resetAuthTokens = function resetAuthTokens() {
172
- ramda.values(HEADERS_KEYS).forEach(function (header) {
173
- delete axios__default["default"].defaults.headers[header];
183
+ values(HEADERS_KEYS).forEach(function (header) {
184
+ delete axios.defaults.headers[header];
174
185
  });
175
186
  };
176
187
 
177
- var setAxiosDefaults = function setAxiosDefaults() {
178
- axios__default["default"].defaults.baseURL = "/";
179
- setAuthHeaders();
180
- registerIntercepts();
188
+ var shouldNot = function shouldNot(skip) {
189
+ return _typeof(skip) === "object" || !skip;
181
190
  };
182
191
 
183
192
  var setAuthHeaders = function setAuthHeaders() {
184
193
  var _globalProps$user, _globalProps$user2;
185
194
 
186
- axios__default["default"].defaults.headers = _defineProperty({
195
+ axios.defaults.headers = _defineProperty({
187
196
  Accept: "application/json",
188
197
  "Content-Type": "application/json"
189
198
  }, HEADERS_KEYS.xCsrfToken, document.querySelector('[name="csrf-token"]').getAttribute("content"));
@@ -191,123 +200,169 @@ var setAuthHeaders = function setAuthHeaders() {
191
200
  var email = (_globalProps$user2 = globalProps.user) === null || _globalProps$user2 === void 0 ? void 0 : _globalProps$user2.email;
192
201
 
193
202
  if (token && email) {
194
- axios__default["default"].defaults.headers[HEADERS_KEYS.xAuthEmail] = email;
195
- axios__default["default"].defaults.headers[HEADERS_KEYS.xAuthToken] = token;
203
+ axios.defaults.headers[HEADERS_KEYS.xAuthEmail] = email;
204
+ axios.defaults.headers[HEADERS_KEYS.xAuthToken] = token;
196
205
  }
206
+ }; // pipe function from ramda doesn't accept array of functions.
207
+ // We can't use spread operator too. So this is a workaround.
208
+
209
+
210
+ var createPipe = function createPipe(functions) {
211
+ return function (data) {
212
+ return functions.reduce(function (acc, fn) {
213
+ return fn(acc);
214
+ }, data);
215
+ };
197
216
  };
198
217
 
199
- var handleSuccessResponse = function handleSuccessResponse(response) {
200
- var _response$config = response.config,
201
- _response$config$tran = _response$config.transformResponseCase,
202
- transformResponseCase = _response$config$tran === void 0 ? true : _response$config$tran,
203
- _response$config$incl = _response$config.includeMetadataInResponse,
204
- includeMetadataInResponse = _response$config$incl === void 0 ? false : _response$config$incl,
205
- _response$config$show = _response$config.showToastr,
206
- showToastr = _response$config$show === void 0 ? true : _response$config$show;
218
+ var transformKeysToCamelCase = function transformKeysToCamelCase(response) {
219
+ var _response$config$tran = response.config.transformResponseCase,
220
+ transformResponseCase = _response$config$tran === void 0 ? true : _response$config$tran;
207
221
 
208
- if (response.data) {
209
- if (transformResponseCase) response.data = keysToCamelCase(response.data);
222
+ if (response.data && transformResponseCase) {
223
+ response.data = keysToCamelCase(response.data);
224
+ }
210
225
 
211
- if (showToastr && typeof response.data.notice === "string") {
212
- neetoui.Toastr.success(response.data.notice);
213
- }
226
+ return response;
227
+ };
228
+
229
+ var showSuccessToastr = function showSuccessToastr(response) {
230
+ var _response$config$show = response.config.showToastr,
231
+ showToastr = _response$config$show === void 0 ? true : _response$config$show;
232
+
233
+ if (showToastr && typeof response.data.notice === "string") {
234
+ Toastr.success(response.data.notice);
214
235
  }
215
236
 
237
+ return response;
238
+ };
239
+
240
+ var pullDataFromResponse = function pullDataFromResponse(response) {
241
+ var _response$config$incl = response.config.includeMetadataInResponse,
242
+ includeMetadataInResponse = _response$config$incl === void 0 ? false : _response$config$incl;
216
243
  return includeMetadataInResponse ? response : response.data;
217
244
  };
218
245
 
219
- var handleUnauthorizedErrorResponse = function handleUnauthorizedErrorResponse() {
246
+ var buildSuccessResponseHandler = function buildSuccessResponseHandler(skip) {
247
+ var interceptors = [];
248
+ if (!(skip !== null && skip !== void 0 && skip.transformCase)) interceptors.push(transformKeysToCamelCase);
249
+ if (!(skip !== null && skip !== void 0 && skip.showToastr)) interceptors.push(showSuccessToastr);
250
+ if (!(skip !== null && skip !== void 0 && skip.pullDataFromResponse)) interceptors.push(pullDataFromResponse);
251
+ return createPipe(interceptors);
252
+ };
253
+
254
+ var handleUnauthorizedErrorResponse = function handleUnauthorizedErrorResponse(error) {
255
+ var _error$response;
256
+
257
+ if (((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) !== 401) return error;
220
258
  resetAuthTokens();
221
- setTimeout(function () {
222
- var redirectTo = window.location.pathname === "/login" ? "/login" : "/login?redirect_uri=".concat(encodeURIComponent(window.location.href));
223
- window.location.href = redirectTo;
224
- }, 300);
259
+ var _error$config$redirec = error.config.redirectOnError,
260
+ redirectOnError = _error$config$redirec === void 0 ? true : _error$config$redirec;
261
+
262
+ if (redirectOnError) {
263
+ setTimeout(function () {
264
+ var redirectTo = window.location.pathname === "/login" ? "/login" : "/login?redirect_uri=".concat(encodeURIComponent(window.location.href));
265
+ window.location.href = redirectTo;
266
+ }, 300);
267
+ }
268
+
269
+ return error;
225
270
  };
226
271
 
227
272
  var showErrorToastr = function showErrorToastr(error) {
228
- if (axios__default["default"].isCancel(error)) {
229
- neetoui.Toastr.error(i18next__default["default"].t("neetoCommons.toastr.error.requestCanceled"));
273
+ if (axios.isCancel(error)) {
274
+ Toastr.error(i18next.t("neetoCommons.toastr.error.requestCanceled"));
230
275
  } else if (error.message === "Network Error") {
231
- neetoui.Toastr.error(i18next__default["default"].t("neetoCommons.toastr.error.networkError"));
276
+ Toastr.error(i18next.t("neetoCommons.toastr.error.networkError"));
232
277
  } else {
233
- neetoui.Toastr.error(error);
278
+ Toastr.error(error);
234
279
  }
280
+
281
+ return error;
235
282
  };
236
283
 
237
- var handleErrorResponse = function handleErrorResponse(error) {
238
- var _error$response, _error$response2;
284
+ var redirect404 = function redirect404(error) {
285
+ var _error$response2;
239
286
 
240
- var _error$config$showToa = error.config.showToastr,
241
- showToastr = _error$config$showToa === void 0 ? true : _error$config$showToa;
287
+ var _error$config$redirec2 = error.config.redirectOnError,
288
+ redirectOnError = _error$config$redirec2 === void 0 ? true : _error$config$redirec2;
242
289
 
243
- if (((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 404) {
290
+ if (redirectOnError && ((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.status) === 404) {
244
291
  window.location.href = "/page-not-found";
245
- } else if (((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.status) === 401) {
246
- handleUnauthorizedErrorResponse();
247
- } else if (showToastr) {
248
- showErrorToastr(error);
249
292
  }
250
293
 
251
- return Promise.reject(error);
294
+ return error;
295
+ };
296
+
297
+ var buildErrorResponseHandler = function buildErrorResponseHandler(skip) {
298
+ var interceptors = [];
299
+ if (!(skip !== null && skip !== void 0 && skip.redirectOn404)) interceptors.push(redirect404);
300
+ if (!(skip !== null && skip !== void 0 && skip.logoutOn401)) interceptors.push(handleUnauthorizedErrorResponse);
301
+ if (!(skip !== null && skip !== void 0 && skip.showToastr)) interceptors.push(showErrorToastr);
302
+ interceptors.push(Promise.reject.bind(Promise));
303
+ return createPipe(interceptors);
252
304
  };
253
305
 
254
306
  var cleanupCredentialsForCrossOrigin = function cleanupCredentialsForCrossOrigin(request) {
255
307
  if (!request.url.includes("://")) return request;
256
308
  if (request.url.includes(window.location.hostname)) return request;
257
- return ramda.evolve({
258
- headers: ramda.omit(ramda.values(HEADERS_KEYS))
309
+ return evolve({
310
+ headers: omit(values(HEADERS_KEYS))
259
311
  })(request);
260
312
  };
261
313
 
262
- var serializeKeysToSnakeCase = function serializeKeysToSnakeCase(object) {
263
- if (Array.isArray(object)) {
264
- return object.map(serializeKeysToSnakeCase);
265
- } else if (object === null || _typeof(object) !== "object") {
266
- return object;
267
- }
268
-
269
- return Object.fromEntries(Object.entries(object).map(function (_ref) {
270
- var _ref2 = _slicedToArray(_ref, 2),
271
- key = _ref2[0],
272
- value = _ref2[1];
273
-
274
- var val = typeof (value === null || value === void 0 ? void 0 : value.toJSON) === "function" ? value.toJSON() : value;
275
- return [camelToSnakeCase(key), serializeKeysToSnakeCase(val)];
276
- }));
277
- };
278
-
279
314
  var transformDataToSnakeCase = function transformDataToSnakeCase(request) {
280
315
  var _request$transformReq = request.transformRequestCase,
281
316
  transformRequestCase = _request$transformReq === void 0 ? true : _request$transformReq;
282
317
  if (!transformRequestCase || !request.data) return request;
283
- return ramda.modify("data", serializeKeysToSnakeCase, request);
318
+ return modify("data", serializeKeysToSnakeCase, request);
284
319
  };
285
320
 
286
- var registerIntercepts = function registerIntercepts() {
287
- axios__default["default"].interceptors.request.use(ramda.pipe(cleanupCredentialsForCrossOrigin, transformDataToSnakeCase));
288
- axios__default["default"].interceptors.response.use(handleSuccessResponse, handleErrorResponse);
321
+ var addRequestInterceptors = function addRequestInterceptors(skip) {
322
+ if (!(skip !== null && skip !== void 0 && skip.cleanCredentialsForCrossOrigin)) {
323
+ axios.interceptors.request.use(cleanupCredentialsForCrossOrigin);
324
+ }
325
+
326
+ if (!(skip !== null && skip !== void 0 && skip.transformCase)) {
327
+ axios.interceptors.request.use(transformDataToSnakeCase);
328
+ }
289
329
  };
290
330
 
291
- setAxiosDefaults();
331
+ var addResponseInterceptors = function addResponseInterceptors(skip) {
332
+ axios.interceptors.response.use(buildSuccessResponseHandler(skip), buildErrorResponseHandler(skip));
333
+ };
292
334
 
293
- var isProduction = process.env.NODE_ENV === "production";
294
- var isTokenPresent = !!process.env.MIXPANEL_TOKEN;
295
- var isUserLoggedIn = !ramda.either(ramda.isEmpty, ramda.isNil)(globalProps.user);
335
+ var registerIntercepts = function registerIntercepts(skip) {
336
+ if (shouldNot(skip === null || skip === void 0 ? void 0 : skip.request)) addRequestInterceptors(skip === null || skip === void 0 ? void 0 : skip.request);
337
+ if (shouldNot(skip === null || skip === void 0 ? void 0 : skip.response)) addResponseInterceptors(skip === null || skip === void 0 ? void 0 : skip.response);
338
+ };
296
339
 
297
- if (isProduction && isTokenPresent && isUserLoggedIn) {
298
- mixpanel__default["default"].init(process.env.MIXPANEL_TOKEN);
299
- mixpanel__default["default"].people.set({
300
- $email: globalProps.user.email,
301
- $fist_name: globalProps.user.firstName,
302
- $last_name: globalProps.user.lastName
303
- });
304
- mixpanel__default["default"].identify(globalProps.user.email);
305
- } else {
306
- /*
307
- We need to initialize mixpanel with a bogus token in development and test environment to
308
- prevent mixpanel library from throwing an error when we use mixpanel.track() method in react components.
309
- */
310
- mixpanel__default["default"].init("TEST_TOKEN");
340
+ function initializeAxios(skip) {
341
+ if (!(skip !== null && skip !== void 0 && skip.baseURL)) axios.defaults.baseURL = "/";
342
+ if (!(skip !== null && skip !== void 0 && skip.authHeaders)) setAuthHeaders();
343
+ if (shouldNot(skip === null || skip === void 0 ? void 0 : skip.interceptors)) registerIntercepts(skip === null || skip === void 0 ? void 0 : skip.interceptors);
344
+ }
345
+
346
+ function initializeMixPanel() {
347
+ var isProduction = process.env.NODE_ENV === "production";
348
+ var isTokenPresent = !!process.env.MIXPANEL_TOKEN;
349
+ var isUserLoggedIn = !either(isEmpty, isNil)(globalProps.user);
350
+
351
+ if (isProduction && isTokenPresent && isUserLoggedIn) {
352
+ mixpanel.init(process.env.MIXPANEL_TOKEN || "");
353
+ mixpanel.people.set({
354
+ $email: globalProps.user.email,
355
+ $fist_name: globalProps.user.firstName,
356
+ $last_name: globalProps.user.lastName
357
+ });
358
+ mixpanel.identify(globalProps.user.email);
359
+ } else {
360
+ /*
361
+ We need to initialize mixpanel with a bogus token in development and test environment to
362
+ prevent mixpanel library from throwing an error when we use mixpanel.track() method in react components.
363
+ */
364
+ mixpanel.init("TEST_TOKEN");
365
+ }
311
366
  }
312
367
 
313
368
  var neetoCommons = {
@@ -350,8 +405,8 @@ var en = {
350
405
  };
351
406
 
352
407
  var initializeI18n = function initializeI18n(resources) {
353
- i18next__default["default"].use(reactI18next.initReactI18next).init({
354
- resources: ramda.mergeDeepLeft({
408
+ i18next.use(initReactI18next).init({
409
+ resources: mergeDeepLeft({
355
410
  en: {
356
411
  translation: en
357
412
  }
@@ -365,10 +420,23 @@ var initializeI18n = function initializeI18n(resources) {
365
420
  });
366
421
  };
367
422
 
368
- /* eslint-disable import/order */
423
+ var globalProps$1 = {};
369
424
  function initializeApplication(_ref) {
370
- var translationResources = _ref.translationResources;
371
- initializeI18n(translationResources);
425
+ var translationResources = _ref.translationResources,
426
+ skip = _ref.skip;
427
+
428
+ if (!(skip !== null && skip !== void 0 && skip.globalProps)) {
429
+ initializeGlobalProps();
430
+ globalProps$1 = window.globalProps;
431
+ }
432
+
433
+ if (!(skip !== null && skip !== void 0 && skip.mixpanel)) initializeMixPanel();
434
+
435
+ if (_typeof(skip === null || skip === void 0 ? void 0 : skip.axios) === "object" || !(skip !== null && skip !== void 0 && skip.axios)) {
436
+ initializeAxios(skip === null || skip === void 0 ? void 0 : skip.axios);
437
+ }
438
+
439
+ if (!(skip !== null && skip !== void 0 && skip.i18n)) initializeI18n(translationResources);
372
440
  }
373
441
 
374
- module.exports = initializeApplication;
442
+ export { initializeApplication as default, globalProps$1 as globalProps };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigbinary/neeto-commons-frontend",
3
- "version": "2.0.1",
3
+ "version": "2.0.4",
4
4
  "description": "A package encapsulating common code across neeto projects including initializers, utility functions, common components and hooks and so on.",
5
5
  "repository": "git@github.com:bigbinary/neeto-commons-frontend.git",
6
6
  "author": "Amaljith K <amaljith.k@bigbinary.com>",
@@ -23,6 +23,24 @@
23
23
  ".scripts/fix-lints.sh"
24
24
  ]
25
25
  },
26
+ "exports": {
27
+ "./react-utils": {
28
+ "import": "./react-utils.js",
29
+ "require": "./react-utils.cjs.js"
30
+ },
31
+ "./utils": {
32
+ "import": "./utils.js",
33
+ "require": "./utils.cjs.js"
34
+ },
35
+ "./pure": {
36
+ "import": "./pure.js",
37
+ "require": "./pure.cjs.js"
38
+ },
39
+ "./initializers": {
40
+ "import": "./initializers.js",
41
+ "require": "./initializers.cjs.js"
42
+ }
43
+ },
26
44
  "devDependencies": {
27
45
  "@babel/eslint-parser": "^7.18.2",
28
46
  "@babel/plugin-transform-runtime": "^7.18.5",
@@ -63,6 +81,7 @@
63
81
  "lint-staged": "^12.3.7",
64
82
  "mixpanel-browser": "^2.45.0",
65
83
  "prettier": "^2.6.2",
84
+ "query-string": "^7.1.1",
66
85
  "ramda": "^0.28.0",
67
86
  "react": "^17.0.2",
68
87
  "react-dom": "17.0.2",