@vef-framework/starter 1.0.128 → 1.0.129

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 (48) hide show
  1. package/cjs/api.cjs +1 -16
  2. package/cjs/app.cjs +1 -26
  3. package/cjs/components/index.cjs +1 -19
  4. package/cjs/components/vef-access-denied-page/index.cjs +1 -26
  5. package/cjs/components/vef-access-denied-page/props.cjs +0 -2
  6. package/cjs/components/vef-app/index.cjs +1 -18
  7. package/cjs/components/vef-app/props.cjs +0 -2
  8. package/cjs/components/vef-dev-assistant/index.cjs +4 -132
  9. package/cjs/components/vef-dev-assistant/props.cjs +0 -2
  10. package/cjs/components/vef-error-page/index.cjs +1 -23
  11. package/cjs/components/vef-error-page/props.cjs +0 -2
  12. package/cjs/components/vef-login-page/index.cjs +1 -40
  13. package/cjs/components/vef-login-page/props.cjs +0 -2
  14. package/cjs/components/vef-not-found-page/index.cjs +1 -25
  15. package/cjs/components/vef-not-found-page/props.cjs +0 -2
  16. package/cjs/components/vef-router-provider/index.cjs +1 -21
  17. package/cjs/components/vef-router-provider/props.cjs +0 -2
  18. package/cjs/constants.cjs +1 -16
  19. package/cjs/helper.cjs +1 -21
  20. package/cjs/index.cjs +1 -46
  21. package/cjs/router.cjs +1 -66
  22. package/cjs/routes/access-denied.cjs +1 -13
  23. package/cjs/routes/index.cjs +1 -13
  24. package/cjs/routes/layout.cjs +1 -135
  25. package/cjs/routes/login.cjs +1 -30
  26. package/cjs/routes/root.cjs +1 -23
  27. package/cjs/store.cjs +1 -20
  28. package/esm/api.js +1 -14
  29. package/esm/app.js +1 -24
  30. package/esm/components/index.js +1 -9
  31. package/esm/components/vef-access-denied-page/index.js +1 -22
  32. package/esm/components/vef-app/index.js +1 -14
  33. package/esm/components/vef-dev-assistant/index.js +4 -128
  34. package/esm/components/vef-error-page/index.js +1 -19
  35. package/esm/components/vef-login-page/index.js +1 -36
  36. package/esm/components/vef-not-found-page/index.js +1 -21
  37. package/esm/components/vef-router-provider/index.js +1 -17
  38. package/esm/constants.js +1 -9
  39. package/esm/helper.js +1 -19
  40. package/esm/index.js +1 -21
  41. package/esm/router.js +1 -64
  42. package/esm/routes/access-denied.js +1 -11
  43. package/esm/routes/index.js +1 -6
  44. package/esm/routes/layout.js +1 -133
  45. package/esm/routes/login.js +1 -28
  46. package/esm/routes/root.js +1 -21
  47. package/esm/store.js +1 -18
  48. package/package.json +5 -5
package/esm/router.js CHANGED
@@ -1,65 +1,2 @@
1
1
  "use strict";
2
- import { createRouter as createRouter$1, createHashHistory, createBrowserHistory } from '@tanstack/react-router';
3
- import { VefText, VefLoadingPlaceholder } from '@vef-framework/components';
4
- import { showErrorNotification } from '@vef-framework/shared';
5
- import { createElement } from 'react';
6
-
7
- "use strict";
8
- const defaultGcTime = 10 * 60 * 1e3;
9
- function createRouter({
10
- routeTree,
11
- history
12
- }) {
13
- const router = createRouter$1({
14
- routeTree,
15
- trailingSlash: "never",
16
- caseSensitive: true,
17
- history: history === "hash" ? createHashHistory() : createBrowserHistory(),
18
- search: {
19
- strict: true
20
- },
21
- notFoundMode: "root",
22
- defaultPendingComponent: () => createElement(
23
- VefLoadingPlaceholder,
24
- {
25
- size: "large"
26
- }
27
- ),
28
- defaultPendingMs: 500,
29
- defaultPendingMinMs: 300,
30
- defaultSsr: false,
31
- defaultStructuralSharing: true,
32
- defaultHashScrollIntoView: {
33
- behavior: "smooth",
34
- block: "start",
35
- inline: "center"
36
- },
37
- defaultPreload: "intent",
38
- defaultPreloadDelay: 50,
39
- defaultPreloadGcTime: defaultGcTime,
40
- defaultGcTime,
41
- defaultOnCatch(error, errorInfo) {
42
- showErrorNotification(
43
- error.message || error.name,
44
- createElement(
45
- VefText,
46
- {
47
- color: "error",
48
- children: createElement("pre", {
49
- style: {
50
- maxHeight: "480px",
51
- overflowY: "auto",
52
- scrollbarWidth: "thin",
53
- scrollbarColor: "rgba(0, 0, 0, 0.2) transparent"
54
- },
55
- children: error.stack || errorInfo.componentStack || "No stack trace available"
56
- })
57
- }
58
- )
59
- );
60
- }
61
- });
62
- return router;
63
- }
64
-
65
- export { createRouter };
2
+ import{createRouter as l,createHashHistory as n,createBrowserHistory as s}from"@tanstack/react-router";import{VefText as c,VefLoadingPlaceholder as d}from"@vef-framework/components";import{showErrorNotification as u}from"@vef-framework/shared";import{createElement as r}from"react";const t=10*60*1e3;function f({routeTree:o,history:a}){return l({routeTree:o,trailingSlash:"never",caseSensitive:!0,history:a==="hash"?n():s(),search:{strict:!0},notFoundMode:"root",defaultPendingComponent:()=>r(d,{size:"large"}),defaultPendingMs:500,defaultPendingMinMs:300,defaultSsr:!1,defaultStructuralSharing:!0,defaultHashScrollIntoView:{behavior:"smooth",block:"start",inline:"center"},defaultPreload:"intent",defaultPreloadDelay:50,defaultPreloadGcTime:t,defaultGcTime:t,defaultOnCatch(e,i){u(e.message||e.name,r(c,{color:"error",children:r("pre",{style:{maxHeight:"480px",overflowY:"auto",scrollbarWidth:"thin",scrollbarColor:"rgba(0, 0, 0, 0.2) transparent"},children:e.stack||i.componentStack||"No stack trace available"})}))}})}export{f as createRouter};
@@ -1,12 +1,2 @@
1
1
  "use strict";
2
- import '../components/index.js';
3
- import VefAccessDeniedPage from '../components/vef-access-denied-page/index.js';
4
-
5
- "use strict";
6
- function createAccessDeniedRouteOptions() {
7
- return {
8
- component: VefAccessDeniedPage
9
- };
10
- }
11
-
12
- export { createAccessDeniedRouteOptions };
2
+ import"../components/index.js";import t from"../components/vef-access-denied-page/index.js";function e(){return{component:t}}export{e as createAccessDeniedRouteOptions};
@@ -1,7 +1,2 @@
1
1
  "use strict";
2
- export { createAccessDeniedRouteOptions } from './access-denied.js';
3
- export { createLayoutRouteOptions } from './layout.js';
4
- export { createLoginRouteOptions } from './login.js';
5
- export { createRootRoute } from './root.js';
6
-
7
- "use strict";
2
+ import{createAccessDeniedRouteOptions as t}from"./access-denied.js";import{createLayoutRouteOptions as c}from"./layout.js";import{createLoginRouteOptions as s}from"./login.js";import{createRootRoute as u}from"./root.js";export{t as createAccessDeniedRouteOptions,c as createLayoutRouteOptions,s as createLoginRouteOptions,u as createRootRoute};
@@ -1,134 +1,2 @@
1
1
  "use strict";
2
- import { jsx } from '@emotion/react/jsx-runtime';
3
- import { useRouter, useNavigate, useLocation, Outlet, redirect } from '@tanstack/react-router';
4
- import { VefIcon, VefLayout, VefLoadingPlaceholder } from '@vef-framework/components';
5
- import { useApiContext } from '@vef-framework/core';
6
- import { buildRouteParentMenusMappings } from '@vef-framework/shared';
7
- import { HomeIcon } from 'lucide-react';
8
- import { useMemo, useCallback } from 'react';
9
- import { INDEX_PAGE_PATH, ACCESS_DENIED_PAGE_PATH, LOGIN_PAGE_PATH } from '../constants.js';
10
- import { handleClientLogout } from '../helper.js';
11
- import { useAppStore } from '../store.js';
12
-
13
- "use strict";
14
- const indexBreadcrumbItem = {
15
- key: INDEX_PAGE_PATH,
16
- label: /* @__PURE__ */ jsx(VefIcon, { children: /* @__PURE__ */ jsx(HomeIcon, {}) })
17
- };
18
- function createLayoutRouteOptions({
19
- title,
20
- logo,
21
- getUserDescription
22
- }) {
23
- function LayoutComponent() {
24
- const router = useRouter();
25
- const navigate = useNavigate();
26
- const { pathname } = useLocation();
27
- const [menus, user, routeParentMenusMappings] = useAppStore((state) => [state.menus, state.user, state.routeParentMenusMappings]);
28
- const defaultOpenedMenuKeys = routeParentMenusMappings?.get(pathname)?.[1].map((it) => it.key);
29
- const breadcrumbItems = useMemo(() => {
30
- const mapping = routeParentMenusMappings?.get(pathname);
31
- if (!mapping) {
32
- return [];
33
- }
34
- const [currentMenu, parentMenus] = mapping;
35
- return [
36
- indexBreadcrumbItem,
37
- ...parentMenus.map((menu) => ({
38
- key: menu.key,
39
- label: menu.label,
40
- dropdownItems: menu.children.filter((child) => child.type !== "divider").map((child) => ({
41
- key: child.key,
42
- label: child.label
43
- }))
44
- })),
45
- {
46
- label: currentMenu.label
47
- }
48
- ];
49
- }, [pathname, routeParentMenusMappings]);
50
- const { logoutApi, fetchAuthenticatedUserApi } = useApiContext();
51
- const { mutate: logout } = logoutApi.useMutation();
52
- const handleLogout = useCallback(async () => {
53
- await logout();
54
- await handleClientLogout(router, fetchAuthenticatedUserApi);
55
- }, [logout, router, fetchAuthenticatedUserApi]);
56
- const handleMenuSwitch = useCallback((menuKey) => {
57
- navigate({
58
- to: menuKey
59
- });
60
- }, [navigate]);
61
- return /* @__PURE__ */ jsx(
62
- VefLayout,
63
- {
64
- activeMenuKey: pathname,
65
- breadcrumbItems,
66
- defaultOpenedMenuKeys,
67
- logo,
68
- menuItems: menus,
69
- title,
70
- userAvatar: user?.avatar,
71
- userDescription: getUserDescription?.(user),
72
- userGender: user?.gender,
73
- userName: user?.name,
74
- onActiveMenuKeyChange: handleMenuSwitch,
75
- onBreadcrumbClick: handleMenuSwitch,
76
- onLogout: handleLogout,
77
- children: /* @__PURE__ */ jsx(Outlet, {})
78
- }
79
- );
80
- }
81
- return {
82
- beforeLoad: ({ location }) => {
83
- const { isAuthenticated, routeParentMenusMappings } = useAppStore.getState();
84
- if (!isAuthenticated) {
85
- throw redirect({
86
- to: LOGIN_PAGE_PATH,
87
- search: {
88
- redirect: location.href
89
- }
90
- });
91
- }
92
- if (routeParentMenusMappings && !routeParentMenusMappings.has(location.pathname)) {
93
- throw redirect({
94
- to: ACCESS_DENIED_PAGE_PATH,
95
- replace: true
96
- });
97
- }
98
- },
99
- loader: async ({ context, location }) => {
100
- const { fetchAuthenticatedUserApi } = context;
101
- const {
102
- menus,
103
- permissions,
104
- ...user
105
- } = await fetchAuthenticatedUserApi.fetchQuery();
106
- const routeParentMenusMappings = Object.freeze(buildRouteParentMenusMappings(menus));
107
- useAppStore.setState({
108
- user: Object.freeze(user),
109
- menus: Object.freeze(menus),
110
- permissions: Object.freeze(new Set(permissions)),
111
- routeParentMenusMappings
112
- });
113
- if (!routeParentMenusMappings.has(location.pathname)) {
114
- throw redirect({
115
- to: ACCESS_DENIED_PAGE_PATH,
116
- replace: true
117
- });
118
- }
119
- },
120
- pendingComponent: () => /* @__PURE__ */ jsx(
121
- VefLoadingPlaceholder,
122
- {
123
- size: "large",
124
- tip: "系统加载中,请稍后..."
125
- }
126
- ),
127
- component: LayoutComponent,
128
- staleTime: Infinity,
129
- gcTime: 0,
130
- shouldReload: false
131
- };
132
- }
133
-
134
- export { createLayoutRouteOptions };
2
+ import{jsx as i}from"@emotion/react/jsx-runtime";import{useRouter as O,useNavigate as E,useLocation as _,Outlet as v,redirect as p}from"@tanstack/react-router";import{VefIcon as S,VefLayout as j,VefLoadingPlaceholder as z}from"@vef-framework/components";import{useApiContext as D}from"@vef-framework/core";import{buildRouteParentMenusMappings as G}from"@vef-framework/shared";import{HomeIcon as H}from"lucide-react";import{useMemo as N,useCallback as g}from"react";import{INDEX_PAGE_PATH as T,ACCESS_DENIED_PAGE_PATH as b,LOGIN_PAGE_PATH as x}from"../constants.js";import{handleClientLogout as R}from"../helper.js";import{useAppStore as l}from"../store.js";const K={key:T,label:i(S,{children:i(H,{})})};function U({title:A,logo:y,getUserDescription:M}){function P(){const o=O(),r=E(),{pathname:t}=_(),[s,n,a]=l(e=>[e.menus,e.user,e.routeParentMenusMappings]),u=a?.get(t)?.[1].map(e=>e.key),k=N(()=>{const e=a?.get(t);if(!e)return[];const[I,L]=e;return[K,...L.map(c=>({key:c.key,label:c.label,dropdownItems:c.children.filter(m=>m.type!=="divider").map(m=>({key:m.key,label:m.label}))})),{label:I.label}]},[t,a]),{logoutApi:w,fetchAuthenticatedUserApi:f}=D(),{mutate:d}=w.useMutation(),C=g(async()=>{await d(),await R(o,f)},[d,o,f]),h=g(e=>{r({to:e})},[r]);return i(j,{activeMenuKey:t,breadcrumbItems:k,defaultOpenedMenuKeys:u,logo:y,menuItems:s,title:A,userAvatar:n?.avatar,userDescription:M?.(n),userGender:n?.gender,userName:n?.name,onActiveMenuKeyChange:h,onBreadcrumbClick:h,onLogout:C,children:i(v,{})})}return{beforeLoad:({location:o})=>{const{isAuthenticated:r,routeParentMenusMappings:t}=l.getState();if(!r)throw p({to:x,search:{redirect:o.href}});if(t&&!t.has(o.pathname))throw p({to:b,replace:!0})},loader:async({context:o,location:r})=>{const{fetchAuthenticatedUserApi:t}=o,{menus:s,permissions:n,...a}=await t.fetchQuery(),u=Object.freeze(G(s));if(l.setState({user:Object.freeze(a),menus:Object.freeze(s),permissions:Object.freeze(new Set(n)),routeParentMenusMappings:u}),!u.has(r.pathname))throw p({to:b,replace:!0})},pendingComponent:()=>i(z,{size:"large",tip:"系统加载中,请稍后..."}),component:P,staleTime:1/0,gcTime:0,shouldReload:!1}}export{U as createLayoutRouteOptions};
@@ -1,29 +1,2 @@
1
1
  "use strict";
2
- import { jsx } from '@emotion/react/jsx-runtime';
3
- import { redirect } from '@tanstack/react-router';
4
- import { z } from '@vef-framework/shared';
5
- import '../components/index.js';
6
- import { INDEX_PAGE_PATH } from '../constants.js';
7
- import { useAppStore } from '../store.js';
8
- import VefLoginPage from '../components/vef-login-page/index.js';
9
-
10
- "use strict";
11
- function createLoginRouteOptions(props) {
12
- return {
13
- validateSearch: z.object({
14
- redirect: z.string().optional().default(INDEX_PAGE_PATH).catch(INDEX_PAGE_PATH)
15
- }),
16
- beforeLoad: ({ search }) => {
17
- if (useAppStore.getState().isAuthenticated) {
18
- const { redirect: redirectPath } = search;
19
- throw redirect({
20
- to: redirectPath,
21
- replace: true
22
- });
23
- }
24
- },
25
- component: () => /* @__PURE__ */ jsx(VefLoginPage, { ...props })
26
- };
27
- }
28
-
29
- export { createLoginRouteOptions };
2
+ import{jsx as c}from"@emotion/react/jsx-runtime";import{redirect as m}from"@tanstack/react-router";import{z as t}from"@vef-framework/shared";import"../components/index.js";import{INDEX_PAGE_PATH as r}from"../constants.js";import{useAppStore as p}from"../store.js";import a from"../components/vef-login-page/index.js";function n(o){return{validateSearch:t.object({redirect:t.string().optional().default(r).catch(r)}),beforeLoad:({search:e})=>{if(p.getState().isAuthenticated){const{redirect:i}=e;throw m({to:i,replace:!0})}},component:()=>c(a,{...o})}}export{n as createLoginRouteOptions};
@@ -1,22 +1,2 @@
1
1
  "use strict";
2
- import { jsxs, Fragment, jsx } from '@emotion/react/jsx-runtime';
3
- import { createRootRouteWithContext, Outlet } from '@tanstack/react-router';
4
- import '../components/index.js';
5
- import VefNotFoundPage from '../components/vef-not-found-page/index.js';
6
- import VefErrorPage from '../components/vef-error-page/index.js';
7
- import VefDevAssistant from '../components/vef-dev-assistant/index.js';
8
-
9
- "use strict";
10
- function createRootRoute() {
11
- return createRootRouteWithContext()({
12
- component: () => /* @__PURE__ */ jsxs(Fragment, { children: [
13
- /* @__PURE__ */ jsx(Outlet, {}),
14
- process.env.NODE_ENV === "development" && /* @__PURE__ */ jsx(VefDevAssistant, {})
15
- ] }),
16
- errorComponent: VefErrorPage,
17
- notFoundComponent: VefNotFoundPage,
18
- ssr: false
19
- });
20
- }
21
-
22
- export { createRootRoute };
2
+ import{jsxs as t,Fragment as r,jsx as o}from"@emotion/react/jsx-runtime";import{createRootRouteWithContext as e,Outlet as m}from"@tanstack/react-router";import"../components/index.js";import n from"../components/vef-not-found-page/index.js";import p from"../components/vef-error-page/index.js";import i from"../components/vef-dev-assistant/index.js";function s(){return e()({component:()=>t(r,{children:[o(m,{}),process.env.NODE_ENV==="development"&&o(i,{})]}),errorComponent:p,notFoundComponent:n,ssr:!1})}export{s as createRootRoute};
package/esm/store.js CHANGED
@@ -1,19 +1,2 @@
1
1
  "use strict";
2
- import { createStore } from '@vef-framework/shared';
3
-
4
- "use strict";
5
- const useAppStore = createStore(
6
- () => ({
7
- isAuthenticated: false
8
- }),
9
- {
10
- name: "APP",
11
- storage: "session",
12
- selector: (state) => ({
13
- isAuthenticated: state.isAuthenticated,
14
- token: state.token
15
- })
16
- }
17
- );
18
-
19
- export { useAppStore };
2
+ import{createStore as e}from"@vef-framework/shared";const s=e(()=>({isAuthenticated:!1}),{name:"APP",storage:"session",selector:t=>({isAuthenticated:t.isAuthenticated,token:t.token})});export{s as useAppStore};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vef-framework/starter",
3
3
  "type": "module",
4
- "version": "1.0.128",
4
+ "version": "1.0.129",
5
5
  "private": false,
6
6
  "description": "The starter of the VEF framework",
7
7
  "author": "Venus",
@@ -32,10 +32,10 @@
32
32
  "use-sync-external-store": "^1.4.0",
33
33
  "@tanstack/react-query-devtools": "5.69.0",
34
34
  "@tanstack/router-devtools": "^1.114.27",
35
- "@vef-framework/components": "1.0.128",
36
- "@vef-framework/core": "1.0.128",
37
- "@vef-framework/hooks": "1.0.128",
38
- "@vef-framework/shared": "1.0.128",
35
+ "@vef-framework/components": "1.0.129",
36
+ "@vef-framework/core": "1.0.129",
37
+ "@vef-framework/hooks": "1.0.129",
38
+ "@vef-framework/shared": "1.0.129",
39
39
  "lucide-react": "0.484.0",
40
40
  "motion": "12.6.0",
41
41
  "nprogress": "^0.2.0"