@lytjs/devtools 6.5.0 → 6.6.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/componentTree.ts","../src/storeInspector.ts","../src/routeInspector.ts","../src/signalsInspector.ts","../src/vdomInspector.ts","../src/performance.ts","../src/benchmark.ts","../src/devtools.ts"],"names":["isObject","isFunction","options","nodes","currentDepth"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * @lytjs/devtools - 组件树查看器\r\n */\r\n\r\nimport type { ComponentTreeNode } from './types';\r\nimport { isObject } from '@lytjs/common-is';\r\n\r\n// 组件 ID 计数器\r\nlet componentIdCounter = 0;\r\n\r\n/**\r\n * 生成组件 ID\r\n */\r\nfunction generateComponentId(): string {\r\n return `component-${++componentIdCounter}`;\r\n}\r\n\r\n/**\r\n * 提取组件信息\r\n */\r\nfunction extractComponentInfo(component: {\r\n name?: string;\r\n displayName?: string;\r\n props?: Record<string, unknown>;\r\n}): ComponentTreeNode | null {\r\n if (!component) return null;\r\n\r\n const id = generateComponentId();\r\n const name = component.name || component.displayName || 'Anonymous';\r\n\r\n // 提取 props\r\n const props: Record<string, unknown> = {};\r\n if (component.props && isObject(component.props)) {\r\n for (const [key, value] of Object.entries(component.props)) {\r\n if (typeof value !== 'function') {\r\n props[key] = value;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n id,\r\n name,\r\n props: Object.keys(props).length > 0 ? props : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * 递归构建组件树\r\n */\r\nfunction buildComponentTreeRecursive(\r\n component: { name?: string; displayName?: string; props?: Record<string, unknown>; children?: unknown[] },\r\n parentId?: string,\r\n): ComponentTreeNode | null {\r\n const node = extractComponentInfo(component);\r\n if (!node) return null;\r\n\r\n if (parentId) {\r\n node.parent = parentId;\r\n }\r\n\r\n // 递归处理子组件\r\n if (component.children && Array.isArray(component.children)) {\r\n const children: ComponentTreeNode[] = [];\r\n for (const child of component.children) {\r\n const childNode = buildComponentTreeRecursive(child as { name?: string; displayName?: string; props?: Record<string, unknown>; children?: unknown[] }, node.id);\r\n if (childNode) {\r\n children.push(childNode);\r\n }\r\n }\r\n if (children.length > 0) {\r\n node.children = children;\r\n }\r\n }\r\n\r\n return node;\r\n}\r\n\r\n/**\r\n * 获取组件树\r\n */\r\nexport function getComponentTree(rootComponent?: {\r\n name?: string;\r\n displayName?: string;\r\n props?: Record<string, unknown>;\r\n children?: unknown[];\r\n}): ComponentTreeNode[] {\r\n if (!rootComponent) {\r\n // 尝试从全局获取根组件\r\n const globalRoot = (globalThis as { __LYTJS_ROOT__?: unknown }).__LYTJS_ROOT__;\r\n if (!globalRoot) {\r\n return [];\r\n }\r\n rootComponent = globalRoot as { name?: string; displayName?: string; props?: Record<string, unknown>; children?: unknown[] };\r\n }\r\n\r\n const tree = buildComponentTreeRecursive(rootComponent);\r\n return tree ? [tree] : [];\r\n}\r\n\r\n/**\r\n * 序列化组件树为字符串\r\n */\r\nexport function serializeComponentTree(nodes: ComponentTreeNode[], indent = 0): string {\r\n let result = '';\r\n const prefix = ' '.repeat(indent);\r\n \r\n for (const node of nodes) {\r\n result += `${prefix}- ${node.name}`;\r\n if (node.props && Object.keys(node.props).length > 0) {\r\n const propsStr = Object.entries(node.props)\r\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\r\n .join(', ');\r\n result += ` (${propsStr})`;\r\n }\r\n result += '\\n';\r\n \r\n if (node.children && node.children.length > 0) {\r\n result += serializeComponentTree(node.children, indent + 1);\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * 注册根组件(供开发时使用)\r\n */\r\nexport function registerRootComponent(component: unknown): void {\r\n (globalThis as { __LYTJS_ROOT__?: unknown }).__LYTJS_ROOT__ = component;\r\n}\r\n\r\n/**\r\n * 清除注册的根组件\r\n */\r\nexport function unregisterRootComponent(): void {\r\n delete (globalThis as { __LYTJS_ROOT__?: unknown }).__LYTJS_ROOT__;\r\n}\r\n","/**\r\n * @lytjs/devtools - Store 状态检查器\r\n */\r\n\r\nimport type { StoreStateInfo } from './types';\r\nimport { isObject, isFunction } from '@lytjs/common-is';\r\n\r\ninterface StoreInstance {\r\n $state?: Record<string, unknown>;\r\n $id?: string;\r\n $subscribe?: (cb: (mutation: unknown, state: Record<string, unknown>) => void) => () => void;\r\n [key: string]: unknown;\r\n}\r\n\r\n// Store 注册表\r\nconst storeRegistry = new Map<string, StoreInstance>();\r\n\r\n// Store 变更订阅器 Map<storeId, unsubscribe 函数>\r\nconst subscribers = new Map<string, () => void>();\r\n\r\n// 全局 Store 变更回调列表\r\nconst globalChangeCallbacks = new Set<(storeId: string, state: Record<string, unknown>) => void>();\r\n\r\n/**\r\n * Store 变更回调类型\r\n */\r\ntype StoreChangeCallback = (storeId: string, state: Record<string, unknown>) => void;\r\n\r\n/**\r\n * 注册 Store\r\n */\r\nexport function registerStore(id: string, store: StoreInstance): void {\r\n storeRegistry.set(id, store);\r\n}\r\n\r\n/**\r\n * 注销 Store\r\n */\r\nexport function unregisterStore(id: string): void {\r\n storeRegistry.delete(id);\r\n}\r\n\r\n/**\r\n * 获取所有 Store 状态\r\n */\r\nexport function getStoreStates(): StoreStateInfo[] {\r\n const states: StoreStateInfo[] = [];\r\n \r\n for (const [id, store] of storeRegistry.entries()) {\r\n const stateInfo: StoreStateInfo = {\r\n id,\r\n state: {},\r\n };\r\n\r\n // 提取 state\r\n if (store.$state) {\r\n stateInfo.state = deepClone(store.$state);\r\n } else if (isObject(store)) {\r\n // 提取非函数属性作为 state\r\n for (const [key, value] of Object.entries(store)) {\r\n if (!key.startsWith('$') && !isFunction(value)) {\r\n stateInfo.state[key] = deepClone(value);\r\n }\r\n }\r\n }\r\n\r\n // 提取 getters\r\n if (store.$id) {\r\n stateInfo.id = store.$id;\r\n }\r\n\r\n states.push(stateInfo);\r\n }\r\n\r\n return states;\r\n}\r\n\r\n/**\r\n * 获取特定 Store 的状态\r\n */\r\nexport function getStoreState(storeId: string): StoreStateInfo | null {\r\n const store = storeRegistry.get(storeId);\r\n if (!store) return null;\r\n\r\n const stateInfo: StoreStateInfo = {\r\n id: storeId,\r\n state: {},\r\n };\r\n\r\n if (store.$state) {\r\n stateInfo.state = deepClone(store.$state);\r\n } else if (isObject(store)) {\r\n for (const [key, value] of Object.entries(store)) {\r\n if (!key.startsWith('$') && !isFunction(value)) {\r\n stateInfo.state[key] = deepClone(value);\r\n }\r\n }\r\n }\r\n\r\n return stateInfo;\r\n}\r\n\r\n/**\r\n * 修改 Store 状态(用于开发时调试)\r\n */\r\nexport function setStoreState(storeId: string, path: string, value: unknown): boolean {\r\n const store = storeRegistry.get(storeId);\r\n if (!store) return false;\r\n\r\n const keys = path.split('.');\r\n let current: unknown = store;\r\n\r\n // 遍历到倒数第二个 key\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i]!;\r\n if (!isObject(current)) return false;\r\n current = (current as Record<string, unknown>)[key];\r\n }\r\n\r\n // 设置最终值\r\n const lastKey = keys[keys.length - 1];\r\n if (lastKey && isObject(current)) {\r\n (current as Record<string, unknown>)[lastKey] = value;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * 触发 Store Action\r\n */\r\nexport function dispatchStoreAction(storeId: string, actionName: string, ...args: unknown[]): unknown {\r\n const store = storeRegistry.get(storeId);\r\n if (!store) return null;\r\n\r\n const action = (store as Record<string, unknown>)[actionName];\r\n if (!isFunction(action)) {\r\n throw new Error(`Action \"${actionName}\" not found in store \"${storeId}\"`);\r\n }\r\n\r\n return (action as (...args: unknown[]) => unknown).apply(store, args);\r\n}\r\n\r\n/**\r\n * 序列化 Store 状态为字符串\r\n */\r\nexport function serializeStoreStates(states: StoreStateInfo[]): string {\r\n return JSON.stringify(states, null, 2);\r\n}\r\n\r\n/**\r\n * 深度克隆(简化版)\r\n */\r\nfunction deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n if (obj instanceof Date) {\r\n return new Date(obj.getTime()) as unknown as T;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(item => deepClone(item)) as unknown as T;\r\n }\r\n\r\n if (isObject(obj)) {\r\n const cloned: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(obj)) {\r\n cloned[key] = deepClone(value);\r\n }\r\n return cloned as unknown as T;\r\n }\r\n\r\n return obj;\r\n}\r\n\r\n/**\r\n * 订阅 Store 变更\r\n *\r\n * @description\r\n * 当 Store 的 $subscribe 方法可用时自动监听变更,\r\n * 变更时会触发所有通过 onStoreChange 注册的全局回调\r\n *\r\n * @param storeId - 要订阅的 Store ID\r\n * @returns 是否订阅成功\r\n */\r\nexport function subscribeStore(storeId: string): boolean {\r\n const store = storeRegistry.get(storeId);\r\n if (!store) return false;\r\n\r\n // 如果已经订阅,先取消旧订阅\r\n if (subscribers.has(storeId)) {\r\n unsubscribeStore(storeId);\r\n }\r\n\r\n // 优先使用 $subscribe 方法(Pinia 风格)\r\n if (isFunction(store.$subscribe)) {\r\n const unsubscribe = store.$subscribe?.((_mutation: unknown, state: Record<string, unknown>) => {\r\n const currentState = isObject(state) ? deepClone<Record<string, unknown>>(state) : {};\r\n globalChangeCallbacks.forEach(cb => cb(storeId, currentState));\r\n });\r\n subscribers.set(storeId, isFunction(unsubscribe) ? unsubscribe : () => {});\r\n return true;\r\n }\r\n\r\n // 降级方案:如果 Store 本身是响应式的,无法自动监听\r\n return false;\r\n}\r\n\r\n/**\r\n * 取消订阅 Store 变更\r\n *\r\n * @param storeId - 要取消订阅的 Store ID\r\n */\r\nexport function unsubscribeStore(storeId: string): void {\r\n const unsubscribe = subscribers.get(storeId);\r\n if (unsubscribe) {\r\n unsubscribe();\r\n subscribers.delete(storeId);\r\n }\r\n}\r\n\r\n/**\r\n * 注册全局 Store 变更回调\r\n *\r\n * @description\r\n * 当任何已订阅的 Store 发生变更时,会调用此回调\r\n *\r\n * @param callback - 变更回调函数,接收 storeId 和当前 state\r\n * @returns 取消注册的函数\r\n */\r\nexport function onStoreChange(callback: StoreChangeCallback): () => void {\r\n globalChangeCallbacks.add(callback);\r\n return () => {\r\n globalChangeCallbacks.delete(callback);\r\n };\r\n}\r\n\r\n/**\r\n * 清空所有注册的 Store(用于测试)\r\n */\r\nexport function clearStoreRegistry(): void {\r\n // 取消所有订阅\r\n for (const storeId of subscribers.keys()) {\r\n unsubscribeStore(storeId);\r\n }\r\n globalChangeCallbacks.clear();\r\n storeRegistry.clear();\r\n}\r\n\r\n/**\r\n * 获取已注册的 Store ID 列表\r\n */\r\nexport function getRegisteredStoreIds(): string[] {\r\n return Array.from(storeRegistry.keys());\r\n}\r\n","/**\r\n * @lytjs/devtools - 路由查看器\r\n */\r\n\r\nimport type { RouteInfo } from './types';\r\nimport { isFunction } from '@lytjs/common-is';\r\n\r\ninterface RouterMatched {\r\n path?: string;\r\n name?: string | null;\r\n}\r\n\r\ninterface RouterLocation {\r\n path?: string;\r\n name?: string | null;\r\n params?: Record<string, string>;\r\n query?: Record<string, string>;\r\n matched?: RouterMatched[];\r\n}\r\n\r\ninterface RouterInstance {\r\n currentRoute?: () => RouterLocation;\r\n afterEach?: (cb: (to: RouterLocation) => void) => void;\r\n getRoutes?: () => RouterMatched[];\r\n push?: (path: string) => Promise<void>;\r\n back?: () => void;\r\n}\r\n\r\n// 路由器实例\r\nlet routerInstance: RouterInstance | null = null;\r\n\r\n// 路由变更历史记录\r\nconst routeHistory: RouteInfo[] = [];\r\n\r\n// afterEach 钩子的取消注册函数\r\nlet afterEachHandler: (() => void) | null = null;\r\n\r\n/**\r\n * 注册路由器\r\n */\r\nexport function registerRouter(router: RouterInstance): void {\r\n routerInstance = router;\r\n}\r\n\r\n/**\r\n * 注销路由器\r\n */\r\nexport function unregisterRouter(): void {\r\n unwatchRouteChanges();\r\n routerInstance = null;\r\n}\r\n\r\n/**\r\n * 获取当前路由信息\r\n */\r\nexport function getCurrentRoute(): RouteInfo | null {\r\n if (!routerInstance) return null;\r\n\r\n const currentRoute = routerInstance.currentRoute?.();\r\n if (!currentRoute) return null;\r\n\r\n return {\r\n path: currentRoute.path || '/',\r\n name: currentRoute.name || null,\r\n params: currentRoute.params || {},\r\n query: currentRoute.query || {},\r\n matched: (currentRoute.matched || []).map((m: { path?: string; name?: string | null }) => ({\r\n path: m.path || '',\r\n name: m.name || null,\r\n })),\r\n };\r\n}\r\n\r\n/**\r\n * 获取路由历史\r\n *\r\n * @description\r\n * 返回自监听开始以来的所有路由变更记录\r\n *\r\n * @returns 路由变更历史数组\r\n */\r\nexport function getRouteHistory(): RouteInfo[] {\r\n return [...routeHistory];\r\n}\r\n\r\n/**\r\n * 监听路由变化\r\n *\r\n * @description\r\n * 利用 router.afterEach 钩子监听路由导航,\r\n * 每次导航后将路由信息记录到 routeHistory 中\r\n *\r\n * @returns 是否成功开始监听\r\n */\r\nexport function watchRouteChanges(): boolean {\r\n if (!routerInstance) return false;\r\n if (!isFunction(routerInstance.afterEach)) return false;\r\n\r\n // 避免重复监听\r\n if (afterEachHandler !== null) {\r\n unwatchRouteChanges();\r\n }\r\n\r\n // 注册 afterEach 钩子\r\n routerInstance.afterEach?.((to: RouterLocation) => {\r\n const routeInfo: RouteInfo = {\r\n path: to.path || '/',\r\n name: to.name || null,\r\n params: to.params || {},\r\n query: to.query || {},\r\n matched: ((to.matched as RouterMatched[]) || []).map((m) => ({\r\n path: m.path || '',\r\n name: m.name || null,\r\n })),\r\n };\r\n routeHistory.push(routeInfo);\r\n });\r\n\r\n // 标记已开始监听\r\n afterEachHandler = () => {\r\n // Vue Router 的 afterEach 无法直接取消,这里标记为已停止\r\n afterEachHandler = null;\r\n };\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * 停止监听路由变化\r\n *\r\n * @description\r\n * 停止路由变更监听,但已记录的历史不会被清除\r\n */\r\nexport function unwatchRouteChanges(): void {\r\n if (afterEachHandler) {\r\n afterEachHandler();\r\n afterEachHandler = null;\r\n }\r\n}\r\n\r\n/**\r\n * 导航到指定路径\r\n */\r\nexport function navigateTo(path: string): Promise<void> {\r\n if (!routerInstance) {\r\n return Promise.reject(new Error('Router not registered'));\r\n }\r\n\r\n return routerInstance.push?.(path) || Promise.resolve();\r\n}\r\n\r\n/**\r\n * 导航到指定路由名称\r\n */\r\nexport function navigateToName(name: string, params?: Record<string, string>): Promise<void> {\r\n if (!routerInstance) {\r\n return Promise.reject(new Error('Router not registered'));\r\n }\r\n\r\n const path = `/${name}${params ? '?' + new URLSearchParams(params).toString() : ''}`;\r\n return routerInstance.push?.(path) || Promise.resolve();\r\n}\r\n\r\n/**\r\n * 返回上一页\r\n */\r\nexport function goBack(): Promise<void> {\r\n if (!routerInstance) {\r\n return Promise.reject(new Error('Router not registered'));\r\n }\r\n\r\n return routerInstance.back?.() || Promise.resolve();\r\n}\r\n\r\n/**\r\n * 序列化路由信息为字符串\r\n */\r\nexport function serializeRouteInfo(route: RouteInfo | null): string {\r\n if (!route) return 'No route information available';\r\n\r\n let result = `Path: ${route.path}\\n`;\r\n result += `Name: ${route.name || 'N/A'}\\n`;\r\n result += `Params: ${JSON.stringify(route.params)}\\n`;\r\n result += `Query: ${JSON.stringify(route.query)}\\n`;\r\n result += `Matched Routes:\\n`;\r\n \r\n if (route.matched.length === 0) {\r\n result += ' (none)\\n';\r\n } else {\r\n for (const match of route.matched) {\r\n result += ` - ${match.path}${match.name ? ` (${match.name})` : ''}\\n`;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 获取所有路由配置\r\n */\r\nexport function getRoutes(): Array<{ path: string; name?: string | null }> {\r\n if (!routerInstance) return [];\r\n\r\n const routes = routerInstance.getRoutes?.() || [];\r\n return routes.map((r) => ({\r\n path: r.path || '',\r\n name: r.name || null,\r\n }));\r\n}\r\n\r\n/**\r\n * 检查路由器是否已注册\r\n */\r\nexport function isRouterRegistered(): boolean {\r\n return routerInstance !== null;\r\n}\r\n\r\n/**\r\n * 清空路由变更历史(用于测试)\r\n */\r\nexport function clearRouteHistory(): void {\r\n routeHistory.length = 0;\r\n}\r\n","/**\r\n * @lytjs/devtools - 信号依赖追踪和快照\r\n *\r\n * 提供时间旅行调试、信号依赖图可视化和性能分析功能\r\n */\r\n\r\n// 信号节点信息\r\nexport interface SignalNode {\r\n id: string;\r\n name: string;\r\n type: 'signal' | 'computed' | 'effect';\r\n value?: unknown;\r\n previousValue?: unknown;\r\n dependencies: string[];\r\n dependents: string[];\r\n updateCount: number;\r\n lastUpdateTime: number;\r\n averageUpdateTime: number;\r\n}\r\n\r\n/** 快照记录 */\r\nexport interface Snapshot {\r\n id: string;\r\n timestamp: number;\r\n label?: string;\r\n signals: Record<string, SignalSnapshot>;\r\n}\r\n\r\n/** 单个信号的快照 */\r\nexport interface SignalSnapshot {\r\n value: unknown;\r\n dependencies: string[];\r\n}\r\n\r\n/** 时间旅行状态 */\r\nexport interface TimeTravelState {\r\n snapshots: Snapshot[];\r\n currentIndex: number;\r\n canUndo: boolean;\r\n canRedo: boolean;\r\n}\r\n\r\n/** 性能记录 */\r\nexport interface PerformanceRecord {\r\n id: string;\r\n name: string;\r\n type: 'signal' | 'computed' | 'effect';\r\n duration: number;\r\n timestamp: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/** 依赖图节点 */\r\nexport interface DependencyGraphNode {\r\n id: string;\r\n name: string;\r\n type: 'signal' | 'computed' | 'effect';\r\n x?: number;\r\n y?: number;\r\n}\r\n\r\n/** 依赖图边 */\r\nexport interface DependencyGraphEdge {\r\n source: string;\r\n target: string;\r\n type: 'dependency' | 'dependent';\r\n}\r\n\r\n/** 依赖图 */\r\nexport interface DependencyGraph {\r\n nodes: DependencyGraphNode[];\r\n edges: DependencyGraphEdge[];\r\n}\r\n\r\n/** 可视化布局节点 */\r\nexport interface VisualLayoutNode {\r\n id: string;\r\n name: string;\r\n type: 'signal' | 'computed' | 'effect';\r\n x: number;\r\n y: number;\r\n level: number;\r\n width: number;\r\n height: number;\r\n inDegree: number;\r\n outDegree: number;\r\n}\r\n\r\n/** 可视化布局边 */\r\nexport interface VisualLayoutEdge {\r\n source: string;\r\n target: string;\r\n sourceX: number;\r\n sourceY: number;\r\n targetX: number;\r\n targetY: number;\r\n type: 'dependency';\r\n}\r\n\r\n/** 可视化布局图 */\r\nexport interface VisualLayoutGraph {\r\n nodes: VisualLayoutNode[];\r\n edges: VisualLayoutEdge[];\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/** 布局选项 */\r\nexport interface LayoutOptions {\r\n nodeWidth: number;\r\n nodeHeight: number;\r\n horizontalSpacing: number;\r\n verticalSpacing: number;\r\n centerX: number;\r\n centerY: number;\r\n}\r\n\r\n/** 默认布局选项 */\r\nconst DEFAULT_LAYOUT_OPTIONS: LayoutOptions = {\r\n nodeWidth: 120,\r\n nodeHeight: 40,\r\n horizontalSpacing: 60,\r\n verticalSpacing: 80,\r\n centerX: 300,\r\n centerY: 200,\r\n};\r\n\r\n// 信号注册表\r\nconst signalRegistry = new Map<string, {\r\n type: 'signal' | 'computed' | 'effect';\r\n name: string;\r\n dependencies: Set<string>;\r\n dependents: Set<string>;\r\n value: unknown;\r\n previousValue?: unknown;\r\n updateCount: number;\r\n updateTimes: number[];\r\n lastUpdateTime: number;\r\n}>();\r\n\r\n// 快照管理器\r\nconst snapshotManager = {\r\n snapshots: [] as Snapshot[],\r\n maxSnapshots: 100,\r\n \r\n add(snapshot: Snapshot) {\r\n this.snapshots.push(snapshot);\r\n if (this.snapshots.length > this.maxSnapshots) {\r\n this.snapshots.shift();\r\n }\r\n },\r\n \r\n getAll(): Snapshot[] {\r\n return [...this.snapshots];\r\n },\r\n \r\n get(index: number): Snapshot | undefined {\r\n return this.snapshots[index];\r\n },\r\n \r\n clear() {\r\n this.snapshots = [];\r\n },\r\n \r\n getLength(): number {\r\n return this.snapshots.length;\r\n }\r\n};\r\n\r\n// 性能记录\r\nconst performanceRecords: PerformanceRecord[] = [];\r\nconst maxPerformanceRecords = 1000;\r\n\r\n/**\r\n * 注册一个信号\r\n */\r\nexport function registerSignal(\r\n id: string,\r\n name: string,\r\n type: 'signal' | 'computed' | 'effect',\r\n initialValue?: unknown\r\n): void {\r\n signalRegistry.set(id, {\r\n type,\r\n name,\r\n dependencies: new Set(),\r\n dependents: new Set(),\r\n value: initialValue,\r\n updateCount: 0,\r\n updateTimes: [],\r\n lastUpdateTime: 0,\r\n });\r\n}\r\n\r\n/**\r\n * 注销一个信号\r\n */\r\nexport function unregisterSignal(id: string): void {\r\n const node = signalRegistry.get(id);\r\n if (node) {\r\n node.dependencies.forEach((depId) => {\r\n const dep = signalRegistry.get(depId);\r\n if (dep) {\r\n dep.dependents.delete(id);\r\n }\r\n });\r\n node.dependents.forEach((depId) => {\r\n const dep = signalRegistry.get(depId);\r\n if (dep) {\r\n dep.dependencies.delete(id);\r\n }\r\n });\r\n }\r\n signalRegistry.delete(id);\r\n}\r\n\r\n/**\r\n * 记录信号更新\r\n */\r\nexport function recordSignalUpdate(\r\n id: string,\r\n newValue: unknown,\r\n duration?: number\r\n): void {\r\n const node = signalRegistry.get(id);\r\n if (node) {\r\n node.previousValue = node.value;\r\n node.value = newValue;\r\n node.updateCount++;\r\n node.lastUpdateTime = Date.now();\r\n \r\n if (duration !== undefined) {\r\n node.updateTimes.push(duration);\r\n if (node.updateTimes.length > 10) {\r\n node.updateTimes.shift();\r\n }\r\n }\r\n \r\n if (duration !== undefined) {\r\n recordPerformance({\r\n id,\r\n name: node.name,\r\n type: node.type,\r\n duration,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 记录依赖关系\r\n */\r\nexport function recordDependency(sourceId: string, targetId: string): void {\r\n const source = signalRegistry.get(sourceId);\r\n const target = signalRegistry.get(targetId);\r\n \r\n if (source && target) {\r\n source.dependencies.add(targetId);\r\n target.dependents.add(sourceId);\r\n }\r\n}\r\n\r\n/**\r\n * 获取所有信号节点\r\n */\r\nexport function getSignalNodes(): SignalNode[] {\r\n return Array.from(signalRegistry.entries()).map(([id, node]) => ({\r\n id,\r\n name: node.name,\r\n type: node.type,\r\n value: node.value,\r\n previousValue: node.previousValue,\r\n dependencies: Array.from(node.dependencies),\r\n dependents: Array.from(node.dependents),\r\n updateCount: node.updateCount,\r\n lastUpdateTime: node.lastUpdateTime,\r\n averageUpdateTime: node.updateTimes.length > 0\r\n ? node.updateTimes.reduce((a, b) => a + b, 0) / node.updateTimes.length\r\n : 0,\r\n }));\r\n}\r\n\r\n/**\r\n * 获取单个信号节点\r\n */\r\nexport function getSignalNode(id: string): SignalNode | undefined {\r\n const node = signalRegistry.get(id);\r\n if (!node) return undefined;\r\n \r\n return {\r\n id,\r\n name: node.name,\r\n type: node.type,\r\n value: node.value,\r\n previousValue: node.previousValue,\r\n dependencies: Array.from(node.dependencies),\r\n dependents: Array.from(node.dependents),\r\n updateCount: node.updateCount,\r\n lastUpdateTime: node.lastUpdateTime,\r\n averageUpdateTime: node.updateTimes.length > 0\r\n ? node.updateTimes.reduce((a, b) => a + b, 0) / node.updateTimes.length\r\n : 0,\r\n };\r\n}\r\n\r\n/**\r\n * 获取依赖图\r\n */\r\nexport function getDependencyGraph(): DependencyGraph {\r\n const nodes: DependencyGraphNode[] = [];\r\n const edges: DependencyGraphEdge[] = [];\r\n \r\n signalRegistry.forEach((node, id) => {\r\n nodes.push({\r\n id,\r\n name: node.name,\r\n type: node.type,\r\n });\r\n \r\n node.dependencies.forEach((depId) => {\r\n edges.push({\r\n source: depId,\r\n target: id,\r\n type: 'dependency',\r\n });\r\n });\r\n });\r\n \r\n return { nodes, edges };\r\n}\r\n\r\n/**\r\n * 创建快照\r\n */\r\nexport function createSnapshot(label?: string): Snapshot {\r\n const snapshot: Snapshot = {\r\n id: `snapshot_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n timestamp: Date.now(),\r\n label,\r\n signals: {},\r\n };\r\n \r\n signalRegistry.forEach((node, id) => {\r\n snapshot.signals[id] = {\r\n value: node.value,\r\n dependencies: Array.from(node.dependencies),\r\n };\r\n });\r\n \r\n snapshotManager.add(snapshot);\r\n return snapshot;\r\n}\r\n\r\n/**\r\n * 获取所有快照\r\n */\r\nexport function getSnapshots(): Snapshot[] {\r\n return snapshotManager.getAll();\r\n}\r\n\r\n/**\r\n * 获取快照\r\n */\r\nexport function getSnapshot(index: number): Snapshot | undefined {\r\n return snapshotManager.get(index);\r\n}\r\n\r\n/**\r\n * 获取时间旅行状态\r\n */\r\nexport function getTimeTravelState(): TimeTravelState {\r\n const length = snapshotManager.getLength();\r\n return {\r\n snapshots: snapshotManager.getAll(),\r\n currentIndex: length - 1,\r\n canUndo: length > 1,\r\n canRedo: false,\r\n };\r\n}\r\n\r\n/**\r\n * 恢复到指定快照\r\n */\r\nexport function restoreSnapshot(index: number): Snapshot | undefined {\r\n const snapshot = snapshotManager.get(index);\r\n if (!snapshot) return undefined;\r\n \r\n Object.entries(snapshot.signals).forEach(([id, signalSnapshot]) => {\r\n const node = signalRegistry.get(id);\r\n if (node) {\r\n node.value = signalSnapshot.value;\r\n }\r\n });\r\n \r\n return snapshot;\r\n}\r\n\r\n/**\r\n * 清除所有快照\r\n */\r\nexport function clearSnapshots(): void {\r\n snapshotManager.clear();\r\n}\r\n\r\n/**\r\n * 记录性能数据\r\n */\r\nexport function recordPerformance(record: PerformanceRecord): void {\r\n performanceRecords.push(record);\r\n if (performanceRecords.length > maxPerformanceRecords) {\r\n performanceRecords.shift();\r\n }\r\n}\r\n\r\n/**\r\n * 获取性能记录\r\n */\r\nexport function getPerformanceRecords(limit?: number): PerformanceRecord[] {\r\n const records = [...performanceRecords];\r\n if (limit !== undefined) {\r\n return records.slice(-limit);\r\n }\r\n return records;\r\n}\r\n\r\n/**\r\n * 获取性能统计\r\n */\r\nexport function getPerformanceStats(): {\r\n totalRecords: number;\r\n averageDuration: number;\r\n maxDuration: number;\r\n minDuration: number;\r\n byType: Record<string, { count: number; average: number; max: number }>;\r\n} {\r\n if (performanceRecords.length === 0) {\r\n return {\r\n totalRecords: 0,\r\n averageDuration: 0,\r\n maxDuration: 0,\r\n minDuration: 0,\r\n byType: {},\r\n };\r\n }\r\n \r\n const durations = performanceRecords.map((r) => r.duration);\r\n const byType: Record<string, { count: number; total: number; max: number }> = {};\r\n \r\n performanceRecords.forEach((record) => {\r\n if (!byType[record.type]) {\r\n byType[record.type] = { count: 0, total: 0, max: 0 };\r\n }\r\n const typeStats = byType[record.type]!;\r\n typeStats.count++;\r\n typeStats.total += record.duration;\r\n typeStats.max = Math.max(typeStats.max, record.duration);\r\n });\r\n \r\n const byTypeResult: Record<string, { count: number; average: number; max: number }> = {};\r\n Object.entries(byType).forEach(([type, data]) => {\r\n byTypeResult[type] = {\r\n count: data.count,\r\n average: data.total / data.count,\r\n max: data.max,\r\n };\r\n });\r\n \r\n return {\r\n totalRecords: performanceRecords.length,\r\n averageDuration: durations.reduce((a, b) => a + b, 0) / durations.length,\r\n maxDuration: Math.max(...durations),\r\n minDuration: Math.min(...durations),\r\n byType: byTypeResult,\r\n };\r\n}\r\n\r\n/**\r\n * 清除性能记录\r\n */\r\nexport function clearPerformanceRecords(): void {\r\n performanceRecords.length = 0;\r\n}\r\n\r\n/**\r\n * 清除所有注册信号\r\n */\r\nexport function clearSignalRegistry(): void {\r\n signalRegistry.clear();\r\n}\r\n\r\n/**\r\n * 序列化信号节点用于显示\r\n */\r\nexport function serializeSignalNode(node: SignalNode): string {\r\n let result = `📊 ${node.name} (${node.type})\\n`;\r\n result += ` ID: ${node.id}\\n`;\r\n result += ` 更新次数: ${node.updateCount}\\n`;\r\n result += ` 最后更新: ${new Date(node.lastUpdateTime).toLocaleTimeString()}\\n`;\r\n \r\n if (node.averageUpdateTime > 0) {\r\n result += ` 平均更新耗时: ${node.averageUpdateTime.toFixed(2)}ms\\n`;\r\n }\r\n \r\n if (node.dependencies.length > 0) {\r\n result += ` 依赖: ${node.dependencies.join(', ')}\\n`;\r\n }\r\n \r\n if (node.dependents.length > 0) {\r\n result += ` 被依赖: ${node.dependents.join(', ')}\\n`;\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * 序列化依赖图用于显示\r\n */\r\nexport function serializeDependencyGraph(): string {\r\n const graph = getDependencyGraph();\r\n if (graph.nodes.length === 0) {\r\n return '暂无信号数据';\r\n }\r\n \r\n let result = `📈 依赖图 (${graph.nodes.length} 个节点, ${graph.edges.length} 条边)\\n\\n`;\r\n \r\n graph.nodes.forEach((node) => {\r\n const nodeInfo = signalRegistry.get(node.id);\r\n const deps = nodeInfo?.dependencies || new Set();\r\n const dependents = nodeInfo?.dependents || new Set();\r\n \r\n result += `🔹 ${node.name} (${node.type})\\n`;\r\n if (deps.size > 0) {\r\n result += ` ↓ 依赖: ${Array.from(deps).join(', ')}\\n`;\r\n }\r\n if (dependents.size > 0) {\r\n result += ` ↑ 被依赖: ${Array.from(dependents).join(', ')}\\n`;\r\n }\r\n result += '\\n';\r\n });\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * 序列化性能统计\r\n */\r\nexport function serializePerformanceStats(): string {\r\n const stats = getPerformanceStats();\r\n \r\n if (stats.totalRecords === 0) {\r\n return '暂无性能数据';\r\n }\r\n \r\n let result = `⚡ 性能统计\\n\\n`;\r\n result += `总记录数: ${stats.totalRecords}\\n`;\r\n result += `平均耗时: ${stats.averageDuration.toFixed(2)}ms\\n`;\r\n result += `最大耗时: ${stats.maxDuration.toFixed(2)}ms\\n`;\r\n result += `最小耗时: ${stats.minDuration.toFixed(2)}ms\\n\\n`;\r\n \r\n result += `按类型统计:\\n`;\r\n Object.entries(stats.byType).forEach(([type, data]) => {\r\n result += ` ${type}: ${data.count} 次, 平均 ${data.average.toFixed(2)}ms, 最大 ${data.max.toFixed(2)}ms\\n`;\r\n });\r\n \r\n return result;\r\n}\r\n\r\n// ===== 可视化布局功能 =====\r\n\r\n/**\r\n * 计算节点的层级(用于分层布局)\r\n */\r\nfunction calculateNodeLevels(): Map<string, number> {\r\n const levels = new Map<string, number>();\r\n const visited = new Set<string>();\r\n \r\n function visitNode(nodeId: string, level: number): void {\r\n if (visited.has(nodeId)) {\r\n const existingLevel = levels.get(nodeId);\r\n if (existingLevel !== undefined && level > existingLevel) {\r\n levels.set(nodeId, level);\r\n }\r\n return;\r\n }\r\n \r\n visited.add(nodeId);\r\n levels.set(nodeId, level);\r\n \r\n const node = signalRegistry.get(nodeId);\r\n if (node) {\r\n node.dependents.forEach((depId) => {\r\n visitNode(depId, level + 1);\r\n });\r\n }\r\n }\r\n \r\n signalRegistry.forEach((node, id) => {\r\n if (node.dependencies.size === 0) {\r\n visitNode(id, 0);\r\n }\r\n });\r\n \r\n signalRegistry.forEach((_, id) => {\r\n if (!visited.has(id)) {\r\n visitNode(id, 0);\r\n }\r\n });\r\n \r\n return levels;\r\n}\r\n\r\n/**\r\n * 计算每个节点的入度和出度\r\n */\r\nfunction calculateNodeDegrees(): Map<string, { inDegree: number; outDegree: number }> {\r\n const degrees = new Map<string, { inDegree: number; outDegree: number }>();\r\n \r\n signalRegistry.forEach((node, id) => {\r\n degrees.set(id, {\r\n inDegree: node.dependencies.size,\r\n outDegree: node.dependents.size,\r\n });\r\n });\r\n \r\n return degrees;\r\n}\r\n\r\n/**\r\n * 获取可视化布局图\r\n */\r\nexport function getVisualLayoutGraph(options?: Partial<LayoutOptions>): VisualLayoutGraph {\r\n const opts: LayoutOptions = { ...DEFAULT_LAYOUT_OPTIONS, ...options };\r\n \r\n if (signalRegistry.size === 0) {\r\n return { nodes: [], edges: [], width: 0, height: 0 };\r\n }\r\n \r\n const levels = calculateNodeLevels();\r\n const degrees = calculateNodeDegrees();\r\n \r\n const levelNodes = new Map<number, string[]>();\r\n levels.forEach((level, nodeId) => {\r\n const nodes = levelNodes.get(level) || [];\r\n nodes.push(nodeId);\r\n levelNodes.set(level, nodes);\r\n });\r\n \r\n const maxLevel = Math.max(...Array.from(levels.values()), 0);\r\n const maxNodesInLevel = Math.max(...Array.from(levelNodes.values()).map((n) => n.length), 1);\r\n \r\n const graphWidth = (maxNodesInLevel + 1) * (opts.nodeWidth + opts.horizontalSpacing);\r\n const graphHeight = (maxLevel + 2) * (opts.nodeHeight + opts.verticalSpacing);\r\n \r\n const nodes: VisualLayoutNode[] = [];\r\n const edges: VisualLayoutEdge[] = [];\r\n \r\n levelNodes.forEach((nodeIds, level) => {\r\n const levelWidth = nodeIds.length * (opts.nodeWidth + opts.horizontalSpacing) - opts.horizontalSpacing;\r\n const startX = (graphWidth - levelWidth) / 2;\r\n \r\n nodeIds.forEach((nodeId, index) => {\r\n const node = signalRegistry.get(nodeId);\r\n if (!node) return;\r\n \r\n const degree = degrees.get(nodeId) || { inDegree: 0, outDegree: 0 };\r\n const x = startX + index * (opts.nodeWidth + opts.horizontalSpacing);\r\n const y = opts.centerY - (graphHeight / 2) + level * (opts.nodeHeight + opts.verticalSpacing) + opts.verticalSpacing / 2;\r\n \r\n nodes.push({\r\n id: nodeId,\r\n name: node.name,\r\n type: node.type,\r\n x,\r\n y,\r\n level,\r\n width: opts.nodeWidth,\r\n height: opts.nodeHeight,\r\n inDegree: degree.inDegree,\r\n outDegree: degree.outDegree,\r\n });\r\n \r\n node.dependencies.forEach((depId) => {\r\n const depNode = nodes.find((n) => n.id === depId);\r\n if (depNode) {\r\n edges.push({\r\n source: depId,\r\n target: nodeId,\r\n sourceX: depNode.x + opts.nodeWidth,\r\n sourceY: depNode.y + opts.nodeHeight / 2,\r\n targetX: x,\r\n targetY: y + opts.nodeHeight / 2,\r\n type: 'dependency',\r\n });\r\n }\r\n });\r\n });\r\n });\r\n \r\n return { nodes, edges, width: graphWidth, height: graphHeight };\r\n}\r\n\r\n/**\r\n * 获取以指定节点为中心的子图\r\n */\r\nexport function getSubgraph(centerId: string, depth: number = 2): VisualLayoutGraph {\r\n const includedNodes = new Set<string>([centerId]);\r\n const queue: Array<{ id: string; currentDepth: number }> = [{ id: centerId, currentDepth: 0 }];\r\n \r\n while (queue.length > 0) {\r\n const { id, currentDepth } = queue.shift()!;\r\n if (currentDepth >= depth) continue;\r\n \r\n const node = signalRegistry.get(id);\r\n if (node) {\r\n node.dependencies.forEach((depId) => {\r\n if (!includedNodes.has(depId)) {\r\n includedNodes.add(depId);\r\n queue.push({ id: depId, currentDepth: currentDepth + 1 });\r\n }\r\n });\r\n \r\n node.dependents.forEach((depId) => {\r\n if (!includedNodes.has(depId)) {\r\n includedNodes.add(depId);\r\n queue.push({ id: depId, currentDepth: currentDepth + 1 });\r\n }\r\n });\r\n }\r\n }\r\n \r\n const tempRegistry = new Map(signalRegistry);\r\n\r\n signalRegistry.forEach((_, id) => {\r\n if (!includedNodes.has(id)) {\r\n signalRegistry.delete(id);\r\n }\r\n });\r\n\r\n const subgraph = getVisualLayoutGraph();\r\n\r\n signalRegistry.clear();\r\n tempRegistry.forEach((value, key) => {\r\n signalRegistry.set(key, value);\r\n });\r\n\r\n return subgraph;\r\n}\r\n\r\n/**\r\n * 搜索信号节点\r\n */\r\nexport function searchSignals(query: string): SignalNode[] {\r\n const lowerQuery = query.toLowerCase();\r\n return getSignalNodes().filter(\r\n (node) =>\r\n node.name.toLowerCase().includes(lowerQuery) ||\r\n node.id.toLowerCase().includes(lowerQuery) ||\r\n node.type.toLowerCase().includes(lowerQuery)\r\n );\r\n}\r\n\r\n/**\r\n * 过滤信号节点\r\n */\r\nexport function filterSignals(options: {\r\n types?: Array<'signal' | 'computed' | 'effect'>;\r\n minUpdateCount?: number;\r\n hasDependencies?: boolean;\r\n hasDependents?: boolean;\r\n}): SignalNode[] {\r\n return getSignalNodes().filter((node) => {\r\n if (options.types && !options.types.includes(node.type)) {\r\n return false;\r\n }\r\n if (options.minUpdateCount !== undefined && node.updateCount < options.minUpdateCount) {\r\n return false;\r\n }\r\n if (options.hasDependencies && node.dependencies.length === 0) {\r\n return false;\r\n }\r\n if (options.hasDependents && node.dependents.length === 0) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n}\r\n\r\n// ===== 快照比较功能 =====\r\n\r\n/** 快照差异 */\r\nexport interface SnapshotDiff {\r\n added: Array<{ id: string; value: unknown }>;\r\n removed: Array<{ id: string; value: unknown }>;\r\n changed: Array<{\r\n id: string;\r\n oldValue: unknown;\r\n newValue: unknown;\r\n }>;\r\n}\r\n\r\n/**\r\n * 比较两个快照的差异\r\n */\r\nexport function compareSnapshots(snapshot1: Snapshot, snapshot2: Snapshot): SnapshotDiff {\r\n const diff: SnapshotDiff = {\r\n added: [],\r\n removed: [],\r\n changed: [],\r\n };\r\n \r\n const ids1 = new Set(Object.keys(snapshot1.signals));\r\n const ids2 = new Set(Object.keys(snapshot2.signals));\r\n \r\n ids2.forEach((id) => {\r\n if (!ids1.has(id)) {\r\n diff.added.push({\r\n id,\r\n value: snapshot2.signals[id]!.value,\r\n });\r\n }\r\n });\r\n\r\n ids1.forEach((id) => {\r\n if (!ids2.has(id)) {\r\n diff.removed.push({\r\n id,\r\n value: snapshot1.signals[id]!.value,\r\n });\r\n }\r\n });\r\n\r\n ids1.forEach((id) => {\r\n if (ids2.has(id)) {\r\n const oldValue = snapshot1.signals[id]!.value;\r\n const newValue = snapshot2.signals[id]!.value;\r\n if (!Object.is(oldValue, newValue)) {\r\n diff.changed.push({ id, oldValue, newValue });\r\n }\r\n }\r\n });\r\n \r\n return diff;\r\n}\r\n\r\n/**\r\n * 序列化快照差异\r\n */\r\nexport function serializeSnapshotDiff(diff: SnapshotDiff): string {\r\n let result = '';\r\n \r\n if (diff.added.length > 0) {\r\n result += `➕ 新增信号 (${diff.added.length}):\\n`;\r\n diff.added.forEach(({ id, value }) => {\r\n result += ` ${id}: ${JSON.stringify(value)}\\n`;\r\n });\r\n result += '\\n';\r\n }\r\n \r\n if (diff.removed.length > 0) {\r\n result += `➖ 移除信号 (${diff.removed.length}):\\n`;\r\n diff.removed.forEach(({ id, value }) => {\r\n result += ` ${id}: ${JSON.stringify(value)}\\n`;\r\n });\r\n result += '\\n';\r\n }\r\n \r\n if (diff.changed.length > 0) {\r\n result += `🔄 变更信号 (${diff.changed.length}):\\n`;\r\n diff.changed.forEach(({ id, oldValue, newValue }) => {\r\n result += ` ${id}:\\n`;\r\n result += ` 旧值: ${JSON.stringify(oldValue)}\\n`;\r\n result += ` 新值: ${JSON.stringify(newValue)}\\n`;\r\n });\r\n result += '\\n';\r\n }\r\n \r\n if (result === '') {\r\n result = '✨ 快照完全相同';\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * 获取相邻快照的差异\r\n */\r\nexport function getDiffBetweenSnapshots(index1: number, index2: number): SnapshotDiff | null {\r\n const snapshot1 = getSnapshot(index1);\r\n const snapshot2 = getSnapshot(index2);\r\n \r\n if (!snapshot1 || !snapshot2) {\r\n return null;\r\n }\r\n \r\n return compareSnapshots(snapshot1, snapshot2);\r\n}\r\n\r\n/**\r\n * 时间旅行导航\r\n */\r\nexport interface TimeTravelNavigator {\r\n currentIndex: number;\r\n total: number;\r\n canGoBack: boolean;\r\n canGoForward: boolean;\r\n currentSnapshot: Snapshot | null;\r\n previousSnapshot: Snapshot | null;\r\n nextSnapshot: Snapshot | null;\r\n diff: SnapshotDiff | null;\r\n}\r\n\r\n/**\r\n * 获取时间旅行导航状态\r\n */\r\nexport function getTimeTravelNavigator(index?: number): TimeTravelNavigator {\r\n const snapshots = getSnapshots();\r\n const currentIndex = index !== undefined ? index : Math.max(0, snapshots.length - 1);\r\n\r\n return {\r\n currentIndex,\r\n total: snapshots.length,\r\n canGoBack: currentIndex > 0,\r\n canGoForward: currentIndex < snapshots.length - 1,\r\n currentSnapshot: snapshots[currentIndex] ?? null,\r\n previousSnapshot: currentIndex > 0 ? (snapshots[currentIndex - 1] ?? null) : null,\r\n nextSnapshot: snapshots[currentIndex + 1] ?? null,\r\n diff: currentIndex > 0\r\n ? compareSnapshots(snapshots[currentIndex - 1]!, snapshots[currentIndex]!)\r\n : null,\r\n };\r\n}\r\n\r\n/**\r\n * 恢复到上一个快照\r\n */\r\nexport function timeTravelBack(): Snapshot | null {\r\n const navigator = getTimeTravelNavigator();\r\n if (!navigator.canGoBack) return null;\r\n return restoreSnapshot(navigator.currentIndex - 1) ?? null;\r\n}\r\n\r\n/**\r\n * 前进到下一个快照\r\n */\r\nexport function timeTravelForward(): Snapshot | null {\r\n const navigator = getTimeTravelNavigator();\r\n if (!navigator.canGoForward) return null;\r\n return restoreSnapshot(navigator.currentIndex + 1) ?? null;\r\n}\r\n","/**\r\n * @lytjs/devtools - VDOM 节点树检查器\r\n *\r\n * 提供虚拟 DOM 树的可视化和检查功能\r\n */\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\n\r\nexport interface VDOMNodeInfo {\r\n id: string;\r\n type: string;\r\n tagName?: string;\r\n text?: string;\r\n props?: Record<string, unknown>;\r\n children: VDOMNodeInfo[];\r\n parentId?: string;\r\n depth: number;\r\n componentId?: string;\r\n isComponent: boolean;\r\n key?: string | number;\r\n ref?: string;\r\n domElement?: HTMLElement | null;\r\n}\r\n\r\ninterface VDOMRegistry {\r\n roots: Map<string, VDOMNodeInfo>;\r\n nodes: Map<string, VDOMNodeInfo>;\r\n idCounter: number;\r\n}\r\n\r\nconst registry: VDOMRegistry = {\r\n roots: new Map(),\r\n nodes: new Map(),\r\n idCounter: 0,\r\n};\r\n\r\nconst componentVDOMMap = new Map<string, string[]>();\r\n\r\nfunction generateId(): string {\r\n return `vdom-${++registry.idCounter}-${Date.now().toString(36)}`;\r\n}\r\n\r\nfunction getVNodeType(vnode: VNode): { type: string; tagName?: string; isComponent: boolean } {\r\n if (typeof vnode.type === 'string') {\r\n return { type: 'element', tagName: vnode.type, isComponent: false };\r\n } else if (typeof vnode.type === 'object' && vnode.type !== null) {\r\n const name = (vnode.type as { name?: string }).name || 'AnonymousComponent';\r\n return { type: 'component', tagName: name, isComponent: true };\r\n } else if (typeof vnode.type === 'function') {\r\n const name = (vnode.type as { name?: string }).name || 'FunctionalComponent';\r\n return { type: 'component', tagName: name, isComponent: true };\r\n }\r\n return { type: 'unknown', isComponent: false };\r\n}\r\n\r\nfunction extractTextContent(vnode: VNode): string | undefined {\r\n if (vnode.children === null || vnode.children === undefined) {\r\n return undefined;\r\n }\r\n \r\n if (typeof vnode.children === 'string') {\r\n return vnode.children;\r\n }\r\n \r\n if (typeof vnode.children === 'number') {\r\n return String(vnode.children);\r\n }\r\n \r\n if (Array.isArray(vnode.children)) {\r\n const texts: string[] = [];\r\n for (const child of vnode.children) {\r\n if (typeof child === 'string') {\r\n texts.push(child);\r\n } else if (typeof child === 'number') {\r\n texts.push(String(child));\r\n } else if (child && typeof child === 'object' && 'children' in child) {\r\n const childText = extractTextContent(child as VNode);\r\n if (childText) texts.push(childText);\r\n }\r\n }\r\n return texts.length > 0 ? texts.join('') : undefined;\r\n }\r\n \r\n return undefined;\r\n}\r\n\r\nfunction extractProps(vnode: VNode): Record<string, unknown> | undefined {\r\n if (!vnode.props || Object.keys(vnode.props).length === 0) {\r\n return undefined;\r\n }\r\n \r\n const props: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n if (key.startsWith('on')) continue;\r\n if (typeof value === 'function') continue;\r\n props[key] = value;\r\n }\r\n \r\n return Object.keys(props).length > 0 ? props : undefined;\r\n}\r\n\r\nexport function registerVDOMRoot(\r\n vnode: VNode,\r\n componentId?: string\r\n): string {\r\n const id = generateId();\r\n const nodeInfo = processVNode(vnode, id, null, 0, componentId);\r\n \r\n if (nodeInfo) {\r\n registry.roots.set(id, nodeInfo);\r\n registry.nodes.set(id, nodeInfo);\r\n \r\n if (componentId) {\r\n const existing = componentVDOMMap.get(componentId) || [];\r\n existing.push(id);\r\n componentVDOMMap.set(componentId, existing);\r\n }\r\n }\r\n \r\n return id;\r\n}\r\n\r\nfunction processVNode(\r\n vnode: VNode | string | number | null | undefined,\r\n parentId: string | undefined,\r\n _parentDom: HTMLElement | null,\r\n depth: number,\r\n componentId?: string\r\n): VDOMNodeInfo | null {\r\n if (vnode === null || vnode === undefined) {\r\n return null;\r\n }\r\n \r\n if (typeof vnode === 'string' || typeof vnode === 'number') {\r\n const id = generateId();\r\n const text = typeof vnode === 'number' ? String(vnode) : vnode;\r\n const nodeInfo: VDOMNodeInfo = {\r\n id,\r\n type: 'text',\r\n text,\r\n children: [],\r\n parentId,\r\n depth,\r\n isComponent: false,\r\n };\r\n registry.nodes.set(id, nodeInfo);\r\n return nodeInfo;\r\n }\r\n \r\n if (typeof vnode !== 'object') {\r\n return null;\r\n }\r\n \r\n const id = generateId();\r\n const { type, tagName, isComponent } = getVNodeType(vnode);\r\n const text = extractTextContent(vnode);\r\n const props = extractProps(vnode);\r\n \r\n const key = vnode.key !== null && vnode.key !== undefined && typeof vnode.key !== 'symbol' \r\n ? vnode.key \r\n : undefined;\r\n const el = vnode.el;\r\n const domElement = el && el instanceof HTMLElement ? el : null;\r\n \r\n const nodeInfo: VDOMNodeInfo = {\r\n id,\r\n type,\r\n tagName,\r\n text: type === 'text' || !tagName ? text : undefined,\r\n props,\r\n children: [],\r\n parentId,\r\n depth,\r\n componentId,\r\n isComponent,\r\n key,\r\n ref: typeof vnode.ref === 'string' ? vnode.ref : undefined,\r\n domElement,\r\n };\r\n \r\n registry.nodes.set(id, nodeInfo);\r\n \r\n if (vnode.children && Array.isArray(vnode.children)) {\r\n for (const child of vnode.children) {\r\n const childInfo = processVNode(\r\n child as VNode,\r\n id,\r\n domElement,\r\n depth + 1,\r\n componentId\r\n );\r\n if (childInfo) {\r\n nodeInfo.children.push(childInfo);\r\n }\r\n }\r\n }\r\n \r\n return nodeInfo;\r\n}\r\n\r\nexport function unregisterVDOMRoot(id: string): void {\r\n const node = registry.roots.get(id);\r\n if (node) {\r\n cleanupNode(node);\r\n registry.roots.delete(id);\r\n }\r\n}\r\n\r\nfunction cleanupNode(node: VDOMNodeInfo): void {\r\n registry.nodes.delete(node.id);\r\n for (const child of node.children) {\r\n cleanupNode(child);\r\n }\r\n}\r\n\r\nexport function getVDOMRoots(): VDOMNodeInfo[] {\r\n return Array.from(registry.roots.values());\r\n}\r\n\r\nexport function getVDOMNodeById(id: string): VDOMNodeInfo | undefined {\r\n return registry.nodes.get(id);\r\n}\r\n\r\nexport function getVDOMTree(): VDOMNodeInfo[] {\r\n return getVDOMRoots();\r\n}\r\n\r\nexport function findVDOMNodesByTag(tagName: string): VDOMNodeInfo[] {\r\n const results: VDOMNodeInfo[] = [];\r\n for (const node of registry.nodes.values()) {\r\n if (node.tagName === tagName) {\r\n results.push(node);\r\n }\r\n }\r\n return results;\r\n}\r\n\r\nexport function findVDOMNodesByProp(\r\n propName: string,\r\n value?: unknown\r\n): VDOMNodeInfo[] {\r\n const results: VDOMNodeInfo[] = [];\r\n for (const node of registry.nodes.values()) {\r\n if (node.props && propName in node.props) {\r\n if (value === undefined || node.props[propName] === value) {\r\n results.push(node);\r\n }\r\n }\r\n }\r\n return results;\r\n}\r\n\r\nexport function getVDOMStats(): {\r\n totalNodes: number;\r\n rootCount: number;\r\n maxDepth: number;\r\n componentCount: number;\r\n elementCount: number;\r\n textCount: number;\r\n} {\r\n let maxDepth = 0;\r\n let componentCount = 0;\r\n let elementCount = 0;\r\n let textCount = 0;\r\n \r\n for (const node of registry.nodes.values()) {\r\n if (node.depth > maxDepth) maxDepth = node.depth;\r\n if (node.isComponent) componentCount++;\r\n else if (node.type === 'element') elementCount++;\r\n else if (node.type === 'text') textCount++;\r\n }\r\n \r\n return {\r\n totalNodes: registry.nodes.size,\r\n rootCount: registry.roots.size,\r\n maxDepth,\r\n componentCount,\r\n elementCount,\r\n textCount,\r\n };\r\n}\r\n\r\nexport function clearVDOMRegistry(): void {\r\n registry.roots.clear();\r\n registry.nodes.clear();\r\n registry.idCounter = 0;\r\n componentVDOMMap.clear();\r\n}\r\n\r\nexport function serializeVDOMNode(node: VDOMNodeInfo, indent = 0): string {\r\n const spaces = ' '.repeat(indent);\r\n let result = '';\r\n \r\n if (node.type === 'text') {\r\n result += `${spaces}📝 \"${node.text || ''}\"\\n`;\r\n } else if (node.isComponent) {\r\n result += `${spaces}🧩 <${node.tagName || 'Component'}`;\r\n if (node.key !== undefined) result += ` key=\"${node.key}\"`;\r\n result += '>\\n';\r\n } else if (node.type === 'element') {\r\n result += `${spaces}🏷️ <${node.tagName || 'unknown'}`;\r\n if (node.key !== undefined) result += ` key=\"${node.key}\"`;\r\n if (node.props) {\r\n const propStr = Object.entries(node.props)\r\n .slice(0, 3)\r\n .map(([k, v]) => `${k}=\"${v}\"`)\r\n .join(' ');\r\n if (propStr) result += ` ${propStr}`;\r\n if (Object.keys(node.props).length > 3) {\r\n result += ' ...';\r\n }\r\n }\r\n result += '>\\n';\r\n }\r\n \r\n for (const child of node.children) {\r\n result += serializeVDOMNode(child, indent + 1);\r\n }\r\n \r\n if ((node.isComponent || node.type === 'element') && node.children.length === 0) {\r\n result += `${spaces} (empty)\\n`;\r\n }\r\n \r\n return result;\r\n}\r\n\r\nexport function serializeVDOMTree(): string {\r\n const roots = getVDOMRoots();\r\n if (roots.length === 0) {\r\n return 'No VDOM roots registered.';\r\n }\r\n \r\n let result = `📦 VDOM Tree (${roots.length} root(s))\\n`;\r\n result += '─'.repeat(40) + '\\n';\r\n \r\n for (const root of roots) {\r\n result += serializeVDOMNode(root);\r\n result += '\\n';\r\n }\r\n \r\n const stats = getVDOMStats();\r\n result += '─'.repeat(40) + '\\n';\r\n result += `📊 Stats: ${stats.totalNodes} nodes, ${stats.componentCount} components, `;\r\n result += `${stats.elementCount} elements, ${stats.textCount} text nodes\\n`;\r\n result += `📏 Max depth: ${stats.maxDepth}\\n`;\r\n \r\n return result;\r\n}\r\n\r\nexport function getVDOMPath(nodeId: string): VDOMNodeInfo[] {\r\n const path: VDOMNodeInfo[] = [];\r\n let current = registry.nodes.get(nodeId);\r\n \r\n while (current) {\r\n path.unshift(current);\r\n current = current.parentId ? registry.nodes.get(current.parentId) : undefined;\r\n }\r\n \r\n return path;\r\n}\r\n\r\nexport function highlightVDOMNode(nodeId: string): void {\r\n const node = registry.nodes.get(nodeId);\r\n if (node?.domElement) {\r\n const el = node.domElement;\r\n const originalOutline = el.style.outline;\r\n const originalBackground = el.style.backgroundColor;\r\n \r\n el.style.outline = '2px solid #4fc08d';\r\n el.style.backgroundColor = 'rgba(79, 192, 141, 0.1)';\r\n \r\n setTimeout(() => {\r\n el.style.outline = originalOutline;\r\n el.style.backgroundColor = originalBackground;\r\n }, 2000);\r\n }\r\n}\r\n\r\nexport function inspectVDOMNode(nodeId: string): {\r\n node: VDOMNodeInfo;\r\n path: VDOMNodeInfo[];\r\n domElement?: HTMLElement | null;\r\n} | null {\r\n const node = registry.nodes.get(nodeId);\r\n if (!node) return null;\r\n \r\n return {\r\n node,\r\n path: getVDOMPath(nodeId),\r\n domElement: node.domElement,\r\n };\r\n}\r\n","/**\r\n * @lytjs/devtools - 性能监控系统\r\n *\r\n * 提供性能埋点、性能指标收集、性能告警等功能\r\n */\r\n\r\n/** 性能指标类型 */\r\nexport type MetricType =\r\n | 'render'\r\n | 'update'\r\n | 'effect'\r\n | 'computed'\r\n | 'reaction'\r\n | 'custom';\r\n\r\n/** 性能指标 */\r\nexport interface PerformanceMetric {\r\n id: string;\r\n name: string;\r\n type: MetricType;\r\n duration: number;\r\n timestamp: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/** 告警级别 */\r\nexport type AlertLevel = 'info' | 'warning' | 'error' | 'critical';\r\n\r\n/** 告警规则 */\r\nexport interface AlertRule {\r\n id: string;\r\n name: string;\r\n level: AlertLevel;\r\n condition: (metric: PerformanceMetric, stats: PerformanceStats) => boolean;\r\n message: string;\r\n enabled: boolean;\r\n cooldown: number;\r\n}\r\n\r\n/** 告警 */\r\nexport interface Alert {\r\n id: string;\r\n ruleId: string;\r\n ruleName: string;\r\n level: AlertLevel;\r\n message: string;\r\n metric?: PerformanceMetric;\r\n timestamp: number;\r\n acknowledged: boolean;\r\n}\r\n\r\n/** 性能统计 */\r\nexport interface PerformanceStats {\r\n count: number;\r\n total: number;\r\n average: number;\r\n min: number;\r\n max: number;\r\n p50: number;\r\n p90: number;\r\n p99: number;\r\n}\r\n\r\n/** 监控配置 */\r\nexport interface MonitorOptions {\r\n /** 是否启用监控 */\r\n enabled?: boolean;\r\n /** 最大记录数 */\r\n maxRecords?: number;\r\n /** 默认采样率 (0-1) */\r\n sampleRate?: number;\r\n /** 是否自动记录页面指标 */\r\n autoRecordPageMetrics?: boolean;\r\n /** 是否自动记录长任务 */\r\n autoRecordLongTasks?: boolean;\r\n /** 长任务阈值 (ms) */\r\n longTaskThreshold?: number;\r\n}\r\n\r\n/** 默认配置 */\r\nconst DEFAULT_OPTIONS: Required<MonitorOptions> = {\r\n enabled: true,\r\n maxRecords: 1000,\r\n sampleRate: 1,\r\n autoRecordPageMetrics: true,\r\n autoRecordLongTasks: true,\r\n longTaskThreshold: 50,\r\n};\r\n\r\n// 性能记录\r\nconst metrics: PerformanceMetric[] = [];\r\n\r\n// 告警规则\r\nconst alertRules: Map<string, AlertRule> = new Map();\r\n\r\n// 告警记录\r\nconst alerts: Alert[] = [];\r\n\r\n// 告警冷却时间记录\r\nconst alertCooldowns: Map<string, number> = new Map();\r\n\r\n// 配置\r\nlet options: Required<MonitorOptions> = { ...DEFAULT_OPTIONS };\r\n\r\n// 观察者回调\r\ntype ObserverCallback = (metric: PerformanceMetric) => void;\r\nconst observers: Set<ObserverCallback> = new Set();\r\n\r\n/**\r\n * 初始化性能监控\r\n */\r\nexport function initPerformanceMonitor(opts?: MonitorOptions): void {\r\n options = { ...DEFAULT_OPTIONS, ...opts };\r\n\r\n if (options.enabled) {\r\n if (options.autoRecordPageMetrics) {\r\n initPageMetrics();\r\n }\r\n if (options.autoRecordLongTasks) {\r\n initLongTaskObserver();\r\n }\r\n initDefaultAlertRules();\r\n }\r\n}\r\n\r\n/**\r\n * 初始化页面指标记录\r\n */\r\nfunction initPageMetrics(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n // 记录首次内容绘制\r\n if (typeof PerformanceObserver !== 'undefined') {\r\n try {\r\n new PerformanceObserver((list) => {\r\n for (const entry of list.getEntries()) {\r\n if (entry.entryType === 'paint') {\r\n recordMetric({\r\n name: entry.name,\r\n type: 'custom',\r\n duration: entry.startTime,\r\n metadata: { entryType: entry.entryType },\r\n });\r\n }\r\n }\r\n }).observe({ type: 'paint', buffered: true });\r\n } catch (e) {\r\n console.warn('[LytJS Performance] Failed to observe paint metrics:', e);\r\n }\r\n\r\n // 记录首次输入延迟\r\n try {\r\n new PerformanceObserver((list) => {\r\n for (const entry of list.getEntries()) {\r\n const firstInputEntry = entry as PerformanceEventTiming;\r\n if (firstInputEntry.processingStart !== undefined) {\r\n recordMetric({\r\n name: 'First Input Delay',\r\n type: 'custom',\r\n duration: firstInputEntry.processingStart - firstInputEntry.startTime,\r\n metadata: { entryType: entry.entryType },\r\n });\r\n }\r\n }\r\n }).observe({ type: 'first-input', buffered: true });\r\n } catch (e) {\r\n console.warn('[LytJS Performance] Failed to observe first-input:', e);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 初始化长任务观察器\r\n */\r\nfunction initLongTaskObserver(): void {\r\n if (typeof PerformanceObserver === 'undefined') return;\r\n\r\n try {\r\n new PerformanceObserver((list) => {\r\n for (const entry of list.getEntries()) {\r\n if (entry.entryType === 'longtask') {\r\n recordMetric({\r\n name: 'Long Task',\r\n type: 'custom',\r\n duration: entry.duration,\r\n metadata: { attribution: (entry as { attribution?: unknown }).attribution },\r\n });\r\n }\r\n }\r\n }).observe({ type: 'longtask', buffered: true });\r\n } catch (e) {\r\n console.warn('[LytJS Performance] Failed to observe long tasks:', e);\r\n }\r\n}\r\n\r\n/**\r\n * 初始化默认告警规则\r\n */\r\nfunction initDefaultAlertRules(): void {\r\n // 长任务告警\r\n registerAlertRule({\r\n id: 'long_task_warning',\r\n name: '长任务警告',\r\n level: 'warning',\r\n condition: (metric) => metric.duration > options.longTaskThreshold,\r\n message: '检测到长任务: {{name}}, 耗时 {{duration}}ms',\r\n enabled: true,\r\n cooldown: 5000,\r\n });\r\n\r\n // 渲染性能告警\r\n registerAlertRule({\r\n id: 'slow_render_error',\r\n name: '渲染过慢',\r\n level: 'error',\r\n condition: (metric, stats) => metric.duration > stats.p99 * 1.5 && stats.count > 10,\r\n message: '渲染性能异常: {{name}}, 耗时 {{duration}}ms',\r\n enabled: true,\r\n cooldown: 10000,\r\n });\r\n\r\n // 严重性能问题告警\r\n registerAlertRule({\r\n id: 'critical_render',\r\n name: '严重渲染问题',\r\n level: 'critical',\r\n condition: (metric) => metric.duration > 500,\r\n message: '严重性能问题: {{name}} 耗时超过 500ms!',\r\n enabled: true,\r\n cooldown: 30000,\r\n });\r\n}\r\n\r\n/**\r\n * 记录性能指标\r\n */\r\nexport function recordMetric(metric: Omit<PerformanceMetric, 'id' | 'timestamp'>): PerformanceMetric {\r\n if (!options.enabled) {\r\n return { id: '', timestamp: 0, ...metric };\r\n }\r\n\r\n // 采样\r\n if (Math.random() > options.sampleRate) {\r\n return { id: '', timestamp: 0, ...metric };\r\n }\r\n\r\n const fullMetric: PerformanceMetric = {\r\n id: `metric_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n timestamp: Date.now(),\r\n ...metric,\r\n };\r\n\r\n // 添加到记录\r\n metrics.push(fullMetric);\r\n\r\n // 限制记录数量\r\n if (metrics.length > options.maxRecords) {\r\n metrics.shift();\r\n }\r\n\r\n // 通知观察者\r\n observers.forEach((cb) => cb(fullMetric));\r\n\r\n // 检查告警规则\r\n checkAlertRules(fullMetric);\r\n\r\n return fullMetric;\r\n}\r\n\r\n/**\r\n * 获取所有性能指标\r\n */\r\nexport function getMetrics(limit?: number): PerformanceMetric[] {\r\n const result = [...metrics];\r\n if (limit !== undefined) {\r\n return result.slice(-limit);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * 获取性能统计\r\n */\r\nexport function getStats(type?: MetricType): PerformanceStats {\r\n const filteredMetrics = type\r\n ? metrics.filter((m) => m.type === type)\r\n : [...metrics];\r\n\r\n if (filteredMetrics.length === 0) {\r\n return {\r\n count: 0,\r\n total: 0,\r\n average: 0,\r\n min: 0,\r\n max: 0,\r\n p50: 0,\r\n p90: 0,\r\n p99: 0,\r\n };\r\n }\r\n\r\n const durations = filteredMetrics.map((m) => m.duration).sort((a, b) => a - b);\r\n const total = durations.reduce((a, b) => a + b, 0);\r\n\r\n return {\r\n count: durations.length,\r\n total,\r\n average: total / durations.length,\r\n min: durations[0] ?? 0,\r\n max: durations[durations.length - 1] ?? 0,\r\n p50: percentile(durations, 50),\r\n p90: percentile(durations, 90),\r\n p99: percentile(durations, 99),\r\n };\r\n}\r\n\r\n/**\r\n * 计算百分位数\r\n */\r\nfunction percentile(sortedArray: number[], p: number): number {\r\n if (sortedArray.length === 0) return 0;\r\n const index = Math.ceil((sortedArray.length * p) / 100) - 1;\r\n return sortedArray[Math.max(0, index)] ?? 0;\r\n}\r\n\r\n/**\r\n * 注册告警规则\r\n */\r\nexport function registerAlertRule(rule: AlertRule): void {\r\n alertRules.set(rule.id, rule);\r\n}\r\n\r\n/**\r\n * 注销告警规则\r\n */\r\nexport function unregisterAlertRule(ruleId: string): void {\r\n alertRules.delete(ruleId);\r\n}\r\n\r\n/**\r\n * 启用/禁用告警规则\r\n */\r\nexport function setAlertRuleEnabled(ruleId: string, enabled: boolean): void {\r\n const rule = alertRules.get(ruleId);\r\n if (rule) {\r\n rule.enabled = enabled;\r\n }\r\n}\r\n\r\n/**\r\n * 获取所有告警规则\r\n */\r\nexport function getAlertRules(): AlertRule[] {\r\n return Array.from(alertRules.values());\r\n}\r\n\r\n/**\r\n * 获取当前告警\r\n */\r\nexport function getAlerts(includeAcknowledged: boolean = true): Alert[] {\r\n if (includeAcknowledged) {\r\n return [...alerts];\r\n }\r\n return alerts.filter((a) => !a.acknowledged);\r\n}\r\n\r\n/**\r\n * 确认告警\r\n */\r\nexport function acknowledgeAlert(alertId: string): void {\r\n const alert = alerts.find((a) => a.id === alertId);\r\n if (alert) {\r\n alert.acknowledged = true;\r\n }\r\n}\r\n\r\n/**\r\n * 确认所有告警\r\n */\r\nexport function acknowledgeAllAlerts(): void {\r\n alerts.forEach((alert) => {\r\n alert.acknowledged = true;\r\n });\r\n}\r\n\r\n/**\r\n * 清除告警记录\r\n */\r\nexport function clearAlerts(): void {\r\n alerts.length = 0;\r\n}\r\n\r\n/**\r\n * 检查告警规则\r\n */\r\nfunction checkAlertRules(metric: PerformanceMetric): void {\r\n const stats = getStats(metric.type);\r\n\r\n alertRules.forEach((rule) => {\r\n if (!rule.enabled) return;\r\n\r\n // 检查冷却时间\r\n const lastTriggered = alertCooldowns.get(rule.id) || 0;\r\n if (Date.now() - lastTriggered < rule.cooldown) return;\r\n\r\n // 检查条件\r\n if (rule.condition(metric, stats)) {\r\n const alert: Alert = {\r\n id: `alert_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n ruleId: rule.id,\r\n ruleName: rule.name,\r\n level: rule.level,\r\n message: interpolateMessage(rule.message, metric),\r\n metric,\r\n timestamp: Date.now(),\r\n acknowledged: false,\r\n };\r\n\r\n alerts.push(alert);\r\n\r\n // 记录冷却时间\r\n alertCooldowns.set(rule.id, Date.now());\r\n\r\n // 限制告警记录数量\r\n if (alerts.length > 100) {\r\n alerts.shift();\r\n }\r\n\r\n // 输出告警到控制台\r\n outputAlert(alert);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * 插值消息模板\r\n */\r\nfunction interpolateMessage(message: string, metric: PerformanceMetric): string {\r\n return message\r\n .replace(/\\{\\{name\\}\\}/g, metric.name)\r\n .replace(/\\{\\{duration\\}\\}/g, metric.duration.toFixed(2))\r\n .replace(/\\{\\{type\\}\\}/g, metric.type);\r\n}\r\n\r\n/**\r\n * 输出告警\r\n */\r\nfunction outputAlert(alert: Alert): void {\r\n const levelStyles: Record<AlertLevel, string> = {\r\n info: 'color: #1890ff;',\r\n warning: 'color: #faad14;',\r\n error: 'color: #ff4d4f;',\r\n critical: 'color: #722ed1; background: #ff4d4f; padding: 2px 5px;',\r\n };\r\n\r\n console.warn(\r\n `%c[LytJS Alert] ${alert.ruleName}%c ${alert.message}`,\r\n levelStyles[alert.level],\r\n 'color: inherit;'\r\n );\r\n}\r\n\r\n/**\r\n * 添加观察者\r\n */\r\nexport function addObserver(callback: ObserverCallback): void {\r\n observers.add(callback);\r\n}\r\n\r\n/**\r\n * 移除观察者\r\n */\r\nexport function removeObserver(callback: ObserverCallback): void {\r\n observers.delete(callback);\r\n}\r\n\r\n/**\r\n * 清除所有性能记录\r\n */\r\nexport function clearMetrics(): void {\r\n metrics.length = 0;\r\n}\r\n\r\n/**\r\n * 重置性能监控\r\n */\r\nexport function resetPerformanceMonitor(): void {\r\n metrics.length = 0;\r\n alerts.length = 0;\r\n observers.clear();\r\n alertCooldowns.clear();\r\n alertRules.clear();\r\n}\r\n\r\n/**\r\n * 获取性能报告\r\n */\r\nexport function getPerformanceReport(): {\r\n metrics: PerformanceMetric[];\r\n stats: Record<MetricType, PerformanceStats>;\r\n alerts: Alert[];\r\n summary: {\r\n totalMetrics: number;\r\n totalAlerts: number;\r\n unacknowledgedAlerts: number;\r\n averageDuration: number;\r\n };\r\n} {\r\n const stats: Record<MetricType, PerformanceStats> = {\r\n render: getStats('render'),\r\n update: getStats('update'),\r\n effect: getStats('effect'),\r\n computed: getStats('computed'),\r\n reaction: getStats('reaction'),\r\n custom: getStats('custom'),\r\n };\r\n\r\n const allStats = getStats();\r\n\r\n return {\r\n metrics: [...metrics],\r\n stats,\r\n alerts: [...alerts],\r\n summary: {\r\n totalMetrics: metrics.length,\r\n totalAlerts: alerts.length,\r\n unacknowledgedAlerts: alerts.filter((a) => !a.acknowledged).length,\r\n averageDuration: allStats.average,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 序列化性能报告(用于显示)\r\n */\r\nexport function serializePerformanceReport(): string {\r\n const report = getPerformanceReport();\r\n let result = `⚡ 性能报告\\n\\n`;\r\n result += `📊 统计摘要:\\n`;\r\n result += ` 总记录数: ${report.summary.totalMetrics}\\n`;\r\n result += ` 平均耗时: ${report.summary.averageDuration.toFixed(2)}ms\\n`;\r\n result += ` 总告警数: ${report.summary.totalAlerts}\\n`;\r\n result += ` 未确认告警: ${report.summary.unacknowledgedAlerts}\\n\\n`;\r\n\r\n result += `📈 分类型统计:\\n`;\r\n Object.entries(report.stats).forEach(([type, stats]) => {\r\n if (stats.count > 0) {\r\n result += ` ${type}: ${stats.count} 次, 平均 ${stats.average.toFixed(2)}ms, 最大 ${stats.max.toFixed(2)}ms\\n`;\r\n }\r\n });\r\n\r\n if (report.alerts.length > 0) {\r\n result += `\\n🚨 最近告警:\\n`;\r\n report.alerts.slice(-5).forEach((alert) => {\r\n const levelIcon = alert.level === 'critical' ? '🔴' : alert.level === 'error' ? '❌' : alert.level === 'warning' ? '⚠️' : 'ℹ️';\r\n result += ` ${levelIcon} [${alert.level}] ${alert.ruleName}: ${alert.message}\\n`;\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 创建计时器\r\n */\r\nexport function startTimer(name: string, type: MetricType = 'custom'): () => void {\r\n const startTime = performance.now();\r\n\r\n return () => {\r\n const duration = performance.now() - startTime;\r\n recordMetric({ name, type, duration });\r\n };\r\n}\r\n\r\n// ===== 时序事件功能 =====\r\n\r\n/** 时序事件 */\r\nexport interface TimelineEvent {\r\n id: string;\r\n name: string;\r\n category: 'render' | 'effect' | 'custom';\r\n startTime: number;\r\n duration: number;\r\n depth: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/** 火焰图节点 */\r\nexport interface FlameGraphNode {\r\n name: string;\r\n value: number;\r\n children?: FlameGraphNode[];\r\n category?: 'render' | 'effect' | 'custom';\r\n}\r\n\r\n/** 时序事件栈 */\r\nconst timelineEventStack: Array<{\r\n event: TimelineEvent;\r\n startTime: number;\r\n}> = [];\r\n\r\nconst timelineEvents: TimelineEvent[] = [];\r\nconst maxTimelineEvents = 1000;\r\n\r\n/** 当前深度 */\r\nlet currentDepth = 0;\r\n\r\n/**\r\n * 开始时序事件\r\n */\r\nexport function beginTimelineEvent(\r\n name: string,\r\n category: TimelineEvent['category'] = 'custom',\r\n metadata?: Record<string, unknown>\r\n): string {\r\n const id = `timeline_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n const event: TimelineEvent = {\r\n id,\r\n name,\r\n category,\r\n startTime: performance.now(),\r\n duration: 0,\r\n depth: currentDepth,\r\n metadata,\r\n };\r\n\r\n timelineEventStack.push({\r\n event,\r\n startTime: performance.now(),\r\n });\r\n\r\n currentDepth++;\r\n\r\n return id;\r\n}\r\n\r\n/**\r\n * 结束指定时序事件\r\n */\r\nexport function endTimelineEvent(id: string): TimelineEvent | null {\r\n const stackIndex = timelineEventStack.findIndex((item) => item.event.id === id);\r\n\r\n if (stackIndex === -1) {\r\n console.warn(`[DevTools] Timeline event ${id} not found in stack`);\r\n return null;\r\n }\r\n\r\n const { event } = timelineEventStack[stackIndex]!;\r\n const endTime = performance.now();\r\n\r\n event.duration = endTime - event.startTime;\r\n\r\n for (let i = stackIndex + 1; i < timelineEventStack.length; i++) {\r\n const nestedEvent = timelineEventStack[i]!;\r\n event.duration = Math.max(event.duration, nestedEvent.startTime - event.startTime + nestedEvent.event.duration);\r\n }\r\n\r\n timelineEventStack.splice(stackIndex);\r\n currentDepth = Math.max(0, currentDepth - 1);\r\n\r\n timelineEvents.push(event);\r\n if (timelineEvents.length > maxTimelineEvents) {\r\n timelineEvents.shift();\r\n }\r\n\r\n return event;\r\n}\r\n\r\n/**\r\n * 获取所有时序事件\r\n */\r\nexport function getTimelineEvents(): TimelineEvent[] {\r\n return [...timelineEvents];\r\n}\r\n\r\n/**\r\n * 获取指定时间范围内的时序事件\r\n */\r\nexport function getTimelineEventsInRange(startTime: number, endTime: number): TimelineEvent[] {\r\n return timelineEvents.filter(\r\n (event) => event.startTime >= startTime && event.startTime <= endTime\r\n );\r\n}\r\n\r\n/**\r\n * 获取慢操作\r\n */\r\nexport function getSlowOperations(limit: number = 10, threshold?: number): TimelineEvent[] {\r\n const sorted = [...timelineEvents].sort((a, b) => b.duration - a.duration);\r\n const result = threshold !== undefined\r\n ? sorted.filter((e) => e.duration >= threshold)\r\n : sorted;\r\n return result.slice(0, limit);\r\n}\r\n\r\n/**\r\n * 获取火焰图数据\r\n */\r\nexport function getFlameGraphData(): FlameGraphNode {\r\n const root: FlameGraphNode = {\r\n name: 'root',\r\n value: 0,\r\n children: [],\r\n category: 'custom',\r\n };\r\n\r\n const nodeMap = new Map<string, FlameGraphNode>();\r\n nodeMap.set('root', root);\r\n\r\n timelineEvents.forEach((event) => {\r\n const node: FlameGraphNode = {\r\n name: event.name,\r\n value: event.duration,\r\n category: event.category,\r\n children: [],\r\n };\r\n\r\n const parentNode = event.depth === 0\r\n ? root\r\n : findParentNode(root, event.depth);\r\n\r\n if (parentNode) {\r\n if (!parentNode.children) {\r\n parentNode.children = [];\r\n }\r\n parentNode.children.push(node);\r\n }\r\n\r\n nodeMap.set(event.id, node);\r\n });\r\n\r\n aggregateFlameGraphValues(root);\r\n\r\n return root;\r\n}\r\n\r\nfunction findParentNode(node: FlameGraphNode, depth: number): FlameGraphNode | null {\r\n if (!node.children || node.children.length === 0) {\r\n return depth === 1 ? node : null;\r\n }\r\n\r\n let targetDepth = depth - 1;\r\n let currentNode: FlameGraphNode | null = node;\r\n\r\n while (targetDepth > 0 && currentNode) {\r\n const children: FlameGraphNode[] = currentNode.children || [];\r\n if (children.length === 0) {\r\n return currentNode;\r\n }\r\n const lastChild: FlameGraphNode = children[children.length - 1]!;\r\n currentNode = lastChild;\r\n targetDepth--;\r\n }\r\n\r\n return currentNode;\r\n}\r\n\r\nfunction aggregateFlameGraphValues(node: FlameGraphNode): number {\r\n if (!node.children || node.children.length === 0) {\r\n return node.value;\r\n }\r\n\r\n let totalValue = node.value;\r\n node.children.forEach((child) => {\r\n totalValue += aggregateFlameGraphValues(child);\r\n });\r\n\r\n node.value = totalValue;\r\n return totalValue;\r\n}\r\n\r\n/**\r\n * 清除时序事件\r\n */\r\nexport function clearTimelineEvents(): void {\r\n timelineEvents.length = 0;\r\n timelineEventStack.length = 0;\r\n currentDepth = 0;\r\n}\r\n\r\n/**\r\n * 导出时序事件为 JSON\r\n */\r\nexport function exportTimelineAsJSON(): string {\r\n return JSON.stringify({\r\n events: timelineEvents,\r\n exportedAt: Date.now(),\r\n }, null, 2);\r\n}\r\n\r\n/**\r\n * 序列化为可读文本\r\n */\r\nexport function serializeTimelineEvents(): string {\r\n if (timelineEvents.length === 0) {\r\n return '暂无时序事件数据';\r\n }\r\n\r\n let result = `📊 时序事件 (${timelineEvents.length} 个)\\n\\n`;\r\n\r\n timelineEvents.slice(-20).forEach((event) => {\r\n const indent = ' '.repeat(event.depth);\r\n const duration = event.duration.toFixed(2);\r\n result += `${indent}├─ ${event.name} [${event.category}] ${duration}ms\\n`;\r\n });\r\n\r\n return result;\r\n}\r\n","/**\r\n * @lytjs/devtools - 大规模性能压测基准测试\r\n *\r\n * 提供虚拟列表、组件渲染等大规模场景的性能基准测试\r\n */\r\n\r\n/** 基准测试结果 */\r\nexport interface BenchmarkResult {\r\n name: string;\r\n iterations: number;\r\n totalDuration: number;\r\n averageDuration: number;\r\n minDuration: number;\r\n maxDuration: number;\r\n opsPerSecond: number;\r\n timestamp: number;\r\n}\r\n\r\n/** 基准测试配置 */\r\nexport interface BenchmarkConfig {\r\n /** 测试名称 */\r\n name: string;\r\n /** 迭代次数 */\r\n iterations: number;\r\n /** 预热次数 */\r\n warmup?: number;\r\n /** 异步测试回调 */\r\n fn: () => void | Promise<void>;\r\n /** 异步回调 */\r\n asyncFn?: () => Promise<void>;\r\n}\r\n\r\n/** 大规模场景配置 */\r\nexport interface LargeScaleScenario {\r\n name: string;\r\n nodeCount: number;\r\n description: string;\r\n}\r\n\r\n/** 预定义的大规模场景 */\r\nexport const LARGE_SCALE_SCENARIOS: LargeScaleScenario[] = [\r\n { name: '虚拟列表-1000节点', nodeCount: 1000, description: '1000 个虚拟列表节点渲染' },\r\n { name: '虚拟列表-5000节点', nodeCount: 5000, description: '5000 个虚拟列表节点渲染' },\r\n { name: '虚拟列表-10000节点', nodeCount: 10000, description: '10000 个虚拟列表节点渲染' },\r\n { name: '组件树-100组件', nodeCount: 100, description: '100 个组件同时渲染' },\r\n { name: '组件树-500组件', nodeCount: 500, description: '500 个组件同时渲染' },\r\n { name: '组件树-1000组件', nodeCount: 1000, description: '1000 个组件同时渲染' },\r\n { name: '信号追踪-500信号', nodeCount: 500, description: '500 个信号同时追踪' },\r\n { name: '信号追踪-1000信号', nodeCount: 1000, description: '1000 个信号同时追踪' },\r\n];\r\n\r\n// 基准测试结果存储\r\nconst benchmarkResults: Map<string, BenchmarkResult[]> = new Map();\r\n\r\n/**\r\n * 运行同步基准测试\r\n */\r\nexport function runBenchmark(config: BenchmarkConfig): BenchmarkResult {\r\n const { name, iterations, warmup = 10, fn } = config;\r\n\r\n // 预热\r\n for (let i = 0; i < warmup; i++) {\r\n fn();\r\n }\r\n\r\n // 运行测试\r\n const durations: number[] = [];\r\n const startTime = performance.now();\r\n\r\n for (let i = 0; i < iterations; i++) {\r\n const iterStart = performance.now();\r\n fn();\r\n durations.push(performance.now() - iterStart);\r\n }\r\n\r\n const totalDuration = performance.now() - startTime;\r\n\r\n // 计算统计\r\n const result: BenchmarkResult = {\r\n name,\r\n iterations,\r\n totalDuration,\r\n averageDuration: durations.reduce((a, b) => a + b, 0) / durations.length,\r\n minDuration: Math.min(...durations),\r\n maxDuration: Math.max(...durations),\r\n opsPerSecond: (iterations / totalDuration) * 1000,\r\n timestamp: Date.now(),\r\n };\r\n\r\n // 存储结果\r\n storeBenchmarkResult(name, result);\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 运行异步基准测试\r\n */\r\nexport async function runAsyncBenchmark(config: BenchmarkConfig): Promise<BenchmarkResult> {\r\n const { name, iterations, warmup = 10, asyncFn } = config;\r\n\r\n if (!asyncFn) {\r\n throw new Error('asyncFn is required for async benchmark');\r\n }\r\n\r\n // 预热\r\n for (let i = 0; i < warmup; i++) {\r\n await asyncFn();\r\n }\r\n\r\n // 运行测试\r\n const durations: number[] = [];\r\n const startTime = performance.now();\r\n\r\n for (let i = 0; i < iterations; i++) {\r\n const iterStart = performance.now();\r\n await asyncFn();\r\n durations.push(performance.now() - iterStart);\r\n }\r\n\r\n const totalDuration = performance.now() - startTime;\r\n\r\n // 计算统计\r\n const result: BenchmarkResult = {\r\n name,\r\n iterations,\r\n totalDuration,\r\n averageDuration: durations.reduce((a, b) => a + b, 0) / durations.length,\r\n minDuration: Math.min(...durations),\r\n maxDuration: Math.max(...durations),\r\n opsPerSecond: (iterations / totalDuration) * 1000,\r\n timestamp: Date.now(),\r\n };\r\n\r\n // 存储结果\r\n storeBenchmarkResult(name, result);\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 存储基准测试结果\r\n */\r\nfunction storeBenchmarkResult(name: string, result: BenchmarkResult): void {\r\n if (!benchmarkResults.has(name)) {\r\n benchmarkResults.set(name, []);\r\n }\r\n const results = benchmarkResults.get(name)!;\r\n results.push(result);\r\n\r\n // 限制存储数量\r\n if (results.length > 100) {\r\n results.shift();\r\n }\r\n}\r\n\r\n/**\r\n * 获取基准测试结果\r\n */\r\nexport function getBenchmarkResults(name?: string): BenchmarkResult[] {\r\n if (name) {\r\n return benchmarkResults.get(name) || [];\r\n }\r\n const allResults: BenchmarkResult[] = [];\r\n benchmarkResults.forEach((results) => {\r\n allResults.push(...results);\r\n });\r\n return allResults.sort((a, b) => b.timestamp - a.timestamp);\r\n}\r\n\r\n/**\r\n * 获取最新基准测试结果\r\n */\r\nexport function getLatestBenchmarkResult(name: string): BenchmarkResult | undefined {\r\n const results = benchmarkResults.get(name);\r\n if (!results || results.length === 0) return undefined;\r\n return results[results.length - 1];\r\n}\r\n\r\n/**\r\n * 清除基准测试结果\r\n */\r\nexport function clearBenchmarkResults(name?: string): void {\r\n if (name) {\r\n benchmarkResults.delete(name);\r\n } else {\r\n benchmarkResults.clear();\r\n }\r\n}\r\n\r\n/**\r\n * 序列化基准测试结果\r\n */\r\nexport function serializeBenchmarkResult(result: BenchmarkResult): string {\r\n return `\r\n📊 ${result.name}\r\n 迭代次数: ${result.iterations}\r\n 总耗时: ${result.totalDuration.toFixed(2)}ms\r\n 平均耗时: ${result.averageDuration.toFixed(4)}ms\r\n 最小耗时: ${result.minDuration.toFixed(4)}ms\r\n 最大耗时: ${result.maxDuration.toFixed(4)}ms\r\n OPS: ${result.opsPerSecond.toFixed(2)} ops/s\r\n 时间: ${new Date(result.timestamp).toLocaleString()}\r\n`.trim();\r\n}\r\n\r\n/**\r\n * 序列化所有基准测试结果\r\n */\r\nexport function serializeAllBenchmarkResults(): string {\r\n const allResults = getBenchmarkResults();\r\n if (allResults.length === 0) {\r\n return '暂无基准测试结果';\r\n }\r\n\r\n let result = `📈 基准测试报告 (${allResults.length} 条记录)\\n\\n`;\r\n\r\n // 按名称分组\r\n const grouped = new Map<string, BenchmarkResult[]>();\r\n allResults.forEach((r) => {\r\n if (!grouped.has(r.name)) {\r\n grouped.set(r.name, []);\r\n }\r\n grouped.get(r.name)!.push(r);\r\n });\r\n\r\n grouped.forEach((results, name) => {\r\n const latest = results[results.length - 1];\r\n if (latest) {\r\n result += `🔹 ${name}\\n`;\r\n result += ` 最新: ${latest.averageDuration.toFixed(4)}ms (${latest.opsPerSecond.toFixed(2)} ops/s)\\n`;\r\n result += ` 历史: ${results.length} 次测试\\n`;\r\n result += '\\n';\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 比较两次基准测试\r\n */\r\nexport function compareBenchmarkResults(\r\n oldResult: BenchmarkResult,\r\n newResult: BenchmarkResult\r\n): {\r\n durationDiff: number;\r\n durationDiffPercent: number;\r\n opsDiff: number;\r\n opsDiffPercent: number;\r\n improved: boolean;\r\n} {\r\n const durationDiff = oldResult.averageDuration - newResult.averageDuration;\r\n const durationDiffPercent = (durationDiff / oldResult.averageDuration) * 100;\r\n const opsDiff = newResult.opsPerSecond - oldResult.opsPerSecond;\r\n const opsDiffPercent = (opsDiff / oldResult.opsPerSecond) * 100;\r\n\r\n return {\r\n durationDiff,\r\n durationDiffPercent,\r\n opsDiff,\r\n opsDiffPercent,\r\n improved: durationDiff > 0,\r\n };\r\n}\r\n\r\n/**\r\n * 生成大规模测试场景的基准测试\r\n */\r\nexport function createLargeScaleBenchmark(\r\n scenario: LargeScaleScenario,\r\n testFn: (nodeCount: number) => void | Promise<void>\r\n): BenchmarkConfig {\r\n return {\r\n name: `大规模测试-${scenario.name}`,\r\n iterations: 100,\r\n warmup: 10,\r\n fn: () => testFn(scenario.nodeCount),\r\n };\r\n}\r\n\r\n/**\r\n * 内存使用情况\r\n */\r\nexport interface MemoryUsage {\r\n usedJSHeapSize: number;\r\n totalJSHeapSize: number;\r\n jsHeapSizeLimit: number;\r\n}\r\n\r\n/**\r\n * 获取当前内存使用情况\r\n */\r\nexport function getMemoryUsage(): MemoryUsage | null {\r\n if (typeof performance === 'undefined') return null;\r\n\r\n const memory = (performance as { memory?: { usedJSHeapSize: number; totalJSHeapSize: number; jsHeapSizeLimit: number } }).memory;\r\n if (!memory) return null;\r\n\r\n return {\r\n usedJSHeapSize: memory.usedJSHeapSize,\r\n totalJSHeapSize: memory.totalJSHeapSize,\r\n jsHeapSizeLimit: memory.jsHeapSizeLimit,\r\n };\r\n}\r\n\r\n/**\r\n * 序列化内存使用情况\r\n */\r\nexport function serializeMemoryUsage(usage: MemoryUsage): string {\r\n const formatBytes = (bytes: number) => {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\r\n };\r\n\r\n return `\r\n💾 内存使用\r\n 已使用堆: ${formatBytes(usage.usedJSHeapSize)}\r\n 总堆大小: ${formatBytes(usage.totalJSHeapSize)}\r\n 堆大小限制: ${formatBytes(usage.jsHeapSizeLimit)}\r\n 使用率: ${((usage.usedJSHeapSize / usage.totalJSHeapSize) * 100).toFixed(2)}%\r\n`.trim();\r\n}\r\n\r\n/**\r\n * 创建性能回归检测\r\n */\r\nexport function createRegressionDetector(threshold: number = 0.1) {\r\n const history: Map<string, BenchmarkResult[]> = new Map();\r\n\r\n return {\r\n addResult(result: BenchmarkResult): boolean {\r\n if (!history.has(result.name)) {\r\n history.set(result.name, []);\r\n }\r\n const results = history.get(result.name)!;\r\n results.push(result);\r\n\r\n if (results.length < 2) return false;\r\n\r\n const previous = results[results.length - 2];\r\n if (!previous) return false;\r\n \r\n const regression = previous.averageDuration < result.averageDuration &&\r\n (result.averageDuration - previous.averageDuration) / previous.averageDuration > threshold;\r\n\r\n return regression;\r\n },\r\n\r\n getHistory(name: string): BenchmarkResult[] {\r\n return history.get(name) || [];\r\n },\r\n\r\n clear(): void {\r\n history.clear();\r\n },\r\n };\r\n}\r\n","/**\r\n * @lytjs/devtools - 开发者工具主入口\r\n */\r\n\r\nimport type { DevToolsOptions, DevToolsAPI, SignalNode } from './types';\r\nimport {\r\n getComponentTree,\r\n serializeComponentTree,\r\n registerRootComponent,\r\n unregisterRootComponent,\r\n} from './componentTree';\r\nimport {\r\n getStoreStates,\r\n getStoreState,\r\n setStoreState,\r\n dispatchStoreAction,\r\n serializeStoreStates,\r\n registerStore,\r\n unregisterStore,\r\n getRegisteredStoreIds,\r\n clearStoreRegistry,\r\n subscribeStore,\r\n unsubscribeStore,\r\n onStoreChange,\r\n} from './storeInspector';\r\nimport {\r\n getCurrentRoute,\r\n navigateTo,\r\n navigateToName,\r\n goBack,\r\n serializeRouteInfo,\r\n getRoutes,\r\n registerRouter,\r\n unregisterRouter,\r\n isRouterRegistered,\r\n watchRouteChanges,\r\n unwatchRouteChanges,\r\n getRouteHistory,\r\n clearRouteHistory,\r\n} from './routeInspector';\r\nimport {\r\n getSignalNodes,\r\n getSignalNode,\r\n getDependencyGraph,\r\n createSnapshot,\r\n getSnapshots,\r\n getTimeTravelState,\r\n restoreSnapshot,\r\n clearSnapshots,\r\n getPerformanceStats,\r\n getPerformanceRecords,\r\n clearPerformanceRecords,\r\n serializeSignalNode,\r\n serializeDependencyGraph,\r\n serializePerformanceStats,\r\n registerSignal,\r\n unregisterSignal,\r\n recordSignalUpdate,\r\n recordDependency,\r\n clearSignalRegistry,\r\n} from './signalsInspector';\r\nimport {\r\n getVDOMTree,\r\n getVDOMStats,\r\n serializeVDOMTree,\r\n} from './vdomInspector';\r\n\r\n// DevTools 实例\r\nlet devtoolsInstance: DevTools | null = null;\r\n\r\n/**\r\n * DevTools 类\r\n */\r\nclass DevTools implements DevToolsAPI {\r\n private options: Required<DevToolsOptions>;\r\n private isOpen = false;\r\n\r\n constructor(options: DevToolsOptions = {}) {\r\n this.options = {\r\n enabled: options.enabled ?? true,\r\n position: options.position ?? 'right',\r\n size: options.size ?? 300,\r\n };\r\n\r\n if (this.options.enabled) {\r\n this.init();\r\n }\r\n }\r\n\r\n /**\r\n * 初始化 DevTools\r\n */\r\n private init(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n // 创建面板\r\n this.createPanel();\r\n\r\n // 添加键盘快捷键(Ctrl+Shift+D 或 Cmd+Shift+D)\r\n window.addEventListener('keydown', (e) => {\r\n if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === 'D') {\r\n e.preventDefault();\r\n this.toggle();\r\n }\r\n });\r\n\r\n console.warn('[LytJS DevTools] Initialized. Press Ctrl+Shift+D to toggle.');\r\n }\r\n\r\n /**\r\n * 创建 DevTools 面板\r\n */\r\n private createPanel(): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n // 检查是否已存在\r\n if (document.getElementById('lytjs-devtools')) return;\r\n\r\n const panel = document.createElement('div');\r\n panel.id = 'lytjs-devtools';\r\n panel.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n ${this.options.position}: -${this.options.size}px;\r\n width: ${this.options.size}px;\r\n height: 100vh;\r\n background: #1e1e1e;\r\n color: #d4d4d4;\r\n font-family: 'Consolas', 'Monaco', monospace;\r\n font-size: 12px;\r\n z-index: 999999;\r\n transition: ${this.options.position} 0.3s ease;\r\n display: flex;\r\n flex-direction: column;\r\n box-shadow: 2px 0 8px rgba(0,0,0,0.3);\r\n `;\r\n\r\n // 头部\r\n const header = document.createElement('div');\r\n header.style.cssText = `\r\n padding: 10px 15px;\r\n background: #2d2d2d;\r\n border-bottom: 1px solid #3d3d3d;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n `;\r\n header.innerHTML = `\r\n <span style=\"font-weight: bold; color: #4fc08d;\">🛠️ LytJS DevTools</span>\r\n <button id=\"lytjs-devtools-close\" style=\"\r\n background: transparent;\r\n border: none;\r\n color: #d4d4d4;\r\n cursor: pointer;\r\n font-size: 16px;\r\n \">✕</button>\r\n `;\r\n\r\n // 标签页\r\n const tabs = document.createElement('div');\r\n tabs.style.cssText = `\r\n display: flex;\r\n background: #252526;\r\n border-bottom: 1px solid #3d3d3d;\r\n `;\r\n tabs.innerHTML = `\r\n <button class=\"lytjs-devtools-tab active\" data-tab=\"components\" style=\"\r\n flex: 1;\r\n padding: 10px;\r\n background: #1e1e1e;\r\n border: none;\r\n color: #d4d4d4;\r\n cursor: pointer;\r\n border-bottom: 2px solid #4fc08d;\r\n \">Components</button>\r\n <button class=\"lytjs-devtools-tab\" data-tab=\"store\" style=\"\r\n flex: 1;\r\n padding: 10px;\r\n background: transparent;\r\n border: none;\r\n color: #d4d4d4;\r\n cursor: pointer;\r\n border-bottom: 2px solid transparent;\r\n \">Store</button>\r\n <button class=\"lytjs-devtools-tab\" data-tab=\"router\" style=\"\r\n flex: 1;\r\n padding: 10px;\r\n background: transparent;\r\n border: none;\r\n color: #d4d4d4;\r\n cursor: pointer;\r\n border-bottom: 2px solid transparent;\r\n \">Router</button>\r\n <button class=\"lytjs-devtools-tab\" data-tab=\"signals\" style=\"\r\n flex: 1;\r\n padding: 10px;\r\n background: transparent;\r\n border: none;\r\n color: #d4d4d4;\r\n cursor: pointer;\r\n border-bottom: 2px solid transparent;\r\n \">Signals</button>\r\n <button class=\"lytjs-devtools-tab\" data-tab=\"vdom\" style=\"\r\n flex: 1;\r\n padding: 10px;\r\n background: transparent;\r\n border: none;\r\n color: #d4d4d4;\r\n cursor: pointer;\r\n border-bottom: 2px solid transparent;\r\n \">VDOM</button>\r\n <button class=\"lytjs-devtools-tab\" data-tab=\"performance\" style=\"\r\n flex: 1;\r\n padding: 10px;\r\n background: transparent;\r\n border: none;\r\n color: #d4d4d4;\r\n cursor: pointer;\r\n border-bottom: 2px solid transparent;\r\n \">Performance</button>\r\n `;\r\n\r\n // 内容区域\r\n const content = document.createElement('div');\r\n content.id = 'lytjs-devtools-content';\r\n content.style.cssText = `\r\n flex: 1;\r\n overflow: auto;\r\n padding: 15px;\r\n `;\r\n\r\n panel.appendChild(header);\r\n panel.appendChild(tabs);\r\n panel.appendChild(content);\r\n document.body.appendChild(panel);\r\n\r\n // 绑定事件\r\n document.getElementById('lytjs-devtools-close')?.addEventListener('click', () => this.close());\r\n \r\n tabs.querySelectorAll('.lytjs-devtools-tab').forEach((tab) => {\r\n tab.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n const tabName = target.dataset.tab;\r\n \r\n tabs.querySelectorAll('.lytjs-devtools-tab').forEach((t) => {\r\n (t as HTMLElement).style.background = 'transparent';\r\n (t as HTMLElement).style.borderBottomColor = 'transparent';\r\n });\r\n target.style.background = '#1e1e1e';\r\n target.style.borderBottomColor = '#4fc08d';\r\n \r\n this.renderTab(tabName || 'components');\r\n });\r\n });\r\n\r\n this.renderTab('components');\r\n }\r\n\r\n /**\r\n * 渲染标签页内容\r\n */\r\n private renderTab(tab: string): void {\r\n const content = document.getElementById('lytjs-devtools-content');\r\n if (!content) return;\r\n\r\n switch (tab) {\r\n case 'components':\r\n content.innerHTML = this.renderComponentsTab();\r\n break;\r\n case 'store':\r\n content.innerHTML = this.renderStoreTab();\r\n break;\r\n case 'router':\r\n content.innerHTML = this.renderRouterTab();\r\n break;\r\n case 'signals':\r\n content.innerHTML = this.renderSignalsTab();\r\n break;\r\n case 'vdom':\r\n content.innerHTML = this.renderVDOMTab();\r\n break;\r\n case 'performance':\r\n content.innerHTML = this.renderPerformanceTab();\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * 渲染组件标签页\r\n */\r\n private renderComponentsTab(): string {\r\n const tree = getComponentTree();\r\n if (tree.length === 0) {\r\n return '<div style=\"color: #666; text-align: center; padding: 40px;\">No components found.<br>Register your root component with registerRootComponent().</div>';\r\n }\r\n return `<pre style=\"margin: 0; white-space: pre-wrap; word-break: break-all;\">${serializeComponentTree(tree)}</pre>`;\r\n }\r\n\r\n /**\r\n * 渲染 Store 标签页\r\n */\r\n private renderStoreTab(): string {\r\n const states = getStoreStates();\r\n if (states.length === 0) {\r\n return '<div style=\"color: #666; text-align: center; padding: 40px;\">No stores registered.<br>Use registerStore() to register your stores.</div>';\r\n }\r\n \r\n let html = '<div style=\"margin-bottom: 10px;\">';\r\n html += `<strong>Registered Stores:</strong> ${getRegisteredStoreIds().join(', ')}`;\r\n html += '</div>';\r\n html += `<pre style=\"margin: 0; white-space: pre-wrap; word-break: break-all;\">${serializeStoreStates(states)}</pre>`;\r\n return html;\r\n }\r\n\r\n /**\r\n * 渲染 Signals 标签页\r\n */\r\n private renderSignalsTab(): string {\r\n const nodes = getSignalNodes();\r\n \r\n const html = `\r\n <div style=\"margin-bottom: 15px;\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;\">\r\n <strong>📊 Signals (${nodes.length})</strong>\r\n <div>\r\n <button id=\"lytjs-devtools-create-snapshot\" style=\"\r\n background: #4fc08d;\r\n border: none;\r\n color: white;\r\n padding: 5px 10px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 11px;\r\n \">创建快照</button>\r\n <button id=\"lytjs-devtools-clear-signals\" style=\"\r\n background: #ff4d4f;\r\n border: none;\r\n color: white;\r\n padding: 5px 10px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 11px;\r\n margin-left: 5px;\r\n \">清空</button>\r\n </div>\r\n </div>\r\n \r\n <div style=\"display: flex; gap: 10px; margin-bottom: 10px;\">\r\n <button id=\"lytjs-devtools-tab-signals-list\" style=\"\r\n flex: 1;\r\n padding: 8px;\r\n background: #4fc08d;\r\n border: none;\r\n color: white;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 11px;\r\n \">列表视图</button>\r\n <button id=\"lytjs-devtools-tab-signals-graph\" style=\"\r\n flex: 1;\r\n padding: 8px;\r\n background: #333;\r\n border: none;\r\n color: #d4d4d4;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 11px;\r\n \">依赖图</button>\r\n <button id=\"lytjs-devtools-tab-signals-timetravel\" style=\"\r\n flex: 1;\r\n padding: 8px;\r\n background: #333;\r\n border: none;\r\n color: #d4d4d4;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 11px;\r\n \">时间旅行</button>\r\n </div>\r\n \r\n <div id=\"lytjs-devtools-signals-content\">\r\n ${this.renderSignalsList(nodes)}\r\n </div>\r\n </div>\r\n `;\r\n \r\n return html;\r\n }\r\n\r\n /**\r\n * 渲染信号列表\r\n */\r\n private renderSignalsList(nodes: SignalNode[]): string {\r\n if (nodes.length === 0) {\r\n return '<div style=\"color: #666; text-align: center; padding: 40px;\">暂无信号数据<br>使用 registerSignal() 注册信号</div>';\r\n }\r\n \r\n let html = '<div style=\"max-height: 400px; overflow-y: auto;\">';\r\n nodes.forEach((node) => {\r\n const typeIcon = node.type === 'signal' ? '📌' : node.type === 'computed' ? '🧮' : '⚡';\r\n const typeColor = node.type === 'signal' ? '#4fc08d' : node.type === 'computed' ? '#1890ff' : '#faad14';\r\n \r\n html += `\r\n <div style=\"\r\n background: #252526;\r\n border-radius: 4px;\r\n padding: 10px;\r\n margin-bottom: 8px;\r\n border-left: 3px solid ${typeColor};\r\n \">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\r\n <span style=\"font-weight: bold;\">${typeIcon} ${node.name}</span>\r\n <span style=\"color: #888; font-size: 10px;\">${node.type}</span>\r\n </div>\r\n <div style=\"color: #888; font-size: 11px; margin-top: 5px;\">\r\n 更新次数: ${node.updateCount} | \r\n 最后更新: ${node.lastUpdateTime ? new Date(node.lastUpdateTime).toLocaleTimeString() : 'N/A'}\r\n </div>\r\n ${node.averageUpdateTime > 0 ? `<div style=\"color: #888; font-size: 11px;\">平均耗时: ${node.averageUpdateTime.toFixed(2)}ms</div>` : ''}\r\n <div style=\"color: #888; font-size: 10px; margin-top: 5px;\">\r\n 依赖: ${node.dependencies.length > 0 ? node.dependencies.join(', ') : '无'} |\r\n 被依赖: ${node.dependents.length > 0 ? node.dependents.join(', ') : '无'}\r\n </div>\r\n </div>\r\n `;\r\n });\r\n html += '</div>';\r\n \r\n return html;\r\n }\r\n\r\n /**\r\n * 渲染 VDOM 标签页\r\n */\r\n private renderVDOMTab(): string {\r\n const roots = getVDOMTree();\r\n const stats = getVDOMStats();\r\n \r\n if (roots.length === 0) {\r\n return `\r\n <div style=\"color: #666; text-align: center; padding: 40px;\">\r\n <div style=\"font-size: 48px; margin-bottom: 15px;\">🌳</div>\r\n <div>No VDOM roots registered.</div>\r\n <div style=\"font-size: 11px; margin-top: 10px; color: #555;\">\r\n Use registerVDOMRoot() to register your VDOM roots.\r\n </div>\r\n </div>\r\n `;\r\n }\r\n \r\n const html = `\r\n <div style=\"margin-bottom: 15px;\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;\">\r\n <strong>🌳 VDOM Tree</strong>\r\n <button id=\"lytjs-devtools-clear-vdom\" style=\"\r\n background: #ff4d4f;\r\n border: none;\r\n color: white;\r\n padding: 5px 10px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 11px;\r\n \">清空</button>\r\n </div>\r\n \r\n <div style=\"background: #252526; border-radius: 4px; padding: 15px; margin-bottom: 15px;\">\r\n <div style=\"display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; text-align: center;\">\r\n <div>\r\n <div style=\"color: #888; font-size: 11px;\">总节点数</div>\r\n <div style=\"font-size: 20px; font-weight: bold; color: #4fc08d;\">${stats.totalNodes}</div>\r\n </div>\r\n <div>\r\n <div style=\"color: #888; font-size: 11px;\">组件数</div>\r\n <div style=\"font-size: 20px; font-weight: bold; color: #1890ff;\">${stats.componentCount}</div>\r\n </div>\r\n <div>\r\n <div style=\"color: #888; font-size: 11px;\">元素数</div>\r\n <div style=\"font-size: 20px; font-weight: bold; color: #faad14;\">${stats.elementCount}</div>\r\n </div>\r\n </div>\r\n <div style=\"display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; text-align: center; margin-top: 10px;\">\r\n <div>\r\n <div style=\"color: #888; font-size: 11px;\">文本节点</div>\r\n <div style=\"font-size: 16px; font-weight: bold; color: #888;\">${stats.textCount}</div>\r\n </div>\r\n <div>\r\n <div style=\"color: #888; font-size: 11px;\">根节点</div>\r\n <div style=\"font-size: 16px; font-weight: bold; color: #888;\">${stats.rootCount}</div>\r\n </div>\r\n <div>\r\n <div style=\"color: #888; font-size: 11px;\">最大深度</div>\r\n <div style=\"font-size: 16px; font-weight: bold; color: #888;\">${stats.maxDepth}</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div style=\"margin-bottom: 10px;\">\r\n <input id=\"lytjs-devtools-vdom-search\" type=\"text\" placeholder=\"搜索标签名...\" style=\"\r\n width: 100%;\r\n padding: 8px;\r\n background: #252526;\r\n border: 1px solid #3d3d3d;\r\n border-radius: 4px;\r\n color: #d4d4d4;\r\n font-size: 12px;\r\n \" />\r\n </div>\r\n \r\n <div id=\"lytjs-devtools-vdom-tree\" style=\"\r\n background: #252526;\r\n border-radius: 4px;\r\n padding: 15px;\r\n max-height: 400px;\r\n overflow: auto;\r\n font-family: 'Consolas', 'Monaco', monospace;\r\n font-size: 11px;\r\n line-height: 1.6;\r\n \">\r\n <pre style=\"margin: 0; white-space: pre-wrap; word-break: break-all;\">${serializeVDOMTree()}</pre>\r\n </div>\r\n </div>\r\n `;\r\n \r\n return html;\r\n }\r\n\r\n /**\r\n * 渲染 Performance 标签页\r\n */\r\n private renderPerformanceTab(): string {\r\n const stats = getPerformanceStats();\r\n const records = getPerformanceRecords(50);\r\n\r\n let html = `\r\n <div style=\"margin-bottom: 15px;\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;\">\r\n <strong>⚡ Performance</strong>\r\n <button id=\"lytjs-devtools-clear-performance\" style=\"\r\n background: #ff4d4f;\r\n border: none;\r\n color: white;\r\n padding: 5px 10px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 11px;\r\n \">清空记录</button>\r\n </div>\r\n \r\n <div style=\"background: #252526; border-radius: 4px; padding: 15px; margin-bottom: 15px;\">\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 10px;\">\r\n <div style=\"text-align: center;\">\r\n <div style=\"color: #888; font-size: 11px;\">总记录数</div>\r\n <div style=\"font-size: 24px; font-weight: bold; color: #4fc08d;\">${stats.totalRecords}</div>\r\n </div>\r\n <div style=\"text-align: center;\">\r\n <div style=\"color: #888; font-size: 11px;\">平均耗时</div>\r\n <div style=\"font-size: 24px; font-weight: bold; color: #1890ff;\">${stats.averageDuration.toFixed(2)}ms</div>\r\n </div>\r\n <div style=\"text-align: center;\">\r\n <div style=\"color: #888; font-size: 11px;\">最大耗时</div>\r\n <div style=\"font-size: 24px; font-weight: bold; color: #ff4d4f;\">${stats.maxDuration.toFixed(2)}ms</div>\r\n </div>\r\n <div style=\"text-align: center;\">\r\n <div style=\"color: #888; font-size: 11px;\">最小耗时</div>\r\n <div style=\"font-size: 24px; font-weight: bold; color: #52c41a;\">${stats.minDuration.toFixed(2)}ms</div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n \r\n if (Object.keys(stats.byType).length > 0) {\r\n html += `\r\n <div style=\"margin-bottom: 15px;\">\r\n <strong style=\"display: block; margin-bottom: 10px;\">按类型统计</strong>\r\n <div style=\"background: #252526; border-radius: 4px; padding: 10px;\">\r\n `;\r\n \r\n Object.entries(stats.byType).forEach(([type, data]) => {\r\n const typeColor = type === 'signal' ? '#4fc08d' : type === 'computed' ? '#1890ff' : '#faad14';\r\n html += `\r\n <div style=\"display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #333;\">\r\n <span style=\"color: ${typeColor};\">${type}</span>\r\n <span>${data.count} 次 | 平均 ${data.average.toFixed(2)}ms | 最大 ${data.max.toFixed(2)}ms</span>\r\n </div>\r\n `;\r\n });\r\n \r\n html += '</div></div>';\r\n }\r\n \r\n if (records.length > 0) {\r\n html += `\r\n <div>\r\n <strong style=\"display: block; margin-bottom: 10px;\">最近记录 (50条)</strong>\r\n <div style=\"background: #252526; border-radius: 4px; padding: 10px; max-height: 300px; overflow-y: auto;\">\r\n `;\r\n \r\n records.slice().reverse().forEach((record) => {\r\n const durationColor = record.duration > 16 ? '#ff4d4f' : record.duration > 8 ? '#faad14' : '#4fc08d';\r\n html += `\r\n <div style=\"display: flex; justify-content: space-between; padding: 6px 0; border-bottom: 1px solid #333; font-size: 11px;\">\r\n <span>${record.name}</span>\r\n <span style=\"color: ${durationColor};\">${record.duration.toFixed(2)}ms</span>\r\n <span style=\"color: #888;\">${new Date(record.timestamp).toLocaleTimeString()}</span>\r\n </div>\r\n `;\r\n });\r\n \r\n html += '</div></div>';\r\n } else {\r\n html += '<div style=\"color: #666; text-align: center; padding: 40px;\">暂无性能数据</div>';\r\n }\r\n \r\n html += '</div>';\r\n \r\n return html;\r\n }\r\n\r\n /**\r\n * 渲染 Router 标签页\r\n */\r\n private renderRouterTab(): string {\r\n if (!isRouterRegistered()) {\r\n return '<div style=\"color: #666; text-align: center; padding: 40px;\">Router not registered.<br>Use registerRouter() to register your router.</div>';\r\n }\r\n \r\n const route = getCurrentRoute();\r\n const routes = getRoutes();\r\n \r\n let html = '<div style=\"margin-bottom: 15px;\">';\r\n html += '<strong>Current Route:</strong>';\r\n html += '</div>';\r\n html += `<pre style=\"margin: 0 0 15px 0; white-space: pre-wrap; word-break: break-all; background: #252526; padding: 10px; border-radius: 4px;\">${serializeRouteInfo(route)}</pre>`;\r\n \r\n if (routes.length > 0) {\r\n html += '<div style=\"margin-bottom: 10px;\">';\r\n html += '<strong>All Routes:</strong>';\r\n html += '</div>';\r\n html += '<ul style=\"margin: 0; padding-left: 20px;\">';\r\n for (const r of routes) {\r\n html += `<li>${r.path}${r.name ? ` (${r.name})` : ''}</li>`;\r\n }\r\n html += '</ul>';\r\n }\r\n \r\n return html;\r\n }\r\n\r\n /**\r\n * 打开面板\r\n */\r\n open(): void {\r\n if (!this.options.enabled) return;\r\n \r\n const panel = document.getElementById('lytjs-devtools');\r\n if (panel) {\r\n panel.style[this.options.position] = '0';\r\n this.isOpen = true;\r\n this.refresh();\r\n }\r\n }\r\n\r\n /**\r\n * 关闭面板\r\n */\r\n close(): void {\r\n if (typeof document === 'undefined') return;\r\n const panel = document.getElementById('lytjs-devtools');\r\n if (panel) {\r\n panel.style[this.options.position] = `-${this.options.size}px`;\r\n this.isOpen = false;\r\n }\r\n }\r\n\r\n /**\r\n * 切换面板\r\n */\r\n toggle(): void {\r\n if (this.isOpen) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /**\r\n * 刷新内容\r\n */\r\n refresh(): void {\r\n const activeTab = document.querySelector('.lytjs-devtools-tab.active') as HTMLElement;\r\n if (activeTab) {\r\n this.renderTab(activeTab.dataset.tab || 'components');\r\n }\r\n }\r\n\r\n // API 方法\r\n getComponentTree = getComponentTree;\r\n getStoreStates = getStoreStates;\r\n getCurrentRoute = getCurrentRoute;\r\n}\r\n\r\n/**\r\n * 安装 DevTools\r\n */\r\nexport function installDevTools(options?: DevToolsOptions): DevToolsAPI {\r\n if (!devtoolsInstance) {\r\n devtoolsInstance = new DevTools(options);\r\n }\r\n return devtoolsInstance;\r\n}\r\n\r\n/**\r\n * 获取 DevTools 实例\r\n */\r\nexport function getDevTools(): DevToolsAPI | null {\r\n return devtoolsInstance;\r\n}\r\n\r\n/**\r\n * 卸载 DevTools\r\n */\r\nexport function uninstallDevTools(): void {\r\n if (devtoolsInstance) {\r\n devtoolsInstance.close();\r\n devtoolsInstance = null;\r\n }\r\n \r\n if (typeof document !== 'undefined') {\r\n const panel = document.getElementById('lytjs-devtools');\r\n if (panel) {\r\n panel.remove();\r\n }\r\n }\r\n}\r\n\r\n// 重新导出所有功能\r\nexport {\r\n // 组件树\r\n getComponentTree,\r\n serializeComponentTree,\r\n registerRootComponent,\r\n unregisterRootComponent,\r\n \r\n // Store 检查器\r\n getStoreStates,\r\n getStoreState,\r\n setStoreState,\r\n dispatchStoreAction,\r\n serializeStoreStates,\r\n registerStore,\r\n unregisterStore,\r\n getRegisteredStoreIds,\r\n clearStoreRegistry,\r\n subscribeStore,\r\n unsubscribeStore,\r\n onStoreChange,\r\n \r\n // 路由检查器\r\n getCurrentRoute,\r\n navigateTo,\r\n navigateToName,\r\n goBack,\r\n serializeRouteInfo,\r\n getRoutes,\r\n registerRouter,\r\n unregisterRouter,\r\n isRouterRegistered,\r\n watchRouteChanges,\r\n unwatchRouteChanges,\r\n getRouteHistory,\r\n clearRouteHistory,\r\n \r\n // 信号检查器\r\n getSignalNodes,\r\n getSignalNode,\r\n getDependencyGraph,\r\n createSnapshot,\r\n getSnapshots,\r\n getTimeTravelState,\r\n restoreSnapshot,\r\n clearSnapshots,\r\n getPerformanceStats,\r\n getPerformanceRecords,\r\n clearPerformanceRecords,\r\n serializeSignalNode,\r\n serializeDependencyGraph,\r\n serializePerformanceStats,\r\n registerSignal,\r\n unregisterSignal,\r\n recordSignalUpdate,\r\n recordDependency,\r\n clearSignalRegistry,\r\n};\r\n\r\n// 性能监控\r\nexport {\r\n initPerformanceMonitor,\r\n recordMetric,\r\n getMetrics,\r\n getStats,\r\n registerAlertRule,\r\n unregisterAlertRule,\r\n setAlertRuleEnabled,\r\n getAlertRules,\r\n getAlerts,\r\n acknowledgeAlert,\r\n acknowledgeAllAlerts,\r\n clearAlerts,\r\n addObserver,\r\n removeObserver,\r\n clearMetrics,\r\n resetPerformanceMonitor,\r\n getPerformanceReport,\r\n serializePerformanceReport,\r\n startTimer,\r\n} from './performance';\r\n\r\nexport type {\r\n MetricType,\r\n PerformanceMetric,\r\n AlertLevel,\r\n AlertRule,\r\n Alert,\r\n PerformanceStats,\r\n MonitorOptions,\r\n} from './performance';\r\n\r\n// 基准测试\r\nexport {\r\n runBenchmark,\r\n runAsyncBenchmark,\r\n getBenchmarkResults,\r\n getLatestBenchmarkResult,\r\n clearBenchmarkResults,\r\n serializeBenchmarkResult,\r\n serializeAllBenchmarkResults,\r\n compareBenchmarkResults,\r\n createLargeScaleBenchmark,\r\n getMemoryUsage,\r\n serializeMemoryUsage,\r\n createRegressionDetector,\r\n LARGE_SCALE_SCENARIOS,\r\n} from './benchmark';\r\n\r\nexport type {\r\n BenchmarkResult,\r\n BenchmarkConfig,\r\n LargeScaleScenario,\r\n MemoryUsage,\r\n} from './benchmark';\r\n\r\nexport type { DevToolsOptions, DevToolsAPI };\r\n"]}
1
+ {"version":3,"sources":["../src/componentTree.ts","../src/storeInspector.ts","../src/routeInspector.ts","../src/signalsInspector.ts","../src/vdomInspector.ts","../src/performance.ts","../src/benchmark.ts","../src/devtools.ts"],"names":["isObject","isFunction","options","nodes","currentDepth"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @lytjs/devtools - 组件树查看器\n */\n\nimport type { ComponentTreeNode } from './types';\nimport { isObject } from '@lytjs/common-is';\n\n// 组件 ID 计数器\nlet componentIdCounter = 0;\n\n/**\n * 生成组件 ID\n */\nfunction generateComponentId(): string {\n return `component-${++componentIdCounter}`;\n}\n\n/**\n * 提取组件信息\n */\nfunction extractComponentInfo(component: {\n name?: string;\n displayName?: string;\n props?: Record<string, unknown>;\n}): ComponentTreeNode | null {\n if (!component) return null;\n\n const id = generateComponentId();\n const name = component.name || component.displayName || 'Anonymous';\n\n // 提取 props\n const props: Record<string, unknown> = {};\n if (component.props && isObject(component.props)) {\n for (const [key, value] of Object.entries(component.props)) {\n if (typeof value !== 'function') {\n props[key] = value;\n }\n }\n }\n\n return {\n id,\n name,\n props: Object.keys(props).length > 0 ? props : undefined,\n };\n}\n\n/**\n * 递归构建组件树\n */\nfunction buildComponentTreeRecursive(\n component: {\n name?: string;\n displayName?: string;\n props?: Record<string, unknown>;\n children?: unknown[];\n },\n parentId?: string,\n): ComponentTreeNode | null {\n const node = extractComponentInfo(component);\n if (!node) return null;\n\n if (parentId) {\n node.parent = parentId;\n }\n\n // 递归处理子组件\n if (component.children && Array.isArray(component.children)) {\n const children: ComponentTreeNode[] = [];\n for (const child of component.children) {\n const childNode = buildComponentTreeRecursive(\n child as {\n name?: string;\n displayName?: string;\n props?: Record<string, unknown>;\n children?: unknown[];\n },\n node.id,\n );\n if (childNode) {\n children.push(childNode);\n }\n }\n if (children.length > 0) {\n node.children = children;\n }\n }\n\n return node;\n}\n\n/**\n * 获取组件树\n */\nexport function getComponentTree(rootComponent?: {\n name?: string;\n displayName?: string;\n props?: Record<string, unknown>;\n children?: unknown[];\n}): ComponentTreeNode[] {\n if (!rootComponent) {\n // 尝试从全局获取根组件\n const globalRoot = (globalThis as { __LYTJS_ROOT__?: unknown }).__LYTJS_ROOT__;\n if (!globalRoot) {\n return [];\n }\n rootComponent = globalRoot as {\n name?: string;\n displayName?: string;\n props?: Record<string, unknown>;\n children?: unknown[];\n };\n }\n\n const tree = buildComponentTreeRecursive(rootComponent);\n return tree ? [tree] : [];\n}\n\n/**\n * 序列化组件树为字符串\n */\nexport function serializeComponentTree(nodes: ComponentTreeNode[], indent = 0): string {\n let result = '';\n const prefix = ' '.repeat(indent);\n\n for (const node of nodes) {\n result += `${prefix}- ${node.name}`;\n if (node.props && Object.keys(node.props).length > 0) {\n const propsStr = Object.entries(node.props)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(', ');\n result += ` (${propsStr})`;\n }\n result += '\\n';\n\n if (node.children && node.children.length > 0) {\n result += serializeComponentTree(node.children, indent + 1);\n }\n }\n\n return result;\n}\n\n/**\n * 注册根组件(供开发时使用)\n */\nexport function registerRootComponent(component: unknown): void {\n (globalThis as { __LYTJS_ROOT__?: unknown }).__LYTJS_ROOT__ = component;\n}\n\n/**\n * 清除注册的根组件\n */\nexport function unregisterRootComponent(): void {\n delete (globalThis as { __LYTJS_ROOT__?: unknown }).__LYTJS_ROOT__;\n}\n","/**\n * @lytjs/devtools - Store 状态检查器\n */\n\nimport type { StoreStateInfo } from './types';\nimport { isObject, isFunction } from '@lytjs/common-is';\n\ninterface StoreInstance {\n $state?: Record<string, unknown>;\n $id?: string;\n $subscribe?: (cb: (mutation: unknown, state: Record<string, unknown>) => void) => () => void;\n [key: string]: unknown;\n}\n\n// Store 注册表\nconst storeRegistry = new Map<string, StoreInstance>();\n\n// Store 变更订阅器 Map<storeId, unsubscribe 函数>\nconst subscribers = new Map<string, () => void>();\n\n// 全局 Store 变更回调列表\nconst globalChangeCallbacks = new Set<(storeId: string, state: Record<string, unknown>) => void>();\n\n/**\n * Store 变更回调类型\n */\ntype StoreChangeCallback = (storeId: string, state: Record<string, unknown>) => void;\n\n/**\n * 注册 Store\n */\nexport function registerStore(id: string, store: StoreInstance): void {\n storeRegistry.set(id, store);\n}\n\n/**\n * 注销 Store\n */\nexport function unregisterStore(id: string): void {\n storeRegistry.delete(id);\n}\n\n/**\n * 获取所有 Store 状态\n */\nexport function getStoreStates(): StoreStateInfo[] {\n const states: StoreStateInfo[] = [];\n\n for (const [id, store] of storeRegistry.entries()) {\n const stateInfo: StoreStateInfo = {\n id,\n state: {},\n };\n\n // 提取 state\n if (store.$state) {\n stateInfo.state = deepClone(store.$state);\n } else if (isObject(store)) {\n // 提取非函数属性作为 state\n for (const [key, value] of Object.entries(store)) {\n if (!key.startsWith('$') && !isFunction(value)) {\n stateInfo.state[key] = deepClone(value);\n }\n }\n }\n\n // 提取 getters\n if (store.$id) {\n stateInfo.id = store.$id;\n }\n\n states.push(stateInfo);\n }\n\n return states;\n}\n\n/**\n * 获取特定 Store 的状态\n */\nexport function getStoreState(storeId: string): StoreStateInfo | null {\n const store = storeRegistry.get(storeId);\n if (!store) return null;\n\n const stateInfo: StoreStateInfo = {\n id: storeId,\n state: {},\n };\n\n if (store.$state) {\n stateInfo.state = deepClone(store.$state);\n } else if (isObject(store)) {\n for (const [key, value] of Object.entries(store)) {\n if (!key.startsWith('$') && !isFunction(value)) {\n stateInfo.state[key] = deepClone(value);\n }\n }\n }\n\n return stateInfo;\n}\n\n/**\n * 修改 Store 状态(用于开发时调试)\n */\nexport function setStoreState(storeId: string, path: string, value: unknown): boolean {\n const store = storeRegistry.get(storeId);\n if (!store) return false;\n\n const keys = path.split('.');\n let current: unknown = store;\n\n // 遍历到倒数第二个 key\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]!;\n if (!isObject(current)) return false;\n current = (current as Record<string, unknown>)[key];\n }\n\n // 设置最终值\n const lastKey = keys[keys.length - 1];\n if (lastKey && isObject(current)) {\n (current as Record<string, unknown>)[lastKey] = value;\n }\n\n return true;\n}\n\n/**\n * 触发 Store Action\n */\nexport function dispatchStoreAction(\n storeId: string,\n actionName: string,\n ...args: unknown[]\n): unknown {\n const store = storeRegistry.get(storeId);\n if (!store) return null;\n\n const action = (store as Record<string, unknown>)[actionName];\n if (!isFunction(action)) {\n throw new Error(`Action \"${actionName}\" not found in store \"${storeId}\"`);\n }\n\n return (action as (...args: unknown[]) => unknown).apply(store, args);\n}\n\n/**\n * 序列化 Store 状态为字符串\n */\nexport function serializeStoreStates(states: StoreStateInfo[]): string {\n return JSON.stringify(states, null, 2);\n}\n\n/**\n * 深度克隆(简化版)\n */\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as unknown as T;\n }\n\n if (isObject(obj)) {\n const cloned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n cloned[key] = deepClone(value);\n }\n return cloned as unknown as T;\n }\n\n return obj;\n}\n\n/**\n * 订阅 Store 变更\n *\n * @description\n * 当 Store 的 $subscribe 方法可用时自动监听变更,\n * 变更时会触发所有通过 onStoreChange 注册的全局回调\n *\n * @param storeId - 要订阅的 Store ID\n * @returns 是否订阅成功\n */\nexport function subscribeStore(storeId: string): boolean {\n const store = storeRegistry.get(storeId);\n if (!store) return false;\n\n // 如果已经订阅,先取消旧订阅\n if (subscribers.has(storeId)) {\n unsubscribeStore(storeId);\n }\n\n // 优先使用 $subscribe 方法(Pinia 风格)\n if (isFunction(store.$subscribe)) {\n const unsubscribe = store.$subscribe?.((_mutation: unknown, state: Record<string, unknown>) => {\n const currentState = isObject(state) ? deepClone<Record<string, unknown>>(state) : {};\n globalChangeCallbacks.forEach((cb) => cb(storeId, currentState));\n });\n subscribers.set(storeId, isFunction(unsubscribe) ? unsubscribe : () => {});\n return true;\n }\n\n // 降级方案:如果 Store 本身是响应式的,无法自动监听\n return false;\n}\n\n/**\n * 取消订阅 Store 变更\n *\n * @param storeId - 要取消订阅的 Store ID\n */\nexport function unsubscribeStore(storeId: string): void {\n const unsubscribe = subscribers.get(storeId);\n if (unsubscribe) {\n unsubscribe();\n subscribers.delete(storeId);\n }\n}\n\n/**\n * 注册全局 Store 变更回调\n *\n * @description\n * 当任何已订阅的 Store 发生变更时,会调用此回调\n *\n * @param callback - 变更回调函数,接收 storeId 和当前 state\n * @returns 取消注册的函数\n */\nexport function onStoreChange(callback: StoreChangeCallback): () => void {\n globalChangeCallbacks.add(callback);\n return () => {\n globalChangeCallbacks.delete(callback);\n };\n}\n\n/**\n * 清空所有注册的 Store(用于测试)\n */\nexport function clearStoreRegistry(): void {\n // 取消所有订阅\n for (const storeId of subscribers.keys()) {\n unsubscribeStore(storeId);\n }\n globalChangeCallbacks.clear();\n storeRegistry.clear();\n}\n\n/**\n * 获取已注册的 Store ID 列表\n */\nexport function getRegisteredStoreIds(): string[] {\n return Array.from(storeRegistry.keys());\n}\n","/**\n * @lytjs/devtools - 路由查看器\n */\n\nimport type { RouteInfo } from './types';\nimport { isFunction } from '@lytjs/common-is';\n\ninterface RouterMatched {\n path?: string;\n name?: string | null;\n}\n\ninterface RouterLocation {\n path?: string;\n name?: string | null;\n params?: Record<string, string>;\n query?: Record<string, string>;\n matched?: RouterMatched[];\n}\n\ninterface RouterInstance {\n currentRoute?: () => RouterLocation;\n afterEach?: (cb: (to: RouterLocation) => void) => void;\n getRoutes?: () => RouterMatched[];\n push?: (path: string) => Promise<void>;\n back?: () => void;\n}\n\n// 路由器实例\nlet routerInstance: RouterInstance | null = null;\n\n// 路由变更历史记录\nconst routeHistory: RouteInfo[] = [];\n\n// afterEach 钩子的取消注册函数\nlet afterEachHandler: (() => void) | null = null;\n\n/**\n * 注册路由器\n */\nexport function registerRouter(router: RouterInstance): void {\n routerInstance = router;\n}\n\n/**\n * 注销路由器\n */\nexport function unregisterRouter(): void {\n unwatchRouteChanges();\n routerInstance = null;\n}\n\n/**\n * 获取当前路由信息\n */\nexport function getCurrentRoute(): RouteInfo | null {\n if (!routerInstance) return null;\n\n const currentRoute = routerInstance.currentRoute?.();\n if (!currentRoute) return null;\n\n return {\n path: currentRoute.path || '/',\n name: currentRoute.name || null,\n params: currentRoute.params || {},\n query: currentRoute.query || {},\n matched: (currentRoute.matched || []).map((m: { path?: string; name?: string | null }) => ({\n path: m.path || '',\n name: m.name || null,\n })),\n };\n}\n\n/**\n * 获取路由历史\n *\n * @description\n * 返回自监听开始以来的所有路由变更记录\n *\n * @returns 路由变更历史数组\n */\nexport function getRouteHistory(): RouteInfo[] {\n return [...routeHistory];\n}\n\n/**\n * 监听路由变化\n *\n * @description\n * 利用 router.afterEach 钩子监听路由导航,\n * 每次导航后将路由信息记录到 routeHistory 中\n *\n * @returns 是否成功开始监听\n */\nexport function watchRouteChanges(): boolean {\n if (!routerInstance) return false;\n if (!isFunction(routerInstance.afterEach)) return false;\n\n // 避免重复监听\n if (afterEachHandler !== null) {\n unwatchRouteChanges();\n }\n\n // 注册 afterEach 钩子\n routerInstance.afterEach?.((to: RouterLocation) => {\n const routeInfo: RouteInfo = {\n path: to.path || '/',\n name: to.name || null,\n params: to.params || {},\n query: to.query || {},\n matched: ((to.matched as RouterMatched[]) || []).map((m) => ({\n path: m.path || '',\n name: m.name || null,\n })),\n };\n routeHistory.push(routeInfo);\n });\n\n // 标记已开始监听\n afterEachHandler = () => {\n // Vue Router 的 afterEach 无法直接取消,这里标记为已停止\n afterEachHandler = null;\n };\n\n return true;\n}\n\n/**\n * 停止监听路由变化\n *\n * @description\n * 停止路由变更监听,但已记录的历史不会被清除\n */\nexport function unwatchRouteChanges(): void {\n if (afterEachHandler) {\n afterEachHandler();\n afterEachHandler = null;\n }\n}\n\n/**\n * 导航到指定路径\n */\nexport function navigateTo(path: string): Promise<void> {\n if (!routerInstance) {\n return Promise.reject(new Error('Router not registered'));\n }\n\n return routerInstance.push?.(path) || Promise.resolve();\n}\n\n/**\n * 导航到指定路由名称\n */\nexport function navigateToName(name: string, params?: Record<string, string>): Promise<void> {\n if (!routerInstance) {\n return Promise.reject(new Error('Router not registered'));\n }\n\n const path = `/${name}${params ? '?' + new URLSearchParams(params).toString() : ''}`;\n return routerInstance.push?.(path) || Promise.resolve();\n}\n\n/**\n * 返回上一页\n */\nexport function goBack(): Promise<void> {\n if (!routerInstance) {\n return Promise.reject(new Error('Router not registered'));\n }\n\n return routerInstance.back?.() || Promise.resolve();\n}\n\n/**\n * 序列化路由信息为字符串\n */\nexport function serializeRouteInfo(route: RouteInfo | null): string {\n if (!route) return 'No route information available';\n\n let result = `Path: ${route.path}\\n`;\n result += `Name: ${route.name || 'N/A'}\\n`;\n result += `Params: ${JSON.stringify(route.params)}\\n`;\n result += `Query: ${JSON.stringify(route.query)}\\n`;\n result += `Matched Routes:\\n`;\n\n if (route.matched.length === 0) {\n result += ' (none)\\n';\n } else {\n for (const match of route.matched) {\n result += ` - ${match.path}${match.name ? ` (${match.name})` : ''}\\n`;\n }\n }\n\n return result;\n}\n\n/**\n * 获取所有路由配置\n */\nexport function getRoutes(): Array<{ path: string; name?: string | null }> {\n if (!routerInstance) return [];\n\n const routes = routerInstance.getRoutes?.() || [];\n return routes.map((r) => ({\n path: r.path || '',\n name: r.name || null,\n }));\n}\n\n/**\n * 检查路由器是否已注册\n */\nexport function isRouterRegistered(): boolean {\n return routerInstance !== null;\n}\n\n/**\n * 清空路由变更历史(用于测试)\n */\nexport function clearRouteHistory(): void {\n routeHistory.length = 0;\n}\n","/**\n * @lytjs/devtools - 信号依赖追踪和快照\n *\n * 提供时间旅行调试、信号依赖图可视化和性能分析功能\n */\n\n// 信号节点信息\nexport interface SignalNode {\n id: string;\n name: string;\n type: 'signal' | 'computed' | 'effect';\n value?: unknown;\n previousValue?: unknown;\n dependencies: string[];\n dependents: string[];\n updateCount: number;\n lastUpdateTime: number;\n averageUpdateTime: number;\n}\n\n/** 快照记录 */\nexport interface Snapshot {\n id: string;\n timestamp: number;\n label?: string;\n signals: Record<string, SignalSnapshot>;\n}\n\n/** 单个信号的快照 */\nexport interface SignalSnapshot {\n value: unknown;\n dependencies: string[];\n}\n\n/** 时间旅行状态 */\nexport interface TimeTravelState {\n snapshots: Snapshot[];\n currentIndex: number;\n canUndo: boolean;\n canRedo: boolean;\n}\n\n/** 性能记录 */\nexport interface PerformanceRecord {\n id: string;\n name: string;\n type: 'signal' | 'computed' | 'effect';\n duration: number;\n timestamp: number;\n metadata?: Record<string, unknown>;\n}\n\n/** 依赖图节点 */\nexport interface DependencyGraphNode {\n id: string;\n name: string;\n type: 'signal' | 'computed' | 'effect';\n x?: number;\n y?: number;\n}\n\n/** 依赖图边 */\nexport interface DependencyGraphEdge {\n source: string;\n target: string;\n type: 'dependency' | 'dependent';\n}\n\n/** 依赖图 */\nexport interface DependencyGraph {\n nodes: DependencyGraphNode[];\n edges: DependencyGraphEdge[];\n}\n\n/** 可视化布局节点 */\nexport interface VisualLayoutNode {\n id: string;\n name: string;\n type: 'signal' | 'computed' | 'effect';\n x: number;\n y: number;\n level: number;\n width: number;\n height: number;\n inDegree: number;\n outDegree: number;\n}\n\n/** 可视化布局边 */\nexport interface VisualLayoutEdge {\n source: string;\n target: string;\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n type: 'dependency';\n}\n\n/** 可视化布局图 */\nexport interface VisualLayoutGraph {\n nodes: VisualLayoutNode[];\n edges: VisualLayoutEdge[];\n width: number;\n height: number;\n}\n\n/** 布局选项 */\nexport interface LayoutOptions {\n nodeWidth: number;\n nodeHeight: number;\n horizontalSpacing: number;\n verticalSpacing: number;\n centerX: number;\n centerY: number;\n}\n\n/** 默认布局选项 */\nconst DEFAULT_LAYOUT_OPTIONS: LayoutOptions = {\n nodeWidth: 120,\n nodeHeight: 40,\n horizontalSpacing: 60,\n verticalSpacing: 80,\n centerX: 300,\n centerY: 200,\n};\n\n// 信号注册表\nconst signalRegistry = new Map<\n string,\n {\n type: 'signal' | 'computed' | 'effect';\n name: string;\n dependencies: Set<string>;\n dependents: Set<string>;\n value: unknown;\n previousValue?: unknown;\n updateCount: number;\n updateTimes: number[];\n lastUpdateTime: number;\n }\n>();\n\n// 快照管理器\nconst snapshotManager = {\n snapshots: [] as Snapshot[],\n maxSnapshots: 100,\n\n add(snapshot: Snapshot) {\n this.snapshots.push(snapshot);\n if (this.snapshots.length > this.maxSnapshots) {\n this.snapshots.shift();\n }\n },\n\n getAll(): Snapshot[] {\n return [...this.snapshots];\n },\n\n get(index: number): Snapshot | undefined {\n return this.snapshots[index];\n },\n\n clear() {\n this.snapshots = [];\n },\n\n getLength(): number {\n return this.snapshots.length;\n },\n};\n\n// 性能记录\nconst performanceRecords: PerformanceRecord[] = [];\nconst maxPerformanceRecords = 1000;\n\n/**\n * 注册一个信号\n */\nexport function registerSignal(\n id: string,\n name: string,\n type: 'signal' | 'computed' | 'effect',\n initialValue?: unknown,\n): void {\n signalRegistry.set(id, {\n type,\n name,\n dependencies: new Set(),\n dependents: new Set(),\n value: initialValue,\n updateCount: 0,\n updateTimes: [],\n lastUpdateTime: 0,\n });\n}\n\n/**\n * 注销一个信号\n */\nexport function unregisterSignal(id: string): void {\n const node = signalRegistry.get(id);\n if (node) {\n node.dependencies.forEach((depId) => {\n const dep = signalRegistry.get(depId);\n if (dep) {\n dep.dependents.delete(id);\n }\n });\n node.dependents.forEach((depId) => {\n const dep = signalRegistry.get(depId);\n if (dep) {\n dep.dependencies.delete(id);\n }\n });\n }\n signalRegistry.delete(id);\n}\n\n/**\n * 记录信号更新\n */\nexport function recordSignalUpdate(id: string, newValue: unknown, duration?: number): void {\n const node = signalRegistry.get(id);\n if (node) {\n node.previousValue = node.value;\n node.value = newValue;\n node.updateCount++;\n node.lastUpdateTime = Date.now();\n\n if (duration !== undefined) {\n node.updateTimes.push(duration);\n if (node.updateTimes.length > 10) {\n node.updateTimes.shift();\n }\n }\n\n if (duration !== undefined) {\n recordPerformance({\n id,\n name: node.name,\n type: node.type,\n duration,\n timestamp: Date.now(),\n });\n }\n }\n}\n\n/**\n * 记录依赖关系\n */\nexport function recordDependency(sourceId: string, targetId: string): void {\n const source = signalRegistry.get(sourceId);\n const target = signalRegistry.get(targetId);\n\n if (source && target) {\n source.dependencies.add(targetId);\n target.dependents.add(sourceId);\n }\n}\n\n/**\n * 获取所有信号节点\n */\nexport function getSignalNodes(): SignalNode[] {\n return Array.from(signalRegistry.entries()).map(([id, node]) => ({\n id,\n name: node.name,\n type: node.type,\n value: node.value,\n previousValue: node.previousValue,\n dependencies: Array.from(node.dependencies),\n dependents: Array.from(node.dependents),\n updateCount: node.updateCount,\n lastUpdateTime: node.lastUpdateTime,\n averageUpdateTime:\n node.updateTimes.length > 0\n ? node.updateTimes.reduce((a, b) => a + b, 0) / node.updateTimes.length\n : 0,\n }));\n}\n\n/**\n * 获取单个信号节点\n */\nexport function getSignalNode(id: string): SignalNode | undefined {\n const node = signalRegistry.get(id);\n if (!node) return undefined;\n\n return {\n id,\n name: node.name,\n type: node.type,\n value: node.value,\n previousValue: node.previousValue,\n dependencies: Array.from(node.dependencies),\n dependents: Array.from(node.dependents),\n updateCount: node.updateCount,\n lastUpdateTime: node.lastUpdateTime,\n averageUpdateTime:\n node.updateTimes.length > 0\n ? node.updateTimes.reduce((a, b) => a + b, 0) / node.updateTimes.length\n : 0,\n };\n}\n\n/**\n * 获取依赖图\n */\nexport function getDependencyGraph(): DependencyGraph {\n const nodes: DependencyGraphNode[] = [];\n const edges: DependencyGraphEdge[] = [];\n\n signalRegistry.forEach((node, id) => {\n nodes.push({\n id,\n name: node.name,\n type: node.type,\n });\n\n node.dependencies.forEach((depId) => {\n edges.push({\n source: depId,\n target: id,\n type: 'dependency',\n });\n });\n });\n\n return { nodes, edges };\n}\n\n/**\n * 创建快照\n */\nexport function createSnapshot(label?: string): Snapshot {\n const snapshot: Snapshot = {\n id: `snapshot_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n timestamp: Date.now(),\n label,\n signals: {},\n };\n\n signalRegistry.forEach((node, id) => {\n snapshot.signals[id] = {\n value: node.value,\n dependencies: Array.from(node.dependencies),\n };\n });\n\n snapshotManager.add(snapshot);\n return snapshot;\n}\n\n/**\n * 获取所有快照\n */\nexport function getSnapshots(): Snapshot[] {\n return snapshotManager.getAll();\n}\n\n/**\n * 获取快照\n */\nexport function getSnapshot(index: number): Snapshot | undefined {\n return snapshotManager.get(index);\n}\n\n/**\n * 获取时间旅行状态\n */\nexport function getTimeTravelState(): TimeTravelState {\n const length = snapshotManager.getLength();\n return {\n snapshots: snapshotManager.getAll(),\n currentIndex: length - 1,\n canUndo: length > 1,\n canRedo: false,\n };\n}\n\n/**\n * 恢复到指定快照\n */\nexport function restoreSnapshot(index: number): Snapshot | undefined {\n const snapshot = snapshotManager.get(index);\n if (!snapshot) return undefined;\n\n Object.entries(snapshot.signals).forEach(([id, signalSnapshot]) => {\n const node = signalRegistry.get(id);\n if (node) {\n node.value = signalSnapshot.value;\n }\n });\n\n return snapshot;\n}\n\n/**\n * 清除所有快照\n */\nexport function clearSnapshots(): void {\n snapshotManager.clear();\n}\n\n/**\n * 记录性能数据\n */\nexport function recordPerformance(record: PerformanceRecord): void {\n performanceRecords.push(record);\n if (performanceRecords.length > maxPerformanceRecords) {\n performanceRecords.shift();\n }\n}\n\n/**\n * 获取性能记录\n */\nexport function getPerformanceRecords(limit?: number): PerformanceRecord[] {\n const records = [...performanceRecords];\n if (limit !== undefined) {\n return records.slice(-limit);\n }\n return records;\n}\n\n/**\n * 获取性能统计\n */\nexport function getPerformanceStats(): {\n totalRecords: number;\n averageDuration: number;\n maxDuration: number;\n minDuration: number;\n byType: Record<string, { count: number; average: number; max: number }>;\n} {\n if (performanceRecords.length === 0) {\n return {\n totalRecords: 0,\n averageDuration: 0,\n maxDuration: 0,\n minDuration: 0,\n byType: {},\n };\n }\n\n const durations = performanceRecords.map((r) => r.duration);\n const byType: Record<string, { count: number; total: number; max: number }> = {};\n\n performanceRecords.forEach((record) => {\n if (!byType[record.type]) {\n byType[record.type] = { count: 0, total: 0, max: 0 };\n }\n const typeStats = byType[record.type]!;\n typeStats.count++;\n typeStats.total += record.duration;\n typeStats.max = Math.max(typeStats.max, record.duration);\n });\n\n const byTypeResult: Record<string, { count: number; average: number; max: number }> = {};\n Object.entries(byType).forEach(([type, data]) => {\n byTypeResult[type] = {\n count: data.count,\n average: data.total / data.count,\n max: data.max,\n };\n });\n\n return {\n totalRecords: performanceRecords.length,\n averageDuration: durations.reduce((a, b) => a + b, 0) / durations.length,\n maxDuration: Math.max(...durations),\n minDuration: Math.min(...durations),\n byType: byTypeResult,\n };\n}\n\n/**\n * 清除性能记录\n */\nexport function clearPerformanceRecords(): void {\n performanceRecords.length = 0;\n}\n\n/**\n * 清除所有注册信号\n */\nexport function clearSignalRegistry(): void {\n signalRegistry.clear();\n}\n\n/**\n * 序列化信号节点用于显示\n */\nexport function serializeSignalNode(node: SignalNode): string {\n let result = `📊 ${node.name} (${node.type})\\n`;\n result += ` ID: ${node.id}\\n`;\n result += ` 更新次数: ${node.updateCount}\\n`;\n result += ` 最后更新: ${new Date(node.lastUpdateTime).toLocaleTimeString()}\\n`;\n\n if (node.averageUpdateTime > 0) {\n result += ` 平均更新耗时: ${node.averageUpdateTime.toFixed(2)}ms\\n`;\n }\n\n if (node.dependencies.length > 0) {\n result += ` 依赖: ${node.dependencies.join(', ')}\\n`;\n }\n\n if (node.dependents.length > 0) {\n result += ` 被依赖: ${node.dependents.join(', ')}\\n`;\n }\n\n return result;\n}\n\n/**\n * 序列化依赖图用于显示\n */\nexport function serializeDependencyGraph(): string {\n const graph = getDependencyGraph();\n if (graph.nodes.length === 0) {\n return '暂无信号数据';\n }\n\n let result = `📈 依赖图 (${graph.nodes.length} 个节点, ${graph.edges.length} 条边)\\n\\n`;\n\n graph.nodes.forEach((node) => {\n const nodeInfo = signalRegistry.get(node.id);\n const deps = nodeInfo?.dependencies || new Set();\n const dependents = nodeInfo?.dependents || new Set();\n\n result += `🔹 ${node.name} (${node.type})\\n`;\n if (deps.size > 0) {\n result += ` ↓ 依赖: ${Array.from(deps).join(', ')}\\n`;\n }\n if (dependents.size > 0) {\n result += ` ↑ 被依赖: ${Array.from(dependents).join(', ')}\\n`;\n }\n result += '\\n';\n });\n\n return result;\n}\n\n/**\n * 序列化性能统计\n */\nexport function serializePerformanceStats(): string {\n const stats = getPerformanceStats();\n\n if (stats.totalRecords === 0) {\n return '暂无性能数据';\n }\n\n let result = `⚡ 性能统计\\n\\n`;\n result += `总记录数: ${stats.totalRecords}\\n`;\n result += `平均耗时: ${stats.averageDuration.toFixed(2)}ms\\n`;\n result += `最大耗时: ${stats.maxDuration.toFixed(2)}ms\\n`;\n result += `最小耗时: ${stats.minDuration.toFixed(2)}ms\\n\\n`;\n\n result += `按类型统计:\\n`;\n Object.entries(stats.byType).forEach(([type, data]) => {\n result += ` ${type}: ${data.count} 次, 平均 ${data.average.toFixed(2)}ms, 最大 ${data.max.toFixed(2)}ms\\n`;\n });\n\n return result;\n}\n\n// ===== 可视化布局功能 =====\n\n/**\n * 计算节点的层级(用于分层布局)\n */\nfunction calculateNodeLevels(): Map<string, number> {\n const levels = new Map<string, number>();\n const visited = new Set<string>();\n\n function visitNode(nodeId: string, level: number): void {\n if (visited.has(nodeId)) {\n const existingLevel = levels.get(nodeId);\n if (existingLevel !== undefined && level > existingLevel) {\n levels.set(nodeId, level);\n }\n return;\n }\n\n visited.add(nodeId);\n levels.set(nodeId, level);\n\n const node = signalRegistry.get(nodeId);\n if (node) {\n node.dependents.forEach((depId) => {\n visitNode(depId, level + 1);\n });\n }\n }\n\n signalRegistry.forEach((node, id) => {\n if (node.dependencies.size === 0) {\n visitNode(id, 0);\n }\n });\n\n signalRegistry.forEach((_, id) => {\n if (!visited.has(id)) {\n visitNode(id, 0);\n }\n });\n\n return levels;\n}\n\n/**\n * 计算每个节点的入度和出度\n */\nfunction calculateNodeDegrees(): Map<string, { inDegree: number; outDegree: number }> {\n const degrees = new Map<string, { inDegree: number; outDegree: number }>();\n\n signalRegistry.forEach((node, id) => {\n degrees.set(id, {\n inDegree: node.dependencies.size,\n outDegree: node.dependents.size,\n });\n });\n\n return degrees;\n}\n\n/**\n * 获取可视化布局图\n */\nexport function getVisualLayoutGraph(options?: Partial<LayoutOptions>): VisualLayoutGraph {\n const opts: LayoutOptions = { ...DEFAULT_LAYOUT_OPTIONS, ...options };\n\n if (signalRegistry.size === 0) {\n return { nodes: [], edges: [], width: 0, height: 0 };\n }\n\n const levels = calculateNodeLevels();\n const degrees = calculateNodeDegrees();\n\n const levelNodes = new Map<number, string[]>();\n levels.forEach((level, nodeId) => {\n const nodes = levelNodes.get(level) || [];\n nodes.push(nodeId);\n levelNodes.set(level, nodes);\n });\n\n const maxLevel = Math.max(...Array.from(levels.values()), 0);\n const maxNodesInLevel = Math.max(...Array.from(levelNodes.values()).map((n) => n.length), 1);\n\n const graphWidth = (maxNodesInLevel + 1) * (opts.nodeWidth + opts.horizontalSpacing);\n const graphHeight = (maxLevel + 2) * (opts.nodeHeight + opts.verticalSpacing);\n\n const nodes: VisualLayoutNode[] = [];\n const edges: VisualLayoutEdge[] = [];\n\n levelNodes.forEach((nodeIds, level) => {\n const levelWidth =\n nodeIds.length * (opts.nodeWidth + opts.horizontalSpacing) - opts.horizontalSpacing;\n const startX = (graphWidth - levelWidth) / 2;\n\n nodeIds.forEach((nodeId, index) => {\n const node = signalRegistry.get(nodeId);\n if (!node) return;\n\n const degree = degrees.get(nodeId) || { inDegree: 0, outDegree: 0 };\n const x = startX + index * (opts.nodeWidth + opts.horizontalSpacing);\n const y =\n opts.centerY -\n graphHeight / 2 +\n level * (opts.nodeHeight + opts.verticalSpacing) +\n opts.verticalSpacing / 2;\n\n nodes.push({\n id: nodeId,\n name: node.name,\n type: node.type,\n x,\n y,\n level,\n width: opts.nodeWidth,\n height: opts.nodeHeight,\n inDegree: degree.inDegree,\n outDegree: degree.outDegree,\n });\n\n node.dependencies.forEach((depId) => {\n const depNode = nodes.find((n) => n.id === depId);\n if (depNode) {\n edges.push({\n source: depId,\n target: nodeId,\n sourceX: depNode.x + opts.nodeWidth,\n sourceY: depNode.y + opts.nodeHeight / 2,\n targetX: x,\n targetY: y + opts.nodeHeight / 2,\n type: 'dependency',\n });\n }\n });\n });\n });\n\n return { nodes, edges, width: graphWidth, height: graphHeight };\n}\n\n/**\n * 获取以指定节点为中心的子图\n */\nexport function getSubgraph(centerId: string, depth: number = 2): VisualLayoutGraph {\n const includedNodes = new Set<string>([centerId]);\n const queue: Array<{ id: string; currentDepth: number }> = [{ id: centerId, currentDepth: 0 }];\n\n while (queue.length > 0) {\n const { id, currentDepth } = queue.shift()!;\n if (currentDepth >= depth) continue;\n\n const node = signalRegistry.get(id);\n if (node) {\n node.dependencies.forEach((depId) => {\n if (!includedNodes.has(depId)) {\n includedNodes.add(depId);\n queue.push({ id: depId, currentDepth: currentDepth + 1 });\n }\n });\n\n node.dependents.forEach((depId) => {\n if (!includedNodes.has(depId)) {\n includedNodes.add(depId);\n queue.push({ id: depId, currentDepth: currentDepth + 1 });\n }\n });\n }\n }\n\n const tempRegistry = new Map(signalRegistry);\n\n signalRegistry.forEach((_, id) => {\n if (!includedNodes.has(id)) {\n signalRegistry.delete(id);\n }\n });\n\n const subgraph = getVisualLayoutGraph();\n\n signalRegistry.clear();\n tempRegistry.forEach((value, key) => {\n signalRegistry.set(key, value);\n });\n\n return subgraph;\n}\n\n/**\n * 搜索信号节点\n */\nexport function searchSignals(query: string): SignalNode[] {\n const lowerQuery = query.toLowerCase();\n return getSignalNodes().filter(\n (node) =>\n node.name.toLowerCase().includes(lowerQuery) ||\n node.id.toLowerCase().includes(lowerQuery) ||\n node.type.toLowerCase().includes(lowerQuery),\n );\n}\n\n/**\n * 过滤信号节点\n */\nexport function filterSignals(options: {\n types?: Array<'signal' | 'computed' | 'effect'>;\n minUpdateCount?: number;\n hasDependencies?: boolean;\n hasDependents?: boolean;\n}): SignalNode[] {\n return getSignalNodes().filter((node) => {\n if (options.types && !options.types.includes(node.type)) {\n return false;\n }\n if (options.minUpdateCount !== undefined && node.updateCount < options.minUpdateCount) {\n return false;\n }\n if (options.hasDependencies && node.dependencies.length === 0) {\n return false;\n }\n if (options.hasDependents && node.dependents.length === 0) {\n return false;\n }\n return true;\n });\n}\n\n// ===== 快照比较功能 =====\n\n/** 快照差异 */\nexport interface SnapshotDiff {\n added: Array<{ id: string; value: unknown }>;\n removed: Array<{ id: string; value: unknown }>;\n changed: Array<{\n id: string;\n oldValue: unknown;\n newValue: unknown;\n }>;\n}\n\n/**\n * 比较两个快照的差异\n */\nexport function compareSnapshots(snapshot1: Snapshot, snapshot2: Snapshot): SnapshotDiff {\n const diff: SnapshotDiff = {\n added: [],\n removed: [],\n changed: [],\n };\n\n const ids1 = new Set(Object.keys(snapshot1.signals));\n const ids2 = new Set(Object.keys(snapshot2.signals));\n\n ids2.forEach((id) => {\n if (!ids1.has(id)) {\n diff.added.push({\n id,\n value: snapshot2.signals[id]!.value,\n });\n }\n });\n\n ids1.forEach((id) => {\n if (!ids2.has(id)) {\n diff.removed.push({\n id,\n value: snapshot1.signals[id]!.value,\n });\n }\n });\n\n ids1.forEach((id) => {\n if (ids2.has(id)) {\n const oldValue = snapshot1.signals[id]!.value;\n const newValue = snapshot2.signals[id]!.value;\n if (!Object.is(oldValue, newValue)) {\n diff.changed.push({ id, oldValue, newValue });\n }\n }\n });\n\n return diff;\n}\n\n/**\n * 序列化快照差异\n */\nexport function serializeSnapshotDiff(diff: SnapshotDiff): string {\n let result = '';\n\n if (diff.added.length > 0) {\n result += `➕ 新增信号 (${diff.added.length}):\\n`;\n diff.added.forEach(({ id, value }) => {\n result += ` ${id}: ${JSON.stringify(value)}\\n`;\n });\n result += '\\n';\n }\n\n if (diff.removed.length > 0) {\n result += `➖ 移除信号 (${diff.removed.length}):\\n`;\n diff.removed.forEach(({ id, value }) => {\n result += ` ${id}: ${JSON.stringify(value)}\\n`;\n });\n result += '\\n';\n }\n\n if (diff.changed.length > 0) {\n result += `🔄 变更信号 (${diff.changed.length}):\\n`;\n diff.changed.forEach(({ id, oldValue, newValue }) => {\n result += ` ${id}:\\n`;\n result += ` 旧值: ${JSON.stringify(oldValue)}\\n`;\n result += ` 新值: ${JSON.stringify(newValue)}\\n`;\n });\n result += '\\n';\n }\n\n if (result === '') {\n result = '✨ 快照完全相同';\n }\n\n return result;\n}\n\n/**\n * 获取相邻快照的差异\n */\nexport function getDiffBetweenSnapshots(index1: number, index2: number): SnapshotDiff | null {\n const snapshot1 = getSnapshot(index1);\n const snapshot2 = getSnapshot(index2);\n\n if (!snapshot1 || !snapshot2) {\n return null;\n }\n\n return compareSnapshots(snapshot1, snapshot2);\n}\n\n/**\n * 时间旅行导航\n */\nexport interface TimeTravelNavigator {\n currentIndex: number;\n total: number;\n canGoBack: boolean;\n canGoForward: boolean;\n currentSnapshot: Snapshot | null;\n previousSnapshot: Snapshot | null;\n nextSnapshot: Snapshot | null;\n diff: SnapshotDiff | null;\n}\n\n/**\n * 获取时间旅行导航状态\n */\nexport function getTimeTravelNavigator(index?: number): TimeTravelNavigator {\n const snapshots = getSnapshots();\n const currentIndex = index !== undefined ? index : Math.max(0, snapshots.length - 1);\n\n return {\n currentIndex,\n total: snapshots.length,\n canGoBack: currentIndex > 0,\n canGoForward: currentIndex < snapshots.length - 1,\n currentSnapshot: snapshots[currentIndex] ?? null,\n previousSnapshot: currentIndex > 0 ? (snapshots[currentIndex - 1] ?? null) : null,\n nextSnapshot: snapshots[currentIndex + 1] ?? null,\n diff:\n currentIndex > 0\n ? compareSnapshots(snapshots[currentIndex - 1]!, snapshots[currentIndex]!)\n : null,\n };\n}\n\n/**\n * 恢复到上一个快照\n */\nexport function timeTravelBack(): Snapshot | null {\n const navigator = getTimeTravelNavigator();\n if (!navigator.canGoBack) return null;\n return restoreSnapshot(navigator.currentIndex - 1) ?? null;\n}\n\n/**\n * 前进到下一个快照\n */\nexport function timeTravelForward(): Snapshot | null {\n const navigator = getTimeTravelNavigator();\n if (!navigator.canGoForward) return null;\n return restoreSnapshot(navigator.currentIndex + 1) ?? null;\n}\n","/**\n * @lytjs/devtools - VDOM 节点树检查器\n *\n * 提供虚拟 DOM 树的可视化和检查功能\n */\n\nimport type { VNode } from '@lytjs/vdom';\n\nexport interface VDOMNodeInfo {\n id: string;\n type: string;\n tagName?: string;\n text?: string;\n props?: Record<string, unknown>;\n children: VDOMNodeInfo[];\n parentId?: string;\n depth: number;\n componentId?: string;\n isComponent: boolean;\n key?: string | number;\n ref?: string;\n domElement?: HTMLElement | null;\n}\n\ninterface VDOMRegistry {\n roots: Map<string, VDOMNodeInfo>;\n nodes: Map<string, VDOMNodeInfo>;\n idCounter: number;\n}\n\nconst registry: VDOMRegistry = {\n roots: new Map(),\n nodes: new Map(),\n idCounter: 0,\n};\n\nconst componentVDOMMap = new Map<string, string[]>();\n\nfunction generateId(): string {\n return `vdom-${++registry.idCounter}-${Date.now().toString(36)}`;\n}\n\nfunction getVNodeType(vnode: VNode): { type: string; tagName?: string; isComponent: boolean } {\n if (typeof vnode.type === 'string') {\n return { type: 'element', tagName: vnode.type, isComponent: false };\n } else if (typeof vnode.type === 'object' && vnode.type !== null) {\n const name = (vnode.type as { name?: string }).name || 'AnonymousComponent';\n return { type: 'component', tagName: name, isComponent: true };\n } else if (typeof vnode.type === 'function') {\n const name = (vnode.type as { name?: string }).name || 'FunctionalComponent';\n return { type: 'component', tagName: name, isComponent: true };\n }\n return { type: 'unknown', isComponent: false };\n}\n\nfunction extractTextContent(vnode: VNode): string | undefined {\n if (vnode.children === null || vnode.children === undefined) {\n return undefined;\n }\n\n if (typeof vnode.children === 'string') {\n return vnode.children;\n }\n\n if (typeof vnode.children === 'number') {\n return String(vnode.children);\n }\n\n if (Array.isArray(vnode.children)) {\n const texts: string[] = [];\n for (const child of vnode.children) {\n if (typeof child === 'string') {\n texts.push(child);\n } else if (typeof child === 'number') {\n texts.push(String(child));\n } else if (child && typeof child === 'object' && 'children' in child) {\n const childText = extractTextContent(child as VNode);\n if (childText) texts.push(childText);\n }\n }\n return texts.length > 0 ? texts.join('') : undefined;\n }\n\n return undefined;\n}\n\nfunction extractProps(vnode: VNode): Record<string, unknown> | undefined {\n if (!vnode.props || Object.keys(vnode.props).length === 0) {\n return undefined;\n }\n\n const props: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(vnode.props)) {\n if (key.startsWith('on')) continue;\n if (typeof value === 'function') continue;\n props[key] = value;\n }\n\n return Object.keys(props).length > 0 ? props : undefined;\n}\n\nexport function registerVDOMRoot(vnode: VNode, componentId?: string): string {\n const id = generateId();\n const nodeInfo = processVNode(vnode, id, null, 0, componentId);\n\n if (nodeInfo) {\n registry.roots.set(id, nodeInfo);\n registry.nodes.set(id, nodeInfo);\n\n if (componentId) {\n const existing = componentVDOMMap.get(componentId) || [];\n existing.push(id);\n componentVDOMMap.set(componentId, existing);\n }\n }\n\n return id;\n}\n\nfunction processVNode(\n vnode: VNode | string | number | null | undefined,\n parentId: string | undefined,\n _parentDom: HTMLElement | null,\n depth: number,\n componentId?: string,\n): VDOMNodeInfo | null {\n if (vnode === null || vnode === undefined) {\n return null;\n }\n\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n const id = generateId();\n const text = typeof vnode === 'number' ? String(vnode) : vnode;\n const nodeInfo: VDOMNodeInfo = {\n id,\n type: 'text',\n text,\n children: [],\n parentId,\n depth,\n isComponent: false,\n };\n registry.nodes.set(id, nodeInfo);\n return nodeInfo;\n }\n\n if (typeof vnode !== 'object') {\n return null;\n }\n\n const id = generateId();\n const { type, tagName, isComponent } = getVNodeType(vnode);\n const text = extractTextContent(vnode);\n const props = extractProps(vnode);\n\n const key =\n vnode.key !== null && vnode.key !== undefined && typeof vnode.key !== 'symbol'\n ? vnode.key\n : undefined;\n const el = vnode.el;\n const domElement = el && el instanceof HTMLElement ? el : null;\n\n const nodeInfo: VDOMNodeInfo = {\n id,\n type,\n tagName,\n text: type === 'text' || !tagName ? text : undefined,\n props,\n children: [],\n parentId,\n depth,\n componentId,\n isComponent,\n key,\n ref: typeof vnode.ref === 'string' ? vnode.ref : undefined,\n domElement,\n };\n\n registry.nodes.set(id, nodeInfo);\n\n if (vnode.children && Array.isArray(vnode.children)) {\n for (const child of vnode.children) {\n const childInfo = processVNode(child as VNode, id, domElement, depth + 1, componentId);\n if (childInfo) {\n nodeInfo.children.push(childInfo);\n }\n }\n }\n\n return nodeInfo;\n}\n\nexport function unregisterVDOMRoot(id: string): void {\n const node = registry.roots.get(id);\n if (node) {\n cleanupNode(node);\n registry.roots.delete(id);\n }\n}\n\nfunction cleanupNode(node: VDOMNodeInfo): void {\n registry.nodes.delete(node.id);\n for (const child of node.children) {\n cleanupNode(child);\n }\n}\n\nexport function getVDOMRoots(): VDOMNodeInfo[] {\n return Array.from(registry.roots.values());\n}\n\nexport function getVDOMNodeById(id: string): VDOMNodeInfo | undefined {\n return registry.nodes.get(id);\n}\n\nexport function getVDOMTree(): VDOMNodeInfo[] {\n return getVDOMRoots();\n}\n\nexport function findVDOMNodesByTag(tagName: string): VDOMNodeInfo[] {\n const results: VDOMNodeInfo[] = [];\n for (const node of registry.nodes.values()) {\n if (node.tagName === tagName) {\n results.push(node);\n }\n }\n return results;\n}\n\nexport function findVDOMNodesByProp(propName: string, value?: unknown): VDOMNodeInfo[] {\n const results: VDOMNodeInfo[] = [];\n for (const node of registry.nodes.values()) {\n if (node.props && propName in node.props) {\n if (value === undefined || node.props[propName] === value) {\n results.push(node);\n }\n }\n }\n return results;\n}\n\nexport function getVDOMStats(): {\n totalNodes: number;\n rootCount: number;\n maxDepth: number;\n componentCount: number;\n elementCount: number;\n textCount: number;\n} {\n let maxDepth = 0;\n let componentCount = 0;\n let elementCount = 0;\n let textCount = 0;\n\n for (const node of registry.nodes.values()) {\n if (node.depth > maxDepth) maxDepth = node.depth;\n if (node.isComponent) componentCount++;\n else if (node.type === 'element') elementCount++;\n else if (node.type === 'text') textCount++;\n }\n\n return {\n totalNodes: registry.nodes.size,\n rootCount: registry.roots.size,\n maxDepth,\n componentCount,\n elementCount,\n textCount,\n };\n}\n\nexport function clearVDOMRegistry(): void {\n registry.roots.clear();\n registry.nodes.clear();\n registry.idCounter = 0;\n componentVDOMMap.clear();\n}\n\nexport function serializeVDOMNode(node: VDOMNodeInfo, indent = 0): string {\n const spaces = ' '.repeat(indent);\n let result = '';\n\n if (node.type === 'text') {\n result += `${spaces}📝 \"${node.text || ''}\"\\n`;\n } else if (node.isComponent) {\n result += `${spaces}🧩 <${node.tagName || 'Component'}`;\n if (node.key !== undefined) result += ` key=\"${node.key}\"`;\n result += '>\\n';\n } else if (node.type === 'element') {\n result += `${spaces}🏷️ <${node.tagName || 'unknown'}`;\n if (node.key !== undefined) result += ` key=\"${node.key}\"`;\n if (node.props) {\n const propStr = Object.entries(node.props)\n .slice(0, 3)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n if (propStr) result += ` ${propStr}`;\n if (Object.keys(node.props).length > 3) {\n result += ' ...';\n }\n }\n result += '>\\n';\n }\n\n for (const child of node.children) {\n result += serializeVDOMNode(child, indent + 1);\n }\n\n if ((node.isComponent || node.type === 'element') && node.children.length === 0) {\n result += `${spaces} (empty)\\n`;\n }\n\n return result;\n}\n\nexport function serializeVDOMTree(): string {\n const roots = getVDOMRoots();\n if (roots.length === 0) {\n return 'No VDOM roots registered.';\n }\n\n let result = `📦 VDOM Tree (${roots.length} root(s))\\n`;\n result += '─'.repeat(40) + '\\n';\n\n for (const root of roots) {\n result += serializeVDOMNode(root);\n result += '\\n';\n }\n\n const stats = getVDOMStats();\n result += '─'.repeat(40) + '\\n';\n result += `📊 Stats: ${stats.totalNodes} nodes, ${stats.componentCount} components, `;\n result += `${stats.elementCount} elements, ${stats.textCount} text nodes\\n`;\n result += `📏 Max depth: ${stats.maxDepth}\\n`;\n\n return result;\n}\n\nexport function getVDOMPath(nodeId: string): VDOMNodeInfo[] {\n const path: VDOMNodeInfo[] = [];\n let current = registry.nodes.get(nodeId);\n\n while (current) {\n path.unshift(current);\n current = current.parentId ? registry.nodes.get(current.parentId) : undefined;\n }\n\n return path;\n}\n\nexport function highlightVDOMNode(nodeId: string): void {\n const node = registry.nodes.get(nodeId);\n if (node?.domElement) {\n const el = node.domElement;\n const originalOutline = el.style.outline;\n const originalBackground = el.style.backgroundColor;\n\n el.style.outline = '2px solid #4fc08d';\n el.style.backgroundColor = 'rgba(79, 192, 141, 0.1)';\n\n setTimeout(() => {\n el.style.outline = originalOutline;\n el.style.backgroundColor = originalBackground;\n }, 2000);\n }\n}\n\nexport function inspectVDOMNode(nodeId: string): {\n node: VDOMNodeInfo;\n path: VDOMNodeInfo[];\n domElement?: HTMLElement | null;\n} | null {\n const node = registry.nodes.get(nodeId);\n if (!node) return null;\n\n return {\n node,\n path: getVDOMPath(nodeId),\n domElement: node.domElement,\n };\n}\n","/**\n * @lytjs/devtools - 性能监控系统\n *\n * 提供性能埋点、性能指标收集、性能告警等功能\n */\n\n/** 性能指标类型 */\nexport type MetricType = 'render' | 'update' | 'effect' | 'computed' | 'reaction' | 'custom';\n\n/** 性能指标 */\nexport interface PerformanceMetric {\n id: string;\n name: string;\n type: MetricType;\n duration: number;\n timestamp: number;\n metadata?: Record<string, unknown>;\n}\n\n/** 告警级别 */\nexport type AlertLevel = 'info' | 'warning' | 'error' | 'critical';\n\n/** 告警规则 */\nexport interface AlertRule {\n id: string;\n name: string;\n level: AlertLevel;\n condition: (metric: PerformanceMetric, stats: PerformanceStats) => boolean;\n message: string;\n enabled: boolean;\n cooldown: number;\n}\n\n/** 告警 */\nexport interface Alert {\n id: string;\n ruleId: string;\n ruleName: string;\n level: AlertLevel;\n message: string;\n metric?: PerformanceMetric;\n timestamp: number;\n acknowledged: boolean;\n}\n\n/** 性能统计 */\nexport interface PerformanceStats {\n count: number;\n total: number;\n average: number;\n min: number;\n max: number;\n p50: number;\n p90: number;\n p99: number;\n}\n\n/** 监控配置 */\nexport interface MonitorOptions {\n /** 是否启用监控 */\n enabled?: boolean;\n /** 最大记录数 */\n maxRecords?: number;\n /** 默认采样率 (0-1) */\n sampleRate?: number;\n /** 是否自动记录页面指标 */\n autoRecordPageMetrics?: boolean;\n /** 是否自动记录长任务 */\n autoRecordLongTasks?: boolean;\n /** 长任务阈值 (ms) */\n longTaskThreshold?: number;\n}\n\n/** 默认配置 */\nconst DEFAULT_OPTIONS: Required<MonitorOptions> = {\n enabled: true,\n maxRecords: 1000,\n sampleRate: 1,\n autoRecordPageMetrics: true,\n autoRecordLongTasks: true,\n longTaskThreshold: 50,\n};\n\n// 性能记录\nconst metrics: PerformanceMetric[] = [];\n\n// 告警规则\nconst alertRules: Map<string, AlertRule> = new Map();\n\n// 告警记录\nconst alerts: Alert[] = [];\n\n// 告警冷却时间记录\nconst alertCooldowns: Map<string, number> = new Map();\n\n// 配置\nlet options: Required<MonitorOptions> = { ...DEFAULT_OPTIONS };\n\n// 观察者回调\ntype ObserverCallback = (metric: PerformanceMetric) => void;\nconst observers: Set<ObserverCallback> = new Set();\n\n/**\n * 初始化性能监控\n */\nexport function initPerformanceMonitor(opts?: MonitorOptions): void {\n options = { ...DEFAULT_OPTIONS, ...opts };\n\n if (options.enabled) {\n if (options.autoRecordPageMetrics) {\n initPageMetrics();\n }\n if (options.autoRecordLongTasks) {\n initLongTaskObserver();\n }\n initDefaultAlertRules();\n }\n}\n\n/**\n * 初始化页面指标记录\n */\nfunction initPageMetrics(): void {\n if (typeof window === 'undefined') return;\n\n // 记录首次内容绘制\n if (typeof PerformanceObserver !== 'undefined') {\n try {\n new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.entryType === 'paint') {\n recordMetric({\n name: entry.name,\n type: 'custom',\n duration: entry.startTime,\n metadata: { entryType: entry.entryType },\n });\n }\n }\n }).observe({ type: 'paint', buffered: true });\n } catch (e) {\n console.warn('[LytJS Performance] Failed to observe paint metrics:', e);\n }\n\n // 记录首次输入延迟\n try {\n new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const firstInputEntry = entry as PerformanceEventTiming;\n if (firstInputEntry.processingStart !== undefined) {\n recordMetric({\n name: 'First Input Delay',\n type: 'custom',\n duration: firstInputEntry.processingStart - firstInputEntry.startTime,\n metadata: { entryType: entry.entryType },\n });\n }\n }\n }).observe({ type: 'first-input', buffered: true });\n } catch (e) {\n console.warn('[LytJS Performance] Failed to observe first-input:', e);\n }\n }\n}\n\n/**\n * 初始化长任务观察器\n */\nfunction initLongTaskObserver(): void {\n if (typeof PerformanceObserver === 'undefined') return;\n\n try {\n new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.entryType === 'longtask') {\n recordMetric({\n name: 'Long Task',\n type: 'custom',\n duration: entry.duration,\n metadata: { attribution: (entry as { attribution?: unknown }).attribution },\n });\n }\n }\n }).observe({ type: 'longtask', buffered: true });\n } catch (e) {\n console.warn('[LytJS Performance] Failed to observe long tasks:', e);\n }\n}\n\n/**\n * 初始化默认告警规则\n */\nfunction initDefaultAlertRules(): void {\n // 长任务告警\n registerAlertRule({\n id: 'long_task_warning',\n name: '长任务警告',\n level: 'warning',\n condition: (metric) => metric.duration > options.longTaskThreshold,\n message: '检测到长任务: {{name}}, 耗时 {{duration}}ms',\n enabled: true,\n cooldown: 5000,\n });\n\n // 渲染性能告警\n registerAlertRule({\n id: 'slow_render_error',\n name: '渲染过慢',\n level: 'error',\n condition: (metric, stats) => metric.duration > stats.p99 * 1.5 && stats.count > 10,\n message: '渲染性能异常: {{name}}, 耗时 {{duration}}ms',\n enabled: true,\n cooldown: 10000,\n });\n\n // 严重性能问题告警\n registerAlertRule({\n id: 'critical_render',\n name: '严重渲染问题',\n level: 'critical',\n condition: (metric) => metric.duration > 500,\n message: '严重性能问题: {{name}} 耗时超过 500ms!',\n enabled: true,\n cooldown: 30000,\n });\n}\n\n/**\n * 记录性能指标\n */\nexport function recordMetric(\n metric: Omit<PerformanceMetric, 'id' | 'timestamp'>,\n): PerformanceMetric {\n if (!options.enabled) {\n return { id: '', timestamp: 0, ...metric };\n }\n\n // 采样\n if (Math.random() > options.sampleRate) {\n return { id: '', timestamp: 0, ...metric };\n }\n\n const fullMetric: PerformanceMetric = {\n id: `metric_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n timestamp: Date.now(),\n ...metric,\n };\n\n // 添加到记录\n metrics.push(fullMetric);\n\n // 限制记录数量\n if (metrics.length > options.maxRecords) {\n metrics.shift();\n }\n\n // 通知观察者\n observers.forEach((cb) => cb(fullMetric));\n\n // 检查告警规则\n checkAlertRules(fullMetric);\n\n return fullMetric;\n}\n\n/**\n * 获取所有性能指标\n */\nexport function getMetrics(limit?: number): PerformanceMetric[] {\n const result = [...metrics];\n if (limit !== undefined) {\n return result.slice(-limit);\n }\n return result;\n}\n\n/**\n * 获取性能统计\n */\nexport function getStats(type?: MetricType): PerformanceStats {\n const filteredMetrics = type ? metrics.filter((m) => m.type === type) : [...metrics];\n\n if (filteredMetrics.length === 0) {\n return {\n count: 0,\n total: 0,\n average: 0,\n min: 0,\n max: 0,\n p50: 0,\n p90: 0,\n p99: 0,\n };\n }\n\n const durations = filteredMetrics.map((m) => m.duration).sort((a, b) => a - b);\n const total = durations.reduce((a, b) => a + b, 0);\n\n return {\n count: durations.length,\n total,\n average: total / durations.length,\n min: durations[0] ?? 0,\n max: durations[durations.length - 1] ?? 0,\n p50: percentile(durations, 50),\n p90: percentile(durations, 90),\n p99: percentile(durations, 99),\n };\n}\n\n/**\n * 计算百分位数\n */\nfunction percentile(sortedArray: number[], p: number): number {\n if (sortedArray.length === 0) return 0;\n const index = Math.ceil((sortedArray.length * p) / 100) - 1;\n return sortedArray[Math.max(0, index)] ?? 0;\n}\n\n/**\n * 注册告警规则\n */\nexport function registerAlertRule(rule: AlertRule): void {\n alertRules.set(rule.id, rule);\n}\n\n/**\n * 注销告警规则\n */\nexport function unregisterAlertRule(ruleId: string): void {\n alertRules.delete(ruleId);\n}\n\n/**\n * 启用/禁用告警规则\n */\nexport function setAlertRuleEnabled(ruleId: string, enabled: boolean): void {\n const rule = alertRules.get(ruleId);\n if (rule) {\n rule.enabled = enabled;\n }\n}\n\n/**\n * 获取所有告警规则\n */\nexport function getAlertRules(): AlertRule[] {\n return Array.from(alertRules.values());\n}\n\n/**\n * 获取当前告警\n */\nexport function getAlerts(includeAcknowledged: boolean = true): Alert[] {\n if (includeAcknowledged) {\n return [...alerts];\n }\n return alerts.filter((a) => !a.acknowledged);\n}\n\n/**\n * 确认告警\n */\nexport function acknowledgeAlert(alertId: string): void {\n const alert = alerts.find((a) => a.id === alertId);\n if (alert) {\n alert.acknowledged = true;\n }\n}\n\n/**\n * 确认所有告警\n */\nexport function acknowledgeAllAlerts(): void {\n alerts.forEach((alert) => {\n alert.acknowledged = true;\n });\n}\n\n/**\n * 清除告警记录\n */\nexport function clearAlerts(): void {\n alerts.length = 0;\n}\n\n/**\n * 检查告警规则\n */\nfunction checkAlertRules(metric: PerformanceMetric): void {\n const stats = getStats(metric.type);\n\n alertRules.forEach((rule) => {\n if (!rule.enabled) return;\n\n // 检查冷却时间\n const lastTriggered = alertCooldowns.get(rule.id) || 0;\n if (Date.now() - lastTriggered < rule.cooldown) return;\n\n // 检查条件\n if (rule.condition(metric, stats)) {\n const alert: Alert = {\n id: `alert_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n ruleId: rule.id,\n ruleName: rule.name,\n level: rule.level,\n message: interpolateMessage(rule.message, metric),\n metric,\n timestamp: Date.now(),\n acknowledged: false,\n };\n\n alerts.push(alert);\n\n // 记录冷却时间\n alertCooldowns.set(rule.id, Date.now());\n\n // 限制告警记录数量\n if (alerts.length > 100) {\n alerts.shift();\n }\n\n // 输出告警到控制台\n outputAlert(alert);\n }\n });\n}\n\n/**\n * 插值消息模板\n */\nfunction interpolateMessage(message: string, metric: PerformanceMetric): string {\n return message\n .replace(/\\{\\{name\\}\\}/g, metric.name)\n .replace(/\\{\\{duration\\}\\}/g, metric.duration.toFixed(2))\n .replace(/\\{\\{type\\}\\}/g, metric.type);\n}\n\n/**\n * 输出告警\n */\nfunction outputAlert(alert: Alert): void {\n const levelStyles: Record<AlertLevel, string> = {\n info: 'color: #1890ff;',\n warning: 'color: #faad14;',\n error: 'color: #ff4d4f;',\n critical: 'color: #722ed1; background: #ff4d4f; padding: 2px 5px;',\n };\n\n console.warn(\n `%c[LytJS Alert] ${alert.ruleName}%c ${alert.message}`,\n levelStyles[alert.level],\n 'color: inherit;',\n );\n}\n\n/**\n * 添加观察者\n */\nexport function addObserver(callback: ObserverCallback): void {\n observers.add(callback);\n}\n\n/**\n * 移除观察者\n */\nexport function removeObserver(callback: ObserverCallback): void {\n observers.delete(callback);\n}\n\n/**\n * 清除所有性能记录\n */\nexport function clearMetrics(): void {\n metrics.length = 0;\n}\n\n/**\n * 重置性能监控\n */\nexport function resetPerformanceMonitor(): void {\n metrics.length = 0;\n alerts.length = 0;\n observers.clear();\n alertCooldowns.clear();\n alertRules.clear();\n}\n\n/**\n * 获取性能报告\n */\nexport function getPerformanceReport(): {\n metrics: PerformanceMetric[];\n stats: Record<MetricType, PerformanceStats>;\n alerts: Alert[];\n summary: {\n totalMetrics: number;\n totalAlerts: number;\n unacknowledgedAlerts: number;\n averageDuration: number;\n };\n} {\n const stats: Record<MetricType, PerformanceStats> = {\n render: getStats('render'),\n update: getStats('update'),\n effect: getStats('effect'),\n computed: getStats('computed'),\n reaction: getStats('reaction'),\n custom: getStats('custom'),\n };\n\n const allStats = getStats();\n\n return {\n metrics: [...metrics],\n stats,\n alerts: [...alerts],\n summary: {\n totalMetrics: metrics.length,\n totalAlerts: alerts.length,\n unacknowledgedAlerts: alerts.filter((a) => !a.acknowledged).length,\n averageDuration: allStats.average,\n },\n };\n}\n\n/**\n * 序列化性能报告(用于显示)\n */\nexport function serializePerformanceReport(): string {\n const report = getPerformanceReport();\n let result = `⚡ 性能报告\\n\\n`;\n result += `📊 统计摘要:\\n`;\n result += ` 总记录数: ${report.summary.totalMetrics}\\n`;\n result += ` 平均耗时: ${report.summary.averageDuration.toFixed(2)}ms\\n`;\n result += ` 总告警数: ${report.summary.totalAlerts}\\n`;\n result += ` 未确认告警: ${report.summary.unacknowledgedAlerts}\\n\\n`;\n\n result += `📈 分类型统计:\\n`;\n Object.entries(report.stats).forEach(([type, stats]) => {\n if (stats.count > 0) {\n result += ` ${type}: ${stats.count} 次, 平均 ${stats.average.toFixed(2)}ms, 最大 ${stats.max.toFixed(2)}ms\\n`;\n }\n });\n\n if (report.alerts.length > 0) {\n result += `\\n🚨 最近告警:\\n`;\n report.alerts.slice(-5).forEach((alert) => {\n const levelIcon =\n alert.level === 'critical'\n ? '🔴'\n : alert.level === 'error'\n ? '❌'\n : alert.level === 'warning'\n ? '⚠️'\n : 'ℹ️';\n result += ` ${levelIcon} [${alert.level}] ${alert.ruleName}: ${alert.message}\\n`;\n });\n }\n\n return result;\n}\n\n/**\n * 创建计时器\n */\nexport function startTimer(name: string, type: MetricType = 'custom'): () => void {\n const startTime = performance.now();\n\n return () => {\n const duration = performance.now() - startTime;\n recordMetric({ name, type, duration });\n };\n}\n\n// ===== 时序事件功能 =====\n\n/** 时序事件 */\nexport interface TimelineEvent {\n id: string;\n name: string;\n category: 'render' | 'effect' | 'custom';\n startTime: number;\n duration: number;\n depth: number;\n metadata?: Record<string, unknown>;\n}\n\n/** 火焰图节点 */\nexport interface FlameGraphNode {\n name: string;\n value: number;\n children?: FlameGraphNode[];\n category?: 'render' | 'effect' | 'custom';\n}\n\n/** 时序事件栈 */\nconst timelineEventStack: Array<{\n event: TimelineEvent;\n startTime: number;\n}> = [];\n\nconst timelineEvents: TimelineEvent[] = [];\nconst maxTimelineEvents = 1000;\n\n/** 当前深度 */\nlet currentDepth = 0;\n\n/**\n * 开始时序事件\n */\nexport function beginTimelineEvent(\n name: string,\n category: TimelineEvent['category'] = 'custom',\n metadata?: Record<string, unknown>,\n): string {\n const id = `timeline_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const event: TimelineEvent = {\n id,\n name,\n category,\n startTime: performance.now(),\n duration: 0,\n depth: currentDepth,\n metadata,\n };\n\n timelineEventStack.push({\n event,\n startTime: performance.now(),\n });\n\n currentDepth++;\n\n return id;\n}\n\n/**\n * 结束指定时序事件\n */\nexport function endTimelineEvent(id: string): TimelineEvent | null {\n const stackIndex = timelineEventStack.findIndex((item) => item.event.id === id);\n\n if (stackIndex === -1) {\n console.warn(`[DevTools] Timeline event ${id} not found in stack`);\n return null;\n }\n\n const { event } = timelineEventStack[stackIndex]!;\n const endTime = performance.now();\n\n event.duration = endTime - event.startTime;\n\n for (let i = stackIndex + 1; i < timelineEventStack.length; i++) {\n const nestedEvent = timelineEventStack[i]!;\n event.duration = Math.max(\n event.duration,\n nestedEvent.startTime - event.startTime + nestedEvent.event.duration,\n );\n }\n\n timelineEventStack.splice(stackIndex);\n currentDepth = Math.max(0, currentDepth - 1);\n\n timelineEvents.push(event);\n if (timelineEvents.length > maxTimelineEvents) {\n timelineEvents.shift();\n }\n\n return event;\n}\n\n/**\n * 获取所有时序事件\n */\nexport function getTimelineEvents(): TimelineEvent[] {\n return [...timelineEvents];\n}\n\n/**\n * 获取指定时间范围内的时序事件\n */\nexport function getTimelineEventsInRange(startTime: number, endTime: number): TimelineEvent[] {\n return timelineEvents.filter(\n (event) => event.startTime >= startTime && event.startTime <= endTime,\n );\n}\n\n/**\n * 获取慢操作\n */\nexport function getSlowOperations(limit: number = 10, threshold?: number): TimelineEvent[] {\n const sorted = [...timelineEvents].sort((a, b) => b.duration - a.duration);\n const result = threshold !== undefined ? sorted.filter((e) => e.duration >= threshold) : sorted;\n return result.slice(0, limit);\n}\n\n/**\n * 获取火焰图数据\n */\nexport function getFlameGraphData(): FlameGraphNode {\n const root: FlameGraphNode = {\n name: 'root',\n value: 0,\n children: [],\n category: 'custom',\n };\n\n const nodeMap = new Map<string, FlameGraphNode>();\n nodeMap.set('root', root);\n\n timelineEvents.forEach((event) => {\n const node: FlameGraphNode = {\n name: event.name,\n value: event.duration,\n category: event.category,\n children: [],\n };\n\n const parentNode = event.depth === 0 ? root : findParentNode(root, event.depth);\n\n if (parentNode) {\n if (!parentNode.children) {\n parentNode.children = [];\n }\n parentNode.children.push(node);\n }\n\n nodeMap.set(event.id, node);\n });\n\n aggregateFlameGraphValues(root);\n\n return root;\n}\n\nfunction findParentNode(node: FlameGraphNode, depth: number): FlameGraphNode | null {\n if (!node.children || node.children.length === 0) {\n return depth === 1 ? node : null;\n }\n\n let targetDepth = depth - 1;\n let currentNode: FlameGraphNode | null = node;\n\n while (targetDepth > 0 && currentNode) {\n const children: FlameGraphNode[] = currentNode.children || [];\n if (children.length === 0) {\n return currentNode;\n }\n const lastChild: FlameGraphNode = children[children.length - 1]!;\n currentNode = lastChild;\n targetDepth--;\n }\n\n return currentNode;\n}\n\nfunction aggregateFlameGraphValues(node: FlameGraphNode): number {\n if (!node.children || node.children.length === 0) {\n return node.value;\n }\n\n let totalValue = node.value;\n node.children.forEach((child) => {\n totalValue += aggregateFlameGraphValues(child);\n });\n\n node.value = totalValue;\n return totalValue;\n}\n\n/**\n * 清除时序事件\n */\nexport function clearTimelineEvents(): void {\n timelineEvents.length = 0;\n timelineEventStack.length = 0;\n currentDepth = 0;\n}\n\n/**\n * 导出时序事件为 JSON\n */\nexport function exportTimelineAsJSON(): string {\n return JSON.stringify(\n {\n events: timelineEvents,\n exportedAt: Date.now(),\n },\n null,\n 2,\n );\n}\n\n/**\n * 序列化为可读文本\n */\nexport function serializeTimelineEvents(): string {\n if (timelineEvents.length === 0) {\n return '暂无时序事件数据';\n }\n\n let result = `📊 时序事件 (${timelineEvents.length} 个)\\n\\n`;\n\n timelineEvents.slice(-20).forEach((event) => {\n const indent = ' '.repeat(event.depth);\n const duration = event.duration.toFixed(2);\n result += `${indent}├─ ${event.name} [${event.category}] ${duration}ms\\n`;\n });\n\n return result;\n}\n","/**\n * @lytjs/devtools - 大规模性能压测基准测试\n *\n * 提供虚拟列表、组件渲染等大规模场景的性能基准测试\n */\n\n/** 基准测试结果 */\nexport interface BenchmarkResult {\n name: string;\n iterations: number;\n totalDuration: number;\n averageDuration: number;\n minDuration: number;\n maxDuration: number;\n opsPerSecond: number;\n timestamp: number;\n}\n\n/** 基准测试配置 */\nexport interface BenchmarkConfig {\n /** 测试名称 */\n name: string;\n /** 迭代次数 */\n iterations: number;\n /** 预热次数 */\n warmup?: number;\n /** 异步测试回调 */\n fn: () => void | Promise<void>;\n /** 异步回调 */\n asyncFn?: () => Promise<void>;\n}\n\n/** 大规模场景配置 */\nexport interface LargeScaleScenario {\n name: string;\n nodeCount: number;\n description: string;\n}\n\n/** 预定义的大规模场景 */\nexport const LARGE_SCALE_SCENARIOS: LargeScaleScenario[] = [\n { name: '虚拟列表-1000节点', nodeCount: 1000, description: '1000 个虚拟列表节点渲染' },\n { name: '虚拟列表-5000节点', nodeCount: 5000, description: '5000 个虚拟列表节点渲染' },\n { name: '虚拟列表-10000节点', nodeCount: 10000, description: '10000 个虚拟列表节点渲染' },\n { name: '组件树-100组件', nodeCount: 100, description: '100 个组件同时渲染' },\n { name: '组件树-500组件', nodeCount: 500, description: '500 个组件同时渲染' },\n { name: '组件树-1000组件', nodeCount: 1000, description: '1000 个组件同时渲染' },\n { name: '信号追踪-500信号', nodeCount: 500, description: '500 个信号同时追踪' },\n { name: '信号追踪-1000信号', nodeCount: 1000, description: '1000 个信号同时追踪' },\n];\n\n// 基准测试结果存储\nconst benchmarkResults: Map<string, BenchmarkResult[]> = new Map();\n\n/**\n * 运行同步基准测试\n */\nexport function runBenchmark(config: BenchmarkConfig): BenchmarkResult {\n const { name, iterations, warmup = 10, fn } = config;\n\n // 预热\n for (let i = 0; i < warmup; i++) {\n fn();\n }\n\n // 运行测试\n const durations: number[] = [];\n const startTime = performance.now();\n\n for (let i = 0; i < iterations; i++) {\n const iterStart = performance.now();\n fn();\n durations.push(performance.now() - iterStart);\n }\n\n const totalDuration = performance.now() - startTime;\n\n // 计算统计\n const result: BenchmarkResult = {\n name,\n iterations,\n totalDuration,\n averageDuration: durations.reduce((a, b) => a + b, 0) / durations.length,\n minDuration: Math.min(...durations),\n maxDuration: Math.max(...durations),\n opsPerSecond: (iterations / totalDuration) * 1000,\n timestamp: Date.now(),\n };\n\n // 存储结果\n storeBenchmarkResult(name, result);\n\n return result;\n}\n\n/**\n * 运行异步基准测试\n */\nexport async function runAsyncBenchmark(config: BenchmarkConfig): Promise<BenchmarkResult> {\n const { name, iterations, warmup = 10, asyncFn } = config;\n\n if (!asyncFn) {\n throw new Error('asyncFn is required for async benchmark');\n }\n\n // 预热\n for (let i = 0; i < warmup; i++) {\n await asyncFn();\n }\n\n // 运行测试\n const durations: number[] = [];\n const startTime = performance.now();\n\n for (let i = 0; i < iterations; i++) {\n const iterStart = performance.now();\n await asyncFn();\n durations.push(performance.now() - iterStart);\n }\n\n const totalDuration = performance.now() - startTime;\n\n // 计算统计\n const result: BenchmarkResult = {\n name,\n iterations,\n totalDuration,\n averageDuration: durations.reduce((a, b) => a + b, 0) / durations.length,\n minDuration: Math.min(...durations),\n maxDuration: Math.max(...durations),\n opsPerSecond: (iterations / totalDuration) * 1000,\n timestamp: Date.now(),\n };\n\n // 存储结果\n storeBenchmarkResult(name, result);\n\n return result;\n}\n\n/**\n * 存储基准测试结果\n */\nfunction storeBenchmarkResult(name: string, result: BenchmarkResult): void {\n if (!benchmarkResults.has(name)) {\n benchmarkResults.set(name, []);\n }\n const results = benchmarkResults.get(name)!;\n results.push(result);\n\n // 限制存储数量\n if (results.length > 100) {\n results.shift();\n }\n}\n\n/**\n * 获取基准测试结果\n */\nexport function getBenchmarkResults(name?: string): BenchmarkResult[] {\n if (name) {\n return benchmarkResults.get(name) || [];\n }\n const allResults: BenchmarkResult[] = [];\n benchmarkResults.forEach((results) => {\n allResults.push(...results);\n });\n return allResults.sort((a, b) => b.timestamp - a.timestamp);\n}\n\n/**\n * 获取最新基准测试结果\n */\nexport function getLatestBenchmarkResult(name: string): BenchmarkResult | undefined {\n const results = benchmarkResults.get(name);\n if (!results || results.length === 0) return undefined;\n return results[results.length - 1];\n}\n\n/**\n * 清除基准测试结果\n */\nexport function clearBenchmarkResults(name?: string): void {\n if (name) {\n benchmarkResults.delete(name);\n } else {\n benchmarkResults.clear();\n }\n}\n\n/**\n * 序列化基准测试结果\n */\nexport function serializeBenchmarkResult(result: BenchmarkResult): string {\n return `\n📊 ${result.name}\n 迭代次数: ${result.iterations}\n 总耗时: ${result.totalDuration.toFixed(2)}ms\n 平均耗时: ${result.averageDuration.toFixed(4)}ms\n 最小耗时: ${result.minDuration.toFixed(4)}ms\n 最大耗时: ${result.maxDuration.toFixed(4)}ms\n OPS: ${result.opsPerSecond.toFixed(2)} ops/s\n 时间: ${new Date(result.timestamp).toLocaleString()}\n`.trim();\n}\n\n/**\n * 序列化所有基准测试结果\n */\nexport function serializeAllBenchmarkResults(): string {\n const allResults = getBenchmarkResults();\n if (allResults.length === 0) {\n return '暂无基准测试结果';\n }\n\n let result = `📈 基准测试报告 (${allResults.length} 条记录)\\n\\n`;\n\n // 按名称分组\n const grouped = new Map<string, BenchmarkResult[]>();\n allResults.forEach((r) => {\n if (!grouped.has(r.name)) {\n grouped.set(r.name, []);\n }\n grouped.get(r.name)!.push(r);\n });\n\n grouped.forEach((results, name) => {\n const latest = results[results.length - 1];\n if (latest) {\n result += `🔹 ${name}\\n`;\n result += ` 最新: ${latest.averageDuration.toFixed(4)}ms (${latest.opsPerSecond.toFixed(2)} ops/s)\\n`;\n result += ` 历史: ${results.length} 次测试\\n`;\n result += '\\n';\n }\n });\n\n return result;\n}\n\n/**\n * 比较两次基准测试\n */\nexport function compareBenchmarkResults(\n oldResult: BenchmarkResult,\n newResult: BenchmarkResult,\n): {\n durationDiff: number;\n durationDiffPercent: number;\n opsDiff: number;\n opsDiffPercent: number;\n improved: boolean;\n} {\n const durationDiff = oldResult.averageDuration - newResult.averageDuration;\n const durationDiffPercent = (durationDiff / oldResult.averageDuration) * 100;\n const opsDiff = newResult.opsPerSecond - oldResult.opsPerSecond;\n const opsDiffPercent = (opsDiff / oldResult.opsPerSecond) * 100;\n\n return {\n durationDiff,\n durationDiffPercent,\n opsDiff,\n opsDiffPercent,\n improved: durationDiff > 0,\n };\n}\n\n/**\n * 生成大规模测试场景的基准测试\n */\nexport function createLargeScaleBenchmark(\n scenario: LargeScaleScenario,\n testFn: (nodeCount: number) => void | Promise<void>,\n): BenchmarkConfig {\n return {\n name: `大规模测试-${scenario.name}`,\n iterations: 100,\n warmup: 10,\n fn: () => testFn(scenario.nodeCount),\n };\n}\n\n/**\n * 内存使用情况\n */\nexport interface MemoryUsage {\n usedJSHeapSize: number;\n totalJSHeapSize: number;\n jsHeapSizeLimit: number;\n}\n\n/**\n * 获取当前内存使用情况\n */\nexport function getMemoryUsage(): MemoryUsage | null {\n if (typeof performance === 'undefined') return null;\n\n const memory = (\n performance as {\n memory?: { usedJSHeapSize: number; totalJSHeapSize: number; jsHeapSizeLimit: number };\n }\n ).memory;\n if (!memory) return null;\n\n return {\n usedJSHeapSize: memory.usedJSHeapSize,\n totalJSHeapSize: memory.totalJSHeapSize,\n jsHeapSizeLimit: memory.jsHeapSizeLimit,\n };\n}\n\n/**\n * 序列化内存使用情况\n */\nexport function serializeMemoryUsage(usage: MemoryUsage): string {\n const formatBytes = (bytes: number) => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n };\n\n return `\n💾 内存使用\n 已使用堆: ${formatBytes(usage.usedJSHeapSize)}\n 总堆大小: ${formatBytes(usage.totalJSHeapSize)}\n 堆大小限制: ${formatBytes(usage.jsHeapSizeLimit)}\n 使用率: ${((usage.usedJSHeapSize / usage.totalJSHeapSize) * 100).toFixed(2)}%\n`.trim();\n}\n\n/**\n * 创建性能回归检测\n */\nexport function createRegressionDetector(threshold: number = 0.1) {\n const history: Map<string, BenchmarkResult[]> = new Map();\n\n return {\n addResult(result: BenchmarkResult): boolean {\n if (!history.has(result.name)) {\n history.set(result.name, []);\n }\n const results = history.get(result.name)!;\n results.push(result);\n\n if (results.length < 2) return false;\n\n const previous = results[results.length - 2];\n if (!previous) return false;\n\n const regression =\n previous.averageDuration < result.averageDuration &&\n (result.averageDuration - previous.averageDuration) / previous.averageDuration > threshold;\n\n return regression;\n },\n\n getHistory(name: string): BenchmarkResult[] {\n return history.get(name) || [];\n },\n\n clear(): void {\n history.clear();\n },\n };\n}\n","/**\n * @lytjs/devtools - 开发者工具主入口\n */\n\nimport type { DevToolsOptions, DevToolsAPI, SignalNode } from './types';\nimport {\n getComponentTree,\n serializeComponentTree,\n registerRootComponent,\n unregisterRootComponent,\n} from './componentTree';\nimport {\n getStoreStates,\n getStoreState,\n setStoreState,\n dispatchStoreAction,\n serializeStoreStates,\n registerStore,\n unregisterStore,\n getRegisteredStoreIds,\n clearStoreRegistry,\n subscribeStore,\n unsubscribeStore,\n onStoreChange,\n} from './storeInspector';\nimport {\n getCurrentRoute,\n navigateTo,\n navigateToName,\n goBack,\n serializeRouteInfo,\n getRoutes,\n registerRouter,\n unregisterRouter,\n isRouterRegistered,\n watchRouteChanges,\n unwatchRouteChanges,\n getRouteHistory,\n clearRouteHistory,\n} from './routeInspector';\nimport {\n getSignalNodes,\n getSignalNode,\n getDependencyGraph,\n createSnapshot,\n getSnapshots,\n getTimeTravelState,\n restoreSnapshot,\n clearSnapshots,\n getPerformanceStats,\n getPerformanceRecords,\n clearPerformanceRecords,\n serializeSignalNode,\n serializeDependencyGraph,\n serializePerformanceStats,\n registerSignal,\n unregisterSignal,\n recordSignalUpdate,\n recordDependency,\n clearSignalRegistry,\n} from './signalsInspector';\nimport { getVDOMTree, getVDOMStats, serializeVDOMTree } from './vdomInspector';\n\n// DevTools 实例\nlet devtoolsInstance: DevTools | null = null;\n\n/**\n * DevTools 类\n */\nclass DevTools implements DevToolsAPI {\n private options: Required<DevToolsOptions>;\n private isOpen = false;\n\n constructor(options: DevToolsOptions = {}) {\n this.options = {\n enabled: options.enabled ?? true,\n position: options.position ?? 'right',\n size: options.size ?? 300,\n };\n\n if (this.options.enabled) {\n this.init();\n }\n }\n\n /**\n * 初始化 DevTools\n */\n private init(): void {\n if (typeof window === 'undefined') return;\n\n // 创建面板\n this.createPanel();\n\n // 添加键盘快捷键(Ctrl+Shift+D 或 Cmd+Shift+D)\n window.addEventListener('keydown', (e) => {\n if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n this.toggle();\n }\n });\n\n console.warn('[LytJS DevTools] Initialized. Press Ctrl+Shift+D to toggle.');\n }\n\n /**\n * 创建 DevTools 面板\n */\n private createPanel(): void {\n if (typeof document === 'undefined') return;\n\n // 检查是否已存在\n if (document.getElementById('lytjs-devtools')) return;\n\n const panel = document.createElement('div');\n panel.id = 'lytjs-devtools';\n panel.style.cssText = `\n position: fixed;\n top: 0;\n ${this.options.position}: -${this.options.size}px;\n width: ${this.options.size}px;\n height: 100vh;\n background: #1e1e1e;\n color: #d4d4d4;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 12px;\n z-index: 999999;\n transition: ${this.options.position} 0.3s ease;\n display: flex;\n flex-direction: column;\n box-shadow: 2px 0 8px rgba(0,0,0,0.3);\n `;\n\n // 头部\n const header = document.createElement('div');\n header.style.cssText = `\n padding: 10px 15px;\n background: #2d2d2d;\n border-bottom: 1px solid #3d3d3d;\n display: flex;\n justify-content: space-between;\n align-items: center;\n `;\n header.innerHTML = `\n <span style=\"font-weight: bold; color: #4fc08d;\">🛠️ LytJS DevTools</span>\n <button id=\"lytjs-devtools-close\" style=\"\n background: transparent;\n border: none;\n color: #d4d4d4;\n cursor: pointer;\n font-size: 16px;\n \">✕</button>\n `;\n\n // 标签页\n const tabs = document.createElement('div');\n tabs.style.cssText = `\n display: flex;\n background: #252526;\n border-bottom: 1px solid #3d3d3d;\n `;\n tabs.innerHTML = `\n <button class=\"lytjs-devtools-tab active\" data-tab=\"components\" style=\"\n flex: 1;\n padding: 10px;\n background: #1e1e1e;\n border: none;\n color: #d4d4d4;\n cursor: pointer;\n border-bottom: 2px solid #4fc08d;\n \">Components</button>\n <button class=\"lytjs-devtools-tab\" data-tab=\"store\" style=\"\n flex: 1;\n padding: 10px;\n background: transparent;\n border: none;\n color: #d4d4d4;\n cursor: pointer;\n border-bottom: 2px solid transparent;\n \">Store</button>\n <button class=\"lytjs-devtools-tab\" data-tab=\"router\" style=\"\n flex: 1;\n padding: 10px;\n background: transparent;\n border: none;\n color: #d4d4d4;\n cursor: pointer;\n border-bottom: 2px solid transparent;\n \">Router</button>\n <button class=\"lytjs-devtools-tab\" data-tab=\"signals\" style=\"\n flex: 1;\n padding: 10px;\n background: transparent;\n border: none;\n color: #d4d4d4;\n cursor: pointer;\n border-bottom: 2px solid transparent;\n \">Signals</button>\n <button class=\"lytjs-devtools-tab\" data-tab=\"vdom\" style=\"\n flex: 1;\n padding: 10px;\n background: transparent;\n border: none;\n color: #d4d4d4;\n cursor: pointer;\n border-bottom: 2px solid transparent;\n \">VDOM</button>\n <button class=\"lytjs-devtools-tab\" data-tab=\"performance\" style=\"\n flex: 1;\n padding: 10px;\n background: transparent;\n border: none;\n color: #d4d4d4;\n cursor: pointer;\n border-bottom: 2px solid transparent;\n \">Performance</button>\n `;\n\n // 内容区域\n const content = document.createElement('div');\n content.id = 'lytjs-devtools-content';\n content.style.cssText = `\n flex: 1;\n overflow: auto;\n padding: 15px;\n `;\n\n panel.appendChild(header);\n panel.appendChild(tabs);\n panel.appendChild(content);\n document.body.appendChild(panel);\n\n // 绑定事件\n document.getElementById('lytjs-devtools-close')?.addEventListener('click', () => this.close());\n\n tabs.querySelectorAll('.lytjs-devtools-tab').forEach((tab) => {\n tab.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const tabName = target.dataset.tab;\n\n tabs.querySelectorAll('.lytjs-devtools-tab').forEach((t) => {\n (t as HTMLElement).style.background = 'transparent';\n (t as HTMLElement).style.borderBottomColor = 'transparent';\n });\n target.style.background = '#1e1e1e';\n target.style.borderBottomColor = '#4fc08d';\n\n this.renderTab(tabName || 'components');\n });\n });\n\n this.renderTab('components');\n }\n\n /**\n * 渲染标签页内容\n */\n private renderTab(tab: string): void {\n const content = document.getElementById('lytjs-devtools-content');\n if (!content) return;\n\n switch (tab) {\n case 'components':\n content.innerHTML = this.renderComponentsTab();\n break;\n case 'store':\n content.innerHTML = this.renderStoreTab();\n break;\n case 'router':\n content.innerHTML = this.renderRouterTab();\n break;\n case 'signals':\n content.innerHTML = this.renderSignalsTab();\n break;\n case 'vdom':\n content.innerHTML = this.renderVDOMTab();\n break;\n case 'performance':\n content.innerHTML = this.renderPerformanceTab();\n break;\n }\n }\n\n /**\n * 渲染组件标签页\n */\n private renderComponentsTab(): string {\n const tree = getComponentTree();\n if (tree.length === 0) {\n return '<div style=\"color: #666; text-align: center; padding: 40px;\">No components found.<br>Register your root component with registerRootComponent().</div>';\n }\n return `<pre style=\"margin: 0; white-space: pre-wrap; word-break: break-all;\">${serializeComponentTree(tree)}</pre>`;\n }\n\n /**\n * 渲染 Store 标签页\n */\n private renderStoreTab(): string {\n const states = getStoreStates();\n if (states.length === 0) {\n return '<div style=\"color: #666; text-align: center; padding: 40px;\">No stores registered.<br>Use registerStore() to register your stores.</div>';\n }\n\n let html = '<div style=\"margin-bottom: 10px;\">';\n html += `<strong>Registered Stores:</strong> ${getRegisteredStoreIds().join(', ')}`;\n html += '</div>';\n html += `<pre style=\"margin: 0; white-space: pre-wrap; word-break: break-all;\">${serializeStoreStates(states)}</pre>`;\n return html;\n }\n\n /**\n * 渲染 Signals 标签页\n */\n private renderSignalsTab(): string {\n const nodes = getSignalNodes();\n\n const html = `\n <div style=\"margin-bottom: 15px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;\">\n <strong>📊 Signals (${nodes.length})</strong>\n <div>\n <button id=\"lytjs-devtools-create-snapshot\" style=\"\n background: #4fc08d;\n border: none;\n color: white;\n padding: 5px 10px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n \">创建快照</button>\n <button id=\"lytjs-devtools-clear-signals\" style=\"\n background: #ff4d4f;\n border: none;\n color: white;\n padding: 5px 10px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n margin-left: 5px;\n \">清空</button>\n </div>\n </div>\n \n <div style=\"display: flex; gap: 10px; margin-bottom: 10px;\">\n <button id=\"lytjs-devtools-tab-signals-list\" style=\"\n flex: 1;\n padding: 8px;\n background: #4fc08d;\n border: none;\n color: white;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n \">列表视图</button>\n <button id=\"lytjs-devtools-tab-signals-graph\" style=\"\n flex: 1;\n padding: 8px;\n background: #333;\n border: none;\n color: #d4d4d4;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n \">依赖图</button>\n <button id=\"lytjs-devtools-tab-signals-timetravel\" style=\"\n flex: 1;\n padding: 8px;\n background: #333;\n border: none;\n color: #d4d4d4;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n \">时间旅行</button>\n </div>\n \n <div id=\"lytjs-devtools-signals-content\">\n ${this.renderSignalsList(nodes)}\n </div>\n </div>\n `;\n\n return html;\n }\n\n /**\n * 渲染信号列表\n */\n private renderSignalsList(nodes: SignalNode[]): string {\n if (nodes.length === 0) {\n return '<div style=\"color: #666; text-align: center; padding: 40px;\">暂无信号数据<br>使用 registerSignal() 注册信号</div>';\n }\n\n let html = '<div style=\"max-height: 400px; overflow-y: auto;\">';\n nodes.forEach((node) => {\n const typeIcon = node.type === 'signal' ? '📌' : node.type === 'computed' ? '🧮' : '⚡';\n const typeColor =\n node.type === 'signal' ? '#4fc08d' : node.type === 'computed' ? '#1890ff' : '#faad14';\n\n html += `\n <div style=\"\n background: #252526;\n border-radius: 4px;\n padding: 10px;\n margin-bottom: 8px;\n border-left: 3px solid ${typeColor};\n \">\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\n <span style=\"font-weight: bold;\">${typeIcon} ${node.name}</span>\n <span style=\"color: #888; font-size: 10px;\">${node.type}</span>\n </div>\n <div style=\"color: #888; font-size: 11px; margin-top: 5px;\">\n 更新次数: ${node.updateCount} | \n 最后更新: ${node.lastUpdateTime ? new Date(node.lastUpdateTime).toLocaleTimeString() : 'N/A'}\n </div>\n ${node.averageUpdateTime > 0 ? `<div style=\"color: #888; font-size: 11px;\">平均耗时: ${node.averageUpdateTime.toFixed(2)}ms</div>` : ''}\n <div style=\"color: #888; font-size: 10px; margin-top: 5px;\">\n 依赖: ${node.dependencies.length > 0 ? node.dependencies.join(', ') : '无'} |\n 被依赖: ${node.dependents.length > 0 ? node.dependents.join(', ') : '无'}\n </div>\n </div>\n `;\n });\n html += '</div>';\n\n return html;\n }\n\n /**\n * 渲染 VDOM 标签页\n */\n private renderVDOMTab(): string {\n const roots = getVDOMTree();\n const stats = getVDOMStats();\n\n if (roots.length === 0) {\n return `\n <div style=\"color: #666; text-align: center; padding: 40px;\">\n <div style=\"font-size: 48px; margin-bottom: 15px;\">🌳</div>\n <div>No VDOM roots registered.</div>\n <div style=\"font-size: 11px; margin-top: 10px; color: #555;\">\n Use registerVDOMRoot() to register your VDOM roots.\n </div>\n </div>\n `;\n }\n\n const html = `\n <div style=\"margin-bottom: 15px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;\">\n <strong>🌳 VDOM Tree</strong>\n <button id=\"lytjs-devtools-clear-vdom\" style=\"\n background: #ff4d4f;\n border: none;\n color: white;\n padding: 5px 10px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n \">清空</button>\n </div>\n \n <div style=\"background: #252526; border-radius: 4px; padding: 15px; margin-bottom: 15px;\">\n <div style=\"display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; text-align: center;\">\n <div>\n <div style=\"color: #888; font-size: 11px;\">总节点数</div>\n <div style=\"font-size: 20px; font-weight: bold; color: #4fc08d;\">${stats.totalNodes}</div>\n </div>\n <div>\n <div style=\"color: #888; font-size: 11px;\">组件数</div>\n <div style=\"font-size: 20px; font-weight: bold; color: #1890ff;\">${stats.componentCount}</div>\n </div>\n <div>\n <div style=\"color: #888; font-size: 11px;\">元素数</div>\n <div style=\"font-size: 20px; font-weight: bold; color: #faad14;\">${stats.elementCount}</div>\n </div>\n </div>\n <div style=\"display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; text-align: center; margin-top: 10px;\">\n <div>\n <div style=\"color: #888; font-size: 11px;\">文本节点</div>\n <div style=\"font-size: 16px; font-weight: bold; color: #888;\">${stats.textCount}</div>\n </div>\n <div>\n <div style=\"color: #888; font-size: 11px;\">根节点</div>\n <div style=\"font-size: 16px; font-weight: bold; color: #888;\">${stats.rootCount}</div>\n </div>\n <div>\n <div style=\"color: #888; font-size: 11px;\">最大深度</div>\n <div style=\"font-size: 16px; font-weight: bold; color: #888;\">${stats.maxDepth}</div>\n </div>\n </div>\n </div>\n \n <div style=\"margin-bottom: 10px;\">\n <input id=\"lytjs-devtools-vdom-search\" type=\"text\" placeholder=\"搜索标签名...\" style=\"\n width: 100%;\n padding: 8px;\n background: #252526;\n border: 1px solid #3d3d3d;\n border-radius: 4px;\n color: #d4d4d4;\n font-size: 12px;\n \" />\n </div>\n \n <div id=\"lytjs-devtools-vdom-tree\" style=\"\n background: #252526;\n border-radius: 4px;\n padding: 15px;\n max-height: 400px;\n overflow: auto;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.6;\n \">\n <pre style=\"margin: 0; white-space: pre-wrap; word-break: break-all;\">${serializeVDOMTree()}</pre>\n </div>\n </div>\n `;\n\n return html;\n }\n\n /**\n * 渲染 Performance 标签页\n */\n private renderPerformanceTab(): string {\n const stats = getPerformanceStats();\n const records = getPerformanceRecords(50);\n\n let html = `\n <div style=\"margin-bottom: 15px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;\">\n <strong>⚡ Performance</strong>\n <button id=\"lytjs-devtools-clear-performance\" style=\"\n background: #ff4d4f;\n border: none;\n color: white;\n padding: 5px 10px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 11px;\n \">清空记录</button>\n </div>\n \n <div style=\"background: #252526; border-radius: 4px; padding: 15px; margin-bottom: 15px;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 10px;\">\n <div style=\"text-align: center;\">\n <div style=\"color: #888; font-size: 11px;\">总记录数</div>\n <div style=\"font-size: 24px; font-weight: bold; color: #4fc08d;\">${stats.totalRecords}</div>\n </div>\n <div style=\"text-align: center;\">\n <div style=\"color: #888; font-size: 11px;\">平均耗时</div>\n <div style=\"font-size: 24px; font-weight: bold; color: #1890ff;\">${stats.averageDuration.toFixed(2)}ms</div>\n </div>\n <div style=\"text-align: center;\">\n <div style=\"color: #888; font-size: 11px;\">最大耗时</div>\n <div style=\"font-size: 24px; font-weight: bold; color: #ff4d4f;\">${stats.maxDuration.toFixed(2)}ms</div>\n </div>\n <div style=\"text-align: center;\">\n <div style=\"color: #888; font-size: 11px;\">最小耗时</div>\n <div style=\"font-size: 24px; font-weight: bold; color: #52c41a;\">${stats.minDuration.toFixed(2)}ms</div>\n </div>\n </div>\n </div>\n `;\n\n if (Object.keys(stats.byType).length > 0) {\n html += `\n <div style=\"margin-bottom: 15px;\">\n <strong style=\"display: block; margin-bottom: 10px;\">按类型统计</strong>\n <div style=\"background: #252526; border-radius: 4px; padding: 10px;\">\n `;\n\n Object.entries(stats.byType).forEach(([type, data]) => {\n const typeColor =\n type === 'signal' ? '#4fc08d' : type === 'computed' ? '#1890ff' : '#faad14';\n html += `\n <div style=\"display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #333;\">\n <span style=\"color: ${typeColor};\">${type}</span>\n <span>${data.count} 次 | 平均 ${data.average.toFixed(2)}ms | 最大 ${data.max.toFixed(2)}ms</span>\n </div>\n `;\n });\n\n html += '</div></div>';\n }\n\n if (records.length > 0) {\n html += `\n <div>\n <strong style=\"display: block; margin-bottom: 10px;\">最近记录 (50条)</strong>\n <div style=\"background: #252526; border-radius: 4px; padding: 10px; max-height: 300px; overflow-y: auto;\">\n `;\n\n records\n .slice()\n .reverse()\n .forEach((record) => {\n const durationColor =\n record.duration > 16 ? '#ff4d4f' : record.duration > 8 ? '#faad14' : '#4fc08d';\n html += `\n <div style=\"display: flex; justify-content: space-between; padding: 6px 0; border-bottom: 1px solid #333; font-size: 11px;\">\n <span>${record.name}</span>\n <span style=\"color: ${durationColor};\">${record.duration.toFixed(2)}ms</span>\n <span style=\"color: #888;\">${new Date(record.timestamp).toLocaleTimeString()}</span>\n </div>\n `;\n });\n\n html += '</div></div>';\n } else {\n html += '<div style=\"color: #666; text-align: center; padding: 40px;\">暂无性能数据</div>';\n }\n\n html += '</div>';\n\n return html;\n }\n\n /**\n * 渲染 Router 标签页\n */\n private renderRouterTab(): string {\n if (!isRouterRegistered()) {\n return '<div style=\"color: #666; text-align: center; padding: 40px;\">Router not registered.<br>Use registerRouter() to register your router.</div>';\n }\n\n const route = getCurrentRoute();\n const routes = getRoutes();\n\n let html = '<div style=\"margin-bottom: 15px;\">';\n html += '<strong>Current Route:</strong>';\n html += '</div>';\n html += `<pre style=\"margin: 0 0 15px 0; white-space: pre-wrap; word-break: break-all; background: #252526; padding: 10px; border-radius: 4px;\">${serializeRouteInfo(route)}</pre>`;\n\n if (routes.length > 0) {\n html += '<div style=\"margin-bottom: 10px;\">';\n html += '<strong>All Routes:</strong>';\n html += '</div>';\n html += '<ul style=\"margin: 0; padding-left: 20px;\">';\n for (const r of routes) {\n html += `<li>${r.path}${r.name ? ` (${r.name})` : ''}</li>`;\n }\n html += '</ul>';\n }\n\n return html;\n }\n\n /**\n * 打开面板\n */\n open(): void {\n if (!this.options.enabled) return;\n\n const panel = document.getElementById('lytjs-devtools');\n if (panel) {\n panel.style[this.options.position] = '0';\n this.isOpen = true;\n this.refresh();\n }\n }\n\n /**\n * 关闭面板\n */\n close(): void {\n if (typeof document === 'undefined') return;\n const panel = document.getElementById('lytjs-devtools');\n if (panel) {\n panel.style[this.options.position] = `-${this.options.size}px`;\n this.isOpen = false;\n }\n }\n\n /**\n * 切换面板\n */\n toggle(): void {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * 刷新内容\n */\n refresh(): void {\n const activeTab = document.querySelector('.lytjs-devtools-tab.active') as HTMLElement;\n if (activeTab) {\n this.renderTab(activeTab.dataset.tab || 'components');\n }\n }\n\n // API 方法\n getComponentTree = getComponentTree;\n getStoreStates = getStoreStates;\n getCurrentRoute = getCurrentRoute;\n}\n\n/**\n * 安装 DevTools\n */\nexport function installDevTools(options?: DevToolsOptions): DevToolsAPI {\n if (!devtoolsInstance) {\n devtoolsInstance = new DevTools(options);\n }\n return devtoolsInstance;\n}\n\n/**\n * 获取 DevTools 实例\n */\nexport function getDevTools(): DevToolsAPI | null {\n return devtoolsInstance;\n}\n\n/**\n * 卸载 DevTools\n */\nexport function uninstallDevTools(): void {\n if (devtoolsInstance) {\n devtoolsInstance.close();\n devtoolsInstance = null;\n }\n\n if (typeof document !== 'undefined') {\n const panel = document.getElementById('lytjs-devtools');\n if (panel) {\n panel.remove();\n }\n }\n}\n\n// 重新导出所有功能\nexport {\n // 组件树\n getComponentTree,\n serializeComponentTree,\n registerRootComponent,\n unregisterRootComponent,\n\n // Store 检查器\n getStoreStates,\n getStoreState,\n setStoreState,\n dispatchStoreAction,\n serializeStoreStates,\n registerStore,\n unregisterStore,\n getRegisteredStoreIds,\n clearStoreRegistry,\n subscribeStore,\n unsubscribeStore,\n onStoreChange,\n\n // 路由检查器\n getCurrentRoute,\n navigateTo,\n navigateToName,\n goBack,\n serializeRouteInfo,\n getRoutes,\n registerRouter,\n unregisterRouter,\n isRouterRegistered,\n watchRouteChanges,\n unwatchRouteChanges,\n getRouteHistory,\n clearRouteHistory,\n\n // 信号检查器\n getSignalNodes,\n getSignalNode,\n getDependencyGraph,\n createSnapshot,\n getSnapshots,\n getTimeTravelState,\n restoreSnapshot,\n clearSnapshots,\n getPerformanceStats,\n getPerformanceRecords,\n clearPerformanceRecords,\n serializeSignalNode,\n serializeDependencyGraph,\n serializePerformanceStats,\n registerSignal,\n unregisterSignal,\n recordSignalUpdate,\n recordDependency,\n clearSignalRegistry,\n};\n\n// 性能监控\nexport {\n initPerformanceMonitor,\n recordMetric,\n getMetrics,\n getStats,\n registerAlertRule,\n unregisterAlertRule,\n setAlertRuleEnabled,\n getAlertRules,\n getAlerts,\n acknowledgeAlert,\n acknowledgeAllAlerts,\n clearAlerts,\n addObserver,\n removeObserver,\n clearMetrics,\n resetPerformanceMonitor,\n getPerformanceReport,\n serializePerformanceReport,\n startTimer,\n} from './performance';\n\nexport type {\n MetricType,\n PerformanceMetric,\n AlertLevel,\n AlertRule,\n Alert,\n PerformanceStats,\n MonitorOptions,\n} from './performance';\n\n// 基准测试\nexport {\n runBenchmark,\n runAsyncBenchmark,\n getBenchmarkResults,\n getLatestBenchmarkResult,\n clearBenchmarkResults,\n serializeBenchmarkResult,\n serializeAllBenchmarkResults,\n compareBenchmarkResults,\n createLargeScaleBenchmark,\n getMemoryUsage,\n serializeMemoryUsage,\n createRegressionDetector,\n LARGE_SCALE_SCENARIOS,\n} from './benchmark';\n\nexport type {\n BenchmarkResult,\n BenchmarkConfig,\n LargeScaleScenario,\n MemoryUsage,\n} from './benchmark';\n\nexport type { DevToolsOptions, DevToolsAPI };\n"]}