@rpcbase/router 0.92.0 → 0.93.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/dist/index.js +96 -46
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,56 +1,114 @@
|
|
|
1
1
|
import { useLocation } from "react-router";
|
|
2
2
|
export * from "react-router";
|
|
3
3
|
import { lazy, useEffect, useRef } from "react";
|
|
4
|
+
import { c } from "react/compiler-runtime";
|
|
4
5
|
const loadRoute = (importPromise) => {
|
|
5
6
|
const Component = lazy(async () => {
|
|
6
7
|
const module = await importPromise;
|
|
7
|
-
return {
|
|
8
|
+
return {
|
|
9
|
+
default: module.default
|
|
10
|
+
};
|
|
8
11
|
});
|
|
9
12
|
const loader = async (args) => {
|
|
10
13
|
const module = await importPromise;
|
|
11
14
|
if (!module.loader) return null;
|
|
12
15
|
return module.loader(args);
|
|
13
16
|
};
|
|
14
|
-
return {
|
|
17
|
+
return {
|
|
18
|
+
Component,
|
|
19
|
+
loader
|
|
20
|
+
};
|
|
15
21
|
};
|
|
16
|
-
const useApplyMeta = ({
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
const useApplyMeta = (t0) => {
|
|
23
|
+
const $ = c(12);
|
|
24
|
+
let t1;
|
|
25
|
+
if ($[0] !== t0) {
|
|
26
|
+
t1 = t0 === void 0 ? {} : t0;
|
|
27
|
+
$[0] = t0;
|
|
28
|
+
$[1] = t1;
|
|
29
|
+
} else {
|
|
30
|
+
t1 = $[1];
|
|
31
|
+
}
|
|
32
|
+
const {
|
|
33
|
+
defaultTitle: t2,
|
|
34
|
+
defaultMeta: t3,
|
|
35
|
+
pagesMeta: t4
|
|
36
|
+
} = t1;
|
|
37
|
+
const defaultTitle = t2 === void 0 ? "" : t2;
|
|
38
|
+
let t5;
|
|
39
|
+
if ($[2] !== t3) {
|
|
40
|
+
t5 = t3 === void 0 ? [] : t3;
|
|
41
|
+
$[2] = t3;
|
|
42
|
+
$[3] = t5;
|
|
43
|
+
} else {
|
|
44
|
+
t5 = $[3];
|
|
45
|
+
}
|
|
46
|
+
const defaultMeta = t5;
|
|
47
|
+
let t6;
|
|
48
|
+
if ($[4] !== t4) {
|
|
49
|
+
t6 = t4 === void 0 ? {} : t4;
|
|
50
|
+
$[4] = t4;
|
|
51
|
+
$[5] = t6;
|
|
52
|
+
} else {
|
|
53
|
+
t6 = $[5];
|
|
54
|
+
}
|
|
55
|
+
const pagesMeta = t6;
|
|
21
56
|
const location = useLocation();
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
document.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
document.head.appendChild(canonicalLink);
|
|
57
|
+
let t7;
|
|
58
|
+
let t8;
|
|
59
|
+
if ($[6] !== defaultMeta || $[7] !== defaultTitle || $[8] !== location.pathname || $[9] !== pagesMeta) {
|
|
60
|
+
t7 = () => {
|
|
61
|
+
const loadMeta = async () => {
|
|
62
|
+
let pageMeta = pagesMeta[location.pathname];
|
|
63
|
+
if (!pageMeta) {
|
|
64
|
+
pageMeta = {
|
|
65
|
+
title: defaultTitle,
|
|
66
|
+
meta: defaultMeta
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
document.title = pageMeta.title;
|
|
70
|
+
document.querySelectorAll("[data-react-meta]").forEach(_temp);
|
|
71
|
+
pageMeta.meta.forEach(_temp2);
|
|
72
|
+
const canonicalUrl = `${window.location.origin}${location.pathname}`;
|
|
73
|
+
const existingCanonical = document.querySelector('link[rel="canonical"]');
|
|
74
|
+
if (existingCanonical) {
|
|
75
|
+
existingCanonical.remove();
|
|
76
|
+
}
|
|
77
|
+
const canonicalLink = document.createElement("link");
|
|
78
|
+
canonicalLink.setAttribute("rel", "canonical");
|
|
79
|
+
canonicalLink.setAttribute("href", canonicalUrl);
|
|
80
|
+
canonicalLink.setAttribute("data-react-meta", "true");
|
|
81
|
+
document.head.appendChild(canonicalLink);
|
|
82
|
+
};
|
|
83
|
+
loadMeta();
|
|
50
84
|
};
|
|
51
|
-
|
|
52
|
-
|
|
85
|
+
t8 = [location.pathname, defaultTitle, defaultMeta, pagesMeta];
|
|
86
|
+
$[6] = defaultMeta;
|
|
87
|
+
$[7] = defaultTitle;
|
|
88
|
+
$[8] = location.pathname;
|
|
89
|
+
$[9] = pagesMeta;
|
|
90
|
+
$[10] = t7;
|
|
91
|
+
$[11] = t8;
|
|
92
|
+
} else {
|
|
93
|
+
t7 = $[10];
|
|
94
|
+
t8 = $[11];
|
|
95
|
+
}
|
|
96
|
+
useEffect(t7, t8);
|
|
53
97
|
};
|
|
98
|
+
function _temp(tag) {
|
|
99
|
+
return tag.remove();
|
|
100
|
+
}
|
|
101
|
+
function _temp2(meta) {
|
|
102
|
+
const metaElement = document.createElement("meta");
|
|
103
|
+
metaElement.setAttribute("data-react-meta", "true");
|
|
104
|
+
Object.entries(meta).forEach((t0) => {
|
|
105
|
+
const [key, value] = t0;
|
|
106
|
+
if (value) {
|
|
107
|
+
metaElement.setAttribute(key, value.toString());
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
document.head.appendChild(metaElement);
|
|
111
|
+
}
|
|
54
112
|
const NAVIGATION_GUARDS_STORE_KEY = "__rpcbaseNavigationGuardsStore";
|
|
55
113
|
const getNavigationGuardsStore = () => {
|
|
56
114
|
const globalAny = globalThis;
|
|
@@ -113,15 +171,7 @@ const useRegisterNavigationGuard = (guard) => {
|
|
|
113
171
|
return () => {
|
|
114
172
|
removeNavigationGuard(guard.id);
|
|
115
173
|
};
|
|
116
|
-
}, [
|
|
117
|
-
guard.id,
|
|
118
|
-
guard.enabled,
|
|
119
|
-
guard.message,
|
|
120
|
-
guard.priority,
|
|
121
|
-
guard.blockOnSearch,
|
|
122
|
-
guard.shouldBlockNavigation,
|
|
123
|
-
guard.shouldBlockUnload
|
|
124
|
-
]);
|
|
174
|
+
}, [guard.id, guard.enabled, guard.message, guard.priority, guard.blockOnSearch, guard.shouldBlockNavigation, guard.shouldBlockUnload]);
|
|
125
175
|
};
|
|
126
176
|
export {
|
|
127
177
|
getNavigationGuards,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/loadRoute.tsx","../src/useApplyMeta.tsx","../src/navigationGuards.ts"],"sourcesContent":["import { lazy } from \"react\"\nimport { LoaderFunction } from \"react-router\"\nimport { Loader, LoaderArgs } from \"@rpcbase/client\"\n\n\ntype RouteModule = {\n default: React.ComponentType<unknown>\n loader?: Loader\n}\n\ntype RouteWithLoader = {\n Component: React.LazyExoticComponent<React.ComponentType<unknown>>\n loader?: LoaderFunction\n}\n\nexport const loadRoute = (importPromise: Promise<RouteModule>): RouteWithLoader => {\n const Component = lazy(async () => {\n const module = await importPromise\n return { default: module.default }\n })\n\n const loader = async (args: LoaderArgs) => {\n const module = await importPromise\n if (!module.loader) return null\n return module.loader(args)\n }\n\n return { Component, loader: loader as unknown as LoaderFunction }\n}\n","import { useEffect } from \"react\"\nimport { useLocation } from \"react-router\"\n\n\ntype MetaAttributeValue = string | number | boolean | undefined\ntype MetaEntry = Record<string, MetaAttributeValue>\n\ntype PageMeta = {\n title: string\n meta: MetaEntry[]\n}\n\n\nexport const useApplyMeta = ({\n defaultTitle = \"\",\n defaultMeta = [],\n pagesMeta = {}\n}: {\n defaultTitle?: string\n defaultMeta?: MetaEntry[]\n pagesMeta?: Record<string, PageMeta>\n} = {}) => {\n const location = useLocation()\n\n useEffect(() => {\n const loadMeta = async () => {\n\n let pageMeta = pagesMeta[location.pathname]\n\n if (!pageMeta) {\n pageMeta = { title: defaultTitle, meta: defaultMeta }\n }\n\n document.title = pageMeta.title\n\n // Remove previous dynamically inserted tags\n document.querySelectorAll(\"[data-react-meta]\").forEach((tag) => tag.remove())\n\n // Inject new tags\n pageMeta.meta.forEach((meta) => {\n const metaElement = document.createElement(\"meta\")\n metaElement.setAttribute(\"data-react-meta\", \"true\")\n\n // Set all attributes from the meta object\n Object.entries(meta).forEach(([key, value]) => {\n if (value) {\n metaElement.setAttribute(key, value.toString())\n }\n })\n\n document.head.appendChild(metaElement)\n })\n\n // Update canonical link\n const canonicalUrl = `${window.location.origin}${location.pathname}`\n\n const existingCanonical = document.querySelector(\"link[rel=\\\"canonical\\\"]\")\n if (existingCanonical) {\n existingCanonical.remove()\n }\n\n const canonicalLink = document.createElement(\"link\")\n canonicalLink.setAttribute(\"rel\", \"canonical\")\n canonicalLink.setAttribute(\"href\", canonicalUrl)\n canonicalLink.setAttribute(\"data-react-meta\", \"true\")\n document.head.appendChild(canonicalLink)\n }\n\n loadMeta()\n }, [location.pathname, defaultTitle, defaultMeta, pagesMeta])\n}\n","import { useEffect, useRef } from \"react\"\nimport type { BlockerFunction } from \"react-router\"\n\n\nexport type NavigationGuard = {\n id: string\n enabled: boolean\n priority?: number\n message: string\n blockOnSearch?: boolean\n shouldBlockNavigation: BlockerFunction\n shouldBlockUnload: boolean\n}\n\ntype NavigationGuardsListener = () => void\n\ntype NavigationGuardsStore = {\n guards: Map<string, NavigationGuard>\n listeners: Set<NavigationGuardsListener>\n}\n\nconst NAVIGATION_GUARDS_STORE_KEY = \"__rpcbaseNavigationGuardsStore\"\n\nconst getNavigationGuardsStore = (): NavigationGuardsStore => {\n const globalAny = globalThis as {\n [NAVIGATION_GUARDS_STORE_KEY]?: NavigationGuardsStore\n }\n\n const existing = globalAny[NAVIGATION_GUARDS_STORE_KEY]\n if (existing) {\n return existing\n }\n\n const created: NavigationGuardsStore = {\n guards: new Map<string, NavigationGuard>(),\n listeners: new Set<NavigationGuardsListener>(),\n }\n\n globalAny[NAVIGATION_GUARDS_STORE_KEY] = created\n return created\n}\n\nconst notify = (): void => {\n getNavigationGuardsStore().listeners.forEach((listener) => {\n listener()\n })\n}\n\nconst isSameGuard = (a: NavigationGuard, b: NavigationGuard): boolean =>\n a.id === b.id &&\n a.enabled === b.enabled &&\n a.priority === b.priority &&\n a.message === b.message &&\n a.blockOnSearch === b.blockOnSearch &&\n a.shouldBlockNavigation === b.shouldBlockNavigation &&\n a.shouldBlockUnload === b.shouldBlockUnload\n\nexport const upsertNavigationGuard = (guard: NavigationGuard): void => {\n const guards = getNavigationGuardsStore().guards\n const prev = guards.get(guard.id)\n if (prev && isSameGuard(prev, guard)) {\n return\n }\n\n guards.set(guard.id, guard)\n notify()\n}\n\nexport const removeNavigationGuard = (id: string): void => {\n const guards = getNavigationGuardsStore().guards\n const didDelete = guards.delete(id)\n if (didDelete) {\n notify()\n }\n}\n\nexport const getNavigationGuards = (): NavigationGuard[] =>\n Array.from(getNavigationGuardsStore().guards.values())\n\nexport const subscribeNavigationGuards = (\n listener: NavigationGuardsListener,\n): (() => void) => {\n const listeners = getNavigationGuardsStore().listeners\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport const useRegisterNavigationGuard = (guard: NavigationGuard): void => {\n const latestGuardRef = useRef(guard)\n latestGuardRef.current = guard\n\n const lastIdRef = useRef<string | null>(null)\n\n useEffect(() => {\n const lastId = lastIdRef.current\n if (lastId && lastId !== guard.id) {\n removeNavigationGuard(lastId)\n }\n lastIdRef.current = guard.id\n\n if (!guard.enabled) {\n removeNavigationGuard(guard.id)\n return\n }\n\n upsertNavigationGuard(latestGuardRef.current)\n return () => {\n removeNavigationGuard(guard.id)\n }\n }, [\n guard.id,\n guard.enabled,\n guard.message,\n guard.priority,\n guard.blockOnSearch,\n guard.shouldBlockNavigation,\n guard.shouldBlockUnload,\n ])\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/loadRoute.tsx","../src/useApplyMeta.tsx","../src/navigationGuards.ts"],"sourcesContent":["import { lazy } from \"react\"\nimport { LoaderFunction } from \"react-router\"\nimport { Loader, LoaderArgs } from \"@rpcbase/client\"\n\n\ntype RouteModule = {\n default: React.ComponentType<unknown>\n loader?: Loader\n}\n\ntype RouteWithLoader = {\n Component: React.LazyExoticComponent<React.ComponentType<unknown>>\n loader?: LoaderFunction\n}\n\nexport const loadRoute = (importPromise: Promise<RouteModule>): RouteWithLoader => {\n const Component = lazy(async () => {\n const module = await importPromise\n return { default: module.default }\n })\n\n const loader = async (args: LoaderArgs) => {\n const module = await importPromise\n if (!module.loader) return null\n return module.loader(args)\n }\n\n return { Component, loader: loader as unknown as LoaderFunction }\n}\n","import { useEffect } from \"react\"\nimport { useLocation } from \"react-router\"\n\n\ntype MetaAttributeValue = string | number | boolean | undefined\ntype MetaEntry = Record<string, MetaAttributeValue>\n\ntype PageMeta = {\n title: string\n meta: MetaEntry[]\n}\n\n\nexport const useApplyMeta = ({\n defaultTitle = \"\",\n defaultMeta = [],\n pagesMeta = {}\n}: {\n defaultTitle?: string\n defaultMeta?: MetaEntry[]\n pagesMeta?: Record<string, PageMeta>\n} = {}) => {\n const location = useLocation()\n\n useEffect(() => {\n const loadMeta = async () => {\n\n let pageMeta = pagesMeta[location.pathname]\n\n if (!pageMeta) {\n pageMeta = { title: defaultTitle, meta: defaultMeta }\n }\n\n document.title = pageMeta.title\n\n // Remove previous dynamically inserted tags\n document.querySelectorAll(\"[data-react-meta]\").forEach((tag) => tag.remove())\n\n // Inject new tags\n pageMeta.meta.forEach((meta) => {\n const metaElement = document.createElement(\"meta\")\n metaElement.setAttribute(\"data-react-meta\", \"true\")\n\n // Set all attributes from the meta object\n Object.entries(meta).forEach(([key, value]) => {\n if (value) {\n metaElement.setAttribute(key, value.toString())\n }\n })\n\n document.head.appendChild(metaElement)\n })\n\n // Update canonical link\n const canonicalUrl = `${window.location.origin}${location.pathname}`\n\n const existingCanonical = document.querySelector(\"link[rel=\\\"canonical\\\"]\")\n if (existingCanonical) {\n existingCanonical.remove()\n }\n\n const canonicalLink = document.createElement(\"link\")\n canonicalLink.setAttribute(\"rel\", \"canonical\")\n canonicalLink.setAttribute(\"href\", canonicalUrl)\n canonicalLink.setAttribute(\"data-react-meta\", \"true\")\n document.head.appendChild(canonicalLink)\n }\n\n loadMeta()\n }, [location.pathname, defaultTitle, defaultMeta, pagesMeta])\n}\n","import { useEffect, useRef } from \"react\"\nimport type { BlockerFunction } from \"react-router\"\n\n\nexport type NavigationGuard = {\n id: string\n enabled: boolean\n priority?: number\n message: string\n blockOnSearch?: boolean\n shouldBlockNavigation: BlockerFunction\n shouldBlockUnload: boolean\n}\n\ntype NavigationGuardsListener = () => void\n\ntype NavigationGuardsStore = {\n guards: Map<string, NavigationGuard>\n listeners: Set<NavigationGuardsListener>\n}\n\nconst NAVIGATION_GUARDS_STORE_KEY = \"__rpcbaseNavigationGuardsStore\"\n\nconst getNavigationGuardsStore = (): NavigationGuardsStore => {\n const globalAny = globalThis as {\n [NAVIGATION_GUARDS_STORE_KEY]?: NavigationGuardsStore\n }\n\n const existing = globalAny[NAVIGATION_GUARDS_STORE_KEY]\n if (existing) {\n return existing\n }\n\n const created: NavigationGuardsStore = {\n guards: new Map<string, NavigationGuard>(),\n listeners: new Set<NavigationGuardsListener>(),\n }\n\n globalAny[NAVIGATION_GUARDS_STORE_KEY] = created\n return created\n}\n\nconst notify = (): void => {\n getNavigationGuardsStore().listeners.forEach((listener) => {\n listener()\n })\n}\n\nconst isSameGuard = (a: NavigationGuard, b: NavigationGuard): boolean =>\n a.id === b.id &&\n a.enabled === b.enabled &&\n a.priority === b.priority &&\n a.message === b.message &&\n a.blockOnSearch === b.blockOnSearch &&\n a.shouldBlockNavigation === b.shouldBlockNavigation &&\n a.shouldBlockUnload === b.shouldBlockUnload\n\nexport const upsertNavigationGuard = (guard: NavigationGuard): void => {\n const guards = getNavigationGuardsStore().guards\n const prev = guards.get(guard.id)\n if (prev && isSameGuard(prev, guard)) {\n return\n }\n\n guards.set(guard.id, guard)\n notify()\n}\n\nexport const removeNavigationGuard = (id: string): void => {\n const guards = getNavigationGuardsStore().guards\n const didDelete = guards.delete(id)\n if (didDelete) {\n notify()\n }\n}\n\nexport const getNavigationGuards = (): NavigationGuard[] =>\n Array.from(getNavigationGuardsStore().guards.values())\n\nexport const subscribeNavigationGuards = (\n listener: NavigationGuardsListener,\n): (() => void) => {\n const listeners = getNavigationGuardsStore().listeners\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport const useRegisterNavigationGuard = (guard: NavigationGuard): void => {\n const latestGuardRef = useRef(guard)\n latestGuardRef.current = guard\n\n const lastIdRef = useRef<string | null>(null)\n\n useEffect(() => {\n const lastId = lastIdRef.current\n if (lastId && lastId !== guard.id) {\n removeNavigationGuard(lastId)\n }\n lastIdRef.current = guard.id\n\n if (!guard.enabled) {\n removeNavigationGuard(guard.id)\n return\n }\n\n upsertNavigationGuard(latestGuardRef.current)\n return () => {\n removeNavigationGuard(guard.id)\n }\n }, [\n guard.id,\n guard.enabled,\n guard.message,\n guard.priority,\n guard.blockOnSearch,\n guard.shouldBlockNavigation,\n guard.shouldBlockUnload,\n ])\n}\n"],"names":["loadRoute","importPromise","Component","lazy","module","default","loader","args","useApplyMeta","t0","$","_c","t1","undefined","defaultTitle","t2","defaultMeta","t3","pagesMeta","t4","t5","t6","location","useLocation","t7","t8","pathname","loadMeta","pageMeta","meta","document","title","querySelectorAll","forEach","_temp","_temp2","canonicalUrl","window","origin","existingCanonical","querySelector","remove","canonicalLink","createElement","setAttribute","head","appendChild","useEffect","tag","metaElement","Object","entries","key","value","toString","NAVIGATION_GUARDS_STORE_KEY","getNavigationGuardsStore","globalAny","globalThis","existing","created","guards","Map","listeners","Set","notify","listener","isSameGuard","a","b","id","enabled","priority","message","blockOnSearch","shouldBlockNavigation","shouldBlockUnload","upsertNavigationGuard","guard","prev","get","set","removeNavigationGuard","didDelete","delete","getNavigationGuards","Array","from","values","subscribeNavigationGuards","add","useRegisterNavigationGuard","latestGuardRef","useRef","current","lastIdRef","lastId"],"mappings":"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"}
|