@tramvai/module-router 6.68.6 → 6.77.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,5 +8,5 @@ export { generateForRoot, routerForRoot } from './modules/utils/forRoot.browser.
8
8
  export { RouterStore, setCurrentNavigation, setUrlOnRehydrate } from './stores/RouterStore.browser.js';
9
9
  export { PageErrorStore, setPageErrorEvent } from './stores/PageErrorStore.browser.js';
10
10
  export { usePageService } from './hooks/usePageService.browser.js';
11
- export { ROUTER_VIEW_TRANSITIONS_ENABLED, afterNavigateHooksToken, afterUpdateCurrentHooksToken, beforeNavigateHooksToken, beforeResolveHooksToken, beforeUpdateCurrentHooksToken, onChangeHooksToken, routeTransformToken, routerBundleInfoAdditionalToken } from './modules/tokens.browser.js';
11
+ export { PRERENDER_HOOKS_TOKEN, ROUTER_VIEW_TRANSITIONS_ENABLED, afterNavigateHooksToken, afterUpdateCurrentHooksToken, beforeNavigateHooksToken, beforeResolveHooksToken, beforeUpdateCurrentHooksToken, onChangeHooksToken, routeTransformToken, routerBundleInfoAdditionalToken } from './modules/tokens.browser.js';
12
12
  export { deserializeError, serializeError } from '@tramvai/safe-strings';
package/lib/index.d.ts CHANGED
@@ -7,7 +7,7 @@ export { routerForRoot, generateForRoot } from './modules/utils/forRoot';
7
7
  export * from './stores/RouterStore';
8
8
  export * from './stores/PageErrorStore';
9
9
  export * from './hooks/usePageService';
10
- export { onChangeHooksToken, beforeNavigateHooksToken, afterNavigateHooksToken, beforeResolveHooksToken, beforeUpdateCurrentHooksToken, afterUpdateCurrentHooksToken, routerBundleInfoAdditionalToken, routeTransformToken, ROUTER_VIEW_TRANSITIONS_ENABLED, } from './modules/tokens';
10
+ export { onChangeHooksToken, beforeNavigateHooksToken, afterNavigateHooksToken, beforeResolveHooksToken, beforeUpdateCurrentHooksToken, afterUpdateCurrentHooksToken, routerBundleInfoAdditionalToken, routeTransformToken, ROUTER_VIEW_TRANSITIONS_ENABLED, PRERENDER_HOOKS_TOKEN, } from './modules/tokens';
11
11
  declare module '@tinkoff/router' {
12
12
  interface RouteConfig {
13
13
  bundle?: string;
package/lib/index.es.js CHANGED
@@ -7,5 +7,5 @@ export { generateForRoot, routerForRoot } from './modules/utils/forRoot.es.js';
7
7
  export { RouterStore, setCurrentNavigation, setUrlOnRehydrate } from './stores/RouterStore.es.js';
8
8
  export { PageErrorStore, setPageErrorEvent } from './stores/PageErrorStore.es.js';
9
9
  export { usePageService } from './hooks/usePageService.es.js';
10
- export { ROUTER_VIEW_TRANSITIONS_ENABLED, afterNavigateHooksToken, afterUpdateCurrentHooksToken, beforeNavigateHooksToken, beforeResolveHooksToken, beforeUpdateCurrentHooksToken, onChangeHooksToken, routeTransformToken, routerBundleInfoAdditionalToken } from './modules/tokens.es.js';
10
+ export { PRERENDER_HOOKS_TOKEN, ROUTER_VIEW_TRANSITIONS_ENABLED, afterNavigateHooksToken, afterUpdateCurrentHooksToken, beforeNavigateHooksToken, beforeResolveHooksToken, beforeUpdateCurrentHooksToken, onChangeHooksToken, routeTransformToken, routerBundleInfoAdditionalToken } from './modules/tokens.es.js';
11
11
  export { deserializeError, serializeError } from '@tramvai/safe-strings';
package/lib/index.js CHANGED
@@ -55,6 +55,7 @@ exports.setUrlOnRehydrate = RouterStore.setUrlOnRehydrate;
55
55
  exports.PageErrorStore = PageErrorStore.PageErrorStore;
56
56
  exports.setPageErrorEvent = PageErrorStore.setPageErrorEvent;
57
57
  exports.usePageService = usePageService.usePageService;
58
+ exports.PRERENDER_HOOKS_TOKEN = tokens.PRERENDER_HOOKS_TOKEN;
58
59
  exports.ROUTER_VIEW_TRANSITIONS_ENABLED = tokens.ROUTER_VIEW_TRANSITIONS_ENABLED;
59
60
  exports.afterNavigateHooksToken = tokens.afterNavigateHooksToken;
60
61
  exports.afterUpdateCurrentHooksToken = tokens.afterUpdateCurrentHooksToken;
@@ -4,7 +4,7 @@ import { setLogger } from '@tinkoff/router';
4
4
  import { LOGGER_TOKEN, COMBINE_REDUCERS } from '@tramvai/tokens-common';
5
5
  import { ROUTER_TOKEN, ROUTES_TOKEN, ROUTE_RESOLVE_TOKEN, ROUTER_PLUGIN, ROUTER_GUARD_TOKEN, ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN } from '@tramvai/tokens-router';
6
6
  import { RENDER_SLOTS, ResourceType, ResourceSlot } from '@tramvai/tokens-render';
7
- import { ROUTER_VIEW_TRANSITIONS_ENABLED, routerClassToken, additionalRouterParameters, routeTransformToken, onChangeHooksToken, beforeResolveHooksToken, beforeNavigateHooksToken, afterNavigateHooksToken, beforeUpdateCurrentHooksToken, afterUpdateCurrentHooksToken } from './tokens.browser.js';
7
+ import { ROUTER_VIEW_TRANSITIONS_ENABLED, routerClassToken, additionalRouterParameters, routeTransformToken, BACK_NAVIGATION_WITHIN_ROUTE_TYPE, onChangeHooksToken, beforeResolveHooksToken, beforeNavigateHooksToken, afterNavigateHooksToken, beforeUpdateCurrentHooksToken, afterUpdateCurrentHooksToken } from './tokens.browser.js';
8
8
  import { RouterStore } from '../stores/RouterStore.browser.js';
9
9
  import { commonGuards } from './guards/common/index.browser.js';
10
10
  import { commonHooks } from './hooks/common/index.browser.js';
@@ -22,12 +22,13 @@ const providers = [
22
22
  }),
23
23
  provide({
24
24
  provide: ROUTER_TOKEN,
25
- useFactory: ({ RouterClass, routes, routeTransform, routeResolve, additionalParameters, plugins, viewTransitionsEnabled, }) => {
25
+ useFactory: ({ RouterClass, routes, routeTransform, routeResolve, additionalParameters, plugins, viewTransitionsEnabled, backNavigationWithinRouteType, }) => {
26
26
  const router = new RouterClass({
27
27
  ...additionalParameters,
28
28
  trailingSlash: true,
29
29
  mergeSlashes: true,
30
30
  enableViewTransitions: process.env.__TRAMVAI_VIEW_TRANSITIONS === 'true' && viewTransitionsEnabled,
31
+ backNavigationWithinRouteType,
31
32
  routes: flatten(routes ?? []).map(routeTransform),
32
33
  plugins,
33
34
  });
@@ -63,6 +64,10 @@ const providers = [
63
64
  },
64
65
  plugins: optional(ROUTER_PLUGIN),
65
66
  viewTransitionsEnabled: ROUTER_VIEW_TRANSITIONS_ENABLED,
67
+ backNavigationWithinRouteType: {
68
+ token: BACK_NAVIGATION_WITHIN_ROUTE_TYPE,
69
+ optional: true,
70
+ },
66
71
  },
67
72
  }),
68
73
  provide({
@@ -4,7 +4,7 @@ import { setLogger } from '@tinkoff/router';
4
4
  import { LOGGER_TOKEN, COMBINE_REDUCERS } from '@tramvai/tokens-common';
5
5
  import { ROUTER_TOKEN, ROUTES_TOKEN, ROUTE_RESOLVE_TOKEN, ROUTER_PLUGIN, ROUTER_GUARD_TOKEN, ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN } from '@tramvai/tokens-router';
6
6
  import { RENDER_SLOTS, ResourceType, ResourceSlot } from '@tramvai/tokens-render';
7
- import { ROUTER_VIEW_TRANSITIONS_ENABLED, routerClassToken, additionalRouterParameters, routeTransformToken, onChangeHooksToken, beforeResolveHooksToken, beforeNavigateHooksToken, afterNavigateHooksToken, beforeUpdateCurrentHooksToken, afterUpdateCurrentHooksToken } from './tokens.es.js';
7
+ import { ROUTER_VIEW_TRANSITIONS_ENABLED, routerClassToken, additionalRouterParameters, routeTransformToken, BACK_NAVIGATION_WITHIN_ROUTE_TYPE, onChangeHooksToken, beforeResolveHooksToken, beforeNavigateHooksToken, afterNavigateHooksToken, beforeUpdateCurrentHooksToken, afterUpdateCurrentHooksToken } from './tokens.es.js';
8
8
  import { RouterStore } from '../stores/RouterStore.es.js';
9
9
  import { commonGuards } from './guards/common/index.es.js';
10
10
  import { commonHooks } from './hooks/common/index.es.js';
@@ -22,12 +22,13 @@ const providers = [
22
22
  }),
23
23
  provide({
24
24
  provide: ROUTER_TOKEN,
25
- useFactory: ({ RouterClass, routes, routeTransform, routeResolve, additionalParameters, plugins, viewTransitionsEnabled, }) => {
25
+ useFactory: ({ RouterClass, routes, routeTransform, routeResolve, additionalParameters, plugins, viewTransitionsEnabled, backNavigationWithinRouteType, }) => {
26
26
  const router = new RouterClass({
27
27
  ...additionalParameters,
28
28
  trailingSlash: true,
29
29
  mergeSlashes: true,
30
30
  enableViewTransitions: process.env.__TRAMVAI_VIEW_TRANSITIONS === 'true' && viewTransitionsEnabled,
31
+ backNavigationWithinRouteType,
31
32
  routes: flatten(routes ?? []).map(routeTransform),
32
33
  plugins,
33
34
  });
@@ -63,6 +64,10 @@ const providers = [
63
64
  },
64
65
  plugins: optional(ROUTER_PLUGIN),
65
66
  viewTransitionsEnabled: ROUTER_VIEW_TRANSITIONS_ENABLED,
67
+ backNavigationWithinRouteType: {
68
+ token: BACK_NAVIGATION_WITHIN_ROUTE_TYPE,
69
+ optional: true,
70
+ },
66
71
  },
67
72
  }),
68
73
  provide({
@@ -30,12 +30,13 @@ const providers = [
30
30
  }),
31
31
  core.provide({
32
32
  provide: tokensRouter.ROUTER_TOKEN,
33
- useFactory: ({ RouterClass, routes, routeTransform, routeResolve, additionalParameters, plugins, viewTransitionsEnabled, }) => {
33
+ useFactory: ({ RouterClass, routes, routeTransform, routeResolve, additionalParameters, plugins, viewTransitionsEnabled, backNavigationWithinRouteType, }) => {
34
34
  const router = new RouterClass({
35
35
  ...additionalParameters,
36
36
  trailingSlash: true,
37
37
  mergeSlashes: true,
38
38
  enableViewTransitions: process.env.__TRAMVAI_VIEW_TRANSITIONS === 'true' && viewTransitionsEnabled,
39
+ backNavigationWithinRouteType,
39
40
  routes: flatten__default["default"](routes ?? []).map(routeTransform),
40
41
  plugins,
41
42
  });
@@ -71,6 +72,10 @@ const providers = [
71
72
  },
72
73
  plugins: core.optional(tokensRouter.ROUTER_PLUGIN),
73
74
  viewTransitionsEnabled: tokens.ROUTER_VIEW_TRANSITIONS_ENABLED,
75
+ backNavigationWithinRouteType: {
76
+ token: tokens.BACK_NAVIGATION_WITHIN_ROUTE_TYPE,
77
+ optional: true,
78
+ },
74
79
  },
75
80
  }),
76
81
  core.provide({
@@ -1,2 +1,15 @@
1
+ import { ROUTES_TOKEN } from '@tramvai/tokens-router';
2
+ import { Route } from '@tinkoff/router';
3
+ import { ExtractDependencyType } from '@tinkoff/dippy';
4
+ import { routeTransformToken } from '../../tokens';
5
+ import { routerBundleInfoAdditionalToken } from '../../tokens';
6
+ export declare const deduplicateArray: <T>(list: T[]) => T[];
7
+ export declare const resolveRoutes: ({ getAdditionalRoutes, routes, routeTransform, }: {
8
+ routes: ExtractDependencyType<typeof ROUTES_TOKEN>;
9
+ routeTransform: ExtractDependencyType<typeof routeTransformToken>;
10
+ getAdditionalRoutes?: ExtractDependencyType<typeof routerBundleInfoAdditionalToken>;
11
+ }) => Promise<Route[]>;
12
+ export declare const bundleInfoExtendedPapi: import("@tramvai/papi").Papi;
1
13
  export declare const bundleInfoPapi: import("@tramvai/papi").Papi;
14
+ export declare const prerenderRoutesPapi: import("@tramvai/papi").Papi;
2
15
  //# sourceMappingURL=bundleInfo.d.ts.map
@@ -3,23 +3,49 @@ import prop from '@tinkoff/utils/object/prop';
3
3
  import { createPapiMethod } from '@tramvai/papi';
4
4
  import { ROUTES_TOKEN } from '@tramvai/tokens-router';
5
5
  import { isWildcard, isHistoryFallback } from '@tinkoff/router';
6
- import { routeTransformToken, routerBundleInfoAdditionalToken } from '../../tokens.es.js';
6
+ import { routeTransformToken, routerBundleInfoAdditionalToken, PRERENDER_HOOKS_TOKEN } from '../../tokens.es.js';
7
7
 
8
8
  const deduplicateArray = (list) => {
9
9
  return Array.from(new Set(list));
10
10
  };
11
+ const resolveRoutes = async ({ getAdditionalRoutes, routes, routeTransform, }) => {
12
+ const loadAdditional = getAdditionalRoutes ?? (() => []);
13
+ const additionalRoutes = (await loadAdditional()) ?? [];
14
+ return flatten(routes || [])
15
+ .concat(additionalRoutes)
16
+ .map(routeTransform)
17
+ .filter((route) => !isWildcard(route.path) && !isHistoryFallback(route.path));
18
+ };
19
+ const bundleInfoExtendedPapi = createPapiMethod({
20
+ method: 'get',
21
+ path: '/bundleInfoExtended',
22
+ async handler() {
23
+ const routesList = await resolveRoutes(this.deps);
24
+ return routesList.sort((a, b) => {
25
+ if (a.path < b.path) {
26
+ return -1;
27
+ }
28
+ if (a.path > b.path) {
29
+ return 1;
30
+ }
31
+ return 0;
32
+ });
33
+ },
34
+ deps: {
35
+ routes: {
36
+ token: ROUTES_TOKEN,
37
+ optional: true,
38
+ },
39
+ routeTransform: routeTransformToken,
40
+ getAdditionalRoutes: { token: routerBundleInfoAdditionalToken, optional: true },
41
+ },
42
+ });
11
43
  const bundleInfoPapi = createPapiMethod({
12
44
  method: 'get',
13
45
  path: '/bundleInfo',
14
46
  async handler() {
15
- const { getAdditionalRoutes, routes, routeTransform } = this.deps;
16
- const loadAdditional = getAdditionalRoutes ?? (() => []);
17
- return deduplicateArray(flatten(routes || [])
18
- .concat((await loadAdditional()) ?? [])
19
- .map(routeTransform)
20
- .map(prop('path'))
21
- .filter((path) => !isWildcard(path) && !isHistoryFallback(path))
22
- .sort());
47
+ const routesList = await resolveRoutes(this.deps);
48
+ return deduplicateArray(routesList.map(prop('path'))).sort();
23
49
  },
24
50
  deps: {
25
51
  routes: {
@@ -28,7 +54,20 @@ const bundleInfoPapi = createPapiMethod({
28
54
  },
29
55
  routeTransform: routeTransformToken,
30
56
  getAdditionalRoutes: { token: routerBundleInfoAdditionalToken, optional: true },
57
+ hooks: PRERENDER_HOOKS_TOKEN,
58
+ },
59
+ });
60
+ const prerenderRoutesPapi = createPapiMethod({
61
+ method: 'get',
62
+ path: '/prerenderRoutes',
63
+ async handler() {
64
+ const routesList = [];
65
+ await this.deps.hooks['prerender:routes'].callPromise(routesList);
66
+ return routesList;
67
+ },
68
+ deps: {
69
+ hooks: PRERENDER_HOOKS_TOKEN,
31
70
  },
32
71
  });
33
72
 
34
- export { bundleInfoPapi };
73
+ export { bundleInfoExtendedPapi, bundleInfoPapi, deduplicateArray, prerenderRoutesPapi, resolveRoutes };
@@ -17,18 +17,44 @@ var prop__default = /*#__PURE__*/_interopDefaultLegacy(prop);
17
17
  const deduplicateArray = (list) => {
18
18
  return Array.from(new Set(list));
19
19
  };
20
+ const resolveRoutes = async ({ getAdditionalRoutes, routes, routeTransform, }) => {
21
+ const loadAdditional = getAdditionalRoutes ?? (() => []);
22
+ const additionalRoutes = (await loadAdditional()) ?? [];
23
+ return flatten__default["default"](routes || [])
24
+ .concat(additionalRoutes)
25
+ .map(routeTransform)
26
+ .filter((route) => !router.isWildcard(route.path) && !router.isHistoryFallback(route.path));
27
+ };
28
+ const bundleInfoExtendedPapi = papi.createPapiMethod({
29
+ method: 'get',
30
+ path: '/bundleInfoExtended',
31
+ async handler() {
32
+ const routesList = await resolveRoutes(this.deps);
33
+ return routesList.sort((a, b) => {
34
+ if (a.path < b.path) {
35
+ return -1;
36
+ }
37
+ if (a.path > b.path) {
38
+ return 1;
39
+ }
40
+ return 0;
41
+ });
42
+ },
43
+ deps: {
44
+ routes: {
45
+ token: tokensRouter.ROUTES_TOKEN,
46
+ optional: true,
47
+ },
48
+ routeTransform: tokens.routeTransformToken,
49
+ getAdditionalRoutes: { token: tokens.routerBundleInfoAdditionalToken, optional: true },
50
+ },
51
+ });
20
52
  const bundleInfoPapi = papi.createPapiMethod({
21
53
  method: 'get',
22
54
  path: '/bundleInfo',
23
55
  async handler() {
24
- const { getAdditionalRoutes, routes, routeTransform } = this.deps;
25
- const loadAdditional = getAdditionalRoutes ?? (() => []);
26
- return deduplicateArray(flatten__default["default"](routes || [])
27
- .concat((await loadAdditional()) ?? [])
28
- .map(routeTransform)
29
- .map(prop__default["default"]('path'))
30
- .filter((path) => !router.isWildcard(path) && !router.isHistoryFallback(path))
31
- .sort());
56
+ const routesList = await resolveRoutes(this.deps);
57
+ return deduplicateArray(routesList.map(prop__default["default"]('path'))).sort();
32
58
  },
33
59
  deps: {
34
60
  routes: {
@@ -37,7 +63,24 @@ const bundleInfoPapi = papi.createPapiMethod({
37
63
  },
38
64
  routeTransform: tokens.routeTransformToken,
39
65
  getAdditionalRoutes: { token: tokens.routerBundleInfoAdditionalToken, optional: true },
66
+ hooks: tokens.PRERENDER_HOOKS_TOKEN,
67
+ },
68
+ });
69
+ const prerenderRoutesPapi = papi.createPapiMethod({
70
+ method: 'get',
71
+ path: '/prerenderRoutes',
72
+ async handler() {
73
+ const routesList = [];
74
+ await this.deps.hooks['prerender:routes'].callPromise(routesList);
75
+ return routesList;
76
+ },
77
+ deps: {
78
+ hooks: tokens.PRERENDER_HOOKS_TOKEN,
40
79
  },
41
80
  });
42
81
 
82
+ exports.bundleInfoExtendedPapi = bundleInfoExtendedPapi;
43
83
  exports.bundleInfoPapi = bundleInfoPapi;
84
+ exports.deduplicateArray = deduplicateArray;
85
+ exports.prerenderRoutesPapi = prerenderRoutesPapi;
86
+ exports.resolveRoutes = resolveRoutes;
@@ -1,3 +1,8 @@
1
- import { type Provider } from '@tramvai/core';
1
+ import { DI_TOKEN, ExtractDependencyType, type Provider } from '@tramvai/core';
2
+ declare module '@tramvai/tokens-common' {
3
+ interface AsyncLocalStorageState {
4
+ tramvaiRequestDi?: ExtractDependencyType<typeof DI_TOKEN>;
5
+ }
6
+ }
2
7
  export declare const serverTokens: Provider[];
3
8
  //# sourceMappingURL=index.d.ts.map
@@ -1,11 +1,15 @@
1
- import { Scope } from '@tramvai/core';
2
- import { REQUEST_MANAGER_TOKEN, RESPONSE_MANAGER_TOKEN } from '@tramvai/tokens-common';
1
+ import prop from '@tinkoff/utils/object/prop';
2
+ import { Scope, provide, TAPABLE_HOOK_FACTORY_TOKEN, commandLineListTokens, optional } from '@tramvai/core';
3
+ import { REQUEST_MANAGER_TOKEN, RESPONSE_MANAGER_TOKEN, ASYNC_LOCAL_STORAGE_TOKEN } from '@tramvai/tokens-common';
3
4
  import { SERVER_MODULE_PAPI_PUBLIC_ROUTE } from '@tramvai/tokens-server';
4
- import { additionalRouterParameters } from '../../tokens.es.js';
5
+ import { ROUTES_TOKEN, ROUTER_TOKEN } from '@tramvai/tokens-router';
6
+ import { HttpError, makeErrorSilent } from '@tinkoff/errors';
7
+ import { additionalRouterParameters, PRERENDER_HOOKS_TOKEN, routerBundleInfoAdditionalToken, routeTransformToken } from '../../tokens.es.js';
5
8
  import { routerOptions } from './routerOptions.es.js';
6
- import { bundleInfoPapi } from './bundleInfo.es.js';
9
+ import { bundleInfoPapi, bundleInfoExtendedPapi, prerenderRoutesPapi, resolveRoutes, deduplicateArray } from './bundleInfo.es.js';
7
10
  import { prefetchProviders } from './prefetch.es.js';
8
11
 
12
+ const DYNAMIC_PAGE_REGEX = /\/:.+\//g;
9
13
  const serverTokens = [
10
14
  {
11
15
  provide: additionalRouterParameters,
@@ -21,6 +25,79 @@ const serverTokens = [
21
25
  multi: true,
22
26
  useValue: bundleInfoPapi,
23
27
  },
28
+ {
29
+ provide: SERVER_MODULE_PAPI_PUBLIC_ROUTE,
30
+ scope: Scope.SINGLETON,
31
+ multi: true,
32
+ useValue: bundleInfoExtendedPapi,
33
+ },
34
+ {
35
+ provide: SERVER_MODULE_PAPI_PUBLIC_ROUTE,
36
+ scope: Scope.SINGLETON,
37
+ multi: true,
38
+ useValue: prerenderRoutesPapi,
39
+ },
40
+ provide({
41
+ provide: PRERENDER_HOOKS_TOKEN,
42
+ scope: Scope.SINGLETON,
43
+ useFactory: ({ hooksFactory }) => ({
44
+ 'prerender:routes': hooksFactory.createAsyncParallel('prerender:routes'),
45
+ 'prerender:generate': hooksFactory.createAsync('prerender:generate'),
46
+ }),
47
+ deps: {
48
+ hooksFactory: TAPABLE_HOOK_FACTORY_TOKEN,
49
+ },
50
+ }),
51
+ provide({
52
+ provide: commandLineListTokens.init,
53
+ useFactory: ({ hooks, storage }) => {
54
+ return function registerPrerenderRoutesHook() {
55
+ hooks['prerender:routes'].tapPromise('RouterPrerenderPlugin', async (_, routes) => {
56
+ const di = storage.getStore()?.tramvaiRequestDi;
57
+ if (di) {
58
+ // we need to resolve request scope provider from child di container,
59
+ // `tramvaiRequestDi` will be available in papi handlers
60
+ const paths = await resolveRoutes({
61
+ routes: di.get(optional(ROUTES_TOKEN)),
62
+ getAdditionalRoutes: di.get(optional(routerBundleInfoAdditionalToken)),
63
+ routeTransform: di.get(routeTransformToken),
64
+ });
65
+ routes.push(...deduplicateArray(paths.map(prop('path')).filter((path) => !DYNAMIC_PAGE_REGEX.test(path))).sort());
66
+ }
67
+ });
68
+ };
69
+ },
70
+ deps: {
71
+ hooks: PRERENDER_HOOKS_TOKEN,
72
+ storage: ASYNC_LOCAL_STORAGE_TOKEN,
73
+ },
74
+ }),
75
+ provide({
76
+ provide: commandLineListTokens.resolvePageDeps,
77
+ useFactory: ({ router, requestManager, responseManager, hooks }) => {
78
+ return async function callPrerenderGenerateHook() {
79
+ if (requestManager.getHeader('x-tramvai-prerender') === 'true') {
80
+ const route = { ...router.getCurrentRoute(), prerenderSkip: false };
81
+ await hooks['prerender:generate'].callPromise(route);
82
+ if (route.prerenderSkip) {
83
+ responseManager.setHeader('x-tramvai-prerender-skip', 'true');
84
+ const error = new HttpError({
85
+ url: requestManager.getUrl(),
86
+ message: `Prerendering for route "${route.path}" was skipped`,
87
+ });
88
+ makeErrorSilent(error);
89
+ throw error;
90
+ }
91
+ }
92
+ };
93
+ },
94
+ deps: {
95
+ router: ROUTER_TOKEN,
96
+ requestManager: REQUEST_MANAGER_TOKEN,
97
+ responseManager: RESPONSE_MANAGER_TOKEN,
98
+ hooks: PRERENDER_HOOKS_TOKEN,
99
+ },
100
+ }),
24
101
  ...prefetchProviders,
25
102
  ];
26
103
 
@@ -2,14 +2,22 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ var prop = require('@tinkoff/utils/object/prop');
5
6
  var core = require('@tramvai/core');
6
7
  var tokensCommon = require('@tramvai/tokens-common');
7
8
  var tokensServer = require('@tramvai/tokens-server');
9
+ var tokensRouter = require('@tramvai/tokens-router');
10
+ var errors = require('@tinkoff/errors');
8
11
  var tokens = require('../../tokens.js');
9
12
  var routerOptions = require('./routerOptions.js');
10
13
  var bundleInfo = require('./bundleInfo.js');
11
14
  var prefetch = require('./prefetch.js');
12
15
 
16
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
17
+
18
+ var prop__default = /*#__PURE__*/_interopDefaultLegacy(prop);
19
+
20
+ const DYNAMIC_PAGE_REGEX = /\/:.+\//g;
13
21
  const serverTokens = [
14
22
  {
15
23
  provide: tokens.additionalRouterParameters,
@@ -25,6 +33,79 @@ const serverTokens = [
25
33
  multi: true,
26
34
  useValue: bundleInfo.bundleInfoPapi,
27
35
  },
36
+ {
37
+ provide: tokensServer.SERVER_MODULE_PAPI_PUBLIC_ROUTE,
38
+ scope: core.Scope.SINGLETON,
39
+ multi: true,
40
+ useValue: bundleInfo.bundleInfoExtendedPapi,
41
+ },
42
+ {
43
+ provide: tokensServer.SERVER_MODULE_PAPI_PUBLIC_ROUTE,
44
+ scope: core.Scope.SINGLETON,
45
+ multi: true,
46
+ useValue: bundleInfo.prerenderRoutesPapi,
47
+ },
48
+ core.provide({
49
+ provide: tokens.PRERENDER_HOOKS_TOKEN,
50
+ scope: core.Scope.SINGLETON,
51
+ useFactory: ({ hooksFactory }) => ({
52
+ 'prerender:routes': hooksFactory.createAsyncParallel('prerender:routes'),
53
+ 'prerender:generate': hooksFactory.createAsync('prerender:generate'),
54
+ }),
55
+ deps: {
56
+ hooksFactory: core.TAPABLE_HOOK_FACTORY_TOKEN,
57
+ },
58
+ }),
59
+ core.provide({
60
+ provide: core.commandLineListTokens.init,
61
+ useFactory: ({ hooks, storage }) => {
62
+ return function registerPrerenderRoutesHook() {
63
+ hooks['prerender:routes'].tapPromise('RouterPrerenderPlugin', async (_, routes) => {
64
+ const di = storage.getStore()?.tramvaiRequestDi;
65
+ if (di) {
66
+ // we need to resolve request scope provider from child di container,
67
+ // `tramvaiRequestDi` will be available in papi handlers
68
+ const paths = await bundleInfo.resolveRoutes({
69
+ routes: di.get(core.optional(tokensRouter.ROUTES_TOKEN)),
70
+ getAdditionalRoutes: di.get(core.optional(tokens.routerBundleInfoAdditionalToken)),
71
+ routeTransform: di.get(tokens.routeTransformToken),
72
+ });
73
+ routes.push(...bundleInfo.deduplicateArray(paths.map(prop__default["default"]('path')).filter((path) => !DYNAMIC_PAGE_REGEX.test(path))).sort());
74
+ }
75
+ });
76
+ };
77
+ },
78
+ deps: {
79
+ hooks: tokens.PRERENDER_HOOKS_TOKEN,
80
+ storage: tokensCommon.ASYNC_LOCAL_STORAGE_TOKEN,
81
+ },
82
+ }),
83
+ core.provide({
84
+ provide: core.commandLineListTokens.resolvePageDeps,
85
+ useFactory: ({ router, requestManager, responseManager, hooks }) => {
86
+ return async function callPrerenderGenerateHook() {
87
+ if (requestManager.getHeader('x-tramvai-prerender') === 'true') {
88
+ const route = { ...router.getCurrentRoute(), prerenderSkip: false };
89
+ await hooks['prerender:generate'].callPromise(route);
90
+ if (route.prerenderSkip) {
91
+ responseManager.setHeader('x-tramvai-prerender-skip', 'true');
92
+ const error = new errors.HttpError({
93
+ url: requestManager.getUrl(),
94
+ message: `Prerendering for route "${route.path}" was skipped`,
95
+ });
96
+ errors.makeErrorSilent(error);
97
+ throw error;
98
+ }
99
+ }
100
+ };
101
+ },
102
+ deps: {
103
+ router: tokensRouter.ROUTER_TOKEN,
104
+ requestManager: tokensCommon.REQUEST_MANAGER_TOKEN,
105
+ responseManager: tokensCommon.RESPONSE_MANAGER_TOKEN,
106
+ hooks: tokens.PRERENDER_HOOKS_TOKEN,
107
+ },
108
+ }),
28
109
  ...prefetch.prefetchProviders,
29
110
  ];
30
111
 
@@ -1,4 +1,4 @@
1
- import { createToken } from '@tinkoff/dippy';
1
+ import { createToken, Scope } from '@tinkoff/dippy';
2
2
 
3
3
  const routerClassToken = createToken('router routerClassToken');
4
4
  const additionalRouterParameters = createToken('router additionalParameters');
@@ -17,7 +17,11 @@ const afterNavigateHooksToken = createToken('router afterNavigateHooks', {
17
17
  const beforeUpdateCurrentHooksToken = createToken('router beforeUpdateCurrentHooks', { multi: true });
18
18
  const afterUpdateCurrentHooksToken = createToken('router afterUpdateCurrentHooks', { multi: true });
19
19
  const routeTransformToken = createToken('router finalRouteTransform');
20
- const routerBundleInfoAdditionalToken = createToken('router bundleInfoAdditional');
20
+ const routerBundleInfoAdditionalToken = createToken('router bundleInfoAdditional', { scope: Scope.REQUEST });
21
21
  const ROUTER_VIEW_TRANSITIONS_ENABLED = createToken('router viewTransitionsEnabled');
22
+ const BACK_NAVIGATION_WITHIN_ROUTE_TYPE = createToken('router backNavigationWithinRouteType');
23
+ const PRERENDER_HOOKS_TOKEN = createToken('tramvai prerender hooks', {
24
+ scope: Scope.SINGLETON,
25
+ });
22
26
 
23
- export { ROUTER_VIEW_TRANSITIONS_ENABLED, additionalRouterParameters, afterNavigateHooksToken, afterUpdateCurrentHooksToken, beforeNavigateHooksToken, beforeResolveHooksToken, beforeUpdateCurrentHooksToken, onChangeHooksToken, routeTransformToken, routerBundleInfoAdditionalToken, routerClassToken };
27
+ export { BACK_NAVIGATION_WITHIN_ROUTE_TYPE, PRERENDER_HOOKS_TOKEN, ROUTER_VIEW_TRANSITIONS_ENABLED, additionalRouterParameters, afterNavigateHooksToken, afterUpdateCurrentHooksToken, beforeNavigateHooksToken, beforeResolveHooksToken, beforeUpdateCurrentHooksToken, onChangeHooksToken, routeTransformToken, routerBundleInfoAdditionalToken, routerClassToken };
@@ -1,4 +1,5 @@
1
- import type { NavigationHook, AbstractRouter, NavigationSyncHook, Route } from '@tinkoff/router';
1
+ import { AsyncParallelTapableHookInstance, AsyncTapableHookInstance } from '@tinkoff/hook-runner';
2
+ import type { NavigationHook, AbstractRouter, NavigationSyncHook, Route, BackNavigationType, NavigationRoute } from '@tinkoff/router';
2
3
  import type { RouteTransform } from '@tramvai/tokens-router';
3
4
  export declare const routerClassToken: (new (args_0: import("@tinkoff/router").Options) => AbstractRouter) & {
4
5
  __type?: "base token";
@@ -35,4 +36,20 @@ export declare const ROUTER_VIEW_TRANSITIONS_ENABLED: (false & {
35
36
  }) | (true & {
36
37
  __type?: "base token";
37
38
  });
39
+ export declare const BACK_NAVIGATION_WITHIN_ROUTE_TYPE: (BackNavigationType.CURRENT_TYPE & {
40
+ __type?: "base token";
41
+ }) | (BackNavigationType.PREFER_UPDATE & {
42
+ __type?: "base token";
43
+ }) | (BackNavigationType.PREVIOUS_TYPE & {
44
+ __type?: "base token";
45
+ });
46
+ export type PrerenderHooksToken = {
47
+ 'prerender:routes': AsyncParallelTapableHookInstance<string[]>;
48
+ 'prerender:generate': AsyncTapableHookInstance<NavigationRoute & {
49
+ prerenderSkip?: boolean;
50
+ }>;
51
+ };
52
+ export declare const PRERENDER_HOOKS_TOKEN: PrerenderHooksToken & {
53
+ __type?: "base token";
54
+ };
38
55
  //# sourceMappingURL=tokens.d.ts.map
@@ -1,4 +1,4 @@
1
- import { createToken } from '@tinkoff/dippy';
1
+ import { createToken, Scope } from '@tinkoff/dippy';
2
2
 
3
3
  const routerClassToken = createToken('router routerClassToken');
4
4
  const additionalRouterParameters = createToken('router additionalParameters');
@@ -17,7 +17,11 @@ const afterNavigateHooksToken = createToken('router afterNavigateHooks', {
17
17
  const beforeUpdateCurrentHooksToken = createToken('router beforeUpdateCurrentHooks', { multi: true });
18
18
  const afterUpdateCurrentHooksToken = createToken('router afterUpdateCurrentHooks', { multi: true });
19
19
  const routeTransformToken = createToken('router finalRouteTransform');
20
- const routerBundleInfoAdditionalToken = createToken('router bundleInfoAdditional');
20
+ const routerBundleInfoAdditionalToken = createToken('router bundleInfoAdditional', { scope: Scope.REQUEST });
21
21
  const ROUTER_VIEW_TRANSITIONS_ENABLED = createToken('router viewTransitionsEnabled');
22
+ const BACK_NAVIGATION_WITHIN_ROUTE_TYPE = createToken('router backNavigationWithinRouteType');
23
+ const PRERENDER_HOOKS_TOKEN = createToken('tramvai prerender hooks', {
24
+ scope: Scope.SINGLETON,
25
+ });
22
26
 
23
- export { ROUTER_VIEW_TRANSITIONS_ENABLED, additionalRouterParameters, afterNavigateHooksToken, afterUpdateCurrentHooksToken, beforeNavigateHooksToken, beforeResolveHooksToken, beforeUpdateCurrentHooksToken, onChangeHooksToken, routeTransformToken, routerBundleInfoAdditionalToken, routerClassToken };
27
+ export { BACK_NAVIGATION_WITHIN_ROUTE_TYPE, PRERENDER_HOOKS_TOKEN, ROUTER_VIEW_TRANSITIONS_ENABLED, additionalRouterParameters, afterNavigateHooksToken, afterUpdateCurrentHooksToken, beforeNavigateHooksToken, beforeResolveHooksToken, beforeUpdateCurrentHooksToken, onChangeHooksToken, routeTransformToken, routerBundleInfoAdditionalToken, routerClassToken };
@@ -21,9 +21,15 @@ const afterNavigateHooksToken = dippy.createToken('router afterNavigateHooks', {
21
21
  const beforeUpdateCurrentHooksToken = dippy.createToken('router beforeUpdateCurrentHooks', { multi: true });
22
22
  const afterUpdateCurrentHooksToken = dippy.createToken('router afterUpdateCurrentHooks', { multi: true });
23
23
  const routeTransformToken = dippy.createToken('router finalRouteTransform');
24
- const routerBundleInfoAdditionalToken = dippy.createToken('router bundleInfoAdditional');
24
+ const routerBundleInfoAdditionalToken = dippy.createToken('router bundleInfoAdditional', { scope: dippy.Scope.REQUEST });
25
25
  const ROUTER_VIEW_TRANSITIONS_ENABLED = dippy.createToken('router viewTransitionsEnabled');
26
+ const BACK_NAVIGATION_WITHIN_ROUTE_TYPE = dippy.createToken('router backNavigationWithinRouteType');
27
+ const PRERENDER_HOOKS_TOKEN = dippy.createToken('tramvai prerender hooks', {
28
+ scope: dippy.Scope.SINGLETON,
29
+ });
26
30
 
31
+ exports.BACK_NAVIGATION_WITHIN_ROUTE_TYPE = BACK_NAVIGATION_WITHIN_ROUTE_TYPE;
32
+ exports.PRERENDER_HOOKS_TOKEN = PRERENDER_HOOKS_TOKEN;
27
33
  exports.ROUTER_VIEW_TRANSITIONS_ENABLED = ROUTER_VIEW_TRANSITIONS_ENABLED;
28
34
  exports.additionalRouterParameters = additionalRouterParameters;
29
35
  exports.afterNavigateHooksToken = afterNavigateHooksToken;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/module-router",
3
- "version": "6.68.6",
3
+ "version": "6.77.2",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "browser": {
@@ -25,29 +25,30 @@
25
25
  "watch": "tsc -w"
26
26
  },
27
27
  "dependencies": {
28
- "@tinkoff/errors": "0.7.1",
29
- "@tinkoff/router": "0.6.124",
30
- "@tinkoff/url": "0.12.1",
31
- "@tramvai/experiments": "6.68.6",
32
- "@tramvai/react": "6.68.6",
33
- "@tramvai/safe-strings": "0.9.0",
34
- "@tramvai/tokens-child-app": "6.68.6",
35
- "@tramvai/tokens-render": "6.68.6",
36
- "@tramvai/tokens-router": "6.68.6",
37
- "@tramvai/tokens-server": "6.68.6"
28
+ "@tinkoff/errors": "0.7.2",
29
+ "@tinkoff/hook-runner": "0.8.2",
30
+ "@tinkoff/router": "0.6.152",
31
+ "@tinkoff/url": "0.12.2",
32
+ "@tramvai/experiments": "6.77.2",
33
+ "@tramvai/react": "6.77.2",
34
+ "@tramvai/safe-strings": "0.9.1",
35
+ "@tramvai/tokens-child-app": "6.77.2",
36
+ "@tramvai/tokens-render": "6.77.2",
37
+ "@tramvai/tokens-router": "6.77.2",
38
+ "@tramvai/tokens-server": "6.77.2"
38
39
  },
39
40
  "peerDependencies": {
40
- "@tinkoff/dippy": "0.12.3",
41
+ "@tinkoff/dippy": "0.12.6",
41
42
  "@tinkoff/utils": "^2.1.2",
42
- "@tramvai/cli": "6.68.6",
43
- "@tramvai/core": "6.68.6",
44
- "@tramvai/module-log": "6.68.6",
45
- "@tramvai/module-server": "6.68.6",
46
- "@tramvai/papi": "6.68.6",
47
- "@tramvai/state": "6.68.6",
48
- "@tramvai/test-helpers": "6.68.6",
49
- "@tramvai/test-mocks": "6.68.6",
50
- "@tramvai/tokens-common": "6.68.6",
43
+ "@tramvai/cli": "6.77.2",
44
+ "@tramvai/core": "6.77.2",
45
+ "@tramvai/module-log": "6.77.2",
46
+ "@tramvai/module-server": "6.77.2",
47
+ "@tramvai/papi": "6.77.2",
48
+ "@tramvai/state": "6.77.2",
49
+ "@tramvai/test-helpers": "6.77.2",
50
+ "@tramvai/test-mocks": "6.77.2",
51
+ "@tramvai/tokens-common": "6.77.2",
51
52
  "react": "*",
52
53
  "tslib": "^2.4.0"
53
54
  },