@lytjs/common-performance 6.4.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/index.ts"],"names":["warn"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * @lytjs/common-performance\r\n * Performance monitoring API for component render timing\r\n * FIX: P2-11 RUNTIME-NEW-02 - 性能监控 API\r\n */\r\n\r\ndeclare const __DEV__: boolean;\r\n\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ==================== Types ====================\r\n\r\n/**\r\n * Performance entry for a single render operation\r\n */\r\nexport interface RenderPerformanceEntry {\r\n /** Component name or identifier */\r\n componentName: string;\r\n\r\n /** Type of operation */\r\n operation: 'mount' | 'patch' | 'unmount';\r\n\r\n /** Start time (high resolution timestamp) */\r\n startTime: number;\r\n\r\n /** End time (high resolution timestamp) */\r\n endTime: number;\r\n\r\n /** Duration in milliseconds */\r\n duration: number;\r\n\r\n /** Additional metadata */\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Component performance statistics\r\n */\r\nexport interface ComponentPerformanceStats {\r\n /** Component name */\r\n componentName: string;\r\n\r\n /** Number of mount operations */\r\n mountCount: number;\r\n\r\n /** Number of patch (update) operations */\r\n patchCount: number;\r\n\r\n /** Number of unmount operations */\r\n unmountCount: number;\r\n\r\n /** Total time spent in mount operations (ms) */\r\n totalMountTime: number;\r\n\r\n /** Total time spent in patch operations (ms) */\r\n totalPatchTime: number;\r\n\r\n /** Total time spent in unmount operations (ms) */\r\n totalUnmountTime: number;\r\n\r\n /** Average mount time (ms) */\r\n averageMountTime: number;\r\n\r\n /** Average patch time (ms) */\r\n averagePatchTime: number;\r\n\r\n /** Average unmount time (ms) */\r\n averageUnmountTime: number;\r\n\r\n /** Maximum mount time (ms) */\r\n maxMountTime: number;\r\n\r\n /** Maximum patch time (ms) */\r\n maxPatchTime: number;\r\n\r\n /** Maximum unmount time (ms) */\r\n maxUnmountTime: number;\r\n\r\n /** Last render timestamp */\r\n lastRenderTime: number;\r\n}\r\n\r\n/**\r\n * Performance monitor options\r\n */\r\nexport interface PerformanceMonitorOptions {\r\n /** Maximum number of entries to keep in history */\r\n maxHistorySize?: number;\r\n\r\n /** Whether to enable monitoring by default */\r\n enabled?: boolean;\r\n\r\n /** Callback when a new entry is recorded */\r\n onEntry?: (entry: RenderPerformanceEntry) => void;\r\n\r\n /** Callback when stats are updated */\r\n onStatsUpdate?: (stats: ComponentPerformanceStats) => void;\r\n}\r\n\r\n// ==================== Performance Monitor Class ====================\r\n\r\n/**\r\n * PerformanceMonitor - Tracks component render performance\r\n *\r\n * @example\r\n * ```ts\r\n * const monitor = new PerformanceMonitor({ maxHistorySize: 100 });\r\n *\r\n * // Start timing a render\r\n * const endTiming = monitor.startTiming('MyComponent', 'patch');\r\n *\r\n * // ... perform render ...\r\n *\r\n * // End timing\r\n * endTiming();\r\n *\r\n * // Get stats\r\n * const stats = monitor.getStats('MyComponent');\r\n * console.log(`Average render time: ${stats?.averagePatchTime}ms`);\r\n * ```\r\n */\r\nexport class PerformanceMonitor {\r\n // FIX: P2-v11-17 使用环形缓冲区替代数组 + shift(),\r\n // 避免 history.shift() 的 O(n) 时间复杂度\r\n private historyBuffer: (RenderPerformanceEntry | null)[] = [];\r\n private historyHead = 0;\r\n private historyCount = 0;\r\n private stats: Map<string, ComponentPerformanceStats> = new Map();\r\n private options: Required<PerformanceMonitorOptions>;\r\n private _enabled: boolean;\r\n\r\n constructor(options: PerformanceMonitorOptions = {}) {\r\n this.options = {\r\n maxHistorySize: options.maxHistorySize ?? 1000,\r\n enabled: options.enabled ?? true,\r\n onEntry: options.onEntry ?? (() => {}),\r\n onStatsUpdate: options.onStatsUpdate ?? (() => {}),\r\n };\r\n this._enabled = this.options.enabled;\r\n }\r\n\r\n /**\r\n * Check if monitoring is enabled\r\n */\r\n get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * Enable or disable monitoring\r\n */\r\n set enabled(value: boolean) {\r\n this._enabled = value;\r\n }\r\n\r\n /**\r\n * Start timing a render operation.\r\n * Returns a function that should be called when the operation completes.\r\n *\r\n * @param componentName - Name of the component being rendered\r\n * @param operation - Type of operation (mount, patch, unmount)\r\n * @param metadata - Optional metadata to attach to the entry\r\n * @returns A function to end the timing\r\n *\r\n * @example\r\n * ```ts\r\n * const endTiming = monitor.startTiming('MyComponent', 'patch');\r\n * // ... render logic ...\r\n * endTiming({ propsChanged: true });\r\n * ```\r\n */\r\n startTiming(\r\n componentName: string,\r\n operation: 'mount' | 'patch' | 'unmount',\r\n metadata?: Record<string, unknown>,\r\n ): (endMetadata?: Record<string, unknown>) => RenderPerformanceEntry | null {\r\n if (!this._enabled) {\r\n return () => null;\r\n }\r\n\r\n // FIX: P2-v11-16 添加 performance.now() 回退,\r\n // 在非浏览器环境(如 SSR、Node.js)中使用 Date.now() 替代\r\n const getTimestamp = (): number => {\r\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\r\n return performance.now();\r\n }\r\n return Date.now();\r\n };\r\n\r\n const startTime = getTimestamp();\r\n\r\n return (endMetadata?: Record<string, unknown>) => {\r\n const endTime = getTimestamp();\r\n const duration = endTime - startTime;\r\n\r\n const entry: RenderPerformanceEntry = {\r\n componentName,\r\n operation,\r\n startTime,\r\n endTime,\r\n duration,\r\n metadata: { ...metadata, ...endMetadata },\r\n };\r\n\r\n this.recordEntry(entry);\r\n return entry;\r\n };\r\n }\r\n\r\n /**\r\n * Record a performance entry directly\r\n */\r\n recordEntry(entry: RenderPerformanceEntry): void {\r\n if (!this._enabled) return;\r\n\r\n // FIX: P2-v11-17 使用环形缓冲区写入,O(1) 操作\r\n if (this.historyBuffer.length < this.options.maxHistorySize) {\r\n this.historyBuffer.push(entry);\r\n this.historyCount++;\r\n } else {\r\n this.historyBuffer[this.historyHead] = entry;\r\n this.historyHead = (this.historyHead + 1) % this.options.maxHistorySize;\r\n // historyCount 保持为 maxHistorySize\r\n }\r\n\r\n // Update stats\r\n this.updateStats(entry);\r\n\r\n // Notify callback\r\n this.options.onEntry(entry);\r\n }\r\n\r\n /**\r\n * Update statistics for a component\r\n */\r\n private updateStats(entry: RenderPerformanceEntry): void {\r\n const { componentName, operation, duration } = entry;\r\n\r\n let stats = this.stats.get(componentName);\r\n if (!stats) {\r\n stats = {\r\n componentName,\r\n mountCount: 0,\r\n patchCount: 0,\r\n unmountCount: 0,\r\n totalMountTime: 0,\r\n totalPatchTime: 0,\r\n totalUnmountTime: 0,\r\n averageMountTime: 0,\r\n averagePatchTime: 0,\r\n averageUnmountTime: 0,\r\n maxMountTime: 0,\r\n maxPatchTime: 0,\r\n maxUnmountTime: 0,\r\n lastRenderTime: Date.now(),\r\n };\r\n this.stats.set(componentName, stats);\r\n }\r\n\r\n // Update counters and times\r\n switch (operation) {\r\n case 'mount':\r\n stats.mountCount++;\r\n stats.totalMountTime += duration;\r\n stats.averageMountTime = stats.totalMountTime / stats.mountCount;\r\n stats.maxMountTime = Math.max(stats.maxMountTime, duration);\r\n break;\r\n case 'patch':\r\n stats.patchCount++;\r\n stats.totalPatchTime += duration;\r\n stats.averagePatchTime = stats.totalPatchTime / stats.patchCount;\r\n stats.maxPatchTime = Math.max(stats.maxPatchTime, duration);\r\n break;\r\n case 'unmount':\r\n stats.unmountCount++;\r\n stats.totalUnmountTime += duration;\r\n stats.averageUnmountTime = stats.totalUnmountTime / stats.unmountCount;\r\n stats.maxUnmountTime = Math.max(stats.maxUnmountTime, duration);\r\n break;\r\n }\r\n\r\n stats.lastRenderTime = Date.now();\r\n this.options.onStatsUpdate(stats);\r\n }\r\n\r\n /**\r\n * Get performance statistics for a specific component\r\n */\r\n getStats(componentName: string): ComponentPerformanceStats | undefined {\r\n return this.stats.get(componentName);\r\n }\r\n\r\n /**\r\n * Get all component statistics\r\n */\r\n getAllStats(): ComponentPerformanceStats[] {\r\n return Array.from(this.stats.values());\r\n }\r\n\r\n /**\r\n * Get performance history\r\n * FIX: P2-v11-17 从环形缓冲区读取历史记录\r\n */\r\n getHistory(): RenderPerformanceEntry[] {\r\n const result: RenderPerformanceEntry[] = [];\r\n for (let i = 0; i < this.historyCount; i++) {\r\n const idx = (this.historyHead + i) % this.historyBuffer.length;\r\n const entry = this.historyBuffer[idx];\r\n if (entry) result.push(entry);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Get history for a specific component\r\n */\r\n getComponentHistory(componentName: string): RenderPerformanceEntry[] {\r\n return this.getHistory().filter((entry) => entry.componentName === componentName);\r\n }\r\n\r\n /**\r\n * Get history for a specific operation type\r\n */\r\n getOperationHistory(operation: 'mount' | 'patch' | 'unmount'): RenderPerformanceEntry[] {\r\n return this.getHistory().filter((entry) => entry.operation === operation);\r\n }\r\n\r\n /**\r\n * Get the slowest renders\r\n */\r\n getSlowestRenders(limit: number = 10): RenderPerformanceEntry[] {\r\n return this.getHistory()\r\n .sort((a, b) => b.duration - a.duration)\r\n .slice(0, limit);\r\n }\r\n\r\n /**\r\n * Get average render time across all components\r\n */\r\n getGlobalAverageRenderTime(): number {\r\n const history = this.getHistory();\r\n if (history.length === 0) return 0;\r\n const total = history.reduce((sum, entry) => sum + entry.duration, 0);\r\n return total / history.length;\r\n }\r\n\r\n /**\r\n * Get total render time across all components\r\n */\r\n getGlobalTotalRenderTime(): number {\r\n return this.getHistory().reduce((sum, entry) => sum + entry.duration, 0);\r\n }\r\n\r\n /**\r\n * Clear all history and stats\r\n * FIX: P2 统一 clear/clearComponent 策略:使用 fill(null) 预分配固定大小缓冲区,\r\n * 与 clearComponent 保持一致的环形缓冲区重建方式,避免 clear 后缓冲区大小丢失\r\n */\r\n clear(): void {\r\n this.historyBuffer = new Array(this.options.maxHistorySize).fill(null);\r\n this.historyHead = 0;\r\n this.historyCount = 0;\r\n this.stats.clear();\r\n }\r\n\r\n /**\r\n * Clear history and stats for a specific component\r\n */\r\n clearComponent(componentName: string): boolean {\r\n // FIX: P2-batch2-12 修复 clearComponent 破坏环形缓冲区的问题。\r\n // 原实现直接将过滤后的数组赋值给 historyBuffer 并重置 head/tail,\r\n // 但丢失了环形缓冲区的固定大小约束。正确做法是重建固定大小的缓冲区。\r\n const filtered = this.getHistory().filter((entry) => entry.componentName !== componentName);\r\n // 重建固定大小的环形缓冲区\r\n this.historyBuffer = new Array(this.options.maxHistorySize).fill(null);\r\n this.historyHead = 0;\r\n this.historyCount = filtered.length;\r\n for (let i = 0; i < filtered.length; i++) {\r\n // FIX: DTS build error - 类型匹配\r\n this.historyBuffer[i] = filtered[i] as RenderPerformanceEntry | null;\r\n }\r\n return this.stats.delete(componentName);\r\n }\r\n\r\n /**\r\n * Generate a performance report\r\n */\r\n generateReport(): PerformanceReport {\r\n const allStats = this.getAllStats();\r\n const history = this.getHistory();\r\n const totalRenders = history.length;\r\n const totalRenderTime = this.getGlobalTotalRenderTime();\r\n const averageRenderTime = this.getGlobalAverageRenderTime();\r\n\r\n // Find slowest component\r\n const slowestComponent = allStats.length > 0\r\n ? allStats.reduce((slowest, current) => {\r\n const currentAvg = current.averagePatchTime || current.averageMountTime;\r\n const slowestAvg = slowest.averagePatchTime || slowest.averageMountTime;\r\n return currentAvg > slowestAvg ? current : slowest;\r\n })\r\n : null;\r\n\r\n // Find most rendered component\r\n const mostRenderedComponent = allStats.length > 0\r\n ? allStats.reduce((most, current) =>\r\n current.patchCount > most.patchCount ? current : most\r\n )\r\n : null;\r\n\r\n return {\r\n timestamp: Date.now(),\r\n totalRenders,\r\n totalRenderTime,\r\n averageRenderTime,\r\n componentCount: allStats.length,\r\n slowestComponent: slowestComponent?.componentName ?? null,\r\n mostRenderedComponent: mostRenderedComponent?.componentName ?? null,\r\n componentStats: allStats,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Performance report structure\r\n */\r\nexport interface PerformanceReport {\r\n /** Report generation timestamp */\r\n timestamp: number;\r\n\r\n /** Total number of render operations */\r\n totalRenders: number;\r\n\r\n /** Total time spent rendering (ms) */\r\n totalRenderTime: number;\r\n\r\n /** Average render time (ms) */\r\n averageRenderTime: number;\r\n\r\n /** Number of unique components tracked */\r\n componentCount: number;\r\n\r\n /** Name of the slowest component (by average render time) */\r\n slowestComponent: string | null;\r\n\r\n /** Name of the most rendered component */\r\n mostRenderedComponent: string | null;\r\n\r\n /** Detailed stats for each component */\r\n componentStats: ComponentPerformanceStats[];\r\n}\r\n\r\n// ==================== Global Instance ====================\r\n\r\n/** Global performance monitor instance */\r\nlet globalMonitor: PerformanceMonitor | null = null;\r\n\r\n/**\r\n * Get the global performance monitor instance\r\n * Creates one if it doesn't exist\r\n */\r\nexport function getPerformanceMonitor(): PerformanceMonitor {\r\n if (!globalMonitor) {\r\n globalMonitor = new PerformanceMonitor();\r\n }\r\n return globalMonitor;\r\n}\r\n\r\n/**\r\n * Set the global performance monitor instance\r\n */\r\nexport function setPerformanceMonitor(monitor: PerformanceMonitor): void {\r\n globalMonitor = monitor;\r\n}\r\n\r\n/**\r\n * Initialize the global performance monitor with options\r\n */\r\nexport function initPerformanceMonitor(options: PerformanceMonitorOptions = {}): PerformanceMonitor {\r\n globalMonitor = new PerformanceMonitor(options);\r\n return globalMonitor;\r\n}\r\n\r\n// ==================== Convenience Functions ====================\r\n\r\n/**\r\n * Start timing a component render operation using the global monitor\r\n */\r\nexport function startRenderTiming(\r\n componentName: string,\r\n operation: 'mount' | 'patch' | 'unmount',\r\n metadata?: Record<string, unknown>,\r\n): (endMetadata?: Record<string, unknown>) => RenderPerformanceEntry | null {\r\n return getPerformanceMonitor().startTiming(componentName, operation, metadata);\r\n}\r\n\r\n/**\r\n * Record a render entry using the global monitor\r\n */\r\nexport function recordRenderEntry(entry: RenderPerformanceEntry): void {\r\n getPerformanceMonitor().recordEntry(entry);\r\n}\r\n\r\n/**\r\n * Get component stats from the global monitor\r\n */\r\nexport function getComponentStats(componentName: string): ComponentPerformanceStats | undefined {\r\n return getPerformanceMonitor().getStats(componentName);\r\n}\r\n\r\n/**\r\n * Generate a performance report from the global monitor\r\n */\r\nexport function generatePerformanceReport(): PerformanceReport {\r\n return getPerformanceMonitor().generateReport();\r\n}\r\n\r\n/**\r\n * Check if performance monitoring is enabled\r\n */\r\nexport function isPerformanceMonitoringEnabled(): boolean {\r\n return globalMonitor?.enabled ?? false;\r\n}\r\n\r\n/**\r\n * Enable or disable performance monitoring\r\n */\r\nexport function setPerformanceMonitoringEnabled(enabled: boolean): void {\r\n const monitor = getPerformanceMonitor();\r\n monitor.enabled = enabled;\r\n}\r\n\r\n// ==================== Decorator / Wrapper ====================\r\n\r\n/**\r\n * Wrap a render function with performance monitoring\r\n *\r\n * @example\r\n * ```ts\r\n * const monitoredRender = withPerformanceTracking('MyComponent', (props) => {\r\n * return h('div', props.content);\r\n * });\r\n * ```\r\n */\r\nexport function withPerformanceTracking<T extends (...args: unknown[]) => unknown>(\r\n componentName: string,\r\n renderFn: T,\r\n operation: 'mount' | 'patch' | 'unmount' = 'patch',\r\n): T {\r\n return ((...args: unknown[]) => {\r\n const endTiming = startRenderTiming(componentName, operation);\r\n try {\r\n const result = renderFn(...args);\r\n endTiming();\r\n return result;\r\n } catch (error) {\r\n endTiming({ error: true });\r\n throw error;\r\n }\r\n }) as T;\r\n}\r\n\r\n// ==================== DevTools Integration ====================\r\n\r\n/**\r\n * Connect performance monitor to browser DevTools\r\n * Only works in development mode\r\n */\r\nexport function connectToDevTools(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n // Expose monitor to window for DevTools access\r\n // FIX: DTS build error - 先转换为 unknown 再转换为 Record\r\n (window as unknown as Record<string, unknown>).__LYTJS_PERFORMANCE_MONITOR__ = getPerformanceMonitor();\r\n\r\n // Mark initialization for DevTools detection\r\n (window as unknown as Record<string, unknown>).__LYTJS_DEVTOOLS_HOOK__ = true;\r\n\r\n if (__DEV__) {\r\n // FIX: P1-14 删除 require 调用,直接使用顶部已导入的 warn\r\n warn('Performance monitor connected to DevTools');\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["warn"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @lytjs/common-performance\n * Performance monitoring API for component render timing\n * FIX: P2-11 RUNTIME-NEW-02 - 性能监控 API\n */\n\ndeclare const __DEV__: boolean;\n\nimport { warn } from '@lytjs/common-error';\n\n// ==================== Types ====================\n\n/**\n * Performance entry for a single render operation\n */\nexport interface RenderPerformanceEntry {\n /** Component name or identifier */\n componentName: string;\n\n /** Type of operation */\n operation: 'mount' | 'patch' | 'unmount';\n\n /** Start time (high resolution timestamp) */\n startTime: number;\n\n /** End time (high resolution timestamp) */\n endTime: number;\n\n /** Duration in milliseconds */\n duration: number;\n\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Component performance statistics\n */\nexport interface ComponentPerformanceStats {\n /** Component name */\n componentName: string;\n\n /** Number of mount operations */\n mountCount: number;\n\n /** Number of patch (update) operations */\n patchCount: number;\n\n /** Number of unmount operations */\n unmountCount: number;\n\n /** Total time spent in mount operations (ms) */\n totalMountTime: number;\n\n /** Total time spent in patch operations (ms) */\n totalPatchTime: number;\n\n /** Total time spent in unmount operations (ms) */\n totalUnmountTime: number;\n\n /** Average mount time (ms) */\n averageMountTime: number;\n\n /** Average patch time (ms) */\n averagePatchTime: number;\n\n /** Average unmount time (ms) */\n averageUnmountTime: number;\n\n /** Maximum mount time (ms) */\n maxMountTime: number;\n\n /** Maximum patch time (ms) */\n maxPatchTime: number;\n\n /** Maximum unmount time (ms) */\n maxUnmountTime: number;\n\n /** Last render timestamp */\n lastRenderTime: number;\n}\n\n/**\n * Performance monitor options\n */\nexport interface PerformanceMonitorOptions {\n /** Maximum number of entries to keep in history */\n maxHistorySize?: number;\n\n /** Whether to enable monitoring by default */\n enabled?: boolean;\n\n /** Callback when a new entry is recorded */\n onEntry?: (entry: RenderPerformanceEntry) => void;\n\n /** Callback when stats are updated */\n onStatsUpdate?: (stats: ComponentPerformanceStats) => void;\n}\n\n// ==================== Performance Monitor Class ====================\n\n/**\n * PerformanceMonitor - Tracks component render performance\n *\n * @example\n * ```ts\n * const monitor = new PerformanceMonitor({ maxHistorySize: 100 });\n *\n * // Start timing a render\n * const endTiming = monitor.startTiming('MyComponent', 'patch');\n *\n * // ... perform render ...\n *\n * // End timing\n * endTiming();\n *\n * // Get stats\n * const stats = monitor.getStats('MyComponent');\n * console.log(`Average render time: ${stats?.averagePatchTime}ms`);\n * ```\n */\nexport class PerformanceMonitor {\n // FIX: P2-v11-17 使用环形缓冲区替代数组 + shift(),\n // 避免 history.shift() 的 O(n) 时间复杂度\n private historyBuffer: (RenderPerformanceEntry | null)[] = [];\n private historyHead = 0;\n private historyCount = 0;\n private stats: Map<string, ComponentPerformanceStats> = new Map();\n private options: Required<PerformanceMonitorOptions>;\n private _enabled: boolean;\n\n constructor(options: PerformanceMonitorOptions = {}) {\n this.options = {\n maxHistorySize: options.maxHistorySize ?? 1000,\n enabled: options.enabled ?? true,\n onEntry: options.onEntry ?? (() => {}),\n onStatsUpdate: options.onStatsUpdate ?? (() => {}),\n };\n this._enabled = this.options.enabled;\n }\n\n /**\n * Check if monitoring is enabled\n */\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Enable or disable monitoring\n */\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n /**\n * Start timing a render operation.\n * Returns a function that should be called when the operation completes.\n *\n * @param componentName - Name of the component being rendered\n * @param operation - Type of operation (mount, patch, unmount)\n * @param metadata - Optional metadata to attach to the entry\n * @returns A function to end the timing\n *\n * @example\n * ```ts\n * const endTiming = monitor.startTiming('MyComponent', 'patch');\n * // ... render logic ...\n * endTiming({ propsChanged: true });\n * ```\n */\n startTiming(\n componentName: string,\n operation: 'mount' | 'patch' | 'unmount',\n metadata?: Record<string, unknown>,\n ): (endMetadata?: Record<string, unknown>) => RenderPerformanceEntry | null {\n if (!this._enabled) {\n return () => null;\n }\n\n // FIX: P2-v11-16 添加 performance.now() 回退,\n // 在非浏览器环境(如 SSR、Node.js)中使用 Date.now() 替代\n const getTimestamp = (): number => {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n };\n\n const startTime = getTimestamp();\n\n return (endMetadata?: Record<string, unknown>) => {\n const endTime = getTimestamp();\n const duration = endTime - startTime;\n\n const entry: RenderPerformanceEntry = {\n componentName,\n operation,\n startTime,\n endTime,\n duration,\n metadata: { ...metadata, ...endMetadata },\n };\n\n this.recordEntry(entry);\n return entry;\n };\n }\n\n /**\n * Record a performance entry directly\n */\n recordEntry(entry: RenderPerformanceEntry): void {\n if (!this._enabled) return;\n\n // FIX: P2-v11-17 使用环形缓冲区写入,O(1) 操作\n if (this.historyBuffer.length < this.options.maxHistorySize) {\n this.historyBuffer.push(entry);\n this.historyCount++;\n } else {\n this.historyBuffer[this.historyHead] = entry;\n this.historyHead = (this.historyHead + 1) % this.options.maxHistorySize;\n // historyCount 保持为 maxHistorySize\n }\n\n // Update stats\n this.updateStats(entry);\n\n // Notify callback\n this.options.onEntry(entry);\n }\n\n /**\n * Update statistics for a component\n */\n private updateStats(entry: RenderPerformanceEntry): void {\n const { componentName, operation, duration } = entry;\n\n let stats = this.stats.get(componentName);\n if (!stats) {\n stats = {\n componentName,\n mountCount: 0,\n patchCount: 0,\n unmountCount: 0,\n totalMountTime: 0,\n totalPatchTime: 0,\n totalUnmountTime: 0,\n averageMountTime: 0,\n averagePatchTime: 0,\n averageUnmountTime: 0,\n maxMountTime: 0,\n maxPatchTime: 0,\n maxUnmountTime: 0,\n lastRenderTime: Date.now(),\n };\n this.stats.set(componentName, stats);\n }\n\n // Update counters and times\n switch (operation) {\n case 'mount':\n stats.mountCount++;\n stats.totalMountTime += duration;\n stats.averageMountTime = stats.totalMountTime / stats.mountCount;\n stats.maxMountTime = Math.max(stats.maxMountTime, duration);\n break;\n case 'patch':\n stats.patchCount++;\n stats.totalPatchTime += duration;\n stats.averagePatchTime = stats.totalPatchTime / stats.patchCount;\n stats.maxPatchTime = Math.max(stats.maxPatchTime, duration);\n break;\n case 'unmount':\n stats.unmountCount++;\n stats.totalUnmountTime += duration;\n stats.averageUnmountTime = stats.totalUnmountTime / stats.unmountCount;\n stats.maxUnmountTime = Math.max(stats.maxUnmountTime, duration);\n break;\n }\n\n stats.lastRenderTime = Date.now();\n this.options.onStatsUpdate(stats);\n }\n\n /**\n * Get performance statistics for a specific component\n */\n getStats(componentName: string): ComponentPerformanceStats | undefined {\n return this.stats.get(componentName);\n }\n\n /**\n * Get all component statistics\n */\n getAllStats(): ComponentPerformanceStats[] {\n return Array.from(this.stats.values());\n }\n\n /**\n * Get performance history\n * FIX: P2-v11-17 从环形缓冲区读取历史记录\n */\n getHistory(): RenderPerformanceEntry[] {\n const result: RenderPerformanceEntry[] = [];\n for (let i = 0; i < this.historyCount; i++) {\n const idx = (this.historyHead + i) % this.historyBuffer.length;\n const entry = this.historyBuffer[idx];\n if (entry) result.push(entry);\n }\n return result;\n }\n\n /**\n * Get history for a specific component\n */\n getComponentHistory(componentName: string): RenderPerformanceEntry[] {\n return this.getHistory().filter((entry) => entry.componentName === componentName);\n }\n\n /**\n * Get history for a specific operation type\n */\n getOperationHistory(operation: 'mount' | 'patch' | 'unmount'): RenderPerformanceEntry[] {\n return this.getHistory().filter((entry) => entry.operation === operation);\n }\n\n /**\n * Get the slowest renders\n */\n getSlowestRenders(limit: number = 10): RenderPerformanceEntry[] {\n return this.getHistory()\n .sort((a, b) => b.duration - a.duration)\n .slice(0, limit);\n }\n\n /**\n * Get average render time across all components\n */\n getGlobalAverageRenderTime(): number {\n const history = this.getHistory();\n if (history.length === 0) return 0;\n const total = history.reduce((sum, entry) => sum + entry.duration, 0);\n return total / history.length;\n }\n\n /**\n * Get total render time across all components\n */\n getGlobalTotalRenderTime(): number {\n return this.getHistory().reduce((sum, entry) => sum + entry.duration, 0);\n }\n\n /**\n * Clear all history and stats\n * FIX: P2 统一 clear/clearComponent 策略:使用 fill(null) 预分配固定大小缓冲区,\n * 与 clearComponent 保持一致的环形缓冲区重建方式,避免 clear 后缓冲区大小丢失\n */\n clear(): void {\n this.historyBuffer = new Array(this.options.maxHistorySize).fill(null);\n this.historyHead = 0;\n this.historyCount = 0;\n this.stats.clear();\n }\n\n /**\n * Clear history and stats for a specific component\n */\n clearComponent(componentName: string): boolean {\n // FIX: P2-batch2-12 修复 clearComponent 破坏环形缓冲区的问题。\n // 原实现直接将过滤后的数组赋值给 historyBuffer 并重置 head/tail,\n // 但丢失了环形缓冲区的固定大小约束。正确做法是重建固定大小的缓冲区。\n const filtered = this.getHistory().filter((entry) => entry.componentName !== componentName);\n // 重建固定大小的环形缓冲区\n this.historyBuffer = new Array(this.options.maxHistorySize).fill(null);\n this.historyHead = 0;\n this.historyCount = filtered.length;\n for (let i = 0; i < filtered.length; i++) {\n // FIX: DTS build error - 类型匹配\n this.historyBuffer[i] = filtered[i] as RenderPerformanceEntry | null;\n }\n return this.stats.delete(componentName);\n }\n\n /**\n * Generate a performance report\n */\n generateReport(): PerformanceReport {\n const allStats = this.getAllStats();\n const history = this.getHistory();\n const totalRenders = history.length;\n const totalRenderTime = this.getGlobalTotalRenderTime();\n const averageRenderTime = this.getGlobalAverageRenderTime();\n\n // Find slowest component\n const slowestComponent =\n allStats.length > 0\n ? allStats.reduce((slowest, current) => {\n const currentAvg = current.averagePatchTime || current.averageMountTime;\n const slowestAvg = slowest.averagePatchTime || slowest.averageMountTime;\n return currentAvg > slowestAvg ? current : slowest;\n })\n : null;\n\n // Find most rendered component\n const mostRenderedComponent =\n allStats.length > 0\n ? allStats.reduce((most, current) =>\n current.patchCount > most.patchCount ? current : most,\n )\n : null;\n\n return {\n timestamp: Date.now(),\n totalRenders,\n totalRenderTime,\n averageRenderTime,\n componentCount: allStats.length,\n slowestComponent: slowestComponent?.componentName ?? null,\n mostRenderedComponent: mostRenderedComponent?.componentName ?? null,\n componentStats: allStats,\n };\n }\n}\n\n/**\n * Performance report structure\n */\nexport interface PerformanceReport {\n /** Report generation timestamp */\n timestamp: number;\n\n /** Total number of render operations */\n totalRenders: number;\n\n /** Total time spent rendering (ms) */\n totalRenderTime: number;\n\n /** Average render time (ms) */\n averageRenderTime: number;\n\n /** Number of unique components tracked */\n componentCount: number;\n\n /** Name of the slowest component (by average render time) */\n slowestComponent: string | null;\n\n /** Name of the most rendered component */\n mostRenderedComponent: string | null;\n\n /** Detailed stats for each component */\n componentStats: ComponentPerformanceStats[];\n}\n\n// ==================== Global Instance ====================\n\n/** Global performance monitor instance */\nlet globalMonitor: PerformanceMonitor | null = null;\n\n/**\n * Get the global performance monitor instance\n * Creates one if it doesn't exist\n */\nexport function getPerformanceMonitor(): PerformanceMonitor {\n if (!globalMonitor) {\n globalMonitor = new PerformanceMonitor();\n }\n return globalMonitor;\n}\n\n/**\n * Set the global performance monitor instance\n */\nexport function setPerformanceMonitor(monitor: PerformanceMonitor): void {\n globalMonitor = monitor;\n}\n\n/**\n * Initialize the global performance monitor with options\n */\nexport function initPerformanceMonitor(\n options: PerformanceMonitorOptions = {},\n): PerformanceMonitor {\n globalMonitor = new PerformanceMonitor(options);\n return globalMonitor;\n}\n\n// ==================== Convenience Functions ====================\n\n/**\n * Start timing a component render operation using the global monitor\n */\nexport function startRenderTiming(\n componentName: string,\n operation: 'mount' | 'patch' | 'unmount',\n metadata?: Record<string, unknown>,\n): (endMetadata?: Record<string, unknown>) => RenderPerformanceEntry | null {\n return getPerformanceMonitor().startTiming(componentName, operation, metadata);\n}\n\n/**\n * Record a render entry using the global monitor\n */\nexport function recordRenderEntry(entry: RenderPerformanceEntry): void {\n getPerformanceMonitor().recordEntry(entry);\n}\n\n/**\n * Get component stats from the global monitor\n */\nexport function getComponentStats(componentName: string): ComponentPerformanceStats | undefined {\n return getPerformanceMonitor().getStats(componentName);\n}\n\n/**\n * Generate a performance report from the global monitor\n */\nexport function generatePerformanceReport(): PerformanceReport {\n return getPerformanceMonitor().generateReport();\n}\n\n/**\n * Check if performance monitoring is enabled\n */\nexport function isPerformanceMonitoringEnabled(): boolean {\n return globalMonitor?.enabled ?? false;\n}\n\n/**\n * Enable or disable performance monitoring\n */\nexport function setPerformanceMonitoringEnabled(enabled: boolean): void {\n const monitor = getPerformanceMonitor();\n monitor.enabled = enabled;\n}\n\n// ==================== Decorator / Wrapper ====================\n\n/**\n * Wrap a render function with performance monitoring\n *\n * @example\n * ```ts\n * const monitoredRender = withPerformanceTracking('MyComponent', (props) => {\n * return h('div', props.content);\n * });\n * ```\n */\nexport function withPerformanceTracking<T extends (...args: unknown[]) => unknown>(\n componentName: string,\n renderFn: T,\n operation: 'mount' | 'patch' | 'unmount' = 'patch',\n): T {\n return ((...args: unknown[]) => {\n const endTiming = startRenderTiming(componentName, operation);\n try {\n const result = renderFn(...args);\n endTiming();\n return result;\n } catch (error) {\n endTiming({ error: true });\n throw error;\n }\n }) as T;\n}\n\n// ==================== DevTools Integration ====================\n\n/**\n * Connect performance monitor to browser DevTools\n * Only works in development mode\n */\nexport function connectToDevTools(): void {\n if (typeof window === 'undefined') return;\n\n // Expose monitor to window for DevTools access\n // FIX: DTS build error - 先转换为 unknown 再转换为 Record\n (window as unknown as Record<string, unknown>).__LYTJS_PERFORMANCE_MONITOR__ =\n getPerformanceMonitor();\n\n // Mark initialization for DevTools detection\n (window as unknown as Record<string, unknown>).__LYTJS_DEVTOOLS_HOOK__ = true;\n\n if (__DEV__) {\n // FIX: P1-14 删除 require 调用,直接使用顶部已导入的 warn\n warn('Performance monitor connected to DevTools');\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * @lytjs/common-performance\r\n * Performance monitoring API for component render timing\r\n * FIX: P2-11 RUNTIME-NEW-02 - 性能监控 API\r\n */\r\n\r\ndeclare const __DEV__: boolean;\r\n\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ==================== Types ====================\r\n\r\n/**\r\n * Performance entry for a single render operation\r\n */\r\nexport interface RenderPerformanceEntry {\r\n /** Component name or identifier */\r\n componentName: string;\r\n\r\n /** Type of operation */\r\n operation: 'mount' | 'patch' | 'unmount';\r\n\r\n /** Start time (high resolution timestamp) */\r\n startTime: number;\r\n\r\n /** End time (high resolution timestamp) */\r\n endTime: number;\r\n\r\n /** Duration in milliseconds */\r\n duration: number;\r\n\r\n /** Additional metadata */\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Component performance statistics\r\n */\r\nexport interface ComponentPerformanceStats {\r\n /** Component name */\r\n componentName: string;\r\n\r\n /** Number of mount operations */\r\n mountCount: number;\r\n\r\n /** Number of patch (update) operations */\r\n patchCount: number;\r\n\r\n /** Number of unmount operations */\r\n unmountCount: number;\r\n\r\n /** Total time spent in mount operations (ms) */\r\n totalMountTime: number;\r\n\r\n /** Total time spent in patch operations (ms) */\r\n totalPatchTime: number;\r\n\r\n /** Total time spent in unmount operations (ms) */\r\n totalUnmountTime: number;\r\n\r\n /** Average mount time (ms) */\r\n averageMountTime: number;\r\n\r\n /** Average patch time (ms) */\r\n averagePatchTime: number;\r\n\r\n /** Average unmount time (ms) */\r\n averageUnmountTime: number;\r\n\r\n /** Maximum mount time (ms) */\r\n maxMountTime: number;\r\n\r\n /** Maximum patch time (ms) */\r\n maxPatchTime: number;\r\n\r\n /** Maximum unmount time (ms) */\r\n maxUnmountTime: number;\r\n\r\n /** Last render timestamp */\r\n lastRenderTime: number;\r\n}\r\n\r\n/**\r\n * Performance monitor options\r\n */\r\nexport interface PerformanceMonitorOptions {\r\n /** Maximum number of entries to keep in history */\r\n maxHistorySize?: number;\r\n\r\n /** Whether to enable monitoring by default */\r\n enabled?: boolean;\r\n\r\n /** Callback when a new entry is recorded */\r\n onEntry?: (entry: RenderPerformanceEntry) => void;\r\n\r\n /** Callback when stats are updated */\r\n onStatsUpdate?: (stats: ComponentPerformanceStats) => void;\r\n}\r\n\r\n// ==================== Performance Monitor Class ====================\r\n\r\n/**\r\n * PerformanceMonitor - Tracks component render performance\r\n *\r\n * @example\r\n * ```ts\r\n * const monitor = new PerformanceMonitor({ maxHistorySize: 100 });\r\n *\r\n * // Start timing a render\r\n * const endTiming = monitor.startTiming('MyComponent', 'patch');\r\n *\r\n * // ... perform render ...\r\n *\r\n * // End timing\r\n * endTiming();\r\n *\r\n * // Get stats\r\n * const stats = monitor.getStats('MyComponent');\r\n * console.log(`Average render time: ${stats?.averagePatchTime}ms`);\r\n * ```\r\n */\r\nexport class PerformanceMonitor {\r\n // FIX: P2-v11-17 使用环形缓冲区替代数组 + shift(),\r\n // 避免 history.shift() 的 O(n) 时间复杂度\r\n private historyBuffer: (RenderPerformanceEntry | null)[] = [];\r\n private historyHead = 0;\r\n private historyCount = 0;\r\n private stats: Map<string, ComponentPerformanceStats> = new Map();\r\n private options: Required<PerformanceMonitorOptions>;\r\n private _enabled: boolean;\r\n\r\n constructor(options: PerformanceMonitorOptions = {}) {\r\n this.options = {\r\n maxHistorySize: options.maxHistorySize ?? 1000,\r\n enabled: options.enabled ?? true,\r\n onEntry: options.onEntry ?? (() => {}),\r\n onStatsUpdate: options.onStatsUpdate ?? (() => {}),\r\n };\r\n this._enabled = this.options.enabled;\r\n }\r\n\r\n /**\r\n * Check if monitoring is enabled\r\n */\r\n get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * Enable or disable monitoring\r\n */\r\n set enabled(value: boolean) {\r\n this._enabled = value;\r\n }\r\n\r\n /**\r\n * Start timing a render operation.\r\n * Returns a function that should be called when the operation completes.\r\n *\r\n * @param componentName - Name of the component being rendered\r\n * @param operation - Type of operation (mount, patch, unmount)\r\n * @param metadata - Optional metadata to attach to the entry\r\n * @returns A function to end the timing\r\n *\r\n * @example\r\n * ```ts\r\n * const endTiming = monitor.startTiming('MyComponent', 'patch');\r\n * // ... render logic ...\r\n * endTiming({ propsChanged: true });\r\n * ```\r\n */\r\n startTiming(\r\n componentName: string,\r\n operation: 'mount' | 'patch' | 'unmount',\r\n metadata?: Record<string, unknown>,\r\n ): (endMetadata?: Record<string, unknown>) => RenderPerformanceEntry | null {\r\n if (!this._enabled) {\r\n return () => null;\r\n }\r\n\r\n // FIX: P2-v11-16 添加 performance.now() 回退,\r\n // 在非浏览器环境(如 SSR、Node.js)中使用 Date.now() 替代\r\n const getTimestamp = (): number => {\r\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\r\n return performance.now();\r\n }\r\n return Date.now();\r\n };\r\n\r\n const startTime = getTimestamp();\r\n\r\n return (endMetadata?: Record<string, unknown>) => {\r\n const endTime = getTimestamp();\r\n const duration = endTime - startTime;\r\n\r\n const entry: RenderPerformanceEntry = {\r\n componentName,\r\n operation,\r\n startTime,\r\n endTime,\r\n duration,\r\n metadata: { ...metadata, ...endMetadata },\r\n };\r\n\r\n this.recordEntry(entry);\r\n return entry;\r\n };\r\n }\r\n\r\n /**\r\n * Record a performance entry directly\r\n */\r\n recordEntry(entry: RenderPerformanceEntry): void {\r\n if (!this._enabled) return;\r\n\r\n // FIX: P2-v11-17 使用环形缓冲区写入,O(1) 操作\r\n if (this.historyBuffer.length < this.options.maxHistorySize) {\r\n this.historyBuffer.push(entry);\r\n this.historyCount++;\r\n } else {\r\n this.historyBuffer[this.historyHead] = entry;\r\n this.historyHead = (this.historyHead + 1) % this.options.maxHistorySize;\r\n // historyCount 保持为 maxHistorySize\r\n }\r\n\r\n // Update stats\r\n this.updateStats(entry);\r\n\r\n // Notify callback\r\n this.options.onEntry(entry);\r\n }\r\n\r\n /**\r\n * Update statistics for a component\r\n */\r\n private updateStats(entry: RenderPerformanceEntry): void {\r\n const { componentName, operation, duration } = entry;\r\n\r\n let stats = this.stats.get(componentName);\r\n if (!stats) {\r\n stats = {\r\n componentName,\r\n mountCount: 0,\r\n patchCount: 0,\r\n unmountCount: 0,\r\n totalMountTime: 0,\r\n totalPatchTime: 0,\r\n totalUnmountTime: 0,\r\n averageMountTime: 0,\r\n averagePatchTime: 0,\r\n averageUnmountTime: 0,\r\n maxMountTime: 0,\r\n maxPatchTime: 0,\r\n maxUnmountTime: 0,\r\n lastRenderTime: Date.now(),\r\n };\r\n this.stats.set(componentName, stats);\r\n }\r\n\r\n // Update counters and times\r\n switch (operation) {\r\n case 'mount':\r\n stats.mountCount++;\r\n stats.totalMountTime += duration;\r\n stats.averageMountTime = stats.totalMountTime / stats.mountCount;\r\n stats.maxMountTime = Math.max(stats.maxMountTime, duration);\r\n break;\r\n case 'patch':\r\n stats.patchCount++;\r\n stats.totalPatchTime += duration;\r\n stats.averagePatchTime = stats.totalPatchTime / stats.patchCount;\r\n stats.maxPatchTime = Math.max(stats.maxPatchTime, duration);\r\n break;\r\n case 'unmount':\r\n stats.unmountCount++;\r\n stats.totalUnmountTime += duration;\r\n stats.averageUnmountTime = stats.totalUnmountTime / stats.unmountCount;\r\n stats.maxUnmountTime = Math.max(stats.maxUnmountTime, duration);\r\n break;\r\n }\r\n\r\n stats.lastRenderTime = Date.now();\r\n this.options.onStatsUpdate(stats);\r\n }\r\n\r\n /**\r\n * Get performance statistics for a specific component\r\n */\r\n getStats(componentName: string): ComponentPerformanceStats | undefined {\r\n return this.stats.get(componentName);\r\n }\r\n\r\n /**\r\n * Get all component statistics\r\n */\r\n getAllStats(): ComponentPerformanceStats[] {\r\n return Array.from(this.stats.values());\r\n }\r\n\r\n /**\r\n * Get performance history\r\n * FIX: P2-v11-17 从环形缓冲区读取历史记录\r\n */\r\n getHistory(): RenderPerformanceEntry[] {\r\n const result: RenderPerformanceEntry[] = [];\r\n for (let i = 0; i < this.historyCount; i++) {\r\n const idx = (this.historyHead + i) % this.historyBuffer.length;\r\n const entry = this.historyBuffer[idx];\r\n if (entry) result.push(entry);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Get history for a specific component\r\n */\r\n getComponentHistory(componentName: string): RenderPerformanceEntry[] {\r\n return this.getHistory().filter((entry) => entry.componentName === componentName);\r\n }\r\n\r\n /**\r\n * Get history for a specific operation type\r\n */\r\n getOperationHistory(operation: 'mount' | 'patch' | 'unmount'): RenderPerformanceEntry[] {\r\n return this.getHistory().filter((entry) => entry.operation === operation);\r\n }\r\n\r\n /**\r\n * Get the slowest renders\r\n */\r\n getSlowestRenders(limit: number = 10): RenderPerformanceEntry[] {\r\n return this.getHistory()\r\n .sort((a, b) => b.duration - a.duration)\r\n .slice(0, limit);\r\n }\r\n\r\n /**\r\n * Get average render time across all components\r\n */\r\n getGlobalAverageRenderTime(): number {\r\n const history = this.getHistory();\r\n if (history.length === 0) return 0;\r\n const total = history.reduce((sum, entry) => sum + entry.duration, 0);\r\n return total / history.length;\r\n }\r\n\r\n /**\r\n * Get total render time across all components\r\n */\r\n getGlobalTotalRenderTime(): number {\r\n return this.getHistory().reduce((sum, entry) => sum + entry.duration, 0);\r\n }\r\n\r\n /**\r\n * Clear all history and stats\r\n * FIX: P2 统一 clear/clearComponent 策略:使用 fill(null) 预分配固定大小缓冲区,\r\n * 与 clearComponent 保持一致的环形缓冲区重建方式,避免 clear 后缓冲区大小丢失\r\n */\r\n clear(): void {\r\n this.historyBuffer = new Array(this.options.maxHistorySize).fill(null);\r\n this.historyHead = 0;\r\n this.historyCount = 0;\r\n this.stats.clear();\r\n }\r\n\r\n /**\r\n * Clear history and stats for a specific component\r\n */\r\n clearComponent(componentName: string): boolean {\r\n // FIX: P2-batch2-12 修复 clearComponent 破坏环形缓冲区的问题。\r\n // 原实现直接将过滤后的数组赋值给 historyBuffer 并重置 head/tail,\r\n // 但丢失了环形缓冲区的固定大小约束。正确做法是重建固定大小的缓冲区。\r\n const filtered = this.getHistory().filter((entry) => entry.componentName !== componentName);\r\n // 重建固定大小的环形缓冲区\r\n this.historyBuffer = new Array(this.options.maxHistorySize).fill(null);\r\n this.historyHead = 0;\r\n this.historyCount = filtered.length;\r\n for (let i = 0; i < filtered.length; i++) {\r\n // FIX: DTS build error - 类型匹配\r\n this.historyBuffer[i] = filtered[i] as RenderPerformanceEntry | null;\r\n }\r\n return this.stats.delete(componentName);\r\n }\r\n\r\n /**\r\n * Generate a performance report\r\n */\r\n generateReport(): PerformanceReport {\r\n const allStats = this.getAllStats();\r\n const history = this.getHistory();\r\n const totalRenders = history.length;\r\n const totalRenderTime = this.getGlobalTotalRenderTime();\r\n const averageRenderTime = this.getGlobalAverageRenderTime();\r\n\r\n // Find slowest component\r\n const slowestComponent = allStats.length > 0\r\n ? allStats.reduce((slowest, current) => {\r\n const currentAvg = current.averagePatchTime || current.averageMountTime;\r\n const slowestAvg = slowest.averagePatchTime || slowest.averageMountTime;\r\n return currentAvg > slowestAvg ? current : slowest;\r\n })\r\n : null;\r\n\r\n // Find most rendered component\r\n const mostRenderedComponent = allStats.length > 0\r\n ? allStats.reduce((most, current) =>\r\n current.patchCount > most.patchCount ? current : most\r\n )\r\n : null;\r\n\r\n return {\r\n timestamp: Date.now(),\r\n totalRenders,\r\n totalRenderTime,\r\n averageRenderTime,\r\n componentCount: allStats.length,\r\n slowestComponent: slowestComponent?.componentName ?? null,\r\n mostRenderedComponent: mostRenderedComponent?.componentName ?? null,\r\n componentStats: allStats,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Performance report structure\r\n */\r\nexport interface PerformanceReport {\r\n /** Report generation timestamp */\r\n timestamp: number;\r\n\r\n /** Total number of render operations */\r\n totalRenders: number;\r\n\r\n /** Total time spent rendering (ms) */\r\n totalRenderTime: number;\r\n\r\n /** Average render time (ms) */\r\n averageRenderTime: number;\r\n\r\n /** Number of unique components tracked */\r\n componentCount: number;\r\n\r\n /** Name of the slowest component (by average render time) */\r\n slowestComponent: string | null;\r\n\r\n /** Name of the most rendered component */\r\n mostRenderedComponent: string | null;\r\n\r\n /** Detailed stats for each component */\r\n componentStats: ComponentPerformanceStats[];\r\n}\r\n\r\n// ==================== Global Instance ====================\r\n\r\n/** Global performance monitor instance */\r\nlet globalMonitor: PerformanceMonitor | null = null;\r\n\r\n/**\r\n * Get the global performance monitor instance\r\n * Creates one if it doesn't exist\r\n */\r\nexport function getPerformanceMonitor(): PerformanceMonitor {\r\n if (!globalMonitor) {\r\n globalMonitor = new PerformanceMonitor();\r\n }\r\n return globalMonitor;\r\n}\r\n\r\n/**\r\n * Set the global performance monitor instance\r\n */\r\nexport function setPerformanceMonitor(monitor: PerformanceMonitor): void {\r\n globalMonitor = monitor;\r\n}\r\n\r\n/**\r\n * Initialize the global performance monitor with options\r\n */\r\nexport function initPerformanceMonitor(options: PerformanceMonitorOptions = {}): PerformanceMonitor {\r\n globalMonitor = new PerformanceMonitor(options);\r\n return globalMonitor;\r\n}\r\n\r\n// ==================== Convenience Functions ====================\r\n\r\n/**\r\n * Start timing a component render operation using the global monitor\r\n */\r\nexport function startRenderTiming(\r\n componentName: string,\r\n operation: 'mount' | 'patch' | 'unmount',\r\n metadata?: Record<string, unknown>,\r\n): (endMetadata?: Record<string, unknown>) => RenderPerformanceEntry | null {\r\n return getPerformanceMonitor().startTiming(componentName, operation, metadata);\r\n}\r\n\r\n/**\r\n * Record a render entry using the global monitor\r\n */\r\nexport function recordRenderEntry(entry: RenderPerformanceEntry): void {\r\n getPerformanceMonitor().recordEntry(entry);\r\n}\r\n\r\n/**\r\n * Get component stats from the global monitor\r\n */\r\nexport function getComponentStats(componentName: string): ComponentPerformanceStats | undefined {\r\n return getPerformanceMonitor().getStats(componentName);\r\n}\r\n\r\n/**\r\n * Generate a performance report from the global monitor\r\n */\r\nexport function generatePerformanceReport(): PerformanceReport {\r\n return getPerformanceMonitor().generateReport();\r\n}\r\n\r\n/**\r\n * Check if performance monitoring is enabled\r\n */\r\nexport function isPerformanceMonitoringEnabled(): boolean {\r\n return globalMonitor?.enabled ?? false;\r\n}\r\n\r\n/**\r\n * Enable or disable performance monitoring\r\n */\r\nexport function setPerformanceMonitoringEnabled(enabled: boolean): void {\r\n const monitor = getPerformanceMonitor();\r\n monitor.enabled = enabled;\r\n}\r\n\r\n// ==================== Decorator / Wrapper ====================\r\n\r\n/**\r\n * Wrap a render function with performance monitoring\r\n *\r\n * @example\r\n * ```ts\r\n * const monitoredRender = withPerformanceTracking('MyComponent', (props) => {\r\n * return h('div', props.content);\r\n * });\r\n * ```\r\n */\r\nexport function withPerformanceTracking<T extends (...args: unknown[]) => unknown>(\r\n componentName: string,\r\n renderFn: T,\r\n operation: 'mount' | 'patch' | 'unmount' = 'patch',\r\n): T {\r\n return ((...args: unknown[]) => {\r\n const endTiming = startRenderTiming(componentName, operation);\r\n try {\r\n const result = renderFn(...args);\r\n endTiming();\r\n return result;\r\n } catch (error) {\r\n endTiming({ error: true });\r\n throw error;\r\n }\r\n }) as T;\r\n}\r\n\r\n// ==================== DevTools Integration ====================\r\n\r\n/**\r\n * Connect performance monitor to browser DevTools\r\n * Only works in development mode\r\n */\r\nexport function connectToDevTools(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n // Expose monitor to window for DevTools access\r\n // FIX: DTS build error - 先转换为 unknown 再转换为 Record\r\n (window as unknown as Record<string, unknown>).__LYTJS_PERFORMANCE_MONITOR__ = getPerformanceMonitor();\r\n\r\n // Mark initialization for DevTools detection\r\n (window as unknown as Record<string, unknown>).__LYTJS_DEVTOOLS_HOOK__ = true;\r\n\r\n if (__DEV__) {\r\n // FIX: P1-14 删除 require 调用,直接使用顶部已导入的 warn\r\n warn('Performance monitor connected to DevTools');\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @lytjs/common-performance\n * Performance monitoring API for component render timing\n * FIX: P2-11 RUNTIME-NEW-02 - 性能监控 API\n */\n\ndeclare const __DEV__: boolean;\n\nimport { warn } from '@lytjs/common-error';\n\n// ==================== Types ====================\n\n/**\n * Performance entry for a single render operation\n */\nexport interface RenderPerformanceEntry {\n /** Component name or identifier */\n componentName: string;\n\n /** Type of operation */\n operation: 'mount' | 'patch' | 'unmount';\n\n /** Start time (high resolution timestamp) */\n startTime: number;\n\n /** End time (high resolution timestamp) */\n endTime: number;\n\n /** Duration in milliseconds */\n duration: number;\n\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Component performance statistics\n */\nexport interface ComponentPerformanceStats {\n /** Component name */\n componentName: string;\n\n /** Number of mount operations */\n mountCount: number;\n\n /** Number of patch (update) operations */\n patchCount: number;\n\n /** Number of unmount operations */\n unmountCount: number;\n\n /** Total time spent in mount operations (ms) */\n totalMountTime: number;\n\n /** Total time spent in patch operations (ms) */\n totalPatchTime: number;\n\n /** Total time spent in unmount operations (ms) */\n totalUnmountTime: number;\n\n /** Average mount time (ms) */\n averageMountTime: number;\n\n /** Average patch time (ms) */\n averagePatchTime: number;\n\n /** Average unmount time (ms) */\n averageUnmountTime: number;\n\n /** Maximum mount time (ms) */\n maxMountTime: number;\n\n /** Maximum patch time (ms) */\n maxPatchTime: number;\n\n /** Maximum unmount time (ms) */\n maxUnmountTime: number;\n\n /** Last render timestamp */\n lastRenderTime: number;\n}\n\n/**\n * Performance monitor options\n */\nexport interface PerformanceMonitorOptions {\n /** Maximum number of entries to keep in history */\n maxHistorySize?: number;\n\n /** Whether to enable monitoring by default */\n enabled?: boolean;\n\n /** Callback when a new entry is recorded */\n onEntry?: (entry: RenderPerformanceEntry) => void;\n\n /** Callback when stats are updated */\n onStatsUpdate?: (stats: ComponentPerformanceStats) => void;\n}\n\n// ==================== Performance Monitor Class ====================\n\n/**\n * PerformanceMonitor - Tracks component render performance\n *\n * @example\n * ```ts\n * const monitor = new PerformanceMonitor({ maxHistorySize: 100 });\n *\n * // Start timing a render\n * const endTiming = monitor.startTiming('MyComponent', 'patch');\n *\n * // ... perform render ...\n *\n * // End timing\n * endTiming();\n *\n * // Get stats\n * const stats = monitor.getStats('MyComponent');\n * console.log(`Average render time: ${stats?.averagePatchTime}ms`);\n * ```\n */\nexport class PerformanceMonitor {\n // FIX: P2-v11-17 使用环形缓冲区替代数组 + shift(),\n // 避免 history.shift() 的 O(n) 时间复杂度\n private historyBuffer: (RenderPerformanceEntry | null)[] = [];\n private historyHead = 0;\n private historyCount = 0;\n private stats: Map<string, ComponentPerformanceStats> = new Map();\n private options: Required<PerformanceMonitorOptions>;\n private _enabled: boolean;\n\n constructor(options: PerformanceMonitorOptions = {}) {\n this.options = {\n maxHistorySize: options.maxHistorySize ?? 1000,\n enabled: options.enabled ?? true,\n onEntry: options.onEntry ?? (() => {}),\n onStatsUpdate: options.onStatsUpdate ?? (() => {}),\n };\n this._enabled = this.options.enabled;\n }\n\n /**\n * Check if monitoring is enabled\n */\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Enable or disable monitoring\n */\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n /**\n * Start timing a render operation.\n * Returns a function that should be called when the operation completes.\n *\n * @param componentName - Name of the component being rendered\n * @param operation - Type of operation (mount, patch, unmount)\n * @param metadata - Optional metadata to attach to the entry\n * @returns A function to end the timing\n *\n * @example\n * ```ts\n * const endTiming = monitor.startTiming('MyComponent', 'patch');\n * // ... render logic ...\n * endTiming({ propsChanged: true });\n * ```\n */\n startTiming(\n componentName: string,\n operation: 'mount' | 'patch' | 'unmount',\n metadata?: Record<string, unknown>,\n ): (endMetadata?: Record<string, unknown>) => RenderPerformanceEntry | null {\n if (!this._enabled) {\n return () => null;\n }\n\n // FIX: P2-v11-16 添加 performance.now() 回退,\n // 在非浏览器环境(如 SSR、Node.js)中使用 Date.now() 替代\n const getTimestamp = (): number => {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n };\n\n const startTime = getTimestamp();\n\n return (endMetadata?: Record<string, unknown>) => {\n const endTime = getTimestamp();\n const duration = endTime - startTime;\n\n const entry: RenderPerformanceEntry = {\n componentName,\n operation,\n startTime,\n endTime,\n duration,\n metadata: { ...metadata, ...endMetadata },\n };\n\n this.recordEntry(entry);\n return entry;\n };\n }\n\n /**\n * Record a performance entry directly\n */\n recordEntry(entry: RenderPerformanceEntry): void {\n if (!this._enabled) return;\n\n // FIX: P2-v11-17 使用环形缓冲区写入,O(1) 操作\n if (this.historyBuffer.length < this.options.maxHistorySize) {\n this.historyBuffer.push(entry);\n this.historyCount++;\n } else {\n this.historyBuffer[this.historyHead] = entry;\n this.historyHead = (this.historyHead + 1) % this.options.maxHistorySize;\n // historyCount 保持为 maxHistorySize\n }\n\n // Update stats\n this.updateStats(entry);\n\n // Notify callback\n this.options.onEntry(entry);\n }\n\n /**\n * Update statistics for a component\n */\n private updateStats(entry: RenderPerformanceEntry): void {\n const { componentName, operation, duration } = entry;\n\n let stats = this.stats.get(componentName);\n if (!stats) {\n stats = {\n componentName,\n mountCount: 0,\n patchCount: 0,\n unmountCount: 0,\n totalMountTime: 0,\n totalPatchTime: 0,\n totalUnmountTime: 0,\n averageMountTime: 0,\n averagePatchTime: 0,\n averageUnmountTime: 0,\n maxMountTime: 0,\n maxPatchTime: 0,\n maxUnmountTime: 0,\n lastRenderTime: Date.now(),\n };\n this.stats.set(componentName, stats);\n }\n\n // Update counters and times\n switch (operation) {\n case 'mount':\n stats.mountCount++;\n stats.totalMountTime += duration;\n stats.averageMountTime = stats.totalMountTime / stats.mountCount;\n stats.maxMountTime = Math.max(stats.maxMountTime, duration);\n break;\n case 'patch':\n stats.patchCount++;\n stats.totalPatchTime += duration;\n stats.averagePatchTime = stats.totalPatchTime / stats.patchCount;\n stats.maxPatchTime = Math.max(stats.maxPatchTime, duration);\n break;\n case 'unmount':\n stats.unmountCount++;\n stats.totalUnmountTime += duration;\n stats.averageUnmountTime = stats.totalUnmountTime / stats.unmountCount;\n stats.maxUnmountTime = Math.max(stats.maxUnmountTime, duration);\n break;\n }\n\n stats.lastRenderTime = Date.now();\n this.options.onStatsUpdate(stats);\n }\n\n /**\n * Get performance statistics for a specific component\n */\n getStats(componentName: string): ComponentPerformanceStats | undefined {\n return this.stats.get(componentName);\n }\n\n /**\n * Get all component statistics\n */\n getAllStats(): ComponentPerformanceStats[] {\n return Array.from(this.stats.values());\n }\n\n /**\n * Get performance history\n * FIX: P2-v11-17 从环形缓冲区读取历史记录\n */\n getHistory(): RenderPerformanceEntry[] {\n const result: RenderPerformanceEntry[] = [];\n for (let i = 0; i < this.historyCount; i++) {\n const idx = (this.historyHead + i) % this.historyBuffer.length;\n const entry = this.historyBuffer[idx];\n if (entry) result.push(entry);\n }\n return result;\n }\n\n /**\n * Get history for a specific component\n */\n getComponentHistory(componentName: string): RenderPerformanceEntry[] {\n return this.getHistory().filter((entry) => entry.componentName === componentName);\n }\n\n /**\n * Get history for a specific operation type\n */\n getOperationHistory(operation: 'mount' | 'patch' | 'unmount'): RenderPerformanceEntry[] {\n return this.getHistory().filter((entry) => entry.operation === operation);\n }\n\n /**\n * Get the slowest renders\n */\n getSlowestRenders(limit: number = 10): RenderPerformanceEntry[] {\n return this.getHistory()\n .sort((a, b) => b.duration - a.duration)\n .slice(0, limit);\n }\n\n /**\n * Get average render time across all components\n */\n getGlobalAverageRenderTime(): number {\n const history = this.getHistory();\n if (history.length === 0) return 0;\n const total = history.reduce((sum, entry) => sum + entry.duration, 0);\n return total / history.length;\n }\n\n /**\n * Get total render time across all components\n */\n getGlobalTotalRenderTime(): number {\n return this.getHistory().reduce((sum, entry) => sum + entry.duration, 0);\n }\n\n /**\n * Clear all history and stats\n * FIX: P2 统一 clear/clearComponent 策略:使用 fill(null) 预分配固定大小缓冲区,\n * 与 clearComponent 保持一致的环形缓冲区重建方式,避免 clear 后缓冲区大小丢失\n */\n clear(): void {\n this.historyBuffer = new Array(this.options.maxHistorySize).fill(null);\n this.historyHead = 0;\n this.historyCount = 0;\n this.stats.clear();\n }\n\n /**\n * Clear history and stats for a specific component\n */\n clearComponent(componentName: string): boolean {\n // FIX: P2-batch2-12 修复 clearComponent 破坏环形缓冲区的问题。\n // 原实现直接将过滤后的数组赋值给 historyBuffer 并重置 head/tail,\n // 但丢失了环形缓冲区的固定大小约束。正确做法是重建固定大小的缓冲区。\n const filtered = this.getHistory().filter((entry) => entry.componentName !== componentName);\n // 重建固定大小的环形缓冲区\n this.historyBuffer = new Array(this.options.maxHistorySize).fill(null);\n this.historyHead = 0;\n this.historyCount = filtered.length;\n for (let i = 0; i < filtered.length; i++) {\n // FIX: DTS build error - 类型匹配\n this.historyBuffer[i] = filtered[i] as RenderPerformanceEntry | null;\n }\n return this.stats.delete(componentName);\n }\n\n /**\n * Generate a performance report\n */\n generateReport(): PerformanceReport {\n const allStats = this.getAllStats();\n const history = this.getHistory();\n const totalRenders = history.length;\n const totalRenderTime = this.getGlobalTotalRenderTime();\n const averageRenderTime = this.getGlobalAverageRenderTime();\n\n // Find slowest component\n const slowestComponent =\n allStats.length > 0\n ? allStats.reduce((slowest, current) => {\n const currentAvg = current.averagePatchTime || current.averageMountTime;\n const slowestAvg = slowest.averagePatchTime || slowest.averageMountTime;\n return currentAvg > slowestAvg ? current : slowest;\n })\n : null;\n\n // Find most rendered component\n const mostRenderedComponent =\n allStats.length > 0\n ? allStats.reduce((most, current) =>\n current.patchCount > most.patchCount ? current : most,\n )\n : null;\n\n return {\n timestamp: Date.now(),\n totalRenders,\n totalRenderTime,\n averageRenderTime,\n componentCount: allStats.length,\n slowestComponent: slowestComponent?.componentName ?? null,\n mostRenderedComponent: mostRenderedComponent?.componentName ?? null,\n componentStats: allStats,\n };\n }\n}\n\n/**\n * Performance report structure\n */\nexport interface PerformanceReport {\n /** Report generation timestamp */\n timestamp: number;\n\n /** Total number of render operations */\n totalRenders: number;\n\n /** Total time spent rendering (ms) */\n totalRenderTime: number;\n\n /** Average render time (ms) */\n averageRenderTime: number;\n\n /** Number of unique components tracked */\n componentCount: number;\n\n /** Name of the slowest component (by average render time) */\n slowestComponent: string | null;\n\n /** Name of the most rendered component */\n mostRenderedComponent: string | null;\n\n /** Detailed stats for each component */\n componentStats: ComponentPerformanceStats[];\n}\n\n// ==================== Global Instance ====================\n\n/** Global performance monitor instance */\nlet globalMonitor: PerformanceMonitor | null = null;\n\n/**\n * Get the global performance monitor instance\n * Creates one if it doesn't exist\n */\nexport function getPerformanceMonitor(): PerformanceMonitor {\n if (!globalMonitor) {\n globalMonitor = new PerformanceMonitor();\n }\n return globalMonitor;\n}\n\n/**\n * Set the global performance monitor instance\n */\nexport function setPerformanceMonitor(monitor: PerformanceMonitor): void {\n globalMonitor = monitor;\n}\n\n/**\n * Initialize the global performance monitor with options\n */\nexport function initPerformanceMonitor(\n options: PerformanceMonitorOptions = {},\n): PerformanceMonitor {\n globalMonitor = new PerformanceMonitor(options);\n return globalMonitor;\n}\n\n// ==================== Convenience Functions ====================\n\n/**\n * Start timing a component render operation using the global monitor\n */\nexport function startRenderTiming(\n componentName: string,\n operation: 'mount' | 'patch' | 'unmount',\n metadata?: Record<string, unknown>,\n): (endMetadata?: Record<string, unknown>) => RenderPerformanceEntry | null {\n return getPerformanceMonitor().startTiming(componentName, operation, metadata);\n}\n\n/**\n * Record a render entry using the global monitor\n */\nexport function recordRenderEntry(entry: RenderPerformanceEntry): void {\n getPerformanceMonitor().recordEntry(entry);\n}\n\n/**\n * Get component stats from the global monitor\n */\nexport function getComponentStats(componentName: string): ComponentPerformanceStats | undefined {\n return getPerformanceMonitor().getStats(componentName);\n}\n\n/**\n * Generate a performance report from the global monitor\n */\nexport function generatePerformanceReport(): PerformanceReport {\n return getPerformanceMonitor().generateReport();\n}\n\n/**\n * Check if performance monitoring is enabled\n */\nexport function isPerformanceMonitoringEnabled(): boolean {\n return globalMonitor?.enabled ?? false;\n}\n\n/**\n * Enable or disable performance monitoring\n */\nexport function setPerformanceMonitoringEnabled(enabled: boolean): void {\n const monitor = getPerformanceMonitor();\n monitor.enabled = enabled;\n}\n\n// ==================== Decorator / Wrapper ====================\n\n/**\n * Wrap a render function with performance monitoring\n *\n * @example\n * ```ts\n * const monitoredRender = withPerformanceTracking('MyComponent', (props) => {\n * return h('div', props.content);\n * });\n * ```\n */\nexport function withPerformanceTracking<T extends (...args: unknown[]) => unknown>(\n componentName: string,\n renderFn: T,\n operation: 'mount' | 'patch' | 'unmount' = 'patch',\n): T {\n return ((...args: unknown[]) => {\n const endTiming = startRenderTiming(componentName, operation);\n try {\n const result = renderFn(...args);\n endTiming();\n return result;\n } catch (error) {\n endTiming({ error: true });\n throw error;\n }\n }) as T;\n}\n\n// ==================== DevTools Integration ====================\n\n/**\n * Connect performance monitor to browser DevTools\n * Only works in development mode\n */\nexport function connectToDevTools(): void {\n if (typeof window === 'undefined') return;\n\n // Expose monitor to window for DevTools access\n // FIX: DTS build error - 先转换为 unknown 再转换为 Record\n (window as unknown as Record<string, unknown>).__LYTJS_PERFORMANCE_MONITOR__ =\n getPerformanceMonitor();\n\n // Mark initialization for DevTools detection\n (window as unknown as Record<string, unknown>).__LYTJS_DEVTOOLS_HOOK__ = true;\n\n if (__DEV__) {\n // FIX: P1-14 删除 require 调用,直接使用顶部已导入的 warn\n warn('Performance monitor connected to DevTools');\n }\n}\n"]}
package/package.json CHANGED
@@ -1,33 +1,33 @@
1
- {
2
- "name": "@lytjs/common-performance",
3
- "version": "6.4.0",
4
- "description": "Performance monitoring API for component render timing in LytJS",
5
- "main": "./dist/index.cjs",
6
- "module": "./dist/index.mjs",
7
- "types": "./dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.ts",
11
- "import": "./dist/index.mjs",
12
- "require": "./dist/index.cjs"
13
- }
14
- },
15
- "files": [
16
- "dist",
17
- "src"
18
- ],
19
- "scripts": {
20
- "build": "tsup",
21
- "type-check": "tsc --noEmit",
22
- "clean": "rm -rf dist"
23
- },
24
- "sideEffects": false,
25
- "license": "MIT",
26
- "dependencies": {
27
- "@lytjs/common-error": "^6.0.0"
28
- },
29
- "devDependencies": {
30
- "tsup": "^8.4.0",
31
- "typescript": "^5.8.2"
32
- }
33
- }
1
+ {
2
+ "name": "@lytjs/common-performance",
3
+ "version": "6.6.0",
4
+ "description": "Performance monitoring API for component render timing in LytJS",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.cjs"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "src"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "type-check": "tsc --noEmit",
22
+ "clean": "rm -rf dist"
23
+ },
24
+ "sideEffects": false,
25
+ "license": "MIT",
26
+ "dependencies": {
27
+ "@lytjs/common-error": "workspace:*"
28
+ },
29
+ "devDependencies": {
30
+ "tsup": "^8.4.0",
31
+ "typescript": "^5.8.2"
32
+ }
33
+ }