@sima-land/isomorph 9.0.6 → 10.1.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.
- package/browser/analytics/data-layer.d.ts +5 -0
- package/browser/analytics/data-layer.js +16 -0
- package/browser/analytics/data-layer.js.map +1 -0
- package/{helpers/analytics/index.d.ts → browser/analytics/oko.d.ts} +1 -6
- package/{helpers/analytics/index.js → browser/analytics/oko.js} +6 -14
- package/browser/analytics/oko.js.map +1 -0
- package/cache/local-storage.d.ts +30 -10
- package/cache/local-storage.js +28 -19
- package/cache/local-storage.js.map +1 -1
- package/module-federation/__example__/webpack-config.example.js +8 -1
- package/module-federation/__example__/webpack-config.example.js.map +1 -1
- package/module-federation/enhanced-module-federation-plugin.d.ts +27 -4
- package/module-federation/enhanced-module-federation-plugin.js +30 -5
- package/module-federation/enhanced-module-federation-plugin.js.map +1 -1
- package/module-federation/utils/index.d.ts +12 -4
- package/module-federation/utils/index.js +10 -5
- package/module-federation/utils/index.js.map +1 -1
- package/package.json +24 -29
- package/src/browser/analytics/data-layer.ts +12 -0
- package/src/{helpers/analytics/index.ts → browser/analytics/oko.ts} +4 -11
- package/src/cache/{local-storage.js → local-storage.ts} +33 -21
- package/src/module-federation/__example__/webpack-config.example.js +8 -1
- package/src/module-federation/enhanced-module-federation-plugin.js +34 -7
- package/src/module-federation/utils/index.js +14 -7
- package/helpers/analytics/index.js.map +0 -1
|
@@ -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
|
|
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.
|
|
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 =
|
|
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
|
|
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.
|
|
48
|
-
//# sourceMappingURL=
|
|
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"}
|
package/cache/local-storage.d.ts
CHANGED
|
@@ -1,14 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export
|
|
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
|
|
11
|
-
|
|
12
|
-
|
|
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;
|
package/cache/local-storage.js
CHANGED
|
@@ -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
|
|
6
|
+
* @return Флаг доступности кэш.
|
|
7
7
|
*/
|
|
8
|
-
const isAvailable = () =>
|
|
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
|
|
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
|
|
28
|
-
* @param
|
|
29
|
-
* @param
|
|
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
|
|
44
|
-
* @return
|
|
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
|
-
//
|
|
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
|
|
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 =
|
|
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.
|
|
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"}
|
|
@@ -30,7 +30,14 @@ const HostServiceConfig = {
|
|
|
30
30
|
new ExtendedMFPlugin({
|
|
31
31
|
name: 'host-service-name',
|
|
32
32
|
remotes: {
|
|
33
|
-
|
|
33
|
+
firstRemoteService: 'first-remote-service-name',
|
|
34
|
+
secondRemoteService: {
|
|
35
|
+
name: 'second-remote-service-name', // Путь к remote entry определяется в рантайме
|
|
36
|
+
},
|
|
37
|
+
thirdRemoteService: {
|
|
38
|
+
name: 'third-remote-service-name',
|
|
39
|
+
remoteEntryPath: '//path/to/remoteEntry.js', // Путь к remote entry задан явно
|
|
40
|
+
},
|
|
34
41
|
},
|
|
35
42
|
}),
|
|
36
43
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webpack-config.example.js","sourceRoot":"","sources":["../../../src/module-federation/__example__/webpack-config.example.js"],"names":[],"mappings":";AAAA;;GAEG;AACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,mBAAmB,GAAG;IAC1B,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;IAC1E,OAAO,EAAE;QACP,IAAI,gBAAgB,CAClB;YACE,IAAI,EAAE,qBAAqB;YAC3B,QAAQ,EACJ,uBAAuB,OAAO,CAAC,GAAG,CAAC,kBAAkB,gBAAgB,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK;YAC7G,OAAO,EAAE;gBACP,SAAS,EAAE,yBAAyB;gBACpC,UAAU,EAAE,wBAAwB;aACrC;SACF,CACF;KACF;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,KAAK,EAAE,gBAAgB;IACvB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;IAC1E,OAAO,EAAE;QACP,IAAI,gBAAgB,CAClB;YACE,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE;gBACP,
|
|
1
|
+
{"version":3,"file":"webpack-config.example.js","sourceRoot":"","sources":["../../../src/module-federation/__example__/webpack-config.example.js"],"names":[],"mappings":";AAAA;;GAEG;AACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,mBAAmB,GAAG;IAC1B,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;IAC1E,OAAO,EAAE;QACP,IAAI,gBAAgB,CAClB;YACE,IAAI,EAAE,qBAAqB;YAC3B,QAAQ,EACJ,uBAAuB,OAAO,CAAC,GAAG,CAAC,kBAAkB,gBAAgB,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK;YAC7G,OAAO,EAAE;gBACP,SAAS,EAAE,yBAAyB;gBACpC,UAAU,EAAE,wBAAwB;aACrC;SACF,CACF;KACF;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,KAAK,EAAE,gBAAgB;IACvB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;IAC1E,OAAO,EAAE;QACP,IAAI,gBAAgB,CAClB;YACE,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE;gBACP,kBAAkB,EAAE,2BAA2B;gBAC/C,mBAAmB,EAAE;oBACnB,IAAI,EAAE,4BAA4B,EAAE,8CAA8C;iBACnF;gBACD,kBAAkB,EAAE;oBAClB,IAAI,EAAE,2BAA2B;oBACjC,eAAe,EAAE,0BAA0B,EAAE,iCAAiC;iBAC/E;aACF;SACF,CACF;KACF;IACD,OAAO,EAAE;QACP;;WAEG;QACH,QAAQ,EAAE;YACR,qBAAqB,EAAE,mCAAmC;YAC1D,sBAAsB,EAAE,mCAAmC;SAC5D;KACF;CACF,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG;IACf,mBAAmB;IACnB,iBAAiB;CAClB,CAAC"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
export = EnhancedModuleFederationPlugin;
|
|
2
|
-
/** @typedef {string}
|
|
2
|
+
/** @typedef {string} RemoteName Имя удаленного сервиса (обычно совпадает с именем в git). */
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {Object} RemoteProperty Опции подключения удаленного сервиса.
|
|
5
|
+
* @property {RemoteName} name Имя удаленного сервиса.
|
|
6
|
+
* @property {string} remoteEntryPath Статический путь к remoteEntry удаленного сервиса.
|
|
7
|
+
* @property {string} [version] Версия удаленного сервиса в формате semver.
|
|
8
|
+
*/
|
|
3
9
|
/** @typedef {import('webpack').ModuleFederationPluginOptions} MFPluginOriginalOptions Опции. */
|
|
4
10
|
/**
|
|
5
11
|
* @typedef EnhancedModuleFederationPluginOptions Опции.
|
|
6
12
|
* @param {string} name Имя сервиса.
|
|
7
13
|
* @param {string} filename Имя удаленной точки входа.
|
|
8
|
-
* @param {Object<string,
|
|
14
|
+
* @param {Object<string, RemoteName | RemoteProperty>} [remotes] Удаленные сервисы.
|
|
9
15
|
* @param {MFPluginOriginalOptions.exposes} [exposes] Предоставляемые сервисы.
|
|
10
16
|
* @param {MFPluginOriginalOptions.shared} [shared] Общие зависимости.
|
|
11
17
|
* @param {string} [remoteEntriesGlobalKey = '__RemoteEntriesList__'] Ключ свойства в глобальном объекте,
|
|
@@ -30,12 +36,29 @@ declare class EnhancedModuleFederationPlugin {
|
|
|
30
36
|
apply(compiler: import('webpack').Compiler): void;
|
|
31
37
|
}
|
|
32
38
|
declare namespace EnhancedModuleFederationPlugin {
|
|
33
|
-
export {
|
|
39
|
+
export { RemoteName, RemoteProperty, MFPluginOriginalOptions, EnhancedModuleFederationPluginOptions };
|
|
34
40
|
}
|
|
35
41
|
/**
|
|
36
42
|
* Имя удаленного сервиса (обычно совпадает с именем в git).
|
|
37
43
|
*/
|
|
38
|
-
type
|
|
44
|
+
type RemoteName = string;
|
|
45
|
+
/**
|
|
46
|
+
* Опции подключения удаленного сервиса.
|
|
47
|
+
*/
|
|
48
|
+
type RemoteProperty = {
|
|
49
|
+
/**
|
|
50
|
+
* Имя удаленного сервиса.
|
|
51
|
+
*/
|
|
52
|
+
name: RemoteName;
|
|
53
|
+
/**
|
|
54
|
+
* Статический путь к remoteEntry удаленного сервиса.
|
|
55
|
+
*/
|
|
56
|
+
remoteEntryPath: string;
|
|
57
|
+
/**
|
|
58
|
+
* Версия удаленного сервиса в формате semver.
|
|
59
|
+
*/
|
|
60
|
+
version?: string | undefined;
|
|
61
|
+
};
|
|
39
62
|
/**
|
|
40
63
|
* Опции.
|
|
41
64
|
*/
|
|
@@ -18,13 +18,24 @@ const LIBRARY_ERROR_TEXT = [
|
|
|
18
18
|
'For override global variable name use "containersGlobalKey" property.',
|
|
19
19
|
'For override "library" type use ModuleFederationPlugin.',
|
|
20
20
|
].join(' ');
|
|
21
|
-
|
|
21
|
+
const REMOTE_ERROR_TEXT = [
|
|
22
|
+
'The value of the remote element must be a string,',
|
|
23
|
+
'or an object with field `name` for dynamic resolution of `remoteEntry`.',
|
|
24
|
+
'Set `remoteEntryPath` field to object for a static path to `remoteEntry`.',
|
|
25
|
+
].join(' ');
|
|
26
|
+
/** @typedef {string} RemoteName Имя удаленного сервиса (обычно совпадает с именем в git). */
|
|
27
|
+
/**
|
|
28
|
+
* @typedef {Object} RemoteProperty Опции подключения удаленного сервиса.
|
|
29
|
+
* @property {RemoteName} name Имя удаленного сервиса.
|
|
30
|
+
* @property {string} remoteEntryPath Статический путь к remoteEntry удаленного сервиса.
|
|
31
|
+
* @property {string} [version] Версия удаленного сервиса в формате semver.
|
|
32
|
+
*/
|
|
22
33
|
/** @typedef {import('webpack').ModuleFederationPluginOptions} MFPluginOriginalOptions Опции. */
|
|
23
34
|
/**
|
|
24
35
|
* @typedef EnhancedModuleFederationPluginOptions Опции.
|
|
25
36
|
* @param {string} name Имя сервиса.
|
|
26
37
|
* @param {string} filename Имя удаленной точки входа.
|
|
27
|
-
* @param {Object<string,
|
|
38
|
+
* @param {Object<string, RemoteName | RemoteProperty>} [remotes] Удаленные сервисы.
|
|
28
39
|
* @param {MFPluginOriginalOptions.exposes} [exposes] Предоставляемые сервисы.
|
|
29
40
|
* @param {MFPluginOriginalOptions.shared} [shared] Общие зависимости.
|
|
30
41
|
* @param {string} [remoteEntriesGlobalKey = '__RemoteEntriesList__'] Ключ свойства в глобальном объекте,
|
|
@@ -42,10 +53,17 @@ class EnhancedModuleFederationPlugin {
|
|
|
42
53
|
* @param {EnhancedModuleFederationPluginOptions} options Опции.
|
|
43
54
|
*/
|
|
44
55
|
constructor(options) {
|
|
45
|
-
const { name, library, remoteEntriesGlobalKey = '__RemoteEntriesList__', containersGlobalKey = '__FederationContainers__', } = options;
|
|
56
|
+
const { name, library, remotes, remoteEntriesGlobalKey = '__RemoteEntriesList__', containersGlobalKey = '__FederationContainers__', } = options;
|
|
46
57
|
if (library) {
|
|
47
58
|
throw new WebpackError(LIBRARY_ERROR_TEXT);
|
|
48
59
|
}
|
|
60
|
+
if (remotes) {
|
|
61
|
+
Object.values(remotes).forEach(value => {
|
|
62
|
+
if (typeof value !== 'string' && !(value === null || value === void 0 ? void 0 : value.name)) {
|
|
63
|
+
throw new WebpackError(REMOTE_ERROR_TEXT);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
49
67
|
this._options = Object.assign(Object.assign({}, options), { remoteEntriesGlobalKey,
|
|
50
68
|
containersGlobalKey, library: {
|
|
51
69
|
type: 'global',
|
|
@@ -58,8 +76,15 @@ class EnhancedModuleFederationPlugin {
|
|
|
58
76
|
apply(compiler) {
|
|
59
77
|
const _a = this._options, { remotes, remoteEntriesGlobalKey, containersGlobalKey, useInDevelopment = false } = _a, originalOptions = __rest(_a, ["remotes", "remoteEntriesGlobalKey", "containersGlobalKey", "useInDevelopment"]);
|
|
60
78
|
const configuredRemotes = {};
|
|
61
|
-
remotes && Object.
|
|
62
|
-
|
|
79
|
+
remotes && Object.entries(remotes).forEach(([key, value]) => {
|
|
80
|
+
const serviceName = (value === null || value === void 0 ? void 0 : value.name) || value;
|
|
81
|
+
const remoteEntryPath = value === null || value === void 0 ? void 0 : value.remoteEntryPath;
|
|
82
|
+
configuredRemotes[key] = { external: createExternalConfig({
|
|
83
|
+
serviceName,
|
|
84
|
+
remoteEntryPath,
|
|
85
|
+
remoteEntriesGlobalKey,
|
|
86
|
+
containersGlobalKey,
|
|
87
|
+
}) };
|
|
63
88
|
});
|
|
64
89
|
compiler.hooks.environment.tap('EnhancedModuleFederationPlugin', () => {
|
|
65
90
|
if (useInDevelopment || compiler.options.mode === 'production') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhanced-module-federation-plugin.js","sourceRoot":"","sources":["../../src/module-federation/enhanced-module-federation-plugin.js"],"names":[],"mappings":";;;;;;;;;;;;AAAA,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;AAChE,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC;AACrD,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAEpD,MAAM,kBAAkB,GAAG;IACzB,mEAAmE;IACnE,uEAAuE;IACvE,yDAAyD;CAC1D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,
|
|
1
|
+
{"version":3,"file":"enhanced-module-federation-plugin.js","sourceRoot":"","sources":["../../src/module-federation/enhanced-module-federation-plugin.js"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Возвращает скрипт инициализации удаленного модуля.
|
|
3
|
-
* @param {
|
|
4
|
-
* @param {string}
|
|
5
|
-
* @param {string}
|
|
3
|
+
* @param {Object} params Параметры.
|
|
4
|
+
* @param {string} params.serviceName Имя сервиса, содержащего удаленные модули.
|
|
5
|
+
* @param {string} params.remoteEntriesGlobalKey Глобальная переменная,
|
|
6
|
+
* в которой хранятся пути к удаленным точкам входа.
|
|
7
|
+
* @param {string} params.containersGlobalKey Глобальная переменная, в которую добавляются удаленные контейнеры.
|
|
8
|
+
* @param {string} params.remoteEntryPath Путь к remoteEntry, если его не надо получать в рантайме.
|
|
6
9
|
* @return {string} Скрипт инициализации.
|
|
7
10
|
*/
|
|
8
|
-
export function createExternalConfig(serviceName
|
|
11
|
+
export function createExternalConfig({ serviceName, remoteEntryPath, remoteEntriesGlobalKey, containersGlobalKey, }: {
|
|
12
|
+
serviceName: string;
|
|
13
|
+
remoteEntriesGlobalKey: string;
|
|
14
|
+
containersGlobalKey: string;
|
|
15
|
+
remoteEntryPath: string;
|
|
16
|
+
}): string;
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Возвращает скрипт инициализации удаленного модуля.
|
|
4
|
-
* @param {
|
|
5
|
-
* @param {string}
|
|
6
|
-
* @param {string}
|
|
4
|
+
* @param {Object} params Параметры.
|
|
5
|
+
* @param {string} params.serviceName Имя сервиса, содержащего удаленные модули.
|
|
6
|
+
* @param {string} params.remoteEntriesGlobalKey Глобальная переменная,
|
|
7
|
+
* в которой хранятся пути к удаленным точкам входа.
|
|
8
|
+
* @param {string} params.containersGlobalKey Глобальная переменная, в которую добавляются удаленные контейнеры.
|
|
9
|
+
* @param {string} params.remoteEntryPath Путь к remoteEntry, если его не надо получать в рантайме.
|
|
7
10
|
* @return {string} Скрипт инициализации.
|
|
8
11
|
*/
|
|
9
|
-
const createExternalConfig = (serviceName, remoteEntriesGlobalKey, containersGlobalKey) => `promise new Promise((resolve, reject) => {
|
|
12
|
+
const createExternalConfig = ({ serviceName, remoteEntryPath, remoteEntriesGlobalKey, containersGlobalKey, }) => `promise new Promise((resolve, reject) => {
|
|
10
13
|
if (window['${remoteEntriesGlobalKey}']) {
|
|
11
14
|
const scriptElement = document.createElement('script');
|
|
12
15
|
scriptElement.onload = () => {
|
|
@@ -17,7 +20,9 @@ const createExternalConfig = (serviceName, remoteEntriesGlobalKey, containersGlo
|
|
|
17
20
|
scriptElement.remove();
|
|
18
21
|
reject(new Error('Failed loading remoteEntry for "${serviceName}".'));
|
|
19
22
|
};
|
|
20
|
-
scriptElement.src =
|
|
23
|
+
scriptElement.src = ${remoteEntryPath
|
|
24
|
+
? `'${remoteEntryPath}'`
|
|
25
|
+
: `window['${remoteEntriesGlobalKey}']['${serviceName}']`};
|
|
21
26
|
scriptElement.async = true;
|
|
22
27
|
document.head.append(scriptElement);
|
|
23
28
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/module-federation/utils/index.js"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/module-federation/utils/index.js"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;AACH,MAAM,oBAAoB,GAAG,CAAC,EAC5B,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,mBAAmB,GACpB,EAAE,EAAE,CACD;gBACY,sBAAsB;;;;wBAId,mBAAmB,OAAO,WAAW;;;;0DAIH,WAAW;;0BAE3C,eAAe;IACjC,CAAC,CAAC,IAAI,eAAe,GAAG;IACxB,CAAC,CAAC,WAAW,sBAAsB,OAAO,WAAW,IACzD;;;;yCAIqC,sBAAsB;;GAE5D,CAAC;AAEJ,MAAM,CAAC,OAAO,GAAG,EAAE,oBAAoB,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,28 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sima-land/isomorph",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "10.1.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
|
+
"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": "
|
|
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.
|
|
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
|
-
"@
|
|
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": "^
|
|
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.
|
|
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.
|
|
59
|
+
"jest": "^27.4.5",
|
|
64
60
|
"lint-staged": "^11.1.1",
|
|
65
61
|
"lodash": "^4.17.21",
|
|
66
|
-
"react": "
|
|
67
|
-
"react-dom": "
|
|
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.
|
|
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(
|
|
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
|
|
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
|
|
3
|
+
* @return Флаг доступности кэш.
|
|
4
4
|
*/
|
|
5
|
-
export const isAvailable = () =>
|
|
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
|
|
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
|
|
27
|
-
* @param
|
|
28
|
-
* @param
|
|
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
|
|
44
|
-
* @return
|
|
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
|
-
//
|
|
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
|
|
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
|
|
92
|
+
export default LocalStorageCache;
|
|
@@ -35,7 +35,14 @@ const HostServiceConfig = {
|
|
|
35
35
|
{
|
|
36
36
|
name: 'host-service-name',
|
|
37
37
|
remotes: {
|
|
38
|
-
|
|
38
|
+
firstRemoteService: 'first-remote-service-name', // Путь к remote entry определяется в рантайме
|
|
39
|
+
secondRemoteService: {
|
|
40
|
+
name: 'second-remote-service-name', // Путь к remote entry определяется в рантайме
|
|
41
|
+
},
|
|
42
|
+
thirdRemoteService: {
|
|
43
|
+
name: 'third-remote-service-name',
|
|
44
|
+
remoteEntryPath: '//path/to/remoteEntry.js', // Путь к remote entry задан явно
|
|
45
|
+
},
|
|
39
46
|
},
|
|
40
47
|
}
|
|
41
48
|
),
|
|
@@ -8,14 +8,28 @@ const LIBRARY_ERROR_TEXT = [
|
|
|
8
8
|
'For override "library" type use ModuleFederationPlugin.',
|
|
9
9
|
].join(' ');
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
const REMOTE_ERROR_TEXT = [
|
|
12
|
+
'The value of the remote element must be a string,',
|
|
13
|
+
'or an object with field `name` for dynamic resolution of `remoteEntry`.',
|
|
14
|
+
'Set `remoteEntryPath` field to object for a static path to `remoteEntry`.',
|
|
15
|
+
].join(' ');
|
|
16
|
+
|
|
17
|
+
/** @typedef {string} RemoteName Имя удаленного сервиса (обычно совпадает с именем в git). */
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @typedef {Object} RemoteProperty Опции подключения удаленного сервиса.
|
|
21
|
+
* @property {RemoteName} name Имя удаленного сервиса.
|
|
22
|
+
* @property {string} remoteEntryPath Статический путь к remoteEntry удаленного сервиса.
|
|
23
|
+
* @property {string} [version] Версия удаленного сервиса в формате semver.
|
|
24
|
+
*/
|
|
25
|
+
|
|
12
26
|
/** @typedef {import('webpack').ModuleFederationPluginOptions} MFPluginOriginalOptions Опции. */
|
|
13
27
|
|
|
14
28
|
/**
|
|
15
29
|
* @typedef EnhancedModuleFederationPluginOptions Опции.
|
|
16
30
|
* @param {string} name Имя сервиса.
|
|
17
31
|
* @param {string} filename Имя удаленной точки входа.
|
|
18
|
-
* @param {Object<string,
|
|
32
|
+
* @param {Object<string, RemoteName | RemoteProperty>} [remotes] Удаленные сервисы.
|
|
19
33
|
* @param {MFPluginOriginalOptions.exposes} [exposes] Предоставляемые сервисы.
|
|
20
34
|
* @param {MFPluginOriginalOptions.shared} [shared] Общие зависимости.
|
|
21
35
|
* @param {string} [remoteEntriesGlobalKey = '__RemoteEntriesList__'] Ключ свойства в глобальном объекте,
|
|
@@ -37,6 +51,7 @@ class EnhancedModuleFederationPlugin {
|
|
|
37
51
|
const {
|
|
38
52
|
name,
|
|
39
53
|
library,
|
|
54
|
+
remotes,
|
|
40
55
|
remoteEntriesGlobalKey = '__RemoteEntriesList__',
|
|
41
56
|
containersGlobalKey = '__FederationContainers__',
|
|
42
57
|
} = options;
|
|
@@ -45,6 +60,14 @@ class EnhancedModuleFederationPlugin {
|
|
|
45
60
|
throw new WebpackError(LIBRARY_ERROR_TEXT);
|
|
46
61
|
}
|
|
47
62
|
|
|
63
|
+
if (remotes) {
|
|
64
|
+
Object.values(remotes).forEach(value => {
|
|
65
|
+
if (typeof value !== 'string' && !value?.name) {
|
|
66
|
+
throw new WebpackError(REMOTE_ERROR_TEXT);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
48
71
|
this._options = {
|
|
49
72
|
...options,
|
|
50
73
|
remoteEntriesGlobalKey,
|
|
@@ -70,12 +93,16 @@ class EnhancedModuleFederationPlugin {
|
|
|
70
93
|
|
|
71
94
|
const configuredRemotes = {};
|
|
72
95
|
|
|
73
|
-
remotes && Object.
|
|
74
|
-
|
|
75
|
-
|
|
96
|
+
remotes && Object.entries(remotes).forEach(([key, value]) => {
|
|
97
|
+
const serviceName = value?.name || value;
|
|
98
|
+
const remoteEntryPath = value?.remoteEntryPath;
|
|
99
|
+
|
|
100
|
+
configuredRemotes[key] = { external: createExternalConfig({
|
|
101
|
+
serviceName,
|
|
102
|
+
remoteEntryPath,
|
|
76
103
|
remoteEntriesGlobalKey,
|
|
77
|
-
containersGlobalKey
|
|
78
|
-
) };
|
|
104
|
+
containersGlobalKey,
|
|
105
|
+
}) };
|
|
79
106
|
});
|
|
80
107
|
|
|
81
108
|
compiler.hooks.environment.tap('EnhancedModuleFederationPlugin', () => {
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Возвращает скрипт инициализации удаленного модуля.
|
|
3
|
-
* @param {
|
|
4
|
-
* @param {string}
|
|
5
|
-
* @param {string}
|
|
3
|
+
* @param {Object} params Параметры.
|
|
4
|
+
* @param {string} params.serviceName Имя сервиса, содержащего удаленные модули.
|
|
5
|
+
* @param {string} params.remoteEntriesGlobalKey Глобальная переменная,
|
|
6
|
+
* в которой хранятся пути к удаленным точкам входа.
|
|
7
|
+
* @param {string} params.containersGlobalKey Глобальная переменная, в которую добавляются удаленные контейнеры.
|
|
8
|
+
* @param {string} params.remoteEntryPath Путь к remoteEntry, если его не надо получать в рантайме.
|
|
6
9
|
* @return {string} Скрипт инициализации.
|
|
7
10
|
*/
|
|
8
|
-
const createExternalConfig = (
|
|
11
|
+
const createExternalConfig = ({
|
|
9
12
|
serviceName,
|
|
13
|
+
remoteEntryPath,
|
|
10
14
|
remoteEntriesGlobalKey,
|
|
11
|
-
containersGlobalKey
|
|
12
|
-
) =>
|
|
15
|
+
containersGlobalKey,
|
|
16
|
+
}) =>
|
|
13
17
|
`promise new Promise((resolve, reject) => {
|
|
14
18
|
if (window['${remoteEntriesGlobalKey}']) {
|
|
15
19
|
const scriptElement = document.createElement('script');
|
|
@@ -21,7 +25,10 @@ const createExternalConfig = (
|
|
|
21
25
|
scriptElement.remove();
|
|
22
26
|
reject(new Error('Failed loading remoteEntry for "${serviceName}".'));
|
|
23
27
|
};
|
|
24
|
-
scriptElement.src =
|
|
28
|
+
scriptElement.src = ${remoteEntryPath
|
|
29
|
+
? `'${remoteEntryPath}'`
|
|
30
|
+
: `window['${remoteEntriesGlobalKey}']['${serviceName}']`
|
|
31
|
+
};
|
|
25
32
|
scriptElement.async = true;
|
|
26
33
|
document.head.append(scriptElement);
|
|
27
34
|
} else {
|
|
@@ -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"}
|