@tramvai/module-router 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/components/link.browser.js +55 -0
- package/lib/components/link.es.js +49 -0
- package/lib/components/link.js +53 -0
- package/lib/hooks/usePageService.browser.js +10 -0
- package/lib/hooks/usePageService.es.js +10 -0
- package/lib/hooks/usePageService.js +14 -0
- package/lib/hooks/usePrefetch.browser.browser.js +42 -0
- package/lib/index.browser.js +7 -906
- package/lib/index.es.js +6 -764
- package/lib/index.js +34 -788
- package/lib/modules/child-app.browser.js +31 -0
- package/lib/modules/child-app.es.js +31 -0
- package/lib/modules/child-app.js +33 -0
- package/lib/modules/clientCommon.browser.js +70 -0
- package/lib/modules/common.browser.js +137 -0
- package/lib/modules/common.es.js +137 -0
- package/lib/modules/common.js +145 -0
- package/lib/modules/fileSystemPages.browser.js +27 -0
- package/lib/modules/fileSystemPages.es.js +27 -0
- package/lib/modules/fileSystemPages.js +31 -0
- package/lib/modules/guards/common/index.browser.js +32 -0
- package/lib/modules/guards/common/index.es.js +32 -0
- package/lib/modules/guards/common/index.js +36 -0
- package/lib/modules/guards/common/internalError.browser.js +14 -0
- package/lib/modules/guards/common/internalError.es.js +14 -0
- package/lib/modules/guards/common/internalError.js +18 -0
- package/lib/modules/guards/common/loadBundle.browser.js +67 -0
- package/lib/modules/guards/common/loadBundle.es.js +67 -0
- package/lib/modules/guards/common/loadBundle.js +75 -0
- package/lib/modules/guards/server/httpMethod.es.js +20 -0
- package/lib/modules/guards/server/httpMethod.js +24 -0
- package/lib/modules/guards/server/index.es.js +18 -0
- package/lib/modules/guards/server/index.js +22 -0
- package/lib/modules/hooks/common/fillRouterStore.browser.js +9 -0
- package/lib/modules/hooks/common/fillRouterStore.es.js +9 -0
- package/lib/modules/hooks/common/fillRouterStore.js +13 -0
- package/lib/modules/hooks/common/index.browser.js +16 -0
- package/lib/modules/hooks/common/index.es.js +16 -0
- package/lib/modules/hooks/common/index.js +20 -0
- package/lib/modules/hooks/runActions.browser.js +34 -0
- package/lib/modules/hooks/runActions.es.js +34 -0
- package/lib/modules/hooks/runActions.js +42 -0
- package/lib/modules/hooks/server/httpStatus.es.js +7 -0
- package/lib/modules/hooks/server/httpStatus.js +11 -0
- package/lib/modules/hooks/server/index.es.js +17 -0
- package/lib/modules/hooks/server/index.js +21 -0
- package/lib/modules/hooks/spa/index.browser.js +70 -0
- package/lib/modules/hooks/spa/runCommands.browser.js +12 -0
- package/lib/modules/no-spa.browser.js +21 -0
- package/lib/modules/server.es.js +59 -0
- package/lib/modules/server.js +63 -0
- package/lib/modules/spa.browser.js +23 -0
- package/lib/modules/tokens/browser/index.browser.js +5 -0
- package/lib/modules/tokens/browser/prefetch.browser.js +112 -0
- package/lib/modules/tokens/common/index.browser.js +40 -0
- package/lib/modules/tokens/common/index.es.js +40 -0
- package/lib/modules/tokens/common/index.js +44 -0
- package/lib/modules/tokens/common/render.browser.js +14 -0
- package/lib/modules/tokens/common/render.es.js +14 -0
- package/lib/modules/tokens/common/render.js +18 -0
- package/lib/modules/tokens/common/routeNormalize.browser.js +10 -0
- package/lib/modules/tokens/common/routeNormalize.es.js +10 -0
- package/lib/modules/tokens/common/routeNormalize.js +18 -0
- package/lib/modules/tokens/common/routeSetDefaults.browser.js +13 -0
- package/lib/modules/tokens/common/routeSetDefaults.es.js +13 -0
- package/lib/modules/tokens/common/routeSetDefaults.js +17 -0
- package/lib/modules/tokens/common/routeTransform.browser.js +12 -0
- package/lib/modules/tokens/common/routeTransform.es.js +12 -0
- package/lib/modules/tokens/common/routeTransform.js +22 -0
- package/lib/modules/tokens/server/bundleInfo.es.js +35 -0
- package/lib/modules/tokens/server/bundleInfo.js +44 -0
- package/lib/modules/tokens/server/index.es.js +25 -0
- package/lib/modules/tokens/server/index.js +29 -0
- package/lib/modules/tokens/server/prefetch.es.js +15 -0
- package/lib/modules/tokens/server/prefetch.js +19 -0
- package/lib/modules/tokens/server/routerOptions.es.js +37 -0
- package/lib/modules/tokens/server/routerOptions.js +41 -0
- package/lib/modules/tokens.browser.js +22 -0
- package/lib/modules/tokens.es.js +22 -0
- package/lib/modules/tokens.js +35 -0
- package/lib/modules/utils/forRoot.browser.js +22 -0
- package/lib/modules/utils/forRoot.es.js +22 -0
- package/lib/modules/utils/forRoot.js +26 -0
- package/lib/services/page.browser.js +63 -0
- package/lib/services/page.es.js +63 -0
- package/lib/services/page.js +67 -0
- package/lib/stores/RouterStore.browser.js +29 -0
- package/lib/stores/RouterStore.es.js +29 -0
- package/lib/stores/RouterStore.js +35 -0
- package/lib/utils/requestIdleCallback.browser.js +10 -0
- package/package.json +22 -23
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
const httpStatus = ({ responseManager }) => async ({ to }) => {
|
|
6
|
+
if (to === null || to === void 0 ? void 0 : to.config.httpStatus) {
|
|
7
|
+
responseManager.setStatus(to.config.httpStatus);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
exports.httpStatus = httpStatus;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RESPONSE_MANAGER_TOKEN } from '@tramvai/tokens-common';
|
|
2
|
+
import { afterNavigateHooksToken } from '../../tokens.es.js';
|
|
3
|
+
import { httpStatus } from './httpStatus.es.js';
|
|
4
|
+
|
|
5
|
+
const serverHooks = [
|
|
6
|
+
{
|
|
7
|
+
provide: afterNavigateHooksToken,
|
|
8
|
+
multi: true,
|
|
9
|
+
// проставляет httpStatus если задан в текущем роуте
|
|
10
|
+
useFactory: httpStatus,
|
|
11
|
+
deps: {
|
|
12
|
+
responseManager: RESPONSE_MANAGER_TOKEN,
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
export { serverHooks };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var tokensCommon = require('@tramvai/tokens-common');
|
|
6
|
+
var tokens = require('../../tokens.js');
|
|
7
|
+
var httpStatus = require('./httpStatus.js');
|
|
8
|
+
|
|
9
|
+
const serverHooks = [
|
|
10
|
+
{
|
|
11
|
+
provide: tokens.afterNavigateHooksToken,
|
|
12
|
+
multi: true,
|
|
13
|
+
// проставляет httpStatus если задан в текущем роуте
|
|
14
|
+
useFactory: httpStatus.httpStatus,
|
|
15
|
+
deps: {
|
|
16
|
+
responseManager: tokensCommon.RESPONSE_MANAGER_TOKEN,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
exports.serverHooks = serverHooks;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import noop from '@tinkoff/utils/function/noop';
|
|
2
|
+
import { DI_TOKEN, COMMAND_LINE_RUNNER_TOKEN, commandLineListTokens } from '@tramvai/core';
|
|
3
|
+
import { ROUTER_TOKEN, ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN } from '@tramvai/tokens-router';
|
|
4
|
+
import { STORE_TOKEN, ACTION_REGISTRY_TOKEN, ACTION_PAGE_RUNNER_TOKEN } from '@tramvai/tokens-common';
|
|
5
|
+
import { beforeNavigateHooksToken, afterNavigateHooksToken } from '../../tokens.browser.js';
|
|
6
|
+
import { runCommandsSpa, runCommandsAfterSpa } from './runCommands.browser.js';
|
|
7
|
+
import { runActionsFactory } from '../runActions.browser.js';
|
|
8
|
+
|
|
9
|
+
const spaHooks = [
|
|
10
|
+
{
|
|
11
|
+
provide: beforeNavigateHooksToken,
|
|
12
|
+
multi: true,
|
|
13
|
+
useFactory: runCommandsSpa,
|
|
14
|
+
deps: {
|
|
15
|
+
di: DI_TOKEN,
|
|
16
|
+
commandLineRunner: COMMAND_LINE_RUNNER_TOKEN,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
provide: afterNavigateHooksToken,
|
|
21
|
+
multi: true,
|
|
22
|
+
useFactory: runCommandsAfterSpa,
|
|
23
|
+
deps: {
|
|
24
|
+
di: DI_TOKEN,
|
|
25
|
+
commandLineRunner: COMMAND_LINE_RUNNER_TOKEN,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
provide: commandLineListTokens.spaTransition,
|
|
30
|
+
multi: true,
|
|
31
|
+
useFactory: ({ spaMode, ...deps }) => {
|
|
32
|
+
if (spaMode !== 'after') {
|
|
33
|
+
return runActionsFactory(deps);
|
|
34
|
+
}
|
|
35
|
+
return noop;
|
|
36
|
+
},
|
|
37
|
+
deps: {
|
|
38
|
+
store: STORE_TOKEN,
|
|
39
|
+
router: ROUTER_TOKEN,
|
|
40
|
+
actionRegistry: ACTION_REGISTRY_TOKEN,
|
|
41
|
+
actionPageRunner: ACTION_PAGE_RUNNER_TOKEN,
|
|
42
|
+
spaMode: {
|
|
43
|
+
token: ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
|
|
44
|
+
optional: true,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
provide: commandLineListTokens.afterSpaTransition,
|
|
50
|
+
multi: true,
|
|
51
|
+
useFactory: ({ spaMode, ...deps }) => {
|
|
52
|
+
if (spaMode === 'after') {
|
|
53
|
+
return runActionsFactory(deps);
|
|
54
|
+
}
|
|
55
|
+
return noop;
|
|
56
|
+
},
|
|
57
|
+
deps: {
|
|
58
|
+
store: STORE_TOKEN,
|
|
59
|
+
router: ROUTER_TOKEN,
|
|
60
|
+
actionRegistry: ACTION_REGISTRY_TOKEN,
|
|
61
|
+
actionPageRunner: ACTION_PAGE_RUNNER_TOKEN,
|
|
62
|
+
spaMode: {
|
|
63
|
+
token: ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
|
|
64
|
+
optional: true,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
export { spaHooks };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const runCommandsSpa = ({ commandLineRunner, di, }) => {
|
|
2
|
+
return async () => {
|
|
3
|
+
await commandLineRunner.run('client', 'spa', [], di);
|
|
4
|
+
};
|
|
5
|
+
};
|
|
6
|
+
const runCommandsAfterSpa = ({ commandLineRunner, di, }) => {
|
|
7
|
+
return async () => {
|
|
8
|
+
await commandLineRunner.run('client', 'afterSpa', [], di);
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { runCommandsAfterSpa, runCommandsSpa };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Module } from '@tramvai/core';
|
|
2
|
+
import { NoSpaRouter } from '@tinkoff/router';
|
|
3
|
+
import { providers } from './clientCommon.browser.js';
|
|
4
|
+
import { generateForRoot } from './utils/forRoot.browser.js';
|
|
5
|
+
import { routerClassToken } from './tokens.browser.js';
|
|
6
|
+
|
|
7
|
+
var _a;
|
|
8
|
+
const NoSpaRouterModule = /* @__PURE__ */ Module({
|
|
9
|
+
providers: [
|
|
10
|
+
...providers,
|
|
11
|
+
{
|
|
12
|
+
provide: routerClassToken,
|
|
13
|
+
useValue: NoSpaRouter,
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
})((_a = class NoSpaRouterModule {
|
|
17
|
+
},
|
|
18
|
+
_a.forRoot = generateForRoot(_a),
|
|
19
|
+
_a));
|
|
20
|
+
|
|
21
|
+
export { NoSpaRouterModule };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { __decorate } from 'tslib';
|
|
2
|
+
import { Module, commandLineListTokens } from '@tramvai/core';
|
|
3
|
+
import { Router } from '@tinkoff/router';
|
|
4
|
+
import { REQUEST_MANAGER_TOKEN, STORE_TOKEN, ACTION_REGISTRY_TOKEN, ACTION_PAGE_RUNNER_TOKEN } from '@tramvai/tokens-common';
|
|
5
|
+
import { ROUTER_TOKEN } from '@tramvai/tokens-router';
|
|
6
|
+
import { providers } from './common.es.js';
|
|
7
|
+
import { routerClassToken } from './tokens.es.js';
|
|
8
|
+
import { serverGuards } from './guards/server/index.es.js';
|
|
9
|
+
import { runActionsFactory } from './hooks/runActions.es.js';
|
|
10
|
+
import { serverHooks } from './hooks/server/index.es.js';
|
|
11
|
+
import { serverTokens } from './tokens/server/index.es.js';
|
|
12
|
+
import { generateForRoot } from './utils/forRoot.es.js';
|
|
13
|
+
|
|
14
|
+
var NoSpaRouterModule_1;
|
|
15
|
+
let NoSpaRouterModule = NoSpaRouterModule_1 = class NoSpaRouterModule {
|
|
16
|
+
};
|
|
17
|
+
NoSpaRouterModule.forRoot = generateForRoot(NoSpaRouterModule_1);
|
|
18
|
+
NoSpaRouterModule = NoSpaRouterModule_1 = __decorate([
|
|
19
|
+
Module({
|
|
20
|
+
providers: [
|
|
21
|
+
...providers,
|
|
22
|
+
...serverGuards,
|
|
23
|
+
...serverHooks,
|
|
24
|
+
...serverTokens,
|
|
25
|
+
{
|
|
26
|
+
provide: routerClassToken,
|
|
27
|
+
useValue: Router,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
provide: commandLineListTokens.resolveUserDeps,
|
|
31
|
+
multi: true,
|
|
32
|
+
useFactory: ({ router, requestManager }) => {
|
|
33
|
+
return function routerInit() {
|
|
34
|
+
return router.navigate(requestManager.getUrl());
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
deps: {
|
|
38
|
+
router: ROUTER_TOKEN,
|
|
39
|
+
requestManager: REQUEST_MANAGER_TOKEN,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
// запускаем экшены отдельно от самого роутинга, чтобы распараллелить задачи
|
|
44
|
+
provide: commandLineListTokens.resolvePageDeps,
|
|
45
|
+
multi: true,
|
|
46
|
+
useFactory: runActionsFactory,
|
|
47
|
+
deps: {
|
|
48
|
+
store: STORE_TOKEN,
|
|
49
|
+
router: ROUTER_TOKEN,
|
|
50
|
+
actionRegistry: ACTION_REGISTRY_TOKEN,
|
|
51
|
+
actionPageRunner: ACTION_PAGE_RUNNER_TOKEN,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
})
|
|
56
|
+
], NoSpaRouterModule);
|
|
57
|
+
const SpaRouterModule = NoSpaRouterModule;
|
|
58
|
+
|
|
59
|
+
export { NoSpaRouterModule, SpaRouterModule };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var tslib = require('tslib');
|
|
6
|
+
var core = require('@tramvai/core');
|
|
7
|
+
var router = require('@tinkoff/router');
|
|
8
|
+
var tokensCommon = require('@tramvai/tokens-common');
|
|
9
|
+
var tokensRouter = require('@tramvai/tokens-router');
|
|
10
|
+
var common = require('./common.js');
|
|
11
|
+
var tokens = require('./tokens.js');
|
|
12
|
+
var index = require('./guards/server/index.js');
|
|
13
|
+
var runActions = require('./hooks/runActions.js');
|
|
14
|
+
var index$1 = require('./hooks/server/index.js');
|
|
15
|
+
var index$2 = require('./tokens/server/index.js');
|
|
16
|
+
var forRoot = require('./utils/forRoot.js');
|
|
17
|
+
|
|
18
|
+
var NoSpaRouterModule_1;
|
|
19
|
+
exports.NoSpaRouterModule = NoSpaRouterModule_1 = class NoSpaRouterModule {
|
|
20
|
+
};
|
|
21
|
+
exports.NoSpaRouterModule.forRoot = forRoot.generateForRoot(NoSpaRouterModule_1);
|
|
22
|
+
exports.NoSpaRouterModule = NoSpaRouterModule_1 = tslib.__decorate([
|
|
23
|
+
core.Module({
|
|
24
|
+
providers: [
|
|
25
|
+
...common.providers,
|
|
26
|
+
...index.serverGuards,
|
|
27
|
+
...index$1.serverHooks,
|
|
28
|
+
...index$2.serverTokens,
|
|
29
|
+
{
|
|
30
|
+
provide: tokens.routerClassToken,
|
|
31
|
+
useValue: router.Router,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
provide: core.commandLineListTokens.resolveUserDeps,
|
|
35
|
+
multi: true,
|
|
36
|
+
useFactory: ({ router, requestManager }) => {
|
|
37
|
+
return function routerInit() {
|
|
38
|
+
return router.navigate(requestManager.getUrl());
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
deps: {
|
|
42
|
+
router: tokensRouter.ROUTER_TOKEN,
|
|
43
|
+
requestManager: tokensCommon.REQUEST_MANAGER_TOKEN,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
// запускаем экшены отдельно от самого роутинга, чтобы распараллелить задачи
|
|
48
|
+
provide: core.commandLineListTokens.resolvePageDeps,
|
|
49
|
+
multi: true,
|
|
50
|
+
useFactory: runActions.runActionsFactory,
|
|
51
|
+
deps: {
|
|
52
|
+
store: tokensCommon.STORE_TOKEN,
|
|
53
|
+
router: tokensRouter.ROUTER_TOKEN,
|
|
54
|
+
actionRegistry: tokensCommon.ACTION_REGISTRY_TOKEN,
|
|
55
|
+
actionPageRunner: tokensCommon.ACTION_PAGE_RUNNER_TOKEN,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
})
|
|
60
|
+
], exports.NoSpaRouterModule);
|
|
61
|
+
const SpaRouterModule = exports.NoSpaRouterModule;
|
|
62
|
+
|
|
63
|
+
exports.SpaRouterModule = SpaRouterModule;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Module } from '@tramvai/core';
|
|
2
|
+
import { Router } from '@tinkoff/router';
|
|
3
|
+
import { providers } from './clientCommon.browser.js';
|
|
4
|
+
import { routerClassToken } from './tokens.browser.js';
|
|
5
|
+
import { spaHooks } from './hooks/spa/index.browser.js';
|
|
6
|
+
import { generateForRoot } from './utils/forRoot.browser.js';
|
|
7
|
+
|
|
8
|
+
var _a;
|
|
9
|
+
const SpaRouterModule = /* @__PURE__ */ Module({
|
|
10
|
+
providers: [
|
|
11
|
+
...providers,
|
|
12
|
+
...spaHooks,
|
|
13
|
+
{
|
|
14
|
+
provide: routerClassToken,
|
|
15
|
+
useValue: Router,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
})((_a = class SpaRouterModule {
|
|
19
|
+
},
|
|
20
|
+
_a.forRoot = generateForRoot(_a),
|
|
21
|
+
_a));
|
|
22
|
+
|
|
23
|
+
export { SpaRouterModule };
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { createToken, provide } from '@tramvai/core';
|
|
2
|
+
import { COMPONENT_REGISTRY_TOKEN, BUNDLE_MANAGER_TOKEN, LOGGER_TOKEN } from '@tramvai/tokens-common';
|
|
3
|
+
import { LINK_PREFETCH_MANAGER_TOKEN, ROUTER_TOKEN, ROUTE_RESOLVE_TOKEN } from '@tramvai/tokens-router';
|
|
4
|
+
import { addQuery } from '@tinkoff/url';
|
|
5
|
+
import { resolveLazyComponent } from '@tramvai/react';
|
|
6
|
+
import { isFileSystemPageComponent } from '@tramvai/experiments';
|
|
7
|
+
import { routeTransformToken } from '../../tokens.browser.js';
|
|
8
|
+
|
|
9
|
+
const PREFETCHED_LINKS_CACHE_TOKEN = createToken();
|
|
10
|
+
const PREFETCHED_LINKS_QUEUE_TOKEN = createToken();
|
|
11
|
+
const prefetchProviders = [
|
|
12
|
+
provide({
|
|
13
|
+
provide: PREFETCHED_LINKS_CACHE_TOKEN,
|
|
14
|
+
useValue: new Set(),
|
|
15
|
+
}),
|
|
16
|
+
provide({
|
|
17
|
+
provide: PREFETCHED_LINKS_QUEUE_TOKEN,
|
|
18
|
+
useFactory: () => {
|
|
19
|
+
let queue = Promise.resolve();
|
|
20
|
+
return {
|
|
21
|
+
add(run) {
|
|
22
|
+
queue = queue.then(run);
|
|
23
|
+
return queue;
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
}),
|
|
28
|
+
provide({
|
|
29
|
+
provide: LINK_PREFETCH_MANAGER_TOKEN,
|
|
30
|
+
useFactory: ({ router, routeTransform, routeResolve, componentRegistry, bundleManager, logger, prefetchedLinksCache, prefetchedLinksQueue, }) => {
|
|
31
|
+
const log = logger('link-prefetch-manager');
|
|
32
|
+
const prefetch = async (url) => {
|
|
33
|
+
// prefetch needed for cache assets by browser, so we want to prefetch resources for any page only once.
|
|
34
|
+
// cache will work only for SPA-router, but anyway resources loading deduplication logic already included in @loadable
|
|
35
|
+
if (prefetchedLinksCache.has(url)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
prefetchedLinksCache.add(url);
|
|
39
|
+
log.info({ event: 'prefetch-route-init', url });
|
|
40
|
+
// first, try to find static or resolved dynamic route
|
|
41
|
+
let route = router.resolve(url);
|
|
42
|
+
// if route not found, try to resolve dynamic route,
|
|
43
|
+
// logic from `ROUTER_TOKEN` provider factory, without `router.addRoute` method call
|
|
44
|
+
if (!route && routeResolve) {
|
|
45
|
+
// add query `prefetchRoute` to indicate to any `routeResolve` implementation
|
|
46
|
+
// that this route request no need to be cached or have any personalization
|
|
47
|
+
const parsedUrl = addQuery(url, { prefetchRoute: 'true' });
|
|
48
|
+
route = await routeResolve({
|
|
49
|
+
url: parsedUrl,
|
|
50
|
+
type: 'navigate',
|
|
51
|
+
});
|
|
52
|
+
if (route) {
|
|
53
|
+
route = routeTransform(route);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!route) {
|
|
57
|
+
log.info({ event: 'prefetch-route-not-found', url });
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// @todo: очередь запросов!
|
|
61
|
+
// get name of everything what we need to prefetch,
|
|
62
|
+
// @loadable will load all scripts and styles for us
|
|
63
|
+
const { config: { pageComponent, bundle, nestedLayoutComponent }, } = route;
|
|
64
|
+
const promises = [];
|
|
65
|
+
// no need for bundle and page component actions amd reducers initialization,
|
|
66
|
+
// so copy only part of `modules/guards/common/loadBundle.ts` logic,
|
|
67
|
+
// all relative assets will be fetched
|
|
68
|
+
if (bundleManager.has(bundle, pageComponent)) {
|
|
69
|
+
promises.push(bundleManager.get(bundle, pageComponent));
|
|
70
|
+
}
|
|
71
|
+
// no need for nestedLayoutComponent actions amd reducers initialization,
|
|
72
|
+
// so copy only part of `modules/guards/common/loadBundle.ts` logic,
|
|
73
|
+
// all relative assets will be fetched
|
|
74
|
+
if (nestedLayoutComponent) {
|
|
75
|
+
promises.push(resolveLazyComponent(componentRegistry.get(nestedLayoutComponent, isFileSystemPageComponent(pageComponent) ? '__default' : bundle)));
|
|
76
|
+
}
|
|
77
|
+
await Promise.all(promises)
|
|
78
|
+
.then(() => {
|
|
79
|
+
log.info({ event: 'prefetch-route-success', url });
|
|
80
|
+
})
|
|
81
|
+
.catch((error) => {
|
|
82
|
+
log.warn({
|
|
83
|
+
event: 'prefetch-fail',
|
|
84
|
+
url,
|
|
85
|
+
error,
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
prefetch: (url) => {
|
|
91
|
+
// fetch assets sequentially
|
|
92
|
+
return prefetchedLinksQueue.add(() => prefetch(url));
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
},
|
|
96
|
+
deps: {
|
|
97
|
+
router: ROUTER_TOKEN,
|
|
98
|
+
routeTransform: routeTransformToken,
|
|
99
|
+
routeResolve: {
|
|
100
|
+
token: ROUTE_RESOLVE_TOKEN,
|
|
101
|
+
optional: true,
|
|
102
|
+
},
|
|
103
|
+
componentRegistry: COMPONENT_REGISTRY_TOKEN,
|
|
104
|
+
bundleManager: BUNDLE_MANAGER_TOKEN,
|
|
105
|
+
logger: LOGGER_TOKEN,
|
|
106
|
+
prefetchedLinksCache: PREFETCHED_LINKS_CACHE_TOKEN,
|
|
107
|
+
prefetchedLinksQueue: PREFETCHED_LINKS_QUEUE_TOKEN,
|
|
108
|
+
},
|
|
109
|
+
}),
|
|
110
|
+
];
|
|
111
|
+
|
|
112
|
+
export { prefetchProviders };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ROUTE_TRANSFORM_TOKEN, ROUTER_TOKEN } from '@tramvai/tokens-router';
|
|
2
|
+
import { EXTEND_RENDER } from '@tramvai/tokens-render';
|
|
3
|
+
import { routeTransformToken } from '../../tokens.browser.js';
|
|
4
|
+
import { routeTransform } from './routeTransform.browser.js';
|
|
5
|
+
import { routeSetDefaults } from './routeSetDefaults.browser.js';
|
|
6
|
+
import { routeNormalize } from './routeNormalize.browser.js';
|
|
7
|
+
import { provideRouter } from './render.browser.js';
|
|
8
|
+
|
|
9
|
+
const commonTokens = [
|
|
10
|
+
{
|
|
11
|
+
provide: routeTransformToken,
|
|
12
|
+
useFactory: routeTransform,
|
|
13
|
+
deps: {
|
|
14
|
+
transformers: {
|
|
15
|
+
token: ROUTE_TRANSFORM_TOKEN,
|
|
16
|
+
optional: true,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
provide: ROUTE_TRANSFORM_TOKEN,
|
|
22
|
+
multi: true,
|
|
23
|
+
useValue: routeSetDefaults,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
provide: ROUTE_TRANSFORM_TOKEN,
|
|
27
|
+
multi: true,
|
|
28
|
+
useValue: routeNormalize,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
provide: EXTEND_RENDER,
|
|
32
|
+
multi: true,
|
|
33
|
+
useFactory: provideRouter,
|
|
34
|
+
deps: {
|
|
35
|
+
router: ROUTER_TOKEN,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
export { commonTokens };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ROUTE_TRANSFORM_TOKEN, ROUTER_TOKEN } from '@tramvai/tokens-router';
|
|
2
|
+
import { EXTEND_RENDER } from '@tramvai/tokens-render';
|
|
3
|
+
import { routeTransformToken } from '../../tokens.es.js';
|
|
4
|
+
import { routeTransform } from './routeTransform.es.js';
|
|
5
|
+
import { routeSetDefaults } from './routeSetDefaults.es.js';
|
|
6
|
+
import { routeNormalize } from './routeNormalize.es.js';
|
|
7
|
+
import { provideRouter } from './render.es.js';
|
|
8
|
+
|
|
9
|
+
const commonTokens = [
|
|
10
|
+
{
|
|
11
|
+
provide: routeTransformToken,
|
|
12
|
+
useFactory: routeTransform,
|
|
13
|
+
deps: {
|
|
14
|
+
transformers: {
|
|
15
|
+
token: ROUTE_TRANSFORM_TOKEN,
|
|
16
|
+
optional: true,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
provide: ROUTE_TRANSFORM_TOKEN,
|
|
22
|
+
multi: true,
|
|
23
|
+
useValue: routeSetDefaults,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
provide: ROUTE_TRANSFORM_TOKEN,
|
|
27
|
+
multi: true,
|
|
28
|
+
useValue: routeNormalize,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
provide: EXTEND_RENDER,
|
|
32
|
+
multi: true,
|
|
33
|
+
useFactory: provideRouter,
|
|
34
|
+
deps: {
|
|
35
|
+
router: ROUTER_TOKEN,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
export { commonTokens };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var tokensRouter = require('@tramvai/tokens-router');
|
|
6
|
+
var tokensRender = require('@tramvai/tokens-render');
|
|
7
|
+
var tokens = require('../../tokens.js');
|
|
8
|
+
var routeTransform = require('./routeTransform.js');
|
|
9
|
+
var routeSetDefaults = require('./routeSetDefaults.js');
|
|
10
|
+
var routeNormalize = require('./routeNormalize.js');
|
|
11
|
+
var render = require('./render.js');
|
|
12
|
+
|
|
13
|
+
const commonTokens = [
|
|
14
|
+
{
|
|
15
|
+
provide: tokens.routeTransformToken,
|
|
16
|
+
useFactory: routeTransform.routeTransform,
|
|
17
|
+
deps: {
|
|
18
|
+
transformers: {
|
|
19
|
+
token: tokensRouter.ROUTE_TRANSFORM_TOKEN,
|
|
20
|
+
optional: true,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
provide: tokensRouter.ROUTE_TRANSFORM_TOKEN,
|
|
26
|
+
multi: true,
|
|
27
|
+
useValue: routeSetDefaults.routeSetDefaults,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
provide: tokensRouter.ROUTE_TRANSFORM_TOKEN,
|
|
31
|
+
multi: true,
|
|
32
|
+
useValue: routeNormalize.routeNormalize,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
provide: tokensRender.EXTEND_RENDER,
|
|
36
|
+
multi: true,
|
|
37
|
+
useFactory: render.provideRouter,
|
|
38
|
+
deps: {
|
|
39
|
+
router: tokensRouter.ROUTER_TOKEN,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
exports.commonTokens = commonTokens;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Provider } from '@tinkoff/router';
|
|
3
|
+
|
|
4
|
+
const provideRouter = ({ router }) => {
|
|
5
|
+
const serverState = {
|
|
6
|
+
currentRoute: router.getCurrentRoute(),
|
|
7
|
+
currentUrl: router.getCurrentUrl(),
|
|
8
|
+
};
|
|
9
|
+
return (render) => {
|
|
10
|
+
return (jsx(Provider, { router: router, serverState: serverState, children: render }));
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { provideRouter };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Provider } from '@tinkoff/router';
|
|
3
|
+
|
|
4
|
+
const provideRouter = ({ router }) => {
|
|
5
|
+
const serverState = {
|
|
6
|
+
currentRoute: router.getCurrentRoute(),
|
|
7
|
+
currentUrl: router.getCurrentUrl(),
|
|
8
|
+
};
|
|
9
|
+
return (render) => {
|
|
10
|
+
return (jsx(Provider, { router: router, serverState: serverState, children: render }));
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { provideRouter };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var router = require('@tinkoff/router');
|
|
7
|
+
|
|
8
|
+
const provideRouter = ({ router: router$1 }) => {
|
|
9
|
+
const serverState = {
|
|
10
|
+
currentRoute: router$1.getCurrentRoute(),
|
|
11
|
+
currentUrl: router$1.getCurrentUrl(),
|
|
12
|
+
};
|
|
13
|
+
return (render) => {
|
|
14
|
+
return (jsxRuntime.jsx(router.Provider, { router: router$1, serverState: serverState, children: render }));
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
exports.provideRouter = provideRouter;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var replace = require('@tinkoff/utils/string/replace');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
8
|
+
|
|
9
|
+
var replace__default = /*#__PURE__*/_interopDefaultLegacy(replace);
|
|
10
|
+
|
|
11
|
+
const routeNormalize = (route) => {
|
|
12
|
+
return {
|
|
13
|
+
...route,
|
|
14
|
+
path: replace__default["default"](/\/?$/, '/', route.path),
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
exports.routeNormalize = routeNormalize;
|