@gofreego/tsutils 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +253 -0
- package/dist/index.d.mts +555 -0
- package/dist/index.d.ts +555 -0
- package/dist/index.js +1178 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1153 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/SidebarLayout.tsx","../src/theme/tokens.ts","../src/theme/light.ts","../src/theme/dark.ts","../src/utils/localStorage.ts","../src/theme/ThemeProvider.tsx","../src/theme/useTheme.ts","../src/theme/ThemeToggle.tsx","../src/http/HttpClient.ts","../src/utils/cn.ts","../src/utils/debounce.ts","../src/utils/throttle.ts","../src/utils/formatDate.ts","../src/auth/AuthProvider.tsx","../src/auth/PermissionManager.ts"],"names":["useState","useEffect","jsx","jsxs","MuiThemeProvider","IconButton","createContext","Fragment","useContext"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { useState, useEffect, ReactNode, CSSProperties } from 'react'\nimport {\n Drawer,\n List,\n ListItem,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Box,\n Typography,\n Collapse,\n IconButton\n} from '@mui/material'\nimport { ExpandLess, ExpandMore } from '@mui/icons-material'\nimport { BrowserRouter, NavLink, Outlet, useLocation, Routes, Route } from 'react-router-dom'\n\n/**\n * Menu item configuration\n */\nexport interface MenuItem {\n /** Unique identifier */\n id: string\n /** Display label */\n label: string\n /** Optional icon element */\n icon?: ReactNode\n /** Route path (for router mode) */\n path?: string\n /** Component to render (for non-router mode) */\n component?: ReactNode\n /** Optional submenu items */\n children?: MenuItem[]\n}\n\nexport interface SidebarLayoutProps {\n /** Array of menu items */\n menuItems: MenuItem[]\n /** Width of the sidebar */\n sidebarWidth?: string | number\n /** Additional CSS class for container */\n className?: string\n /** Default selected menu item ID (for non-router mode) */\n defaultSelected?: string\n /** Callback when menu changes */\n onMenuChange?: (id: string) => void\n /** Custom styles for container */\n style?: CSSProperties\n /** Custom styles for sidebar */\n sidebarStyle?: CSSProperties\n /** Custom styles for body */\n bodyStyle?: CSSProperties\n /** Default expanded submenu IDs */\n defaultExpanded?: string[]\n /** If true, wraps SidebarLayout in BrowserRouter and enables router-based navigation */\n isRouter?: boolean\n}\n\n\n\n/**\n * Recursive menu item renderer for router mode\n */\nconst RouterMenuItem: React.FC<{\n item: MenuItem\n depth?: number\n expanded: Set<string>\n onToggle: (id: string) => void\n}> = ({ item, depth = 0, expanded, onToggle }) => {\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expanded.has(item.id)\n\n return (\n <>\n <ListItem disablePadding>\n <ListItemButton\n component={hasChildren ? 'div' : NavLink}\n to={!hasChildren ? (item.path || `/${item.id}`) : undefined}\n onClick={hasChildren ? () => onToggle(item.id) : undefined}\n sx={{\n pl: 2 + depth * 2,\n '&.active': {\n backgroundColor: 'action.selected',\n color: 'primary.main',\n borderLeft: 3,\n borderColor: 'primary.main',\n fontWeight: 'medium',\n '& .MuiListItemIcon-root': {\n color: 'primary.main',\n },\n },\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n transition: 'all 0.15s',\n }}\n >\n {item.icon && (\n <ListItemIcon sx={{ minWidth: 40 }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n fontSize: '0.875rem',\n }}\n />\n {hasChildren && (\n <IconButton size=\"small\" sx={{ p: 0 }}>\n {isExpanded ? <ExpandLess /> : <ExpandMore />}\n </IconButton>\n )}\n </ListItemButton>\n </ListItem>\n {hasChildren && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children!.map((child) => (\n <RouterMenuItem\n key={child.id}\n item={child}\n depth={depth + 1}\n expanded={expanded}\n onToggle={onToggle}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n )\n}\n\n/**\n * Helper to flatten menu items into routes\n */\nconst flattenMenuRoutes = (items: MenuItem[]): Array<{ path: string; component: ReactNode }> => {\n const routes: Array<{ path: string; component: ReactNode }> = []\n\n const flatten = (menuItems: MenuItem[]) => {\n for (const item of menuItems) {\n if (item.path && item.component) {\n routes.push({ path: item.path, component: item.component })\n }\n if (item.children) {\n flatten(item.children)\n }\n }\n }\n\n flatten(items)\n return routes\n}\n\n/**\n * Inner component for Router-based Sidebar Layout\n * (Must be rendered inside a Router context to use useLocation)\n */\nconst SidebarLayoutRouterInner: React.FC<SidebarLayoutProps> = ({\n menuItems,\n sidebarWidth = 250,\n className = '',\n onMenuChange,\n style,\n sidebarStyle,\n bodyStyle,\n defaultExpanded = [],\n}) => {\n const location = useLocation()\n const [expanded, setExpanded] = useState<Set<string>>(new Set(defaultExpanded))\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n useEffect(() => {\n if (onMenuChange) {\n const findActiveItem = (items: MenuItem[]): MenuItem | undefined => {\n for (const item of items) {\n if (item.path && location.pathname === item.path) {\n return item\n }\n if (item.children) {\n const found = findActiveItem(item.children)\n if (found) return found\n }\n }\n return undefined\n }\n\n const activeItem = findActiveItem(menuItems)\n if (activeItem) {\n onMenuChange(activeItem.id)\n }\n }\n }, [location.pathname, menuItems, onMenuChange])\n\n // Check if menu items have components - if so, render routes internally\n const hasComponents = menuItems.some(item =>\n item.component || (item.children?.some(child => child.component))\n )\n\n const routes = hasComponents ? flattenMenuRoutes(menuItems) : []\n\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n height: '100%',\n width: '100%',\n ...style,\n }}\n >\n <Drawer\n variant=\"permanent\"\n sx={{\n width: sidebarWidth,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n width: sidebarWidth,\n boxSizing: 'border-box',\n position: 'relative',\n borderRight: '1px solid',\n borderColor: 'divider',\n ...sidebarStyle,\n },\n }}\n >\n <List sx={{ p: 0 }}>\n {menuItems.map((item) => (\n <RouterMenuItem\n key={item.id}\n item={item}\n expanded={expanded}\n onToggle={handleToggle}\n />\n ))}\n </List>\n </Drawer>\n\n <Box\n component=\"main\"\n sx={{\n flexGrow: 1,\n overflow: 'auto',\n ...bodyStyle,\n }}\n >\n {hasComponents ? (\n <Routes>\n {routes.map(({ path, component }) => (\n <Route\n key={path}\n path={path}\n element={component}\n />\n ))}\n </Routes>\n ) : (\n <Outlet />\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * Wrapper for Router-based Sidebar Layout\n */\nconst SidebarLayoutWithRouter: React.FC<SidebarLayoutProps> = (props) => {\n return (\n <BrowserRouter>\n <SidebarLayoutRouterInner {...props} />\n </BrowserRouter>\n )\n}\n\n/**\n * Recursive menu item renderer for state mode\n */\nconst StateMenuItem: React.FC<{\n item: MenuItem\n selectedId: string\n depth?: number\n expanded: Set<string>\n onToggle: (id: string) => void\n onClick: (id: string) => void\n}> = ({ item, selectedId, depth = 0, expanded, onToggle, onClick }) => {\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expanded.has(item.id)\n const isActive = item.id === selectedId\n\n const handleClick = () => {\n if (hasChildren) {\n onToggle(item.id)\n } else {\n onClick(item.id)\n }\n }\n\n return (\n <>\n <ListItem disablePadding>\n <ListItemButton\n selected={isActive}\n onClick={handleClick}\n sx={{\n pl: 2 + depth * 2,\n '&.Mui-selected': {\n backgroundColor: 'action.selected',\n color: 'primary.main',\n borderLeft: 3,\n borderColor: 'primary.main',\n fontWeight: 'medium',\n '& .MuiListItemIcon-root': {\n color: 'primary.main',\n },\n '&:hover': {\n backgroundColor: 'action.selected',\n },\n },\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n transition: 'all 0.15s',\n }}\n >\n {item.icon && (\n <ListItemIcon sx={{ minWidth: 40 }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n fontSize: '0.875rem',\n }}\n />\n {hasChildren && (\n <IconButton size=\"small\" sx={{ p: 0 }}>\n {isExpanded ? <ExpandLess /> : <ExpandMore />}\n </IconButton>\n )}\n </ListItemButton>\n </ListItem>\n {hasChildren && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children!.map((child) => (\n <StateMenuItem\n key={child.id}\n item={child}\n selectedId={selectedId}\n depth={depth + 1}\n expanded={expanded}\n onToggle={onToggle}\n onClick={onClick}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n )\n}\n\n/**\n * State-based Sidebar Layout Component (Fallback)\n */\nconst SidebarLayoutWithState: React.FC<SidebarLayoutProps> = ({\n menuItems,\n sidebarWidth = 250,\n className = '',\n defaultSelected,\n onMenuChange,\n style,\n sidebarStyle,\n bodyStyle,\n defaultExpanded = [],\n}) => {\n const [selectedId, setSelectedId] = useState<string>(\n defaultSelected || menuItems[0]?.id\n )\n const [expanded, setExpanded] = useState<Set<string>>(new Set(defaultExpanded))\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n const handleMenuClick = (id: string) => {\n setSelectedId(id)\n if (onMenuChange) {\n onMenuChange(id)\n }\n }\n\n const findActiveItem = (items: MenuItem[], id: string): MenuItem | undefined => {\n for (const item of items) {\n if (item.id === id) return item\n if (item.children) {\n const found = findActiveItem(item.children, id)\n if (found) return found\n }\n }\n return undefined\n }\n\n const activeItem = findActiveItem(menuItems, selectedId)\n\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n height: '100%',\n width: '100%',\n ...style,\n }}\n >\n <Drawer\n variant=\"permanent\"\n sx={{\n width: sidebarWidth,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n width: sidebarWidth,\n boxSizing: 'border-box',\n position: 'relative',\n borderRight: '1px solid',\n borderColor: 'divider',\n ...sidebarStyle,\n },\n }}\n >\n <List sx={{ p: 0 }}>\n {menuItems.map((item) => (\n <StateMenuItem\n key={item.id}\n item={item}\n selectedId={selectedId}\n expanded={expanded}\n onToggle={handleToggle}\n onClick={handleMenuClick}\n />\n ))}\n </List>\n </Drawer>\n\n <Box\n component=\"main\"\n sx={{\n flexGrow: 1,\n overflow: 'auto',\n p: 3,\n ...bodyStyle,\n }}\n >\n {activeItem?.component || (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ textAlign: 'center', mt: 4 }}\n >\n No content available for this menu item\n </Typography>\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * SidebarLayout Component\n * \n * A flexible sidebar-body layout component built with Material UI that supports \n * both router-based and state-based navigation with nested submenu support.\n * \n * **Uses Material UI Components:**\n * - Drawer (permanent variant)\n * - List, ListItem, ListItemButton\n * - ListItemIcon, ListItemText\n * - Collapse (for submenus)\n * - Box for layout\n * \n * **Features:**\n * - Nested submenu support with expand/collapse\n * - Material UI icons (ExpandMore/ExpandLess)\n * - Recursive rendering for deep nesting\n * - Automatic indentation based on depth\n * \n * **Router Mode** (when react-router-dom is available):\n * - Uses NavLink for navigation\n * - Renders child routes via Outlet\n * - Supports URL-based navigation\n * - Browser back/forward works\n * \n * **State Mode** (fallback):\n * - Uses internal state\n * - Renders components from menuItems\n * - Simple navigation without routing\n * \n * @example\n * // With nested submenus\n * <SidebarLayout\n * menuItems={[\n * {\n * id: 'products',\n * label: 'Products',\n * icon: <ShoppingCartIcon />,\n * children: [\n * { id: 'all-products', label: 'All Products', path: '/products/all' },\n * { id: 'categories', label: 'Categories', path: '/products/categories' }\n * ]\n * },\n * { id: 'dashboard', label: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> }\n * ]}\n * defaultExpanded={['products']}\n * />\n * \n * @example\n * // With React Router\n * <Routes>\n * <Route path=\"/\" element={\n * <SidebarLayout menuItems={[\n * { id: 'dashboard', label: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * { id: 'settings', label: 'Settings', path: '/settings', icon: <SettingsIcon /> }\n * ]} />\n * }>\n * <Route path=\"dashboard\" element={<Dashboard />} />\n * <Route path=\"settings\" element={<Settings />} />\n * </Route>\n * </Routes>\n * \n * @example\n * // Without React Router (State-based)\n * <SidebarLayout\n * menuItems={[\n * { id: 'dashboard', label: 'Dashboard', component: <Dashboard /> },\n * { id: 'settings', label: 'Settings', component: <Settings /> }\n * ]}\n * defaultSelected=\"dashboard\"\n * />\n */\nexport const SidebarLayout: React.FC<SidebarLayoutProps> = (props) => {\n // If explicitly requested to be a router, or implicitly requested because items have paths\n // AND NOT explicitly disabling the router.\n if (props.isRouter) {\n return <SidebarLayoutWithRouter {...props} />\n }\n\n return <SidebarLayoutWithState {...props} />\n}\n","/**\n * Design Tokens - Theme-agnostic values\n * These tokens serve as the foundation for light and dark themes\n * Following Material Design 3 principles\n */\n\n/**\n * Spacing scale based on 4px grid system\n */\nexport const spacing = {\n xs: '0.25rem', // 4px\n sm: '0.5rem', // 8px\n md: '1rem', // 16px\n lg: '1.5rem', // 24px\n xl: '2rem', // 32px\n '2xl': '3rem', // 48px\n '3xl': '4rem', // 64px\n} as const\n\n/**\n * Border radius tokens\n */\nexport const borderRadius = {\n none: '0',\n sm: '0.25rem', // 4px\n md: '0.375rem', // 6px\n lg: '0.5rem', // 8px\n xl: '0.75rem', // 12px\n '2xl': '1rem', // 16px\n full: '9999px',\n} as const\n\n/**\n * Typography scale\n */\nexport const fontSize = {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n md: '1rem', // 16px\n lg: '1.125rem', // 18px\n xl: '1.25rem', // 20px\n '2xl': '1.5rem', // 24px\n '3xl': '1.875rem', // 30px\n '4xl': '2.25rem', // 36px\n} as const\n\n/**\n * Font weights\n */\nexport const fontWeight = {\n light: '300',\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n} as const\n\n/**\n * Line heights\n */\nexport const lineHeight = {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.75',\n} as const\n\n/**\n * Elevation (box shadows) for depth perception\n */\nexport const elevation = {\n none: 'none',\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n} as const\n\n/**\n * Transition durations\n */\nexport const transition = {\n fast: '150ms',\n normal: '250ms',\n slow: '350ms',\n} as const\n\n/**\n * Z-index scale for layering\n */\nexport const zIndex = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n modalBackdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n} as const\n","import { spacing, borderRadius, fontSize, fontWeight, lineHeight, elevation, transition, zIndex } from './tokens'\nimport { Theme } from './types'\n\n/**\n * Light theme configuration\n * Colors are WCAG AA compliant with minimum contrast ratio of 4.5:1 for normal text\n * and 3:1 for large text\n */\nexport const lightTheme: Theme = {\n colors: {\n // Primary - Vibrant Indigo (Works beautifully on light backgrounds)\n primary: '#6366f1', // Indigo 500\n primaryHover: '#4f46e5', // Indigo 600\n primaryActive: '#4338ca', // Indigo 700\n\n // Secondary - Gray 600 (WCAG AAA compliant: 7.66:1 on white)\n secondary: '#4b5563',\n secondaryHover: '#374151',\n secondaryActive: '#1f2937',\n\n // Background colors\n background: '#ffffff',\n backgroundSecondary: '#f9fafb',\n backgroundTertiary: '#f3f4f6',\n\n // Surface colors (for cards, modals, etc.)\n surface: '#ffffff',\n surfaceHover: '#f9fafb',\n\n // Text colors (WCAG AAA compliant)\n text: '#111827', // Gray 900 (16.26:1 on white)\n textSecondary: '#4b5563', // Gray 600 (7.66:1 on white)\n textTertiary: '#6b7280', // Gray 500 (4.92:1 on white - AA compliant)\n textDisabled: '#9ca3af', // Gray 400\n\n // Semantic colors\n error: '#dc2626', // Red 600 (6.05:1 on white - AAA compliant)\n errorHover: '#b91c1c',\n errorBackground: '#fef2f2',\n\n success: '#16a34a', // Green 600 (5.15:1 on white - AAA compliant)\n successHover: '#15803d',\n successBackground: '#f0fdf4',\n\n warning: '#d97706', // Amber 600 (5.33:1 on white - AAA compliant)\n warningHover: '#b45309',\n warningBackground: '#fffbeb',\n\n info: '#2563eb', // Blue 600 (6.64:1 on white - AAA compliant)\n infoHover: '#1d4ed8',\n infoBackground: '#eff6ff',\n\n // Border colors\n border: '#e5e7eb', // Gray 200\n borderHover: '#d1d5db', // Gray 300\n borderFocus: '#6366f1', // Primary\n\n // Divider\n divider: '#e5e7eb',\n\n // Overlay (for modals, dropdowns)\n overlay: 'rgba(0, 0, 0, 0.5)',\n },\n\n spacing,\n borderRadius,\n fontSize,\n fontWeight,\n lineHeight,\n elevation,\n transition,\n zIndex,\n}\n","import { spacing, borderRadius, fontSize, fontWeight, lineHeight, elevation, transition, zIndex } from './tokens'\nimport { Theme } from './types'\n\n/**\n * Dark theme configuration\n * Colors are WCAG AA compliant with minimum contrast ratio of 4.5:1 for normal text\n * and 3:1 for large text on dark backgrounds\n */\nexport const darkTheme: Theme = {\n colors: {\n // Primary - Vibrant Indigo (Striking on VSCode Black)\n primary: '#818cf8', // Indigo 400\n primaryHover: '#6366f1', // Indigo 500\n primaryActive: '#4f46e5', // Indigo 600\n\n // Secondary - VSCode Gray\n secondary: '#858585',\n secondaryHover: '#a6a6a6',\n secondaryActive: '#cccccc',\n\n // Background colors\n background: '#1e1e1e', // Main editor/workspace background\n backgroundSecondary: '#252526', // Sidebar, panels\n backgroundTertiary: '#2d2d2d', // Highlights, smaller surfaces\n\n // Surface colors (for cards, modals, etc.)\n surface: '#252526',\n surfaceHover: '#2a2d2e',\n\n // Text colors\n text: '#cccccc', // Primary text\n textSecondary: '#999999', // Secondary text, comments\n textTertiary: '#6b6b6b', // Disabled/tertiary\n textDisabled: '#4d4d4d', // Disabled\n\n // Semantic colors\n error: '#f48771',\n errorHover: '#fca5a5',\n errorBackground: '#5a1d1d',\n\n success: '#89d185',\n successHover: '#86efac',\n successBackground: '#1e401e',\n\n warning: '#cca700',\n warningHover: '#d7ba7d',\n warningBackground: '#5c4d00',\n\n info: '#75beff',\n infoHover: '#9cdcfe',\n infoBackground: '#0a3254',\n\n // Border colors\n border: '#3c3c3c', // VSCode borders\n borderHover: '#444444',\n borderFocus: '#818cf8', // Focus border\n\n // Divider\n divider: '#333333',\n\n // Overlay (for modals, dropdowns)\n overlay: 'rgba(0, 0, 0, 0.4)',\n },\n\n spacing,\n borderRadius,\n fontSize,\n fontWeight,\n lineHeight,\n elevation,\n transition,\n zIndex,\n}\n","/**\n * LocalStorage utility for safely storing and retrieving data\n */\n\nexport class LocalStorage {\n /**\n * Get an item from localStorage\n * @param key - The key to retrieve\n * @returns The value or null if not found or error occurs\n */\n static getItem<T = string>(key: string): T | null {\n try {\n if (typeof window === 'undefined') {\n return null\n }\n \n const item = window.localStorage.getItem(key)\n \n if (item === null) {\n return null\n }\n \n try {\n return JSON.parse(item) as T\n } catch {\n // If JSON parse fails, return as string\n return item as T\n }\n } catch (error) {\n console.error(`Error getting item from localStorage: ${error}`)\n return null\n }\n }\n\n /**\n * Set an item in localStorage\n * @param key - The key to store\n * @param value - The value to store\n * @returns true if successful, false otherwise\n */\n static setItem<T>(key: string, value: T): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n const serializedValue = typeof value === 'string' \n ? value \n : JSON.stringify(value)\n \n window.localStorage.setItem(key, serializedValue)\n return true\n } catch (error) {\n console.error(`Error setting item in localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Remove an item from localStorage\n * @param key - The key to remove\n * @returns true if successful, false otherwise\n */\n static removeItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n window.localStorage.removeItem(key)\n return true\n } catch (error) {\n console.error(`Error removing item from localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Clear all items from localStorage\n * @returns true if successful, false otherwise\n */\n static clear(): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n window.localStorage.clear()\n return true\n } catch (error) {\n console.error(`Error clearing localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Check if a key exists in localStorage\n * @param key - The key to check\n * @returns true if key exists, false otherwise\n */\n static hasItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n return window.localStorage.getItem(key) !== null\n } catch (error) {\n console.error(`Error checking item in localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Get all keys from localStorage\n * @returns Array of keys\n */\n static keys(): string[] {\n try {\n if (typeof window === 'undefined') {\n return []\n }\n \n return Object.keys(window.localStorage)\n } catch (error) {\n console.error(`Error getting keys from localStorage: ${error}`)\n return []\n }\n }\n}\n","import React, { createContext, useState, ReactNode, useCallback, useEffect, useMemo } from 'react'\nimport { Theme, ThemeContextValue, ThemeMode, ResolvedThemeMode } from './types'\nimport { lightTheme } from './light'\nimport { darkTheme } from './dark'\nimport { LocalStorage } from '../utils/localStorage'\nimport { ThemeProvider as MuiThemeProvider, createTheme, CssBaseline } from '@mui/material'\n\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined)\n\nconst THEME_STORAGE_KEY = 'app-theme-mode'\n\nexport interface ThemeProviderProps {\n children: ReactNode\n /** Custom theme object (overrides default light/dark themes) */\n initialTheme?: Theme\n /** Initial theme mode */\n initialMode?: ThemeMode\n /** localStorage key for persisting theme preference */\n storageKey?: string\n /** Enable CSS variables injection */\n enableCssVariables?: boolean\n}\n\n/**\n * Detects system color scheme preference\n */\nconst getSystemTheme = (): ResolvedThemeMode => {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\n/**\n * Applies theme as CSS variables to document root\n */\nconst applyCssVariables = (theme: Theme, resolvedMode: ResolvedThemeMode): void => {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n\n // Set data attribute for theme mode\n root.setAttribute('data-theme', resolvedMode)\n\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n root.style.setProperty(`--color-${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`, value)\n })\n\n // Apply spacing variables\n Object.entries(theme.spacing).forEach(([key, value]) => {\n root.style.setProperty(`--spacing-${key}`, value)\n })\n\n // Apply border radius variables\n Object.entries(theme.borderRadius).forEach(([key, value]) => {\n root.style.setProperty(`--radius-${key}`, value)\n })\n\n // Apply font size variables\n Object.entries(theme.fontSize).forEach(([key, value]) => {\n root.style.setProperty(`--text-${key}`, value)\n })\n\n // Apply font weight variables\n Object.entries(theme.fontWeight).forEach(([key, value]) => {\n root.style.setProperty(`--font-${key}`, value)\n })\n\n // Apply line height variables\n Object.entries(theme.lineHeight).forEach(([key, value]) => {\n root.style.setProperty(`--leading-${key}`, value)\n })\n\n // Apply elevation variables\n Object.entries(theme.elevation).forEach(([key, value]) => {\n root.style.setProperty(`--shadow-${key}`, value)\n })\n\n // Apply transition variables\n Object.entries(theme.transition).forEach(([key, value]) => {\n root.style.setProperty(`--transition-${key}`, value)\n })\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n initialTheme,\n initialMode = 'system',\n storageKey = THEME_STORAGE_KEY,\n enableCssVariables = true,\n}) => {\n // Load theme mode from localStorage or use initialMode\n const getInitialMode = (): ThemeMode => {\n const savedMode = LocalStorage.getItem<ThemeMode>(storageKey)\n return savedMode || initialMode\n }\n\n const [themeMode, setThemeModeState] = useState<ThemeMode>(getInitialMode)\n const [systemTheme, setSystemTheme] = useState<ResolvedThemeMode>(getSystemTheme)\n const [customTheme, setCustomTheme] = useState<Theme | undefined>(initialTheme)\n\n // Calculate resolved theme mode\n const resolvedThemeMode: ResolvedThemeMode = useMemo(() => {\n if (themeMode === 'system') return systemTheme\n return themeMode as ResolvedThemeMode\n }, [themeMode, systemTheme])\n\n // Get current theme\n const theme: Theme = useMemo(() => {\n if (customTheme) return customTheme\n return resolvedThemeMode === 'light' ? lightTheme : darkTheme\n }, [customTheme, resolvedThemeMode])\n\n // Listen for system theme changes\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n\n const handleChange = (e: MediaQueryListEvent) => {\n setSystemTheme(e.matches ? 'dark' : 'light')\n }\n\n // Modern browsers\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }\n // Legacy browsers\n else if (mediaQuery.addListener) {\n mediaQuery.addListener(handleChange)\n return () => mediaQuery.removeListener(handleChange)\n }\n }, [])\n\n // Apply CSS variables when theme changes\n useEffect(() => {\n if (enableCssVariables) {\n applyCssVariables(theme, resolvedThemeMode)\n }\n }, [theme, resolvedThemeMode, enableCssVariables])\n\n // Save theme mode to localStorage whenever it changes\n useEffect(() => {\n LocalStorage.setItem(storageKey, themeMode)\n }, [themeMode, storageKey])\n\n const setThemeMode = useCallback((mode: ThemeMode) => {\n setThemeModeState(mode)\n }, [])\n\n const setTheme = useCallback((newTheme: Theme) => {\n setCustomTheme(newTheme)\n }, [])\n\n const toggleTheme = useCallback(() => {\n // Toggle between light and dark, ignore system\n const newMode: ThemeMode = resolvedThemeMode === 'light' ? 'dark' : 'light'\n setThemeModeState(newMode)\n }, [resolvedThemeMode])\n\n const contextValue: ThemeContextValue = useMemo(() => ({\n theme,\n themeMode,\n resolvedThemeMode,\n setTheme,\n setThemeMode,\n toggleTheme,\n }), [theme, themeMode, resolvedThemeMode, setTheme, setThemeMode, toggleTheme])\n\n const muiTheme = useMemo(() => createTheme({\n palette: {\n mode: resolvedThemeMode,\n primary: {\n main: theme.colors.primary,\n },\n secondary: {\n main: theme.colors.secondary,\n },\n error: {\n main: theme.colors.error,\n },\n success: {\n main: theme.colors.success,\n },\n background: {\n default: theme.colors.background,\n paper: theme.colors.backgroundSecondary,\n },\n text: {\n primary: theme.colors.text,\n secondary: theme.colors.textSecondary,\n }\n },\n }), [resolvedThemeMode, theme])\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <MuiThemeProvider theme={muiTheme}>\n <CssBaseline />\n {children}\n </MuiThemeProvider>\n </ThemeContext.Provider>\n )\n}\n","import { useContext } from 'react'\nimport { ThemeContext } from './ThemeProvider'\nimport { ThemeContextValue } from './types'\n\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext)\n \n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n \n return context\n}\n","import React from 'react'\nimport { IconButton, IconButtonProps, Tooltip } from '@mui/material'\nimport { Brightness4, Brightness7 } from '@mui/icons-material'\nimport { useTheme } from './useTheme'\n\nexport interface ThemeToggleProps extends Omit<IconButtonProps, 'onClick'> {\n /**\n * Tooltip text for light mode\n * @default \"Switch to dark mode\"\n */\n lightModeTooltip?: string\n \n /**\n * Tooltip text for dark mode\n * @default \"Switch to light mode\"\n */\n darkModeTooltip?: string\n \n /**\n * Whether to show tooltip\n * @default true\n */\n showTooltip?: boolean\n}\n\n/**\n * A round button component for toggling between light and dark themes\n * Note: Toggling skips 'system' mode and switches directly between light and dark\n */\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({\n lightModeTooltip = 'Switch to dark mode',\n darkModeTooltip = 'Switch to light mode',\n showTooltip = true,\n sx,\n ...props\n}) => {\n const { resolvedThemeMode, toggleTheme } = useTheme()\n\n const button = (\n <IconButton\n onClick={toggleTheme}\n color=\"inherit\"\n sx={{\n borderRadius: '50%',\n ...sx\n }}\n {...props}\n >\n {resolvedThemeMode === 'light' ? <Brightness4 /> : <Brightness7 />}\n </IconButton>\n )\n\n if (!showTooltip) {\n return button\n }\n\n return (\n <Tooltip \n title={resolvedThemeMode === 'light' ? lightModeTooltip : darkModeTooltip}\n arrow\n >\n {button}\n </Tooltip>\n )\n}\n","import { HttpClientConfig, RequestConfig, HttpResponse, HttpError } from './types'\n\nexport class HttpClient {\n private baseURL: string\n private timeout: number\n private defaultHeaders: Record<string, string>\n\n constructor(config: HttpClientConfig = {}) {\n this.baseURL = config.baseURL || ''\n this.timeout = config.timeout || 30000\n this.defaultHeaders = config.headers || {}\n }\n\n private buildURL(url: string, params?: Record<string, string | number | boolean>): string {\n const fullURL = url.startsWith('http') ? url : `${this.baseURL}${url}`\n \n if (!params) return fullURL\n \n const searchParams = new URLSearchParams()\n Object.entries(params).forEach(([key, value]) => {\n searchParams.append(key, String(value))\n })\n \n return `${fullURL}?${searchParams.toString()}`\n }\n\n private async request<T = any>(\n url: string,\n config: RequestConfig = {}\n ): Promise<HttpResponse<T>> {\n const { params, data, timeout = this.timeout, headers = {}, ...restConfig } = config\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(this.buildURL(url, params), {\n ...restConfig,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const error: HttpError = new Error(`HTTP Error: ${response.statusText}`)\n error.status = response.status\n error.statusText = response.statusText\n try {\n error.data = await response.json()\n } catch {\n error.data = await response.text()\n }\n throw error\n }\n\n const responseData = await response.json()\n\n return {\n data: responseData,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n }\n } catch (error) {\n clearTimeout(timeoutId)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error('Request timeout')\n }\n throw error\n }\n }\n\n get<T = any>(url: string, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, method: 'GET' })\n }\n\n post<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'POST' })\n }\n\n put<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'PUT' })\n }\n\n patch<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'PATCH' })\n }\n\n delete<T = any>(url: string, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, method: 'DELETE' })\n }\n}\n","/**\n * Merges class names together\n * Useful for conditional className composition\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n timeoutId = setTimeout(() => {\n func.apply(this, args)\n }, wait)\n }\n}\n","/**\n * Creates a throttled function that only invokes func at most once per every wait milliseconds\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now()\n \n if (now - lastCall >= wait) {\n lastCall = now\n func.apply(this, args)\n }\n }\n}\n","/**\n * Formats a date to a readable string\n */\nexport function formatDate(\n date: Date | string | number,\n options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n }\n): string {\n const dateObj = typeof date === 'string' || typeof date === 'number' \n ? new Date(date) \n : date\n\n return new Intl.DateTimeFormat('en-US', options).format(dateObj)\n}\n","import React, { createContext, useContext, useEffect, useState, ReactNode } from 'react'\n\n/** Helper to extract cookie value by name */\nfunction getCookie(name: string): string | null {\n if (typeof document === 'undefined') return null\n const value = `; ${document.cookie}`\n const parts = value.split(`; ${name}=`)\n if (parts.length === 2) return parts.pop()?.split(';').shift() || null\n return null\n}\n\n/** Helper to securely decode a JWT payload without external libraries */\nfunction decodeJWT(token: string) {\n try {\n const base64Url = token.split('.')[1]\n if (!base64Url) return null\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/')\n\n // Properly handle unicode characters in JWT\n const jsonPayload = decodeURIComponent(\n window.atob(base64)\n .split('')\n .map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)\n })\n .join('')\n )\n\n return JSON.parse(jsonPayload)\n } catch (e) {\n return null\n }\n}\n\n/** \n * Context State Interface \n */\nexport interface AuthContextType {\n isAuthenticated: boolean\n isLoading: boolean\n}\n\nconst AuthContext = createContext<AuthContextType>({\n isAuthenticated: false,\n isLoading: true,\n})\n\nexport interface AuthProviderProps {\n /** Name of the cookie containing the JWT token. Defaults to \"authorization\" */\n cookieName?: string\n /** URL to redirect the user to if authentication fails */\n redirectUrl: string\n /** Components to render if deeply authenticated */\n children: ReactNode\n /** Custom fallback logic to fire upon failed auth (overrides redirectUrl behavior) */\n onAuthFail?: () => void\n /** Custom callback fired strictly on successful auth */\n onAuthSuccess?: () => void\n /** Optional loading element while checking cookies asynchronously */\n loadingElement?: ReactNode\n}\n\n/**\n * AuthProvider verifies a JWT embedded in document.cookie.\n * Checks for existence, decodes the signature, and evaluates the `exp` claim.\n * Redirects heavily dependent or kicks custom callbacks if failed.\n */\nexport const AuthProvider: React.FC<AuthProviderProps> = ({\n cookieName = 'authorization',\n redirectUrl,\n children,\n onAuthFail,\n onAuthSuccess,\n loadingElement = null\n}) => {\n const [authState, setAuthState] = useState<AuthContextType>({\n isAuthenticated: false,\n isLoading: true, // starts loading until cookie check completes\n })\n\n // Prevent endless redirection loop if it fails and redirects to a React Router page using AuthProvider\n const [authFailed, setAuthFailed] = useState(false)\n\n useEffect(() => {\n // Only parse auth once on mount or explicitly requested\n const verifyAuth = () => {\n const token = getCookie(cookieName)\n\n if (!token) {\n handleFail()\n return\n }\n\n const decoded = decodeJWT(token)\n\n if (!decoded) {\n handleFail()\n return\n }\n\n // Check standard JWT numeric expiration date ('exp' claim)\n if (decoded.exp) {\n // JWT `exp` is issued in seconds, convert to JS Date milliseconds\n const expirationDate = new Date(decoded.exp * 1000)\n if (expirationDate < new Date()) {\n handleFail() // Token expired\n return\n }\n }\n\n // Token passed validation\n setAuthState({\n isAuthenticated: true,\n isLoading: false,\n })\n\n if (onAuthSuccess) {\n onAuthSuccess()\n }\n }\n\n verifyAuth()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [cookieName])\n\n const handleFail = () => {\n setAuthState({\n isAuthenticated: false,\n isLoading: false,\n })\n setAuthFailed(true)\n\n if (onAuthFail) {\n onAuthFail()\n } else if (redirectUrl && typeof window !== 'undefined') {\n window.location.href = redirectUrl\n }\n }\n\n // If we are currently loading, or we failed and are actively redirecting via `window.location`,\n // wait and render loading element rather than revealing protected children.\n if (authState.isLoading || (authFailed && !onAuthFail)) {\n return <>{loadingElement}</>\n }\n\n // Custom failure triggers might still render children depending on dev implementation\n if (authFailed && onAuthFail) {\n return <>{children}</>\n }\n\n return (\n <AuthContext.Provider value={authState}>\n {children}\n </AuthContext.Provider>\n )\n}\n\n/**\n * React Hook for easily accessing the authenticated JWT context\n */\nexport const useAuth = (): AuthContextType => {\n return useContext(AuthContext)\n}\n","const PERMISSIONS_STORAGE_KEY = 'auth_permissions'\n\n/**\n * A utility class to manage user permissions using the browser's localStorage.\n * Employs an internal memory cache to prevent repeated synchronous parsing.\n */\nexport class PermissionManager {\n private static cachedPermissions: Set<string> | null = null\n\n /**\n * Saves an array of permission strings to local storage.\n * @param permissions Array of permission strings.\n */\n public static setPermissions(permissions: string[]): void {\n this.cachedPermissions = new Set(permissions) // Refresh cache as Set\n\n if (typeof window === 'undefined') return\n try {\n localStorage.setItem(PERMISSIONS_STORAGE_KEY, JSON.stringify(permissions))\n } catch (error) {\n console.error('Failed to save permissions to localStorage', error)\n }\n }\n\n /**\n * Retrieves the currently stored permissions from local storage or memory cache.\n * @returns Array of permission strings, or an empty array if none exist.\n */\n public static getPermissions(): string[] {\n // Return from memory if previously resolved\n if (this.cachedPermissions !== null) {\n return Array.from(this.cachedPermissions)\n }\n\n if (typeof window === 'undefined') return []\n\n try {\n const stored = localStorage.getItem(PERMISSIONS_STORAGE_KEY)\n\n if (!stored) {\n this.cachedPermissions = new Set()\n return []\n }\n\n const parsed = JSON.parse(stored)\n const permissionsArray = Array.isArray(parsed) ? parsed : []\n\n this.cachedPermissions = new Set(permissionsArray)\n return permissionsArray\n\n } catch (error) {\n console.error('Failed to parse permissions from localStorage', error)\n this.cachedPermissions = new Set()\n return []\n }\n }\n\n /**\n * Clears all stored permissions from memory and local storage.\n */\n public static clearPermissions(): void {\n this.cachedPermissions = null // Clear cache\n\n if (typeof window === 'undefined') return\n localStorage.removeItem(PERMISSIONS_STORAGE_KEY)\n }\n\n /**\n * Checks whether the given permission string exists in the currently stored permissions.\n * @param permission The permission string to check for.\n * @returns True if the permission exists, false otherwise.\n */\n public static hasPermission(permission: string): boolean {\n // Automatically warm up the cache if empty\n if (this.cachedPermissions === null) {\n this.getPermissions()\n }\n\n // Instant O(1) hash lookup rather than O(N) array scan\n return this.cachedPermissions!.has(permission)\n }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gofreego/tsutils",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A comprehensive React + TypeScript library with common utilities, components, theme system, and HTTP client",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"dev": "tsup --watch",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"clean": "rm -rf dist",
|
|
26
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
27
|
+
"example:install": "cd example && npm install",
|
|
28
|
+
"example:dev": "cd example && npm run dev",
|
|
29
|
+
"example:build": "cd example && npm run build",
|
|
30
|
+
"example": "npm run build && npm run example:install && npm run example:dev"
|
|
31
|
+
},
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/gofreego/tsutils.git"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"react",
|
|
38
|
+
"typescript",
|
|
39
|
+
"components",
|
|
40
|
+
"theme",
|
|
41
|
+
"http-client",
|
|
42
|
+
"utilities",
|
|
43
|
+
"ui",
|
|
44
|
+
"library"
|
|
45
|
+
],
|
|
46
|
+
"author": "gofreego",
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/gofreego/tsutils/issues"
|
|
50
|
+
},
|
|
51
|
+
"homepage": "https://github.com/gofreego/tsutils#readme",
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@mui/icons-material": "^6.5.0",
|
|
54
|
+
"@mui/material": "^6.5.0",
|
|
55
|
+
"@types/node": "^25.5.0",
|
|
56
|
+
"@types/react": "^19.2.14",
|
|
57
|
+
"@types/react-dom": "^19.2.3",
|
|
58
|
+
"react-router-dom": "^7.13.1",
|
|
59
|
+
"tsup": "^8.5.1",
|
|
60
|
+
"typescript": "^5.9.3"
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"@mui/icons-material": "^5.0.0 || ^6.0.0",
|
|
64
|
+
"@mui/material": "^5.0.0 || ^6.0.0",
|
|
65
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
66
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
67
|
+
"react-router-dom": "^6.0.0"
|
|
68
|
+
},
|
|
69
|
+
"peerDependenciesMeta": {
|
|
70
|
+
"@mui/material": {
|
|
71
|
+
"optional": true
|
|
72
|
+
},
|
|
73
|
+
"@mui/icons-material": {
|
|
74
|
+
"optional": true
|
|
75
|
+
},
|
|
76
|
+
"react-router-dom": {
|
|
77
|
+
"optional": true
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|