@tramvai/module-render 1.84.2 → 1.90.1

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 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/module-common';
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 React, { PureComponent, useMemo, createElement, StrictMode } from 'react';
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 (React.createElement(UniversalErrorBoundary, { url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi }, children));
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 (React.createElement(LayoutComponent, { Header: HeaderComponent, Footer: FooterComponent },
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,35 +61,44 @@ 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 (React.createElement(RootComponent, { HeaderComponent: HeaderComponent, FooterComponent: FooterComponent, LayoutComponent: LayoutComponent, PageComponent: PageComponent, ErrorBoundaryComponent: ErrorBoundaryComponent }));
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 (React.createElement(Provider, { context: context },
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
- const ExecuteRenderCallback = ({ children, callback }) => {
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
- const renderer = ({ element, container, callback }) => {
82
- if (process.env.__TRAMVAI_CONCURRENT_FEATURES) {
83
+ const renderer = ({ element, container, callback, log }) => {
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
- return hydrateRoot(container, wrappedElement);
86
+ return hydrateRoot(container, wrappedElement, {
87
+ onRecoverableError: (error) => {
88
+ log.error({
89
+ error,
90
+ event: 'hydrate:recover-after-error',
91
+ });
92
+ },
93
+ });
87
94
  }
88
95
  const { hydrate } = require('react-dom');
89
96
  return hydrate(element, container, callback);
90
97
  };
91
98
 
92
- function rendering({ pageService, log, consumerContext, customRender, extendRender, di, useStrictMode, rendererCallback, }) {
99
+ function rendering({ pageService, log, consumerContext, customRender, extendRender, di, useStrictMode, rendererCallback, initialState, }) {
93
100
  return new Promise((resolve, reject) => {
94
- let renderResult = renderReact({ pageService, di }, consumerContext);
101
+ let renderResult = renderReact({ pageService, di, initialState }, consumerContext);
95
102
  if (extendRender) {
96
103
  each((render) => {
97
104
  renderResult = render(renderResult);
@@ -245,6 +252,7 @@ RenderModule = RenderModule_1 = __decorate([
245
252
  consumerContext: CONTEXT_TOKEN,
246
253
  di: DI_TOKEN,
247
254
  useStrictMode: USE_REACT_STRICT_MODE,
255
+ initialState: INITIAL_APP_STATE_TOKEN,
248
256
  },
249
257
  multi: true,
250
258
  }),
@@ -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
- export declare function rendering({ pageService, log, consumerContext, customRender, extendRender, di, useStrictMode, rendererCallback, }: {
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>;
@@ -1,4 +1,5 @@
1
- export declare function renderReact({ pageService, di }: {
1
+ export declare function renderReact({ pageService, di, initialState }: {
2
2
  pageService: any;
3
3
  di: any;
4
+ initialState: any;
4
5
  }, context: any): JSX.Element;
@@ -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 React, { PureComponent, useMemo, createElement } from 'react';
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';
@@ -8,7 +8,7 @@ import { ClientHintsModule, USER_AGENT_TOKEN } from '@tramvai/module-client-hint
8
8
  import { ResourceType, ResourceSlot, DEFAULT_LAYOUT_COMPONENT, LAYOUT_OPTIONS, DEFAULT_FOOTER_COMPONENT, DEFAULT_HEADER_COMPONENT, TRAMVAI_RENDER_MODE, RESOURCES_REGISTRY, RESOURCE_INLINE_OPTIONS, RENDER_SLOTS, POLYFILL_CONDITION, HTML_ATTRS, CUSTOM_RENDER, EXTEND_RENDER } from '@tramvai/tokens-render';
9
9
  export * from '@tramvai/tokens-render';
10
10
  import { createToken, Scope } from '@tinkoff/dippy';
11
- import { WEB_APP_AFTER_INIT_TOKEN } from '@tramvai/tokens-server';
11
+ import { WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN } from '@tramvai/tokens-server-private';
12
12
  import { useDi, ERROR_BOUNDARY_TOKEN, ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, UniversalErrorBoundary, DIContext, ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN } from '@tramvai/react';
13
13
  import { resolve, isAbsoluteUrl as isAbsoluteUrl$1, parse } from '@tinkoff/url';
14
14
  import { satisfies } from '@tinkoff/user-agent';
@@ -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 (React.createElement(UniversalErrorBoundary, { url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi }, children));
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 (React.createElement(LayoutComponent, { Header: HeaderComponent, Footer: FooterComponent },
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 (React.createElement(RootComponent, { HeaderComponent: HeaderComponent, FooterComponent: FooterComponent, LayoutComponent: LayoutComponent, PageComponent: PageComponent, ErrorBoundaryComponent: ErrorBoundaryComponent }));
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 (React.createElement(Provider, { context: context },
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({
@@ -884,30 +897,27 @@ RenderModule = RenderModule_1 = __decorate([
884
897
  },
885
898
  }),
886
899
  provide({
887
- provide: WEB_APP_AFTER_INIT_TOKEN,
900
+ provide: WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN,
888
901
  multi: true,
889
- useFactory: ({ RootErrorBoundary, logger }) => {
902
+ useFactory: ({ RootErrorBoundary, logger, }) => {
890
903
  const log = logger('module-render:error-handler');
891
- return (app) => {
892
- app.use((err, req, res, next) => {
893
- if (!RootErrorBoundary) {
894
- return next(err);
895
- }
896
- let body;
897
- try {
898
- log.info({ event: 'render-root-boundary' });
899
- body = renderToString(createElement(RootErrorBoundary, { error: err, url: parse(req.url) }));
900
- res.status(err.httpStatus || err.status || 500);
901
- res.setHeader('Content-Type', 'text/html; charset=utf-8');
902
- res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'));
903
- res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
904
- return res.send(body);
905
- }
906
- catch (e) {
907
- log.warn({ event: 'render-root-boundary-error', error: e });
908
- return next(err);
909
- }
910
- });
904
+ return (error, request, reply) => {
905
+ if (!RootErrorBoundary) {
906
+ return;
907
+ }
908
+ let body;
909
+ try {
910
+ log.info({ event: 'render-root-boundary' });
911
+ body = renderToString(createElement(RootErrorBoundary, { error, url: parse(request.url) }));
912
+ reply.status(error.httpStatus || error.status || 500);
913
+ reply.header('Content-Type', 'text/html; charset=utf-8');
914
+ reply.header('Content-Length', Buffer.byteLength(body, 'utf8'));
915
+ reply.header('Cache-Control', 'no-cache, no-store, must-revalidate');
916
+ return body;
917
+ }
918
+ catch (e) {
919
+ log.warn({ event: 'render-root-boundary-error', error: e });
920
+ }
911
921
  };
912
922
  },
913
923
  deps: {
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 React = require('react');
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');
@@ -11,8 +11,8 @@ var tokensRouter = require('@tramvai/tokens-router');
11
11
  var moduleClientHints = require('@tramvai/module-client-hints');
12
12
  var tokensRender = require('@tramvai/tokens-render');
13
13
  var dippy = require('@tinkoff/dippy');
14
- var tokensServer = require('@tramvai/tokens-server');
15
- var react = require('@tramvai/react');
14
+ var tokensServerPrivate = require('@tramvai/tokens-server-private');
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 = React.useMemo(() => {
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 (React__default["default"].createElement(react.UniversalErrorBoundary, { url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi }, children));
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 React.PureComponent {
682
+ class RootComponent extends react.PureComponent {
668
683
  render() {
669
684
  const { LayoutComponent, PageComponent, HeaderComponent, FooterComponent, ErrorBoundaryComponent, } = this.props;
670
- return (React__default["default"].createElement(LayoutComponent, { Header: HeaderComponent, Footer: FooterComponent },
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 (React__default["default"].createElement(RootComponent, { HeaderComponent: HeaderComponent, FooterComponent: FooterComponent, LayoutComponent: LayoutComponent, PageComponent: PageComponent, ErrorBoundaryComponent: ErrorBoundaryComponent }));
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 (React__default["default"].createElement(state.Provider, { context: context },
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({
@@ -921,34 +933,31 @@ exports.RenderModule = RenderModule_1 = tslib.__decorate([
921
933
  },
922
934
  }),
923
935
  core.provide({
924
- provide: tokensServer.WEB_APP_AFTER_INIT_TOKEN,
936
+ provide: tokensServerPrivate.WEB_FASTIFY_APP_BEFORE_ERROR_TOKEN,
925
937
  multi: true,
926
- useFactory: ({ RootErrorBoundary, logger }) => {
938
+ useFactory: ({ RootErrorBoundary, logger, }) => {
927
939
  const log = logger('module-render:error-handler');
928
- return (app) => {
929
- app.use((err, req, res, next) => {
930
- if (!RootErrorBoundary) {
931
- return next(err);
932
- }
933
- let body;
934
- try {
935
- log.info({ event: 'render-root-boundary' });
936
- body = server$1.renderToString(React.createElement(RootErrorBoundary, { error: err, url: url.parse(req.url) }));
937
- res.status(err.httpStatus || err.status || 500);
938
- res.setHeader('Content-Type', 'text/html; charset=utf-8');
939
- res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'));
940
- res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
941
- return res.send(body);
942
- }
943
- catch (e) {
944
- log.warn({ event: 'render-root-boundary-error', error: e });
945
- return next(err);
946
- }
947
- });
940
+ return (error, request, reply) => {
941
+ if (!RootErrorBoundary) {
942
+ return;
943
+ }
944
+ let body;
945
+ try {
946
+ log.info({ event: 'render-root-boundary' });
947
+ body = server$1.renderToString(react.createElement(RootErrorBoundary, { error, url: url.parse(request.url) }));
948
+ reply.status(error.httpStatus || error.status || 500);
949
+ reply.header('Content-Type', 'text/html; charset=utf-8');
950
+ reply.header('Content-Length', Buffer.byteLength(body, 'utf8'));
951
+ reply.header('Cache-Control', 'no-cache, no-store, must-revalidate');
952
+ return body;
953
+ }
954
+ catch (e) {
955
+ log.warn({ event: 'render-root-boundary-error', error: e });
956
+ }
948
957
  };
949
958
  },
950
959
  deps: {
951
- RootErrorBoundary: { token: react.ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN, optional: true },
960
+ RootErrorBoundary: { token: react$1.ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN, optional: true },
952
961
  logger: moduleCommon.LOGGER_TOKEN,
953
962
  },
954
963
  }),
@@ -3,8 +3,8 @@ declare type Options = Parameters<typeof getDiWrapper>[0];
3
3
  export declare const testPageResources: (options: Options) => {
4
4
  render: () => {
5
5
  parsed: import("node-html-parser").HTMLElement;
6
- head: string;
7
6
  body: string;
7
+ head: string;
8
8
  application: string;
9
9
  };
10
10
  di: import("@tinkoff/dippy").Container;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/module-render",
3
- "version": "1.84.2",
3
+ "version": "1.90.1",
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.289",
28
- "@tramvai/module-client-hints": "1.84.2",
29
- "@tramvai/module-router": "1.84.2",
30
- "@tramvai/react": "1.84.2",
27
+ "@tinkoff/user-agent": "0.3.302",
28
+ "@tramvai/module-client-hints": "1.90.1",
29
+ "@tramvai/module-router": "1.90.1",
30
+ "@tramvai/react": "1.90.1",
31
31
  "@tramvai/safe-strings": "0.4.3",
32
- "@tramvai/tokens-render": "1.84.2",
33
- "@tramvai/experiments": "1.84.2",
32
+ "@tramvai/tokens-render": "1.90.1",
33
+ "@tramvai/experiments": "1.90.1",
34
34
  "@types/loadable__server": "^5.12.6",
35
35
  "node-fetch": "^2.6.1"
36
36
  },
@@ -38,23 +38,21 @@
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.84.2",
42
- "@tramvai/core": "1.84.2",
43
- "@tramvai/module-common": "1.84.2",
44
- "@tramvai/state": "1.84.2",
45
- "@tramvai/test-helpers": "1.84.2",
46
- "@tramvai/tokens-common": "1.84.2",
47
- "@tramvai/tokens-router": "1.84.2",
48
- "@tramvai/tokens-server": "1.84.2",
41
+ "@tramvai/cli": "1.90.1",
42
+ "@tramvai/core": "1.90.1",
43
+ "@tramvai/module-common": "1.90.1",
44
+ "@tramvai/state": "1.90.1",
45
+ "@tramvai/test-helpers": "1.90.1",
46
+ "@tramvai/tokens-common": "1.90.1",
47
+ "@tramvai/tokens-router": "1.90.1",
48
+ "@tramvai/tokens-server-private": "1.90.1",
49
49
  "express": "^4.17.1",
50
50
  "prop-types": "^15.6.2",
51
51
  "react": ">=16.8.0",
52
52
  "react-dom": ">=16.8.0",
53
53
  "tslib": "^2.0.3"
54
54
  },
55
- "devDependencies": {
56
- "@types/express": "^4.17.9"
57
- },
55
+ "devDependencies": {},
58
56
  "gitHead": "8e826a214c87b188fc4d254cdd8f2a2b2c55f3a8",
59
57
  "module": "lib/server.es.js",
60
58
  "license": "Apache-2.0"