@tramvai/module-child-app 2.70.1 → 2.72.3

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.
Files changed (73) hide show
  1. package/lib/browser/child/singletonProviders.browser.js +91 -0
  2. package/lib/browser/loader.browser.js +64 -0
  3. package/lib/browser/preload.browser.js +115 -0
  4. package/lib/browser/providers.browser.js +113 -0
  5. package/lib/browser/render.browser.js +28 -0
  6. package/lib/browser/runCommand.browser.js +8 -0
  7. package/lib/browser.browser.js +17 -0
  8. package/lib/server/child/singletonProviders.es.js +24 -0
  9. package/lib/server/child/singletonProviders.js +32 -0
  10. package/lib/server/loader.es.js +48 -0
  11. package/lib/server/loader.js +52 -0
  12. package/lib/server/preload.es.js +77 -0
  13. package/lib/server/preload.js +81 -0
  14. package/lib/server/providers.es.js +131 -0
  15. package/lib/server/providers.js +135 -0
  16. package/lib/server/render-slots.es.js +50 -0
  17. package/lib/server/render-slots.js +54 -0
  18. package/lib/server/render.es.js +39 -0
  19. package/lib/server/render.js +43 -0
  20. package/lib/server/stateManager.es.js +49 -0
  21. package/lib/server/stateManager.js +54 -0
  22. package/lib/server.browser.js +2 -1082
  23. package/lib/server.es.js +5 -1067
  24. package/lib/server.js +5 -1072
  25. package/lib/shared/child/providers.browser.js +36 -0
  26. package/lib/shared/child/providers.es.js +36 -0
  27. package/lib/shared/child/providers.js +44 -0
  28. package/lib/shared/child/singletonProviders.browser.js +24 -0
  29. package/lib/shared/child/singletonProviders.es.js +24 -0
  30. package/lib/shared/child/singletonProviders.js +28 -0
  31. package/lib/shared/child/stubs.browser.js +18 -0
  32. package/lib/shared/child/stubs.es.js +18 -0
  33. package/lib/shared/child/stubs.js +22 -0
  34. package/lib/shared/child/validate.browser.js +11 -0
  35. package/lib/shared/child/validate.es.js +11 -0
  36. package/lib/shared/child/validate.js +15 -0
  37. package/lib/shared/command.browser.js +38 -0
  38. package/lib/shared/command.es.js +38 -0
  39. package/lib/shared/command.js +42 -0
  40. package/lib/shared/constants.browser.js +3 -0
  41. package/lib/shared/constants.es.js +3 -0
  42. package/lib/shared/constants.js +7 -0
  43. package/lib/shared/di.browser.js +44 -0
  44. package/lib/shared/di.es.js +44 -0
  45. package/lib/shared/di.js +48 -0
  46. package/lib/shared/loader.browser.js +7 -0
  47. package/lib/shared/loader.es.js +7 -0
  48. package/lib/shared/loader.js +11 -0
  49. package/lib/shared/providers.browser.js +231 -0
  50. package/lib/shared/providers.es.js +231 -0
  51. package/lib/shared/providers.js +235 -0
  52. package/lib/shared/react/component.browser.js +104 -0
  53. package/lib/shared/react/component.es.js +104 -0
  54. package/lib/shared/react/component.js +112 -0
  55. package/lib/shared/react/render-context.browser.js +5 -0
  56. package/lib/shared/react/render-context.es.js +5 -0
  57. package/lib/shared/react/render-context.js +9 -0
  58. package/lib/shared/render.browser.js +10 -0
  59. package/lib/shared/render.es.js +10 -0
  60. package/lib/shared/render.js +14 -0
  61. package/lib/shared/resolutionConfigManager.browser.js +58 -0
  62. package/lib/shared/resolutionConfigManager.es.js +58 -0
  63. package/lib/shared/resolutionConfigManager.js +67 -0
  64. package/lib/shared/singletonDi.browser.js +95 -0
  65. package/lib/shared/singletonDi.es.js +95 -0
  66. package/lib/shared/singletonDi.js +103 -0
  67. package/lib/shared/store.browser.js +13 -0
  68. package/lib/shared/store.es.js +13 -0
  69. package/lib/shared/store.js +18 -0
  70. package/lib/shared/webpack/moduleFederation.browser.js +49 -0
  71. package/lib/shared/webpack/moduleFederation.es.js +49 -0
  72. package/lib/shared/webpack/moduleFederation.js +54 -0
  73. package/package.json +17 -18
@@ -0,0 +1,81 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ class PreloadManager {
6
+ constructor({ loader, runner, stateManager, resolutionConfigManager, resolveFullConfig, }) {
7
+ this.shouldRunImmediately = false;
8
+ this.map = new Map();
9
+ this.preloadMap = new Map();
10
+ this.loader = loader;
11
+ this.runner = runner;
12
+ this.stateManager = stateManager;
13
+ this.resolutionConfigManager = resolutionConfigManager;
14
+ this.resolveFullConfig = resolveFullConfig;
15
+ }
16
+ async preload(request) {
17
+ await this.resolutionConfigManager.init();
18
+ const config = this.resolveFullConfig(request);
19
+ if (!config) {
20
+ return;
21
+ }
22
+ const { key } = config;
23
+ if (this.map.has(key)) {
24
+ await this.map.get(key);
25
+ return;
26
+ }
27
+ const promise = this.loader
28
+ .load(config)
29
+ .catch(() => {
30
+ // Actual error will be logged by the internals of this.loader
31
+ })
32
+ .then(() => {
33
+ if (this.shouldRunImmediately) {
34
+ return this.run('customer', config);
35
+ }
36
+ })
37
+ .then(() => config);
38
+ this.map.set(key, promise);
39
+ this.preloadMap.set(config.key, config);
40
+ if (this.shouldRunImmediately) {
41
+ await promise;
42
+ }
43
+ }
44
+ isPreloaded(request) {
45
+ const config = this.resolveFullConfig(request);
46
+ return !!config && this.map.has(config.key);
47
+ }
48
+ async runPreloaded() {
49
+ this.shouldRunImmediately = true;
50
+ const promises = [];
51
+ this.map.forEach((childAppPromise) => {
52
+ promises.push((async () => {
53
+ await this.run('customer', await childAppPromise);
54
+ })());
55
+ });
56
+ await Promise.all(promises);
57
+ }
58
+ pageRender() { }
59
+ async clearPreloaded() {
60
+ const promises = [];
61
+ this.map.forEach((childAppPromise) => {
62
+ promises.push((async () => {
63
+ await this.run('clear', await childAppPromise);
64
+ })());
65
+ });
66
+ await Promise.all(promises);
67
+ }
68
+ getPreloadedList() {
69
+ return Array.from(this.preloadMap.values());
70
+ }
71
+ async run(status, config) {
72
+ const childApp = this.loader.get(config);
73
+ if (!childApp) {
74
+ return;
75
+ }
76
+ await this.runner.run('server', status, config);
77
+ await this.stateManager.registerChildApp(config);
78
+ }
79
+ }
80
+
81
+ exports.PreloadManager = PreloadManager;
@@ -0,0 +1,131 @@
1
+ import { combineValidators, isUrl, endsWith } from '@tinkoff/env-validators';
2
+ import { Scope } from '@tinkoff/dippy';
3
+ import { provide, commandLineListTokens } from '@tramvai/core';
4
+ import { ENV_USED_TOKEN, LOGGER_TOKEN, CREATE_CACHE_TOKEN, STORE_TOKEN } from '@tramvai/tokens-common';
5
+ import { RESOURCES_REGISTRY, RENDER_SLOTS, ResourceType, ResourceSlot, EXTEND_RENDER } from '@tramvai/tokens-render';
6
+ import { CHILD_APP_LOADER_TOKEN, CHILD_APP_STATE_MANAGER_TOKEN, CHILD_APP_DI_MANAGER_TOKEN, CHILD_APP_PRELOAD_MANAGER_TOKEN, CHILD_APP_COMMAND_LINE_RUNNER_TOKEN, CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN, CHILD_APP_RESOLVE_CONFIG_TOKEN, CHILD_APP_RENDER_MANAGER_TOKEN } from '@tramvai/tokens-child-app';
7
+ import { safeStringify } from '@tramvai/safe-strings';
8
+ import { ServerLoader } from './loader.es.js';
9
+ import { PreloadManager } from './preload.es.js';
10
+ import { StateManager, executeRootStateSubscriptions } from './stateManager.es.js';
11
+ import { setPreloaded } from '../shared/store.es.js';
12
+ import { RenderManager } from './render.es.js';
13
+ import { registerChildAppRenderSlots } from './render-slots.es.js';
14
+ import { GLOBAL_CHILD_STATE } from '../shared/constants.es.js';
15
+
16
+ const serverProviders = [
17
+ provide({
18
+ provide: ENV_USED_TOKEN,
19
+ multi: true,
20
+ useValue: [
21
+ {
22
+ key: 'CHILD_APP_EXTERNAL_URL',
23
+ optional: true,
24
+ validator: combineValidators([isUrl, endsWith('/')]),
25
+ },
26
+ ],
27
+ }),
28
+ provide({
29
+ provide: CHILD_APP_LOADER_TOKEN,
30
+ useClass: ServerLoader,
31
+ scope: Scope.SINGLETON,
32
+ deps: {
33
+ logger: LOGGER_TOKEN,
34
+ createCache: CREATE_CACHE_TOKEN,
35
+ },
36
+ }),
37
+ provide({
38
+ provide: CHILD_APP_STATE_MANAGER_TOKEN,
39
+ useClass: StateManager,
40
+ deps: {
41
+ logger: LOGGER_TOKEN,
42
+ diManager: CHILD_APP_DI_MANAGER_TOKEN,
43
+ resourcesRegistry: RESOURCES_REGISTRY,
44
+ },
45
+ }),
46
+ provide({
47
+ provide: CHILD_APP_PRELOAD_MANAGER_TOKEN,
48
+ useClass: PreloadManager,
49
+ deps: {
50
+ loader: CHILD_APP_LOADER_TOKEN,
51
+ runner: CHILD_APP_COMMAND_LINE_RUNNER_TOKEN,
52
+ stateManager: CHILD_APP_STATE_MANAGER_TOKEN,
53
+ resolutionConfigManager: CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN,
54
+ resolveFullConfig: CHILD_APP_RESOLVE_CONFIG_TOKEN,
55
+ },
56
+ }),
57
+ provide({
58
+ provide: RENDER_SLOTS,
59
+ multi: true,
60
+ useFactory: ({ stateManager, preloader, store }) => {
61
+ store.dispatch(setPreloaded(preloader.getPreloadedList()));
62
+ return {
63
+ type: ResourceType.asIs,
64
+ slot: ResourceSlot.BODY_END,
65
+ payload: `<script id="${GLOBAL_CHILD_STATE}" type="application/json">${safeStringify(stateManager.getState())}</script>`,
66
+ };
67
+ },
68
+ deps: {
69
+ stateManager: CHILD_APP_STATE_MANAGER_TOKEN,
70
+ preloader: CHILD_APP_PRELOAD_MANAGER_TOKEN,
71
+ store: STORE_TOKEN,
72
+ },
73
+ }),
74
+ provide({
75
+ provide: RENDER_SLOTS,
76
+ multi: true,
77
+ useFactory: registerChildAppRenderSlots,
78
+ deps: {
79
+ logger: LOGGER_TOKEN,
80
+ diManager: CHILD_APP_DI_MANAGER_TOKEN,
81
+ resolveFullConfig: CHILD_APP_RESOLVE_CONFIG_TOKEN,
82
+ preloadManager: CHILD_APP_PRELOAD_MANAGER_TOKEN,
83
+ },
84
+ }),
85
+ provide({
86
+ provide: EXTEND_RENDER,
87
+ multi: true,
88
+ // execute subscription right before render to get the last actual data
89
+ useFactory: executeRootStateSubscriptions,
90
+ deps: {
91
+ store: STORE_TOKEN,
92
+ diManager: CHILD_APP_DI_MANAGER_TOKEN,
93
+ },
94
+ }),
95
+ provide({
96
+ provide: CHILD_APP_RENDER_MANAGER_TOKEN,
97
+ useClass: RenderManager,
98
+ deps: {
99
+ logger: LOGGER_TOKEN,
100
+ diManager: CHILD_APP_DI_MANAGER_TOKEN,
101
+ preloadManager: CHILD_APP_PRELOAD_MANAGER_TOKEN,
102
+ resolveFullConfig: CHILD_APP_RESOLVE_CONFIG_TOKEN,
103
+ },
104
+ }),
105
+ provide({
106
+ provide: commandLineListTokens.resolvePageDeps,
107
+ multi: true,
108
+ useFactory: ({ preloader }) => {
109
+ return function childAppRunPreloaded() {
110
+ return preloader.runPreloaded();
111
+ };
112
+ },
113
+ deps: {
114
+ preloader: CHILD_APP_PRELOAD_MANAGER_TOKEN,
115
+ },
116
+ }),
117
+ provide({
118
+ provide: commandLineListTokens.clear,
119
+ multi: true,
120
+ useFactory: ({ renderManager }) => {
121
+ return function childAppRenderClear() {
122
+ renderManager.clear();
123
+ };
124
+ },
125
+ deps: {
126
+ renderManager: CHILD_APP_RENDER_MANAGER_TOKEN,
127
+ },
128
+ }),
129
+ ];
130
+
131
+ export { serverProviders };
@@ -0,0 +1,135 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var envValidators = require('@tinkoff/env-validators');
6
+ var dippy = require('@tinkoff/dippy');
7
+ var core = require('@tramvai/core');
8
+ var tokensCommon = require('@tramvai/tokens-common');
9
+ var tokensRender = require('@tramvai/tokens-render');
10
+ var tokensChildApp = require('@tramvai/tokens-child-app');
11
+ var safeStrings = require('@tramvai/safe-strings');
12
+ var loader = require('./loader.js');
13
+ var preload = require('./preload.js');
14
+ var stateManager = require('./stateManager.js');
15
+ var store = require('../shared/store.js');
16
+ var render = require('./render.js');
17
+ var renderSlots = require('./render-slots.js');
18
+ var constants = require('../shared/constants.js');
19
+
20
+ const serverProviders = [
21
+ core.provide({
22
+ provide: tokensCommon.ENV_USED_TOKEN,
23
+ multi: true,
24
+ useValue: [
25
+ {
26
+ key: 'CHILD_APP_EXTERNAL_URL',
27
+ optional: true,
28
+ validator: envValidators.combineValidators([envValidators.isUrl, envValidators.endsWith('/')]),
29
+ },
30
+ ],
31
+ }),
32
+ core.provide({
33
+ provide: tokensChildApp.CHILD_APP_LOADER_TOKEN,
34
+ useClass: loader.ServerLoader,
35
+ scope: dippy.Scope.SINGLETON,
36
+ deps: {
37
+ logger: tokensCommon.LOGGER_TOKEN,
38
+ createCache: tokensCommon.CREATE_CACHE_TOKEN,
39
+ },
40
+ }),
41
+ core.provide({
42
+ provide: tokensChildApp.CHILD_APP_STATE_MANAGER_TOKEN,
43
+ useClass: stateManager.StateManager,
44
+ deps: {
45
+ logger: tokensCommon.LOGGER_TOKEN,
46
+ diManager: tokensChildApp.CHILD_APP_DI_MANAGER_TOKEN,
47
+ resourcesRegistry: tokensRender.RESOURCES_REGISTRY,
48
+ },
49
+ }),
50
+ core.provide({
51
+ provide: tokensChildApp.CHILD_APP_PRELOAD_MANAGER_TOKEN,
52
+ useClass: preload.PreloadManager,
53
+ deps: {
54
+ loader: tokensChildApp.CHILD_APP_LOADER_TOKEN,
55
+ runner: tokensChildApp.CHILD_APP_COMMAND_LINE_RUNNER_TOKEN,
56
+ stateManager: tokensChildApp.CHILD_APP_STATE_MANAGER_TOKEN,
57
+ resolutionConfigManager: tokensChildApp.CHILD_APP_RESOLUTION_CONFIG_MANAGER_TOKEN,
58
+ resolveFullConfig: tokensChildApp.CHILD_APP_RESOLVE_CONFIG_TOKEN,
59
+ },
60
+ }),
61
+ core.provide({
62
+ provide: tokensRender.RENDER_SLOTS,
63
+ multi: true,
64
+ useFactory: ({ stateManager, preloader, store: store$1 }) => {
65
+ store$1.dispatch(store.setPreloaded(preloader.getPreloadedList()));
66
+ return {
67
+ type: tokensRender.ResourceType.asIs,
68
+ slot: tokensRender.ResourceSlot.BODY_END,
69
+ payload: `<script id="${constants.GLOBAL_CHILD_STATE}" type="application/json">${safeStrings.safeStringify(stateManager.getState())}</script>`,
70
+ };
71
+ },
72
+ deps: {
73
+ stateManager: tokensChildApp.CHILD_APP_STATE_MANAGER_TOKEN,
74
+ preloader: tokensChildApp.CHILD_APP_PRELOAD_MANAGER_TOKEN,
75
+ store: tokensCommon.STORE_TOKEN,
76
+ },
77
+ }),
78
+ core.provide({
79
+ provide: tokensRender.RENDER_SLOTS,
80
+ multi: true,
81
+ useFactory: renderSlots.registerChildAppRenderSlots,
82
+ deps: {
83
+ logger: tokensCommon.LOGGER_TOKEN,
84
+ diManager: tokensChildApp.CHILD_APP_DI_MANAGER_TOKEN,
85
+ resolveFullConfig: tokensChildApp.CHILD_APP_RESOLVE_CONFIG_TOKEN,
86
+ preloadManager: tokensChildApp.CHILD_APP_PRELOAD_MANAGER_TOKEN,
87
+ },
88
+ }),
89
+ core.provide({
90
+ provide: tokensRender.EXTEND_RENDER,
91
+ multi: true,
92
+ // execute subscription right before render to get the last actual data
93
+ useFactory: stateManager.executeRootStateSubscriptions,
94
+ deps: {
95
+ store: tokensCommon.STORE_TOKEN,
96
+ diManager: tokensChildApp.CHILD_APP_DI_MANAGER_TOKEN,
97
+ },
98
+ }),
99
+ core.provide({
100
+ provide: tokensChildApp.CHILD_APP_RENDER_MANAGER_TOKEN,
101
+ useClass: render.RenderManager,
102
+ deps: {
103
+ logger: tokensCommon.LOGGER_TOKEN,
104
+ diManager: tokensChildApp.CHILD_APP_DI_MANAGER_TOKEN,
105
+ preloadManager: tokensChildApp.CHILD_APP_PRELOAD_MANAGER_TOKEN,
106
+ resolveFullConfig: tokensChildApp.CHILD_APP_RESOLVE_CONFIG_TOKEN,
107
+ },
108
+ }),
109
+ core.provide({
110
+ provide: core.commandLineListTokens.resolvePageDeps,
111
+ multi: true,
112
+ useFactory: ({ preloader }) => {
113
+ return function childAppRunPreloaded() {
114
+ return preloader.runPreloaded();
115
+ };
116
+ },
117
+ deps: {
118
+ preloader: tokensChildApp.CHILD_APP_PRELOAD_MANAGER_TOKEN,
119
+ },
120
+ }),
121
+ core.provide({
122
+ provide: core.commandLineListTokens.clear,
123
+ multi: true,
124
+ useFactory: ({ renderManager }) => {
125
+ return function childAppRenderClear() {
126
+ renderManager.clear();
127
+ };
128
+ },
129
+ deps: {
130
+ renderManager: tokensChildApp.CHILD_APP_RENDER_MANAGER_TOKEN,
131
+ },
132
+ }),
133
+ ];
134
+
135
+ exports.serverProviders = serverProviders;
@@ -0,0 +1,50 @@
1
+ import { ResourceType, ResourceSlot, RENDER_SLOTS } from '@tramvai/tokens-render';
2
+
3
+ const registerChildAppRenderSlots = ({ logger, diManager, resolveFullConfig, preloadManager, }) => {
4
+ const log = logger('child-app:render:slots');
5
+ const result = [];
6
+ preloadManager.getPreloadedList().forEach((requestConfig) => {
7
+ var _a;
8
+ const config = resolveFullConfig(requestConfig);
9
+ if (!config) {
10
+ return;
11
+ }
12
+ const di = diManager.getChildDi(config);
13
+ result.push({
14
+ type: ResourceType.script,
15
+ slot: ResourceSlot.HEAD_CORE_SCRIPTS,
16
+ payload: config.client.entry,
17
+ attrs: {
18
+ 'data-critical': 'true',
19
+ },
20
+ });
21
+ if (config.css) {
22
+ result.push({
23
+ type: ResourceType.style,
24
+ slot: ResourceSlot.HEAD_CORE_STYLES,
25
+ payload: (_a = config.css.entry) !== null && _a !== void 0 ? _a : null,
26
+ attrs: {
27
+ 'data-critical': 'true',
28
+ },
29
+ });
30
+ }
31
+ if (!di) {
32
+ return;
33
+ }
34
+ try {
35
+ const renderSlots = di.get({ token: RENDER_SLOTS, optional: true });
36
+ if (renderSlots) {
37
+ result.push(...renderSlots);
38
+ }
39
+ }
40
+ catch (error) {
41
+ log.error({
42
+ event: 'get-slots-failed',
43
+ config: requestConfig,
44
+ });
45
+ }
46
+ });
47
+ return result;
48
+ };
49
+
50
+ export { registerChildAppRenderSlots };
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tokensRender = require('@tramvai/tokens-render');
6
+
7
+ const registerChildAppRenderSlots = ({ logger, diManager, resolveFullConfig, preloadManager, }) => {
8
+ const log = logger('child-app:render:slots');
9
+ const result = [];
10
+ preloadManager.getPreloadedList().forEach((requestConfig) => {
11
+ var _a;
12
+ const config = resolveFullConfig(requestConfig);
13
+ if (!config) {
14
+ return;
15
+ }
16
+ const di = diManager.getChildDi(config);
17
+ result.push({
18
+ type: tokensRender.ResourceType.script,
19
+ slot: tokensRender.ResourceSlot.HEAD_CORE_SCRIPTS,
20
+ payload: config.client.entry,
21
+ attrs: {
22
+ 'data-critical': 'true',
23
+ },
24
+ });
25
+ if (config.css) {
26
+ result.push({
27
+ type: tokensRender.ResourceType.style,
28
+ slot: tokensRender.ResourceSlot.HEAD_CORE_STYLES,
29
+ payload: (_a = config.css.entry) !== null && _a !== void 0 ? _a : null,
30
+ attrs: {
31
+ 'data-critical': 'true',
32
+ },
33
+ });
34
+ }
35
+ if (!di) {
36
+ return;
37
+ }
38
+ try {
39
+ const renderSlots = di.get({ token: tokensRender.RENDER_SLOTS, optional: true });
40
+ if (renderSlots) {
41
+ result.push(...renderSlots);
42
+ }
43
+ }
44
+ catch (error) {
45
+ log.error({
46
+ event: 'get-slots-failed',
47
+ config: requestConfig,
48
+ });
49
+ }
50
+ });
51
+ return result;
52
+ };
53
+
54
+ exports.registerChildAppRenderSlots = registerChildAppRenderSlots;
@@ -0,0 +1,39 @@
1
+ class RenderManager {
2
+ constructor({ logger, preloadManager, diManager, resolveFullConfig, }) {
3
+ this.hasRenderedSet = new Set();
4
+ this.log = logger('child-app:render');
5
+ this.preloadManager = preloadManager;
6
+ this.diManager = diManager;
7
+ this.resolveFullConfig = resolveFullConfig;
8
+ }
9
+ getChildDi(request) {
10
+ const config = this.resolveFullConfig(request);
11
+ if (!config) {
12
+ throw new Error(`Child app "${request.name}" not found`);
13
+ }
14
+ this.hasRenderedSet.add(config.key);
15
+ if (this.preloadManager.isPreloaded(request)) {
16
+ return [this.diManager.getChildDi(config), undefined];
17
+ }
18
+ this.log.warn({
19
+ message: 'Child-app has been used but not preloaded before React render',
20
+ request,
21
+ });
22
+ return [undefined, undefined];
23
+ }
24
+ clear() {
25
+ const preloadedList = this.preloadManager.getPreloadedList();
26
+ for (const request of preloadedList) {
27
+ const config = this.resolveFullConfig(request);
28
+ if (!config || !this.hasRenderedSet.has(config.key)) {
29
+ this.log.warn({
30
+ message: 'Child-app has been preloaded but not used in React render',
31
+ request,
32
+ });
33
+ }
34
+ }
35
+ this.hasRenderedSet.clear();
36
+ }
37
+ }
38
+
39
+ export { RenderManager };
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ class RenderManager {
6
+ constructor({ logger, preloadManager, diManager, resolveFullConfig, }) {
7
+ this.hasRenderedSet = new Set();
8
+ this.log = logger('child-app:render');
9
+ this.preloadManager = preloadManager;
10
+ this.diManager = diManager;
11
+ this.resolveFullConfig = resolveFullConfig;
12
+ }
13
+ getChildDi(request) {
14
+ const config = this.resolveFullConfig(request);
15
+ if (!config) {
16
+ throw new Error(`Child app "${request.name}" not found`);
17
+ }
18
+ this.hasRenderedSet.add(config.key);
19
+ if (this.preloadManager.isPreloaded(request)) {
20
+ return [this.diManager.getChildDi(config), undefined];
21
+ }
22
+ this.log.warn({
23
+ message: 'Child-app has been used but not preloaded before React render',
24
+ request,
25
+ });
26
+ return [undefined, undefined];
27
+ }
28
+ clear() {
29
+ const preloadedList = this.preloadManager.getPreloadedList();
30
+ for (const request of preloadedList) {
31
+ const config = this.resolveFullConfig(request);
32
+ if (!config || !this.hasRenderedSet.has(config.key)) {
33
+ this.log.warn({
34
+ message: 'Child-app has been preloaded but not used in React render',
35
+ request,
36
+ });
37
+ }
38
+ }
39
+ this.hasRenderedSet.clear();
40
+ }
41
+ }
42
+
43
+ exports.RenderManager = RenderManager;
@@ -0,0 +1,49 @@
1
+ import { CHILD_APP_INTERNAL_ROOT_STATE_SUBSCRIPTION_TOKEN } from '@tramvai/tokens-child-app';
2
+ import { CONTEXT_TOKEN } from '@tramvai/tokens-common';
3
+
4
+ const executeRootStateSubscriptions = ({ store, diManager, }) => {
5
+ return (render) => {
6
+ const state = store.getState();
7
+ diManager.forEachChildDi((di) => {
8
+ const subscriptions = di.get({
9
+ token: CHILD_APP_INTERNAL_ROOT_STATE_SUBSCRIPTION_TOKEN,
10
+ optional: true,
11
+ });
12
+ subscriptions === null || subscriptions === void 0 ? void 0 : subscriptions.forEach((sub) => {
13
+ sub.listener(state);
14
+ });
15
+ });
16
+ return render;
17
+ };
18
+ };
19
+ class StateManager {
20
+ constructor({ logger, diManager, }) {
21
+ this.state = Object.create(null);
22
+ this.log = logger('child-app:state-manager');
23
+ this.diManager = diManager;
24
+ }
25
+ registerChildApp(config) {
26
+ const di = this.diManager.getChildDi(config);
27
+ const { key } = config;
28
+ if (!di) {
29
+ return;
30
+ }
31
+ try {
32
+ const context = di.get(CONTEXT_TOKEN);
33
+ this.state[key] = context.dehydrate().dispatcher;
34
+ }
35
+ catch (error) {
36
+ if (error.code !== 'E_STUB') {
37
+ this.log.error({
38
+ event: 'get-state-failed',
39
+ config,
40
+ });
41
+ }
42
+ }
43
+ }
44
+ getState() {
45
+ return this.state;
46
+ }
47
+ }
48
+
49
+ export { StateManager, executeRootStateSubscriptions };
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tokensChildApp = require('@tramvai/tokens-child-app');
6
+ var tokensCommon = require('@tramvai/tokens-common');
7
+
8
+ const executeRootStateSubscriptions = ({ store, diManager, }) => {
9
+ return (render) => {
10
+ const state = store.getState();
11
+ diManager.forEachChildDi((di) => {
12
+ const subscriptions = di.get({
13
+ token: tokensChildApp.CHILD_APP_INTERNAL_ROOT_STATE_SUBSCRIPTION_TOKEN,
14
+ optional: true,
15
+ });
16
+ subscriptions === null || subscriptions === void 0 ? void 0 : subscriptions.forEach((sub) => {
17
+ sub.listener(state);
18
+ });
19
+ });
20
+ return render;
21
+ };
22
+ };
23
+ class StateManager {
24
+ constructor({ logger, diManager, }) {
25
+ this.state = Object.create(null);
26
+ this.log = logger('child-app:state-manager');
27
+ this.diManager = diManager;
28
+ }
29
+ registerChildApp(config) {
30
+ const di = this.diManager.getChildDi(config);
31
+ const { key } = config;
32
+ if (!di) {
33
+ return;
34
+ }
35
+ try {
36
+ const context = di.get(tokensCommon.CONTEXT_TOKEN);
37
+ this.state[key] = context.dehydrate().dispatcher;
38
+ }
39
+ catch (error) {
40
+ if (error.code !== 'E_STUB') {
41
+ this.log.error({
42
+ event: 'get-state-failed',
43
+ config,
44
+ });
45
+ }
46
+ }
47
+ }
48
+ getState() {
49
+ return this.state;
50
+ }
51
+ }
52
+
53
+ exports.StateManager = StateManager;
54
+ exports.executeRootStateSubscriptions = executeRootStateSubscriptions;