@tramvai/module-render 1.85.0 → 1.90.2
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.js +19 -18
- package/lib/client/index.d.ts +3 -1
- package/lib/react/index.d.ts +2 -1
- package/lib/resourcesInliner/resourcesInliner.d.ts +3 -1
- package/lib/server.es.js +25 -12
- package/lib/server.js +32 -20
- package/package.json +15 -15
package/lib/browser.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
2
|
import { Module, provide, commandLineListTokens, DI_TOKEN } from '@tramvai/core';
|
|
3
|
-
import { STORE_TOKEN, LOGGER_TOKEN, CONTEXT_TOKEN } from '@tramvai/
|
|
3
|
+
import { COMBINE_REDUCERS, STORE_TOKEN, LOGGER_TOKEN, CONTEXT_TOKEN, INITIAL_APP_STATE_TOKEN } from '@tramvai/tokens-common';
|
|
4
4
|
import { DEFAULT_LAYOUT_COMPONENT, LAYOUT_OPTIONS, DEFAULT_FOOTER_COMPONENT, DEFAULT_HEADER_COMPONENT, TRAMVAI_RENDER_MODE, RESOURCES_REGISTRY, CUSTOM_RENDER, EXTEND_RENDER, RENDERER_CALLBACK, USE_REACT_STRICT_MODE, RENDER_MODE } from '@tramvai/tokens-render';
|
|
5
5
|
export * from '@tramvai/tokens-render';
|
|
6
6
|
import { ROUTER_TOKEN, PAGE_SERVICE_TOKEN } from '@tramvai/tokens-router';
|
|
7
7
|
import each from '@tinkoff/utils/array/each';
|
|
8
|
-
import
|
|
8
|
+
import { PureComponent, useMemo, createElement, StrictMode } from 'react';
|
|
9
|
+
import { jsx } from 'react/jsx-runtime';
|
|
9
10
|
import { createEvent, createReducer, useStore, Provider } from '@tramvai/state';
|
|
10
11
|
import { useDi, ERROR_BOUNDARY_TOKEN, ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, UniversalErrorBoundary, DIContext } from '@tramvai/react';
|
|
11
12
|
import { useRoute, useUrl } from '@tramvai/module-router';
|
|
12
13
|
import { useIsomorphicLayoutEffect } from '@tinkoff/react-hooks';
|
|
13
14
|
import { composeLayoutOptions, createLayout } from '@tinkoff/layout-factory';
|
|
14
|
-
import { COMBINE_REDUCERS } from '@tramvai/tokens-common';
|
|
15
15
|
|
|
16
16
|
function serializeError(error) {
|
|
17
17
|
return {
|
|
@@ -38,14 +38,12 @@ const PageErrorBoundary = (props) => {
|
|
|
38
38
|
}, [serializedError]);
|
|
39
39
|
const errorHandlers = useDi({ token: ERROR_BOUNDARY_TOKEN, optional: true });
|
|
40
40
|
const fallbackFromDi = useDi({ token: ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, optional: true });
|
|
41
|
-
return (
|
|
41
|
+
return (jsx(UniversalErrorBoundary, Object.assign({ url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi }, { children: children }), void 0));
|
|
42
42
|
};
|
|
43
43
|
class RootComponent extends PureComponent {
|
|
44
44
|
render() {
|
|
45
45
|
const { LayoutComponent, PageComponent, HeaderComponent, FooterComponent, ErrorBoundaryComponent, } = this.props;
|
|
46
|
-
return (
|
|
47
|
-
React.createElement(PageErrorBoundary, { fallback: ErrorBoundaryComponent },
|
|
48
|
-
React.createElement(PageComponent, null))));
|
|
46
|
+
return (jsx(LayoutComponent, Object.assign({ Header: HeaderComponent, Footer: FooterComponent }, { children: jsx(PageErrorBoundary, Object.assign({ fallback: ErrorBoundaryComponent }, { children: jsx(PageComponent, {}, void 0) }), void 0) }), void 0));
|
|
49
47
|
}
|
|
50
48
|
}
|
|
51
49
|
const Root = ({ pageService }) => {
|
|
@@ -63,26 +61,28 @@ const Root = ({ pageService }) => {
|
|
|
63
61
|
const HeaderComponent = pageService.resolveComponentFromConfig('header');
|
|
64
62
|
const FooterComponent = pageService.resolveComponentFromConfig('footer');
|
|
65
63
|
const ErrorBoundaryComponent = pageService.resolveComponentFromConfig('errorBoundary');
|
|
66
|
-
return (
|
|
64
|
+
return (jsx(RootComponent, { HeaderComponent: HeaderComponent, FooterComponent: FooterComponent, LayoutComponent: LayoutComponent, PageComponent: PageComponent, ErrorBoundaryComponent: ErrorBoundaryComponent }, void 0));
|
|
67
65
|
};
|
|
68
66
|
|
|
69
|
-
function renderReact({ pageService, di }, context) {
|
|
70
|
-
return (
|
|
71
|
-
React.createElement(DIContext.Provider, { value: di },
|
|
72
|
-
React.createElement(Root, { pageService: pageService }))));
|
|
67
|
+
function renderReact({ pageService, di, initialState }, context) {
|
|
68
|
+
return (jsx(Provider, Object.assign({ context: context, serverState: initialState === null || initialState === void 0 ? void 0 : initialState.stores }, { children: jsx(DIContext.Provider, Object.assign({ value: di }, { children: jsx(Root, { pageService: pageService }, void 0) }), void 0) }), void 0));
|
|
73
69
|
}
|
|
74
70
|
|
|
75
|
-
|
|
71
|
+
let hydrateRoot;
|
|
72
|
+
try {
|
|
73
|
+
// eslint-disable-next-line import/no-unresolved, import/extensions
|
|
74
|
+
hydrateRoot = require('react-dom/client').hydrateRoot;
|
|
75
|
+
}
|
|
76
|
+
catch { }
|
|
77
|
+
const ExecuteRenderCallback = ({ children, callback, }) => {
|
|
76
78
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
77
79
|
useIsomorphicLayoutEffect(callback, []);
|
|
78
80
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
79
81
|
return children;
|
|
80
82
|
};
|
|
81
83
|
const renderer = ({ element, container, callback, log }) => {
|
|
82
|
-
if (process.env.__TRAMVAI_CONCURRENT_FEATURES) {
|
|
84
|
+
if (process.env.__TRAMVAI_CONCURRENT_FEATURES !== 'false' && typeof hydrateRoot === 'function') {
|
|
83
85
|
const wrappedElement = createElement(ExecuteRenderCallback, { callback }, element);
|
|
84
|
-
// eslint-disable-next-line import/no-unresolved, import/extensions
|
|
85
|
-
const { hydrateRoot } = require('react-dom/client');
|
|
86
86
|
return hydrateRoot(container, wrappedElement, {
|
|
87
87
|
onRecoverableError: (error) => {
|
|
88
88
|
log.error({
|
|
@@ -96,9 +96,9 @@ const renderer = ({ element, container, callback, log }) => {
|
|
|
96
96
|
return hydrate(element, container, callback);
|
|
97
97
|
};
|
|
98
98
|
|
|
99
|
-
function rendering({ pageService, log, consumerContext, customRender, extendRender, di, useStrictMode, rendererCallback, }) {
|
|
99
|
+
function rendering({ pageService, log, consumerContext, customRender, extendRender, di, useStrictMode, rendererCallback, initialState, }) {
|
|
100
100
|
return new Promise((resolve, reject) => {
|
|
101
|
-
let renderResult = renderReact({ pageService, di }, consumerContext);
|
|
101
|
+
let renderResult = renderReact({ pageService, di, initialState }, consumerContext);
|
|
102
102
|
if (extendRender) {
|
|
103
103
|
each((render) => {
|
|
104
104
|
renderResult = render(renderResult);
|
|
@@ -252,6 +252,7 @@ RenderModule = RenderModule_1 = __decorate([
|
|
|
252
252
|
consumerContext: CONTEXT_TOKEN,
|
|
253
253
|
di: DI_TOKEN,
|
|
254
254
|
useStrictMode: USE_REACT_STRICT_MODE,
|
|
255
|
+
initialState: INITIAL_APP_STATE_TOKEN,
|
|
255
256
|
},
|
|
256
257
|
multi: true,
|
|
257
258
|
}),
|
package/lib/client/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { EXTEND_RENDER, RENDERER_CALLBACK, USE_REACT_STRICT_MODE } from '@tramvai/tokens-render';
|
|
2
2
|
import type { PAGE_SERVICE_TOKEN } from '@tramvai/tokens-router';
|
|
3
|
-
|
|
3
|
+
import type { INITIAL_APP_STATE_TOKEN } from '@tramvai/tokens-common';
|
|
4
|
+
export declare function rendering({ pageService, log, consumerContext, customRender, extendRender, di, useStrictMode, rendererCallback, initialState, }: {
|
|
4
5
|
pageService: typeof PAGE_SERVICE_TOKEN;
|
|
5
6
|
log: any;
|
|
6
7
|
consumerContext: any;
|
|
@@ -9,4 +10,5 @@ export declare function rendering({ pageService, log, consumerContext, customRen
|
|
|
9
10
|
di: any;
|
|
10
11
|
useStrictMode: typeof USE_REACT_STRICT_MODE;
|
|
11
12
|
rendererCallback?: typeof RENDERER_CALLBACK;
|
|
13
|
+
initialState?: typeof INITIAL_APP_STATE_TOKEN;
|
|
12
14
|
}): Promise<void>;
|
package/lib/react/index.d.ts
CHANGED
|
@@ -7,11 +7,13 @@ export interface ResourcesInlinerType {
|
|
|
7
7
|
export declare class ResourcesInliner implements ResourcesInlinerType {
|
|
8
8
|
private resourceInlineThreshold?;
|
|
9
9
|
private resourcesRegistryCache;
|
|
10
|
+
private log;
|
|
10
11
|
private scheduleFileLoad;
|
|
11
12
|
private scheduleFileSizeLoad;
|
|
12
|
-
constructor({ resourcesRegistryCache, resourceInlineThreshold }: {
|
|
13
|
+
constructor({ resourcesRegistryCache, resourceInlineThreshold, logger }: {
|
|
13
14
|
resourcesRegistryCache: any;
|
|
14
15
|
resourceInlineThreshold: any;
|
|
16
|
+
logger: any;
|
|
15
17
|
});
|
|
16
18
|
shouldAddResource(resource: PageResource): boolean;
|
|
17
19
|
shouldInline(resource: PageResource): boolean;
|
package/lib/server.es.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
|
-
import
|
|
2
|
+
import { PureComponent, useMemo, createElement } from 'react';
|
|
3
3
|
import { renderToString } from 'react-dom/server';
|
|
4
4
|
import { Module, provide, commandLineListTokens, DI_TOKEN } from '@tramvai/core';
|
|
5
5
|
import { CREATE_CACHE_TOKEN, LOGGER_TOKEN, REQUEST_MANAGER_TOKEN, RESPONSE_MANAGER_TOKEN, CONTEXT_TOKEN } from '@tramvai/module-common';
|
|
@@ -29,6 +29,7 @@ import * as path from 'path';
|
|
|
29
29
|
import each from '@tinkoff/utils/array/each';
|
|
30
30
|
import path$1 from '@tinkoff/utils/object/path';
|
|
31
31
|
import { o as onload } from './server_inline.inline.es.js';
|
|
32
|
+
import { jsx } from 'react/jsx-runtime';
|
|
32
33
|
import { createEvent, createReducer, useStore, Provider } from '@tramvai/state';
|
|
33
34
|
import { useRoute, useUrl } from '@tramvai/module-router';
|
|
34
35
|
import { composeLayoutOptions, createLayout } from '@tinkoff/layout-factory';
|
|
@@ -93,7 +94,7 @@ const getResourceUrl = (resource) => {
|
|
|
93
94
|
: resource.payload;
|
|
94
95
|
};
|
|
95
96
|
class ResourcesInliner {
|
|
96
|
-
constructor({ resourcesRegistryCache, resourceInlineThreshold }) {
|
|
97
|
+
constructor({ resourcesRegistryCache, resourceInlineThreshold, logger }) {
|
|
97
98
|
this.scheduleFileLoad = (resource, resourceInlineThreshold) => {
|
|
98
99
|
const url = getResourceUrl(resource);
|
|
99
100
|
const requestKey = `file${url}`;
|
|
@@ -115,6 +116,13 @@ class ResourcesInliner {
|
|
|
115
116
|
this.resourcesRegistryCache.filesCache.set(url, processFile(resource, file));
|
|
116
117
|
}
|
|
117
118
|
this.resourcesRegistryCache.sizeCache.set(url, size);
|
|
119
|
+
})
|
|
120
|
+
.catch((error) => {
|
|
121
|
+
this.log.warn({
|
|
122
|
+
event: 'file-load-failed',
|
|
123
|
+
url,
|
|
124
|
+
error,
|
|
125
|
+
});
|
|
118
126
|
})
|
|
119
127
|
.finally(() => {
|
|
120
128
|
this.resourcesRegistryCache.requestsCache.set(requestKey, undefined);
|
|
@@ -139,6 +147,13 @@ class ResourcesInliner {
|
|
|
139
147
|
if (size < resourceInlineThreshold) {
|
|
140
148
|
this.scheduleFileLoad(resource, resourceInlineThreshold);
|
|
141
149
|
}
|
|
150
|
+
})
|
|
151
|
+
.catch((error) => {
|
|
152
|
+
this.log.warn({
|
|
153
|
+
event: 'file-content-length-load-failed',
|
|
154
|
+
url,
|
|
155
|
+
error,
|
|
156
|
+
});
|
|
142
157
|
})
|
|
143
158
|
.finally(() => {
|
|
144
159
|
this.resourcesRegistryCache.requestsCache.set(requestKey, undefined);
|
|
@@ -148,6 +163,7 @@ class ResourcesInliner {
|
|
|
148
163
|
};
|
|
149
164
|
this.resourcesRegistryCache = resourcesRegistryCache;
|
|
150
165
|
this.resourceInlineThreshold = resourceInlineThreshold;
|
|
166
|
+
this.log = logger('resources-inliner');
|
|
151
167
|
}
|
|
152
168
|
// Метод проверки, стоит ли добавлять preload-ресурс
|
|
153
169
|
shouldAddResource(resource) {
|
|
@@ -625,14 +641,12 @@ const PageErrorBoundary = (props) => {
|
|
|
625
641
|
}, [serializedError]);
|
|
626
642
|
const errorHandlers = useDi({ token: ERROR_BOUNDARY_TOKEN, optional: true });
|
|
627
643
|
const fallbackFromDi = useDi({ token: ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, optional: true });
|
|
628
|
-
return (
|
|
644
|
+
return (jsx(UniversalErrorBoundary, Object.assign({ url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi }, { children: children }), void 0));
|
|
629
645
|
};
|
|
630
646
|
class RootComponent extends PureComponent {
|
|
631
647
|
render() {
|
|
632
648
|
const { LayoutComponent, PageComponent, HeaderComponent, FooterComponent, ErrorBoundaryComponent, } = this.props;
|
|
633
|
-
return (
|
|
634
|
-
React.createElement(PageErrorBoundary, { fallback: ErrorBoundaryComponent },
|
|
635
|
-
React.createElement(PageComponent, null))));
|
|
649
|
+
return (jsx(LayoutComponent, Object.assign({ Header: HeaderComponent, Footer: FooterComponent }, { children: jsx(PageErrorBoundary, Object.assign({ fallback: ErrorBoundaryComponent }, { children: jsx(PageComponent, {}, void 0) }), void 0) }), void 0));
|
|
636
650
|
}
|
|
637
651
|
}
|
|
638
652
|
const Root = ({ pageService }) => {
|
|
@@ -650,13 +664,11 @@ const Root = ({ pageService }) => {
|
|
|
650
664
|
const HeaderComponent = pageService.resolveComponentFromConfig('header');
|
|
651
665
|
const FooterComponent = pageService.resolveComponentFromConfig('footer');
|
|
652
666
|
const ErrorBoundaryComponent = pageService.resolveComponentFromConfig('errorBoundary');
|
|
653
|
-
return (
|
|
667
|
+
return (jsx(RootComponent, { HeaderComponent: HeaderComponent, FooterComponent: FooterComponent, LayoutComponent: LayoutComponent, PageComponent: PageComponent, ErrorBoundaryComponent: ErrorBoundaryComponent }, void 0));
|
|
654
668
|
};
|
|
655
669
|
|
|
656
|
-
function renderReact({ pageService, di }, context) {
|
|
657
|
-
return (
|
|
658
|
-
React.createElement(DIContext.Provider, { value: di },
|
|
659
|
-
React.createElement(Root, { pageService: pageService }))));
|
|
670
|
+
function renderReact({ pageService, di, initialState }, context) {
|
|
671
|
+
return (jsx(Provider, Object.assign({ context: context, serverState: initialState === null || initialState === void 0 ? void 0 : initialState.stores }, { children: jsx(DIContext.Provider, Object.assign({ value: di }, { children: jsx(Root, { pageService: pageService }, void 0) }), void 0) }), void 0));
|
|
660
672
|
}
|
|
661
673
|
|
|
662
674
|
class ReactRenderServer {
|
|
@@ -669,7 +681,7 @@ class ReactRenderServer {
|
|
|
669
681
|
}
|
|
670
682
|
render(extractor) {
|
|
671
683
|
var _a;
|
|
672
|
-
let renderResult = renderReact({ pageService: this.pageService, di: this.di }, this.context);
|
|
684
|
+
let renderResult = renderReact({ pageService: this.pageService, di: this.di, initialState: null }, this.context);
|
|
673
685
|
each((render) => {
|
|
674
686
|
renderResult = render(renderResult);
|
|
675
687
|
}, (_a = this.extendRender) !== null && _a !== void 0 ? _a : []);
|
|
@@ -773,6 +785,7 @@ RenderModule = RenderModule_1 = __decorate([
|
|
|
773
785
|
deps: {
|
|
774
786
|
resourcesRegistryCache: RESOURCES_REGISTRY_CACHE,
|
|
775
787
|
resourceInlineThreshold: { token: RESOURCE_INLINE_OPTIONS, optional: true },
|
|
788
|
+
logger: LOGGER_TOKEN,
|
|
776
789
|
},
|
|
777
790
|
}),
|
|
778
791
|
provide({
|
package/lib/server.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var tslib = require('tslib');
|
|
6
|
-
var
|
|
6
|
+
var react = require('react');
|
|
7
7
|
var server$1 = require('react-dom/server');
|
|
8
8
|
var core = require('@tramvai/core');
|
|
9
9
|
var moduleCommon = require('@tramvai/module-common');
|
|
@@ -12,7 +12,7 @@ var moduleClientHints = require('@tramvai/module-client-hints');
|
|
|
12
12
|
var tokensRender = require('@tramvai/tokens-render');
|
|
13
13
|
var dippy = require('@tinkoff/dippy');
|
|
14
14
|
var tokensServerPrivate = require('@tramvai/tokens-server-private');
|
|
15
|
-
var react = require('@tramvai/react');
|
|
15
|
+
var react$1 = require('@tramvai/react');
|
|
16
16
|
var url = require('@tinkoff/url');
|
|
17
17
|
var userAgent = require('@tinkoff/user-agent');
|
|
18
18
|
var isUndefined = require('@tinkoff/utils/is/undefined');
|
|
@@ -32,6 +32,7 @@ var path = require('path');
|
|
|
32
32
|
var each = require('@tinkoff/utils/array/each');
|
|
33
33
|
var path$1 = require('@tinkoff/utils/object/path');
|
|
34
34
|
var inline_inline = require('./server_inline.inline.js');
|
|
35
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
35
36
|
var state = require('@tramvai/state');
|
|
36
37
|
var moduleRouter = require('@tramvai/module-router');
|
|
37
38
|
var layoutFactory = require('@tinkoff/layout-factory');
|
|
@@ -57,7 +58,6 @@ function _interopNamespace(e) {
|
|
|
57
58
|
return n;
|
|
58
59
|
}
|
|
59
60
|
|
|
60
|
-
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
61
61
|
var isUndefined__default = /*#__PURE__*/_interopDefaultLegacy(isUndefined);
|
|
62
62
|
var isEmpty__default = /*#__PURE__*/_interopDefaultLegacy(isEmpty);
|
|
63
63
|
var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch);
|
|
@@ -130,7 +130,7 @@ const getResourceUrl = (resource) => {
|
|
|
130
130
|
: resource.payload;
|
|
131
131
|
};
|
|
132
132
|
class ResourcesInliner {
|
|
133
|
-
constructor({ resourcesRegistryCache, resourceInlineThreshold }) {
|
|
133
|
+
constructor({ resourcesRegistryCache, resourceInlineThreshold, logger }) {
|
|
134
134
|
this.scheduleFileLoad = (resource, resourceInlineThreshold) => {
|
|
135
135
|
const url = getResourceUrl(resource);
|
|
136
136
|
const requestKey = `file${url}`;
|
|
@@ -152,6 +152,13 @@ class ResourcesInliner {
|
|
|
152
152
|
this.resourcesRegistryCache.filesCache.set(url, processFile(resource, file));
|
|
153
153
|
}
|
|
154
154
|
this.resourcesRegistryCache.sizeCache.set(url, size);
|
|
155
|
+
})
|
|
156
|
+
.catch((error) => {
|
|
157
|
+
this.log.warn({
|
|
158
|
+
event: 'file-load-failed',
|
|
159
|
+
url,
|
|
160
|
+
error,
|
|
161
|
+
});
|
|
155
162
|
})
|
|
156
163
|
.finally(() => {
|
|
157
164
|
this.resourcesRegistryCache.requestsCache.set(requestKey, undefined);
|
|
@@ -176,6 +183,13 @@ class ResourcesInliner {
|
|
|
176
183
|
if (size < resourceInlineThreshold) {
|
|
177
184
|
this.scheduleFileLoad(resource, resourceInlineThreshold);
|
|
178
185
|
}
|
|
186
|
+
})
|
|
187
|
+
.catch((error) => {
|
|
188
|
+
this.log.warn({
|
|
189
|
+
event: 'file-content-length-load-failed',
|
|
190
|
+
url,
|
|
191
|
+
error,
|
|
192
|
+
});
|
|
179
193
|
})
|
|
180
194
|
.finally(() => {
|
|
181
195
|
this.resourcesRegistryCache.requestsCache.set(requestKey, undefined);
|
|
@@ -185,6 +199,7 @@ class ResourcesInliner {
|
|
|
185
199
|
};
|
|
186
200
|
this.resourcesRegistryCache = resourcesRegistryCache;
|
|
187
201
|
this.resourceInlineThreshold = resourceInlineThreshold;
|
|
202
|
+
this.log = logger('resources-inliner');
|
|
188
203
|
}
|
|
189
204
|
// Метод проверки, стоит ли добавлять preload-ресурс
|
|
190
205
|
shouldAddResource(resource) {
|
|
@@ -657,19 +672,17 @@ const PageErrorBoundary = (props) => {
|
|
|
657
672
|
const { children, fallback } = props;
|
|
658
673
|
const url = moduleRouter.useUrl();
|
|
659
674
|
const serializedError = state.useStore(PageErrorStore);
|
|
660
|
-
const error =
|
|
675
|
+
const error = react.useMemo(() => {
|
|
661
676
|
return serializedError && deserializeError(serializedError);
|
|
662
677
|
}, [serializedError]);
|
|
663
|
-
const errorHandlers = react.useDi({ token: react.ERROR_BOUNDARY_TOKEN, optional: true });
|
|
664
|
-
const fallbackFromDi = react.useDi({ token: react.ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, optional: true });
|
|
665
|
-
return (
|
|
678
|
+
const errorHandlers = react$1.useDi({ token: react$1.ERROR_BOUNDARY_TOKEN, optional: true });
|
|
679
|
+
const fallbackFromDi = react$1.useDi({ token: react$1.ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, optional: true });
|
|
680
|
+
return (jsxRuntime.jsx(react$1.UniversalErrorBoundary, Object.assign({ url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi }, { children: children }), void 0));
|
|
666
681
|
};
|
|
667
|
-
class RootComponent extends
|
|
682
|
+
class RootComponent extends react.PureComponent {
|
|
668
683
|
render() {
|
|
669
684
|
const { LayoutComponent, PageComponent, HeaderComponent, FooterComponent, ErrorBoundaryComponent, } = this.props;
|
|
670
|
-
return (
|
|
671
|
-
React__default["default"].createElement(PageErrorBoundary, { fallback: ErrorBoundaryComponent },
|
|
672
|
-
React__default["default"].createElement(PageComponent, null))));
|
|
685
|
+
return (jsxRuntime.jsx(LayoutComponent, Object.assign({ Header: HeaderComponent, Footer: FooterComponent }, { children: jsxRuntime.jsx(PageErrorBoundary, Object.assign({ fallback: ErrorBoundaryComponent }, { children: jsxRuntime.jsx(PageComponent, {}, void 0) }), void 0) }), void 0));
|
|
673
686
|
}
|
|
674
687
|
}
|
|
675
688
|
const Root = ({ pageService }) => {
|
|
@@ -687,13 +700,11 @@ const Root = ({ pageService }) => {
|
|
|
687
700
|
const HeaderComponent = pageService.resolveComponentFromConfig('header');
|
|
688
701
|
const FooterComponent = pageService.resolveComponentFromConfig('footer');
|
|
689
702
|
const ErrorBoundaryComponent = pageService.resolveComponentFromConfig('errorBoundary');
|
|
690
|
-
return (
|
|
703
|
+
return (jsxRuntime.jsx(RootComponent, { HeaderComponent: HeaderComponent, FooterComponent: FooterComponent, LayoutComponent: LayoutComponent, PageComponent: PageComponent, ErrorBoundaryComponent: ErrorBoundaryComponent }, void 0));
|
|
691
704
|
};
|
|
692
705
|
|
|
693
|
-
function renderReact({ pageService, di }, context) {
|
|
694
|
-
return (
|
|
695
|
-
React__default["default"].createElement(react.DIContext.Provider, { value: di },
|
|
696
|
-
React__default["default"].createElement(Root, { pageService: pageService }))));
|
|
706
|
+
function renderReact({ pageService, di, initialState }, context) {
|
|
707
|
+
return (jsxRuntime.jsx(state.Provider, Object.assign({ context: context, serverState: initialState === null || initialState === void 0 ? void 0 : initialState.stores }, { children: jsxRuntime.jsx(react$1.DIContext.Provider, Object.assign({ value: di }, { children: jsxRuntime.jsx(Root, { pageService: pageService }, void 0) }), void 0) }), void 0));
|
|
697
708
|
}
|
|
698
709
|
|
|
699
710
|
class ReactRenderServer {
|
|
@@ -706,7 +717,7 @@ class ReactRenderServer {
|
|
|
706
717
|
}
|
|
707
718
|
render(extractor) {
|
|
708
719
|
var _a;
|
|
709
|
-
let renderResult = renderReact({ pageService: this.pageService, di: this.di }, this.context);
|
|
720
|
+
let renderResult = renderReact({ pageService: this.pageService, di: this.di, initialState: null }, this.context);
|
|
710
721
|
each__default["default"]((render) => {
|
|
711
722
|
renderResult = render(renderResult);
|
|
712
723
|
}, (_a = this.extendRender) !== null && _a !== void 0 ? _a : []);
|
|
@@ -810,6 +821,7 @@ exports.RenderModule = RenderModule_1 = tslib.__decorate([
|
|
|
810
821
|
deps: {
|
|
811
822
|
resourcesRegistryCache: RESOURCES_REGISTRY_CACHE,
|
|
812
823
|
resourceInlineThreshold: { token: tokensRender.RESOURCE_INLINE_OPTIONS, optional: true },
|
|
824
|
+
logger: moduleCommon.LOGGER_TOKEN,
|
|
813
825
|
},
|
|
814
826
|
}),
|
|
815
827
|
core.provide({
|
|
@@ -932,7 +944,7 @@ exports.RenderModule = RenderModule_1 = tslib.__decorate([
|
|
|
932
944
|
let body;
|
|
933
945
|
try {
|
|
934
946
|
log.info({ event: 'render-root-boundary' });
|
|
935
|
-
body = server$1.renderToString(
|
|
947
|
+
body = server$1.renderToString(react.createElement(RootErrorBoundary, { error, url: url.parse(request.url) }));
|
|
936
948
|
reply.status(error.httpStatus || error.status || 500);
|
|
937
949
|
reply.header('Content-Type', 'text/html; charset=utf-8');
|
|
938
950
|
reply.header('Content-Length', Buffer.byteLength(body, 'utf8'));
|
|
@@ -945,7 +957,7 @@ exports.RenderModule = RenderModule_1 = tslib.__decorate([
|
|
|
945
957
|
};
|
|
946
958
|
},
|
|
947
959
|
deps: {
|
|
948
|
-
RootErrorBoundary: { token: react.ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN, optional: true },
|
|
960
|
+
RootErrorBoundary: { token: react$1.ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN, optional: true },
|
|
949
961
|
logger: moduleCommon.LOGGER_TOKEN,
|
|
950
962
|
},
|
|
951
963
|
}),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tramvai/module-render",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.90.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"browser": "lib/browser.js",
|
|
6
6
|
"main": "lib/server.js",
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
"@tinkoff/htmlpagebuilder": "0.4.22",
|
|
25
25
|
"@tinkoff/layout-factory": "0.2.28",
|
|
26
26
|
"@tinkoff/url": "0.7.37",
|
|
27
|
-
"@tinkoff/user-agent": "0.3.
|
|
28
|
-
"@tramvai/module-client-hints": "1.
|
|
29
|
-
"@tramvai/module-router": "1.
|
|
30
|
-
"@tramvai/react": "1.
|
|
27
|
+
"@tinkoff/user-agent": "0.3.303",
|
|
28
|
+
"@tramvai/module-client-hints": "1.90.2",
|
|
29
|
+
"@tramvai/module-router": "1.90.2",
|
|
30
|
+
"@tramvai/react": "1.90.2",
|
|
31
31
|
"@tramvai/safe-strings": "0.4.3",
|
|
32
|
-
"@tramvai/tokens-render": "1.
|
|
33
|
-
"@tramvai/experiments": "1.
|
|
32
|
+
"@tramvai/tokens-render": "1.90.2",
|
|
33
|
+
"@tramvai/experiments": "1.90.2",
|
|
34
34
|
"@types/loadable__server": "^5.12.6",
|
|
35
35
|
"node-fetch": "^2.6.1"
|
|
36
36
|
},
|
|
@@ -38,14 +38,14 @@
|
|
|
38
38
|
"@tinkoff/dippy": "0.7.39",
|
|
39
39
|
"@tinkoff/utils": "^2.1.2",
|
|
40
40
|
"@tinkoff/react-hooks": "0.0.24",
|
|
41
|
-
"@tramvai/cli": "1.
|
|
42
|
-
"@tramvai/core": "1.
|
|
43
|
-
"@tramvai/module-common": "1.
|
|
44
|
-
"@tramvai/state": "1.
|
|
45
|
-
"@tramvai/test-helpers": "1.
|
|
46
|
-
"@tramvai/tokens-common": "1.
|
|
47
|
-
"@tramvai/tokens-router": "1.
|
|
48
|
-
"@tramvai/tokens-server-private": "1.
|
|
41
|
+
"@tramvai/cli": "1.90.2",
|
|
42
|
+
"@tramvai/core": "1.90.2",
|
|
43
|
+
"@tramvai/module-common": "1.90.2",
|
|
44
|
+
"@tramvai/state": "1.90.2",
|
|
45
|
+
"@tramvai/test-helpers": "1.90.2",
|
|
46
|
+
"@tramvai/tokens-common": "1.90.2",
|
|
47
|
+
"@tramvai/tokens-router": "1.90.2",
|
|
48
|
+
"@tramvai/tokens-server-private": "1.90.2",
|
|
49
49
|
"express": "^4.17.1",
|
|
50
50
|
"prop-types": "^15.6.2",
|
|
51
51
|
"react": ">=16.8.0",
|