@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.
Files changed (91) hide show
  1. package/lib/components/link.browser.js +55 -0
  2. package/lib/components/link.es.js +49 -0
  3. package/lib/components/link.js +53 -0
  4. package/lib/hooks/usePageService.browser.js +10 -0
  5. package/lib/hooks/usePageService.es.js +10 -0
  6. package/lib/hooks/usePageService.js +14 -0
  7. package/lib/hooks/usePrefetch.browser.browser.js +42 -0
  8. package/lib/index.browser.js +7 -906
  9. package/lib/index.es.js +6 -764
  10. package/lib/index.js +34 -788
  11. package/lib/modules/child-app.browser.js +31 -0
  12. package/lib/modules/child-app.es.js +31 -0
  13. package/lib/modules/child-app.js +33 -0
  14. package/lib/modules/clientCommon.browser.js +70 -0
  15. package/lib/modules/common.browser.js +137 -0
  16. package/lib/modules/common.es.js +137 -0
  17. package/lib/modules/common.js +145 -0
  18. package/lib/modules/fileSystemPages.browser.js +27 -0
  19. package/lib/modules/fileSystemPages.es.js +27 -0
  20. package/lib/modules/fileSystemPages.js +31 -0
  21. package/lib/modules/guards/common/index.browser.js +32 -0
  22. package/lib/modules/guards/common/index.es.js +32 -0
  23. package/lib/modules/guards/common/index.js +36 -0
  24. package/lib/modules/guards/common/internalError.browser.js +14 -0
  25. package/lib/modules/guards/common/internalError.es.js +14 -0
  26. package/lib/modules/guards/common/internalError.js +18 -0
  27. package/lib/modules/guards/common/loadBundle.browser.js +67 -0
  28. package/lib/modules/guards/common/loadBundle.es.js +67 -0
  29. package/lib/modules/guards/common/loadBundle.js +75 -0
  30. package/lib/modules/guards/server/httpMethod.es.js +20 -0
  31. package/lib/modules/guards/server/httpMethod.js +24 -0
  32. package/lib/modules/guards/server/index.es.js +18 -0
  33. package/lib/modules/guards/server/index.js +22 -0
  34. package/lib/modules/hooks/common/fillRouterStore.browser.js +9 -0
  35. package/lib/modules/hooks/common/fillRouterStore.es.js +9 -0
  36. package/lib/modules/hooks/common/fillRouterStore.js +13 -0
  37. package/lib/modules/hooks/common/index.browser.js +16 -0
  38. package/lib/modules/hooks/common/index.es.js +16 -0
  39. package/lib/modules/hooks/common/index.js +20 -0
  40. package/lib/modules/hooks/runActions.browser.js +34 -0
  41. package/lib/modules/hooks/runActions.es.js +34 -0
  42. package/lib/modules/hooks/runActions.js +42 -0
  43. package/lib/modules/hooks/server/httpStatus.es.js +7 -0
  44. package/lib/modules/hooks/server/httpStatus.js +11 -0
  45. package/lib/modules/hooks/server/index.es.js +17 -0
  46. package/lib/modules/hooks/server/index.js +21 -0
  47. package/lib/modules/hooks/spa/index.browser.js +70 -0
  48. package/lib/modules/hooks/spa/runCommands.browser.js +12 -0
  49. package/lib/modules/no-spa.browser.js +21 -0
  50. package/lib/modules/server.es.js +59 -0
  51. package/lib/modules/server.js +63 -0
  52. package/lib/modules/spa.browser.js +23 -0
  53. package/lib/modules/tokens/browser/index.browser.js +5 -0
  54. package/lib/modules/tokens/browser/prefetch.browser.js +112 -0
  55. package/lib/modules/tokens/common/index.browser.js +40 -0
  56. package/lib/modules/tokens/common/index.es.js +40 -0
  57. package/lib/modules/tokens/common/index.js +44 -0
  58. package/lib/modules/tokens/common/render.browser.js +14 -0
  59. package/lib/modules/tokens/common/render.es.js +14 -0
  60. package/lib/modules/tokens/common/render.js +18 -0
  61. package/lib/modules/tokens/common/routeNormalize.browser.js +10 -0
  62. package/lib/modules/tokens/common/routeNormalize.es.js +10 -0
  63. package/lib/modules/tokens/common/routeNormalize.js +18 -0
  64. package/lib/modules/tokens/common/routeSetDefaults.browser.js +13 -0
  65. package/lib/modules/tokens/common/routeSetDefaults.es.js +13 -0
  66. package/lib/modules/tokens/common/routeSetDefaults.js +17 -0
  67. package/lib/modules/tokens/common/routeTransform.browser.js +12 -0
  68. package/lib/modules/tokens/common/routeTransform.es.js +12 -0
  69. package/lib/modules/tokens/common/routeTransform.js +22 -0
  70. package/lib/modules/tokens/server/bundleInfo.es.js +35 -0
  71. package/lib/modules/tokens/server/bundleInfo.js +44 -0
  72. package/lib/modules/tokens/server/index.es.js +25 -0
  73. package/lib/modules/tokens/server/index.js +29 -0
  74. package/lib/modules/tokens/server/prefetch.es.js +15 -0
  75. package/lib/modules/tokens/server/prefetch.js +19 -0
  76. package/lib/modules/tokens/server/routerOptions.es.js +37 -0
  77. package/lib/modules/tokens/server/routerOptions.js +41 -0
  78. package/lib/modules/tokens.browser.js +22 -0
  79. package/lib/modules/tokens.es.js +22 -0
  80. package/lib/modules/tokens.js +35 -0
  81. package/lib/modules/utils/forRoot.browser.js +22 -0
  82. package/lib/modules/utils/forRoot.es.js +22 -0
  83. package/lib/modules/utils/forRoot.js +26 -0
  84. package/lib/services/page.browser.js +63 -0
  85. package/lib/services/page.es.js +63 -0
  86. package/lib/services/page.js +67 -0
  87. package/lib/stores/RouterStore.browser.js +29 -0
  88. package/lib/stores/RouterStore.es.js +29 -0
  89. package/lib/stores/RouterStore.js +35 -0
  90. package/lib/utils/requestIdleCallback.browser.js +10 -0
  91. package/package.json +22 -23
package/lib/index.js CHANGED
@@ -2,809 +2,55 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var tslib = require('tslib');
6
- var core = require('@tramvai/core');
5
+ var server = require('./modules/server.js');
6
+ var childApp = require('./modules/child-app.js');
7
7
  var router = require('@tinkoff/router');
8
- var tokensCommon = require('@tramvai/tokens-common');
8
+ var link = require('./components/link.js');
9
9
  var tokensRouter = require('@tramvai/tokens-router');
10
- var flatten = require('@tinkoff/utils/array/flatten');
11
- var dippy = require('@tinkoff/dippy');
12
- var state = require('@tramvai/state');
13
- var isArray = require('@tinkoff/utils/is/array');
14
- var react = require('@tramvai/react');
15
- var tokensRender = require('@tramvai/tokens-render');
16
- var identity = require('@tinkoff/utils/function/identity');
17
- var compose = require('@tinkoff/utils/function/compose');
18
- var replace = require('@tinkoff/utils/string/replace');
19
- var jsxRuntime = require('react/jsx-runtime');
20
- var experiments = require('@tramvai/experiments');
21
- var uniq = require('@tinkoff/utils/array/uniq');
22
- var errors = require('@tinkoff/errors');
23
- var tokensServer = require('@tramvai/tokens-server');
24
- var prop = require('@tinkoff/utils/object/prop');
25
- var papi = require('@tramvai/papi');
26
- var tokensChildApp = require('@tramvai/tokens-child-app');
27
- var react$1 = require('react');
10
+ var forRoot = require('./modules/utils/forRoot.js');
11
+ var RouterStore = require('./stores/RouterStore.js');
12
+ var usePageService = require('./hooks/usePageService.js');
28
13
 
29
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
30
14
 
31
- var flatten__default = /*#__PURE__*/_interopDefaultLegacy(flatten);
32
- var isArray__default = /*#__PURE__*/_interopDefaultLegacy(isArray);
33
- var identity__default = /*#__PURE__*/_interopDefaultLegacy(identity);
34
- var compose__default = /*#__PURE__*/_interopDefaultLegacy(compose);
35
- var replace__default = /*#__PURE__*/_interopDefaultLegacy(replace);
36
- var uniq__default = /*#__PURE__*/_interopDefaultLegacy(uniq);
37
- var prop__default = /*#__PURE__*/_interopDefaultLegacy(prop);
38
15
 
39
- const routerClassToken = dippy.createToken('router routerClassToken');
40
- const additionalRouterParameters = dippy.createToken('router additionalParameters');
41
- const onChangeHooksToken = dippy.createToken('router onChangeHooks', {
42
- multi: true,
16
+ Object.defineProperty(exports, 'NoSpaRouterModule', {
17
+ enumerable: true,
18
+ get: function () { return server.NoSpaRouterModule; }
43
19
  });
44
- const beforeResolveHooksToken = dippy.createToken('router beforeResolveHooks', {
45
- multi: true,
20
+ exports.SpaRouterModule = server.SpaRouterModule;
21
+ Object.defineProperty(exports, 'RouterChildAppModule', {
22
+ enumerable: true,
23
+ get: function () { return childApp.RouterChildAppModule; }
46
24
  });
47
- const beforeNavigateHooksToken = dippy.createToken('router beforeNavigateHooks', {
48
- multi: true,
49
- });
50
- const afterNavigateHooksToken = dippy.createToken('router afterNavigateHooks', {
51
- multi: true,
52
- });
53
- const beforeUpdateCurrentHooksToken = dippy.createToken('router beforeUpdateCurrentHooks', { multi: true });
54
- const afterUpdateCurrentHooksToken = dippy.createToken('router afterUpdateCurrentHooks', { multi: true });
55
- const routeTransformToken = dippy.createToken('router finalRouteTransform');
56
- const routerBundleInfoAdditionalToken = dippy.createToken('router bundleInfoAdditional');
57
-
58
- const setCurrentNavigation = state.createEvent('SET_CURRENT_ROUTE');
59
- const setUrlOnRehydrate = state.createEvent('SET_URL_ON_REHYDRATE');
60
- const initialState = {
61
- currentRoute: null,
62
- previousRoute: null,
63
- currentUrl: null,
64
- previousUrl: null,
65
- };
66
- const RouterStore = state.createReducer('router', initialState)
67
- .on(setCurrentNavigation, (state, { to, from, url, fromUrl, replace }) => {
68
- // TODO: убедиться что все данные нам нужны из роутинга,
69
- // возможно всякие meta, content не нужны при дегидрации
70
- return {
71
- currentRoute: to,
72
- previousRoute: replace ? state.previousRoute : from,
73
- currentUrl: url,
74
- previousUrl: replace ? state.previousUrl : fromUrl,
75
- };
76
- })
77
- .on(setUrlOnRehydrate, (state, url) => {
78
- return {
79
- ...state,
80
- currentUrl: url,
81
- };
82
- });
83
-
84
- const loadBundle = ({ bundleManager, logger, actionRegistry, responseManager, dispatcher, dispatcherContext, pageService, }) => {
85
- const log = logger('route:load-bundles');
86
- return async ({ to }) => {
87
- var _a;
88
- log.debug({
89
- event: 'load-bundle',
90
- route: to,
91
- });
92
- const { bundle, pageComponent, nestedLayoutComponent } = to.config;
93
- if (!bundleManager.has(bundle, pageComponent)) {
94
- log.info({
95
- event: 'load-bundle-not-found',
96
- bundle,
97
- pageComponent,
98
- });
99
- // если бандл не найден, то всё ок и мы должны вернуть 404 на сервере,
100
- // а на клиенте просто загрузить новую страницу
101
- responseManager.setStatus(404);
102
- return false;
103
- }
104
- // Пытаемся загрузить и в случае инициализации на клиенте, т.к.
105
- // несмотря на наличие бандла в разметке, все равно мы должны дождаться
106
- // его загрузки перед рендером
107
- try {
108
- const promises = [];
109
- // for file-system pages bundle is virtual, so it will be loaded in parallel with nested layout
110
- // for classic bundles, page component will be loaded after bundle loading
111
- promises.push(bundleManager.get(bundle, pageComponent));
112
- if (nestedLayoutComponent) {
113
- promises.push(react.resolveLazyComponent(pageService.resolveComponentFromConfig('nestedLayout')));
114
- }
115
- const [resolvedBundle, resolvedLayout] = await Promise.all(promises);
116
- const { components, reducers } = resolvedBundle;
117
- const component = components[pageComponent];
118
- // pageComponent should have required fields even if it is lazy,
119
- // thanks to `git log 9466cb32bfb71ba49144ef839d3d5bce246e213c -L90,103:packages/modules/common/src/bundleManager/bundleManager.ts`
120
- (_a = component === null || component === void 0 ? void 0 : component.reducers) === null || _a === void 0 ? void 0 : _a.forEach((reducer) => dispatcherContext.getStore(reducer));
121
- reducers === null || reducers === void 0 ? void 0 : reducers.forEach((reducer) => dispatcherContext.getStore(reducer));
122
- // @todo: reuse logic from bundleManager?
123
- // register nested layout actions and reducers for current page
124
- if (resolvedLayout) {
125
- if ('actions' in resolvedLayout && isArray__default["default"](resolvedLayout.actions)) {
126
- actionRegistry.add(pageComponent, resolvedLayout.actions);
127
- }
128
- if ('reducers' in resolvedLayout && isArray__default["default"](resolvedLayout.reducers)) {
129
- resolvedLayout.reducers.forEach((reducer) => {
130
- dispatcher.registerStore(reducer);
131
- dispatcherContext.getStore(reducer);
132
- });
133
- }
134
- }
135
- }
136
- catch (error) {
137
- log.error({
138
- event: 'load-bundle-failed',
139
- error,
140
- });
141
- // блокируем переход если не удалось загрузить бандл
142
- return false;
143
- }
144
- };
145
- };
146
-
147
- const internalError = ({ responseManager, logger, }) => {
148
- const log = logger('route:guard-check-error');
149
- return async () => {
150
- if (responseManager.getStatus() >= 500) {
151
- log.error({
152
- event: 'status-is-error',
153
- status: responseManager.getStatus(),
154
- });
155
- return false;
156
- }
157
- };
158
- };
159
-
160
- const commonGuards = [
161
- {
162
- provide: tokensRouter.ROUTER_GUARD_TOKEN,
163
- multi: true,
164
- useFactory: loadBundle,
165
- deps: {
166
- logger: tokensCommon.LOGGER_TOKEN,
167
- bundleManager: tokensCommon.BUNDLE_MANAGER_TOKEN,
168
- actionRegistry: tokensCommon.ACTION_REGISTRY_TOKEN,
169
- responseManager: tokensCommon.RESPONSE_MANAGER_TOKEN,
170
- dispatcher: tokensCommon.DISPATCHER_TOKEN,
171
- dispatcherContext: tokensCommon.DISPATCHER_CONTEXT_TOKEN,
172
- pageService: tokensRouter.PAGE_SERVICE_TOKEN,
173
- },
174
- },
175
- {
176
- provide: tokensRouter.ROUTER_GUARD_TOKEN,
177
- multi: true,
178
- useFactory: internalError,
179
- deps: {
180
- logger: tokensCommon.LOGGER_TOKEN,
181
- responseManager: tokensCommon.RESPONSE_MANAGER_TOKEN,
182
- },
183
- },
184
- ];
185
-
186
- const fillRouterStore = ({ context, }) => {
187
- return (navigation) => {
188
- context.dispatch(setCurrentNavigation(navigation));
189
- };
190
- };
191
-
192
- const commonHooks = [
193
- {
194
- provide: onChangeHooksToken,
195
- multi: true,
196
- useFactory: fillRouterStore,
197
- deps: {
198
- context: tokensCommon.CONTEXT_TOKEN,
199
- },
200
- },
201
- ];
202
-
203
- const routeTransform = ({ transformers, }) => {
204
- if (!transformers || transformers.length === 0) {
205
- return identity__default["default"];
206
- }
207
- return compose__default["default"](...flatten__default["default"](transformers));
208
- };
209
-
210
- const routeSetDefaults = (route) => {
211
- const config = {
212
- bundle: 'mainDefault',
213
- pageComponent: 'pageDefault',
214
- ...route.config,
215
- };
216
- return {
217
- ...route,
218
- config,
219
- };
220
- };
221
-
222
- const routeNormalize = (route) => {
223
- return {
224
- ...route,
225
- path: replace__default["default"](/\/?$/, '/', route.path),
226
- };
227
- };
228
-
229
- const provideRouter = ({ router: router$1 }) => {
230
- const serverState = {
231
- currentRoute: router$1.getCurrentRoute(),
232
- currentUrl: router$1.getCurrentUrl(),
233
- };
234
- return (render) => {
235
- return (jsxRuntime.jsx(router.Provider, { router: router$1, serverState: serverState, children: render }));
236
- };
237
- };
238
-
239
- const commonTokens = [
240
- {
241
- provide: routeTransformToken,
242
- useFactory: routeTransform,
243
- deps: {
244
- transformers: {
245
- token: tokensRouter.ROUTE_TRANSFORM_TOKEN,
246
- optional: true,
247
- },
248
- },
249
- },
250
- {
251
- provide: tokensRouter.ROUTE_TRANSFORM_TOKEN,
252
- multi: true,
253
- useValue: routeSetDefaults,
254
- },
255
- {
256
- provide: tokensRouter.ROUTE_TRANSFORM_TOKEN,
257
- multi: true,
258
- useValue: routeNormalize,
259
- },
260
- {
261
- provide: tokensRender.EXTEND_RENDER,
262
- multi: true,
263
- useFactory: provideRouter,
264
- deps: {
265
- router: tokensRouter.ROUTER_TOKEN,
266
- },
267
- },
268
- ];
269
-
270
- class PageService {
271
- constructor({ router, componentRegistry }) {
272
- this.router = router;
273
- this.componentRegistry = componentRegistry;
274
- }
275
- getCurrentRoute() {
276
- return this.router.getCurrentRoute();
277
- }
278
- getCurrentUrl() {
279
- return this.router.getCurrentUrl();
280
- }
281
- getConfig() {
282
- var _a, _b;
283
- return (_b = (_a = this.getCurrentRoute()) === null || _a === void 0 ? void 0 : _a.config) !== null && _b !== void 0 ? _b : {};
284
- }
285
- getContent() {
286
- var _a;
287
- return (_a = this.getConfig().content) !== null && _a !== void 0 ? _a : {};
288
- }
289
- getMeta() {
290
- var _a;
291
- return (_a = this.getConfig().meta) !== null && _a !== void 0 ? _a : {};
292
- }
293
- navigate(options) {
294
- return this.router.navigate(options);
295
- }
296
- updateCurrentRoute(options) {
297
- return this.router.updateCurrentRoute(options);
298
- }
299
- back(options) {
300
- return this.router.back(options);
301
- }
302
- forward() {
303
- return this.router.forward();
304
- }
305
- go(to, options) {
306
- return this.router.go(to, options);
307
- }
308
- addComponent(name, component) {
309
- const group = this.getComponentsGroupName();
310
- return this.componentRegistry.add(name, component, group);
311
- }
312
- getComponent(name) {
313
- const group = this.getComponentsGroupName();
314
- return this.componentRegistry.get(name, group);
315
- }
316
- resolveComponentFromConfig(property) {
317
- var _a;
318
- const configName = `${property}Component`;
319
- const defaultComponent = `${property}Default`;
320
- const componentName = (_a = this.getConfig()[configName]) !== null && _a !== void 0 ? _a : defaultComponent;
321
- return this.getComponent(componentName) || this.getComponent(defaultComponent);
322
- }
323
- getComponentsGroupName() {
324
- const { bundle, pageComponent } = this.getConfig();
325
- const group = experiments.isFileSystemPageComponent(pageComponent) ? pageComponent : bundle;
326
- return group;
327
- }
328
- }
329
-
330
- const providers$1 = [
331
- experiments.fileSystemPagesEnabled() &&
332
- core.provide({
333
- provide: tokensRouter.ROUTES_TOKEN,
334
- multi: true,
335
- useFactory: ({ logger }) => {
336
- const log = logger('file-system-pages:route');
337
- const pagesNames = Object.keys(experiments.getStaticFileSystemPages());
338
- const routes = pagesNames.map(experiments.fileSystemPageToRoute);
339
- log.debug({
340
- event: 'create static routes from file-system pages',
341
- routes,
342
- });
343
- return routes;
344
- },
345
- deps: {
346
- logger: tokensCommon.LOGGER_TOKEN,
347
- },
348
- }),
349
- ].filter(Boolean);
350
-
351
- const providers = [
352
- ...commonGuards,
353
- ...commonHooks,
354
- ...commonTokens,
355
- ...providers$1,
356
- {
357
- provide: tokensRouter.ROUTER_TOKEN,
358
- useFactory: ({ RouterClass, routes, routeTransform, routeResolve, additionalParameters, }) => {
359
- const router = new RouterClass({
360
- ...additionalParameters,
361
- trailingSlash: true,
362
- mergeSlashes: true,
363
- routes: flatten__default["default"](routes !== null && routes !== void 0 ? routes : []).map(routeTransform),
364
- });
365
- if (routeResolve) {
366
- router.registerHook('beforeResolve', async (navigation) => {
367
- if (!router.resolve(navigation.url.href)) {
368
- const route = await routeResolve(navigation);
369
- if (route) {
370
- router.addRoute(routeTransform(route));
371
- }
372
- }
373
- });
374
- }
375
- return router;
376
- },
377
- deps: {
378
- RouterClass: routerClassToken,
379
- additionalParameters: {
380
- token: additionalRouterParameters,
381
- optional: true,
382
- },
383
- routes: {
384
- token: tokensRouter.ROUTES_TOKEN,
385
- optional: true,
386
- },
387
- routeTransform: routeTransformToken,
388
- routeResolve: {
389
- token: tokensRouter.ROUTE_RESOLVE_TOKEN,
390
- optional: true,
391
- },
392
- },
393
- },
394
- {
395
- provide: core.commandLineListTokens.customerStart,
396
- multi: true,
397
- useFactory: ({ router, guards, onChange, beforeResolve, beforeNavigate, afterNavigate, beforeUpdateCurrent, afterUpdateCurrent, }) => {
398
- return function routerInit() {
399
- flatten__default["default"](guards !== null && guards !== void 0 ? guards : []).forEach((guard) => router.registerGuard(guard));
400
- flatten__default["default"](onChange !== null && onChange !== void 0 ? onChange : []).forEach((hook) => router.registerSyncHook('change', hook));
401
- flatten__default["default"](beforeResolve !== null && beforeResolve !== void 0 ? beforeResolve : []).forEach((hook) => router.registerHook('beforeResolve', hook));
402
- flatten__default["default"](beforeNavigate !== null && beforeNavigate !== void 0 ? beforeNavigate : []).forEach((hook) => router.registerHook('beforeNavigate', hook));
403
- flatten__default["default"](afterNavigate !== null && afterNavigate !== void 0 ? afterNavigate : []).forEach((hook) => router.registerHook('afterNavigate', hook));
404
- flatten__default["default"](beforeUpdateCurrent !== null && beforeUpdateCurrent !== void 0 ? beforeUpdateCurrent : []).forEach((hook) => router.registerHook('beforeUpdateCurrent', hook));
405
- flatten__default["default"](afterUpdateCurrent !== null && afterUpdateCurrent !== void 0 ? afterUpdateCurrent : []).forEach((hook) => router.registerHook('afterUpdateCurrent', hook));
406
- };
407
- },
408
- deps: {
409
- router: tokensRouter.ROUTER_TOKEN,
410
- guards: {
411
- token: tokensRouter.ROUTER_GUARD_TOKEN,
412
- optional: true,
413
- },
414
- onChange: {
415
- token: onChangeHooksToken,
416
- optional: true,
417
- },
418
- beforeResolve: {
419
- token: beforeResolveHooksToken,
420
- optional: true,
421
- },
422
- beforeNavigate: {
423
- token: beforeNavigateHooksToken,
424
- optional: true,
425
- },
426
- afterNavigate: {
427
- token: afterNavigateHooksToken,
428
- optional: true,
429
- },
430
- beforeUpdateCurrent: {
431
- token: beforeUpdateCurrentHooksToken,
432
- optional: true,
433
- },
434
- afterUpdateCurrent: {
435
- token: afterUpdateCurrentHooksToken,
436
- optional: true,
437
- },
438
- },
439
- },
440
- {
441
- provide: core.commandLineListTokens.init,
442
- multi: true,
443
- useFactory: ({ logger }) => {
444
- return function routerSetLogger() {
445
- router.setLogger(logger('route:router'));
446
- };
447
- },
448
- deps: {
449
- logger: tokensCommon.LOGGER_TOKEN,
450
- },
451
- },
452
- {
453
- provide: tokensRouter.ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
454
- // TODO: пока делаем after т.к. на это рассчитывает большинство приложений и у нас пока нет механизма контроля выполнения экшенов, чтобы
455
- // избежать случаев зависания перехода из-за долгих экшенов
456
- // рассмотреть возможность замены после доработок экшенов
457
- useValue: 'after',
458
- },
459
- core.provide({
460
- provide: tokensRouter.PAGE_SERVICE_TOKEN,
461
- useClass: PageService,
462
- deps: {
463
- router: tokensRouter.ROUTER_TOKEN,
464
- componentRegistry: tokensCommon.COMPONENT_REGISTRY_TOKEN,
465
- },
466
- }),
467
- {
468
- provide: tokensCommon.COMBINE_REDUCERS,
469
- multi: true,
470
- useValue: RouterStore,
471
- },
472
- ];
473
-
474
- const httpMethod = ({ requestManager, responseManager, logger, }) => {
475
- const log = logger('route:httpMethod');
476
- return async ({ to }) => {
477
- const { httpMethods } = to.config;
478
- if (httpMethods) {
479
- const currentMethod = requestManager.getMethod().toLowerCase();
480
- if (!httpMethods.split(',').includes(currentMethod)) {
481
- log.info({
482
- event: 'check-failed',
483
- currentMethod,
484
- route: to,
485
- });
486
- responseManager.setStatus(405);
487
- return false;
488
- }
489
- }
490
- };
491
- };
492
-
493
- const serverGuards = [
494
- {
495
- provide: tokensRouter.ROUTER_GUARD_TOKEN,
496
- multi: true,
497
- useFactory: httpMethod,
498
- deps: {
499
- requestManager: tokensCommon.REQUEST_MANAGER_TOKEN,
500
- responseManager: tokensCommon.RESPONSE_MANAGER_TOKEN,
501
- logger: tokensCommon.LOGGER_TOKEN,
502
- },
503
- },
504
- ];
505
-
506
- const stopRunAtError = (error) => {
507
- if (errors.isNotFoundError(error) || errors.isRedirectFoundError(error)) {
508
- return true;
509
- }
510
- };
511
- const runActionsFactory = ({ store, router, actionRegistry, actionPageRunner, }) => {
512
- return function runActions() {
513
- const route = router.getCurrentRoute();
514
- const { config: { bundle, pageComponent } = {} } = route;
515
- if (!bundle || !pageComponent) {
516
- throw new Error(`bundle and pageComponent should be defined, but got ${route}`);
517
- }
518
- const actions = uniq__default["default"]([
519
- ...(actionRegistry.getGlobal() || []),
520
- ...(actionRegistry.get(bundle) || []),
521
- ...(actionRegistry.get(pageComponent) || []),
522
- ]);
523
- return actionPageRunner.runActions(actions, stopRunAtError).catch((err) => {
524
- if (errors.isRedirectFoundError(err)) {
525
- return router.navigate({
526
- url: err.nextUrl,
527
- replace: true,
528
- code: err.httpStatus,
529
- });
530
- }
531
- throw err.error || err;
532
- });
533
- };
534
- };
535
-
536
- const httpStatus = ({ responseManager }) => async ({ to }) => {
537
- if (to === null || to === void 0 ? void 0 : to.config.httpStatus) {
538
- responseManager.setStatus(to.config.httpStatus);
539
- }
540
- };
541
-
542
- const serverHooks = [
543
- {
544
- provide: afterNavigateHooksToken,
545
- multi: true,
546
- // проставляет httpStatus если задан в текущем роуте
547
- useFactory: httpStatus,
548
- deps: {
549
- responseManager: tokensCommon.RESPONSE_MANAGER_TOKEN,
550
- },
551
- },
552
- ];
553
-
554
- const routerOptions = ({ requestManager, responseManager, }) => {
555
- const getUrl = (navigation) => { var _a, _b; return (_b = (_a = navigation.url) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : requestManager.getUrl(); };
556
- const throwError = ({ defaultStatus, url }) => {
557
- const error = new errors.HttpError({
558
- url,
559
- httpStatus: responseManager.getStatus() >= 300 ? responseManager.getStatus() : defaultStatus,
560
- });
561
- errors.makeErrorSilent(error);
562
- throw error;
563
- };
564
- return {
565
- onNotFound: async (navigation) => {
566
- // isSilent is used to prevent command line error logs,
567
- // because 404 errors is expected behavior
568
- throwError({ defaultStatus: 404, url: getUrl(navigation) });
569
- },
570
- onRedirect: async (navigation) => {
571
- const { fromUrl, url, code } = navigation;
572
- const error = new errors.RedirectFoundError({
573
- url: getUrl(navigation),
574
- nextUrl: fromUrl.origin !== url.origin ? url.href : url.path,
575
- httpStatus: code,
576
- silent: true,
577
- });
578
- errors.makeErrorSilent(error);
579
- throw error;
580
- },
581
- onBlock: async (navigation) => {
582
- throwError({ defaultStatus: 500, url: getUrl(navigation) });
583
- },
584
- defaultRedirectCode: requestManager.getMethod() === 'GET' ? 301 : 308,
585
- };
586
- };
587
-
588
- const deduplicateArray = (list) => {
589
- return Array.from(new Set(list));
590
- };
591
- const bundleInfoPapi = papi.createPapiMethod({
592
- method: 'get',
593
- path: '/bundleInfo',
594
- async handler() {
595
- var _a;
596
- const { getAdditionalRoutes, routes, routeTransform } = this.deps;
597
- const loadAdditional = getAdditionalRoutes !== null && getAdditionalRoutes !== void 0 ? getAdditionalRoutes : (() => []);
598
- return deduplicateArray(flatten__default["default"](routes || [])
599
- .concat((_a = (await loadAdditional())) !== null && _a !== void 0 ? _a : [])
600
- .map(routeTransform)
601
- .map(prop__default["default"]('path'))
602
- .filter((path) => !router.isWildcard(path) && !router.isHistoryFallback(path))
603
- .sort());
604
- },
605
- deps: {
606
- routes: {
607
- token: tokensRouter.ROUTES_TOKEN,
608
- optional: true,
609
- },
610
- routeTransform: routeTransformToken,
611
- getAdditionalRoutes: { token: routerBundleInfoAdditionalToken, optional: true },
612
- },
613
- });
614
-
615
- // do nothing on server side
616
- const prefetchManager = {
617
- prefetch: async (url) => { },
618
- };
619
- const prefetchProviders = [
620
- core.provide({
621
- provide: tokensRouter.LINK_PREFETCH_MANAGER_TOKEN,
622
- useValue: prefetchManager,
623
- }),
624
- ];
625
-
626
- const serverTokens = [
627
- {
628
- provide: additionalRouterParameters,
629
- useFactory: routerOptions,
630
- deps: {
631
- requestManager: tokensCommon.REQUEST_MANAGER_TOKEN,
632
- responseManager: tokensCommon.RESPONSE_MANAGER_TOKEN,
633
- },
634
- },
635
- {
636
- provide: tokensServer.SERVER_MODULE_PAPI_PUBLIC_ROUTE,
637
- multi: true,
638
- useValue: bundleInfoPapi,
639
- },
640
- ...prefetchProviders,
641
- ];
642
-
643
- const generateForRoot = (mainModule) => {
644
- return (routes, options = {}) => {
645
- return {
646
- mainModule,
647
- providers: [
648
- {
649
- provide: tokensRouter.ROUTES_TOKEN,
650
- multi: true,
651
- useValue: routes,
652
- },
653
- options.spaActionsMode && {
654
- provide: tokensRouter.ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN,
655
- useValue: options.spaActionsMode,
656
- },
657
- ].filter(Boolean),
658
- };
659
- };
660
- };
661
-
662
- var NoSpaRouterModule_1;
663
- exports.NoSpaRouterModule = NoSpaRouterModule_1 = class NoSpaRouterModule {
664
- };
665
- exports.NoSpaRouterModule.forRoot = generateForRoot(NoSpaRouterModule_1);
666
- exports.NoSpaRouterModule = NoSpaRouterModule_1 = tslib.__decorate([
667
- core.Module({
668
- providers: [
669
- ...providers,
670
- ...serverGuards,
671
- ...serverHooks,
672
- ...serverTokens,
673
- {
674
- provide: routerClassToken,
675
- useValue: router.Router,
676
- },
677
- {
678
- provide: core.commandLineListTokens.resolveUserDeps,
679
- multi: true,
680
- useFactory: ({ router, requestManager }) => {
681
- return function routerInit() {
682
- return router.navigate(requestManager.getUrl());
683
- };
684
- },
685
- deps: {
686
- router: tokensRouter.ROUTER_TOKEN,
687
- requestManager: tokensCommon.REQUEST_MANAGER_TOKEN,
688
- },
689
- },
690
- {
691
- // запускаем экшены отдельно от самого роутинга, чтобы распараллелить задачи
692
- provide: core.commandLineListTokens.resolvePageDeps,
693
- multi: true,
694
- useFactory: runActionsFactory,
695
- deps: {
696
- store: tokensCommon.STORE_TOKEN,
697
- router: tokensRouter.ROUTER_TOKEN,
698
- actionRegistry: tokensCommon.ACTION_REGISTRY_TOKEN,
699
- actionPageRunner: tokensCommon.ACTION_PAGE_RUNNER_TOKEN,
700
- },
701
- },
702
- ],
703
- })
704
- ], exports.NoSpaRouterModule);
705
- const SpaRouterModule = exports.NoSpaRouterModule;
706
-
707
- exports.RouterChildAppModule = class RouterChildAppModule {
708
- };
709
- exports.RouterChildAppModule = tslib.__decorate([
710
- core.Module({
711
- providers: [
712
- core.provide({
713
- provide: tokensRender.EXTEND_RENDER,
714
- multi: true,
715
- useFactory: provideRouter,
716
- deps: {
717
- router: tokensRouter.ROUTER_TOKEN,
718
- },
719
- }),
720
- {
721
- provide: tokensChildApp.CHILD_APP_INTERNAL_ROOT_STATE_ALLOWED_STORE_TOKEN,
722
- multi: true,
723
- useValue: RouterStore,
724
- },
725
- ],
726
- })
727
- ], exports.RouterChildAppModule);
728
-
729
- function Link(props) {
730
- const { children, onClick, url, query, replace, target, navigateOptions, prefetch = true, ...otherProps } = props;
731
- const navigate = router.useNavigate({ url, query, replace, ...navigateOptions });
732
- const [linkElement, setLinkElement] = react$1.useState(null);
733
- const handleClick = react$1.useCallback((event) => {
734
- // ignores the navigation when clicked using right mouse button or
735
- // by holding a special modifier key: ctrl, command, win, alt, shift
736
- if (target ||
737
- event.ctrlKey ||
738
- event.metaKey ||
739
- event.altKey ||
740
- event.shiftKey ||
741
- event.button !== 0) {
742
- return;
743
- }
744
- event.preventDefault();
745
- navigate();
746
- onClick && onClick(event);
747
- }, [navigate, target, onClick]);
748
- const extraProps = { href: url, onClick: handleClick, target };
749
- if (react$1.isValidElement(children)) {
750
- return react$1.cloneElement(children, {
751
- // @ts-expect-error
752
- ref: (element) => {
753
- // @ts-expect-error
754
- const { ref } = children;
755
- // preserve original ref
756
- if (typeof ref === 'function') {
757
- ref(element);
758
- }
759
- else if (typeof ref === 'object' && ref !== null) {
760
- ref.current = element;
761
- }
762
- setLinkElement(element);
763
- },
764
- ...extraProps,
765
- });
766
- }
767
- return (
768
- // eslint-disable-next-line react/jsx-props-no-spreading
769
- jsxRuntime.jsx("a", { ref: (element) => setLinkElement(element), ...otherProps, ...extraProps, children: children }));
770
- }
771
- Link.displayName = 'Link';
772
-
773
- const usePageService = () => {
774
- router.useRoute();
775
- return react.useDi(tokensRouter.PAGE_SERVICE_TOKEN);
776
- };
777
-
778
25
  Object.defineProperty(exports, 'Provider', {
779
- enumerable: true,
780
- get: function () { return router.Provider; }
26
+ enumerable: true,
27
+ get: function () { return router.Provider; }
781
28
  });
782
29
  Object.defineProperty(exports, 'useNavigate', {
783
- enumerable: true,
784
- get: function () { return router.useNavigate; }
30
+ enumerable: true,
31
+ get: function () { return router.useNavigate; }
785
32
  });
786
33
  Object.defineProperty(exports, 'useRoute', {
787
- enumerable: true,
788
- get: function () { return router.useRoute; }
34
+ enumerable: true,
35
+ get: function () { return router.useRoute; }
789
36
  });
790
37
  Object.defineProperty(exports, 'useRouter', {
791
- enumerable: true,
792
- get: function () { return router.useRouter; }
38
+ enumerable: true,
39
+ get: function () { return router.useRouter; }
793
40
  });
794
41
  Object.defineProperty(exports, 'useUrl', {
795
- enumerable: true,
796
- get: function () { return router.useUrl; }
797
- });
798
- exports.Link = Link;
799
- exports.RouterStore = RouterStore;
800
- exports.SpaRouterModule = SpaRouterModule;
801
- exports.generateForRoot = generateForRoot;
802
- exports.setCurrentNavigation = setCurrentNavigation;
803
- exports.setUrlOnRehydrate = setUrlOnRehydrate;
804
- exports.usePageService = usePageService;
42
+ enumerable: true,
43
+ get: function () { return router.useUrl; }
44
+ });
45
+ exports.Link = link.Link;
46
+ exports.generateForRoot = forRoot.generateForRoot;
47
+ exports.RouterStore = RouterStore.RouterStore;
48
+ exports.setCurrentNavigation = RouterStore.setCurrentNavigation;
49
+ exports.setUrlOnRehydrate = RouterStore.setUrlOnRehydrate;
50
+ exports.usePageService = usePageService.usePageService;
805
51
  Object.keys(tokensRouter).forEach(function (k) {
806
- if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
807
- enumerable: true,
808
- get: function () { return tokensRouter[k]; }
809
- });
52
+ if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
53
+ enumerable: true,
54
+ get: function () { return tokensRouter[k]; }
55
+ });
810
56
  });