@tramvai/module-router 2.70.1 → 2.72.3

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 -918
  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
@@ -0,0 +1,55 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useState, useCallback, isValidElement, cloneElement } from 'react';
3
+ import { useNavigate } from '@tinkoff/router';
4
+ import { usePrefetch } from '../hooks/usePrefetch.browser.browser.js';
5
+
6
+ function Link(props) {
7
+ const { children, onClick, url, query, replace, target, navigateOptions, prefetch = true, ...otherProps } = props;
8
+ const navigate = useNavigate({ url, query, replace, ...navigateOptions });
9
+ const [linkElement, setLinkElement] = useState(null);
10
+ usePrefetch({
11
+ url,
12
+ prefetch,
13
+ target: linkElement,
14
+ });
15
+ const handleClick = useCallback((event) => {
16
+ // ignores the navigation when clicked using right mouse button or
17
+ // by holding a special modifier key: ctrl, command, win, alt, shift
18
+ if (target ||
19
+ event.ctrlKey ||
20
+ event.metaKey ||
21
+ event.altKey ||
22
+ event.shiftKey ||
23
+ event.button !== 0) {
24
+ return;
25
+ }
26
+ event.preventDefault();
27
+ navigate();
28
+ onClick && onClick(event);
29
+ }, [navigate, target, onClick]);
30
+ const extraProps = { href: url, onClick: handleClick, target };
31
+ if (isValidElement(children)) {
32
+ return cloneElement(children, {
33
+ // @ts-expect-error
34
+ ref: (element) => {
35
+ // @ts-expect-error
36
+ const { ref } = children;
37
+ // preserve original ref
38
+ if (typeof ref === 'function') {
39
+ ref(element);
40
+ }
41
+ else if (typeof ref === 'object' && ref !== null) {
42
+ ref.current = element;
43
+ }
44
+ setLinkElement(element);
45
+ },
46
+ ...extraProps,
47
+ });
48
+ }
49
+ return (
50
+ // eslint-disable-next-line react/jsx-props-no-spreading
51
+ jsx("a", { ref: (element) => setLinkElement(element), ...otherProps, ...extraProps, children: children }));
52
+ }
53
+ Link.displayName = 'Link';
54
+
55
+ export { Link };
@@ -0,0 +1,49 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useState, useCallback, isValidElement, cloneElement } from 'react';
3
+ import { useNavigate } from '@tinkoff/router';
4
+
5
+ function Link(props) {
6
+ const { children, onClick, url, query, replace, target, navigateOptions, prefetch = true, ...otherProps } = props;
7
+ const navigate = useNavigate({ url, query, replace, ...navigateOptions });
8
+ const [linkElement, setLinkElement] = useState(null);
9
+ const handleClick = useCallback((event) => {
10
+ // ignores the navigation when clicked using right mouse button or
11
+ // by holding a special modifier key: ctrl, command, win, alt, shift
12
+ if (target ||
13
+ event.ctrlKey ||
14
+ event.metaKey ||
15
+ event.altKey ||
16
+ event.shiftKey ||
17
+ event.button !== 0) {
18
+ return;
19
+ }
20
+ event.preventDefault();
21
+ navigate();
22
+ onClick && onClick(event);
23
+ }, [navigate, target, onClick]);
24
+ const extraProps = { href: url, onClick: handleClick, target };
25
+ if (isValidElement(children)) {
26
+ return cloneElement(children, {
27
+ // @ts-expect-error
28
+ ref: (element) => {
29
+ // @ts-expect-error
30
+ const { ref } = children;
31
+ // preserve original ref
32
+ if (typeof ref === 'function') {
33
+ ref(element);
34
+ }
35
+ else if (typeof ref === 'object' && ref !== null) {
36
+ ref.current = element;
37
+ }
38
+ setLinkElement(element);
39
+ },
40
+ ...extraProps,
41
+ });
42
+ }
43
+ return (
44
+ // eslint-disable-next-line react/jsx-props-no-spreading
45
+ jsx("a", { ref: (element) => setLinkElement(element), ...otherProps, ...extraProps, children: children }));
46
+ }
47
+ Link.displayName = 'Link';
48
+
49
+ export { Link };
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var react = require('react');
7
+ var router = require('@tinkoff/router');
8
+
9
+ function Link(props) {
10
+ const { children, onClick, url, query, replace, target, navigateOptions, prefetch = true, ...otherProps } = props;
11
+ const navigate = router.useNavigate({ url, query, replace, ...navigateOptions });
12
+ const [linkElement, setLinkElement] = react.useState(null);
13
+ const handleClick = react.useCallback((event) => {
14
+ // ignores the navigation when clicked using right mouse button or
15
+ // by holding a special modifier key: ctrl, command, win, alt, shift
16
+ if (target ||
17
+ event.ctrlKey ||
18
+ event.metaKey ||
19
+ event.altKey ||
20
+ event.shiftKey ||
21
+ event.button !== 0) {
22
+ return;
23
+ }
24
+ event.preventDefault();
25
+ navigate();
26
+ onClick && onClick(event);
27
+ }, [navigate, target, onClick]);
28
+ const extraProps = { href: url, onClick: handleClick, target };
29
+ if (react.isValidElement(children)) {
30
+ return react.cloneElement(children, {
31
+ // @ts-expect-error
32
+ ref: (element) => {
33
+ // @ts-expect-error
34
+ const { ref } = children;
35
+ // preserve original ref
36
+ if (typeof ref === 'function') {
37
+ ref(element);
38
+ }
39
+ else if (typeof ref === 'object' && ref !== null) {
40
+ ref.current = element;
41
+ }
42
+ setLinkElement(element);
43
+ },
44
+ ...extraProps,
45
+ });
46
+ }
47
+ return (
48
+ // eslint-disable-next-line react/jsx-props-no-spreading
49
+ jsxRuntime.jsx("a", { ref: (element) => setLinkElement(element), ...otherProps, ...extraProps, children: children }));
50
+ }
51
+ Link.displayName = 'Link';
52
+
53
+ exports.Link = Link;
@@ -0,0 +1,10 @@
1
+ import { useRoute } from '@tinkoff/router';
2
+ import { useDi } from '@tramvai/react';
3
+ import { PAGE_SERVICE_TOKEN } from '@tramvai/tokens-router';
4
+
5
+ const usePageService = () => {
6
+ useRoute();
7
+ return useDi(PAGE_SERVICE_TOKEN);
8
+ };
9
+
10
+ export { usePageService };
@@ -0,0 +1,10 @@
1
+ import { useRoute } from '@tinkoff/router';
2
+ import { useDi } from '@tramvai/react';
3
+ import { PAGE_SERVICE_TOKEN } from '@tramvai/tokens-router';
4
+
5
+ const usePageService = () => {
6
+ useRoute();
7
+ return useDi(PAGE_SERVICE_TOKEN);
8
+ };
9
+
10
+ export { usePageService };
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var router = require('@tinkoff/router');
6
+ var react = require('@tramvai/react');
7
+ var tokensRouter = require('@tramvai/tokens-router');
8
+
9
+ const usePageService = () => {
10
+ router.useRoute();
11
+ return react.useDi(tokensRouter.PAGE_SERVICE_TOKEN);
12
+ };
13
+
14
+ exports.usePageService = usePageService;
@@ -0,0 +1,42 @@
1
+ import { useEffect } from 'react';
2
+ import { useDi } from '@tramvai/react';
3
+ import { LINK_PREFETCH_MANAGER_TOKEN } from '@tramvai/tokens-router';
4
+ import { requestIdleCallback, cancelIdleCallback } from '../utils/requestIdleCallback.browser.js';
5
+ import { optional } from '@tinkoff/dippy';
6
+
7
+ const isUserNetworkConditionsSuitableForPrefetch = () => {
8
+ var _a;
9
+ const { saveData, effectiveType = '' } = (_a = navigator.connection) !== null && _a !== void 0 ? _a : {};
10
+ return !saveData && !(effectiveType === '2g' || effectiveType === 'slow-2g');
11
+ };
12
+ const usePrefetch = ({ url, target, prefetch, }) => {
13
+ const linkPrefetchManager = useDi(optional(LINK_PREFETCH_MANAGER_TOKEN));
14
+ useEffect(() => {
15
+ if (!target || !prefetch || !linkPrefetchManager) {
16
+ return;
17
+ }
18
+ let idleId = null;
19
+ const observer = new IntersectionObserver((entries) => {
20
+ entries.forEach((entry) => {
21
+ // when `Link` element in viewport
22
+ if (entry.isIntersecting && entry.intersectionRatio > 0) {
23
+ // only once
24
+ observer.disconnect();
25
+ if (isUserNetworkConditionsSuitableForPrefetch()) {
26
+ // trigger prefetching when browser is idle
27
+ idleId = requestIdleCallback(() => {
28
+ linkPrefetchManager.prefetch(url);
29
+ });
30
+ }
31
+ }
32
+ });
33
+ });
34
+ observer.observe(target);
35
+ return () => {
36
+ observer.disconnect();
37
+ cancelIdleCallback(idleId);
38
+ };
39
+ }, [url, target, prefetch, linkPrefetchManager]);
40
+ };
41
+
42
+ export { usePrefetch };