@tramvai/module-child-app 1.46.5
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/README.md +256 -0
- package/lib/browser/child/providers.d.ts +3 -0
- package/lib/browser/loader.d.ts +16 -0
- package/lib/browser/preload.d.ts +23 -0
- package/lib/browser/providers.d.ts +7 -0
- package/lib/browser/render.d.ts +20 -0
- package/lib/browser.d.ts +3 -0
- package/lib/export.d.ts +2 -0
- package/lib/server/child/providers.d.ts +3 -0
- package/lib/server/loader.d.ts +16 -0
- package/lib/server/preload.d.ts +25 -0
- package/lib/server/providers.d.ts +2 -0
- package/lib/server/render-slots.d.ts +8 -0
- package/lib/server/render.d.ts +24 -0
- package/lib/server/stateManager.d.ts +13 -0
- package/lib/server.browser.js +793 -0
- package/lib/server.d.ts +3 -0
- package/lib/server.es.js +920 -0
- package/lib/server.js +935 -0
- package/lib/shared/child/providers.d.ts +3 -0
- package/lib/shared/child/stubs.d.ts +4 -0
- package/lib/shared/command.d.ts +15 -0
- package/lib/shared/di.d.ts +17 -0
- package/lib/shared/loader.d.ts +9 -0
- package/lib/shared/providers.d.ts +2 -0
- package/lib/shared/react/component.d.ts +2 -0
- package/lib/shared/react/render-context.d.ts +2 -0
- package/lib/shared/render.d.ts +5 -0
- package/lib/shared/singletonDi.d.ts +17 -0
- package/lib/shared/store.d.ts +5 -0
- package/lib/shared/types/module.d.ts +4 -0
- package/lib/shared/webpack/moduleFederation.d.ts +15 -0
- package/package.json +52 -0
package/lib/server.es.js
ADDED
|
@@ -0,0 +1,920 @@
|
|
|
1
|
+
import { __decorate } from 'tslib';
|
|
2
|
+
import { provide, COMMAND_LINE_RUNNER_TOKEN, walkOfModules, getModuleParameters, commandLineListTokens as commandLineListTokens$1, Module } from '@tramvai/core';
|
|
3
|
+
import flatten from '@tinkoff/utils/array/flatten';
|
|
4
|
+
import { Container, ChildContainer, Scope, DI_TOKEN } from '@tinkoff/dippy';
|
|
5
|
+
import { commandLineListTokens, CHILD_APP_INTERNAL_ROOT_STATE_SUBSCRIPTION_TOKEN, CHILD_APP_INTERNAL_ACTION_TOKEN, CHILD_APP_INTERNAL_CONFIG_TOKEN, IS_CHILD_APP_DI_TOKEN, CHILD_APP_INTERNAL_ROOT_DI_BORROW_TOKEN, CHILD_APP_GET_RESOLUTION_CONFIG_TOKEN, CHILD_APP_RESOLUTION_CONFIGS_TOKEN, CHILD_APP_RESOLVE_CONFIG_TOKEN, CHILD_APP_RESOLVE_BASE_URL_TOKEN, CHILD_APP_SINGLETON_DI_MANAGER_TOKEN, CHILD_APP_LOADER_TOKEN, CHILD_APP_DI_MANAGER_TOKEN, CHILD_APP_COMMAND_LINE_RUNNER_TOKEN, CHILD_APP_PRELOAD_MANAGER_TOKEN, CHILD_APP_RENDER_MANAGER_TOKEN, CHILD_APP_STATE_MANAGER_TOKEN, CHILD_APP_PRELOAD_EXTERNAL_CONFIG_TOKEN, CHILD_APP_INTERNAL_RENDER_TOKEN } from '@tramvai/tokens-child-app';
|
|
6
|
+
export * from '@tramvai/tokens-child-app';
|
|
7
|
+
import { ACTION_PAGE_RUNNER_TOKEN, CONTEXT_TOKEN, LOGGER_TOKEN, DISPATCHER_TOKEN, STORE_TOKEN, COMBINE_REDUCERS, ENV_MANAGER_TOKEN, REGISTER_CLEAR_CACHE_TOKEN, CLEAR_CACHE_TOKEN, ENV_USED_TOKEN, CREATE_CACHE_TOKEN } from '@tramvai/tokens-common';
|
|
8
|
+
import { RENDER_SLOTS, EXTEND_RENDER, ResourceType, ResourceSlot, RESOURCES_REGISTRY, CUSTOM_RENDER } from '@tramvai/tokens-render';
|
|
9
|
+
import { createEvent, createReducer } from '@tramvai/state';
|
|
10
|
+
import React, { createContext, useContext, useMemo, useState, useEffect, createElement } from 'react';
|
|
11
|
+
import { combineValidators, isUrl, endsWith } from '@tinkoff/env-validators';
|
|
12
|
+
import { safeDehydrate } from '@tramvai/safe-strings';
|
|
13
|
+
import { ServerLoader as ServerLoader$1 } from '@tinkoff/module-loader-server';
|
|
14
|
+
import noop from '@tinkoff/utils/function/noop';
|
|
15
|
+
import { renderToString } from 'react-dom/server';
|
|
16
|
+
import { useDi } from '@tramvai/react';
|
|
17
|
+
|
|
18
|
+
const getChildProviders$1 = (appDi) => {
|
|
19
|
+
const context = appDi.get(CONTEXT_TOKEN);
|
|
20
|
+
return [
|
|
21
|
+
{
|
|
22
|
+
provide: commandLineListTokens.customerStart,
|
|
23
|
+
multi: true,
|
|
24
|
+
useFactory: ({ subscriptions, }) => {
|
|
25
|
+
return function resolveRootStateForChild() {
|
|
26
|
+
if (!subscriptions) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const state = context.getState();
|
|
30
|
+
return Promise.all(subscriptions.map((sub) => {
|
|
31
|
+
return sub.listener(state);
|
|
32
|
+
}));
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
deps: {
|
|
36
|
+
subscriptions: { token: CHILD_APP_INTERNAL_ROOT_STATE_SUBSCRIPTION_TOKEN, optional: true },
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
provide({
|
|
40
|
+
provide: commandLineListTokens.resolvePageDeps,
|
|
41
|
+
multi: true,
|
|
42
|
+
useFactory: ({ actionRunner, actions }) => {
|
|
43
|
+
return function childAppRunActions() {
|
|
44
|
+
return actionRunner.runActions(flatten(actions));
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
deps: {
|
|
48
|
+
actionRunner: ACTION_PAGE_RUNNER_TOKEN,
|
|
49
|
+
actions: CHILD_APP_INTERNAL_ACTION_TOKEN,
|
|
50
|
+
},
|
|
51
|
+
}),
|
|
52
|
+
];
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const getChildProviders = (appDi) => {
|
|
56
|
+
const logger = appDi.get(LOGGER_TOKEN);
|
|
57
|
+
return [
|
|
58
|
+
provide({
|
|
59
|
+
provide: LOGGER_TOKEN,
|
|
60
|
+
useValue: Object.assign((opts) => {
|
|
61
|
+
return logger('child-app').child(opts);
|
|
62
|
+
}, logger),
|
|
63
|
+
}),
|
|
64
|
+
provide({
|
|
65
|
+
provide: RENDER_SLOTS,
|
|
66
|
+
multi: true,
|
|
67
|
+
useValue: [],
|
|
68
|
+
}),
|
|
69
|
+
...getChildProviders$1(appDi),
|
|
70
|
+
];
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const commonModuleStubs = [
|
|
74
|
+
DISPATCHER_TOKEN,
|
|
75
|
+
STORE_TOKEN,
|
|
76
|
+
CONTEXT_TOKEN,
|
|
77
|
+
COMMAND_LINE_RUNNER_TOKEN,
|
|
78
|
+
].map((provide) => {
|
|
79
|
+
return {
|
|
80
|
+
provide,
|
|
81
|
+
useFactory: () => {
|
|
82
|
+
throw Object.assign(new Error('Pure usage of the token is not allowed inside ChildApp, please add `CommonChildAppModule` from module `@tramvai/module-common` to your ChildApp'), { code: 'E_STUB' });
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
class SingletonDiManager {
|
|
88
|
+
constructor({ logger, appDi, loader, }) {
|
|
89
|
+
this.cache = new Map();
|
|
90
|
+
this.log = logger('child-app:singleton-di-manager');
|
|
91
|
+
this.appDi = appDi;
|
|
92
|
+
this.loader = loader;
|
|
93
|
+
}
|
|
94
|
+
getChildDi(config) {
|
|
95
|
+
const { key, tag } = config;
|
|
96
|
+
if (this.cache.has(key)) {
|
|
97
|
+
return this.cache.get(key);
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const di = this.resolveDi(config);
|
|
101
|
+
if (di && tag !== 'debug') {
|
|
102
|
+
this.cache.set(key, di);
|
|
103
|
+
}
|
|
104
|
+
return di;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
this.log.error({
|
|
108
|
+
event: 'resolve-di-fail',
|
|
109
|
+
error,
|
|
110
|
+
config,
|
|
111
|
+
});
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
forEachChildDi(cb) {
|
|
116
|
+
this.cache.forEach((di) => {
|
|
117
|
+
cb(di);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
resolveDi(config) {
|
|
121
|
+
const children = this.loader.get(config);
|
|
122
|
+
if (!children) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const di = new Container([
|
|
126
|
+
{
|
|
127
|
+
provide: CHILD_APP_INTERNAL_CONFIG_TOKEN,
|
|
128
|
+
useValue: config,
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
provide: IS_CHILD_APP_DI_TOKEN,
|
|
132
|
+
useValue: true,
|
|
133
|
+
},
|
|
134
|
+
], this.appDi);
|
|
135
|
+
const { modules = [], providers = [], actions = [] } = children;
|
|
136
|
+
const childProviders = getChildProviders(this.appDi);
|
|
137
|
+
childProviders.forEach((provider) => {
|
|
138
|
+
di.register(provider);
|
|
139
|
+
});
|
|
140
|
+
const resolvedModules = walkOfModules(modules);
|
|
141
|
+
resolvedModules.forEach((mod) => {
|
|
142
|
+
const moduleParameters = getModuleParameters(mod);
|
|
143
|
+
moduleParameters.providers.forEach((provider) => {
|
|
144
|
+
di.register(provider);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
providers.forEach((provider) => {
|
|
148
|
+
di.register(provider);
|
|
149
|
+
});
|
|
150
|
+
di.register({
|
|
151
|
+
provide: CHILD_APP_INTERNAL_ACTION_TOKEN,
|
|
152
|
+
multi: true,
|
|
153
|
+
useValue: actions,
|
|
154
|
+
});
|
|
155
|
+
const borrowTokens = di.get({ token: CHILD_APP_INTERNAL_ROOT_DI_BORROW_TOKEN, optional: true });
|
|
156
|
+
if (borrowTokens) {
|
|
157
|
+
flatten(borrowTokens).forEach((token) => {
|
|
158
|
+
di.borrowToken(this.appDi, token);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
commonModuleStubs.forEach((stub) => {
|
|
162
|
+
if (!di.has(stub.provide)) {
|
|
163
|
+
di.register(stub);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
return di;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
class DiManager {
|
|
171
|
+
constructor({ appDi, loader, singletonDiManager, }) {
|
|
172
|
+
this.cache = new Map();
|
|
173
|
+
this.appDi = appDi;
|
|
174
|
+
this.loader = loader;
|
|
175
|
+
this.singletonDiManager = singletonDiManager;
|
|
176
|
+
}
|
|
177
|
+
getChildDi(config) {
|
|
178
|
+
const { key } = config;
|
|
179
|
+
if (this.cache.has(key)) {
|
|
180
|
+
return this.cache.get(key);
|
|
181
|
+
}
|
|
182
|
+
const di = this.resolveDi(config);
|
|
183
|
+
di && this.cache.set(key, di);
|
|
184
|
+
return di;
|
|
185
|
+
}
|
|
186
|
+
forEachChildDi(cb) {
|
|
187
|
+
this.cache.forEach((di) => {
|
|
188
|
+
cb(di);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
resolveDi(config) {
|
|
192
|
+
const children = this.loader.get(config);
|
|
193
|
+
if (!children) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const singletonDi = this.singletonDiManager.getChildDi(config);
|
|
197
|
+
if (!singletonDi) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
return new ChildContainer(singletonDi, this.appDi);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
class CommandLineRunner {
|
|
205
|
+
constructor({ logger, rootCommandLineRunner, diManager, }) {
|
|
206
|
+
this.log = logger('child-app:commandlinerunner');
|
|
207
|
+
this.rootCommandLineRunner = rootCommandLineRunner;
|
|
208
|
+
this.diManager = diManager;
|
|
209
|
+
}
|
|
210
|
+
async run(type, status, config) {
|
|
211
|
+
const di = this.diManager.getChildDi(config);
|
|
212
|
+
if (!di) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
const commandLineRunner = di.get({ token: COMMAND_LINE_RUNNER_TOKEN, optional: true });
|
|
217
|
+
if (commandLineRunner && commandLineRunner !== this.rootCommandLineRunner) {
|
|
218
|
+
// TODO:child-app create independent metrics instance for child apps
|
|
219
|
+
// for now just reuse metrics implementation from root as otherwise it fails after attempt to create metrics instance with the same name
|
|
220
|
+
// @ts-ignore
|
|
221
|
+
commandLineRunner.metricsInstance = this.rootCommandLineRunner.metricsInstance;
|
|
222
|
+
await commandLineRunner.run(type, status, [], di);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
if (error.code !== 'E_STUB') {
|
|
227
|
+
this.log.error({
|
|
228
|
+
event: 'run-failed',
|
|
229
|
+
error,
|
|
230
|
+
type,
|
|
231
|
+
status,
|
|
232
|
+
config,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const setPreloaded = createEvent('child-app set preloaded');
|
|
240
|
+
const initialState = {
|
|
241
|
+
preloaded: [],
|
|
242
|
+
};
|
|
243
|
+
const ChildAppStore = createReducer('child-app', initialState).on(setPreloaded, (_, preloaded) => {
|
|
244
|
+
return {
|
|
245
|
+
preloaded,
|
|
246
|
+
};
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
const RenderContext = createContext(null);
|
|
250
|
+
|
|
251
|
+
const extendRender = ({ renderManager, }) => {
|
|
252
|
+
return (render) => {
|
|
253
|
+
return React.createElement(RenderContext.Provider, { value: renderManager }, render);
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
const initModuleFederation = async (container, scope = 'default') => {
|
|
258
|
+
if (container) {
|
|
259
|
+
await container.init(__webpack_share_scopes__[scope]);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
await __webpack_init_sharing__('default');
|
|
263
|
+
// currently module federation has problems with external modules
|
|
264
|
+
// and unfourtanelly react and react-dom are marked as externals in defaults
|
|
265
|
+
// fill sharedScope manually here
|
|
266
|
+
const shareScope = __webpack_share_scopes__[scope];
|
|
267
|
+
if (!shareScope.react) {
|
|
268
|
+
shareScope.react = {
|
|
269
|
+
'*': {
|
|
270
|
+
get: () => () => require('react'),
|
|
271
|
+
from: 'tramvai-mf-fix',
|
|
272
|
+
eager: true,
|
|
273
|
+
loaded: true,
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
if (!shareScope['react-dom']) {
|
|
278
|
+
shareScope['react-dom'] = {
|
|
279
|
+
'*': {
|
|
280
|
+
get: () => () => require('react-dom'),
|
|
281
|
+
from: 'tramvai-mf-fix',
|
|
282
|
+
eager: true,
|
|
283
|
+
loaded: true,
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
const getModuleFederation = async (container, name = 'entry') => {
|
|
289
|
+
return container.get(name);
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
const sharedProviders = [
|
|
293
|
+
provide({
|
|
294
|
+
provide: COMBINE_REDUCERS,
|
|
295
|
+
multi: true,
|
|
296
|
+
useValue: ChildAppStore,
|
|
297
|
+
}),
|
|
298
|
+
provide({
|
|
299
|
+
provide: commandLineListTokens$1.init,
|
|
300
|
+
multi: true,
|
|
301
|
+
useValue: initModuleFederation,
|
|
302
|
+
}),
|
|
303
|
+
provide({
|
|
304
|
+
provide: CHILD_APP_GET_RESOLUTION_CONFIG_TOKEN,
|
|
305
|
+
useFactory: ({ configs }) => {
|
|
306
|
+
const mapping = flatten(configs !== null && configs !== void 0 ? configs : []).reduce((map, config) => {
|
|
307
|
+
return map.set(config.name, config);
|
|
308
|
+
}, new Map());
|
|
309
|
+
return (({ name, version, tag = 'latest' }) => {
|
|
310
|
+
var _a;
|
|
311
|
+
const fromMapping = mapping.get(name);
|
|
312
|
+
if (!fromMapping) {
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
const cfg = fromMapping.byTag[tag];
|
|
316
|
+
if (process.env.NODE_ENV === 'development' && tag === 'debug' && !cfg) {
|
|
317
|
+
return {
|
|
318
|
+
baseUrl: 'http://localhost:4040/',
|
|
319
|
+
version: '0.0.0-stub',
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
return {
|
|
323
|
+
...cfg,
|
|
324
|
+
baseUrl: (_a = cfg.baseUrl) !== null && _a !== void 0 ? _a : fromMapping.baseUrl,
|
|
325
|
+
version: version !== null && version !== void 0 ? version : cfg.version,
|
|
326
|
+
};
|
|
327
|
+
});
|
|
328
|
+
},
|
|
329
|
+
deps: {
|
|
330
|
+
configs: { token: CHILD_APP_RESOLUTION_CONFIGS_TOKEN, optional: true },
|
|
331
|
+
},
|
|
332
|
+
}),
|
|
333
|
+
provide({
|
|
334
|
+
provide: CHILD_APP_RESOLVE_CONFIG_TOKEN,
|
|
335
|
+
useFactory: ({ envManager, rootBaseUrl, getResolutionConfig }) => {
|
|
336
|
+
const rawEnv = envManager.get('CHILD_APP_DEBUG');
|
|
337
|
+
const debug = new Map();
|
|
338
|
+
rawEnv === null || rawEnv === void 0 ? void 0 : rawEnv.split(';').reduce((acc, entry) => {
|
|
339
|
+
const [name, url] = entry.split('=');
|
|
340
|
+
return acc.set(name, url);
|
|
341
|
+
}, debug);
|
|
342
|
+
return (request) => {
|
|
343
|
+
var _a, _b;
|
|
344
|
+
const { name, tag = debug.has(name) ? 'debug' : 'latest' } = request;
|
|
345
|
+
const req = { name, tag, version: request.version };
|
|
346
|
+
const config = getResolutionConfig(req);
|
|
347
|
+
const { version, baseUrl: configBaseUrl, client, server, css, withoutCss } = config;
|
|
348
|
+
const baseUrl = (_b = (_a = debug.get(name)) !== null && _a !== void 0 ? _a : configBaseUrl) !== null && _b !== void 0 ? _b : rootBaseUrl;
|
|
349
|
+
if (!baseUrl) {
|
|
350
|
+
throw new Error('CHILD_APP_EXTERNAL_URL was not defined');
|
|
351
|
+
}
|
|
352
|
+
return {
|
|
353
|
+
name,
|
|
354
|
+
tag,
|
|
355
|
+
version,
|
|
356
|
+
key: `${name}@${version}`,
|
|
357
|
+
server: {
|
|
358
|
+
entry: `${baseUrl}${name}/${name}_server@${version}.js`,
|
|
359
|
+
...server,
|
|
360
|
+
},
|
|
361
|
+
client: {
|
|
362
|
+
baseUrl: `${baseUrl}${name}/`,
|
|
363
|
+
entry: `${baseUrl}${name}/${name}_client@${version}.js`,
|
|
364
|
+
...client,
|
|
365
|
+
},
|
|
366
|
+
css: withoutCss
|
|
367
|
+
? undefined
|
|
368
|
+
: {
|
|
369
|
+
entry: `${baseUrl}${name}/${name}@${version}.css`,
|
|
370
|
+
...css,
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
};
|
|
374
|
+
},
|
|
375
|
+
deps: {
|
|
376
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
377
|
+
rootBaseUrl: CHILD_APP_RESOLVE_BASE_URL_TOKEN,
|
|
378
|
+
getResolutionConfig: CHILD_APP_GET_RESOLUTION_CONFIG_TOKEN,
|
|
379
|
+
},
|
|
380
|
+
}),
|
|
381
|
+
provide({
|
|
382
|
+
provide: CHILD_APP_RESOLVE_BASE_URL_TOKEN,
|
|
383
|
+
useFactory: ({ envManager }) => {
|
|
384
|
+
return envManager.get('CHILD_APP_EXTERNAL_URL');
|
|
385
|
+
},
|
|
386
|
+
deps: {
|
|
387
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
388
|
+
},
|
|
389
|
+
}),
|
|
390
|
+
provide({
|
|
391
|
+
provide: CHILD_APP_SINGLETON_DI_MANAGER_TOKEN,
|
|
392
|
+
scope: Scope.SINGLETON,
|
|
393
|
+
useClass: SingletonDiManager,
|
|
394
|
+
deps: {
|
|
395
|
+
logger: LOGGER_TOKEN,
|
|
396
|
+
appDi: DI_TOKEN,
|
|
397
|
+
loader: CHILD_APP_LOADER_TOKEN,
|
|
398
|
+
},
|
|
399
|
+
}),
|
|
400
|
+
provide({
|
|
401
|
+
provide: CHILD_APP_DI_MANAGER_TOKEN,
|
|
402
|
+
useClass: DiManager,
|
|
403
|
+
deps: {
|
|
404
|
+
appDi: DI_TOKEN,
|
|
405
|
+
loader: CHILD_APP_LOADER_TOKEN,
|
|
406
|
+
singletonDiManager: CHILD_APP_SINGLETON_DI_MANAGER_TOKEN,
|
|
407
|
+
},
|
|
408
|
+
}),
|
|
409
|
+
provide({
|
|
410
|
+
provide: CHILD_APP_COMMAND_LINE_RUNNER_TOKEN,
|
|
411
|
+
useClass: CommandLineRunner,
|
|
412
|
+
deps: {
|
|
413
|
+
logger: LOGGER_TOKEN,
|
|
414
|
+
rootCommandLineRunner: COMMAND_LINE_RUNNER_TOKEN,
|
|
415
|
+
diManager: CHILD_APP_DI_MANAGER_TOKEN,
|
|
416
|
+
},
|
|
417
|
+
}),
|
|
418
|
+
provide({
|
|
419
|
+
provide: commandLineListTokens$1.clear,
|
|
420
|
+
multi: true,
|
|
421
|
+
useFactory: ({ preloader }) => {
|
|
422
|
+
return function childAppClear() {
|
|
423
|
+
return preloader.clearPreloaded();
|
|
424
|
+
};
|
|
425
|
+
},
|
|
426
|
+
deps: {
|
|
427
|
+
preloader: CHILD_APP_PRELOAD_MANAGER_TOKEN,
|
|
428
|
+
},
|
|
429
|
+
}),
|
|
430
|
+
provide({
|
|
431
|
+
provide: REGISTER_CLEAR_CACHE_TOKEN,
|
|
432
|
+
multi: true,
|
|
433
|
+
useFactory: ({ diManager }) => {
|
|
434
|
+
return (type) => {
|
|
435
|
+
diManager.forEachChildDi((di) => {
|
|
436
|
+
var _a;
|
|
437
|
+
const clearCache = di.get({ token: CLEAR_CACHE_TOKEN, optional: true });
|
|
438
|
+
if (clearCache) {
|
|
439
|
+
// first if child-app has its own CLEAR_CACHE_TOKEN implementation use only it
|
|
440
|
+
return clearCache(type);
|
|
441
|
+
}
|
|
442
|
+
// otherwise pick up any REGISTER_CLEAR_CACHE_TOKEN hooks and call it
|
|
443
|
+
const registeredClearCache = (_a = di.get({
|
|
444
|
+
token: REGISTER_CLEAR_CACHE_TOKEN,
|
|
445
|
+
optional: true,
|
|
446
|
+
})) !== null && _a !== void 0 ? _a : [];
|
|
447
|
+
return Promise.all(registeredClearCache.map((clear) => clear(type)));
|
|
448
|
+
});
|
|
449
|
+
};
|
|
450
|
+
},
|
|
451
|
+
deps: {
|
|
452
|
+
diManager: CHILD_APP_SINGLETON_DI_MANAGER_TOKEN,
|
|
453
|
+
},
|
|
454
|
+
}),
|
|
455
|
+
provide({
|
|
456
|
+
provide: EXTEND_RENDER,
|
|
457
|
+
multi: true,
|
|
458
|
+
useFactory: extendRender,
|
|
459
|
+
deps: {
|
|
460
|
+
renderManager: CHILD_APP_RENDER_MANAGER_TOKEN,
|
|
461
|
+
},
|
|
462
|
+
}),
|
|
463
|
+
provide({
|
|
464
|
+
provide: ENV_USED_TOKEN,
|
|
465
|
+
multi: true,
|
|
466
|
+
useValue: [
|
|
467
|
+
{
|
|
468
|
+
key: 'CHILD_APP_DEBUG',
|
|
469
|
+
dehydrate: true,
|
|
470
|
+
optional: true,
|
|
471
|
+
},
|
|
472
|
+
],
|
|
473
|
+
}),
|
|
474
|
+
];
|
|
475
|
+
|
|
476
|
+
class Loader {
|
|
477
|
+
resolve(entry) {
|
|
478
|
+
return entry.default;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
class ServerLoader extends Loader {
|
|
483
|
+
constructor({ logger, createCache, }) {
|
|
484
|
+
super();
|
|
485
|
+
this.initializedMap = new WeakMap();
|
|
486
|
+
const cache = createCache('memory', {
|
|
487
|
+
maxAge: 1000 * 60 * 60 * 24 * 5,
|
|
488
|
+
max: 20,
|
|
489
|
+
});
|
|
490
|
+
this.internalLoadCache = cache;
|
|
491
|
+
this.loader = new ServerLoader$1({
|
|
492
|
+
cache,
|
|
493
|
+
log: logger('child-app:loader'),
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
async load(config) {
|
|
497
|
+
await this.loader.resolveByUrl(config.server.entry, {
|
|
498
|
+
codePrefix: `var ASSETS_PREFIX="${config.client.baseUrl}";`,
|
|
499
|
+
displayName: config.name,
|
|
500
|
+
kind: 'child-app',
|
|
501
|
+
});
|
|
502
|
+
await this.init(config);
|
|
503
|
+
if (config.tag === 'debug') {
|
|
504
|
+
setTimeout(() => {
|
|
505
|
+
this.internalLoadCache.set(config.server.entry, null);
|
|
506
|
+
}, 10000);
|
|
507
|
+
}
|
|
508
|
+
return this.get(config);
|
|
509
|
+
}
|
|
510
|
+
async init(config) {
|
|
511
|
+
const container = this.loader.getByUrl(config.server.entry);
|
|
512
|
+
if (container) {
|
|
513
|
+
await initModuleFederation(container, 'default');
|
|
514
|
+
const factory = (await getModuleFederation(container, 'entry'));
|
|
515
|
+
const entry = factory();
|
|
516
|
+
this.initializedMap.set(container, entry);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
get(config) {
|
|
520
|
+
const container = this.loader.getByUrl(config.server.entry);
|
|
521
|
+
return container && this.resolve(this.initializedMap.get(container));
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
class PreloadManager {
|
|
526
|
+
constructor({ loader, runner, stateManager, preloadExternalConfig, resolveFullConfig, }) {
|
|
527
|
+
this.shouldRunImmediately = false;
|
|
528
|
+
this.map = new Map();
|
|
529
|
+
this.preloadMap = new Map();
|
|
530
|
+
this.configHasBeenPreloaded = false;
|
|
531
|
+
this.loader = loader;
|
|
532
|
+
this.runner = runner;
|
|
533
|
+
this.stateManager = stateManager;
|
|
534
|
+
this.preloadExternalConfig = preloadExternalConfig;
|
|
535
|
+
this.resolveFullConfig = resolveFullConfig;
|
|
536
|
+
}
|
|
537
|
+
async preload(request) {
|
|
538
|
+
var _a;
|
|
539
|
+
if (!this.configHasBeenPreloaded) {
|
|
540
|
+
await ((_a = this.preloadExternalConfig) === null || _a === void 0 ? void 0 : _a.call(this));
|
|
541
|
+
this.configHasBeenPreloaded = true;
|
|
542
|
+
}
|
|
543
|
+
const config = this.resolveFullConfig(request);
|
|
544
|
+
const { key } = config;
|
|
545
|
+
if (this.map.has(key)) {
|
|
546
|
+
await this.map.get(key);
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
const promise = this.loader
|
|
550
|
+
.load(config)
|
|
551
|
+
.then(() => {
|
|
552
|
+
if (this.shouldRunImmediately) {
|
|
553
|
+
return this.run('customer', config);
|
|
554
|
+
}
|
|
555
|
+
})
|
|
556
|
+
.catch(noop)
|
|
557
|
+
.then(() => config);
|
|
558
|
+
this.map.set(key, promise);
|
|
559
|
+
this.preloadMap.set(config.key, config);
|
|
560
|
+
if (this.shouldRunImmediately) {
|
|
561
|
+
await promise;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
isPreloaded(request) {
|
|
565
|
+
const config = this.resolveFullConfig(request);
|
|
566
|
+
const { key } = config;
|
|
567
|
+
return this.map.has(key);
|
|
568
|
+
}
|
|
569
|
+
async runPreloaded() {
|
|
570
|
+
this.shouldRunImmediately = true;
|
|
571
|
+
const promises = [];
|
|
572
|
+
this.map.forEach((childAppPromise) => {
|
|
573
|
+
promises.push((async () => {
|
|
574
|
+
await this.run('customer', await childAppPromise);
|
|
575
|
+
})());
|
|
576
|
+
});
|
|
577
|
+
await Promise.all(promises);
|
|
578
|
+
}
|
|
579
|
+
async clearPreloaded() {
|
|
580
|
+
const promises = [];
|
|
581
|
+
this.map.forEach((childAppPromise) => {
|
|
582
|
+
promises.push((async () => {
|
|
583
|
+
await this.run('clear', await childAppPromise);
|
|
584
|
+
})());
|
|
585
|
+
});
|
|
586
|
+
await Promise.all(promises);
|
|
587
|
+
}
|
|
588
|
+
getPreloadedList() {
|
|
589
|
+
return [...this.preloadMap.values()];
|
|
590
|
+
}
|
|
591
|
+
async run(status, config) {
|
|
592
|
+
const childApp = this.loader.get(config);
|
|
593
|
+
if (!childApp) {
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
await this.runner.run('server', status, config);
|
|
597
|
+
await this.stateManager.registerChildApp(config);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
class StateManager {
|
|
602
|
+
constructor({ logger, diManager, }) {
|
|
603
|
+
this.state = Object.create(null);
|
|
604
|
+
this.log = logger('child-app:state-manager');
|
|
605
|
+
this.diManager = diManager;
|
|
606
|
+
}
|
|
607
|
+
registerChildApp(config) {
|
|
608
|
+
const di = this.diManager.getChildDi(config);
|
|
609
|
+
const { key } = config;
|
|
610
|
+
if (!di) {
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
613
|
+
try {
|
|
614
|
+
const context = di.get(CONTEXT_TOKEN);
|
|
615
|
+
this.state[key] = context.dehydrate().dispatcher;
|
|
616
|
+
}
|
|
617
|
+
catch (error) {
|
|
618
|
+
if (error.code !== 'E_STUB') {
|
|
619
|
+
this.log.error({
|
|
620
|
+
event: 'get-state-failed',
|
|
621
|
+
config,
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
getState() {
|
|
627
|
+
return this.state;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
const LOAD_TIMEOUT = 500;
|
|
632
|
+
const customRender = ({ renderManager, }) => {
|
|
633
|
+
return async (content) => {
|
|
634
|
+
let render = renderToString(content);
|
|
635
|
+
let timeouted = false;
|
|
636
|
+
await Promise.race([
|
|
637
|
+
new Promise((resolve) => setTimeout(resolve, LOAD_TIMEOUT)),
|
|
638
|
+
(async () => {
|
|
639
|
+
while ((await renderManager.flush()) && !timeouted) {
|
|
640
|
+
render = renderToString(content);
|
|
641
|
+
}
|
|
642
|
+
})(),
|
|
643
|
+
]);
|
|
644
|
+
timeouted = true;
|
|
645
|
+
return render;
|
|
646
|
+
};
|
|
647
|
+
};
|
|
648
|
+
class RenderManager {
|
|
649
|
+
constructor({ logger, preloadManager, diManager, resolveFullConfig, }) {
|
|
650
|
+
this.hasRenderedSet = new Set();
|
|
651
|
+
this.loadingInProgress = new Map();
|
|
652
|
+
this.log = logger('child-app:render');
|
|
653
|
+
this.preloadManager = preloadManager;
|
|
654
|
+
this.diManager = diManager;
|
|
655
|
+
this.resolveFullConfig = resolveFullConfig;
|
|
656
|
+
}
|
|
657
|
+
getChildDi(request) {
|
|
658
|
+
const config = this.resolveFullConfig(request);
|
|
659
|
+
this.hasRenderedSet.add(config.key);
|
|
660
|
+
if (this.preloadManager.isPreloaded(request)) {
|
|
661
|
+
return [this.diManager.getChildDi(config), null];
|
|
662
|
+
}
|
|
663
|
+
this.log.warn({
|
|
664
|
+
message: 'Child-app has been used but not preloaded before React render',
|
|
665
|
+
request,
|
|
666
|
+
});
|
|
667
|
+
this.loadingInProgress.set(config.key, config);
|
|
668
|
+
const promiseDi = this.preloadManager.preload(request).then(() => {
|
|
669
|
+
return this.diManager.getChildDi(config);
|
|
670
|
+
});
|
|
671
|
+
return [null, promiseDi];
|
|
672
|
+
}
|
|
673
|
+
async flush() {
|
|
674
|
+
const promises = [];
|
|
675
|
+
for (const [_, request] of this.loadingInProgress.entries()) {
|
|
676
|
+
promises.push(this.preloadManager.preload(request));
|
|
677
|
+
}
|
|
678
|
+
this.loadingInProgress.clear();
|
|
679
|
+
if (promises.length) {
|
|
680
|
+
await Promise.all(promises);
|
|
681
|
+
return true;
|
|
682
|
+
}
|
|
683
|
+
return false;
|
|
684
|
+
}
|
|
685
|
+
clear() {
|
|
686
|
+
const preloadedList = this.preloadManager.getPreloadedList();
|
|
687
|
+
for (const request of preloadedList) {
|
|
688
|
+
const config = this.resolveFullConfig(request);
|
|
689
|
+
if (!this.hasRenderedSet.has(config.key)) {
|
|
690
|
+
this.log.warn({
|
|
691
|
+
message: 'Child-app has been preloaded but not used in React render',
|
|
692
|
+
request,
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
this.hasRenderedSet.clear();
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
const registerChildAppRenderSlots = ({ logger, diManager, resolveFullConfig, preloadManager, }) => {
|
|
701
|
+
const log = logger('child-app:render:slots');
|
|
702
|
+
return preloadManager.getPreloadedList().map((requestConfig) => {
|
|
703
|
+
const config = resolveFullConfig(requestConfig);
|
|
704
|
+
const di = diManager.getChildDi(config);
|
|
705
|
+
if (!di) {
|
|
706
|
+
return [];
|
|
707
|
+
}
|
|
708
|
+
const slots = [
|
|
709
|
+
{
|
|
710
|
+
type: ResourceType.script,
|
|
711
|
+
slot: ResourceSlot.HEAD_CORE_SCRIPTS,
|
|
712
|
+
payload: config.client.entry,
|
|
713
|
+
attrs: {
|
|
714
|
+
'data-critical': 'true',
|
|
715
|
+
},
|
|
716
|
+
},
|
|
717
|
+
];
|
|
718
|
+
if (config.css) {
|
|
719
|
+
slots.push({
|
|
720
|
+
type: ResourceType.style,
|
|
721
|
+
slot: ResourceSlot.HEAD_CORE_STYLES,
|
|
722
|
+
payload: config.css.entry,
|
|
723
|
+
attrs: {
|
|
724
|
+
'data-critical': 'true',
|
|
725
|
+
},
|
|
726
|
+
});
|
|
727
|
+
}
|
|
728
|
+
try {
|
|
729
|
+
const renderSlots = di.get({ token: RENDER_SLOTS, optional: true });
|
|
730
|
+
if (renderSlots) {
|
|
731
|
+
slots.push(...renderSlots);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
catch (error) {
|
|
735
|
+
log.error({
|
|
736
|
+
event: 'get-slots-failed',
|
|
737
|
+
config: requestConfig,
|
|
738
|
+
});
|
|
739
|
+
}
|
|
740
|
+
return slots;
|
|
741
|
+
});
|
|
742
|
+
};
|
|
743
|
+
|
|
744
|
+
const serverProviders = [
|
|
745
|
+
provide({
|
|
746
|
+
provide: ENV_USED_TOKEN,
|
|
747
|
+
multi: true,
|
|
748
|
+
useValue: [
|
|
749
|
+
{
|
|
750
|
+
key: 'CHILD_APP_EXTERNAL_URL',
|
|
751
|
+
optional: true,
|
|
752
|
+
validator: combineValidators([isUrl, endsWith('/')]),
|
|
753
|
+
},
|
|
754
|
+
],
|
|
755
|
+
}),
|
|
756
|
+
provide({
|
|
757
|
+
provide: CHILD_APP_LOADER_TOKEN,
|
|
758
|
+
useClass: ServerLoader,
|
|
759
|
+
scope: Scope.SINGLETON,
|
|
760
|
+
deps: {
|
|
761
|
+
logger: LOGGER_TOKEN,
|
|
762
|
+
createCache: CREATE_CACHE_TOKEN,
|
|
763
|
+
},
|
|
764
|
+
}),
|
|
765
|
+
provide({
|
|
766
|
+
provide: CHILD_APP_STATE_MANAGER_TOKEN,
|
|
767
|
+
useClass: StateManager,
|
|
768
|
+
deps: {
|
|
769
|
+
logger: LOGGER_TOKEN,
|
|
770
|
+
diManager: CHILD_APP_DI_MANAGER_TOKEN,
|
|
771
|
+
resourcesRegistry: RESOURCES_REGISTRY,
|
|
772
|
+
},
|
|
773
|
+
}),
|
|
774
|
+
provide({
|
|
775
|
+
provide: CHILD_APP_PRELOAD_MANAGER_TOKEN,
|
|
776
|
+
useClass: PreloadManager,
|
|
777
|
+
deps: {
|
|
778
|
+
loader: CHILD_APP_LOADER_TOKEN,
|
|
779
|
+
runner: CHILD_APP_COMMAND_LINE_RUNNER_TOKEN,
|
|
780
|
+
stateManager: CHILD_APP_STATE_MANAGER_TOKEN,
|
|
781
|
+
preloadExternalConfig: { token: CHILD_APP_PRELOAD_EXTERNAL_CONFIG_TOKEN, optional: true },
|
|
782
|
+
resolveFullConfig: CHILD_APP_RESOLVE_CONFIG_TOKEN,
|
|
783
|
+
},
|
|
784
|
+
}),
|
|
785
|
+
provide({
|
|
786
|
+
provide: RENDER_SLOTS,
|
|
787
|
+
multi: true,
|
|
788
|
+
useFactory: ({ stateManager, preloader, store }) => {
|
|
789
|
+
store.dispatch(setPreloaded(preloader.getPreloadedList()));
|
|
790
|
+
return {
|
|
791
|
+
type: ResourceType.inlineScript,
|
|
792
|
+
slot: ResourceSlot.BODY_END,
|
|
793
|
+
payload: `var childAppInitialState = '${safeDehydrate(stateManager.getState())}'`,
|
|
794
|
+
};
|
|
795
|
+
},
|
|
796
|
+
deps: {
|
|
797
|
+
stateManager: CHILD_APP_STATE_MANAGER_TOKEN,
|
|
798
|
+
preloader: CHILD_APP_PRELOAD_MANAGER_TOKEN,
|
|
799
|
+
store: STORE_TOKEN,
|
|
800
|
+
},
|
|
801
|
+
}),
|
|
802
|
+
provide({
|
|
803
|
+
provide: RENDER_SLOTS,
|
|
804
|
+
multi: true,
|
|
805
|
+
useFactory: registerChildAppRenderSlots,
|
|
806
|
+
deps: {
|
|
807
|
+
logger: LOGGER_TOKEN,
|
|
808
|
+
diManager: CHILD_APP_DI_MANAGER_TOKEN,
|
|
809
|
+
resolveFullConfig: CHILD_APP_RESOLVE_CONFIG_TOKEN,
|
|
810
|
+
preloadManager: CHILD_APP_PRELOAD_MANAGER_TOKEN,
|
|
811
|
+
},
|
|
812
|
+
}),
|
|
813
|
+
provide({
|
|
814
|
+
provide: CUSTOM_RENDER,
|
|
815
|
+
useFactory: customRender,
|
|
816
|
+
deps: {
|
|
817
|
+
renderManager: CHILD_APP_RENDER_MANAGER_TOKEN,
|
|
818
|
+
},
|
|
819
|
+
}),
|
|
820
|
+
provide({
|
|
821
|
+
provide: CHILD_APP_RENDER_MANAGER_TOKEN,
|
|
822
|
+
useClass: RenderManager,
|
|
823
|
+
deps: {
|
|
824
|
+
logger: LOGGER_TOKEN,
|
|
825
|
+
diManager: CHILD_APP_DI_MANAGER_TOKEN,
|
|
826
|
+
preloadManager: CHILD_APP_PRELOAD_MANAGER_TOKEN,
|
|
827
|
+
resolveFullConfig: CHILD_APP_RESOLVE_CONFIG_TOKEN,
|
|
828
|
+
},
|
|
829
|
+
}),
|
|
830
|
+
provide({
|
|
831
|
+
provide: commandLineListTokens$1.resolvePageDeps,
|
|
832
|
+
multi: true,
|
|
833
|
+
useFactory: ({ preloader }) => {
|
|
834
|
+
return function childAppRunPreloaded() {
|
|
835
|
+
return preloader.runPreloaded();
|
|
836
|
+
};
|
|
837
|
+
},
|
|
838
|
+
deps: {
|
|
839
|
+
preloader: CHILD_APP_PRELOAD_MANAGER_TOKEN,
|
|
840
|
+
},
|
|
841
|
+
}),
|
|
842
|
+
provide({
|
|
843
|
+
provide: commandLineListTokens$1.clear,
|
|
844
|
+
multi: true,
|
|
845
|
+
useFactory: ({ renderManager }) => {
|
|
846
|
+
return function childAppRenderClear() {
|
|
847
|
+
renderManager.clear();
|
|
848
|
+
};
|
|
849
|
+
},
|
|
850
|
+
deps: {
|
|
851
|
+
renderManager: CHILD_APP_RENDER_MANAGER_TOKEN,
|
|
852
|
+
},
|
|
853
|
+
}),
|
|
854
|
+
];
|
|
855
|
+
|
|
856
|
+
const ChildApp = ({ name, version, tag, props }) => {
|
|
857
|
+
const renderManager = useContext(RenderContext);
|
|
858
|
+
const resolveExternalConfig = useDi(CHILD_APP_RESOLVE_CONFIG_TOKEN);
|
|
859
|
+
const logger = useDi(LOGGER_TOKEN);
|
|
860
|
+
const log = logger('child-app:render');
|
|
861
|
+
const [maybeDi, promiseDi] = useMemo(() => {
|
|
862
|
+
return renderManager.getChildDi(resolveExternalConfig({ name, version, tag }));
|
|
863
|
+
}, [name, version, tag, renderManager, resolveExternalConfig]);
|
|
864
|
+
const [di, setDi] = useState(maybeDi);
|
|
865
|
+
useEffect(() => {
|
|
866
|
+
if (!di && promiseDi) {
|
|
867
|
+
// any errors with loading child-app should be handled in some other place
|
|
868
|
+
promiseDi.then(setDi).catch(noop);
|
|
869
|
+
}
|
|
870
|
+
}, [di, promiseDi]);
|
|
871
|
+
if (!di) {
|
|
872
|
+
log.error({
|
|
873
|
+
event: 'not-found',
|
|
874
|
+
name,
|
|
875
|
+
version,
|
|
876
|
+
tag,
|
|
877
|
+
message: 'child-app was not initialized',
|
|
878
|
+
});
|
|
879
|
+
return null;
|
|
880
|
+
}
|
|
881
|
+
try {
|
|
882
|
+
const Cmp = di.get({ token: CHILD_APP_INTERNAL_RENDER_TOKEN, optional: true });
|
|
883
|
+
if (!Cmp) {
|
|
884
|
+
log.error({
|
|
885
|
+
event: 'empty-render',
|
|
886
|
+
message: 'Child-app does not provide render token',
|
|
887
|
+
name,
|
|
888
|
+
version,
|
|
889
|
+
tag,
|
|
890
|
+
});
|
|
891
|
+
return null;
|
|
892
|
+
}
|
|
893
|
+
return createElement(Cmp, {
|
|
894
|
+
di,
|
|
895
|
+
props,
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
catch (error) {
|
|
899
|
+
log.error({
|
|
900
|
+
event: 'get-render',
|
|
901
|
+
message: 'Cannot get render token from child-app',
|
|
902
|
+
error,
|
|
903
|
+
name,
|
|
904
|
+
version,
|
|
905
|
+
tag,
|
|
906
|
+
});
|
|
907
|
+
return null;
|
|
908
|
+
}
|
|
909
|
+
};
|
|
910
|
+
|
|
911
|
+
let ChildAppModule = class ChildAppModule {
|
|
912
|
+
};
|
|
913
|
+
ChildAppModule = __decorate([
|
|
914
|
+
Module({
|
|
915
|
+
imports: [],
|
|
916
|
+
providers: [...sharedProviders, ...serverProviders],
|
|
917
|
+
})
|
|
918
|
+
], ChildAppModule);
|
|
919
|
+
|
|
920
|
+
export { ChildApp, ChildAppModule };
|