@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.
- package/lib/browser/child/singletonProviders.browser.js +91 -0
- package/lib/browser/loader.browser.js +64 -0
- package/lib/browser/preload.browser.js +115 -0
- package/lib/browser/providers.browser.js +113 -0
- package/lib/browser/render.browser.js +28 -0
- package/lib/browser/runCommand.browser.js +8 -0
- package/lib/browser.browser.js +17 -0
- package/lib/server/child/singletonProviders.es.js +24 -0
- package/lib/server/child/singletonProviders.js +32 -0
- package/lib/server/loader.es.js +48 -0
- package/lib/server/loader.js +52 -0
- package/lib/server/preload.es.js +77 -0
- package/lib/server/preload.js +81 -0
- package/lib/server/providers.es.js +131 -0
- package/lib/server/providers.js +135 -0
- package/lib/server/render-slots.es.js +50 -0
- package/lib/server/render-slots.js +54 -0
- package/lib/server/render.es.js +39 -0
- package/lib/server/render.js +43 -0
- package/lib/server/stateManager.es.js +49 -0
- package/lib/server/stateManager.js +54 -0
- package/lib/server.browser.js +2 -1082
- package/lib/server.es.js +5 -1067
- package/lib/server.js +5 -1072
- package/lib/shared/child/providers.browser.js +36 -0
- package/lib/shared/child/providers.es.js +36 -0
- package/lib/shared/child/providers.js +44 -0
- package/lib/shared/child/singletonProviders.browser.js +24 -0
- package/lib/shared/child/singletonProviders.es.js +24 -0
- package/lib/shared/child/singletonProviders.js +28 -0
- package/lib/shared/child/stubs.browser.js +18 -0
- package/lib/shared/child/stubs.es.js +18 -0
- package/lib/shared/child/stubs.js +22 -0
- package/lib/shared/child/validate.browser.js +11 -0
- package/lib/shared/child/validate.es.js +11 -0
- package/lib/shared/child/validate.js +15 -0
- package/lib/shared/command.browser.js +38 -0
- package/lib/shared/command.es.js +38 -0
- package/lib/shared/command.js +42 -0
- package/lib/shared/constants.browser.js +3 -0
- package/lib/shared/constants.es.js +3 -0
- package/lib/shared/constants.js +7 -0
- package/lib/shared/di.browser.js +44 -0
- package/lib/shared/di.es.js +44 -0
- package/lib/shared/di.js +48 -0
- package/lib/shared/loader.browser.js +7 -0
- package/lib/shared/loader.es.js +7 -0
- package/lib/shared/loader.js +11 -0
- package/lib/shared/providers.browser.js +231 -0
- package/lib/shared/providers.es.js +231 -0
- package/lib/shared/providers.js +235 -0
- package/lib/shared/react/component.browser.js +104 -0
- package/lib/shared/react/component.es.js +104 -0
- package/lib/shared/react/component.js +112 -0
- package/lib/shared/react/render-context.browser.js +5 -0
- package/lib/shared/react/render-context.es.js +5 -0
- package/lib/shared/react/render-context.js +9 -0
- package/lib/shared/render.browser.js +10 -0
- package/lib/shared/render.es.js +10 -0
- package/lib/shared/render.js +14 -0
- package/lib/shared/resolutionConfigManager.browser.js +58 -0
- package/lib/shared/resolutionConfigManager.es.js +58 -0
- package/lib/shared/resolutionConfigManager.js +67 -0
- package/lib/shared/singletonDi.browser.js +95 -0
- package/lib/shared/singletonDi.es.js +95 -0
- package/lib/shared/singletonDi.js +103 -0
- package/lib/shared/store.browser.js +13 -0
- package/lib/shared/store.es.js +13 -0
- package/lib/shared/store.js +18 -0
- package/lib/shared/webpack/moduleFederation.browser.js +49 -0
- package/lib/shared/webpack/moduleFederation.es.js +49 -0
- package/lib/shared/webpack/moduleFederation.js +54 -0
- 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;
|