react-router-manage
Version:
react-router-manage extends react-router(v6), it Including authentication, configuration, addition, deletion and modification
1,354 lines (1,353 loc) • 32.2 kB
JavaScript
/**
* React Router Manage v2.0.4
*
* Copyright (c) onshinpei Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE.md file in the root directory of this source tree.
*
* @license MIT
*/
import {
useNavigate as e,
generatePath as t,
useLocation as n,
useParams as r,
Navigate as o,
matchPath as u
} from "react-router";
export {
AbortedDeferredError,
Await,
MemoryRouter,
Navigate,
NavigationType,
Outlet,
Route,
Router,
RouterProvider,
Routes,
UNSAFE_DataRouterContext,
UNSAFE_DataRouterStateContext,
UNSAFE_LocationContext,
UNSAFE_NavigationContext,
UNSAFE_RouteContext,
createMemoryRouter,
createPath,
createRoutesFromChildren,
createRoutesFromElements,
defer,
generatePath,
isRouteErrorResponse,
json,
matchPath,
matchRoutes,
parsePath,
redirect,
renderMatches,
resolvePath,
unstable_useBlocker,
useActionData,
useAsyncError,
useAsyncValue,
useHref,
useInRouterContext,
useLoaderData,
useLocation,
useMatch,
useMatches,
useNavigation,
useNavigationType,
useOutlet,
useOutletContext,
useParams,
useResolvedPath,
useRevalidator,
useRouteError,
useRouteLoaderData,
useRoutes
} from "react-router";
import {
Router as s,
Navigate as a,
useLocation as i,
useRoutes as c
} from "react-router-dom";
export {
Form,
Link,
NavLink,
ScrollRestoration,
UNSAFE_useScrollRestoration,
createBrowserRouter,
createHashRouter,
useBeforeUnload,
useFetcher,
useFetchers,
useFormAction,
useLinkClickHandler,
useSearchParams,
useSubmit
} from "react-router-dom";
import * as l from "react";
import {
useMemo as p,
useState as m,
useLayoutEffect as h,
useRef as f,
useCallback as d,
Suspense as R,
useReducer as E,
useImperativeHandle as _,
useEffect as A
} from "react";
import { unstable_batchedUpdates as y } from "react-dom";
import {
createBrowserHistory as b,
createHashHistory as g
} from "@remix-run/router";
import { stringify as v, parse as M } from "query-string";
const C = l.createContext(null);
function T() {
return l.useContext(C).history;
}
function U() {
return l.useContext(C).routeHooksRef;
}
function w({ basename: e, children: t, syncUpdateCurrentRoute: n }) {
const r = l.useRef(null),
o = l.useRef(null);
if (null == r.current) {
const e = b({ window, v5Compat: !0 });
(r.current = { ...e, back: () => e.go(-1), forward: () => e.go(1) }),
(o.current = []);
}
const u = p(
() => ({
history: r.current,
routeHooks: o.current,
routeHooksRef: o,
historyMethods: {
push: r.current.push,
replace: r.current.replace,
go: r.current.go,
back: r.current.back,
forward: r.current.forward
}
}),
[]
),
a = r.current,
[i, c] = l.useState({ action: a.action, location: a.location });
return (
l.useLayoutEffect(() => {
let e = !0;
const t = a.listen(t => {
const { location: r } = t;
e &&
y(() => {
c(t), n(r);
});
});
return () => {
(e = !1), t();
};
}, [a, n]),
l.createElement(
C.Provider,
{ value: u },
l.createElement(
s,
{
basename: e,
location: i.location,
navigationType: i.action,
navigator: a
},
t
)
)
);
}
function P({ basename: e, children: t, syncUpdateCurrentRoute: n }) {
const r = l.useRef(null),
o = l.useRef(null);
if (null == r.current) {
const e = g({ window, v5Compat: !0 });
(r.current = { ...e, back: () => e.go(-1), forward: () => e.go(1) }),
(o.current = []);
}
const u = p(
() => ({
history: r.current,
routeHooks: o.current,
routeHooksRef: o,
historyMethods: {
push: r.current.push,
replace: r.current.replace,
go: r.current.go
}
}),
[]
),
a = r.current,
[i, c] = l.useState({ action: a.action, location: a.location });
return (
l.useLayoutEffect(() => {
let e = !0;
const t = a.listen(t => {
const { location: r } = t;
e &&
y(() => {
c(t), n(r);
});
});
return () => {
(e = !1), t();
};
}, [a, n]),
l.createElement(
C.Provider,
{ value: u },
l.createElement(
s,
{
basename: e,
location: i.location,
navigationType: i.action,
navigator: a
},
t
)
)
);
}
C.displayName = "MRouterHistoryContext";
const L = {
401: {
title: "401 NO PERMISSION",
img: "//ysf.qiyukf.net/yx/9c9ce7793b3c0657da5d80e740a89681"
},
404: {
title: "404 NOT FOUND",
img: "https://ysf.nosdn.127.net/ysh/6be90dea7806767fe65e7b48982b7a61"
}
},
O = ({ code: e = "401" }) => {
const t = L[e];
return l.createElement(
"div",
{
style: {
display: "flex",
justifyContent: "center",
alignItems: "center",
background: "white",
height: "100%",
flexDirection: "column",
borderRadius: 8
}
},
l.createElement("img", { alt: t.title, width: 200, src: t?.img }),
l.createElement(
"div",
{
style: {
color: "#666666",
lineHeight: "22px",
textAlign: "center",
marginTop: 16
}
},
t.title
)
);
};
O.displayName = "NoAuth";
const N = ({ name: e, component: t }) => {
const { routesMap: n, currentRoute: r } = H(),
o = n[e];
return e === r.name
? t
? l.createElement(t, null)
: l.createElement(l.Fragment, null)
: l.createElement(a, { to: o.path || "" });
},
S = ({ tip: e = "加载中" }) => l.createElement("div", null, e),
D = {
LoadingComponent: () =>
l.createElement(
l.Fragment,
null,
l.createElement(S, { tip: "应用正在加载中…" })
)
};
function x(e, t) {
let n;
return e
? (!(function(e) {
if (e instanceof Function) return !0;
return !1;
})(e)
? ue(e.path)
? (n = function() {
return l.createElement(a, { to: e.path });
})
: ue(e.name) &&
(n = function() {
return l.createElement(N, { name: e.name, component: t });
})
: (n = e),
n)
: n;
}
const k = ({ beforeEnter: e, Component: t, beforeEachMount: n }) => {
const [r, o] = m({ Component: void 0 }),
{ currentRoute: u } = H();
h(() => {
let r = !0;
return (
n
? n(u, n => {
if (!r) return;
const s = x(n, t);
e
? e(u, e => {
if (!r) return;
const n = x(e, s || t);
o({ Component: n || s || t });
})
: o({ Component: s || t });
})
: e &&
e(u, e => {
if (!r) return;
const n = x(e, t);
o({ Component: n || t });
}),
() => {
r = !1;
}
);
}, [t, u, e, n]);
const s = D.LoadingComponent;
return r.Component
? l.createElement(r.Component, null)
: l.createElement(s, null);
},
I = () => l.createElement(O, { code: "404" });
function F(e, t) {
const n = window.location.pathname,
r = U(),
o = t?.beforeunload,
u = f(o);
(u.current = o),
h(() => {
const t = r.current,
o = { name: "BeforeRouterLeave", pathname: n, fn: e };
t.push(o);
const s = u.current,
a = e => s?.(e);
return (
s && window.addEventListener("beforeunload", a),
() => {
const e = t.indexOf(o);
t.splice(e, 1), s && window.removeEventListener("beforeunload", a);
}
);
}, [e, n, r]);
}
const $ = () => {
const n = e();
return d(
(e, r = {}) => {
if (
(r?.params && "string" == typeof e && (e = t(e, r.params)),
r?.query && "string" == typeof e)
) {
let t = e;
const n = v(r.query);
(t = t.includes("?") ? `${t}&${n}` : `${t}?${n}`), (e = t);
}
return n(e, r);
},
[n]
);
};
function H() {
const e = n(),
t = f({}),
{
routesMap: o,
inputRoutes: u,
currentRoute: s,
flattenRoutes: a,
authInputRoutes: i,
basename: c
} = l.useContext(pe).state;
t.current !== o && (t.current = o);
const m = p(() => M(e.search), [e.search]),
h = r();
return {
navigate: $(),
routesMap: o,
query: m,
params: h,
routes: u,
authRoutes: i,
currentRoute: s,
flattenRoutes: a,
location: e,
basename: c
};
}
const j = () => {
const { currentRoute: e } = H(),
t = p(() => {
if (!e) return "";
const t = e._itemsAndChildren || [],
n = t?.find(e => e._isHasAuth);
return n?.path || "";
}, [e]);
let n = !1;
return (
e.parent?.component || (n = !0),
t ? l.createElement(o, { to: t, replace: n }) : l.createElement(O, null)
);
};
function B(e = "", t = "/", n) {
return e.startsWith(t)
? e
: e === t
? t
: e.startsWith("/")
? t.endsWith("/")
? `${t}${e.slice(1)}`
: `${t}${e}`
: n
? B(e, n)
: t.endsWith("/")
? `${t}${e}`
: `${t}/${e}`;
}
function q(e) {
const { routes: t, parent: n, basename: r = "/", _level: o = 1 } = e;
if (!t) return [];
return (function e(t, n, o = 1) {
return t.map(t => {
const { path: u, items: s, children: a, ...i } = t,
c = {
...i,
path: K(B(u, r, n?.path)),
parent: n,
_level: o,
_relativePath: u
};
return (
s && (c.items = e(s, c, o + 1)), a && (c.children = e(a, c, o + 1)), c
);
});
})(t, n, o);
}
function W(e) {
const {
inputRoutes: t,
permissionList: n,
permissionMode: r,
hasAuth: o,
beforeEachMount: u,
basename: s,
location: a
} = e,
i = te({
routes: t,
permissionList: n,
permissionMode: r,
hasAuth: o,
beforeEachMount: u
}),
c = G(i, void 0, !0);
"children" === r &&
o &&
c.forEach(e => {
const t = e.route;
if (!t._currentIsHasAuth) return;
let n = t;
for (; n; )
(n._isHasAuth = !0),
(n._component = n._currentComponent),
(n = n.parent);
}),
(function(e, t, n) {
const r = B("*", t),
o = e.some(({ path: e }) => e === r);
if (o) return;
const u = {
name: "notFound",
title: "notFound",
meta: {},
path: r,
component: I,
_isHasAuth: !0,
_component: I,
_relativePath: r,
_level: 0,
_route: {
_relativePath: r,
_level: 0,
name: "notFound",
title: "notFound",
meta: {},
path: r,
component: I
}
};
n.push(u), e.push({ path: r, score: e.length, route: u });
})(c, s, i),
c.sort((e, t) => t.score - e.score);
const l = c.map(e => e.route),
p = J(c),
m = Q(a.pathname, p, l);
return {
authInputRoutes: i,
flattenRoutes: l,
routesMap: p,
currentRoute: m,
currentPathRoutes: X(m),
beforeEachMount: u
};
}
const V = /^:\w+$/,
z = e => "*" === e;
function Y(e, t) {
let n = e.split("/"),
r = n.length;
return (
n.some(z) && (r += -2),
t && (r += 2),
n
.filter(e => !z(e))
.reduce((e, t) => e + (V.test(t) ? 3 : "" === t ? 1 : 10), r)
);
}
const G = (e, t, n) =>
e.reduce((e, r) => {
t && (r.parent = t);
const o = { path: r.path, route: r, score: Y(r.path, !1) };
if (Array.isArray(r.items) || Array.isArray(r.children)) {
let t = e.concat(o);
return (
Array.isArray(r.items) && (t = t.concat(G(r.items, r, n))),
Array.isArray(r.children) && n && (t = t.concat(G(r.children, r, n))),
t
);
}
return e.concat(o);
}, []),
J = e => {
const t = {};
return (
(function(e, t, n = []) {
Object.keys(t)
.filter(e => !n.includes(e))
.forEach(n => {
Object.defineProperty(e, n, {
get: () => {
const e = t[n];
return Array.isArray(e) ? e[e.length - 1] : e;
}
});
});
})(
t,
e.reduce((e, t) => {
const { route: n } = t,
{ name: r, path: o } = n;
if (e[r])
throw new Error(
`Router config 'name' isn't unique, route name: "${r}", route path: "${o}"`
);
const u = e[o];
if (u) {
const t = u[u.length - 1];
if (!t?.name || t.name !== n.parentAbs?.name)
throw new Error(
`There are routes at the same level with the same path, route name: "${r}", route path: "${o}"`
);
e[o] = [...u, n];
} else e[o] = [n];
return (e[r] = n), e;
}, {})
),
t
);
};
function K(e) {
return e && e.endsWith("/") ? e.slice(0, -1) : e;
}
function Q(e = window.location.pathname, t, n) {
let r = t[(e = K(e))];
if (!r) {
const t = n.find(t => !!u({ path: t.path }, e));
if (t) return t;
}
return (
r ||
(r = {
_isHasAuth: !0,
_relativePath: "",
_level: 0,
name: "404",
path: e,
title: "404",
meta: {},
component: () => l.createElement(O, { code: "404" }),
_route: {
_level: 0,
_relativePath: "",
name: "404",
path: e,
title: "404",
component: () => l.createElement(O, { code: "404" })
}
}),
r
);
}
function X(e) {
const t = [];
let n = e;
for (; n; ) t.unshift(n), (n = n.parent);
return t;
}
function Z(e, t) {
return t.includes(e);
}
function ee({ code: e, permissionList: t, hasAuth: n, route: r }) {
return (
!n ||
!e ||
(Array.isArray(e)
? 0 === e.length || e.some(e => Z(e, t))
: e instanceof Function
? !!(function(e, t) {
return e(t);
})(e, r)
: Z(e, t))
);
}
function te(e) {
const {
routes: t,
permissionList: n = [],
permissionMode: r,
hasAuth: u,
beforeEachMount: s,
parent: a,
parentAbs: i
} = e;
return t.map(e => {
const {
component: t,
code: c = "",
children: p,
items: m,
beforeEnter: h,
redirect: f,
meta: d,
type: R
} = e;
let E = [],
_ = [],
A = t;
A || (A = j);
const y = {};
(h || s) &&
((y.beforeEnter = h),
(y.beforeEachMount = s),
(y.key = e.name),
(y._route = e),
(y.Component = A),
(A = k));
const b = ee({ code: c, permissionList: n, hasAuth: u, route: e }),
g = !1 !== a?._isHasAuth && b,
v = {
...e,
parent: a,
parentAbs: i,
props: y,
meta: d || {},
items: [],
children: [],
_route: e,
_isHasAuth: g,
_currentComponent: A,
_currentIsHasAuth: b
};
p &&
(E = te({
routes: p,
permissionList: n,
permissionMode: r,
hasAuth: u,
beforeEachMount: s,
parent: v,
parentAbs: v
})),
m &&
(_ = te({
routes: m,
permissionList: n,
permissionMode: r,
hasAuth: u,
beforeEachMount: s,
parent: v,
parentAbs: i
}));
const M = [..._, ...E];
if (!g) {
return {
...v,
children: E,
items: _,
_component: O,
_itemsAndChildren: M
};
}
if (f)
return {
...v,
children: E,
items: _,
_component: () => l.createElement(o, { to: f, replace: !0 }),
_itemsAndChildren: M
};
if ("null" === R)
return {
...v,
children: E,
items: _,
_component: void 0,
_itemsAndChildren: M
};
if (A)
return {
...v,
children: E,
items: _,
_component: A,
_itemsAndChildren: M
};
{
const t = oe(e, n, u);
if (t) {
let n = !1;
return (
e.parent?.component || (n = !0),
{
...v,
children: E,
items: _,
_component: () => l.createElement(o, { to: t, replace: n }),
_itemsAndChildren: M
}
);
}
return { ...v, items: [], children: [], _component: O };
}
});
}
function ne(e) {
return "/" === e ? e : e.replace(/\/*\**$/gm, "");
}
function re(e) {
if ("string" == typeof e) return ne(e);
const { pathname: t } = e;
return t ? { ...e, pathname: ne(t) } : e;
}
const oe = (e, t, n, r) => {
const { items: o } = e;
if (!o) return "";
if (!n) return o[0].path;
const u = o.find(e => e.index);
if (u) return u.path;
let s = "";
for (let a = 0; a < o?.length; a++) {
const e = o[a],
{ code: r, path: u } = e;
if (!r) {
s = u;
break;
}
if (ee({ code: r, permissionList: t, hasAuth: n, route: e })) {
s = u;
break;
}
}
return s;
};
function ue(e) {
return "string" == typeof e;
}
let se = 0;
function ae(e) {
const t = { current: null },
{ LoadingComponent: n, ...r } = e;
var o;
(se += 1),
n &&
((o = { LoadingComponent: n }),
Object.entries(o).forEach(([e, t]) => {
D[e] = t;
}));
const u = {
...r,
_isDefined: !0,
_defineId: se,
navigate: () => {
throw new Error("YSRouter navigate is not initialized");
},
_navigateRef: t
};
return (
Object.defineProperty(u, "navigate", {
get: () =>
t.current ||
(() => {
throw new Error("YSRouter navigate is not initialized");
})
}),
u
);
}
function ie(e) {
return e
? e.reduce((e, t) => e.concat(Array.isArray(t) ? ie(t) : t), [])
: [];
}
function ce(e) {
const t = {};
return {
inputRoutes: (function e(n, r) {
return n
? n.map(n => {
const o = { ...n, items: [], children: [], parent: r };
return (
(o.items = e(n.items, o)),
(o.children = e(n.children, o)),
(t[n.name] = o),
o
);
}, [])
: [];
})(e),
routesMap: t
};
}
let le = (function(e) {
return (
(e.UPDATE_INPUT_ROUTES = "UPDATE_INPUT_ROUTES"),
(e.UPDATE_CURRENT_ROUTE = "UPDATE_CURRENT_ROUTE"),
(e.UPDATE_STATE = "UPDATE_STATE"),
(e.ADD_ROUTES = "ADD_ROUTES"),
(e.REMOVE_ROUTES = "REMOVE_ROUTES"),
(e.UPDATE_ROUTES = "UPDATE_ROUTES"),
e
);
})({});
const pe = l.createContext({
state: {
inputRoutes: [],
authInputRoutes: [],
permissionList: [],
routesMap: {},
flattenRoutes: []
},
methods: {}
});
function me(e, t) {
const { type: n, payload: r } = t;
switch (n) {
case le.ADD_ROUTES:
return (function(e, t) {
let n = !1;
const r = t,
{ routesMap: o, inputRoutes: u } = ce(e.inputRoutes);
if (
(r.forEach(e => {
const { path: t, name: r, parentName: s } = e;
if (o[t] || o[r])
throw new Error(`新增路由 ${r} ${t} 已经存在,请修改`);
if (s) {
const t = o[s];
if (t) {
const r = q({ routes: [e], parent: t, _level: t._level + 1 });
(t.items = t.items || []), t.items.push(r[0]), (n = !0);
}
} else {
const t = q({ routes: [e], _level: 0 });
u.push(t[0]), (n = !0);
}
}),
n)
) {
const t = e._getNewStateByNewInputRoutes(u);
return { ...e, ...t, inputRoutes: [...u] };
}
return e;
})(e, r);
case le.REMOVE_ROUTES:
return (function(e, t) {
let n = !1;
const r = t,
{ routesMap: o, inputRoutes: u } = ce(e.inputRoutes);
if (
(r.forEach(e => {
const t = o[e];
if (t) {
const e = t.parent;
if (!e) {
const e = u.indexOf(t);
e > -1 && (u.splice(e, 1), (n = !0));
}
if (e && e.items) {
const r = e.items.indexOf(t);
r > -1 && (e.items.splice(r, 1), (n = !0));
}
}
}),
n)
) {
const t = e._getNewStateByNewInputRoutes(u);
return { ...e, ...t, inputRoutes: [...u] };
}
return e;
})(e, r);
case le.UPDATE_ROUTES:
return (function(e, t) {
let n = !1;
const r = t,
{ routesMap: o, inputRoutes: u } = ce(e.inputRoutes);
if (
(r.forEach(({ routeName: t, routeData: r }) => {
const u = o[t];
if (u) {
const t = u.parent,
o = q({
routes: [{ ...u, ...r }],
parent: t,
_level: (t?._level || 0) + 1,
basename: e.basename
});
t || (Object.assign(u, o[0]), (n = !0)),
t && t.items
? (t.items.splice(t.items.indexOf(u), 1, o[0]), (n = !0))
: t &&
t.children &&
(t.children.splice(t.children.indexOf(u), 1, o[0]),
(n = !0));
}
}),
n)
) {
const t = e._getNewStateByNewInputRoutes(u);
return { ...e, ...t, inputRoutes: [...u] };
}
return e;
})(e, r);
case le.UPDATE_INPUT_ROUTES:
return { ...e, inputRoutes: r };
case le.UPDATE_CURRENT_ROUTE:
return { ...e, currentRoute: r };
case le.UPDATE_STATE:
return { ...e, ...r };
default:
return { ...e };
}
}
function he() {
return l.useContext(pe).methods.addRoutes;
}
function fe() {
return l.useContext(pe).methods.removeRoutes;
}
function de() {
return l.useContext(pe).methods.updateRoutes;
}
pe.displayName = "MRouterContext";
let Re = new Map();
function Ee(e) {
const t = e.map(e => {
let t,
n = [];
const {
_component: r,
path: o,
items: u,
children: s,
_isHasAuth: a,
props: i
} = e;
if (r) {
const e = D.LoadingComponent;
if (!a)
return {
path: o.endsWith("*") ? o : `${o}/*`,
element: l.createElement(
R,
{ fallback: l.createElement(e, null) },
l.createElement(r, i)
)
};
(t = {
path: o,
element: l.createElement(
R,
{ fallback: l.createElement(e, null) },
l.createElement(r, i)
)
}),
s && (t.children = Ee(s)),
u && (n = Ee(u));
}
return [t, ...n].filter(e => void 0 !== e);
});
return ie(t);
}
const _e = [],
Ae = (
{
permissionList: e = _e,
permissionMode: t = "parent",
routerConfig: n,
hasAuth: r,
children: o
},
u
) => {
const s = T(),
a = i(),
m = f(a),
R = l.useContext(C).historyMethods,
y = U(),
b = $(),
{
routes: g = [],
basename: v = "/",
beforeEachMount: M,
autoDocumentTitle: w = !1,
_navigateRef: P
} = n;
P && (P.current = b);
const L = p(() => q({ routes: g, basename: v }), [v, g]),
O = f(L),
N = f(null),
S = p(
() => (
N.current ||
(N.current = (function(e) {
const {
inputRoutes: t,
hasAuth: n,
permissionList: r,
permissionMode: o,
beforeEachMount: u,
basename: s,
location: a,
_defineId: i
} = e,
c = Re.get(i);
if (c) {
const t = (function(e, t) {
return (
e.basename === t.basename &&
e.hasAuth === t.hasAuth &&
e.beforeEachMount === t.beforeEachMount &&
e.inputRoutes === t.inputRoutes &&
e.permissionList === t.permissionList
);
})(c.queryData, e);
if (t) return c.initialData;
}
const l = W({
inputRoutes: t,
permissionList: r,
permissionMode: o,
hasAuth: n,
beforeEachMount: u,
basename: s,
location: a
});
return Re.set(i, { queryData: e, initialData: l }), l;
})({
inputRoutes: L,
permissionList: e,
permissionMode: t,
hasAuth: r,
beforeEachMount: M,
basename: v,
location: m.current,
_defineId: n._defineId
})),
N.current
),
[v, M, r, L, e, t, n._defineId]
),
D = f(null),
x = d(
n =>
W({
inputRoutes: n,
permissionList: e,
permissionMode: t,
hasAuth: r,
beforeEachMount: M,
basename: v,
location: a
}),
[v, M, r, a, e, t]
);
D.current = x;
const [k, I] = E(me, {
...S,
inputRoutes: L,
permissionList: e,
permissionMode: t,
hasAuth: r,
basename: v,
_getNewStateByNewInputRoutes: D.current
});
_(u, () => ({
updateCurrentRoute(e) {
const { pathname: t } = e,
n = k.currentRoute,
r = Q(t, k.routesMap, k.flattenRoutes);
let o = k.currentPathRoutes;
r !== k.currentRoute && (o = X(r)),
I({
type: le.UPDATE_STATE,
payload: { currentRoute: r, currentPathRoutes: o, prevRoute: n }
});
}
})),
h(() => {
if (
k.permissionList === e &&
k.permissionMode === t &&
r === k.hasAuth &&
k.inputRoutes === L &&
k.beforeEachMount === M
)
return;
let n = k.inputRoutes;
if (
O.current === L &&
k.permissionList === e &&
k.permissionMode === t &&
r === k.hasAuth &&
k.beforeEachMount === M
)
return;
(O.current = L), (n = L);
const {
authInputRoutes: o,
flattenRoutes: u,
routesMap: s,
currentRoute: i,
currentPathRoutes: c
} = W({
inputRoutes: n,
permissionList: e,
permissionMode: t,
hasAuth: r,
beforeEachMount: M,
basename: v,
location: a
});
I({
type: le.UPDATE_STATE,
payload: {
permissionList: e,
permissionMode: t,
authInputRoutes: o,
routesMap: s,
flattenRoutes: u,
currentRoute: i,
currentPathRoutes: c,
basename: v,
beforeEachMount: M,
inputRoutes: n
}
});
}, [
k.inputRoutes,
L,
e,
k.permissionList,
t,
k.permissionMode,
r,
k.hasAuth,
v,
M,
a,
k.beforeEachMount
]),
A(() => {
if (!w) return;
let e = "";
"boolean" == typeof w
? (e = k.currentPathRoutes.map(e => e.title).join("-"))
: "function" == typeof w && (e = w(k.currentPathRoutes)),
(document.title = e);
}, [w, k.currentPathRoutes]);
const F = d(
(e, t) => {
"string" != typeof t && (t = t?.pathname);
const n = window.location.pathname,
r = (function(e, t, n) {
return n.filter(n => n.name === e && n.pathname === t);
})("BeforeRouterLeave", n, y.current);
if (
(k.currentRoute?.beforeLeave &&
r.unshift({
name: "BeforeRouterLeave",
pathname: k.currentRoute.path,
fn: k.currentRoute.beforeLeave
}),
!r.length)
)
return e();
!(function(e) {
const { to: t, from: n, callbacks: r, finish: o } = e;
0 === r.length
? o()
: (function e(u = 0) {
const s = r[u];
if (!s) return o();
s.fn(t, n, () => {
e(u + 1);
});
})(0);
})({
to: Q(t, k.routesMap, k.flattenRoutes),
from: Q(n, k.routesMap, k.flattenRoutes),
callbacks: r,
finish: () => e()
});
},
[
y,
k.currentRoute.beforeLeave,
k.currentRoute.path,
k.routesMap,
k.flattenRoutes
]
);
h(() => {
!(function(e, t, n) {
(e.go = e => {
t(() => n.go(e));
}),
(e.push = (e, r) => {
(e = re(e)), t(() => n.push(e, r), e);
}),
(e.replace = (e, r) => {
(e = re(e)), t(() => n.replace(e, r), e);
}),
(e.back = () => {
t(() => n.go(-1));
}),
(e.forward = () => {
t(() => n.go(1));
});
})(s, F, R);
}, [F, s, R]);
const H = d(e => {
I({ type: le.ADD_ROUTES, payload: e });
}, []),
j = d(e => {
I({ type: le.REMOVE_ROUTES, payload: e });
}, []),
B = d(e => {
I({ type: le.UPDATE_ROUTES, payload: e });
}, []),
V = d(e => {
e && I({ type: le.UPDATE_CURRENT_ROUTE, payload: e });
}, []),
z = p(() => Ee(k.authInputRoutes), [k.authInputRoutes]),
Y = c(z),
G = p(() => (o ? o(Y) : Y), [o, Y]);
return l.createElement(
pe.Provider,
{
value: {
state: k,
methods: {
addRoutes: H,
updateCurrentRoute: V,
removeRoutes: j,
updateRoutes: B
}
}
},
G
);
},
ye = l.forwardRef(Ae);
ye.displayName = "MRouterContextProvider";
const be = ({
permissionList: e,
permissionMode: t,
wrapComponent: n,
hasAuth: r = !0,
routerConfig: o,
children: u,
RouterComponent: s
}) => {
const a = f(null),
i = d(e => {
a.current?.updateCurrentRoute?.(e);
}, []),
c = p(
() =>
u && "function" == typeof u
? u
: n
? ((n.displayName = "WrapComponent"),
function(e) {
return l.createElement(n, null, e);
})
: void 0,
[n, u]
);
return l.createElement(
s,
{ syncUpdateCurrentRoute: i },
l.createElement(
ye,
{
routerConfig: o,
permissionList: e,
permissionMode: t,
hasAuth: r,
ref: a
},
c
)
);
},
ge = e => l.createElement(be, Object.assign({}, e, { RouterComponent: w })),
ve = e => l.createElement(be, Object.assign({}, e, { RouterComponent: P }));
export {
ve as MHRouter,
ge as MRouter,
ae as defineRouterConfig,
he as useAddRoutes,
F as useBeforeLeave,
T as useHistory,
$ as useNavigate,
fe as useRemoveRoutes,
H as useRouter,
de as useUpdateRoutes
};