CoolFace
Apppublic

admin08077/Githubgemini

sourceHugging Faceotherupdated 10mo agoView on Hugging Face
0likes
PerformanceProfiler-CabPZOig.js.map1 linesDownload Raw Back to assets
1{"version":3,"file":"PerformanceProfiler-CabPZOig.js","sources":["../../services/profiling/performanceService.ts","../../services/profiling/bundleAnalyzer.ts","../../components/features/PerformanceProfiler.tsx"],"sourcesContent":["/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\nexport interface TraceEntry {\n    name: string;\n    startTime: number;\n    duration: number;\n    entryType: 'mark' | 'measure';\n}\n\nlet isTracing = false;\nconst TRACE_PREFIX = 'devcore-trace-';\n\nexport const startTracing = (): void => {\n    if (isTracing) {\n        console.warn('Tracing is already active.');\n        return;\n    }\n    performance.clearMarks();\n    performance.clearMeasures();\n    isTracing = true;\n    console.log('Performance tracing started.');\n};\n\nexport const stopTracing = (): TraceEntry[] => {\n    if (!isTracing) {\n        console.warn('Tracing is not active.');\n        return [];\n    }\n    isTracing = false;\n    console.log('Performance tracing stopped.');\n\n    const entries = performance.getEntries().filter(\n        entry => entry.name.startsWith(TRACE_PREFIX)\n    );\n\n    performance.clearMarks();\n    performance.clearMeasures();\n\n    return entries.map(entry => ({\n        name: entry.name.replace(TRACE_PREFIX, ''),\n        startTime: entry.startTime,\n        duration: entry.duration,\n        entryType: entry.entryType as 'mark' | 'measure',\n    }));\n};\n\nexport const mark = (name: string): void => {\n    if (!isTracing) return;\n    performance.mark(`${TRACE_PREFIX}${name}`);\n};\n\nexport const measure = (name: string, startMark: string, endMark: string): void => {\n    if (!isTracing) return;\n    try {\n        performance.measure(`${TRACE_PREFIX}${name}`, `${TRACE_PREFIX}${startMark}`, `${TRACE_PREFIX}${endMark}`);\n    } catch (e) {\n        console.error(`Failed to measure '${name}'`, e);\n    }\n};\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\nexport interface BundleStatsNode {\n    name: string;\n    value: number;\n    children?: BundleStatsNode[];\n}\n\n// This is a simplified parser for Vite's `stats.json` output.\n// A real-world implementation would need to handle different formats (Webpack, Rollup, etc.).\nexport const parseViteStats = (statsJson: string): BundleStatsNode => {\n    try {\n        const stats = JSON.parse(statsJson);\n        const root: BundleStatsNode = { name: 'root', value: 0, children: [] };\n\n        if (stats.output) { // Vite 5+ stats format\n             Object.entries(stats.output).forEach(([path, chunk]: [string, any]) => {\n                const node: BundleStatsNode = {\n                    name: path,\n                    value: chunk.size,\n                };\n                root.children?.push(node);\n                root.value += chunk.size;\n            });\n        }\n\n        return root;\n    } catch (error) {\n        console.error(\"Failed to parse bundle stats:\", error);\n        throw new Error(\"Invalid stats JSON format.\");\n    }\n};\n","import React, { useState, useCallback } from 'react';\nimport { analyzePerformanceTrace } from '../../services/index.ts';\nimport { startTracing, stopTracing, TraceEntry } from '../../services/profiling/performanceService.ts';\nimport { parseViteStats, BundleStatsNode } from '../../services/profiling/bundleAnalyzer.ts';\nimport { ChartBarIcon, SparklesIcon } from '../icons.tsx';\nimport { LoadingSpinner, MarkdownRenderer } from '../shared/index.tsx';\n\nconst FlameChart: React.FC<{ trace: TraceEntry[] }> = ({ trace }) => {\n    if (trace.length === 0) return <p className=\"text-text-secondary\">No trace data collected.</p>;\n    const maxTime = Math.max(...trace.map(t => t.startTime + t.duration));\n    return (\n        <div className=\"space-y-1 font-mono text-xs\">\n            {trace.filter(t => t.entryType === 'measure').map((entry, i) => (\n                <div key={i} className=\"group relative h-6 bg-primary/20 rounded\">\n                    <div className=\"h-full bg-primary\" style={{ marginLeft: `${(entry.startTime / maxTime) * 100}%`, width: `${(entry.duration / maxTime) * 100}%` }}></div>\n                    <div className=\"absolute inset-0 px-2 flex items-center text-primary font-bold\">{entry.name} ({entry.duration.toFixed(1)}ms)</div>\n                </div>\n            ))}\n        </div>\n    );\n};\n\nexport const PerformanceProfiler: React.FC = () => {\n    const [activeTab, setActiveTab] = useState<'runtime' | 'bundle'>('runtime');\n    const [isTracing, setIsTracing] = useState(false);\n    const [trace, setTrace] = useState<TraceEntry[]>([]);\n    const [bundleStats, setBundleStats] = useState<string>('');\n    const [bundleTree, setBundleTree] = useState<BundleStatsNode | null>(null);\n    const [isLoadingAi, setIsLoadingAi] = useState(false);\n    const [aiAnalysis, setAiAnalysis] = useState('');\n\n    const handleTraceToggle = () => {\n        if (isTracing) {\n            const collectedTrace = stopTracing();\n            setTrace(collectedTrace);\n            setIsTracing(false);\n        } else {\n            setTrace([]);\n            startTracing();\n            setIsTracing(true);\n        }\n    };\n\n    const handleAnalyzeBundle = () => {\n        try {\n            setBundleTree(parseViteStats(bundleStats));\n        } catch (e) {\n            alert(e instanceof Error ? e.message : 'Parsing failed.');\n        }\n    };\n    \n    const handleAiAnalysis = async () => {\n        const dataToAnalyze = activeTab === 'runtime' ? trace : bundleTree;\n        if (!dataToAnalyze || (Array.isArray(dataToAnalyze) && dataToAnalyze.length === 0)) {\n            alert('No data to analyze.');\n            return;\n        }\n        setIsLoadingAi(true);\n        setAiAnalysis('');\n        try {\n            const analysis = await analyzePerformanceTrace(dataToAnalyze);\n            setAiAnalysis(analysis);\n        } catch (e) {\n            setAiAnalysis('Error getting analysis from AI.');\n        } finally {\n            setIsLoadingAi(false);\n        }\n    };\n\n    return (\n        <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8 text-text-primary\">\n            <header className=\"mb-6\"><h1 className=\"text-3xl font-bold flex items-center\"><ChartBarIcon /><span className=\"ml-3\">AI Performance Profiler</span></h1><p className=\"text-text-secondary mt-1\">Analyze runtime performance and bundle sizes with AI insights.</p></header>\n            <div className=\"flex border-b border-border mb-4\"><button onClick={() => setActiveTab('runtime')} className={`px-4 py-2 text-sm ${activeTab === 'runtime' ? 'border-b-2 border-primary' : ''}`}>Runtime Performance</button><button onClick={() => setActiveTab('bundle')} className={`px-4 py-2 text-sm ${activeTab === 'bundle' ? 'border-b-2 border-primary' : ''}`}>Bundle Analysis</button></div>\n            <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 min-h-0\">\n                <div className=\"bg-surface p-4 border border-border rounded-lg flex flex-col\">\n                    {activeTab === 'runtime' ? (\n                        <>\n                            <button onClick={handleTraceToggle} className=\"btn-primary mb-4 py-2\">{isTracing ? 'Stop Tracing' : 'Start Tracing'}</button>\n                            <div className=\"flex-grow overflow-y-auto\"><FlameChart trace={trace} /></div>\n                        </>\n                    ) : (\n                         <>\n                            <textarea value={bundleStats} onChange={e => setBundleStats(e.target.value)} placeholder=\"Paste your stats.json content here\" className=\"w-full h-48 p-2 bg-background border rounded font-mono text-xs mb-2\"/>\n                            <button onClick={handleAnalyzeBundle} className=\"btn-primary py-2\">Analyze Bundle</button>\n                            <div className=\"flex-grow overflow-y-auto mt-2\">\n                                <pre className=\"text-xs\">{bundleTree ? JSON.stringify(bundleTree, null, 2) : 'Analysis will appear here.'}</pre>\n                            </div>\n                        </>\n                    )}\n                </div>\n                 <div className=\"bg-surface p-4 border border-border rounded-lg flex flex-col\">\n                    <button onClick={handleAiAnalysis} disabled={isLoadingAi} className=\"btn-primary flex items-center justify-center gap-2 py-2 mb-4\"><SparklesIcon />{isLoadingAi ? 'Analyzing...' : 'Get AI Optimization Suggestions'}</button>\n                    <div className=\"flex-grow bg-background border border-border rounded p-2 overflow-y-auto\">\n                        {isLoadingAi ? <div className=\"flex justify-center items-center h-full\"><LoadingSpinner/></div> : <MarkdownRenderer content={aiAnalysis} />}\n                    </div>\n                 </div>\n            </div>\n        </div>\n    );\n};"],"names":["isTracing","TRACE_PREFIX","startTracing","stopTracing","entries","entry","parseViteStats","statsJson","stats","root","path","chunk","node","error","FlameChart","trace","maxTime","jsxs","jsx","PerformanceProfiler","activeTab","setActiveTab","useState","setIsTracing","setTrace","bundleStats","setBundleStats","bundleTree","setBundleTree","isLoadingAi","setIsLoadingAi","aiAnalysis","setAiAnalysis","handleTraceToggle","collectedTrace","handleAnalyzeBundle","e","handleAiAnalysis","dataToAnalyze","analysis","analyzePerformanceTrace","ChartBarIcon","Fragment","SparklesIcon","LoadingSpinner","MarkdownRenderer"],"mappings":"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"}