@tramvai/module-render 2.63.0 → 2.64.0

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
@@ -9,11 +9,41 @@ import { useMemo, createElement, StrictMode } from 'react';
9
9
  import { jsx } from 'react/jsx-runtime';
10
10
  import { createEvent, createReducer, useStore, Provider } from '@tramvai/state';
11
11
  import { useDi, ERROR_BOUNDARY_TOKEN, ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, UniversalErrorBoundary, DIContext } from '@tramvai/react';
12
- import { usePageService, useUrl } from '@tramvai/module-router';
12
+ import { useUrl, usePageService } from '@tramvai/module-router';
13
13
  import debounce from '@tinkoff/utils/function/debounce';
14
14
  import { useIsomorphicLayoutEffect } from '@tinkoff/react-hooks';
15
15
  import { composeLayoutOptions, createLayout } from '@tinkoff/layout-factory';
16
16
 
17
+ function serializeError(error) {
18
+ return {
19
+ ...error,
20
+ message: error.message,
21
+ stack: error.stack,
22
+ };
23
+ }
24
+ function deserializeError(serializedError) {
25
+ const error = new Error(serializedError.message);
26
+ Object.assign(error, serializedError);
27
+ return error;
28
+ }
29
+ const setPageErrorEvent = createEvent('setPageError');
30
+ const initialState = null;
31
+ const PageErrorStore = createReducer('pageError', initialState).on(setPageErrorEvent, (state, error) => error && serializeError(error));
32
+
33
+ const PageErrorBoundary = (props) => {
34
+ const { children } = props;
35
+ const pageService = useDi(PAGE_SERVICE_TOKEN);
36
+ const url = useUrl();
37
+ const serializedError = useStore(PageErrorStore);
38
+ const error = useMemo(() => {
39
+ return serializedError && deserializeError(serializedError);
40
+ }, [serializedError]);
41
+ const errorHandlers = useDi({ token: ERROR_BOUNDARY_TOKEN, optional: true });
42
+ const fallbackFromDi = useDi({ token: ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, optional: true });
43
+ const fallback = pageService.resolveComponentFromConfig('errorBoundary');
44
+ return (jsx(UniversalErrorBoundary, { url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi, children: children }));
45
+ };
46
+
17
47
  /**
18
48
  * Result component structure:
19
49
  *
@@ -21,7 +51,9 @@ import { composeLayoutOptions, createLayout } from '@tinkoff/layout-factory';
21
51
  * <RootComponent>
22
52
  * <LayoutComponent>
23
53
  * <NestedLayoutComponent>
24
- * <PageComponent />
54
+ * <ErrorBoundaryComponent>
55
+ * <PageComponent />
56
+ * </ErrorBoundaryComponent>
25
57
  * </NestedLayoutComponent>
26
58
  * </LayoutComponent>
27
59
  * </RootComponent>
@@ -55,7 +87,7 @@ const PageRenderComponent = () => {
55
87
  throw new Error(`Page component '${pageComponent}' not found`);
56
88
  };
57
89
  }
58
- const page = useMemo(() => jsx(PageComponent, {}), [PageComponent]);
90
+ const page = useMemo(() => (jsx(PageErrorBoundary, { children: jsx(PageComponent, {}) })), [PageComponent]);
59
91
  return page;
60
92
  };
61
93
  const Root = () => {
@@ -64,39 +96,9 @@ const Root = () => {
64
96
  return jsx(LayoutRenderComponent, { children: nestedLayoutRenderComponent });
65
97
  };
66
98
 
67
- function serializeError(error) {
68
- return {
69
- ...error,
70
- message: error.message,
71
- stack: error.stack,
72
- };
73
- }
74
- function deserializeError(serializedError) {
75
- const error = new Error(serializedError.message);
76
- Object.assign(error, serializedError);
77
- return error;
78
- }
79
- const setPageErrorEvent = createEvent('setPageError');
80
- const initialState = null;
81
- const PageErrorStore = createReducer('pageError', initialState).on(setPageErrorEvent, (state, error) => error && serializeError(error));
82
-
83
- const PageErrorBoundary = (props) => {
84
- const { children } = props;
85
- const pageService = useDi(PAGE_SERVICE_TOKEN);
86
- const url = useUrl();
87
- const serializedError = useStore(PageErrorStore);
88
- const error = useMemo(() => {
89
- return serializedError && deserializeError(serializedError);
90
- }, [serializedError]);
91
- const errorHandlers = useDi({ token: ERROR_BOUNDARY_TOKEN, optional: true });
92
- const fallbackFromDi = useDi({ token: ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, optional: true });
93
- const fallback = pageService.resolveComponentFromConfig('errorBoundary');
94
- return (jsx(UniversalErrorBoundary, { url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi, children: children }));
95
- };
96
-
97
99
  function renderReact({ di }, context) {
98
100
  const serverState = typeof window !== 'undefined' ? context.getState() : undefined;
99
- return (jsx(Provider, { context: context, serverState: serverState, children: jsx(DIContext.Provider, { value: di, children: jsx(PageErrorBoundary, { children: jsx(Root, {}) }) }) }));
101
+ return (jsx(Provider, { context: context, serverState: serverState, children: jsx(DIContext.Provider, { value: di, children: jsx(Root, {}) }) }));
100
102
  }
101
103
 
102
104
  let hydrateRoot;
package/lib/server.es.js CHANGED
@@ -32,7 +32,7 @@ import { o as onload } from './server_inline.inline.es.js';
32
32
  import { Writable } from 'stream';
33
33
  import { jsx } from 'react/jsx-runtime';
34
34
  import { createEvent, createReducer, useStore, Provider } from '@tramvai/state';
35
- import { usePageService, useUrl } from '@tramvai/module-router';
35
+ import { useUrl, usePageService } from '@tramvai/module-router';
36
36
  import { composeLayoutOptions, createLayout } from '@tinkoff/layout-factory';
37
37
 
38
38
  const thirtySeconds = 1000 * 30;
@@ -647,6 +647,36 @@ const htmlPageSchemaFactory = ({ htmlAttrs, }) => {
647
647
  ];
648
648
  };
649
649
 
650
+ function serializeError(error) {
651
+ return {
652
+ ...error,
653
+ message: error.message,
654
+ stack: error.stack,
655
+ };
656
+ }
657
+ function deserializeError(serializedError) {
658
+ const error = new Error(serializedError.message);
659
+ Object.assign(error, serializedError);
660
+ return error;
661
+ }
662
+ const setPageErrorEvent = createEvent('setPageError');
663
+ const initialState = null;
664
+ const PageErrorStore = createReducer('pageError', initialState).on(setPageErrorEvent, (state, error) => error && serializeError(error));
665
+
666
+ const PageErrorBoundary = (props) => {
667
+ const { children } = props;
668
+ const pageService = useDi(PAGE_SERVICE_TOKEN);
669
+ const url = useUrl();
670
+ const serializedError = useStore(PageErrorStore);
671
+ const error = useMemo(() => {
672
+ return serializedError && deserializeError(serializedError);
673
+ }, [serializedError]);
674
+ const errorHandlers = useDi({ token: ERROR_BOUNDARY_TOKEN, optional: true });
675
+ const fallbackFromDi = useDi({ token: ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, optional: true });
676
+ const fallback = pageService.resolveComponentFromConfig('errorBoundary');
677
+ return (jsx(UniversalErrorBoundary, { url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi, children: children }));
678
+ };
679
+
650
680
  /**
651
681
  * Result component structure:
652
682
  *
@@ -654,7 +684,9 @@ const htmlPageSchemaFactory = ({ htmlAttrs, }) => {
654
684
  * <RootComponent>
655
685
  * <LayoutComponent>
656
686
  * <NestedLayoutComponent>
657
- * <PageComponent />
687
+ * <ErrorBoundaryComponent>
688
+ * <PageComponent />
689
+ * </ErrorBoundaryComponent>
658
690
  * </NestedLayoutComponent>
659
691
  * </LayoutComponent>
660
692
  * </RootComponent>
@@ -688,7 +720,7 @@ const PageRenderComponent = () => {
688
720
  throw new Error(`Page component '${pageComponent}' not found`);
689
721
  };
690
722
  }
691
- const page = useMemo(() => jsx(PageComponent, {}), [PageComponent]);
723
+ const page = useMemo(() => (jsx(PageErrorBoundary, { children: jsx(PageComponent, {}) })), [PageComponent]);
692
724
  return page;
693
725
  };
694
726
  const Root = () => {
@@ -697,39 +729,9 @@ const Root = () => {
697
729
  return jsx(LayoutRenderComponent, { children: nestedLayoutRenderComponent });
698
730
  };
699
731
 
700
- function serializeError(error) {
701
- return {
702
- ...error,
703
- message: error.message,
704
- stack: error.stack,
705
- };
706
- }
707
- function deserializeError(serializedError) {
708
- const error = new Error(serializedError.message);
709
- Object.assign(error, serializedError);
710
- return error;
711
- }
712
- const setPageErrorEvent = createEvent('setPageError');
713
- const initialState = null;
714
- const PageErrorStore = createReducer('pageError', initialState).on(setPageErrorEvent, (state, error) => error && serializeError(error));
715
-
716
- const PageErrorBoundary = (props) => {
717
- const { children } = props;
718
- const pageService = useDi(PAGE_SERVICE_TOKEN);
719
- const url = useUrl();
720
- const serializedError = useStore(PageErrorStore);
721
- const error = useMemo(() => {
722
- return serializedError && deserializeError(serializedError);
723
- }, [serializedError]);
724
- const errorHandlers = useDi({ token: ERROR_BOUNDARY_TOKEN, optional: true });
725
- const fallbackFromDi = useDi({ token: ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, optional: true });
726
- const fallback = pageService.resolveComponentFromConfig('errorBoundary');
727
- return (jsx(UniversalErrorBoundary, { url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi, children: children }));
728
- };
729
-
730
732
  function renderReact({ di }, context) {
731
733
  const serverState = typeof window !== 'undefined' ? context.getState() : undefined;
732
- return (jsx(Provider, { context: context, serverState: serverState, children: jsx(DIContext.Provider, { value: di, children: jsx(PageErrorBoundary, { children: jsx(Root, {}) }) }) }));
734
+ return (jsx(Provider, { context: context, serverState: serverState, children: jsx(DIContext.Provider, { value: di, children: jsx(Root, {}) }) }));
733
735
  }
734
736
 
735
737
  const RENDER_TIMEOUT = 500;
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$1 = require('react');
7
7
  var server$1 = require('react-dom/server');
8
8
  var core = require('@tramvai/core');
9
9
  var tokensCommon = require('@tramvai/tokens-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$1 = require('@tramvai/react');
15
+ var react = 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');
@@ -683,6 +683,36 @@ const htmlPageSchemaFactory = ({ htmlAttrs, }) => {
683
683
  ];
684
684
  };
685
685
 
686
+ function serializeError(error) {
687
+ return {
688
+ ...error,
689
+ message: error.message,
690
+ stack: error.stack,
691
+ };
692
+ }
693
+ function deserializeError(serializedError) {
694
+ const error = new Error(serializedError.message);
695
+ Object.assign(error, serializedError);
696
+ return error;
697
+ }
698
+ const setPageErrorEvent = state.createEvent('setPageError');
699
+ const initialState = null;
700
+ const PageErrorStore = state.createReducer('pageError', initialState).on(setPageErrorEvent, (state, error) => error && serializeError(error));
701
+
702
+ const PageErrorBoundary = (props) => {
703
+ const { children } = props;
704
+ const pageService = react.useDi(tokensRouter.PAGE_SERVICE_TOKEN);
705
+ const url = moduleRouter.useUrl();
706
+ const serializedError = state.useStore(PageErrorStore);
707
+ const error = react$1.useMemo(() => {
708
+ return serializedError && deserializeError(serializedError);
709
+ }, [serializedError]);
710
+ const errorHandlers = react.useDi({ token: react.ERROR_BOUNDARY_TOKEN, optional: true });
711
+ const fallbackFromDi = react.useDi({ token: react.ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, optional: true });
712
+ const fallback = pageService.resolveComponentFromConfig('errorBoundary');
713
+ return (jsxRuntime.jsx(react.UniversalErrorBoundary, { url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi, children: children }));
714
+ };
715
+
686
716
  /**
687
717
  * Result component structure:
688
718
  *
@@ -690,7 +720,9 @@ const htmlPageSchemaFactory = ({ htmlAttrs, }) => {
690
720
  * <RootComponent>
691
721
  * <LayoutComponent>
692
722
  * <NestedLayoutComponent>
693
- * <PageComponent />
723
+ * <ErrorBoundaryComponent>
724
+ * <PageComponent />
725
+ * </ErrorBoundaryComponent>
694
726
  * </NestedLayoutComponent>
695
727
  * </LayoutComponent>
696
728
  * </RootComponent>
@@ -706,13 +738,13 @@ const LayoutRenderComponent = ({ children }) => {
706
738
  const LayoutComponent = pageService.resolveComponentFromConfig('layout');
707
739
  const HeaderComponent = pageService.resolveComponentFromConfig('header');
708
740
  const FooterComponent = pageService.resolveComponentFromConfig('footer');
709
- const layout = react.useMemo(() => (jsxRuntime.jsx(LayoutComponent, { Header: HeaderComponent, Footer: FooterComponent, children: children })), [LayoutComponent, HeaderComponent, FooterComponent, children]);
741
+ const layout = react$1.useMemo(() => (jsxRuntime.jsx(LayoutComponent, { Header: HeaderComponent, Footer: FooterComponent, children: children })), [LayoutComponent, HeaderComponent, FooterComponent, children]);
710
742
  return layout;
711
743
  };
712
744
  const NestedLayoutRenderComponent = ({ children }) => {
713
745
  const pageService = moduleRouter.usePageService();
714
746
  const NestedLayoutComponent = pageService.resolveComponentFromConfig('nestedLayout');
715
- const nestedLayout = react.useMemo(() => jsxRuntime.jsx(NestedLayoutComponent, { children: children }), [NestedLayoutComponent, children]);
747
+ const nestedLayout = react$1.useMemo(() => jsxRuntime.jsx(NestedLayoutComponent, { children: children }), [NestedLayoutComponent, children]);
716
748
  return nestedLayout;
717
749
  };
718
750
  const PageRenderComponent = () => {
@@ -724,48 +756,18 @@ const PageRenderComponent = () => {
724
756
  throw new Error(`Page component '${pageComponent}' not found`);
725
757
  };
726
758
  }
727
- const page = react.useMemo(() => jsxRuntime.jsx(PageComponent, {}), [PageComponent]);
759
+ const page = react$1.useMemo(() => (jsxRuntime.jsx(PageErrorBoundary, { children: jsxRuntime.jsx(PageComponent, {}) })), [PageComponent]);
728
760
  return page;
729
761
  };
730
762
  const Root = () => {
731
- const pageRenderComponent = react.useMemo(() => jsxRuntime.jsx(PageRenderComponent, {}), []);
732
- const nestedLayoutRenderComponent = react.useMemo(() => jsxRuntime.jsx(NestedLayoutRenderComponent, { children: pageRenderComponent }), [pageRenderComponent]);
763
+ const pageRenderComponent = react$1.useMemo(() => jsxRuntime.jsx(PageRenderComponent, {}), []);
764
+ const nestedLayoutRenderComponent = react$1.useMemo(() => jsxRuntime.jsx(NestedLayoutRenderComponent, { children: pageRenderComponent }), [pageRenderComponent]);
733
765
  return jsxRuntime.jsx(LayoutRenderComponent, { children: nestedLayoutRenderComponent });
734
766
  };
735
767
 
736
- function serializeError(error) {
737
- return {
738
- ...error,
739
- message: error.message,
740
- stack: error.stack,
741
- };
742
- }
743
- function deserializeError(serializedError) {
744
- const error = new Error(serializedError.message);
745
- Object.assign(error, serializedError);
746
- return error;
747
- }
748
- const setPageErrorEvent = state.createEvent('setPageError');
749
- const initialState = null;
750
- const PageErrorStore = state.createReducer('pageError', initialState).on(setPageErrorEvent, (state, error) => error && serializeError(error));
751
-
752
- const PageErrorBoundary = (props) => {
753
- const { children } = props;
754
- const pageService = react$1.useDi(tokensRouter.PAGE_SERVICE_TOKEN);
755
- const url = moduleRouter.useUrl();
756
- const serializedError = state.useStore(PageErrorStore);
757
- const error = react.useMemo(() => {
758
- return serializedError && deserializeError(serializedError);
759
- }, [serializedError]);
760
- const errorHandlers = react$1.useDi({ token: react$1.ERROR_BOUNDARY_TOKEN, optional: true });
761
- const fallbackFromDi = react$1.useDi({ token: react$1.ERROR_BOUNDARY_FALLBACK_COMPONENT_TOKEN, optional: true });
762
- const fallback = pageService.resolveComponentFromConfig('errorBoundary');
763
- return (jsxRuntime.jsx(react$1.UniversalErrorBoundary, { url: url, error: error, errorHandlers: errorHandlers, fallback: fallback, fallbackFromDi: fallbackFromDi, children: children }));
764
- };
765
-
766
768
  function renderReact({ di }, context) {
767
769
  const serverState = typeof window !== 'undefined' ? context.getState() : undefined;
768
- return (jsxRuntime.jsx(state.Provider, { context: context, serverState: serverState, children: jsxRuntime.jsx(react$1.DIContext.Provider, { value: di, children: jsxRuntime.jsx(PageErrorBoundary, { children: jsxRuntime.jsx(Root, {}) }) }) }));
770
+ return (jsxRuntime.jsx(state.Provider, { context: context, serverState: serverState, children: jsxRuntime.jsx(react.DIContext.Provider, { value: di, children: jsxRuntime.jsx(Root, {}) }) }));
769
771
  }
770
772
 
771
773
  const RENDER_TIMEOUT = 500;
@@ -1093,7 +1095,7 @@ exports.RenderModule = RenderModule_1 = tslib.__decorate([
1093
1095
  let body;
1094
1096
  try {
1095
1097
  log.info({ event: 'render-root-boundary-start' });
1096
- body = server$1.renderToString(react.createElement(RootErrorBoundary, { error, url: url.parse(request.url) }));
1098
+ body = server$1.renderToString(react$1.createElement(RootErrorBoundary, { error, url: url.parse(request.url) }));
1097
1099
  log.info({ event: 'render-root-boundary-success' });
1098
1100
  const status = error.status || error.httpStatus || 500;
1099
1101
  // log send-server-error only after successful Root Boundary render,
@@ -1123,7 +1125,7 @@ exports.RenderModule = RenderModule_1 = tslib.__decorate([
1123
1125
  };
1124
1126
  },
1125
1127
  deps: {
1126
- RootErrorBoundary: { token: react$1.ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN, optional: true },
1128
+ RootErrorBoundary: { token: react.ROOT_ERROR_BOUNDARY_COMPONENT_TOKEN, optional: true },
1127
1129
  logger: tokensCommon.LOGGER_TOKEN,
1128
1130
  },
1129
1131
  }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/module-render",
3
- "version": "2.63.0",
3
+ "version": "2.64.0",
4
4
  "description": "",
5
5
  "browser": "lib/browser.js",
6
6
  "main": "lib/server.js",
@@ -26,13 +26,13 @@
26
26
  "@tinkoff/htmlpagebuilder": "0.5.5",
27
27
  "@tinkoff/layout-factory": "0.3.6",
28
28
  "@tinkoff/url": "0.8.4",
29
- "@tinkoff/user-agent": "0.4.151",
30
- "@tramvai/module-client-hints": "2.63.0",
31
- "@tramvai/module-router": "2.63.0",
32
- "@tramvai/react": "2.63.0",
29
+ "@tinkoff/user-agent": "0.4.152",
30
+ "@tramvai/module-client-hints": "2.64.0",
31
+ "@tramvai/module-router": "2.64.0",
32
+ "@tramvai/react": "2.64.0",
33
33
  "@tramvai/safe-strings": "0.5.6",
34
- "@tramvai/tokens-render": "2.63.0",
35
- "@tramvai/experiments": "2.63.0",
34
+ "@tramvai/tokens-render": "2.64.0",
35
+ "@tramvai/experiments": "2.64.0",
36
36
  "@types/loadable__server": "^5.12.6",
37
37
  "node-fetch": "^2.6.1"
38
38
  },
@@ -40,14 +40,14 @@
40
40
  "@tinkoff/dippy": "0.8.11",
41
41
  "@tinkoff/utils": "^2.1.2",
42
42
  "@tinkoff/react-hooks": "0.1.4",
43
- "@tramvai/cli": "2.63.0",
44
- "@tramvai/core": "2.63.0",
45
- "@tramvai/module-common": "2.63.0",
46
- "@tramvai/state": "2.63.0",
47
- "@tramvai/test-helpers": "2.63.0",
48
- "@tramvai/tokens-common": "2.63.0",
49
- "@tramvai/tokens-router": "2.63.0",
50
- "@tramvai/tokens-server-private": "2.63.0",
43
+ "@tramvai/cli": "2.64.0",
44
+ "@tramvai/core": "2.64.0",
45
+ "@tramvai/module-common": "2.64.0",
46
+ "@tramvai/state": "2.64.0",
47
+ "@tramvai/test-helpers": "2.64.0",
48
+ "@tramvai/tokens-common": "2.64.0",
49
+ "@tramvai/tokens-router": "2.64.0",
50
+ "@tramvai/tokens-server-private": "2.64.0",
51
51
  "express": "^4.17.1",
52
52
  "prop-types": "^15.6.2",
53
53
  "react": ">=16.14.0",