@tramvai/module-page-render-mode 2.70.0 → 2.72.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/ForceCSRModule.browser.js +85 -0
- package/lib/ForceCSRModule.es.js +85 -0
- package/lib/ForceCSRModule.js +89 -0
- package/lib/PageRenderWrapper.browser.js +37 -0
- package/lib/PageRenderWrapper.es.js +37 -0
- package/lib/PageRenderWrapper.js +42 -0
- package/lib/browser.js +5 -174
- package/lib/error.es.js +11 -0
- package/lib/error.js +15 -0
- package/lib/server.es.js +6 -580
- package/lib/server.js +18 -597
- package/lib/shared.browser.js +39 -0
- package/lib/shared.es.js +39 -0
- package/lib/shared.js +43 -0
- package/lib/staticPages/backgroundFetchService.es.js +73 -0
- package/lib/staticPages/backgroundFetchService.js +81 -0
- package/lib/staticPages/staticPagesService.es.js +109 -0
- package/lib/staticPages/staticPagesService.js +113 -0
- package/lib/staticPages.es.js +226 -0
- package/lib/staticPages.js +238 -0
- package/lib/tokens.browser.js +19 -0
- package/lib/tokens.es.js +19 -0
- package/lib/tokens.js +34 -0
- package/lib/utils/cacheKey.es.js +5 -0
- package/lib/utils/cacheKey.js +9 -0
- package/lib/utils/getPageRenderMode.browser.js +9 -0
- package/lib/utils/getPageRenderMode.es.js +9 -0
- package/lib/utils/getPageRenderMode.js +13 -0
- package/package.json +18 -19
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { declareModule, provide, commandLineListTokens } from '@tramvai/core';
|
|
2
|
+
import { ENV_USED_TOKEN, ENV_MANAGER_TOKEN, COMPONENT_REGISTRY_TOKEN } from '@tramvai/tokens-common';
|
|
3
|
+
import { TRAMVAI_RENDER_MODE } from '@tramvai/tokens-render';
|
|
4
|
+
import { ROUTER_TOKEN } from '@tramvai/tokens-router';
|
|
5
|
+
import { PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT } from './tokens.browser.js';
|
|
6
|
+
|
|
7
|
+
// default internal bundle, used for File-System components
|
|
8
|
+
const FALLBACK_GROUP = '__default';
|
|
9
|
+
// just some unic name
|
|
10
|
+
const FALLBACK_NAME = '__csr_fallback__';
|
|
11
|
+
// just some unic path
|
|
12
|
+
const FALLBACK_PATH = '/__csr_fallback__/';
|
|
13
|
+
// env for force CSR mode
|
|
14
|
+
const FORCE_RENDER_ENV_KEY = 'TRAMVAI_FORCE_CLIENT_SIDE_RENDERING';
|
|
15
|
+
const FALLBACK_ROUTE = {
|
|
16
|
+
name: FALLBACK_NAME,
|
|
17
|
+
path: FALLBACK_PATH,
|
|
18
|
+
config: {
|
|
19
|
+
bundle: FALLBACK_GROUP,
|
|
20
|
+
pageComponent: FALLBACK_NAME,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Module for force CSR mode, only add logic when `TRAMVAI_FORCE_CLIENT_SIDE_RENDERING=true` env variable is set
|
|
25
|
+
*/
|
|
26
|
+
const ForceCSRModule = declareModule({
|
|
27
|
+
name: 'ForceCSRModule',
|
|
28
|
+
providers: [
|
|
29
|
+
provide({
|
|
30
|
+
provide: ENV_USED_TOKEN,
|
|
31
|
+
useValue: [{ key: FORCE_RENDER_ENV_KEY, optional: true }],
|
|
32
|
+
}),
|
|
33
|
+
// set CSR mode globally
|
|
34
|
+
provide({
|
|
35
|
+
provide: TRAMVAI_RENDER_MODE,
|
|
36
|
+
useFactory: ({ envManager }) => envManager.get(FORCE_RENDER_ENV_KEY) === 'true' ? 'client' : 'ssr',
|
|
37
|
+
deps: {
|
|
38
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
39
|
+
},
|
|
40
|
+
}),
|
|
41
|
+
// register CSR fallback component
|
|
42
|
+
provide({
|
|
43
|
+
provide: commandLineListTokens.listen,
|
|
44
|
+
useFactory: ({ componentRegistry, fallback, envManager }) => {
|
|
45
|
+
return function addCSRFallbackCompnent() {
|
|
46
|
+
if (envManager.get(FORCE_RENDER_ENV_KEY) === 'true') {
|
|
47
|
+
componentRegistry.add(FALLBACK_NAME, fallback, FALLBACK_GROUP);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
deps: {
|
|
52
|
+
componentRegistry: COMPONENT_REGISTRY_TOKEN,
|
|
53
|
+
fallback: { token: PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT, optional: true },
|
|
54
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
// add CSR fallback route
|
|
58
|
+
provide({
|
|
59
|
+
provide: commandLineListTokens.customerStart,
|
|
60
|
+
useFactory: ({ router, envManager }) => {
|
|
61
|
+
return function addCSRFallbackRoute() {
|
|
62
|
+
if (envManager.get(FORCE_RENDER_ENV_KEY) === 'true') {
|
|
63
|
+
router.registerHook('beforeResolve', async () => {
|
|
64
|
+
router.addRoute(FALLBACK_ROUTE);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
deps: {
|
|
70
|
+
router: ROUTER_TOKEN,
|
|
71
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
72
|
+
},
|
|
73
|
+
}),
|
|
74
|
+
// tramvai static will not generate CSR fallback if /bundleInfo is not contains this route
|
|
75
|
+
{
|
|
76
|
+
provide: 'router bundleInfoAdditional',
|
|
77
|
+
useFactory: ({ envManager }) => () => envManager.get(FORCE_RENDER_ENV_KEY) === 'true' ? FALLBACK_ROUTE : null,
|
|
78
|
+
deps: {
|
|
79
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
export { ForceCSRModule };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { declareModule, provide, commandLineListTokens } from '@tramvai/core';
|
|
2
|
+
import { ENV_USED_TOKEN, ENV_MANAGER_TOKEN, COMPONENT_REGISTRY_TOKEN } from '@tramvai/tokens-common';
|
|
3
|
+
import { TRAMVAI_RENDER_MODE } from '@tramvai/tokens-render';
|
|
4
|
+
import { ROUTER_TOKEN } from '@tramvai/tokens-router';
|
|
5
|
+
import { PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT } from './tokens.es.js';
|
|
6
|
+
|
|
7
|
+
// default internal bundle, used for File-System components
|
|
8
|
+
const FALLBACK_GROUP = '__default';
|
|
9
|
+
// just some unic name
|
|
10
|
+
const FALLBACK_NAME = '__csr_fallback__';
|
|
11
|
+
// just some unic path
|
|
12
|
+
const FALLBACK_PATH = '/__csr_fallback__/';
|
|
13
|
+
// env for force CSR mode
|
|
14
|
+
const FORCE_RENDER_ENV_KEY = 'TRAMVAI_FORCE_CLIENT_SIDE_RENDERING';
|
|
15
|
+
const FALLBACK_ROUTE = {
|
|
16
|
+
name: FALLBACK_NAME,
|
|
17
|
+
path: FALLBACK_PATH,
|
|
18
|
+
config: {
|
|
19
|
+
bundle: FALLBACK_GROUP,
|
|
20
|
+
pageComponent: FALLBACK_NAME,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Module for force CSR mode, only add logic when `TRAMVAI_FORCE_CLIENT_SIDE_RENDERING=true` env variable is set
|
|
25
|
+
*/
|
|
26
|
+
const ForceCSRModule = declareModule({
|
|
27
|
+
name: 'ForceCSRModule',
|
|
28
|
+
providers: [
|
|
29
|
+
provide({
|
|
30
|
+
provide: ENV_USED_TOKEN,
|
|
31
|
+
useValue: [{ key: FORCE_RENDER_ENV_KEY, optional: true }],
|
|
32
|
+
}),
|
|
33
|
+
// set CSR mode globally
|
|
34
|
+
provide({
|
|
35
|
+
provide: TRAMVAI_RENDER_MODE,
|
|
36
|
+
useFactory: ({ envManager }) => envManager.get(FORCE_RENDER_ENV_KEY) === 'true' ? 'client' : 'ssr',
|
|
37
|
+
deps: {
|
|
38
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
39
|
+
},
|
|
40
|
+
}),
|
|
41
|
+
// register CSR fallback component
|
|
42
|
+
provide({
|
|
43
|
+
provide: commandLineListTokens.listen,
|
|
44
|
+
useFactory: ({ componentRegistry, fallback, envManager }) => {
|
|
45
|
+
return function addCSRFallbackCompnent() {
|
|
46
|
+
if (envManager.get(FORCE_RENDER_ENV_KEY) === 'true') {
|
|
47
|
+
componentRegistry.add(FALLBACK_NAME, fallback, FALLBACK_GROUP);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
deps: {
|
|
52
|
+
componentRegistry: COMPONENT_REGISTRY_TOKEN,
|
|
53
|
+
fallback: { token: PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT, optional: true },
|
|
54
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
// add CSR fallback route
|
|
58
|
+
provide({
|
|
59
|
+
provide: commandLineListTokens.customerStart,
|
|
60
|
+
useFactory: ({ router, envManager }) => {
|
|
61
|
+
return function addCSRFallbackRoute() {
|
|
62
|
+
if (envManager.get(FORCE_RENDER_ENV_KEY) === 'true') {
|
|
63
|
+
router.registerHook('beforeResolve', async () => {
|
|
64
|
+
router.addRoute(FALLBACK_ROUTE);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
deps: {
|
|
70
|
+
router: ROUTER_TOKEN,
|
|
71
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
72
|
+
},
|
|
73
|
+
}),
|
|
74
|
+
// tramvai static will not generate CSR fallback if /bundleInfo is not contains this route
|
|
75
|
+
{
|
|
76
|
+
provide: 'router bundleInfoAdditional',
|
|
77
|
+
useFactory: ({ envManager }) => () => envManager.get(FORCE_RENDER_ENV_KEY) === 'true' ? FALLBACK_ROUTE : null,
|
|
78
|
+
deps: {
|
|
79
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
export { ForceCSRModule };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var core = require('@tramvai/core');
|
|
6
|
+
var tokensCommon = require('@tramvai/tokens-common');
|
|
7
|
+
var tokensRender = require('@tramvai/tokens-render');
|
|
8
|
+
var tokensRouter = require('@tramvai/tokens-router');
|
|
9
|
+
var tokens = require('./tokens.js');
|
|
10
|
+
|
|
11
|
+
// default internal bundle, used for File-System components
|
|
12
|
+
const FALLBACK_GROUP = '__default';
|
|
13
|
+
// just some unic name
|
|
14
|
+
const FALLBACK_NAME = '__csr_fallback__';
|
|
15
|
+
// just some unic path
|
|
16
|
+
const FALLBACK_PATH = '/__csr_fallback__/';
|
|
17
|
+
// env for force CSR mode
|
|
18
|
+
const FORCE_RENDER_ENV_KEY = 'TRAMVAI_FORCE_CLIENT_SIDE_RENDERING';
|
|
19
|
+
const FALLBACK_ROUTE = {
|
|
20
|
+
name: FALLBACK_NAME,
|
|
21
|
+
path: FALLBACK_PATH,
|
|
22
|
+
config: {
|
|
23
|
+
bundle: FALLBACK_GROUP,
|
|
24
|
+
pageComponent: FALLBACK_NAME,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Module for force CSR mode, only add logic when `TRAMVAI_FORCE_CLIENT_SIDE_RENDERING=true` env variable is set
|
|
29
|
+
*/
|
|
30
|
+
const ForceCSRModule = core.declareModule({
|
|
31
|
+
name: 'ForceCSRModule',
|
|
32
|
+
providers: [
|
|
33
|
+
core.provide({
|
|
34
|
+
provide: tokensCommon.ENV_USED_TOKEN,
|
|
35
|
+
useValue: [{ key: FORCE_RENDER_ENV_KEY, optional: true }],
|
|
36
|
+
}),
|
|
37
|
+
// set CSR mode globally
|
|
38
|
+
core.provide({
|
|
39
|
+
provide: tokensRender.TRAMVAI_RENDER_MODE,
|
|
40
|
+
useFactory: ({ envManager }) => envManager.get(FORCE_RENDER_ENV_KEY) === 'true' ? 'client' : 'ssr',
|
|
41
|
+
deps: {
|
|
42
|
+
envManager: tokensCommon.ENV_MANAGER_TOKEN,
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
45
|
+
// register CSR fallback component
|
|
46
|
+
core.provide({
|
|
47
|
+
provide: core.commandLineListTokens.listen,
|
|
48
|
+
useFactory: ({ componentRegistry, fallback, envManager }) => {
|
|
49
|
+
return function addCSRFallbackCompnent() {
|
|
50
|
+
if (envManager.get(FORCE_RENDER_ENV_KEY) === 'true') {
|
|
51
|
+
componentRegistry.add(FALLBACK_NAME, fallback, FALLBACK_GROUP);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
deps: {
|
|
56
|
+
componentRegistry: tokensCommon.COMPONENT_REGISTRY_TOKEN,
|
|
57
|
+
fallback: { token: tokens.PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT, optional: true },
|
|
58
|
+
envManager: tokensCommon.ENV_MANAGER_TOKEN,
|
|
59
|
+
},
|
|
60
|
+
}),
|
|
61
|
+
// add CSR fallback route
|
|
62
|
+
core.provide({
|
|
63
|
+
provide: core.commandLineListTokens.customerStart,
|
|
64
|
+
useFactory: ({ router, envManager }) => {
|
|
65
|
+
return function addCSRFallbackRoute() {
|
|
66
|
+
if (envManager.get(FORCE_RENDER_ENV_KEY) === 'true') {
|
|
67
|
+
router.registerHook('beforeResolve', async () => {
|
|
68
|
+
router.addRoute(FALLBACK_ROUTE);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
deps: {
|
|
74
|
+
router: tokensRouter.ROUTER_TOKEN,
|
|
75
|
+
envManager: tokensCommon.ENV_MANAGER_TOKEN,
|
|
76
|
+
},
|
|
77
|
+
}),
|
|
78
|
+
// tramvai static will not generate CSR fallback if /bundleInfo is not contains this route
|
|
79
|
+
{
|
|
80
|
+
provide: 'router bundleInfoAdditional',
|
|
81
|
+
useFactory: ({ envManager }) => () => envManager.get(FORCE_RENDER_ENV_KEY) === 'true' ? FALLBACK_ROUTE : null,
|
|
82
|
+
deps: {
|
|
83
|
+
envManager: tokensCommon.ENV_MANAGER_TOKEN,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
exports.ForceCSRModule = ForceCSRModule;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useDi } from '@tramvai/react';
|
|
4
|
+
import { PAGE_SERVICE_TOKEN } from '@tramvai/tokens-router';
|
|
5
|
+
import { PAGE_RENDER_FALLBACK_COMPONENT_PREFIX, PAGE_RENDER_DEFAULT_MODE, PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT } from './tokens.browser.js';
|
|
6
|
+
import { getPageRenderMode } from './utils/getPageRenderMode.browser.js';
|
|
7
|
+
|
|
8
|
+
const PageRenderWrapper = ({ children }) => {
|
|
9
|
+
const [mounted, setMounted] = useState(false);
|
|
10
|
+
const pageService = useDi(PAGE_SERVICE_TOKEN);
|
|
11
|
+
const fallbackKey = useDi(PAGE_RENDER_FALLBACK_COMPONENT_PREFIX);
|
|
12
|
+
const defaultRenderMode = useDi(PAGE_RENDER_DEFAULT_MODE);
|
|
13
|
+
const DefaultFallbackComponent = useDi({
|
|
14
|
+
token: PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT,
|
|
15
|
+
optional: true,
|
|
16
|
+
});
|
|
17
|
+
const FallbackComponent = pageService.resolveComponentFromConfig(fallbackKey) || DefaultFallbackComponent;
|
|
18
|
+
const mode = getPageRenderMode({ pageService, defaultRenderMode });
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (mode === 'client') {
|
|
21
|
+
setMounted(true);
|
|
22
|
+
}
|
|
23
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
24
|
+
}, []);
|
|
25
|
+
if (mode === 'client' && !mounted) {
|
|
26
|
+
if (FallbackComponent) {
|
|
27
|
+
return jsx(FallbackComponent, {});
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return jsx(Fragment, { children: children });
|
|
32
|
+
};
|
|
33
|
+
const pageRenderHOC = (WrapperPage) => (props) => {
|
|
34
|
+
return (jsx(PageRenderWrapper, { children: jsx(WrapperPage, { ...props }) }));
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export { PageRenderWrapper, pageRenderHOC };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useDi } from '@tramvai/react';
|
|
4
|
+
import { PAGE_SERVICE_TOKEN } from '@tramvai/tokens-router';
|
|
5
|
+
import { PAGE_RENDER_FALLBACK_COMPONENT_PREFIX, PAGE_RENDER_DEFAULT_MODE, PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT } from './tokens.es.js';
|
|
6
|
+
import { getPageRenderMode } from './utils/getPageRenderMode.es.js';
|
|
7
|
+
|
|
8
|
+
const PageRenderWrapper = ({ children }) => {
|
|
9
|
+
const [mounted, setMounted] = useState(false);
|
|
10
|
+
const pageService = useDi(PAGE_SERVICE_TOKEN);
|
|
11
|
+
const fallbackKey = useDi(PAGE_RENDER_FALLBACK_COMPONENT_PREFIX);
|
|
12
|
+
const defaultRenderMode = useDi(PAGE_RENDER_DEFAULT_MODE);
|
|
13
|
+
const DefaultFallbackComponent = useDi({
|
|
14
|
+
token: PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT,
|
|
15
|
+
optional: true,
|
|
16
|
+
});
|
|
17
|
+
const FallbackComponent = pageService.resolveComponentFromConfig(fallbackKey) || DefaultFallbackComponent;
|
|
18
|
+
const mode = getPageRenderMode({ pageService, defaultRenderMode });
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (mode === 'client') {
|
|
21
|
+
setMounted(true);
|
|
22
|
+
}
|
|
23
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
24
|
+
}, []);
|
|
25
|
+
if (mode === 'client' && !mounted) {
|
|
26
|
+
if (FallbackComponent) {
|
|
27
|
+
return jsx(FallbackComponent, {});
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return jsx(Fragment, { children: children });
|
|
32
|
+
};
|
|
33
|
+
const pageRenderHOC = (WrapperPage) => (props) => {
|
|
34
|
+
return (jsx(PageRenderWrapper, { children: jsx(WrapperPage, { ...props }) }));
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export { PageRenderWrapper, pageRenderHOC };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var react$1 = require('@tramvai/react');
|
|
8
|
+
var tokensRouter = require('@tramvai/tokens-router');
|
|
9
|
+
var tokens = require('./tokens.js');
|
|
10
|
+
var getPageRenderMode = require('./utils/getPageRenderMode.js');
|
|
11
|
+
|
|
12
|
+
const PageRenderWrapper = ({ children }) => {
|
|
13
|
+
const [mounted, setMounted] = react.useState(false);
|
|
14
|
+
const pageService = react$1.useDi(tokensRouter.PAGE_SERVICE_TOKEN);
|
|
15
|
+
const fallbackKey = react$1.useDi(tokens.PAGE_RENDER_FALLBACK_COMPONENT_PREFIX);
|
|
16
|
+
const defaultRenderMode = react$1.useDi(tokens.PAGE_RENDER_DEFAULT_MODE);
|
|
17
|
+
const DefaultFallbackComponent = react$1.useDi({
|
|
18
|
+
token: tokens.PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT,
|
|
19
|
+
optional: true,
|
|
20
|
+
});
|
|
21
|
+
const FallbackComponent = pageService.resolveComponentFromConfig(fallbackKey) || DefaultFallbackComponent;
|
|
22
|
+
const mode = getPageRenderMode.getPageRenderMode({ pageService, defaultRenderMode });
|
|
23
|
+
react.useEffect(() => {
|
|
24
|
+
if (mode === 'client') {
|
|
25
|
+
setMounted(true);
|
|
26
|
+
}
|
|
27
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
28
|
+
}, []);
|
|
29
|
+
if (mode === 'client' && !mounted) {
|
|
30
|
+
if (FallbackComponent) {
|
|
31
|
+
return jsxRuntime.jsx(FallbackComponent, {});
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
|
|
36
|
+
};
|
|
37
|
+
const pageRenderHOC = (WrapperPage) => (props) => {
|
|
38
|
+
return (jsxRuntime.jsx(PageRenderWrapper, { children: jsxRuntime.jsx(WrapperPage, { ...props }) }));
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
exports.PageRenderWrapper = PageRenderWrapper;
|
|
42
|
+
exports.pageRenderHOC = pageRenderHOC;
|
package/lib/browser.js
CHANGED
|
@@ -1,176 +1,7 @@
|
|
|
1
|
-
import { declareModule
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import { createToken } from '@tinkoff/dippy';
|
|
6
|
-
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
7
|
-
import { useState, useEffect } from 'react';
|
|
8
|
-
import { useDi } from '@tramvai/react';
|
|
9
|
-
|
|
10
|
-
const PAGE_RENDER_FALLBACK_COMPONENT_PREFIX = createToken('pageRenderFallbackComponentName');
|
|
11
|
-
/**
|
|
12
|
-
* @deprecated Use token `TRAMVAI_RENDER_MODE` from `@tramvai/tokens-render`
|
|
13
|
-
*/
|
|
14
|
-
const PAGE_RENDER_DEFAULT_MODE = createToken('pageRenderDefaultMode');
|
|
15
|
-
const PAGE_RENDER_WRAPPER_TYPE = createToken('pageRenderWrapperType');
|
|
16
|
-
const PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT = createToken('pageRenderDefaultFallbackComponent');
|
|
17
|
-
const STATIC_PAGES_CACHE_TOKEN = createToken('static pages cache');
|
|
18
|
-
const STATIC_PAGES_SHOULD_USE_CACHE = createToken('static pages should use cache');
|
|
19
|
-
const STATIC_PAGES_SHOULD_SET_TO_CACHE = createToken('static pages should set to cache');
|
|
20
|
-
const STATIC_PAGES_BACKGROUND_FETCH_ENABLED = createToken('static pages can fetch page');
|
|
21
|
-
const STATIC_PAGES_OPTIONS_TOKEN = createToken('static pages options');
|
|
22
|
-
const STATIC_PAGES_COMMAND_LINE = createToken('static pages command line');
|
|
23
|
-
const STATIC_PAGES_MODIFY_CACHE = createToken('static pages modify cache', { multi: true });
|
|
24
|
-
const STATIC_PAGES_CACHE_5xx_RESPONSE = createToken('static pages cache 5xx response');
|
|
25
|
-
|
|
26
|
-
// default internal bundle, used for File-System components
|
|
27
|
-
const FALLBACK_GROUP = '__default';
|
|
28
|
-
// just some unic name
|
|
29
|
-
const FALLBACK_NAME = '__csr_fallback__';
|
|
30
|
-
// just some unic path
|
|
31
|
-
const FALLBACK_PATH = '/__csr_fallback__/';
|
|
32
|
-
// env for force CSR mode
|
|
33
|
-
const FORCE_RENDER_ENV_KEY = 'TRAMVAI_FORCE_CLIENT_SIDE_RENDERING';
|
|
34
|
-
const FALLBACK_ROUTE = {
|
|
35
|
-
name: FALLBACK_NAME,
|
|
36
|
-
path: FALLBACK_PATH,
|
|
37
|
-
config: {
|
|
38
|
-
bundle: FALLBACK_GROUP,
|
|
39
|
-
pageComponent: FALLBACK_NAME,
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* Module for force CSR mode, only add logic when `TRAMVAI_FORCE_CLIENT_SIDE_RENDERING=true` env variable is set
|
|
44
|
-
*/
|
|
45
|
-
const ForceCSRModule = declareModule({
|
|
46
|
-
name: 'ForceCSRModule',
|
|
47
|
-
providers: [
|
|
48
|
-
provide({
|
|
49
|
-
provide: ENV_USED_TOKEN,
|
|
50
|
-
useValue: [{ key: FORCE_RENDER_ENV_KEY, optional: true }],
|
|
51
|
-
}),
|
|
52
|
-
// set CSR mode globally
|
|
53
|
-
provide({
|
|
54
|
-
provide: TRAMVAI_RENDER_MODE,
|
|
55
|
-
useFactory: ({ envManager }) => envManager.get(FORCE_RENDER_ENV_KEY) === 'true' ? 'client' : 'ssr',
|
|
56
|
-
deps: {
|
|
57
|
-
envManager: ENV_MANAGER_TOKEN,
|
|
58
|
-
},
|
|
59
|
-
}),
|
|
60
|
-
// register CSR fallback component
|
|
61
|
-
provide({
|
|
62
|
-
provide: commandLineListTokens.listen,
|
|
63
|
-
useFactory: ({ componentRegistry, fallback, envManager }) => {
|
|
64
|
-
return function addCSRFallbackCompnent() {
|
|
65
|
-
if (envManager.get(FORCE_RENDER_ENV_KEY) === 'true') {
|
|
66
|
-
componentRegistry.add(FALLBACK_NAME, fallback, FALLBACK_GROUP);
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
},
|
|
70
|
-
deps: {
|
|
71
|
-
componentRegistry: COMPONENT_REGISTRY_TOKEN,
|
|
72
|
-
fallback: { token: PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT, optional: true },
|
|
73
|
-
envManager: ENV_MANAGER_TOKEN,
|
|
74
|
-
},
|
|
75
|
-
}),
|
|
76
|
-
// add CSR fallback route
|
|
77
|
-
provide({
|
|
78
|
-
provide: commandLineListTokens.customerStart,
|
|
79
|
-
useFactory: ({ router, envManager }) => {
|
|
80
|
-
return function addCSRFallbackRoute() {
|
|
81
|
-
if (envManager.get(FORCE_RENDER_ENV_KEY) === 'true') {
|
|
82
|
-
router.registerHook('beforeResolve', async () => {
|
|
83
|
-
router.addRoute(FALLBACK_ROUTE);
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
},
|
|
88
|
-
deps: {
|
|
89
|
-
router: ROUTER_TOKEN,
|
|
90
|
-
envManager: ENV_MANAGER_TOKEN,
|
|
91
|
-
},
|
|
92
|
-
}),
|
|
93
|
-
// tramvai static will not generate CSR fallback if /bundleInfo is not contains this route
|
|
94
|
-
{
|
|
95
|
-
provide: 'router bundleInfoAdditional',
|
|
96
|
-
useFactory: ({ envManager }) => () => envManager.get(FORCE_RENDER_ENV_KEY) === 'true' ? FALLBACK_ROUTE : null,
|
|
97
|
-
deps: {
|
|
98
|
-
envManager: ENV_MANAGER_TOKEN,
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
|
-
],
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
const getPageRenderMode = ({ pageService, defaultRenderMode, }) => {
|
|
105
|
-
var _a;
|
|
106
|
-
const { pageComponent, pageRenderMode } = pageService.getConfig();
|
|
107
|
-
const { renderMode } = (_a = pageService.getComponent(pageComponent)) !== null && _a !== void 0 ? _a : {};
|
|
108
|
-
const mode = pageRenderMode || renderMode || defaultRenderMode;
|
|
109
|
-
return mode;
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
const PageRenderWrapper = ({ children }) => {
|
|
113
|
-
const [mounted, setMounted] = useState(false);
|
|
114
|
-
const pageService = useDi(PAGE_SERVICE_TOKEN);
|
|
115
|
-
const fallbackKey = useDi(PAGE_RENDER_FALLBACK_COMPONENT_PREFIX);
|
|
116
|
-
const defaultRenderMode = useDi(PAGE_RENDER_DEFAULT_MODE);
|
|
117
|
-
const DefaultFallbackComponent = useDi({
|
|
118
|
-
token: PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT,
|
|
119
|
-
optional: true,
|
|
120
|
-
});
|
|
121
|
-
const FallbackComponent = pageService.resolveComponentFromConfig(fallbackKey) || DefaultFallbackComponent;
|
|
122
|
-
const mode = getPageRenderMode({ pageService, defaultRenderMode });
|
|
123
|
-
useEffect(() => {
|
|
124
|
-
if (mode === 'client') {
|
|
125
|
-
setMounted(true);
|
|
126
|
-
}
|
|
127
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
128
|
-
}, []);
|
|
129
|
-
if (mode === 'client' && !mounted) {
|
|
130
|
-
if (FallbackComponent) {
|
|
131
|
-
return jsx(FallbackComponent, {});
|
|
132
|
-
}
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
return jsx(Fragment, { children: children });
|
|
136
|
-
};
|
|
137
|
-
const pageRenderHOC = (WrapperPage) => (props) => {
|
|
138
|
-
return (jsx(PageRenderWrapper, { children: jsx(WrapperPage, { ...props }) }));
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
const sharedProviders = [
|
|
142
|
-
{
|
|
143
|
-
provide: LAYOUT_OPTIONS,
|
|
144
|
-
multi: true,
|
|
145
|
-
useFactory: ({ wrapperType }) => {
|
|
146
|
-
return {
|
|
147
|
-
wrappers: {
|
|
148
|
-
[wrapperType]: pageRenderHOC,
|
|
149
|
-
},
|
|
150
|
-
};
|
|
151
|
-
},
|
|
152
|
-
deps: {
|
|
153
|
-
wrapperType: PAGE_RENDER_WRAPPER_TYPE,
|
|
154
|
-
},
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
provide: PAGE_RENDER_FALLBACK_COMPONENT_PREFIX,
|
|
158
|
-
useValue: 'pageRenderFallback',
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
provide: PAGE_RENDER_DEFAULT_MODE,
|
|
162
|
-
useFactory: ({ tramvaiRenderMode }) => {
|
|
163
|
-
return tramvaiRenderMode;
|
|
164
|
-
},
|
|
165
|
-
deps: {
|
|
166
|
-
tramvaiRenderMode: TRAMVAI_RENDER_MODE,
|
|
167
|
-
},
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
provide: PAGE_RENDER_WRAPPER_TYPE,
|
|
171
|
-
useValue: 'page',
|
|
172
|
-
},
|
|
173
|
-
];
|
|
1
|
+
import { declareModule } from '@tramvai/core';
|
|
2
|
+
import { ForceCSRModule } from './ForceCSRModule.browser.js';
|
|
3
|
+
import { sharedProviders } from './shared.browser.js';
|
|
4
|
+
export { PAGE_RENDER_DEFAULT_FALLBACK_COMPONENT, PAGE_RENDER_DEFAULT_MODE, PAGE_RENDER_FALLBACK_COMPONENT_PREFIX, PAGE_RENDER_WRAPPER_TYPE, STATIC_PAGES_BACKGROUND_FETCH_ENABLED, STATIC_PAGES_CACHE_5xx_RESPONSE, STATIC_PAGES_CACHE_TOKEN, STATIC_PAGES_COMMAND_LINE, STATIC_PAGES_MODIFY_CACHE, STATIC_PAGES_OPTIONS_TOKEN, STATIC_PAGES_SHOULD_SET_TO_CACHE, STATIC_PAGES_SHOULD_USE_CACHE } from './tokens.browser.js';
|
|
174
5
|
|
|
175
6
|
// @todo: перенести в @tramvai/module-render
|
|
176
7
|
const PageRenderModeModule = declareModule({
|
|
@@ -179,4 +10,4 @@ const PageRenderModeModule = declareModule({
|
|
|
179
10
|
providers: [...sharedProviders],
|
|
180
11
|
});
|
|
181
12
|
|
|
182
|
-
export {
|
|
13
|
+
export { PageRenderModeModule };
|
package/lib/error.es.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SilentError } from '@tinkoff/errors';
|
|
2
|
+
|
|
3
|
+
class StopCommandLineRunnerError extends SilentError {
|
|
4
|
+
constructor() {
|
|
5
|
+
super('Prevent CommandLineRunner from execution');
|
|
6
|
+
this.name = StopCommandLineRunnerError.errorName;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
StopCommandLineRunnerError.errorName = 'StopCommandLineRunnerError';
|
|
10
|
+
|
|
11
|
+
export { StopCommandLineRunnerError };
|
package/lib/error.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var errors = require('@tinkoff/errors');
|
|
6
|
+
|
|
7
|
+
class StopCommandLineRunnerError extends errors.SilentError {
|
|
8
|
+
constructor() {
|
|
9
|
+
super('Prevent CommandLineRunner from execution');
|
|
10
|
+
this.name = StopCommandLineRunnerError.errorName;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
StopCommandLineRunnerError.errorName = 'StopCommandLineRunnerError';
|
|
14
|
+
|
|
15
|
+
exports.StopCommandLineRunnerError = StopCommandLineRunnerError;
|