@tramvai/module-router 2.70.1 → 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 -918
- 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,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 };
|