Browse Source

完善框架

main
李金 7 months ago
parent
commit
3cb25a8e8c
  1. 1
      package.json
  2. 17
      src/App.tsx
  3. 61
      src/components/config-provider/index.tsx
  4. 111
      src/components/icon/action/ActionIcon.tsx
  5. 37
      src/components/icon/action/Icons.tsx
  6. 8
      src/components/icon/action/index.tsx
  7. 37
      src/components/icon/action/style.ts
  8. 26
      src/components/icon/picker/Display.tsx
  9. 42
      src/components/icon/picker/IconRender.tsx
  10. 12
      src/components/icon/picker/index.tsx
  11. 15
      src/components/loading/FetchLoading.tsx
  12. 28
      src/components/loading/index.tsx
  13. 81
      src/components/loading/style.ts
  14. 11
      src/layout/RootLayout.tsx
  15. 127
      src/pages/system/menus/index.tsx
  16. 32
      src/pages/system/menus/store.ts
  17. 6
      src/routes.tsx
  18. 43
      src/service/base.ts
  19. 28
      src/service/system.ts
  20. 12
      src/store/route.ts
  21. 31
      src/store/system.ts
  22. 47
      src/store/user.ts
  23. 29
      src/theme/index.ts
  24. 15
      src/theme/themes/antdTheme.ts
  25. 19
      src/theme/themes/darkAlgorithm.ts
  26. 3
      src/theme/themes/index.ts
  27. 23
      src/theme/themes/token.ts
  28. 83
      src/types.d.ts
  29. 107
      src/utils/index.ts
  30. 33
      src/utils/uuid.ts
  31. 387
      yarn.lock

1
package.json

@ -20,6 +20,7 @@
"@tanstack/react-query": "^5.29.2",
"@tanstack/react-router": "^1.26.20",
"antd": "^5.16.1",
"antd-style": "^3.6.2",
"axios": "^1.6.8",
"dayjs": "^1.11.10",
"i18next": "^23.11.2",

17
src/App.tsx

@ -1,6 +1,8 @@
import ErrorPage from '@/components/error/error.tsx'
import { AppContextProvider } from '@/context.ts'
import { initI18n } from '@/i18n.ts'
import { appAtom, appStore, menuDataAtom, changeLanguage } from '@/store/system.ts'
import { appAtom, appStore, changeLanguage } from '@/store/system.ts'
import { userMenuDataAtom } from '@/store/user.ts'
import { IAppData } from '@/types'
import { ConfigProvider } from 'antd'
import { Provider, useAtom, useAtomValue } from 'jotai'
@ -13,18 +15,25 @@ import PageLoading from '@/components/page-loading'
function App() {
const [ appData, ] = useAtom(appAtom)
const { data, isError, error, isPending } = useAtomValue(menuDataAtom)
const { data = [], isError, error, isLoading, refetch } = useAtomValue(userMenuDataAtom)
useEffect(() => {
initI18n()
}, [])
useEffect(() => {
if (appData.token) {
refetch().then()
}
}, [ appData.token ])
if (isError) {
console.error(error)
return <div>Error</div>
return <ErrorPage error={error}/>
}
if (isPending) {
if (isLoading) {
return <PageLoading/>
}

61
src/components/config-provider/index.tsx

@ -0,0 +1,61 @@
import { ConfigProvider as AntdConfigProvider } from 'antd'
import { AntdToken, ThemeAppearance, useAntdToken, useThemeMode } from 'antd-style'
import type { OverrideToken } from 'antd/es/theme/interface'
import type { FC, ReactNode } from 'react'
import { ThemeProvider, createProAntdTheme, getProToken } from '@/theme'
export const useProAntdTheme = (appearance: ThemeAppearance) => {
const token = useAntdToken()
const themeConfig = createProAntdTheme(appearance)
const controlToken: Partial<AntdToken> = {
colorBgContainer: token?.colorFillQuaternary,
colorBorder: 'transparent',
controlOutline: 'transparent',
}
themeConfig.components = {
Input: controlToken,
InputNumber: controlToken,
Select: controlToken,
Tree: {
colorBgContainer: 'transparent',
},
TreeSelect: controlToken,
}
return themeConfig
}
export interface ConfigProviderProps {
componentToken?: OverrideToken;
children: ReactNode;
}
export const ConfigProvider: FC<ConfigProviderProps> = ({ children, componentToken }) => {
const { appearance, themeMode } = useThemeMode()
const proTheme = useProAntdTheme(appearance)
proTheme.components = { ...proTheme.components, ...componentToken }
return (
<AntdConfigProvider theme={proTheme}>
<ThemeProvider
appearance={appearance}
themeMode={themeMode}
// 以下都是自定义主题
theme={createProAntdTheme}
customToken={getProToken}
>
{children}
</ThemeProvider>
</AntdConfigProvider>
)
}
export const withProvider = (Component) => (props) => {
return (
<ConfigProvider>
<Component {...props} />
</ConfigProvider>
)
}

111
src/components/icon/action/ActionIcon.tsx

@ -0,0 +1,111 @@
import type { ButtonProps, TooltipProps } from 'antd'
import { Button, Tooltip } from 'antd'
import type { CSSProperties, FC } from 'react'
import { ConfigProvider } from '@/components/config-provider'
import { useStyles } from './style'
/**
* @title
* @description `Button` `title`, `type` `size`
*/
export interface ActionIconProps extends Omit<ButtonProps, 'title' | 'size'> {
/**
* @title
*/
cursor?: CSSProperties['cursor'];
/**
* @title
*/
title?: TooltipProps['title'];
/**
* @title
*/
placement?: TooltipProps['placement'];
/**
* @title
*/
icon: ButtonProps['icon'];
/**
* @title
*/
onClick?: ButtonProps['onClick'];
/**
* @title
*/
size?: 'default' | 'large' | number;
/**
* @description tooltip时间 0.5
* @default 0.5
*/
tooltipDelay?: number;
/**
* @description
* @default false
*/
arrow?: boolean;
}
const BaseActionIcon: FC<ActionIconProps> = ({
placement,
title,
icon,
cursor,
onClick,
className,
arrow = false,
size = 'default',
tooltipDelay = 0.5,
...restProps
}) => {
const { styles, cx } = useStyles({ size })
const Icon = (
<Button
icon={icon}
className={cx(styles.container, className)}
type={'text'}
style={{ cursor }}
size={typeof size === 'number' || size === 'default' ? 'middle' : size}
{...restProps}
onClick={onClick}
/>
)
return (
<>
{!title ? (
Icon
) : (
<Tooltip
arrow={arrow}
overlayClassName={styles.tooltip}
title={title}
mouseEnterDelay={tooltipDelay}
placement={placement}
>
{Icon}
</Tooltip>
)}
</>
)
}
const ActionIcon = (props: ActionIconProps) => {
const { size } = props || {}
const { theme: token } = useStyles({ size })
return (
<ConfigProvider
componentToken={{
Button: {
colorText: token.colorTextTertiary,
colorBgTextHover: token.colorFillSecondary,
colorBgTextActive: token.colorFill,
},
}}
>
<BaseActionIcon {...props} />
</ConfigProvider>
)
}
export default ActionIcon

37
src/components/icon/action/Icons.tsx

@ -0,0 +1,37 @@
import { DeleteFilled, EditFilled } from '@ant-design/icons'
import type { FC } from 'react'
import type { ActionIconProps } from './ActionIcon'
import ActionIcon from './ActionIcon'
export type IconsProps = Omit<ActionIconProps, 'icon'>;
const HandleIcon = (
<svg viewBox="0 0 20 20" width="16" fill="currentColor">
<path
d="M7 2a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 2zm0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 8zm0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 14zm6-8a2 2 0 1 0-.001-4.001A2 2 0 0 0 13 6zm0 2a2 2 0 1 0 .001 4.001A2 2 0 0 0 13 8zm0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 13 14z"/>
</svg>
)
const CollapseIcon = (
<svg width="10" viewBox="0 0 70 41" fill="currentColor">
<path
d="M30.76 39.2402C31.885 40.3638 33.41 40.995 35 40.995C36.59 40.995 38.115 40.3638 39.24 39.2402L68.24 10.2402C69.2998 9.10284 69.8768 7.59846 69.8494 6.04406C69.822 4.48965 69.1923 3.00657 68.093 1.90726C66.9937 0.807959 65.5106 0.178263 63.9562 0.150837C62.4018 0.123411 60.8974 0.700397 59.76 1.76024L35 26.5102L10.24 1.76024C9.10259 0.700397 7.59822 0.123411 6.04381 0.150837C4.4894 0.178263 3.00632 0.807959 1.90702 1.90726C0.807714 3.00657 0.178019 4.48965 0.150593 6.04406C0.123167 7.59846 0.700153 9.10284 1.75999 10.2402L30.76 39.2402Z"/>
</svg>
)
export const CollapseAction: FC<IconsProps> = (props) => (
<ActionIcon icon={CollapseIcon} {...props} />
)
export const HandleAction: FC<IconsProps> = (props) => (
<ActionIcon icon={HandleIcon} {...props} />
)
export const DeleteAction: FC<IconsProps> = (props) => (
<ActionIcon icon={<DeleteFilled/>} {...props} />
)
export const EditAction: FC<IconsProps> = (props) => (
<ActionIcon icon={<EditFilled/>} {...props} />
)

8
src/components/icon/action/index.tsx

@ -0,0 +1,8 @@
import ActionIcon from './ActionIcon'
export { default as ActionIcon } from './ActionIcon'
export type { ActionIconProps } from './ActionIcon'
export * from './Icons'
// 内部使用统一图标语义
export type { IconsProps } from './Icons'
export default ActionIcon

37
src/components/icon/action/style.ts

@ -0,0 +1,37 @@
import { createStyles } from '@/theme'
export const useStyles = createStyles(({ token, css, cx, prefixCls }, { size, className }) => {
const prefix = `${prefixCls}-${token.proPrefix}-icon`
const sizeBoundary =
typeof size === 'number'
? css`
width: ${size}px !important;
height: ${size}px !important;
`
: ''
const button = css`
display: flex;
align-items: center;
justify-content: center;
&:hover {
color: ${token.colorText} !important;
}
&:active {
scale: 0.8;
color: ${token.colorText};
}
transition: color 600ms ${token.motionEaseOut}, scale 400ms ${token.motionEaseOut},
background-color 100ms ${token.motionEaseOut};
`
return {
container: cx(prefix, button, sizeBoundary, className),
tooltip: css`
pointer-events: none;
`,
}
})

26
src/components/icon/picker/Display.tsx

@ -0,0 +1,26 @@
import { useToken } from '@/theme'
import React from 'react'
import Icon from '../index.tsx'
const Display = () => {
const token = useToken()
const DefaultIcon = (
<div
className={cx(css`
width: 8px;
height: 8px;
border-radius: 50%;
background: ${token.colorFillContent};
`)}
/>
)
return (
<Icon
onClick={togglePanel}
icon={!icon ? DefaultIcon : <IconItem {...icon} />}
/>
)
}
export default Display

42
src/components/icon/picker/IconRender.tsx

@ -0,0 +1,42 @@
import type { FC } from 'react'
import { memo } from 'react'
import AntdIcons from '../contents/antdIcons'
import { customIconList, registerCustomIcon } from '../contents/customIcons'
export interface IconRenderProps {
type: 'antd' | 'iconfont' | 'custom';
componentName?: string;
props?:
| {
type?: string;
}
| any;
scriptUrl?: string;
}
export interface IIconRender {
(props: IconRenderProps): JSX.Element;
}
const Render: FC<IconRenderProps> = memo(
({ type, componentName, props, scriptUrl }) => {
switch (type) {
case 'antd':
const Icon = AntdIcons[componentName]
return <Icon {...props} />
case 'iconfont':
const Iconfont = AntdIcons.createFromIconfontCN({
scriptUrl,
})
return <Iconfont {...props} />
}
},
)
const IconIRender = Render as IIconRender
IconIRender.registerCustomIcon = registerCustomIcon
export default IconIRender

12
src/components/icon/picker/index.tsx

@ -0,0 +1,12 @@
import React from 'react'
const Index = () => {
return (
<div>
</div>
)
}
export default Index

15
src/components/loading/FetchLoading.tsx

@ -0,0 +1,15 @@
import { useIsFetching, } from '@tanstack/react-query'
import Loading from './index.tsx'
const FetchLoading = () => {
const isFetching = useIsFetching()
return (
<>
<Loading loading={isFetching > 0}/>
</>
)
}
export default FetchLoading

28
src/components/loading/index.tsx

@ -0,0 +1,28 @@
import React from 'react'
import { useStyles } from './style.ts'
interface ILoading {
loading: boolean,
className?: string
}
export const Loading = ({ loading, className }: ILoading) => {
const { styles, cx } = useStyles({ className })
return (
<div className={cx(styles.container, styles.base, loading ? styles.visible : styles.hidden)}>
<div className={styles.centeredElement}>
<svg stroke="currentColor" fill="none" strokeWidth="0" viewBox="0 0 24 24" className={styles.svgIcon}
height="30px" width="30px" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.2" fillRule="evenodd" clipRule="evenodd"
d="M12 19C15.866 19 19 15.866 19 12C19 8.13401 15.866 5 12 5C8.13401 5 5 8.13401 5 12C5 15.866 8.13401 19 12 19ZM12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z"
fill="currentColor"></path>
<path d="M2 12C2 6.47715 6.47715 2 12 2V5C8.13401 5 5 8.13401 5 12H2Z" fill="currentColor"></path>
</svg>
</div>
</div>
)
}
export default Loading

81
src/components/loading/style.ts

@ -0,0 +1,81 @@
import { createStyles } from '@/theme'
// Define styles using createStyles
export const useStyles = createStyles(({ token, css, cx, prefixCls }, { className }) => {
const prefix = `${prefixCls}-${token.proPrefix}-loading`
return {
container: cx(prefix, className),
base: css`
--tw-translate-x: 0;
--tw-translate-y: -100%;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 300px;
transition: all 300ms;
z-index: 1130;
background: radial-gradient(closest-side, rgba(0, 10, 40, 0.2) 0%, rgba(0, 0, 0, 0) 100%);
transform: translate(0, var(--tw-translate-y)) rotate(0) skew(0) skewY(0) scaleX(0) scaleY(0);
&.dark {
height: 200px;
background-color: rgba(255, 255, 255, 0.1);
border-radius: 100%;
}
`,
hidden: css`
opacity: 0;
transform: translateY(-100%);
`,
visible: css`
opacity: 1;
transform: translateY(-35%);
`,
centeredElement: css`
--tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, .05), 0 4px 6px -2px rgba(0, 0, 0, .03);
--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -2px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
padding: 0.5rem;
background-color: rgba(255, 255, 255, 0.8);
border-radius: 0.5rem;
--tw-translate-y: 30px;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
--tw-translate-x: -50%;
top: 50%;
left: 50%;
position: absolute;
`,
svgIcon: css`
display: block;
vertical-align: middle;
stroke: currentColor;
fill: none;
stroke-width: 0;
height: 30px;
width: 30px;
color: rgb(17 24 39 / var(--tw-text-opacity));
font-size: 1.875rem;
line-height: 2.25rem;
animation-timeline: auto;
animation-range-start: normal;
animation-range-end: normal;
animation: 1s linear 0s infinite normal none running spin;
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
`
}
})

11
src/layout/RootLayout.tsx

@ -2,13 +2,15 @@ import PageBreadcrumb from '@/components/breadcrumb'
import ErrorPage from '@/components/error/error.tsx'
import SelectLang from '@/components/select-lang'
import { useTranslation } from '@/i18n.ts'
import { userMenuDataAtom } from '@/store/user.ts'
import { MenuItem } from '@/types'
import { ProConfigProvider, ProLayout, } from '@ant-design/pro-components'
import { CatchBoundary, Link, Outlet, useRouteContext } from '@tanstack/react-router'
import { CatchBoundary, Link, Outlet } from '@tanstack/react-router'
import { ConfigProvider, Dropdown } from 'antd'
import { useState } from 'react'
import Icon from '../components/icon'
import defaultProps from './_defaultProps'
import { useAtomValue } from 'jotai'
//根据menuData生成Breadcrumb所需的数据
@ -36,11 +38,7 @@ const getBreadcrumbData = (menuData: MenuItem[], pathname: string) => {
export default () => {
const { t } = useTranslation()
const { menuData } = useRouteContext({
from: undefined,
strict: false,
select: (state) => state
})
const { data: menuData = [], isLoading } = useAtomValue(userMenuDataAtom)
const items = getBreadcrumbData(menuData, location.pathname)
@ -85,6 +83,7 @@ export default () => {
}}
menu={{
collapsedShowGroupTitle: true,
loading: isLoading,
}}
avatarProps={{
src: 'https://gw.alipayobjects.com/zos/antfincdn/efFD%24IOql2/weixintupian_20170331104822.jpg',

127
src/pages/system/menus/index.tsx

@ -1,65 +1,98 @@
import { useTranslation } from '@/i18n.ts'
import { FlattenData } from '@/types'
import { IMenu } from '@/types/menus'
import { flattenTree } from '@/utils'
import { PageContainer, ProCard } from '@ant-design/pro-components'
import { Button, Space, Tree } from 'antd'
import { Button, Form, Input, Space, Tree } from 'antd'
import { useAtom, useAtomValue } from 'jotai'
import { menuDataAtom, selectedMenuAtom, selectedMenuIdAtom } from '@/store/system.ts'
import { formatterMenuData } from '@/utils/uuid.ts'
import { useEffect, useRef } from 'react'
import { menuDataAtom, selectedMenuAtom, selectedMenuIdAtom } from './store.ts'
import { CloseOutlined, PlusOutlined } from '@ant-design/icons'
import { createLazyFileRoute } from '@tanstack/react-router'
import { createLazyFileRoute } from '@tanstack/react-router'
const Menus = () => {
const { data, isLoading } = useAtomValue(menuDataAtom)
const [ currentMenu, setCurrentMenu ] = useAtom(selectedMenuAtom)
const [ selectedKey, setSelectedKey ] = useAtom(selectedMenuIdAtom)
const { t } = useTranslation()
const { data = [], isLoading } = useAtomValue(menuDataAtom)
const [ currentMenu, setCurrentMenu ] = useAtom(selectedMenuAtom)
const [ selectedKey, setSelectedKey ] = useAtom(selectedMenuIdAtom)
const flattenMenusRef = useRef<FlattenData<IMenu>[]>([])
const treeData = formatterMenuData(data!)
useEffect(() => {
return (
<PageContainer
breadcrumbRender={false} title={false}>
<ProCard split={'vertical'}
style={{
height: 'calc(100vh - 164px)',
overflow: 'auto',
}}
>
<ProCard title={'导航'}
colSpan={'350px'}
extra={
<Space>
<Button type="primary" size={'small'} icon={<PlusOutlined/>} shape={'circle'}/>
<Button type="default" danger={true} size={'small'} icon={<CloseOutlined/>}
shape={'circle'}/>
if (data.length) {
flattenMenusRef.current = flattenTree<IMenu>(data)
console.log(flattenMenusRef.current)
}
</Space>
}
loading={isLoading}>
<Tree treeData={treeData}
}, [ data ])
onSelect={(item) => {
setSelectedKey(item[0])
setCurrentMenu( data?.find((menu) => menu.id === item[0])!)
}}
checkable={true} showIcon={true}/>
</ProCard>
<ProCard title={'配置'}>
return (
<PageContainer
breadcrumbRender={false} title={false}>
<ProCard split={'vertical'}
style={{
height: 'calc(100vh - 164px)',
overflow: 'auto',
}}
>
<ProCard title={'导航'}
colSpan={'350px'}
extra={
<Space>
<Button type="primary" size={'small'} icon={<PlusOutlined/>} shape={'circle'}/>
<Button type="default" danger={true} size={'small'} icon={<CloseOutlined/>}
shape={'circle'}/>
{selectedKey}
{
JSON.stringify(currentMenu)
}
</Space>
}
loading={isLoading}>
<Tree treeData={data}
fieldNames={{
title: 'title',
key: 'id'
}}
onSelect={(item) => {
console.log(item)
setSelectedKey(item[0])
setCurrentMenu(flattenMenusRef.current?.find((menu) => menu.id === item[0]))
}}
checkable={true}
showIcon={false}
/>
</ProCard>
<ProCard title={'配置'} style={{
overflowX: 'hidden'
}}>
</ProCard>
<ProCard title={'按钮'} colSpan={7}>
<Form
initialValues={currentMenu}
labelCol={{ flex: '110px' }}
labelAlign="left"
labelWrap
wrapperCol={{ flex: 1 }}
colon={false}
style={{ maxWidth: 600 }}
>
<Form.Item label={t('system.menus.form.title', '菜单名称')} name={'title'}>
<Input/>
</Form.Item>
<Form.Item label={t('system.menus.form.parent', '上级菜单')}>
<Input/>
</Form.Item>
</Form>
</ProCard>
</ProCard>
</PageContainer>
)
</ProCard>
<ProCard title={'按钮'} colSpan={7}>
</ProCard>
</ProCard>
</PageContainer>
)
}
export const Route = createLazyFileRoute("/system/menus")({
component: Menus
export const Route = createLazyFileRoute('/system/menus')({
component: Menus
})

32
src/pages/system/menus/store.ts

@ -0,0 +1,32 @@
import systemServ from '@/service/system.ts'
import { IPage, IPageResult, MenuItem } from '@/types'
import { IMenu } from '@/types/menus'
import { atomWithQuery } from 'jotai-tanstack-query'
import { atom } from 'jotai/index'
export const menuPageAtom = atom<IPage>({})
export const menuDataAtom = atomWithQuery<IPageResult<IMenu[]>>((get) => {
return {
queryKey: [ 'menus', get(menuPageAtom) ],
queryFn: async ({ queryKey: [ , page ] }) => {
return await systemServ.menus.list(page)
},
select: (data) => {
return data.rows ?? []
}
}
})
export const selectedMenuIdAtom = atom<number>(0)
export const selectedMenuAtom = atom<MenuItem | unknown>(undefined)
export const byIdMenuAtom = atomWithQuery((get) => ({
queryKey: [ 'selectedMenu', get(selectedMenuIdAtom) ],
queryFn: async ({ queryKey: [ , id ] }) => {
return await systemServ.menus.info(id as number)
},
select: data => data.data,
}))

6
src/routes.tsx

@ -1,6 +1,7 @@
import NotPermission from '@/components/error/403.tsx'
import NotFound from '@/components/error/404.tsx'
import ErrorPage from '@/components/error/error.tsx'
import FetchLoading from '@/components/loading/FetchLoading.tsx'
import PageLoading from '@/components/page-loading'
import { Route as AuthenticatedImport } from '@/layout/_authenticated.tsx'
import EmptyLayout from '@/layout/EmptyLayout.tsx'
@ -35,7 +36,9 @@ export const queryClient = new QueryClient({
const rootRoute = createRootRouteWithContext<IRootContext>()({
component: () => (
<div>
<FetchLoading/>
<Outlet/>
<TanStackRouterDevtools position={'bottom-right'}/>
</div>
@ -45,6 +48,9 @@ const rootRoute = createRootRouteWithContext<IRootContext>()({
return redirect({ to: '/dashboard' })
}
},
loader: () => {
},
notFoundComponent: NotFound,
pendingComponent: PageLoading,
errorComponent: ({ error }) => <ErrorPage error={error}/>,

43
src/service/base.ts

@ -1,31 +1,28 @@
import { request, AxiosRequestConfig } from '@/request.ts'
import { IPage } from '@/types'
type TPage = {
page: number
pageSize: number
}
export const createCURD = <TParams, TResult>(api: string, options?: AxiosRequestConfig) => {
return {
list: (params?: TParams & TPage) => {
return request.post<TResult[]>(api, { ...options, params }).then(data=>data.data)
},
add: (data: TParams) => {
return request.post<TResult>(`${api}/add`, data, options)
},
update: (id: number, data: TParams) => {
return request.put(`${api}/${id}`, data, options)
},
delete: (id: number) => {
return request.delete(`${api}/delete`, { ...options, params: { id } })
},
batchDelete: (ids: number[]) => {
return request.delete(`${api}/deletes`, { ...options, params: { ids } })
},
info: (id: number) => {
return request.get<TResult>(`${api}/${id}`, options)
}
return {
list: (params?: TParams & IPage) => {
return request.post<TResult[]>(`${api}/list`, { ...options, params }).then(data => data.data)
},
add: (data: TParams) => {
return request.post<TResult>(`${api}/add`, data, options)
},
update: (id: number, data: TParams) => {
return request.put(`${api}/${id}`, data, options)
},
delete: (id: number) => {
return request.delete(`${api}/delete`, { ...options, params: { id } })
},
batchDelete: (ids: number[]) => {
return request.delete(`${api}/deletes`, { ...options, params: { ids } })
},
info: (id: number) => {
return request.get<TResult>(`${api}/${id}`, options)
}
}
}

28
src/service/system.ts

@ -4,22 +4,22 @@ import { createCURD } from '@/service/base.ts'
import { IMenu } from '@/types/menus'
const systemServ = {
dept: {
...createCURD('/sys/dept')
},
menus: {
...createCURD<any, IMenu>('/sys/menu')
},
login: (data: LoginRequest) => {
return request.post<LoginResponse>('/sys/login', data)
},
user:{
menus:()=>{
return request.get<IMenu[]>('/sys/user/menus')
}
dept: {
...createCURD('/sys/dept')
},
menus: {
...createCURD<any, IMenu>('/sys/menu')
},
login: (data: LoginRequest) => {
return request.post<LoginResponse>('/sys/login', data)
},
user: {
menus: () => {
return request.get<IMenu[]>('/sys/user/menus')
}
}
}

12
src/store/route.ts

@ -0,0 +1,12 @@
import { IRootContext } from '@/types'
import { atom } from 'jotai'
export const routeContextAtom = atom<IRootContext>({})
export const updateRouteContextAtom = atom(null, (set, get, update) => {
console.log(update)
set(routeContextAtom, {
...get(routeContextAtom),
...update,
})
})

31
src/store/system.ts

@ -1,5 +1,5 @@
import { IAppData, MenuItem } from '@/types'
import { formatMenuData } from '@/utils'
import { IMenu } from '@/types/menus'
import { atom, createStore } from 'jotai'
import { atomWithQuery } from 'jotai-tanstack-query'
import { atomWithStorage } from 'jotai/utils'
@ -19,7 +19,12 @@ export const appAtom = atomWithStorage<Partial<IAppData>>('app', {
})
appStore.sub(appAtom, () => {
const token = appStore.get(appAtom).token
const { data = [], refetch } = appStore.get(userMenuDataAtom)
//如果没有menus数据,则请求
if (token && data.length === 0) {
refetch()
}
})
@ -53,25 +58,3 @@ export const getToken = () => {
export const setToken = (token: string) => {
updateAppData({ token })
}
export const menuDataAtom = atomWithQuery((get) => ({
enabled: !!get(appAtom).token,
queryKey: [ 'user_menus', get(appAtom).token ],
queryFn: async () => {
return await systemServ.user.menus()
},
select: (data: AxiosResponse) => {
return formatMenuData(data.data.rows as any ?? [])
}
}))
export const selectedMenuIdAtom = atom<number>(0)
export const selectedMenuAtom = atom<MenuItem | unknown>(undefined)
export const byIdMenuAtom = atomWithQuery((get) => ({
queryKey: [ 'selectedMenu', get(selectedMenuIdAtom) ],
queryFn: async ({ queryKey: [ , id ] }) => {
return await systemServ.menus.info(id as number)
},
select: data => data.data,
}))

47
src/store/user.ts

@ -1,30 +1,47 @@
import { appAtom } from '@/store/system.ts'
import { AxiosResponse } from 'axios'
import { atom } from 'jotai/index'
import { IAuth } from '@/types'
import { LoginRequest } from '@/types/login'
import { atomWithMutation } from 'jotai-tanstack-query'
import { atomWithMutation, atomWithQuery, queryClientAtom } from 'jotai-tanstack-query'
import systemServ from '@/service/system.ts'
import { isDev } from '@/utils'
import { formatMenuData, isDev } from '@/utils'
export const authAtom = atom<IAuth>({
isLogin: false,
authKey: []
isLogin: false,
authKey: []
})
const devLogin = {
username: 'SupperAdmin',
password: 'kk123456',
code: '123456'
username: 'SupperAdmin',
password: 'kk123456',
code: '123456'
}
export const loginFormAtom = atom<LoginRequest>({
...(isDev ? devLogin : {})
...(isDev ? devLogin : {})
} as LoginRequest)
export const loginAtom = atomWithMutation<any, LoginRequest>(() => ({
mutationKey: [ 'login' ],
mutationFn: async (params) => {
return await systemServ.login(params)
},
onSuccess: (data) => {
console.log('login success', data)
}
mutationKey: [ 'login' ],
mutationFn: async (params) => {
return await systemServ.login(params)
},
onSuccess: () => {
// console.log('login success', data)
}
}))
export const userMenuDataAtom = atomWithQuery((get) => ({
enabled: false,
queryKey: [ 'user_menus', get(appAtom).token ],
queryFn: async () => {
return await systemServ.user.menus()
},
select: (data: AxiosResponse) => {
return formatMenuData(data.data.rows as any ?? [])
},
initialData: () => {
const queryClient = get(queryClientAtom)
return queryClient.getQueryData([ 'user_menus', get(appAtom).token ])
},
}))

29
src/theme/index.ts

@ -0,0 +1,29 @@
import { createInstance } from 'antd-style'
import { ProThemeToken } from './themes'
type ProToken = {
proPrefix: string;
};
declare module 'antd-style' {
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface CustomToken extends ProToken, ProThemeToken {
}
}
const { createStyles, ThemeProvider } = createInstance<ProToken>({
customToken: {
proPrefix: 'pro',
},
})
export {
createGlobalStyle,
css,
cx,
injectGlobal,
keyframes,
useAntdToken as useToken,
type AntdToken,
} from 'antd-style'
export * from './themes'
export { ThemeProvider, createStyles }

15
src/theme/themes/antdTheme.ts

@ -0,0 +1,15 @@
import { theme, ThemeConfig } from 'antd'
import { ThemeAppearance } from 'antd-style'
import { proDarkAlgorithm } from '@/theme'
export const createProAntdTheme = (appearance: ThemeAppearance) => {
const themeConfig: ThemeConfig = {
algorithm: [ theme.compactAlgorithm ],
}
if (appearance === 'dark') {
(themeConfig.algorithm as Array<any>).push(proDarkAlgorithm)
}
return themeConfig
}

19
src/theme/themes/darkAlgorithm.ts

@ -0,0 +1,19 @@
import { theme } from 'antd'
import type { MappingAlgorithm } from 'antd/es/theme/interface'
/**
* studio
* @param seedToken
* @param mapToken
*/
export const proDarkAlgorithm: MappingAlgorithm = (seedToken, mapToken) => {
const mergeToken = theme.darkAlgorithm(seedToken, mapToken)
return {
...mergeToken,
colorBgLayout: '#20252b',
colorBgContainer: '#282c34',
colorBgElevated: '#32363e',
}
}

3
src/theme/themes/index.ts

@ -0,0 +1,3 @@
export * from './antdTheme'
export * from './darkAlgorithm'
export * from './token'

23
src/theme/themes/token.ts

@ -0,0 +1,23 @@
import { GetCustomToken } from 'antd-style'
export interface ProThemeToken {
focusedOutlineColor: string;
colorTypeBoolean: string;
colorTypeNumber: string;
colorTypeString: string;
colorTypeBoolArray: string;
colorTypeNumberArray: string;
colorTypeStringArray: string;
}
export const getProToken: GetCustomToken<ProThemeToken> = () => ({
focusedOutlineColor: '#4c9ffe',
colorTypeBoolean: '#D8C152',
colorTypeNumber: '#5295C4',
colorTypeString: '#149E6D',
colorTypeBoolArray: '#D8C152',
colorTypeNumberArray: '#239BEF',
colorTypeStringArray: '#62AE8D',
})
export const themeToken = getProToken({} as any)

83
src/types.d.ts

@ -7,59 +7,88 @@ import { Attributes, ReactNode } from 'react'
export type LayoutType = 'list' | 'form' | 'tree' | 'normal'
export type IAppData = {
name: string;
version: string;
language: string;
baseUrl: string;
token: string;
device: string;
name: string;
version: string;
language: string;
baseUrl: string;
token: string;
device: string;
}
export type TRouter = {
router: Router & {
context: IRootContext
}
router: Router & {
context: IRootContext
}
}
export type IPage = {
page?: number
pageSize?: number
}
export type IPageResult<T = any> = IPage & {
rows: T[]
total: number
}
export type IApiResult<T = any> = {
code: number;
data: T;
message: string;
code: number;
data: T;
message: string;
}
export type TreeItem<T> = {
[key: keyof T]: T[keyof T];
children?: TreeItem<T>[];
}
export type FlattenData<T> = TreeItem<T> & {
key: string,
title?: string,
label?: string,
level?: number,
}
export type FiledNames = {
key?: string;
title?: string;
children?: string
}
export type IDataProps<T = any> = {
value?: T;
onChange?: (value: T) => void;
value?: T;
onChange?: (value: T) => void;
}
export type Props = Attributes & {
children?: ReactNode
children?: ReactNode
};
export interface IRootContext {
menuData: MenuItem[];
queryClient: QueryClient;
menuData: MenuItem[];
queryClient: QueryClient;
}
interface MenuItem extends IMenu {
routes?: MenuItem[];
routes?: MenuItem[];
}
interface IAuth {
isLogin: boolean;
authKey?: string[];
isLogin: boolean;
authKey?: string[];
}
declare module '@tanstack/react-router' {
interface Register {
router: TRouter
}
interface Register {
router: TRouter
}
interface AnyRoute {
options: RouteOptions & {
menu: MenuItem
}
interface AnyRoute {
options: RouteOptions & {
menu: MenuItem
}
}
}

107
src/utils/index.ts

@ -1,34 +1,93 @@
import { IMenu } from '@/types/menus'
import { MenuItem } from '@/types'
import { FiledNames, FlattenData, MenuItem, TreeItem } from '@/types'
import { getIcon } from '@/components/icon'
import { TreeDataNode } from 'antd'
//vite环境变量, 判断是否是开发环境
export const isDev = import.meta.env.MODE === 'development'
// 格式化菜单数据, 把children转换成routes
export const formatMenuData = (data: IMenu[]) => {
const result: MenuItem[] = []
for (const item of data) {
if (item.icon && typeof item.icon === 'string') {
item.icon = getIcon(item.icon as string, { size: '14', theme: 'filled' })
}
if (!item.children || !item.children.length) {
result.push({
...item,
key: item.name,
name: item.title
})
} else {
const { children, name, ...other } = item
result.push({
...other,
key: name,
name: other.title,
children: formatMenuData(children),
routes: formatMenuData(children),
})
}
const result: MenuItem[] = []
for (const item of data) {
if (item.icon && typeof item.icon === 'string') {
item.icon = getIcon(item.icon as string, { size: '14', theme: 'filled' })
}
return result
if (!item.children || !item.children.length) {
result.push({
...item,
key: item.name,
name: item.title
})
} else {
const { children, name, ...other } = item
result.push({
...other,
key: name,
name: other.title,
children: formatMenuData(children),
routes: formatMenuData(children),
})
}
}
return result
}
//把MenuItem[]转换成antd树形结构
export const formatterMenuData = (data: MenuItem[]): TreeDataNode[] => {
const result: TreeDataNode[] = []
for (const item of data) {
if (item.children && item.children.length) {
const { children, ...other } = item
result.push({
...other,
key: item.id!,
title: item.name!,
children: formatterMenuData(children),
})
} else {
result.push({
...item,
key: item.id!,
title: item.name!,
})
}
}
return result
}
//把tree转成平铺数组
const defaultTreeFieldNames: FiledNames = {
key: 'id',
title: 'title',
children: 'children'
}
export function flattenTree<T>(tree: TreeItem<T>[], fieldNames: {
key: string;
title: string;
children: string
} = defaultTreeFieldNames): FlattenData<T>[] {
const result: FlattenData<T>[] = []
function flattenRecursive(item: TreeItem<T>, level: number) {
const data: FlattenData<T> = {
...item,
key: item[fieldNames.key],
title: item[fieldNames.title],
level,
}
result.push(data)
if (item.children) {
item.children.forEach((child) => flattenRecursive(child, level + 1))
}
}
tree.forEach((item) => flattenRecursive(item, 0))
return result
}

33
src/utils/uuid.ts

@ -2,32 +2,9 @@ import { MenuItem } from '@/types'
import { TreeDataNode } from 'antd'
export function generateUUID() {
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
return crypto.randomUUID();
} else {
return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
}
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
return crypto.randomUUID()
} else {
return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)
}
}
//把MenuItem[]转换成antd树形结构
export const formatterMenuData = (data: MenuItem[]): TreeDataNode[] => {
const result: TreeDataNode[] = []
for (const item of data) {
if (item.children && item.children.length) {
const { children, ...other } = item
result.push({
...other,
key: item.id!,
title: item.name!,
children: formatterMenuData(children),
})
} else {
result.push({
...item,
key: item.id!,
title: item.name!,
})
}
}
return result
}

387
yarn.lock

@ -234,7 +234,7 @@
resize-observer-polyfill "^1.5.1"
throttle-debounce "^5.0.0"
"@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2":
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2":
version "7.24.2"
resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae"
integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
@ -338,7 +338,7 @@
dependencies:
"@babel/types" "^7.23.0"
"@babel/helper-module-imports@^7.22.15":
"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15":
version "7.24.3"
resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==
@ -486,7 +486,7 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-typescript" "^7.24.1"
"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4":
"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.1", "@babel/runtime@^7.24.4":
version "7.24.4"
resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==
@ -579,16 +579,125 @@
dependencies:
tslib "^2.0.0"
"@emotion/babel-plugin@^11.11.0":
version "11.11.0"
resolved "https://registry.npmmirror.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c"
integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==
dependencies:
"@babel/helper-module-imports" "^7.16.7"
"@babel/runtime" "^7.18.3"
"@emotion/hash" "^0.9.1"
"@emotion/memoize" "^0.8.1"
"@emotion/serialize" "^1.1.2"
babel-plugin-macros "^3.1.0"
convert-source-map "^1.5.0"
escape-string-regexp "^4.0.0"
find-root "^1.1.0"
source-map "^0.5.7"
stylis "4.2.0"
"@emotion/cache@^11.11.0":
version "11.11.0"
resolved "https://registry.npmmirror.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff"
integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==
dependencies:
"@emotion/memoize" "^0.8.1"
"@emotion/sheet" "^1.2.2"
"@emotion/utils" "^1.2.1"
"@emotion/weak-memoize" "^0.3.1"
stylis "4.2.0"
"@emotion/css@^11.11.2":
version "11.11.2"
resolved "https://registry.npmmirror.com/@emotion/css/-/css-11.11.2.tgz#e5fa081d0c6e335352e1bc2b05953b61832dca5a"
integrity sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==
dependencies:
"@emotion/babel-plugin" "^11.11.0"
"@emotion/cache" "^11.11.0"
"@emotion/serialize" "^1.1.2"
"@emotion/sheet" "^1.2.2"
"@emotion/utils" "^1.2.1"
"@emotion/hash@^0.8.0":
version "0.8.0"
resolved "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
"@emotion/hash@^0.9.1":
version "0.9.1"
resolved "https://registry.npmmirror.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43"
integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
"@emotion/memoize@^0.8.1":
version "0.8.1"
resolved "https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
"@emotion/react@^11.11.4":
version "11.11.4"
resolved "https://registry.npmmirror.com/@emotion/react/-/react-11.11.4.tgz#3a829cac25c1f00e126408fab7f891f00ecc3c1d"
integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==
dependencies:
"@babel/runtime" "^7.18.3"
"@emotion/babel-plugin" "^11.11.0"
"@emotion/cache" "^11.11.0"
"@emotion/serialize" "^1.1.3"
"@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
"@emotion/utils" "^1.2.1"
"@emotion/weak-memoize" "^0.3.1"
hoist-non-react-statics "^3.3.1"
"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3":
version "1.1.4"
resolved "https://registry.npmmirror.com/@emotion/serialize/-/serialize-1.1.4.tgz#fc8f6d80c492cfa08801d544a05331d1cc7cd451"
integrity sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==
dependencies:
"@emotion/hash" "^0.9.1"
"@emotion/memoize" "^0.8.1"
"@emotion/unitless" "^0.8.1"
"@emotion/utils" "^1.2.1"
csstype "^3.0.2"
"@emotion/server@^11.11.0":
version "11.11.0"
resolved "https://registry.npmmirror.com/@emotion/server/-/server-11.11.0.tgz#35537176a2a5ed8aed7801f254828e636ec3bd6e"
integrity sha512-6q89fj2z8VBTx9w93kJ5n51hsmtYuFPtZgnc1L8VzRx9ti4EU6EyvF6Nn1H1x3vcCQCF7u2dB2lY4AYJwUW4PA==
dependencies:
"@emotion/utils" "^1.2.1"
html-tokenize "^2.0.0"
multipipe "^1.0.2"
through "^2.3.8"
"@emotion/sheet@^1.2.2":
version "1.2.2"
resolved "https://registry.npmmirror.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec"
integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
"@emotion/unitless@^0.7.5":
version "0.7.5"
resolved "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
"@emotion/unitless@^0.8.1":
version "0.8.1"
resolved "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3"
integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
"@emotion/use-insertion-effect-with-fallbacks@^1.0.1":
version "1.0.1"
resolved "https://registry.npmmirror.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963"
integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==
"@emotion/utils@^1.2.1":
version "1.2.1"
resolved "https://registry.npmmirror.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4"
integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==
"@emotion/weak-memoize@^0.3.1":
version "0.3.1"
resolved "https://registry.npmmirror.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6"
integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==
"@esbuild/aix-ppc64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537"
@ -1183,6 +1292,11 @@
resolved "https://registry.npmmirror.com/@types/mockjs/-/mockjs-1.0.10.tgz#535e4bdc7c0e4658fc4b3696029d45ee6b053c8a"
integrity sha512-SXgrhajHG7boLv6oU93CcmdDm0HYRiceuz6b+7z+/2lCJPTWDv0V5YiwFHT2ejE4bQqgSXQiVPQYPWv7LGsK1g==
"@types/parse-json@^4.0.0":
version "4.0.2"
resolved "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
"@types/prop-types@*":
version "15.7.12"
resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
@ -1366,6 +1480,21 @@ ansi-styles@^4.1.0:
dependencies:
color-convert "^2.0.1"
antd-style@^3.6.2:
version "3.6.2"
resolved "https://registry.npmmirror.com/antd-style/-/antd-style-3.6.2.tgz#23eb6b61e9c04ab3c4e5dc60ef7b5c424c407fcc"
integrity sha512-p6tRV63+U9yp3T3DB4ope1Xs3VdkhNsPD+yiZMJnR57dclPQPtrNnrGBmdGwjWYP1HlzB1XS4JHqFAyMjvObHA==
dependencies:
"@ant-design/cssinjs" "^1.18.5"
"@babel/runtime" "^7.24.1"
"@emotion/cache" "^11.11.0"
"@emotion/css" "^11.11.2"
"@emotion/react" "^11.11.4"
"@emotion/serialize" "^1.1.3"
"@emotion/server" "^11.11.0"
"@emotion/utils" "^1.2.1"
use-merge-value "^1.2.0"
antd@^5.16.1:
version "5.16.1"
resolved "https://registry.npmmirror.com/antd/-/antd-5.16.1.tgz#a258e73cac8c6e63c4ec44588e5474f0403cd33a"
@ -1462,6 +1591,15 @@ axios@^1.6.8:
form-data "^4.0.0"
proxy-from-env "^1.1.0"
babel-plugin-macros@^3.1.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
dependencies:
"@babel/runtime" "^7.12.5"
cosmiconfig "^7.0.0"
resolve "^1.19.0"
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@ -1504,6 +1642,11 @@ browserslist@^4.22.2:
node-releases "^2.0.14"
update-browserslist-db "^1.0.13"
buffer-from@~0.1.1:
version "0.1.2"
resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0"
integrity sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==
bundle-require@^4.0.1:
version "4.0.2"
resolved "https://registry.npmmirror.com/bundle-require/-/bundle-require-4.0.2.tgz#65fc74ff14eabbba36d26c9a6161bd78fff6b29e"
@ -1632,6 +1775,11 @@ connect@^3.7.0:
parseurl "~1.3.3"
utils-merge "1.0.1"
convert-source-map@^1.5.0:
version "1.9.0"
resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
convert-source-map@^2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
@ -1644,6 +1792,22 @@ copy-to-clipboard@^3.3.3:
dependencies:
toggle-selection "^1.0.6"
core-util-is@~1.0.0:
version "1.0.3"
resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
cosmiconfig@^7.0.0:
version "7.1.0"
resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
dependencies:
"@types/parse-json" "^4.0.0"
import-fresh "^3.2.1"
parse-json "^5.0.0"
path-type "^4.0.0"
yaml "^1.10.0"
cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@ -1716,6 +1880,13 @@ dot-case@^3.0.4:
no-case "^3.0.4"
tslib "^2.0.3"
duplexer2@^0.1.2:
version "0.1.4"
resolved "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==
dependencies:
readable-stream "^2.0.2"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -1731,6 +1902,13 @@ encodeurl@~1.0.2:
resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
error-ex@^1.3.1:
version "1.3.2"
resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
dependencies:
is-arrayish "^0.2.1"
esbuild@^0.20.1:
version "0.20.2"
resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1"
@ -1940,6 +2118,11 @@ finalhandler@1.1.2:
statuses "~1.5.0"
unpipe "~1.0.0"
find-root@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
@ -1986,6 +2169,11 @@ fsevents@~2.3.2, fsevents@~2.3.3:
resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
gensync@^1.0.0-beta.2:
version "1.0.0-beta.2"
resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
@ -2061,7 +2249,14 @@ has-flag@^4.0.0:
resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
hoist-non-react-statics@^3.3.2:
hasown@^2.0.0:
version "2.0.2"
resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
dependencies:
function-bind "^1.1.2"
hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@ -2075,6 +2270,17 @@ html-parse-stringify@^3.0.1:
dependencies:
void-elements "3.1.0"
html-tokenize@^2.0.0:
version "2.0.1"
resolved "https://registry.npmmirror.com/html-tokenize/-/html-tokenize-2.0.1.tgz#c3b2ea6e2837d4f8c06693393e9d2a12c960be5f"
integrity sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==
dependencies:
buffer-from "~0.1.1"
inherits "~2.0.1"
minimist "~1.2.5"
readable-stream "~1.0.27-1"
through2 "~0.4.1"
i18next-browser-languagedetector@^7.2.1:
version "7.2.1"
resolved "https://registry.npmmirror.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz#1968196d437b4c8db847410c7c33554f6c448f6f"
@ -2115,11 +2321,16 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2:
inherits@2, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
@ -2127,6 +2338,13 @@ is-binary-path@~2.1.0:
dependencies:
binary-extensions "^2.0.0"
is-core-module@^2.13.0:
version "2.13.1"
resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
dependencies:
hasown "^2.0.0"
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@ -2149,6 +2367,16 @@ is-path-inside@^3.0.3:
resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@ -2186,6 +2414,11 @@ json-buffer@3.0.1:
resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
json-parse-even-better-errors@^2.3.0:
version "2.3.1"
resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
@ -2223,6 +2456,11 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
load-tsconfig@^0.2.3:
version "0.2.5"
resolved "https://registry.npmmirror.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1"
@ -2317,6 +2555,11 @@ minimatch@^9.0.4:
dependencies:
brace-expansion "^2.0.1"
minimist@~1.2.5:
version "1.2.8"
resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
mockjs@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz#e6a0c378e91906dbaff20911cc0273b3c7d75b06"
@ -2334,6 +2577,14 @@ ms@2.1.2:
resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
multipipe@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/multipipe/-/multipipe-1.0.2.tgz#cc13efd833c9cda99f224f868461b8e1a3fd939d"
integrity sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ==
dependencies:
duplexer2 "^0.1.2"
object-assign "^4.1.0"
nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
@ -2362,11 +2613,16 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
object-assign@4.x, object-assign@^4.1.1:
object-assign@4.x, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
object-keys@~0.4.0:
version "0.4.0"
resolved "https://registry.npmmirror.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==
omit.js@^2.0.2:
version "2.0.2"
resolved "https://registry.npmmirror.com/omit.js/-/omit.js-2.0.2.tgz#dd9b8436fab947a5f3ff214cb2538631e313ec2f"
@ -2427,6 +2683,16 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
parse-json@^5.0.0:
version "5.2.0"
resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
dependencies:
"@babel/code-frame" "^7.0.0"
error-ex "^1.3.1"
json-parse-even-better-errors "^2.3.0"
lines-and-columns "^1.1.6"
parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@ -2455,6 +2721,11 @@ path-key@^3.1.0:
resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-to-regexp@2.4.0:
version "2.4.0"
resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-2.4.0.tgz#35ce7f333d5616f1c1e1bfe266c3aba2e5b2e704"
@ -2499,6 +2770,11 @@ prettier@^3.1.1:
resolved "https://registry.npmmirror.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368"
integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
prop-types@^15.5.10:
version "15.8.1"
resolved "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
@ -2957,6 +3233,29 @@ reactcss@^1.2.3:
dependencies:
lodash "^4.0.1"
readable-stream@^2.0.2:
version "2.3.8"
resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@~1.0.17, readable-stream@~1.0.27-1:
version "1.0.34"
resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.1"
isarray "0.0.1"
string_decoder "~0.10.x"
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@ -2979,6 +3278,15 @@ resolve-from@^4.0.0:
resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
resolve@^1.19.0:
version "1.22.8"
resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
dependencies:
is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
reusify@^1.0.4:
version "1.0.4"
resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
@ -3022,6 +3330,11 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-stable-stringify@^2.4.3:
version "2.4.3"
resolved "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886"
@ -3080,6 +3393,11 @@ source-map-js@^1.2.0:
resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
@ -3090,6 +3408,18 @@ string-convert@^0.2.0:
resolved "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97"
integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==
string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@ -3102,6 +3432,11 @@ strip-json-comments@^3.1.1:
resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
stylis@4.2.0:
version "4.2.0"
resolved "https://registry.npmmirror.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
stylis@^4.0.13:
version "4.3.1"
resolved "https://registry.npmmirror.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb"
@ -3121,6 +3456,11 @@ supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
swr@^2.0.0:
version "2.2.5"
resolved "https://registry.npmmirror.com/swr/-/swr-2.2.5.tgz#063eea0e9939f947227d5ca760cc53696f46446b"
@ -3139,6 +3479,19 @@ throttle-debounce@^5.0.0:
resolved "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz#a17a4039e82a2ed38a5e7268e4132d6960d41933"
integrity sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==
through2@~0.4.1:
version "0.4.2"
resolved "https://registry.npmmirror.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b"
integrity sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==
dependencies:
readable-stream "~1.0.17"
xtend "~2.1.1"
through@^2.3.8:
version "2.3.8"
resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
tiny-invariant@^1.3.1:
version "1.3.3"
resolved "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
@ -3225,11 +3578,21 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
use-merge-value@^1.2.0:
version "1.2.0"
resolved "https://registry.npmmirror.com/use-merge-value/-/use-merge-value-1.2.0.tgz#45410846c23e490f404c9cbd17d67db9c8c0efcd"
integrity sha512-DXgG0kkgJN45TcyoXL49vJnn55LehnrmoHc7MbKi+QDBvr8dsesqws8UlyIWGHMR+JXgxc1nvY+jDGMlycsUcw==
use-sync-external-store@^1.2.0:
version "1.2.0"
resolved "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
@ -3289,6 +3652,13 @@ wrappy@1:
resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
xtend@~2.1.1:
version "2.1.2"
resolved "https://registry.npmmirror.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==
dependencies:
object-keys "~0.4.0"
yallist@^3.0.2:
version "3.1.1"
resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
@ -3299,6 +3669,11 @@ yallist@^4.0.0:
resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yaml@^1.10.0:
version "1.10.2"
resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"

Loading…
Cancel
Save