@sima-land/isomorph 9.0.5 → 10.0.0

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.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Отправка аналитики в око.
3
+ * @param eventData Данные события для отправки.
4
+ */
5
+ export declare const dataLayerPush: (eventData: Record<string, any>) => void;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dataLayerPush = void 0;
4
+ const lodash_1 = require("lodash");
5
+ /**
6
+ * Отправка аналитики в око.
7
+ * @param eventData Данные события для отправки.
8
+ */
9
+ const dataLayerPush = (eventData) => {
10
+ var _a;
11
+ const win = window;
12
+ // копируем объект так как window.dataLayer.push может менять аргумент в процессе работы
13
+ lodash_1.isFunction((_a = win.dataLayer) === null || _a === void 0 ? void 0 : _a.push) && win.dataLayer.push(Object.assign({}, eventData));
14
+ };
15
+ exports.dataLayerPush = dataLayerPush;
16
+ //# sourceMappingURL=data-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-layer.js","sourceRoot":"","sources":["../../../src/browser/analytics/data-layer.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAEpC;;;GAGG;AACI,MAAM,aAAa,GAAG,CAAC,SAA8B,EAAE,EAAE;;IAC9D,MAAM,GAAG,GAAQ,MAAM,CAAC;IAExB,wFAAwF;IACxF,mBAAU,CAAC,MAAA,GAAG,CAAC,SAAS,0CAAE,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,mBAAM,SAAS,EAAG,CAAC;AAC1E,CAAC,CAAC;AALW,QAAA,aAAa,iBAKxB"}
@@ -4,14 +4,9 @@ export declare type OkoEvent = Record<string, any>;
4
4
  * @param eventData Данные события для отправки.
5
5
  */
6
6
  export declare const okoPush: (eventData: OkoEvent) => void;
7
- /**
8
- * Эффект для отправки события в ОКО.
9
- * @param data Данные события для отправки в ОКО.
10
- */
11
- export declare function sendAnalytics(data: OkoEvent): Generator<import("redux-saga/effects").CallEffect<void>, void, unknown>;
12
7
  /**
13
8
  * Хук, возвращающий функцию, которая отправит аналитику в ОКО.
14
9
  * @param data Данные события для отправки в ОКО.
15
10
  * @return Функция.
16
11
  */
17
- export declare const useAnalytics: (data: OkoEvent) => () => void;
12
+ export declare const useOkoPush: (data: OkoEvent) => () => void;
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useAnalytics = exports.sendAnalytics = exports.okoPush = void 0;
3
+ exports.useOkoPush = exports.okoPush = void 0;
4
4
  const react_1 = require("react");
5
- const effects_1 = require("redux-saga/effects");
6
5
  const lodash_1 = require("lodash");
7
6
  /**
8
7
  * Отправка аналитики в око.
@@ -10,24 +9,17 @@ const lodash_1 = require("lodash");
10
9
  */
11
10
  const okoPush = (eventData) => {
12
11
  var _a;
12
+ const win = window;
13
13
  // копируем объект так как window.oko.push меняет свой аргумент в процессе выполнения
14
- lodash_1.isFunction((_a = window.oko) === null || _a === void 0 ? void 0 : _a.push) && window.oko.push(Object.assign({}, eventData));
14
+ lodash_1.isFunction((_a = win.oko) === null || _a === void 0 ? void 0 : _a.push) && win.oko.push(Object.assign({}, eventData));
15
15
  };
16
16
  exports.okoPush = okoPush;
17
- /**
18
- * Эффект для отправки события в ОКО.
19
- * @param data Данные события для отправки в ОКО.
20
- */
21
- function* sendAnalytics(data) {
22
- yield effects_1.call(exports.okoPush, data);
23
- }
24
- exports.sendAnalytics = sendAnalytics;
25
17
  /**
26
18
  * Хук, возвращающий функцию, которая отправит аналитику в ОКО.
27
19
  * @param data Данные события для отправки в ОКО.
28
20
  * @return Функция.
29
21
  */
30
- const useAnalytics = (data) => {
22
+ const useOkoPush = (data) => {
31
23
  const dataRef = react_1.useRef();
32
24
  const fnRef = react_1.useRef();
33
25
  if (!dataRef.current) {
@@ -44,5 +36,5 @@ const useAnalytics = (data) => {
44
36
  }
45
37
  return fnRef.current;
46
38
  };
47
- exports.useAnalytics = useAnalytics;
48
- //# sourceMappingURL=index.js.map
39
+ exports.useOkoPush = useOkoPush;
40
+ //# sourceMappingURL=oko.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oko.js","sourceRoot":"","sources":["../../../src/browser/analytics/oko.ts"],"names":[],"mappings":";;;AAAA,iCAA+B;AAC/B,mCAA6C;AAI7C;;;GAGG;AACI,MAAM,OAAO,GAAG,CAAC,SAAmB,EAAE,EAAE;;IAC7C,MAAM,GAAG,GAAQ,MAAM,CAAC;IAExB,qFAAqF;IACrF,mBAAU,CAAC,MAAA,GAAG,CAAC,GAAG,0CAAE,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,mBAAM,SAAS,EAAG,CAAC;AAC9D,CAAC,CAAC;AALW,QAAA,OAAO,WAKlB;AAEF;;;;GAIG;AACI,MAAM,UAAU,GAAG,CAAC,IAAc,EAAE,EAAE;IAC3C,MAAM,OAAO,GAAG,cAAM,EAAY,CAAC;IACnC,MAAM,KAAK,GAAG,cAAM,EAAc,CAAC;IAEnC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QACpB,OAAO,CAAC,OAAO,qBAAQ,IAAI,CAAE,CAAC;KAC/B;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QAClB,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,eAAO,CAAC,OAAO,CAAC,OAAmB,CAAC,CAAC;KAC5D;IAED,IAAI,CAAC,gBAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;QACnC,MAAM,KAAK,CAAC;YACV,gDAAgD;YAChD,wFAAwF;SACzF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACf;IAED,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC,CAAC;AApBW,QAAA,UAAU,cAoBrB"}
@@ -1,14 +1,34 @@
1
- export function isAvailable(): boolean;
2
- export function getItem(key: string): any;
3
- export function setItem(key: string, value: any, duration?: number | undefined): void;
4
- export function isQuotaExceeded(error: Object): boolean;
5
- export default localStorageCache;
1
+ /**
2
+ * Определяет доступен ли кэш.
3
+ * @return Флаг доступности кэш.
4
+ */
5
+ export declare const isAvailable: () => boolean;
6
+ /**
7
+ * Возвращает объект.
8
+ * @param key Ключ.
9
+ * @return Запрашиваемое значение.
10
+ */
11
+ export declare const getItem: (key: string) => unknown;
12
+ /**
13
+ * Добавляет значение.
14
+ * @param key Ключ.
15
+ * @param value Значение.
16
+ * @param duration Время жизни значения в секундах.
17
+ */
18
+ export declare const setItem: (key: string, value: any, duration?: number) => void;
19
+ /**
20
+ * Определяет, превышена ли квота.
21
+ * @param error Информация об ошибке.
22
+ * @return Признак превышения квоты.
23
+ */
24
+ export declare const isQuotaExceeded: (error: any) => boolean;
6
25
  /**
7
26
  * Набор методов для работы с кэшем.
8
- * @type {{set: Function, get: Function, status: boolean}}
9
27
  */
10
- declare const localStorageCache: {
11
- set: Function;
12
- get: Function;
13
- status: boolean;
28
+ declare const LocalStorageCache: {
29
+ readonly get: (key: string) => unknown;
30
+ readonly set: (key: string, value: any, duration?: number) => void;
31
+ readonly status: boolean;
32
+ readonly quotaExceeded: (error: any) => boolean;
14
33
  };
34
+ export default LocalStorageCache;
@@ -3,17 +3,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isQuotaExceeded = exports.setItem = exports.getItem = exports.isAvailable = void 0;
4
4
  /**
5
5
  * Определяет доступен ли кэш.
6
- * @return {boolean} Флаг доступности кэш.
6
+ * @return Флаг доступности кэш.
7
7
  */
8
- const isAvailable = () => typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';
8
+ const isAvailable = () => {
9
+ try {
10
+ const testKey = `local_storage_test_key::${Date.now()}`;
11
+ window.localStorage.setItem(testKey, testKey);
12
+ window.localStorage.removeItem(testKey);
13
+ return true;
14
+ }
15
+ catch (_a) {
16
+ return false;
17
+ }
18
+ };
9
19
  exports.isAvailable = isAvailable;
10
20
  /**
11
- * Возвращает объект из кэша.
12
- * @param {string} key Ключ.
13
- * @return {*} Запрашиваемое значение из кэша.
21
+ * Возвращает объект.
22
+ * @param key Ключ.
23
+ * @return Запрашиваемое значение.
14
24
  */
15
- const getItem = key => {
16
- const { value, expire } = JSON.parse(localStorage.getItem(key)) || {};
25
+ const getItem = (key) => {
26
+ const { value, expire } = JSON.parse(localStorage.getItem(key) || '{}');
17
27
  const now = Date.now();
18
28
  const isExpired = expire
19
29
  ? now > expire
@@ -23,10 +33,10 @@ const getItem = key => {
23
33
  };
24
34
  exports.getItem = getItem;
25
35
  /**
26
- * Добавляет значение в кэш.
27
- * @param {string} key Ключ.
28
- * @param {*} value Значение.
29
- * @param {number} [duration=3600] Время жизни значения в кэше в секундах.
36
+ * Добавляет значение.
37
+ * @param key Ключ.
38
+ * @param value Значение.
39
+ * @param duration Время жизни значения в секундах.
30
40
  */
31
41
  const setItem = (key, value, duration = 3600) => {
32
42
  const now = Date.now();
@@ -39,11 +49,11 @@ const setItem = (key, value, duration = 3600) => {
39
49
  };
40
50
  exports.setItem = setItem;
41
51
  /**
42
- * Определяет, привышена ли квота.
43
- * @param {Object} error Информация об ошибке.
44
- * @return {boolean} Признак привышения квоты.
52
+ * Определяет, превышена ли квота.
53
+ * @param error Информация об ошибке.
54
+ * @return Признак превышения квоты.
45
55
  */
46
- const isQuotaExceeded = error => {
56
+ const isQuotaExceeded = (error) => {
47
57
  let quotaExceeded = false;
48
58
  if (error) {
49
59
  if (error.code) {
@@ -60,7 +70,7 @@ const isQuotaExceeded = error => {
60
70
  }
61
71
  }
62
72
  else if (error.number === -2147024882) {
63
- // Internet Explorer 8
73
+ // IE 8
64
74
  quotaExceeded = true;
65
75
  }
66
76
  }
@@ -69,13 +79,12 @@ const isQuotaExceeded = error => {
69
79
  exports.isQuotaExceeded = isQuotaExceeded;
70
80
  /**
71
81
  * Набор методов для работы с кэшем.
72
- * @type {{set: Function, get: Function, status: boolean}}
73
82
  */
74
- const localStorageCache = {
83
+ const LocalStorageCache = {
75
84
  get: exports.getItem,
76
85
  set: exports.setItem,
77
86
  status: exports.isAvailable(),
78
87
  quotaExceeded: exports.isQuotaExceeded,
79
88
  };
80
- exports.default = localStorageCache;
89
+ exports.default = LocalStorageCache;
81
90
  //# sourceMappingURL=local-storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-storage.js","sourceRoot":"","sources":["../../src/cache/local-storage.js"],"names":[],"mappings":";;;AAAA;;;GAGG;AACI,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,WAAW,CAAC;AAAhG,QAAA,WAAW,eAAqF;AAE7G;;;;GAIG;AACI,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE;IAC3B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,MAAM;QACtB,CAAC,CAAC,GAAG,GAAG,MAAM;QACd,CAAC,CAAC,IAAI,CAAC;IAET,SAAS,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE1C,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AAClC,CAAC,CAAC;AAVW,QAAA,OAAO,WAUlB;AAEF;;;;;GAKG;AACI,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,EAAE;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC;IAEhC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;QACvC,KAAK;QACL,MAAM;KACP,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AATW,QAAA,OAAO,WASlB;AAEF;;;;GAIG;AACI,MAAM,eAAe,GAAG,KAAK,CAAC,EAAE;IACrC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,KAAK,EAAE;QACT,IAAI,KAAK,CAAC,IAAI,EAAE;YACd,QAAQ,KAAK,CAAC,IAAI,EAAE;gBAClB,KAAK,EAAE;oBACL,aAAa,GAAG,IAAI,CAAC;oBACrB,MAAM;gBACR,KAAK,IAAI;oBACP,UAAU;oBACV,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B,EAAE;wBAC/C,aAAa,GAAG,IAAI,CAAC;qBACtB;oBACD,MAAM;aACT;SACF;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,UAAU,EAAE;YACvC,sBAAsB;YACtB,aAAa,GAAG,IAAI,CAAC;SACtB;KACF;IACD,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AArBW,QAAA,eAAe,mBAqB1B;AAEF;;;GAGG;AACH,MAAM,iBAAiB,GAAG;IACxB,GAAG,EAAE,eAAO;IACZ,GAAG,EAAE,eAAO;IACZ,MAAM,EAAE,mBAAW,EAAE;IACrB,aAAa,EAAE,uBAAe;CAC/B,CAAC;AAEF,kBAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"local-storage.js","sourceRoot":"","sources":["../../src/cache/local-storage.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACI,MAAM,WAAW,GAAG,GAAY,EAAE;IACvC,IAAI;QACF,MAAM,OAAO,GAAG,2BAA2B,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAExD,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAExC,OAAO,IAAI,CAAC;KACb;IAAC,WAAM;QACN,OAAO,KAAK,CAAC;KACd;AACH,CAAC,CAAA;AAXY,QAAA,WAAW,eAWvB;AAED;;;;GAIG;AACI,MAAM,OAAO,GAAG,CAAC,GAAW,EAAW,EAAE;IAC9C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,MAAM;QACtB,CAAC,CAAC,GAAG,GAAG,MAAM;QACd,CAAC,CAAC,IAAI,CAAC;IAET,SAAS,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE1C,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AAClC,CAAC,CAAC;AAVW,QAAA,OAAO,WAUlB;AAEF;;;;;GAKG;AACI,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,QAAQ,GAAG,IAAI,EAAE,EAAE;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC;IAEhC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;QACvC,KAAK;QACL,MAAM;KACP,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AATW,QAAA,OAAO,WASlB;AAEF;;;;GAIG;AACI,MAAM,eAAe,GAAG,CAAC,KAAU,EAAW,EAAE;IACrD,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,IAAI,KAAK,EAAE;QACT,IAAI,KAAK,CAAC,IAAI,EAAE;YACd,QAAQ,KAAK,CAAC,IAAI,EAAE;gBAClB,KAAK,EAAE;oBACL,aAAa,GAAG,IAAI,CAAC;oBACrB,MAAM;gBACR,KAAK,IAAI;oBACP,UAAU;oBACV,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B,EAAE;wBAC/C,aAAa,GAAG,IAAI,CAAC;qBACtB;oBACD,MAAM;aACT;SACF;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,UAAU,EAAE;YACvC,OAAO;YACP,aAAa,GAAG,IAAI,CAAC;SACtB;KACF;IAED,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AAvBW,QAAA,eAAe,mBAuB1B;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,GAAG,EAAE,eAAO;IACZ,GAAG,EAAE,eAAO;IACZ,MAAM,EAAE,mBAAW,EAAE;IACrB,aAAa,EAAE,uBAAe;CACtB,CAAC;AAEX,kBAAe,iBAAiB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { Middleware } from 'middleware-axios';
1
+ import type { Middleware } from 'middleware-axios';
2
2
  import { Tracer, SpanContext } from 'opentracing';
3
3
  /**
4
4
  * Создаёт middleware для трассировки запросов в API.
@@ -20,23 +20,35 @@ const opentracing_1 = require("opentracing");
20
20
  */
21
21
  const createTraceRequestMiddleware = ({ tracer, context }) => function (config, next, defaults) {
22
22
  return __awaiter(this, void 0, void 0, function* () {
23
- const url = config.url || defaults.url || '';
24
- const baseURL = config.baseURL || defaults.baseURL || '';
25
- const methodName = (config.method || 'GET').toUpperCase();
26
- const [readyUrl, foundId] = exports.hideFirstId(`${baseURL}${url}`);
27
- const span = tracer.startSpan(`HTTP ${methodName} ${readyUrl}`, {
23
+ const { method, url, foundId } = getRequestInfo(config, defaults);
24
+ const span = tracer.startSpan(`HTTP ${method} ${url}`, {
28
25
  childOf: context,
29
26
  });
30
27
  if (!config.headers) {
31
28
  config.headers = {};
32
29
  }
33
- span.addTags(Object.assign({ [opentracing_1.Tags.HTTP_URL]: readyUrl, [opentracing_1.Tags.HTTP_METHOD]: methodName, 'request.params': Object.assign({}, config.params), 'request.headers': Object.assign({}, config.headers) }, (foundId && { 'request.id': foundId })));
30
+ span.addTags(Object.assign({ [opentracing_1.Tags.HTTP_URL]: url, [opentracing_1.Tags.HTTP_METHOD]: method, 'request.params': Object.assign({}, config.params), 'request.headers': Object.assign({}, config.headers) }, (foundId && { 'request.id': foundId })));
34
31
  tracer.inject(span, opentracing_1.FORMAT_HTTP_HEADERS, config.headers);
35
32
  const response = yield next(config);
36
33
  span.setTag(opentracing_1.Tags.HTTP_STATUS_CODE, response.status);
37
34
  span.finish();
38
35
  });
39
36
  };
37
+ /**
38
+ * Формирует базовые данные запроса.
39
+ * Заменяет первое найденное число в url на "{id}", возвращая его в результате.
40
+ * @param config Axios-конфиг запроса.
41
+ * @param defaults Базовый конфиг экземпляра Axios.
42
+ * @return Базовые данные запроса.
43
+ */
44
+ const getRequestInfo = (config, defaults) => {
45
+ const method = (config.method || 'GET').toUpperCase();
46
+ const baseURL = config.baseURL || defaults.baseURL || '';
47
+ // ВАЖНО: абстрагируем id только в url игнорируя baseURL
48
+ const [url, foundId] = exports.hideFirstId(config.url || defaults.url || '');
49
+ const readyUrl = `${baseURL}${url}`;
50
+ return { method, url: readyUrl, foundId };
51
+ };
40
52
  /**
41
53
  * Преобразует строку вида:
42
54
  * "/api/v2/something/123456/some-bff/123456"
@@ -1 +1 @@
1
- {"version":3,"file":"trace-request-middleware.js","sourceRoot":"","sources":["../../../../src/helpers/api/middlewares/trace-request-middleware.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,6CAA6E;AAE7E;;;;;;GAMG;AACH,MAAM,4BAA4B,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAGtD,EAAmB,EAAE,CAAC,UAAgB,MAAM,EAAE,IAAI,EAAE,QAAQ;;QACzD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;QACzD,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAE1D,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,mBAAW,CAAC,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC;QAE5D,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,UAAU,IAAI,QAAQ,EAAE,EAAE;YAC9D,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;SACrB;QAED,IAAI,CAAC,OAAO,iBACV,CAAC,kBAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,EACzB,CAAC,kBAAI,CAAC,WAAW,CAAC,EAAE,UAAU,EAC9B,gBAAgB,oBAAO,MAAM,CAAC,MAAM,GACpC,iBAAiB,oBAAO,MAAM,CAAC,OAAO,KAGnC,CAAC,OAAO,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EACzC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iCAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,MAAM,CAAC,kBAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;CAAA,CAAC;AAEJ;;;;;;;;GAQG;AACI,MAAM,WAAW,GAAG,CAAC,GAAW,EAAgC,EAAE;IACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjC,OAAO,KAAK;QACV,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AANW,QAAA,WAAW,eAMtB;AAEF,kBAAe,4BAA4B,CAAC"}
1
+ {"version":3,"file":"trace-request-middleware.js","sourceRoot":"","sources":["../../../../src/helpers/api/middlewares/trace-request-middleware.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,6CAA6E;AAE7E;;;;;;GAMG;AACH,MAAM,4BAA4B,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAGtD,EAAmB,EAAE,CAAC,UAAgB,MAAM,EAAE,IAAI,EAAE,QAAQ;;QACzD,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAElE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,MAAM,IAAI,GAAG,EAAE,EAAE;YACrD,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;SACrB;QAED,IAAI,CAAC,OAAO,iBACV,CAAC,kBAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,EACpB,CAAC,kBAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAC1B,gBAAgB,oBAAO,MAAM,CAAC,MAAM,GACpC,iBAAiB,oBAAO,MAAM,CAAC,OAAO,KAGnC,CAAC,OAAO,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EACzC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iCAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,MAAM,CAAC,kBAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;CAAA,CAAC;AAEJ;;;;;;GAMG;AACH,MAAM,cAAc,GAAG,CACrB,MAA0B,EAC1B,QAA4B,EAK5B,EAAE;IACF,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;IAEzD,wDAAwD;IACxD,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,mBAAW,CAAC,MAAM,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC;IAEpC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACI,MAAM,WAAW,GAAG,CAAC,GAAW,EAAgC,EAAE;IACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjC,OAAO,KAAK;QACV,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AANW,QAAA,WAAW,eAMtB;AAEF,kBAAe,4BAA4B,CAAC"}
package/package.json CHANGED
@@ -1,28 +1,27 @@
1
1
  {
2
2
  "name": "@sima-land/isomorph",
3
- "version": "9.0.5",
3
+ "version": "10.0.0",
4
4
  "description": "Set of utils that are not directly related to UI",
5
5
  "repository": "ssh://git@github.com:sima-land/isomorph.git",
6
6
  "author": "www.sima-land.ru team",
7
7
  "license": "Apache-2.0",
8
8
  "private": false,
9
9
  "engines": {
10
- "node": ">=10.15.3"
10
+ "node": ">=14.17.0"
11
11
  },
12
12
  "scripts": {
13
13
  "prepare": "",
14
14
  "build:before": "rimraf build",
15
15
  "build:main": "tsc --project tsconfig.build.json",
16
16
  "build:after": "node ./dist.js",
17
- "build": "yarn build:before && yarn build:main && yarn build:after",
17
+ "build": "npm run build:before && npm run build:main && npm run build:after",
18
18
  "type-check": "tsc -p . --noEmit",
19
- "dev": "cd ./examples/hello-world/ && yarn && yarn dev",
20
19
  "lint": "eslint --cache ./src --ext .js,.jsx,.ts,.tsx",
21
20
  "test": "jest",
22
21
  "coverage": "jest --clearCache && jest --coverage"
23
22
  },
24
23
  "dependencies": {
25
- "axios": "0.19.2",
24
+ "axios": "^0.21.1",
26
25
  "express-http-proxy": "^1.5.1",
27
26
  "ioredis": "^4.10.0",
28
27
  "jaeger-client": "^3.15.0",
@@ -34,16 +33,16 @@
34
33
  },
35
34
  "devDependencies": {
36
35
  "@babel/core": "^7.14.2",
37
- "@babel/plugin-proposal-optional-chaining": "^7.14.2",
38
36
  "@babel/preset-env": "^7.14.2",
39
37
  "@babel/preset-react": "^7.13.13",
38
+ "@babel/preset-typescript": "^7.16.5",
40
39
  "@sentry/browser": "^5.15.5",
41
40
  "@sentry/node": "5.10.2",
42
41
  "@sima-land/linters": "^1.0.12",
43
- "@types/enzyme": "^3.10.8",
42
+ "@testing-library/react": "^12.1.3",
44
43
  "@types/express": "^4.17.13",
45
44
  "@types/jaeger-client": "^3.18.2",
46
- "@types/jest": "^26.0.24",
45
+ "@types/jest": "^27.0.3",
47
46
  "@types/lodash": "^4.14.171",
48
47
  "@types/node": "^16.4.5",
49
48
  "@types/react": "^16.14.0",
@@ -52,37 +51,33 @@
52
51
  "@types/webpack": "^5.28.0",
53
52
  "@typescript-eslint/eslint-plugin": "^4.23.0",
54
53
  "@typescript-eslint/parser": "^4.23.0",
55
- "babel-jest": "^27.0.6",
54
+ "babel-jest": "^27.4.5",
56
55
  "copyfiles": "^2.4.1",
57
56
  "dotenv": "^8.2.0",
58
- "enzyme": "3.8.x",
59
- "enzyme-adapter-react-16": "^1.15.6",
60
- "enzyme-to-json": "3.3.x",
61
57
  "husky": "^7.0.1",
62
58
  "identity-obj-proxy": "3.0.x",
63
- "jest": "^27.0.6",
59
+ "jest": "^27.4.5",
64
60
  "lint-staged": "^11.1.1",
65
61
  "lodash": "^4.17.21",
66
- "react": "16.12.0",
67
- "react-dom": "16.12.0",
68
- "react-redux": "7.1.3",
69
- "redux": "4.0.5",
70
- "redux-saga": "1.1.3",
71
- "reduxsauce": "1.1.2",
72
- "reselect": "4.0.0",
62
+ "react": "^17.0.2",
63
+ "react-dom": "^17.0.2",
64
+ "react-redux": "^7.1.3",
65
+ "redux": "^4.0.5",
66
+ "redux-saga": "^1.1.3",
67
+ "reduxsauce": "^1.1.2",
68
+ "reselect": "^4.0.0",
73
69
  "rimraf": "^3.0.2",
74
70
  "sentry-testkit": "^3.2.1",
75
- "ts-jest": "^27.0.4",
76
71
  "typescript": "^4.2.4"
77
72
  },
78
73
  "peerDependencies": {
79
- "lodash": "4.17.15",
80
- "react": "16.12.0",
81
- "react-dom": "16.12.0",
82
- "react-redux": "7.1.3",
83
- "redux": "4.0.5",
84
- "redux-saga": "1.1.3",
85
- "reduxsauce": "1.1.2",
86
- "reselect": "4.0.0"
74
+ "lodash": "^4.17.21",
75
+ "react": "^16.12.0 || ^17.0.2",
76
+ "react-dom": "^16.12.0 || ^17.0.2",
77
+ "react-redux": "^7.1.3",
78
+ "redux": "^4.0.5",
79
+ "redux-saga": "^1.1.3",
80
+ "reduxsauce": "^1.1.2",
81
+ "reselect": "^4.0.0"
87
82
  }
88
83
  }
@@ -0,0 +1,12 @@
1
+ import { isFunction } from 'lodash';
2
+
3
+ /**
4
+ * Отправка аналитики в око.
5
+ * @param eventData Данные события для отправки.
6
+ */
7
+ export const dataLayerPush = (eventData: Record<string, any>) => {
8
+ const win: any = window;
9
+
10
+ // копируем объект так как window.dataLayer.push может менять аргумент в процессе работы
11
+ isFunction(win.dataLayer?.push) && win.dataLayer.push({ ...eventData });
12
+ };
@@ -1,5 +1,4 @@
1
1
  import { useRef } from 'react';
2
- import { call } from 'redux-saga/effects';
3
2
  import { isEqual, isFunction } from 'lodash';
4
3
 
5
4
  export type OkoEvent = Record<string, any>;
@@ -9,24 +8,18 @@ export type OkoEvent = Record<string, any>;
9
8
  * @param eventData Данные события для отправки.
10
9
  */
11
10
  export const okoPush = (eventData: OkoEvent) => {
11
+ const win: any = window;
12
+
12
13
  // копируем объект так как window.oko.push меняет свой аргумент в процессе выполнения
13
- isFunction((window as any).oko?.push) && (window as any).oko.push({ ...eventData });
14
+ isFunction(win.oko?.push) && win.oko.push({ ...eventData });
14
15
  };
15
16
 
16
- /**
17
- * Эффект для отправки события в ОКО.
18
- * @param data Данные события для отправки в ОКО.
19
- */
20
- export function * sendAnalytics (data: OkoEvent) {
21
- yield call(okoPush, data);
22
- }
23
-
24
17
  /**
25
18
  * Хук, возвращающий функцию, которая отправит аналитику в ОКО.
26
19
  * @param data Данные события для отправки в ОКО.
27
20
  * @return Функция.
28
21
  */
29
- export const useAnalytics = (data: OkoEvent) => {
22
+ export const useOkoPush = (data: OkoEvent) => {
30
23
  const dataRef = useRef<OkoEvent>();
31
24
  const fnRef = useRef<() => void>();
32
25
 
@@ -1,16 +1,27 @@
1
1
  /**
2
2
  * Определяет доступен ли кэш.
3
- * @return {boolean} Флаг доступности кэш.
3
+ * @return Флаг доступности кэш.
4
4
  */
5
- export const isAvailable = () => typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';
5
+ export const isAvailable = (): boolean => {
6
+ try {
7
+ const testKey = `local_storage_test_key::${Date.now()}`;
8
+
9
+ window.localStorage.setItem(testKey, testKey);
10
+ window.localStorage.removeItem(testKey);
11
+
12
+ return true;
13
+ } catch {
14
+ return false;
15
+ }
16
+ }
6
17
 
7
18
  /**
8
- * Возвращает объект из кэша.
9
- * @param {string} key Ключ.
10
- * @return {*} Запрашиваемое значение из кэша.
19
+ * Возвращает объект.
20
+ * @param key Ключ.
21
+ * @return Запрашиваемое значение.
11
22
  */
12
- export const getItem = key => {
13
- const { value, expire } = JSON.parse(localStorage.getItem(key)) || {};
23
+ export const getItem = (key: string): unknown => {
24
+ const { value, expire } = JSON.parse(localStorage.getItem(key) || '{}');
14
25
  const now = Date.now();
15
26
  const isExpired = expire
16
27
  ? now > expire
@@ -22,12 +33,12 @@ export const getItem = key => {
22
33
  };
23
34
 
24
35
  /**
25
- * Добавляет значение в кэш.
26
- * @param {string} key Ключ.
27
- * @param {*} value Значение.
28
- * @param {number} [duration=3600] Время жизни значения в кэше в секундах.
36
+ * Добавляет значение.
37
+ * @param key Ключ.
38
+ * @param value Значение.
39
+ * @param duration Время жизни значения в секундах.
29
40
  */
30
- export const setItem = (key, value, duration = 3600) => {
41
+ export const setItem = (key: string, value: any, duration = 3600) => {
31
42
  const now = Date.now();
32
43
  const durationMs = duration * 1000;
33
44
  const expire = now + durationMs;
@@ -39,12 +50,13 @@ export const setItem = (key, value, duration = 3600) => {
39
50
  };
40
51
 
41
52
  /**
42
- * Определяет, привышена ли квота.
43
- * @param {Object} error Информация об ошибке.
44
- * @return {boolean} Признак привышения квоты.
53
+ * Определяет, превышена ли квота.
54
+ * @param error Информация об ошибке.
55
+ * @return Признак превышения квоты.
45
56
  */
46
- export const isQuotaExceeded = error => {
57
+ export const isQuotaExceeded = (error: any): boolean => {
47
58
  let quotaExceeded = false;
59
+
48
60
  if (error) {
49
61
  if (error.code) {
50
62
  switch (error.code) {
@@ -59,22 +71,22 @@ export const isQuotaExceeded = error => {
59
71
  break;
60
72
  }
61
73
  } else if (error.number === -2147024882) {
62
- // Internet Explorer 8
74
+ // IE 8
63
75
  quotaExceeded = true;
64
76
  }
65
77
  }
78
+
66
79
  return quotaExceeded;
67
80
  };
68
81
 
69
82
  /**
70
83
  * Набор методов для работы с кэшем.
71
- * @type {{set: Function, get: Function, status: boolean}}
72
84
  */
73
- const localStorageCache = {
85
+ const LocalStorageCache = {
74
86
  get: getItem,
75
87
  set: setItem,
76
88
  status: isAvailable(),
77
89
  quotaExceeded: isQuotaExceeded,
78
- };
90
+ } as const;
79
91
 
80
- export default localStorageCache;
92
+ export default LocalStorageCache;
@@ -1,4 +1,5 @@
1
- import { Middleware } from 'middleware-axios';
1
+ import type { AxiosRequestConfig } from 'axios';
2
+ import type { Middleware } from 'middleware-axios';
2
3
  import { Tracer, Tags, FORMAT_HTTP_HEADERS, SpanContext } from 'opentracing';
3
4
 
4
5
  /**
@@ -12,13 +13,9 @@ const createTraceRequestMiddleware = ({ tracer, context }: {
12
13
  tracer: Tracer;
13
14
  context: SpanContext;
14
15
  }): Middleware<any> => async function (config, next, defaults) {
15
- const url = config.url || defaults.url || '';
16
- const baseURL = config.baseURL || defaults.baseURL || '';
17
- const methodName = (config.method || 'GET').toUpperCase();
16
+ const { method, url, foundId } = getRequestInfo(config, defaults);
18
17
 
19
- const [readyUrl, foundId] = hideFirstId(`${baseURL}${url}`);
20
-
21
- const span = tracer.startSpan(`HTTP ${methodName} ${readyUrl}`, {
18
+ const span = tracer.startSpan(`HTTP ${method} ${url}`, {
22
19
  childOf: context,
23
20
  });
24
21
 
@@ -27,8 +24,8 @@ const createTraceRequestMiddleware = ({ tracer, context }: {
27
24
  }
28
25
 
29
26
  span.addTags({
30
- [Tags.HTTP_URL]: readyUrl,
31
- [Tags.HTTP_METHOD]: methodName,
27
+ [Tags.HTTP_URL]: url,
28
+ [Tags.HTTP_METHOD]: method,
32
29
  'request.params': { ...config.params },
33
30
  'request.headers': { ...config.headers },
34
31
 
@@ -44,6 +41,31 @@ const createTraceRequestMiddleware = ({ tracer, context }: {
44
41
  span.finish();
45
42
  };
46
43
 
44
+ /**
45
+ * Формирует базовые данные запроса.
46
+ * Заменяет первое найденное число в url на "{id}", возвращая его в результате.
47
+ * @param config Axios-конфиг запроса.
48
+ * @param defaults Базовый конфиг экземпляра Axios.
49
+ * @return Базовые данные запроса.
50
+ */
51
+ const getRequestInfo = (
52
+ config: AxiosRequestConfig,
53
+ defaults: AxiosRequestConfig
54
+ ): {
55
+ method: string;
56
+ url: string;
57
+ foundId?: number;
58
+ } => {
59
+ const method = (config.method || 'GET').toUpperCase();
60
+ const baseURL = config.baseURL || defaults.baseURL || '';
61
+
62
+ // ВАЖНО: абстрагируем id только в url игнорируя baseURL
63
+ const [url, foundId] = hideFirstId(config.url || defaults.url || '');
64
+ const readyUrl = `${baseURL}${url}`;
65
+
66
+ return { method, url: readyUrl, foundId };
67
+ };
68
+
47
69
  /**
48
70
  * Преобразует строку вида:
49
71
  * "/api/v2/something/123456/some-bff/123456"
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/analytics/index.ts"],"names":[],"mappings":";;;AAAA,iCAA+B;AAC/B,gDAA0C;AAC1C,mCAA6C;AAI7C;;;GAGG;AACI,MAAM,OAAO,GAAG,CAAC,SAAmB,EAAE,EAAE;;IAC7C,qFAAqF;IACrF,mBAAU,CAAC,MAAC,MAAc,CAAC,GAAG,0CAAE,IAAI,CAAC,IAAK,MAAc,CAAC,GAAG,CAAC,IAAI,mBAAM,SAAS,EAAG,CAAC;AACtF,CAAC,CAAC;AAHW,QAAA,OAAO,WAGlB;AAEF;;;GAGG;AACH,QAAgB,CAAC,CAAC,aAAa,CAAE,IAAc;IAC7C,MAAM,cAAI,CAAC,eAAO,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC;AAFD,sCAEC;AAED;;;;GAIG;AACI,MAAM,YAAY,GAAG,CAAC,IAAc,EAAE,EAAE;IAC7C,MAAM,OAAO,GAAG,cAAM,EAAY,CAAC;IACnC,MAAM,KAAK,GAAG,cAAM,EAAc,CAAC;IAEnC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QACpB,OAAO,CAAC,OAAO,qBAAQ,IAAI,CAAE,CAAC;KAC/B;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QAClB,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,eAAO,CAAC,OAAO,CAAC,OAAmB,CAAC,CAAC;KAC5D;IAED,IAAI,CAAC,gBAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;QACnC,MAAM,KAAK,CAAC;YACV,gDAAgD;YAChD,wFAAwF;SACzF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACf;IAED,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC,CAAC;AApBW,QAAA,YAAY,gBAoBvB"}