@redneckz/wildless-cms-uni-blocks 0.8.4 → 0.8.6

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 (179) hide show
  1. package/bundle/bundle.umd.js +35 -44
  2. package/bundle/bundle.umd.min.js +1 -1
  3. package/bundle/components/Footer/Sitemap.d.ts +0 -2
  4. package/bundle/components/Header/Header.fallback.d.ts +1 -2
  5. package/bundle/hooks/useLink.d.ts +6 -5
  6. package/bundle/services/sitemap/fallbackWCMSResource.d.ts +2 -0
  7. package/bundle/services/sitemap/isHrefActive.d.ts +4 -2
  8. package/bundle/services/sitemap/useSWRResource.d.ts +1 -1
  9. package/bundle/utils/url.d.ts +1 -3
  10. package/dist/components/Carousel/Carousel.js +1 -1
  11. package/dist/components/Carousel/Carousel.js.map +1 -1
  12. package/dist/components/Footer/Footer.fallback.js +3 -6
  13. package/dist/components/Footer/Footer.fallback.js.map +1 -1
  14. package/dist/components/Footer/Sitemap.d.ts +0 -2
  15. package/dist/components/Footer/Sitemap.js +2 -4
  16. package/dist/components/Footer/Sitemap.js.map +1 -1
  17. package/dist/components/Header/Header.fallback.d.ts +1 -2
  18. package/dist/components/Header/Header.fallback.js +2 -7
  19. package/dist/components/Header/Header.fallback.js.map +1 -1
  20. package/dist/hooks/useLink.d.ts +6 -5
  21. package/dist/hooks/useLink.js +22 -18
  22. package/dist/hooks/useLink.js.map +1 -1
  23. package/dist/services/BlockRouter/BlockRouter.js +1 -1
  24. package/dist/services/BlockRouter/BlockRouter.js.map +1 -1
  25. package/dist/services/sitemap/fallbackWCMSResource.d.ts +2 -0
  26. package/dist/services/sitemap/fallbackWCMSResource.js +8 -0
  27. package/dist/services/sitemap/fallbackWCMSResource.js.map +1 -0
  28. package/dist/services/sitemap/isHrefActive.d.ts +4 -2
  29. package/dist/services/sitemap/isHrefActive.js +1 -6
  30. package/dist/services/sitemap/isHrefActive.js.map +1 -1
  31. package/dist/services/sitemap/isTopItemActive.js +4 -1
  32. package/dist/services/sitemap/isTopItemActive.js.map +1 -1
  33. package/dist/services/sitemap/useSWRResource.d.ts +1 -1
  34. package/dist/services/sitemap/useSWRResource.js +2 -2
  35. package/dist/setup-fixture.js +3 -1
  36. package/dist/setup-fixture.js.map +1 -1
  37. package/dist/utils/url.d.ts +1 -3
  38. package/dist/utils/url.js +4 -8
  39. package/dist/utils/url.js.map +1 -1
  40. package/lib/components/Carousel/Carousel.js +1 -1
  41. package/lib/components/Carousel/Carousel.js.map +1 -1
  42. package/lib/components/Footer/Footer.fallback.js +1 -4
  43. package/lib/components/Footer/Footer.fallback.js.map +1 -1
  44. package/lib/components/Footer/Sitemap.d.ts +0 -2
  45. package/lib/components/Footer/Sitemap.js +2 -4
  46. package/lib/components/Footer/Sitemap.js.map +1 -1
  47. package/lib/components/Header/Header.fallback.d.ts +1 -2
  48. package/lib/components/Header/Header.fallback.js +2 -7
  49. package/lib/components/Header/Header.fallback.js.map +1 -1
  50. package/lib/hooks/useLink.d.ts +6 -5
  51. package/lib/hooks/useLink.js +23 -19
  52. package/lib/hooks/useLink.js.map +1 -1
  53. package/lib/services/BlockRouter/BlockRouter.js +1 -1
  54. package/lib/services/BlockRouter/BlockRouter.js.map +1 -1
  55. package/lib/services/sitemap/fallbackWCMSResource.d.ts +2 -0
  56. package/lib/services/sitemap/fallbackWCMSResource.js +5 -0
  57. package/lib/services/sitemap/fallbackWCMSResource.js.map +1 -0
  58. package/lib/services/sitemap/isHrefActive.d.ts +4 -2
  59. package/lib/services/sitemap/isHrefActive.js +1 -6
  60. package/lib/services/sitemap/isHrefActive.js.map +1 -1
  61. package/lib/services/sitemap/isTopItemActive.js +4 -1
  62. package/lib/services/sitemap/isTopItemActive.js.map +1 -1
  63. package/lib/services/sitemap/useSWRResource.d.ts +1 -1
  64. package/lib/services/sitemap/useSWRResource.js +2 -2
  65. package/lib/setup-fixture.js +3 -1
  66. package/lib/setup-fixture.js.map +1 -1
  67. package/lib/utils/url.d.ts +1 -3
  68. package/lib/utils/url.js +2 -4
  69. package/lib/utils/url.js.map +1 -1
  70. package/mobile/bundle/bundle.umd.js +32 -35
  71. package/mobile/bundle/bundle.umd.min.js +1 -1
  72. package/mobile/bundle/components/Footer/Sitemap.d.ts +0 -2
  73. package/mobile/bundle/components/Header/Header.fallback.d.ts +1 -2
  74. package/mobile/bundle/hooks/useLink.d.ts +6 -5
  75. package/mobile/bundle/services/sitemap/fallbackWCMSResource.d.ts +2 -0
  76. package/mobile/bundle/services/sitemap/isHrefActive.d.ts +4 -2
  77. package/mobile/bundle/services/sitemap/useSWRResource.d.ts +1 -1
  78. package/mobile/bundle/utils/url.d.ts +1 -3
  79. package/mobile/dist/components/Carousel/Carousel.js +1 -1
  80. package/mobile/dist/components/Carousel/Carousel.js.map +1 -1
  81. package/mobile/dist/components/Footer/Footer.fallback.js +3 -6
  82. package/mobile/dist/components/Footer/Footer.fallback.js.map +1 -1
  83. package/mobile/dist/components/Footer/Sitemap.d.ts +0 -2
  84. package/mobile/dist/components/Footer/Sitemap.js +2 -4
  85. package/mobile/dist/components/Footer/Sitemap.js.map +1 -1
  86. package/mobile/dist/components/Header/Header.fallback.d.ts +1 -2
  87. package/mobile/dist/components/Header/Header.fallback.js +2 -7
  88. package/mobile/dist/components/Header/Header.fallback.js.map +1 -1
  89. package/mobile/dist/hooks/useLink.d.ts +6 -5
  90. package/mobile/dist/hooks/useLink.js +22 -18
  91. package/mobile/dist/hooks/useLink.js.map +1 -1
  92. package/mobile/dist/services/BlockRouter/BlockRouter.js +1 -1
  93. package/mobile/dist/services/BlockRouter/BlockRouter.js.map +1 -1
  94. package/mobile/dist/services/sitemap/fallbackWCMSResource.d.ts +2 -0
  95. package/mobile/dist/services/sitemap/fallbackWCMSResource.js +8 -0
  96. package/mobile/dist/services/sitemap/fallbackWCMSResource.js.map +1 -0
  97. package/mobile/dist/services/sitemap/isHrefActive.d.ts +4 -2
  98. package/mobile/dist/services/sitemap/isHrefActive.js +1 -6
  99. package/mobile/dist/services/sitemap/isHrefActive.js.map +1 -1
  100. package/mobile/dist/services/sitemap/isTopItemActive.js +4 -1
  101. package/mobile/dist/services/sitemap/isTopItemActive.js.map +1 -1
  102. package/mobile/dist/services/sitemap/useSWRResource.d.ts +1 -1
  103. package/mobile/dist/services/sitemap/useSWRResource.js +2 -2
  104. package/mobile/dist/setup-fixture.js +3 -1
  105. package/mobile/dist/setup-fixture.js.map +1 -1
  106. package/mobile/dist/utils/url.d.ts +1 -3
  107. package/mobile/dist/utils/url.js +4 -8
  108. package/mobile/dist/utils/url.js.map +1 -1
  109. package/mobile/lib/components/Carousel/Carousel.js +1 -1
  110. package/mobile/lib/components/Carousel/Carousel.js.map +1 -1
  111. package/mobile/lib/components/Footer/Footer.fallback.js +1 -4
  112. package/mobile/lib/components/Footer/Footer.fallback.js.map +1 -1
  113. package/mobile/lib/components/Footer/Sitemap.d.ts +0 -2
  114. package/mobile/lib/components/Footer/Sitemap.js +2 -4
  115. package/mobile/lib/components/Footer/Sitemap.js.map +1 -1
  116. package/mobile/lib/components/Header/Header.fallback.d.ts +1 -2
  117. package/mobile/lib/components/Header/Header.fallback.js +2 -7
  118. package/mobile/lib/components/Header/Header.fallback.js.map +1 -1
  119. package/mobile/lib/hooks/useLink.d.ts +6 -5
  120. package/mobile/lib/hooks/useLink.js +23 -19
  121. package/mobile/lib/hooks/useLink.js.map +1 -1
  122. package/mobile/lib/services/BlockRouter/BlockRouter.js +1 -1
  123. package/mobile/lib/services/BlockRouter/BlockRouter.js.map +1 -1
  124. package/mobile/lib/services/sitemap/fallbackWCMSResource.d.ts +2 -0
  125. package/mobile/lib/services/sitemap/fallbackWCMSResource.js +5 -0
  126. package/mobile/lib/services/sitemap/fallbackWCMSResource.js.map +1 -0
  127. package/mobile/lib/services/sitemap/isHrefActive.d.ts +4 -2
  128. package/mobile/lib/services/sitemap/isHrefActive.js +1 -6
  129. package/mobile/lib/services/sitemap/isHrefActive.js.map +1 -1
  130. package/mobile/lib/services/sitemap/isTopItemActive.js +4 -1
  131. package/mobile/lib/services/sitemap/isTopItemActive.js.map +1 -1
  132. package/mobile/lib/services/sitemap/useSWRResource.d.ts +1 -1
  133. package/mobile/lib/services/sitemap/useSWRResource.js +2 -2
  134. package/mobile/lib/setup-fixture.js +3 -1
  135. package/mobile/lib/setup-fixture.js.map +1 -1
  136. package/mobile/lib/utils/url.d.ts +1 -3
  137. package/mobile/lib/utils/url.js +2 -4
  138. package/mobile/lib/utils/url.js.map +1 -1
  139. package/mobile/src/components/Carousel/Carousel.tsx +1 -1
  140. package/mobile/src/components/Footer/Footer.fallback.ts +1 -6
  141. package/mobile/src/components/Footer/Sitemap.tsx +2 -6
  142. package/mobile/src/components/Header/Header.fallback.ts +2 -12
  143. package/mobile/src/hooks/useLink.ts +26 -20
  144. package/mobile/src/services/BlockRouter/BlockRouter.ts +1 -1
  145. package/mobile/src/services/sitemap/fallbackWCMSResource.ts +7 -0
  146. package/mobile/src/services/sitemap/isHrefActive.ts +3 -12
  147. package/mobile/src/services/sitemap/isTopItemActive.ts +4 -1
  148. package/mobile/src/services/sitemap/useSWRResource.ts +2 -2
  149. package/mobile/src/setup-fixture.ts +3 -1
  150. package/mobile/src/utils/url.ts +4 -4
  151. package/package.json +1 -1
  152. package/src/components/Carousel/Carousel.tsx +1 -1
  153. package/src/components/Footer/Footer.fallback.ts +1 -6
  154. package/src/components/Footer/Sitemap.tsx +2 -6
  155. package/src/components/Header/Header.fallback.ts +2 -12
  156. package/src/hooks/useLink.ts +26 -20
  157. package/src/services/BlockRouter/BlockRouter.ts +1 -1
  158. package/src/services/sitemap/fallbackWCMSResource.ts +7 -0
  159. package/src/services/sitemap/isHrefActive.ts +3 -12
  160. package/src/services/sitemap/isTopItemActive.ts +4 -1
  161. package/src/services/sitemap/useSWRResource.ts +2 -2
  162. package/src/setup-fixture.ts +3 -1
  163. package/src/utils/url.ts +4 -4
  164. package/bundle/services/sitemap/mergeTopItems.d.ts +0 -2
  165. package/dist/services/sitemap/mergeTopItems.d.ts +0 -2
  166. package/dist/services/sitemap/mergeTopItems.js +0 -8
  167. package/dist/services/sitemap/mergeTopItems.js.map +0 -1
  168. package/lib/services/sitemap/mergeTopItems.d.ts +0 -2
  169. package/lib/services/sitemap/mergeTopItems.js +0 -5
  170. package/lib/services/sitemap/mergeTopItems.js.map +0 -1
  171. package/mobile/bundle/services/sitemap/mergeTopItems.d.ts +0 -2
  172. package/mobile/dist/services/sitemap/mergeTopItems.d.ts +0 -2
  173. package/mobile/dist/services/sitemap/mergeTopItems.js +0 -8
  174. package/mobile/dist/services/sitemap/mergeTopItems.js.map +0 -1
  175. package/mobile/lib/services/sitemap/mergeTopItems.d.ts +0 -2
  176. package/mobile/lib/services/sitemap/mergeTopItems.js +0 -5
  177. package/mobile/lib/services/sitemap/mergeTopItems.js.map +0 -1
  178. package/mobile/src/services/sitemap/mergeTopItems.ts +0 -12
  179. package/src/services/sitemap/mergeTopItems.ts +0 -12
@@ -1,23 +1,38 @@
1
- import type { LinkProps, Target } from '../model/LinkProps';
1
+ import type { LinkProps } from '../model/LinkProps';
2
+ import { projectSettings } from '../ProjectSettings';
2
3
  import { useBlockRouter } from '../services/BlockRouter/useBlockRouter';
3
- import { isHash, isLocalURL } from '../utils/url';
4
+ import { isHash, isLocalURL, isURL, joinPath } from '../utils/url';
4
5
  import { handlerDecorator } from './handlerDecorator';
5
6
  import { useRouter } from './useRouter';
6
7
 
7
- interface ClickHandler {
8
- onClick(ev?: { preventDefault: () => void }): void;
8
+ interface PreventableEvent {
9
+ preventDefault: () => void;
9
10
  }
10
11
 
11
- export function useLink(
12
- isRemote?: boolean,
13
- ): <L extends Partial<LinkProps & ClickHandler>>(props: L) => L & ClickHandler {
12
+ interface Clickable {
13
+ onClick(ev?: PreventableEvent): void;
14
+ }
15
+
16
+ export function useLink(isRemote?: boolean) {
14
17
  const router = useRouter();
15
18
  const blockRouter = useBlockRouter();
16
19
 
17
- const handleLocalURL =
18
- (href: string | undefined, target?: Target) => (ev?: { preventDefault: () => void }) => {
20
+ return <L extends Partial<LinkProps & Clickable>>(props: L): L & Clickable => ({
21
+ ...props,
22
+ href:
23
+ projectSettings.BASE_PATH && props.href && !(isRemote || isURL(props.href))
24
+ ? joinPath(projectSettings.BASE_PATH, props.href)
25
+ : props.href,
26
+ 'aria-label': props.text,
27
+ onClick: handlerDecorator(handleHref(props), props),
28
+ });
29
+
30
+ function handleHref({ href, target, onClick }: Partial<LinkProps & Clickable>) {
31
+ return (ev?: PreventableEvent) => {
32
+ onClick && onClick(ev);
33
+
19
34
  if (isRemote || !isLocalURL(href, target)) {
20
- // Proceed with native handle
35
+ // Default routing
21
36
  return;
22
37
  }
23
38
 
@@ -29,14 +44,5 @@ export function useLink(
29
44
  router.push(href);
30
45
  }
31
46
  };
32
-
33
- return (props) => ({
34
- ...props,
35
- 'aria-label': props.text,
36
- onClick: handlerDecorator((ev?: { preventDefault: () => void }) => {
37
- props.onClick && props.onClick(ev);
38
-
39
- handleLocalURL(props.href, props.target)(ev);
40
- }, props),
41
- });
47
+ }
42
48
  }
@@ -15,7 +15,7 @@ interface EventMap {
15
15
  intersection: BlockIntersectionEvent;
16
16
  }
17
17
 
18
- const normalizeAnchor = (rawAnchor?: string) => rawAnchor?.replace('#', '');
18
+ const normalizeAnchor = (rawAnchor?: string) => rawAnchor?.replace('#', '') || '';
19
19
  const getURLWithAnchor = (rawAnchor?: string) =>
20
20
  `${globalThis.location?.pathname}#${normalizeAnchor(rawAnchor)}`;
21
21
 
@@ -0,0 +1,7 @@
1
+ import { readFile } from 'fs/promises';
2
+ import type { FallbackMap } from '../../model/Fallback';
3
+
4
+ export const fallbackWCMSResource = (filename: string): FallbackMap => ({
5
+ [`/wcms-resources/${filename}.json`]: async () =>
6
+ JSON.parse(await readFile(`./content/wcms-resources/${filename}.json`, 'utf-8')),
7
+ });
@@ -1,15 +1,6 @@
1
- import type { Router } from '../../hooks/useRouter';
2
- import { projectSettings } from '../../ProjectSettings';
3
1
  import { isURL, withoutQuery } from '../../utils/url';
4
2
 
5
3
  export const isHrefActive =
6
- (router: Router) =>
7
- ({ href }: { href?: string }): boolean => {
8
- const { BASE_PATH } = projectSettings;
9
- const relativeHref =
10
- BASE_PATH && href?.startsWith(BASE_PATH) ? href.substring(BASE_PATH.length) : href;
11
-
12
- return withoutQuery(isURL(href) ? router.href : router.pathname).startsWith(
13
- withoutQuery(relativeHref),
14
- );
15
- };
4
+ (router: { href?: string; pathname: string }) =>
5
+ ({ href }: { href?: string }): boolean =>
6
+ withoutQuery(isURL(href) ? router.href : router.pathname).startsWith(withoutQuery(href));
@@ -1,8 +1,11 @@
1
1
  import type { Router } from '../../hooks/useRouter';
2
+ import { projectSettings } from '../../ProjectSettings';
2
3
  import { isHrefActive } from './isHrefActive';
3
4
  import { TopMenuItem } from './SitemapProps';
4
5
 
5
6
  export const isTopItemActive =
6
7
  (router: Router) =>
7
8
  (topItem: TopMenuItem): boolean =>
8
- topItem.items?.some(isHrefActive(router)) || isHrefActive(router)(topItem);
9
+ projectSettings.BASE_PATH
10
+ ? isHrefActive({ pathname: projectSettings.BASE_PATH })(topItem)
11
+ : topItem.items?.some(isHrefActive(router)) || isHrefActive(router)(topItem);
@@ -2,8 +2,8 @@ import { useAsyncData } from '@redneckz/uni-jsx/lib/hooks/useAsyncData';
2
2
  import type { Fallback } from '../../model/Fallback';
3
3
  import { fetchJSONUnsafe } from '../../utils/fetchJSON';
4
4
 
5
- export function useSWRResource<Data>(fileName: string, fallback: Fallback = {}): Data {
6
- const { data } = useAsyncData<Data>(`/wcms-resources/${fileName}.json`, fetchJSONUnsafe, {
5
+ export function useSWRResource<Data>(filename: string, fallback: Fallback = {}): Data {
6
+ const { data } = useAsyncData<Data>(`/wcms-resources/${filename}.json`, fetchJSONUnsafe, {
7
7
  fallback,
8
8
  });
9
9
 
@@ -26,7 +26,9 @@ useRouter.setup(() => {
26
26
 
27
27
  return {
28
28
  href,
29
- pathname: '',
29
+ pathname: projectSettings.BASE_PATH
30
+ ? new URL(href).pathname.substring(projectSettings.BASE_PATH.length - 1)
31
+ : '',
30
32
  query: {},
31
33
  push: (url: string) => {
32
34
  globalThis.history.pushState(null, '', url);
@@ -8,8 +8,8 @@ export const isLocalURL = (href: string | undefined, target?: Target) =>
8
8
 
9
9
  export const isHash = (href?: string): href is `#${string}` => Boolean(href?.startsWith('#'));
10
10
 
11
- export const withoutQuery = (href?: string): string => (href || '').replace(/\/?\?.*/, '');
11
+ export const withoutQuery = (href?: string): string =>
12
+ (href || '').replace(/\?.*/, '').replace(/\/$/, '');
12
13
 
13
- export const getOrigin = (href?: string) => (isURL(href) ? new URL(href).origin : undefined);
14
- export const getPathname = (href?: string) => (isURL(href) ? new URL(href).pathname : undefined);
15
- export const getHash = (href?: string) => (isURL(href) ? new URL(href).hash : undefined);
14
+ export const joinPath = (...path: string[]): string =>
15
+ path.filter(Boolean).join('/').replace(/\/+/g, '/');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redneckz/wildless-cms-uni-blocks",
3
- "version": "0.8.4",
3
+ "version": "0.8.6",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "author": "ЦК",
@@ -86,7 +86,7 @@ Carousel.childrenTypes = [
86
86
  ];
87
87
 
88
88
  const buildBlocks = (blocks?: BlockDef[], activeIndex?: number) => {
89
- return blocks && blocks[0].type === 'CarouselBankHistoryCard'
89
+ return blocks && blocks[0]?.type === 'CarouselBankHistoryCard'
90
90
  ? blocks.map((_, i) => {
91
91
  return {
92
92
  ..._,
@@ -1,13 +1,8 @@
1
- import { readFile } from 'fs/promises';
2
1
  import type { FallbackMap } from '../../model/Fallback';
3
2
  import { projectSettings } from '../../ProjectSettings';
3
+ import { fallbackWCMSResource } from '../../services/sitemap/fallbackWCMSResource';
4
4
 
5
5
  export const fallback = (): FallbackMap => ({
6
6
  ...fallbackWCMSResource(projectSettings.SITEMAP || 'sitemap'),
7
7
  ...fallbackWCMSResource(projectSettings.FOOTER || 'footer'),
8
8
  });
9
-
10
- const fallbackWCMSResource = (filename: string): FallbackMap => ({
11
- [filename]: async () =>
12
- JSON.parse(await readFile(`./content/wcms-resources/${filename}.json`, 'utf-8')),
13
- });
@@ -3,25 +3,21 @@ import { useLink } from '../../hooks/useLink';
3
3
  import type { Fallback } from '../../model/Fallback';
4
4
  import type { LinkProps } from '../../model/LinkProps';
5
5
  import { projectSettings } from '../../ProjectSettings';
6
- import { mergeTopItems } from '../../services/sitemap/mergeTopItems';
7
6
  import type { SitemapDataProps, TopMenuItem } from '../../services/sitemap/SitemapProps';
8
7
  import { useSWRResource } from '../../services/sitemap/useSWRResource';
9
8
 
10
9
  export interface SitemapProps {
11
10
  className?: string;
12
- items?: TopMenuItem[];
13
11
  fallback?: Fallback;
14
12
  }
15
13
 
16
- export const Sitemap = JSX<SitemapProps>(({ className = '', items, fallback }) => {
14
+ export const Sitemap = JSX<SitemapProps>(({ className = '', fallback }) => {
17
15
  const link = useLink();
18
-
19
16
  const sitemap = useSWRResource<SitemapDataProps>(projectSettings.SITEMAP || 'sitemap', fallback);
20
- const mergedItems = mergeTopItems(sitemap.topItems, items);
21
17
 
22
18
  return (
23
19
  <div className={`flex flex-grow items-start justify-between gap-[54px] xl:gap-5 ${className}`}>
24
- {mergedItems?.map((_, i) => renderColumn(link(_), i))}
20
+ {sitemap.topItems?.map((_, i) => renderColumn(link(_), i))}
25
21
  </div>
26
22
  );
27
23
  });
@@ -1,14 +1,4 @@
1
- import { readFile } from 'fs/promises';
2
1
  import { projectSettings } from '../../ProjectSettings';
3
- import type { FallbackMap } from '../../model/Fallback';
2
+ import { fallbackWCMSResource } from '../../services/sitemap/fallbackWCMSResource';
4
3
 
5
- export const fallback = (): FallbackMap => ({
6
- [`/wcms-resources/${projectSettings.SITEMAP || 'sitemap'}.json`]: async () => {
7
- const data = await readFile(
8
- `./content/wcms-resources/${projectSettings.SITEMAP || 'sitemap'}.json`,
9
- 'utf-8',
10
- );
11
-
12
- return JSON.parse(data);
13
- },
14
- });
4
+ export const fallback = () => fallbackWCMSResource(projectSettings.SITEMAP || 'sitemap');
@@ -1,23 +1,38 @@
1
- import type { LinkProps, Target } from '../model/LinkProps';
1
+ import type { LinkProps } from '../model/LinkProps';
2
+ import { projectSettings } from '../ProjectSettings';
2
3
  import { useBlockRouter } from '../services/BlockRouter/useBlockRouter';
3
- import { isHash, isLocalURL } from '../utils/url';
4
+ import { isHash, isLocalURL, isURL, joinPath } from '../utils/url';
4
5
  import { handlerDecorator } from './handlerDecorator';
5
6
  import { useRouter } from './useRouter';
6
7
 
7
- interface ClickHandler {
8
- onClick(ev?: { preventDefault: () => void }): void;
8
+ interface PreventableEvent {
9
+ preventDefault: () => void;
9
10
  }
10
11
 
11
- export function useLink(
12
- isRemote?: boolean,
13
- ): <L extends Partial<LinkProps & ClickHandler>>(props: L) => L & ClickHandler {
12
+ interface Clickable {
13
+ onClick(ev?: PreventableEvent): void;
14
+ }
15
+
16
+ export function useLink(isRemote?: boolean) {
14
17
  const router = useRouter();
15
18
  const blockRouter = useBlockRouter();
16
19
 
17
- const handleLocalURL =
18
- (href: string | undefined, target?: Target) => (ev?: { preventDefault: () => void }) => {
20
+ return <L extends Partial<LinkProps & Clickable>>(props: L): L & Clickable => ({
21
+ ...props,
22
+ href:
23
+ projectSettings.BASE_PATH && props.href && !(isRemote || isURL(props.href))
24
+ ? joinPath(projectSettings.BASE_PATH, props.href)
25
+ : props.href,
26
+ 'aria-label': props.text,
27
+ onClick: handlerDecorator(handleHref(props), props),
28
+ });
29
+
30
+ function handleHref({ href, target, onClick }: Partial<LinkProps & Clickable>) {
31
+ return (ev?: PreventableEvent) => {
32
+ onClick && onClick(ev);
33
+
19
34
  if (isRemote || !isLocalURL(href, target)) {
20
- // Proceed with native handle
35
+ // Default routing
21
36
  return;
22
37
  }
23
38
 
@@ -29,14 +44,5 @@ export function useLink(
29
44
  router.push(href);
30
45
  }
31
46
  };
32
-
33
- return (props) => ({
34
- ...props,
35
- 'aria-label': props.text,
36
- onClick: handlerDecorator((ev?: { preventDefault: () => void }) => {
37
- props.onClick && props.onClick(ev);
38
-
39
- handleLocalURL(props.href, props.target)(ev);
40
- }, props),
41
- });
47
+ }
42
48
  }
@@ -15,7 +15,7 @@ interface EventMap {
15
15
  intersection: BlockIntersectionEvent;
16
16
  }
17
17
 
18
- const normalizeAnchor = (rawAnchor?: string) => rawAnchor?.replace('#', '');
18
+ const normalizeAnchor = (rawAnchor?: string) => rawAnchor?.replace('#', '') || '';
19
19
  const getURLWithAnchor = (rawAnchor?: string) =>
20
20
  `${globalThis.location?.pathname}#${normalizeAnchor(rawAnchor)}`;
21
21
 
@@ -0,0 +1,7 @@
1
+ import { readFile } from 'fs/promises';
2
+ import type { FallbackMap } from '../../model/Fallback';
3
+
4
+ export const fallbackWCMSResource = (filename: string): FallbackMap => ({
5
+ [`/wcms-resources/${filename}.json`]: async () =>
6
+ JSON.parse(await readFile(`./content/wcms-resources/${filename}.json`, 'utf-8')),
7
+ });
@@ -1,15 +1,6 @@
1
- import type { Router } from '../../hooks/useRouter';
2
- import { projectSettings } from '../../ProjectSettings';
3
1
  import { isURL, withoutQuery } from '../../utils/url';
4
2
 
5
3
  export const isHrefActive =
6
- (router: Router) =>
7
- ({ href }: { href?: string }): boolean => {
8
- const { BASE_PATH } = projectSettings;
9
- const relativeHref =
10
- BASE_PATH && href?.startsWith(BASE_PATH) ? href.substring(BASE_PATH.length) : href;
11
-
12
- return withoutQuery(isURL(href) ? router.href : router.pathname).startsWith(
13
- withoutQuery(relativeHref),
14
- );
15
- };
4
+ (router: { href?: string; pathname: string }) =>
5
+ ({ href }: { href?: string }): boolean =>
6
+ withoutQuery(isURL(href) ? router.href : router.pathname).startsWith(withoutQuery(href));
@@ -1,8 +1,11 @@
1
1
  import type { Router } from '../../hooks/useRouter';
2
+ import { projectSettings } from '../../ProjectSettings';
2
3
  import { isHrefActive } from './isHrefActive';
3
4
  import { TopMenuItem } from './SitemapProps';
4
5
 
5
6
  export const isTopItemActive =
6
7
  (router: Router) =>
7
8
  (topItem: TopMenuItem): boolean =>
8
- topItem.items?.some(isHrefActive(router)) || isHrefActive(router)(topItem);
9
+ projectSettings.BASE_PATH
10
+ ? isHrefActive({ pathname: projectSettings.BASE_PATH })(topItem)
11
+ : topItem.items?.some(isHrefActive(router)) || isHrefActive(router)(topItem);
@@ -2,8 +2,8 @@ import { useAsyncData } from '@redneckz/uni-jsx/lib/hooks/useAsyncData';
2
2
  import type { Fallback } from '../../model/Fallback';
3
3
  import { fetchJSONUnsafe } from '../../utils/fetchJSON';
4
4
 
5
- export function useSWRResource<Data>(fileName: string, fallback: Fallback = {}): Data {
6
- const { data } = useAsyncData<Data>(`/wcms-resources/${fileName}.json`, fetchJSONUnsafe, {
5
+ export function useSWRResource<Data>(filename: string, fallback: Fallback = {}): Data {
6
+ const { data } = useAsyncData<Data>(`/wcms-resources/${filename}.json`, fetchJSONUnsafe, {
7
7
  fallback,
8
8
  });
9
9
 
@@ -26,7 +26,9 @@ useRouter.setup(() => {
26
26
 
27
27
  return {
28
28
  href,
29
- pathname: '',
29
+ pathname: projectSettings.BASE_PATH
30
+ ? new URL(href).pathname.substring(projectSettings.BASE_PATH.length - 1)
31
+ : '',
30
32
  query: {},
31
33
  push: (url: string) => {
32
34
  globalThis.history.pushState(null, '', url);
package/src/utils/url.ts CHANGED
@@ -8,8 +8,8 @@ export const isLocalURL = (href: string | undefined, target?: Target) =>
8
8
 
9
9
  export const isHash = (href?: string): href is `#${string}` => Boolean(href?.startsWith('#'));
10
10
 
11
- export const withoutQuery = (href?: string): string => (href || '').replace(/\/?\?.*/, '');
11
+ export const withoutQuery = (href?: string): string =>
12
+ (href || '').replace(/\?.*/, '').replace(/\/$/, '');
12
13
 
13
- export const getOrigin = (href?: string) => (isURL(href) ? new URL(href).origin : undefined);
14
- export const getPathname = (href?: string) => (isURL(href) ? new URL(href).pathname : undefined);
15
- export const getHash = (href?: string) => (isURL(href) ? new URL(href).hash : undefined);
14
+ export const joinPath = (...path: string[]): string =>
15
+ path.filter(Boolean).join('/').replace(/\/+/g, '/');
@@ -1,2 +0,0 @@
1
- import type { LinkProps } from '../../model/LinkProps';
2
- export declare const mergeTopItems: <L extends LinkProps>(left?: L[] | undefined, right?: L[] | undefined) => L[];
@@ -1,2 +0,0 @@
1
- import type { LinkProps } from '../../model/LinkProps';
2
- export declare const mergeTopItems: <L extends LinkProps>(left?: L[] | undefined, right?: L[] | undefined) => L[];
@@ -1,8 +0,0 @@
1
- Object.defineProperty(exports, "__esModule", { value: true });
2
- exports.mergeTopItems = void 0;
3
- const cmp = (a) => (b) => a?.href === b?.href;
4
- const substitute = (items, substitution) => (items || []).map((_) => substitution?.find(cmp(_)) || _);
5
- const subtract = (minuend, subtrahend) => (minuend || []).filter((_) => !subtrahend?.find(cmp(_)));
6
- const mergeTopItems = (left, right) => substitute(left, right).concat(subtract(right, left));
7
- exports.mergeTopItems = mergeTopItems;
8
- //# sourceMappingURL=mergeTopItems.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mergeTopItems.js","sourceRoot":"","sources":["../../../src/services/sitemap/mergeTopItems.ts"],"names":[],"mappings":";;AAEA,MAAM,GAAG,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,CAAC;AAEtE,MAAM,UAAU,GAAG,CAAsB,KAAW,EAAE,YAAkB,EAAO,EAAE,CAC/E,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAE5D,MAAM,QAAQ,GAAG,CAAsB,OAAa,EAAE,UAAgB,EAAO,EAAE,CAC7E,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpD,MAAM,aAAa,GAAG,CAAsB,IAAU,EAAE,KAAW,EAAO,EAAE,CACjF,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAD3C,QAAA,aAAa,iBAC8B"}
@@ -1,2 +0,0 @@
1
- import type { LinkProps } from '../../model/LinkProps';
2
- export declare const mergeTopItems: <L extends LinkProps>(left?: L[] | undefined, right?: L[] | undefined) => L[];
@@ -1,5 +0,0 @@
1
- const cmp = (a) => (b) => a?.href === b?.href;
2
- const substitute = (items, substitution) => (items || []).map((_) => substitution?.find(cmp(_)) || _);
3
- const subtract = (minuend, subtrahend) => (minuend || []).filter((_) => !subtrahend?.find(cmp(_)));
4
- export const mergeTopItems = (left, right) => substitute(left, right).concat(subtract(right, left));
5
- //# sourceMappingURL=mergeTopItems.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mergeTopItems.js","sourceRoot":"","sources":["../../../src/services/sitemap/mergeTopItems.ts"],"names":[],"mappings":"AAEA,MAAM,GAAG,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,CAAC;AAEtE,MAAM,UAAU,GAAG,CAAsB,KAAW,EAAE,YAAkB,EAAO,EAAE,CAC/E,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAE5D,MAAM,QAAQ,GAAG,CAAsB,OAAa,EAAE,UAAgB,EAAO,EAAE,CAC7E,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAsB,IAAU,EAAE,KAAW,EAAO,EAAE,CACjF,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { LinkProps } from '../../model/LinkProps';
2
- export declare const mergeTopItems: <L extends LinkProps>(left?: L[] | undefined, right?: L[] | undefined) => L[];
@@ -1,2 +0,0 @@
1
- import type { LinkProps } from '../../model/LinkProps';
2
- export declare const mergeTopItems: <L extends LinkProps>(left?: L[] | undefined, right?: L[] | undefined) => L[];
@@ -1,8 +0,0 @@
1
- Object.defineProperty(exports, "__esModule", { value: true });
2
- exports.mergeTopItems = void 0;
3
- const cmp = (a) => (b) => a?.href === b?.href;
4
- const substitute = (items, substitution) => (items || []).map((_) => substitution?.find(cmp(_)) || _);
5
- const subtract = (minuend, subtrahend) => (minuend || []).filter((_) => !subtrahend?.find(cmp(_)));
6
- const mergeTopItems = (left, right) => substitute(left, right).concat(subtract(right, left));
7
- exports.mergeTopItems = mergeTopItems;
8
- //# sourceMappingURL=mergeTopItems.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mergeTopItems.js","sourceRoot":"","sources":["../../../src/services/sitemap/mergeTopItems.ts"],"names":[],"mappings":";;AAEA,MAAM,GAAG,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,CAAC;AAEtE,MAAM,UAAU,GAAG,CAAsB,KAAW,EAAE,YAAkB,EAAO,EAAE,CAC/E,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAE5D,MAAM,QAAQ,GAAG,CAAsB,OAAa,EAAE,UAAgB,EAAO,EAAE,CAC7E,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpD,MAAM,aAAa,GAAG,CAAsB,IAAU,EAAE,KAAW,EAAO,EAAE,CACjF,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAD3C,QAAA,aAAa,iBAC8B"}
@@ -1,2 +0,0 @@
1
- import type { LinkProps } from '../../model/LinkProps';
2
- export declare const mergeTopItems: <L extends LinkProps>(left?: L[] | undefined, right?: L[] | undefined) => L[];
@@ -1,5 +0,0 @@
1
- const cmp = (a) => (b) => a?.href === b?.href;
2
- const substitute = (items, substitution) => (items || []).map((_) => substitution?.find(cmp(_)) || _);
3
- const subtract = (minuend, subtrahend) => (minuend || []).filter((_) => !subtrahend?.find(cmp(_)));
4
- export const mergeTopItems = (left, right) => substitute(left, right).concat(subtract(right, left));
5
- //# sourceMappingURL=mergeTopItems.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mergeTopItems.js","sourceRoot":"","sources":["../../../src/services/sitemap/mergeTopItems.ts"],"names":[],"mappings":"AAEA,MAAM,GAAG,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,CAAC;AAEtE,MAAM,UAAU,GAAG,CAAsB,KAAW,EAAE,YAAkB,EAAO,EAAE,CAC/E,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAE5D,MAAM,QAAQ,GAAG,CAAsB,OAAa,EAAE,UAAgB,EAAO,EAAE,CAC7E,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAsB,IAAU,EAAE,KAAW,EAAO,EAAE,CACjF,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC"}
@@ -1,12 +0,0 @@
1
- import type { LinkProps } from '../../model/LinkProps';
2
-
3
- const cmp = (a?: LinkProps) => (b?: LinkProps) => a?.href === b?.href;
4
-
5
- const substitute = <L extends LinkProps>(items?: L[], substitution?: L[]): L[] =>
6
- (items || []).map((_) => substitution?.find(cmp(_)) || _);
7
-
8
- const subtract = <L extends LinkProps>(minuend?: L[], subtrahend?: L[]): L[] =>
9
- (minuend || []).filter((_) => !subtrahend?.find(cmp(_)));
10
-
11
- export const mergeTopItems = <L extends LinkProps>(left?: L[], right?: L[]): L[] =>
12
- substitute(left, right).concat(subtract(right, left));
@@ -1,12 +0,0 @@
1
- import type { LinkProps } from '../../model/LinkProps';
2
-
3
- const cmp = (a?: LinkProps) => (b?: LinkProps) => a?.href === b?.href;
4
-
5
- const substitute = <L extends LinkProps>(items?: L[], substitution?: L[]): L[] =>
6
- (items || []).map((_) => substitution?.find(cmp(_)) || _);
7
-
8
- const subtract = <L extends LinkProps>(minuend?: L[], subtrahend?: L[]): L[] =>
9
- (minuend || []).filter((_) => !subtrahend?.find(cmp(_)));
10
-
11
- export const mergeTopItems = <L extends LinkProps>(left?: L[], right?: L[]): L[] =>
12
- substitute(left, right).concat(subtract(right, left));