@vlian/framework 1.2.37 → 1.2.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics.umd.js +1 -1
- package/dist/core/Test.cjs +2 -2
- package/dist/core/Test.cjs.map +1 -1
- package/dist/core/Test.js +1 -1
- package/dist/core/Test.js.map +1 -1
- package/dist/core/config/ConfigLoader.cjs +7 -7
- package/dist/core/config/ConfigLoader.cjs.map +1 -1
- package/dist/core/config/ConfigLoader.js +1 -1
- package/dist/core/config/ConfigLoader.js.map +1 -1
- package/dist/core/error/ErrorBoundary.cjs +6 -6
- package/dist/core/error/ErrorBoundary.cjs.map +1 -1
- package/dist/core/error/ErrorBoundary.d.ts +1 -1
- package/dist/core/error/ErrorBoundary.js +2 -2
- package/dist/core/error/ErrorBoundary.js.map +1 -1
- package/dist/core/error/ErrorHandler.cjs +19 -19
- package/dist/core/error/ErrorHandler.cjs.map +1 -1
- package/dist/core/error/ErrorHandler.d.ts +1 -1
- package/dist/core/error/ErrorHandler.js +2 -2
- package/dist/core/error/ErrorHandler.js.map +1 -1
- package/dist/core/event/AppEventBus.cjs +5 -5
- package/dist/core/event/AppEventBus.cjs.map +1 -1
- package/dist/core/event/AppEventBus.js +1 -1
- package/dist/core/event/AppEventBus.js.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.cjs.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.js.map +1 -1
- package/dist/core/initialization/initialization.cjs +3 -3
- package/dist/core/initialization/initialization.cjs.map +1 -1
- package/dist/core/initialization/initialization.d.ts +1 -1
- package/dist/core/initialization/initialization.js +1 -1
- package/dist/core/initialization/initialization.js.map +1 -1
- package/dist/core/initialization/initializationErrorState.cjs +2 -2
- package/dist/core/initialization/initializationErrorState.cjs.map +1 -1
- package/dist/core/initialization/initializationErrorState.d.ts +1 -1
- package/dist/core/initialization/initializationErrorState.js +1 -1
- package/dist/core/initialization/initializationErrorState.js.map +1 -1
- package/dist/core/kernel/defaultAdapters.cjs +14 -13
- package/dist/core/kernel/defaultAdapters.cjs.map +1 -1
- package/dist/core/kernel/defaultAdapters.js +2 -1
- package/dist/core/kernel/defaultAdapters.js.map +1 -1
- package/dist/core/kernel/types.d.ts +1 -1
- package/dist/core/kernel/types.js.map +1 -1
- package/dist/core/router/RouterManager.cjs +9 -9
- package/dist/core/router/RouterManager.cjs.map +1 -1
- package/dist/core/router/RouterManager.js +1 -1
- package/dist/core/router/RouterManager.js.map +1 -1
- package/dist/core/router/adapter/AdapterManager.cjs +10 -10
- package/dist/core/router/adapter/AdapterManager.cjs.map +1 -1
- package/dist/core/router/adapter/AdapterManager.js +1 -1
- package/dist/core/router/adapter/AdapterManager.js.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +4 -4
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.cjs +8 -8
- package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js.map +1 -1
- package/dist/core/router/errors/RouterError.cjs.map +1 -1
- package/dist/core/router/errors/RouterError.d.ts +4 -3
- package/dist/core/router/errors/RouterError.js.map +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +8 -8
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +11 -11
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
- package/dist/core/router/middleware/auth.cjs +4 -4
- package/dist/core/router/middleware/auth.cjs.map +1 -1
- package/dist/core/router/middleware/auth.js +1 -1
- package/dist/core/router/middleware/auth.js.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.cjs +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.js +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.js.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.cjs +7 -7
- package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.js +1 -1
- package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
- package/dist/core/router/performance/RouteCache.cjs +7 -7
- package/dist/core/router/performance/RouteCache.cjs.map +1 -1
- package/dist/core/router/performance/RouteCache.js +1 -1
- package/dist/core/router/performance/RouteCache.js.map +1 -1
- package/dist/core/router/performance/RoutePreloader.cjs +6 -6
- package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
- package/dist/core/router/performance/RoutePreloader.js +1 -1
- package/dist/core/router/performance/RoutePreloader.js.map +1 -1
- package/dist/core/router/plugin/RouterPluginManager.cjs +8 -8
- package/dist/core/router/plugin/RouterPluginManager.cjs.map +1 -1
- package/dist/core/router/plugin/RouterPluginManager.js +1 -1
- package/dist/core/router/plugin/RouterPluginManager.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs +2 -2
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
- package/dist/core/router/utils/transform.cjs +13 -12
- package/dist/core/router/utils/transform.cjs.map +1 -1
- package/dist/core/router/utils/transform.js +2 -1
- package/dist/core/router/utils/transform.js.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.cjs +2 -2
- package/dist/core/router/validation/RouterConfigValidator.cjs.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.js +1 -1
- package/dist/core/router/validation/RouterConfigValidator.js.map +1 -1
- package/dist/core/router/version/RouteVersionManager.cjs +6 -6
- package/dist/core/router/version/RouteVersionManager.cjs.map +1 -1
- package/dist/core/router/version/RouteVersionManager.js +1 -1
- package/dist/core/router/version/RouteVersionManager.js.map +1 -1
- package/dist/core/splash/SplashScreen.cjs +4 -4
- package/dist/core/splash/SplashScreen.cjs.map +1 -1
- package/dist/core/splash/SplashScreen.js +1 -1
- package/dist/core/splash/SplashScreen.js.map +1 -1
- package/dist/core/startup/initializeServices.cjs +14 -14
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +1 -1
- package/dist/core/startup/initializeServices.js +2 -2
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/renderApp.cjs +2 -2
- package/dist/core/startup/renderApp.cjs.map +1 -1
- package/dist/core/startup/renderApp.js +1 -1
- package/dist/core/startup/renderApp.js.map +1 -1
- package/dist/core/startup/startApp.cjs +22 -22
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.js +2 -2
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +2 -2
- package/dist/core/types.js.map +1 -1
- package/dist/index.cjs +0 -112
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.js +0 -8
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +1389 -1486
- package/dist/index.umd.js.map +1 -1
- package/dist/kernel/constants.cjs +2 -2
- package/dist/kernel/constants.cjs.map +1 -1
- package/dist/kernel/constants.js +1 -1
- package/dist/kernel/constants.js.map +1 -1
- package/dist/kernel/manager/loggerManager.cjs +10 -10
- package/dist/kernel/manager/loggerManager.cjs.map +1 -1
- package/dist/kernel/manager/loggerManager.d.ts +1 -1
- package/dist/kernel/manager/loggerManager.js +1 -1
- package/dist/kernel/manager/loggerManager.js.map +1 -1
- package/dist/kernel/types.d.ts +1 -1
- package/dist/kernel/types.js.map +1 -1
- package/dist/library/storage/encryption.cjs +12 -13
- package/dist/library/storage/encryption.cjs.map +1 -1
- package/dist/library/storage/encryption.js +1 -2
- package/dist/library/storage/encryption.js.map +1 -1
- package/dist/state.umd.js +1 -1
- package/dist/utils/errors.cjs +71 -15
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/errors.d.ts +30 -1
- package/dist/utils/errors.js +16 -1
- package/dist/utils/errors.js.map +1 -1
- package/package.json +1 -1
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/types.ts"],"sourcesContent":["import { LogLevel } from '../utils';\nimport type { LangType } from '../library/locale/types';\nimport { Container, RootOptions } from 'react-dom/client';\nimport { type ComponentType, type PropsWithChildren, type ReactElement, type ReactNode } from 'react';\nimport { type InitializationContext } from './initialization';\nimport type { StorageOptions } from '../types';\nimport type { ThemeConfig } from './app';\nimport type { FrameworkError } from '../utils/errors';\nimport type { RouterConfig } from './router/types';\n\nexport type UIProviderConfig = Record<string, unknown>;\nexport type UIAppConfig = Record<string, unknown>;\nexport type GlobalProviderComponent = ComponentType<PropsWithChildren>;\nexport type GlobalProviderLoader = () => Promise<{ default: GlobalProviderComponent }>;\n\n/**\n * 生命周期钩子函数类型\n */\nexport type ManagerLifecycle = {\n /**\n * 在初始化之前执行\n */\n beforeInitialization?: () => Promise<void> | void;\n\n /**\n * 初始化\n */\n initialization?: () => Promise<void> | void;\n\n /**\n * 在初始化之后执行\n * \n * @param context - 初始化上下文,包含配置、进度、耗时等信息\n * \n * @example\n * ```typescript\n * start({\n * lifecycle: {\n * afterInitialization: (context) => {\n * console.log('初始化完成', context);\n * },\n * },\n * });\n * ```\n */\n afterInitialization?: (context: InitializationContext) => Promise<void> | void;\n};\n\n\n/**\n * 启动配置选项\n */\nexport interface StartOptions {\n /**\n * React 应用的挂载容器\n * \n * 用于指定 React 应用渲染的目标 DOM 元素。如果不提供,框架将自动查找页面中\n * 的根元素(通常为 id=\"root\" 的元素)作为默认容器。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * // 使用默认容器(自动查找 id=\"root\" 的元素)\n * start({});\n * \n * // 指定自定义容器\n * const container = document.getElementById('app');\n * start({ container });\n * ```\n */\n container?: Container;\n /**\n * React 根节点的配置选项\n * \n * 用于配置 React 18+ 的 createRoot 方法的选项,包括:\n * - `onRecoverableError`: 错误恢复回调函数\n * - `identifierPrefix`: 用于标识符前缀,用于服务端渲染的 hydration\n * \n * 这些选项将传递给 `react-dom/client` 的 `createRoot` 方法。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * rootOptions: {\n * onRecoverableError: (error) => {\n * console.error('React 错误恢复:', error);\n * },\n * identifierPrefix: 'my-app-',\n * },\n * });\n * ```\n */\n rootOptions?: RootOptions;\n /**\n * 应用根组件\n * \n * 用于指定要渲染的 React 应用根组件。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * import App from './App';\n * \n * start({\n * app: <App />,\n * });\n * ```\n */\n app?: ReactElement;\n /**\n * 是否显示启动页\n * - 'auto': 自动判断(推荐)\n * - 'always': 总是显示\n * - 'never': 从不显示\n * - 'first-time-only': 仅首次加载显示\n * \n * @default 'auto'\n */\n showSplashScreen?: 'auto' | 'always' | 'never' | 'first-time-only';\n\n /**\n * 启动页最小显示时间(毫秒)\n * \n * 用于避免启动页闪烁,确保用户能看到启动过程。\n * 如果初始化完成时间小于此值,将等待至最小时间后再隐藏启动页。\n * \n * @default 500\n * \n * @example\n * ```typescript\n * start({\n * minSplashScreenTime: 1000, // 至少显示 1 秒\n * });\n * ```\n */\n minSplashScreenTime?: number;\n\n /**\n * 路由配置\n * \n * 配置应用的路由系统,支持内置路由、自定义路由和禁用路由三种模式。\n * \n * @example\n * ```typescript\n * start({\n * router: {\n * enabled: true,\n * routes: [\n * {\n * path: '/login',\n * page: LoginPage,\n * },\n * {\n * path: '/',\n * layout: MainLayout,\n * children: [\n * {\n * path: 'dashboard',\n * page: DashboardPage,\n * meta: { title: '仪表盘' },\n * },\n * ],\n * },\n * ],\n * },\n * });\n * ```\n */\n router?: RouterConfig;\n /**\n * 日志级别\n */\n loggerLevel?: LogLevel;\n /**\n * 生命周期钩子\n */\n lifecycle?: ManagerLifecycle;\n /**\n * 国际化\n */\n locale?: Record<LangType, Record<string, unknown>>;\n /**\n * 启动页完成回调\n * 仅在显示启动页时,启动页完成初始化后调用\n * 可以在这里执行额外的操作,然后调用 complete() 继续\n * \n * @example\n * ```typescript\n * start({\n * onSplashComplete: (complete, context) => {\n * // 执行额外操作\n * await doSomething();\n * // 完成后继续\n * complete();\n * },\n * });\n * ```\n */\n onSplashComplete?: (\n complete: () => void,\n context: InitializationContext\n ) => Promise<void> | void;\n\n /**\n * 存储配置\n */\n storageOptions?: StorageOptions;\n\n /**\n * IndexedDB 表名\n */\n indexedDBTableName?: string;\n\n /**\n * UI Provider 配置(框架无关)\n * 可由 UI 适配器消费,适配到 antd/shadcn 等实现。\n */\n uiProvider?: UIProviderConfig;\n\n /**\n * UI App 基础配置(框架无关)\n * 可用于通知、弹窗、消息容器等能力的统一注入。\n */\n uiApp?: UIAppConfig;\n\n /**\n * 全局 UI 包裹组件懒加载器\n * \n * 组件会在 BasicLayout 中统一包裹 children。\n * 需返回带 default 导出的 React 组件模块。\n *\n * @example\n * ```typescript\n * start({\n * globalProvider: () => import('./components/AntdGlobalProvider'),\n * });\n * ```\n */\n globalProvider?: GlobalProviderLoader;\n\n /**\n * @deprecated 使用 uiProvider 替代\n */\n antd?: Record<string, unknown>;\n\n /**\n * @deprecated 使用 uiApp 替代\n */\n antdApp?: Record<string, unknown>;\n\n /**\n * 主题配置\n * \n * @example\n * ```typescript\n * start({\n * theme: {\n * mode: 'dark',\n * primaryColor: '#1890ff',\n * },\n * });\n * ```\n */\n theme?: ThemeConfig;\n\n /**\n * 运行时安全配置\n */\n runtimeSecurity?: import('../utils/runtimeSecurity').RuntimeSecurityOptions;\n\n /**\n * 配置安全选项\n */\n configSecurity?: import('../utils/configSecurity').ConfigSecurityOptions;\n\n /**\n * 性能监控配置\n */\n performanceMonitor?: import('../utils/performance').PerformanceMonitorConfig;\n\n /**\n * 错误监控配置\n */\n errorMonitor?: import('@vlian/monitoring').ErrorMonitorConfig;\n\n /**\n * 分析服务配置\n */\n analytics?: import('../utils/analytics').AnalyticsConfig;\n\n /**\n * 状态管理器配置\n * \n * 配置框架的状态管理器,支持自定义适配器和作用域设置。\n * 如果不提供,将使用默认配置创建状态管理器。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * stateManager: {\n * enableRegistry: true,\n * defaultScope: 'app',\n * devMode: true,\n * },\n * });\n * ```\n */\n stateManager?: import('../state').StateManagerOptions;\n\n /**\n * 事件总线配置\n * \n * 配置应用级事件系统,支持事件追踪、性能监控、安全模式等。\n * 如果不提供,将使用默认配置创建事件总线。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * eventBus: {\n * enableTracking: true,\n * maxHistorySize: 200,\n * enablePerformanceMonitoring: true,\n * namespacePrefix: 'my-app:',\n * },\n * });\n * ```\n */\n eventBus?: {\n enableTracking?: boolean;\n maxHistorySize?: number;\n enableValidation?: boolean;\n validator?: (event: string, data: unknown) => boolean;\n enablePerformanceMonitoring?: boolean;\n namespacePrefix?: string;\n instanceId?: string;\n enableSecurityMode?: boolean;\n allowedSources?: string[];\n };\n\n /**\n * 自定义启动屏组件\n * \n * 如果提供,将使用自定义组件替代默认的启动屏 UI。\n * 自定义组件将接收初始化进度、当前步骤和初始化状态作为 props。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * const CustomSplashScreen = ({ progress, currentStep, isInitializing }) => {\n * return (\n * <div>\n * <h1>加载中...</h1>\n * <div>进度: {progress}%</div>\n * <div>步骤: {currentStep}</div>\n * </div>\n * );\n * };\n * \n * start({\n * splashScreen: CustomSplashScreen,\n * });\n * ```\n */\n splashScreen?: React.ComponentType<SplashScreenCustomProps>;\n\n /**\n * 自定义错误反馈组件\n * \n * 如果提供,将使用自定义的错误 UI 替代默认错误 UI。\n * 自定义组件将接收错误对象和重置函数作为参数。\n * \n * @param error - 标准化后的框架错误对象\n * @param resetError - 重置错误边界的函数,调用后可以尝试重新渲染子组件\n * @returns 错误 UI 的 React 节点\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * start({\n * errorFallback: (error, reset) => (\n * <div>\n * <h2>自定义错误标题</h2>\n * <p>{error.message}</p>\n * <button onClick={reset}>重试</button>\n * </div>\n * ),\n * });\n * ```\n */\n errorFallback?: (error: FrameworkError, resetError: () => void) => ReactNode;\n\n /**\n * 安全配置选项\n * \n * 用于配置框架的安全策略,包括 XSS 防护、配置验证等。\n * 框架默认启用所有安全策略,确保应用安全。\n * \n * @example\n * ```typescript\n * start({\n * security: {\n * enableXSSProtection: true, // 默认启用\n * validateConfig: true, // 默认启用\n * sanitizeUserInput: true, // 默认启用\n * },\n * });\n * ```\n */\n security?: {\n /**\n * 是否启用 XSS 防护\n * @default true\n */\n enableXSSProtection?: boolean;\n /**\n * 是否验证配置项安全性\n * @default true\n */\n validateConfig?: boolean;\n /**\n * 是否清理用户输入\n * @default true\n */\n sanitizeUserInput?: boolean;\n /**\n * CSP(内容安全策略)配置\n */\n csp?: {\n defaultSrc?: string[];\n scriptSrc?: string[];\n styleSrc?: string[];\n imgSrc?: string[];\n connectSrc?: string[];\n fontSrc?: string[];\n frameSrc?: string[];\n allowUnsafeInline?: boolean;\n allowUnsafeEval?: boolean;\n };\n /**\n * CSRF 防护配置\n */\n csrf?: {\n /**\n * 是否启用 CSRF 防护\n * @default true\n */\n enabled?: boolean;\n /**\n * CSRF Token 获取函数\n * 如果不提供,框架会自动从 cookie 或 header 中获取\n */\n getToken?: () => string | Promise<string>;\n /**\n * CSRF Token 验证函数\n * 如果不提供,框架会使用默认验证逻辑\n */\n validateToken?: (token: string) => boolean | Promise<boolean>;\n /**\n * CSRF Token 请求头名称\n * @default 'X-CSRF-Token'\n */\n headerName?: string;\n /**\n * CSRF Token Cookie 名称\n * @default 'csrf-token'\n */\n cookieName?: string;\n };\n };\n \n /**\n * 服务初始化重试配置\n * \n * 用于配置服务初始化失败时的重试策略。\n * \n * @example\n * ```typescript\n * start({\n * serviceRetry: {\n * maxRetries: 3,\n * retryDelay: 1000,\n * exponentialBackoff: true,\n * },\n * });\n * ```\n */\n serviceRetry?: {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n };\n}\n\n/**\n * 自定义启动屏组件的 Props\n */\nexport interface SplashScreenCustomProps {\n /**\n * 初始化进度(0-100)\n */\n progress: number;\n\n /**\n * 当前步骤描述\n */\n currentStep: string;\n\n /**\n * 是否正在初始化\n */\n isInitializing: boolean;\n}\n"],"names":[],"mappings":"AAigBA;;CAEC,GACD,WAeC"}
|
|
1
|
+
{"version":3,"sources":["../../src/core/types.ts"],"sourcesContent":["import { LogLevel } from '@vlian/logger';\nimport type { LangType } from '../library/locale/types';\nimport { Container, RootOptions } from 'react-dom/client';\nimport { type ComponentType, type PropsWithChildren, type ReactElement, type ReactNode } from 'react';\nimport { type InitializationContext } from './initialization';\nimport type { StorageOptions } from '../types';\nimport type { ThemeConfig } from './app';\nimport type { FrameworkError } from '@vlian/utils';\nimport type { RouterConfig } from './router/types';\n\nexport type UIProviderConfig = Record<string, unknown>;\nexport type UIAppConfig = Record<string, unknown>;\nexport type GlobalProviderComponent = ComponentType<PropsWithChildren>;\nexport type GlobalProviderLoader = () => Promise<{ default: GlobalProviderComponent }>;\n\n/**\n * 生命周期钩子函数类型\n */\nexport type ManagerLifecycle = {\n /**\n * 在初始化之前执行\n */\n beforeInitialization?: () => Promise<void> | void;\n\n /**\n * 初始化\n */\n initialization?: () => Promise<void> | void;\n\n /**\n * 在初始化之后执行\n * \n * @param context - 初始化上下文,包含配置、进度、耗时等信息\n * \n * @example\n * ```typescript\n * start({\n * lifecycle: {\n * afterInitialization: (context) => {\n * console.log('初始化完成', context);\n * },\n * },\n * });\n * ```\n */\n afterInitialization?: (context: InitializationContext) => Promise<void> | void;\n};\n\n\n/**\n * 启动配置选项\n */\nexport interface StartOptions {\n /**\n * React 应用的挂载容器\n * \n * 用于指定 React 应用渲染的目标 DOM 元素。如果不提供,框架将自动查找页面中\n * 的根元素(通常为 id=\"root\" 的元素)作为默认容器。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * // 使用默认容器(自动查找 id=\"root\" 的元素)\n * start({});\n * \n * // 指定自定义容器\n * const container = document.getElementById('app');\n * start({ container });\n * ```\n */\n container?: Container;\n /**\n * React 根节点的配置选项\n * \n * 用于配置 React 18+ 的 createRoot 方法的选项,包括:\n * - `onRecoverableError`: 错误恢复回调函数\n * - `identifierPrefix`: 用于标识符前缀,用于服务端渲染的 hydration\n * \n * 这些选项将传递给 `react-dom/client` 的 `createRoot` 方法。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * rootOptions: {\n * onRecoverableError: (error) => {\n * console.error('React 错误恢复:', error);\n * },\n * identifierPrefix: 'my-app-',\n * },\n * });\n * ```\n */\n rootOptions?: RootOptions;\n /**\n * 应用根组件\n * \n * 用于指定要渲染的 React 应用根组件。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * import App from './App';\n * \n * start({\n * app: <App />,\n * });\n * ```\n */\n app?: ReactElement;\n /**\n * 是否显示启动页\n * - 'auto': 自动判断(推荐)\n * - 'always': 总是显示\n * - 'never': 从不显示\n * - 'first-time-only': 仅首次加载显示\n * \n * @default 'auto'\n */\n showSplashScreen?: 'auto' | 'always' | 'never' | 'first-time-only';\n\n /**\n * 启动页最小显示时间(毫秒)\n * \n * 用于避免启动页闪烁,确保用户能看到启动过程。\n * 如果初始化完成时间小于此值,将等待至最小时间后再隐藏启动页。\n * \n * @default 500\n * \n * @example\n * ```typescript\n * start({\n * minSplashScreenTime: 1000, // 至少显示 1 秒\n * });\n * ```\n */\n minSplashScreenTime?: number;\n\n /**\n * 路由配置\n * \n * 配置应用的路由系统,支持内置路由、自定义路由和禁用路由三种模式。\n * \n * @example\n * ```typescript\n * start({\n * router: {\n * enabled: true,\n * routes: [\n * {\n * path: '/login',\n * page: LoginPage,\n * },\n * {\n * path: '/',\n * layout: MainLayout,\n * children: [\n * {\n * path: 'dashboard',\n * page: DashboardPage,\n * meta: { title: '仪表盘' },\n * },\n * ],\n * },\n * ],\n * },\n * });\n * ```\n */\n router?: RouterConfig;\n /**\n * 日志级别\n */\n loggerLevel?: LogLevel;\n /**\n * 生命周期钩子\n */\n lifecycle?: ManagerLifecycle;\n /**\n * 国际化\n */\n locale?: Record<LangType, Record<string, unknown>>;\n /**\n * 启动页完成回调\n * 仅在显示启动页时,启动页完成初始化后调用\n * 可以在这里执行额外的操作,然后调用 complete() 继续\n * \n * @example\n * ```typescript\n * start({\n * onSplashComplete: (complete, context) => {\n * // 执行额外操作\n * await doSomething();\n * // 完成后继续\n * complete();\n * },\n * });\n * ```\n */\n onSplashComplete?: (\n complete: () => void,\n context: InitializationContext\n ) => Promise<void> | void;\n\n /**\n * 存储配置\n */\n storageOptions?: StorageOptions;\n\n /**\n * IndexedDB 表名\n */\n indexedDBTableName?: string;\n\n /**\n * UI Provider 配置(框架无关)\n * 可由 UI 适配器消费,适配到 antd/shadcn 等实现。\n */\n uiProvider?: UIProviderConfig;\n\n /**\n * UI App 基础配置(框架无关)\n * 可用于通知、弹窗、消息容器等能力的统一注入。\n */\n uiApp?: UIAppConfig;\n\n /**\n * 全局 UI 包裹组件懒加载器\n * \n * 组件会在 BasicLayout 中统一包裹 children。\n * 需返回带 default 导出的 React 组件模块。\n *\n * @example\n * ```typescript\n * start({\n * globalProvider: () => import('./components/AntdGlobalProvider'),\n * });\n * ```\n */\n globalProvider?: GlobalProviderLoader;\n\n /**\n * @deprecated 使用 uiProvider 替代\n */\n antd?: Record<string, unknown>;\n\n /**\n * @deprecated 使用 uiApp 替代\n */\n antdApp?: Record<string, unknown>;\n\n /**\n * 主题配置\n * \n * @example\n * ```typescript\n * start({\n * theme: {\n * mode: 'dark',\n * primaryColor: '#1890ff',\n * },\n * });\n * ```\n */\n theme?: ThemeConfig;\n\n /**\n * 运行时安全配置\n */\n runtimeSecurity?: import('../utils/runtimeSecurity').RuntimeSecurityOptions;\n\n /**\n * 配置安全选项\n */\n configSecurity?: import('../utils/configSecurity').ConfigSecurityOptions;\n\n /**\n * 性能监控配置\n */\n performanceMonitor?: import('../utils/performance').PerformanceMonitorConfig;\n\n /**\n * 错误监控配置\n */\n errorMonitor?: import('@vlian/monitoring').ErrorMonitorConfig;\n\n /**\n * 分析服务配置\n */\n analytics?: import('../utils/analytics').AnalyticsConfig;\n\n /**\n * 状态管理器配置\n * \n * 配置框架的状态管理器,支持自定义适配器和作用域设置。\n * 如果不提供,将使用默认配置创建状态管理器。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * stateManager: {\n * enableRegistry: true,\n * defaultScope: 'app',\n * devMode: true,\n * },\n * });\n * ```\n */\n stateManager?: import('../state').StateManagerOptions;\n\n /**\n * 事件总线配置\n * \n * 配置应用级事件系统,支持事件追踪、性能监控、安全模式等。\n * 如果不提供,将使用默认配置创建事件总线。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * eventBus: {\n * enableTracking: true,\n * maxHistorySize: 200,\n * enablePerformanceMonitoring: true,\n * namespacePrefix: 'my-app:',\n * },\n * });\n * ```\n */\n eventBus?: {\n enableTracking?: boolean;\n maxHistorySize?: number;\n enableValidation?: boolean;\n validator?: (event: string, data: unknown) => boolean;\n enablePerformanceMonitoring?: boolean;\n namespacePrefix?: string;\n instanceId?: string;\n enableSecurityMode?: boolean;\n allowedSources?: string[];\n };\n\n /**\n * 自定义启动屏组件\n * \n * 如果提供,将使用自定义组件替代默认的启动屏 UI。\n * 自定义组件将接收初始化进度、当前步骤和初始化状态作为 props。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * const CustomSplashScreen = ({ progress, currentStep, isInitializing }) => {\n * return (\n * <div>\n * <h1>加载中...</h1>\n * <div>进度: {progress}%</div>\n * <div>步骤: {currentStep}</div>\n * </div>\n * );\n * };\n * \n * start({\n * splashScreen: CustomSplashScreen,\n * });\n * ```\n */\n splashScreen?: React.ComponentType<SplashScreenCustomProps>;\n\n /**\n * 自定义错误反馈组件\n * \n * 如果提供,将使用自定义的错误 UI 替代默认错误 UI。\n * 自定义组件将接收错误对象和重置函数作为参数。\n * \n * @param error - 标准化后的框架错误对象\n * @param resetError - 重置错误边界的函数,调用后可以尝试重新渲染子组件\n * @returns 错误 UI 的 React 节点\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * start({\n * errorFallback: (error, reset) => (\n * <div>\n * <h2>自定义错误标题</h2>\n * <p>{error.message}</p>\n * <button onClick={reset}>重试</button>\n * </div>\n * ),\n * });\n * ```\n */\n errorFallback?: (error: FrameworkError, resetError: () => void) => ReactNode;\n\n /**\n * 安全配置选项\n * \n * 用于配置框架的安全策略,包括 XSS 防护、配置验证等。\n * 框架默认启用所有安全策略,确保应用安全。\n * \n * @example\n * ```typescript\n * start({\n * security: {\n * enableXSSProtection: true, // 默认启用\n * validateConfig: true, // 默认启用\n * sanitizeUserInput: true, // 默认启用\n * },\n * });\n * ```\n */\n security?: {\n /**\n * 是否启用 XSS 防护\n * @default true\n */\n enableXSSProtection?: boolean;\n /**\n * 是否验证配置项安全性\n * @default true\n */\n validateConfig?: boolean;\n /**\n * 是否清理用户输入\n * @default true\n */\n sanitizeUserInput?: boolean;\n /**\n * CSP(内容安全策略)配置\n */\n csp?: {\n defaultSrc?: string[];\n scriptSrc?: string[];\n styleSrc?: string[];\n imgSrc?: string[];\n connectSrc?: string[];\n fontSrc?: string[];\n frameSrc?: string[];\n allowUnsafeInline?: boolean;\n allowUnsafeEval?: boolean;\n };\n /**\n * CSRF 防护配置\n */\n csrf?: {\n /**\n * 是否启用 CSRF 防护\n * @default true\n */\n enabled?: boolean;\n /**\n * CSRF Token 获取函数\n * 如果不提供,框架会自动从 cookie 或 header 中获取\n */\n getToken?: () => string | Promise<string>;\n /**\n * CSRF Token 验证函数\n * 如果不提供,框架会使用默认验证逻辑\n */\n validateToken?: (token: string) => boolean | Promise<boolean>;\n /**\n * CSRF Token 请求头名称\n * @default 'X-CSRF-Token'\n */\n headerName?: string;\n /**\n * CSRF Token Cookie 名称\n * @default 'csrf-token'\n */\n cookieName?: string;\n };\n };\n \n /**\n * 服务初始化重试配置\n * \n * 用于配置服务初始化失败时的重试策略。\n * \n * @example\n * ```typescript\n * start({\n * serviceRetry: {\n * maxRetries: 3,\n * retryDelay: 1000,\n * exponentialBackoff: true,\n * },\n * });\n * ```\n */\n serviceRetry?: {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n };\n}\n\n/**\n * 自定义启动屏组件的 Props\n */\nexport interface SplashScreenCustomProps {\n /**\n * 初始化进度(0-100)\n */\n progress: number;\n\n /**\n * 当前步骤描述\n */\n currentStep: string;\n\n /**\n * 是否正在初始化\n */\n isInitializing: boolean;\n}\n"],"names":[],"mappings":"AAigBA;;CAEC,GACD,WAeC"}
|
package/dist/index.cjs
CHANGED
|
@@ -15,72 +15,12 @@ _export(exports, {
|
|
|
15
15
|
get Kernel () {
|
|
16
16
|
return _kernel.Kernel;
|
|
17
17
|
},
|
|
18
|
-
get MonitoringEventType () {
|
|
19
|
-
return _request.MonitoringEventType;
|
|
20
|
-
},
|
|
21
|
-
get PluginLifecycleStage () {
|
|
22
|
-
return _request.PluginLifecycleStage;
|
|
23
|
-
},
|
|
24
|
-
get PluginPriority () {
|
|
25
|
-
return _request.PluginPriority;
|
|
26
|
-
},
|
|
27
|
-
get RequestClient () {
|
|
28
|
-
return _request.RequestClient;
|
|
29
|
-
},
|
|
30
|
-
get RequestErrorCode () {
|
|
31
|
-
return _request.RequestErrorCode;
|
|
32
|
-
},
|
|
33
|
-
get RequestErrorType () {
|
|
34
|
-
return _request.RequestErrorType;
|
|
35
|
-
},
|
|
36
|
-
get RequestPluginManager () {
|
|
37
|
-
return _request.PluginManager;
|
|
38
|
-
},
|
|
39
|
-
get adapterRegistry () {
|
|
40
|
-
return _request.adapterRegistry;
|
|
41
|
-
},
|
|
42
|
-
get axiosAdapter () {
|
|
43
|
-
return _request.axiosAdapter;
|
|
44
|
-
},
|
|
45
|
-
get cancelRequestContext () {
|
|
46
|
-
return _request.cancelRequestContext;
|
|
47
|
-
},
|
|
48
|
-
get completeRequestContext () {
|
|
49
|
-
return _request.completeRequestContext;
|
|
50
|
-
},
|
|
51
|
-
get createCachePlugin () {
|
|
52
|
-
return _request.createCachePlugin;
|
|
53
|
-
},
|
|
54
|
-
get createMonitoringPlugin () {
|
|
55
|
-
return _request.createMonitoringPlugin;
|
|
56
|
-
},
|
|
57
|
-
get createRequestClient () {
|
|
58
|
-
return _request.createRequestClient;
|
|
59
|
-
},
|
|
60
|
-
get createRequestContext () {
|
|
61
|
-
return _request.createRequestContext;
|
|
62
|
-
},
|
|
63
|
-
get createRetryPlugin () {
|
|
64
|
-
return _request.createRetryPlugin;
|
|
65
|
-
},
|
|
66
|
-
get createValidationPlugin () {
|
|
67
|
-
return _request.createValidationPlugin;
|
|
68
|
-
},
|
|
69
|
-
get failRequestContext () {
|
|
70
|
-
return _request.failRequestContext;
|
|
71
|
-
},
|
|
72
|
-
get fetchAdapter () {
|
|
73
|
-
return _request.fetchAdapter;
|
|
74
|
-
},
|
|
75
18
|
get getKernel () {
|
|
76
19
|
return _kernel.getKernel;
|
|
77
20
|
},
|
|
78
21
|
get kernelStartApp () {
|
|
79
22
|
return _kernel.kernelStartApp;
|
|
80
23
|
},
|
|
81
|
-
get kyAdapter () {
|
|
82
|
-
return _request.kyAdapter;
|
|
83
|
-
},
|
|
84
24
|
get setLang () {
|
|
85
25
|
return _library.setLang;
|
|
86
26
|
},
|
|
@@ -89,12 +29,6 @@ _export(exports, {
|
|
|
89
29
|
},
|
|
90
30
|
get startup () {
|
|
91
31
|
return _kernel.startup;
|
|
92
|
-
},
|
|
93
|
-
get undiciAdapter () {
|
|
94
|
-
return undiciAdapter;
|
|
95
|
-
},
|
|
96
|
-
get updateRequestContext () {
|
|
97
|
-
return _request.updateRequestContext;
|
|
98
32
|
}
|
|
99
33
|
});
|
|
100
34
|
const _library = require("./library");
|
|
@@ -102,7 +36,6 @@ _export_star(require("./core"), exports);
|
|
|
102
36
|
_export_star(require("./utils"), exports);
|
|
103
37
|
_export_star(require("./state"), exports);
|
|
104
38
|
_export_star(require("./components"), exports);
|
|
105
|
-
const _request = require("@vlian/request");
|
|
106
39
|
const _kernel = require("./kernel");
|
|
107
40
|
function _export_star(from, to) {
|
|
108
41
|
Object.keys(from).forEach(function(k) {
|
|
@@ -117,50 +50,5 @@ function _export_star(from, to) {
|
|
|
117
50
|
});
|
|
118
51
|
return from;
|
|
119
52
|
}
|
|
120
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
121
|
-
if (typeof WeakMap !== "function") return null;
|
|
122
|
-
var cacheBabelInterop = new WeakMap();
|
|
123
|
-
var cacheNodeInterop = new WeakMap();
|
|
124
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
125
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
126
|
-
})(nodeInterop);
|
|
127
|
-
}
|
|
128
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
129
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
130
|
-
return obj;
|
|
131
|
-
}
|
|
132
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
133
|
-
return {
|
|
134
|
-
default: obj
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
138
|
-
if (cache && cache.has(obj)) {
|
|
139
|
-
return cache.get(obj);
|
|
140
|
-
}
|
|
141
|
-
var newObj = {
|
|
142
|
-
__proto__: null
|
|
143
|
-
};
|
|
144
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
145
|
-
for(var key in obj){
|
|
146
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
147
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
148
|
-
if (desc && (desc.get || desc.set)) {
|
|
149
|
-
Object.defineProperty(newObj, key, desc);
|
|
150
|
-
} else {
|
|
151
|
-
newObj[key] = obj[key];
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
newObj.default = obj;
|
|
156
|
-
if (cache) {
|
|
157
|
-
cache.set(obj, newObj);
|
|
158
|
-
}
|
|
159
|
-
return newObj;
|
|
160
|
-
}
|
|
161
|
-
async function undiciAdapter() {
|
|
162
|
-
const { undiciAdapter: adapter } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("@vlian/request")));
|
|
163
|
-
return adapter();
|
|
164
|
-
}
|
|
165
53
|
|
|
166
54
|
//# sourceMappingURL=index.js.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { setupI18n, setLang, $t } from './library';\n\nexport * from './core';\nexport * from './utils';\nexport * from './state';\nexport * from './components';\n\n
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { setupI18n, setLang, $t } from './library';\n\nexport * from './core';\nexport * from './utils';\nexport * from './state';\nexport * from './components';\n\n/**\n * 国际化\n **/\nexport { setupI18n, setLang, $t };\n\n\nexport { Kernel, startup, getKernel, kernelStartApp } from './kernel';\nexport type {\n KernelStartOptions as KernelStartupOptions,\n KernelConfig as KernelRuntimeConfig,\n KernelTimingMetric as KernelRuntimeTimingMetric,\n KernelManager as RuntimeKernelManager,\n} from './kernel';\n"],"names":["$t","Kernel","getKernel","kernelStartApp","setLang","setupI18n","startup"],"mappings":";;;;;;;;;;;QAU6BA;eAAAA,WAAE;;QAGtBC;eAAAA,cAAM;;QAAWC;eAAAA,iBAAS;;QAAEC;eAAAA,sBAAc;;QAH/BC;eAAAA,gBAAO;;QAAlBC;eAAAA,kBAAS;;QAGDC;eAAAA,eAAO;;;yBAbe;qBAEzB;qBACA;qBACA;qBACA;wBAQ6C"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,10 +3,6 @@ export * from './core';
|
|
|
3
3
|
export * from './utils';
|
|
4
4
|
export * from './state';
|
|
5
5
|
export * from './components';
|
|
6
|
-
export { RequestClient, createRequestClient, adapterRegistry, fetchAdapter, kyAdapter, axiosAdapter, PluginManager as RequestPluginManager, PluginLifecycleStage, PluginPriority, createCachePlugin, createRetryPlugin, createValidationPlugin, createMonitoringPlugin, createRequestContext, updateRequestContext, completeRequestContext, failRequestContext, cancelRequestContext, RequestErrorType, RequestErrorCode, } from '@vlian/request';
|
|
7
|
-
export declare function undiciAdapter(): Promise<import("@vlian/request").RequestAdapter>;
|
|
8
|
-
export type { RequestOptions, Response, RequestContext, RequestError, RequestClientConfig, RequestHeaders, RequestQuery, RequestBody, HttpMethod, RetryConfig, CacheConfig, ValidationConfig, AdapterCapabilities, RequestAdapter, AdapterFactory as RequestAdapterFactory, RequestPlugin, CachePluginConfig, RetryPluginConfig, ValidationPluginConfig, MonitoringPluginConfig, MonitoringEvent, MonitoringReporter, } from '@vlian/request';
|
|
9
|
-
export { MonitoringEventType } from '@vlian/request';
|
|
10
6
|
/**
|
|
11
7
|
* 国际化
|
|
12
8
|
**/
|
package/dist/index.js
CHANGED
|
@@ -3,14 +3,6 @@ export * from "./core";
|
|
|
3
3
|
export * from "./utils";
|
|
4
4
|
export * from "./state";
|
|
5
5
|
export * from "./components";
|
|
6
|
-
// 导出请求库(使用命名空间避免冲突)
|
|
7
|
-
export { RequestClient, createRequestClient, adapterRegistry, fetchAdapter, kyAdapter, axiosAdapter, PluginManager as RequestPluginManager, PluginLifecycleStage, PluginPriority, createCachePlugin, createRetryPlugin, createValidationPlugin, createMonitoringPlugin, createRequestContext, updateRequestContext, completeRequestContext, failRequestContext, cancelRequestContext, RequestErrorType, RequestErrorCode } from "@vlian/request";
|
|
8
|
-
// undiciAdapter 使用懒加载,避免在未使用时触发依赖检查
|
|
9
|
-
export async function undiciAdapter() {
|
|
10
|
-
const { undiciAdapter: adapter } = await import("@vlian/request");
|
|
11
|
-
return adapter();
|
|
12
|
-
}
|
|
13
|
-
export { MonitoringEventType } from "@vlian/request";
|
|
14
6
|
/**
|
|
15
7
|
* 国际化
|
|
16
8
|
**/ export { setupI18n, setLang, $t };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { setupI18n, setLang, $t } from './library';\n\nexport * from './core';\nexport * from './utils';\nexport * from './state';\nexport * from './components';\n\n
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { setupI18n, setLang, $t } from './library';\n\nexport * from './core';\nexport * from './utils';\nexport * from './state';\nexport * from './components';\n\n/**\n * 国际化\n **/\nexport { setupI18n, setLang, $t };\n\n\nexport { Kernel, startup, getKernel, kernelStartApp } from './kernel';\nexport type {\n KernelStartOptions as KernelStartupOptions,\n KernelConfig as KernelRuntimeConfig,\n KernelTimingMetric as KernelRuntimeTimingMetric,\n KernelManager as RuntimeKernelManager,\n} from './kernel';\n"],"names":["setupI18n","setLang","$t","Kernel","startup","getKernel","kernelStartApp"],"mappings":"AAAA,SAASA,SAAS,EAAEC,OAAO,EAAEC,EAAE,QAAQ,YAAY;AAEnD,cAAc,SAAS;AACvB,cAAc,UAAU;AACxB,cAAc,UAAU;AACxB,cAAc,eAAe;AAE7B;;EAEE,GACF,SAASF,SAAS,EAAEC,OAAO,EAAEC,EAAE,GAAG;AAGlC,SAASC,MAAM,EAAEC,OAAO,EAAEC,SAAS,EAAEC,cAAc,QAAQ,WAAW"}
|