@rsdoctor/components 1.3.13-beta.1 → 1.3.14

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,"file":"components/Charts/TreeMap.mjs","sources":["../../../src/components/Charts/TreeMap.tsx"],"sourcesContent":["import React, { useEffect, useState, memo, useMemo, useCallback } from 'react';\nimport EChartsReactCore from 'echarts-for-react/esm/core';\nimport * as echarts from 'echarts/core';\nimport { TreemapChart } from 'echarts/charts';\nimport { TooltipComponent } from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { Checkbox, Radio, Input } from 'antd';\nimport {\n LeftOutlined,\n RightOutlined,\n SearchOutlined,\n FullscreenOutlined,\n FullscreenExitOutlined,\n} from '@ant-design/icons';\nimport { formatSize } from 'src/utils';\nimport { SDK } from '@rsdoctor/types';\nimport { ServerAPIProvider } from 'src/components/Manifest';\nimport Styles from './treemap.module.scss';\nimport { TREE_COLORS } from './constants';\n\necharts.use([TreemapChart, TooltipComponent, CanvasRenderer]);\n\nexport type TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n};\n\nexport type SizeType = 'stat' | 'parsed' | 'gzip' | 'value';\n\ninterface TreeMapProps {\n treeData: TreeNode[];\n sizeType: SizeType;\n style?: React.CSSProperties;\n onChartClick?: (params: any) => void;\n highlightNodeId?: number;\n centerNodeId?: number;\n rootPath?: string;\n}\n\nfunction hashString(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash << 5) + hash + str.charCodeAt(i);\n }\n return hash >>> 0;\n}\n\nfunction blendWithWhite(hex: string, ratio: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n\n const blendedR = Math.round(r * ratio + 255 * (1 - ratio));\n const blendedG = Math.round(g * ratio + 255 * (1 - ratio));\n const blendedB = Math.round(b * ratio + 255 * (1 - ratio));\n\n return `#${blendedR.toString(16).padStart(2, '0')}${blendedG.toString(16).padStart(2, '0')}${blendedB.toString(16).padStart(2, '0')}`;\n}\n\nfunction getLevelOption() {\n return [\n {\n itemStyle: {\n borderWidth: 0,\n gapWidth: 2,\n },\n },\n {\n itemStyle: {\n borderColorAlpha: [1, 0.3],\n borderWidth: 5,\n gapWidth: 1,\n },\n upperLabel: {\n show: true,\n color: '#555555',\n height: 30,\n },\n emphasis: {\n itemStyle: {\n borderColor: '#ccc',\n },\n },\n },\n ];\n}\n\nconst TreeMapInner: React.FC<TreeMapProps & { forwardedRef?: React.Ref<any> }> =\n memo(\n ({\n treeData,\n sizeType,\n style,\n onChartClick,\n forwardedRef,\n highlightNodeId,\n centerNodeId,\n rootPath,\n }) => {\n const [option, setOption] = useState<any>(null);\n const chartRef = React.useRef<any>(null);\n const chartDataRef = React.useRef<any[]>([]);\n\n useEffect(() => {\n if (forwardedRef && chartRef.current) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(chartRef.current);\n } else {\n (forwardedRef as React.MutableRefObject<any>).current =\n chartRef.current;\n }\n }\n }, [forwardedRef, chartRef.current]);\n useEffect(() => {\n if (!treeData) return;\n function convert(\n node: TreeNode,\n index = 0,\n level = 0,\n parentColor?: string,\n siblingIndex = 0,\n siblingCount = 1,\n ): any {\n const baseColor =\n parentColor || TREE_COLORS[index % TREE_COLORS.length];\n\n const children = node.children?.map((c, childIndex) =>\n convert(\n c,\n index,\n level + 1,\n baseColor,\n childIndex,\n node.children?.length || 0,\n ),\n );\n\n let val = 0;\n if (sizeType === 'stat') val = node.sourceSize || 0;\n else if (sizeType === 'parsed') val = node.bundledSize || 0;\n else if (sizeType === 'gzip') val = node.gzipSize || 0;\n else if (sizeType === 'value') val = node.value || 0;\n\n if (!val && node.value) val = node.value;\n\n const nodeId = node.path\n ? hashString(node.path)\n : hashString(node.name || '');\n const isHighlighted = highlightNodeId === nodeId;\n\n const baseColorRatio =\n level === 0 ? 1 : Math.max(0.2, 1 - level * 0.2);\n const baseBorderRatio =\n level === 0 ? 1 : Math.max(0.3, 1 - level * 0.25);\n\n const siblingGradientRange = 0.15;\n const siblingRatio =\n siblingCount > 1\n ? 1 - (siblingIndex / (siblingCount - 1)) * siblingGradientRange\n : 1;\n\n const colorRatio = baseColorRatio * siblingRatio;\n const borderRatio = baseBorderRatio * siblingRatio;\n\n const nodeColor = isHighlighted\n ? '#fff5f5'\n : level === 0\n ? blendWithWhite(baseColor, 0.8)\n : blendWithWhite(baseColor, colorRatio);\n\n const nodeBorderColor = isHighlighted\n ? '#ff4d4f'\n : level === 0\n ? baseColor\n : blendWithWhite(baseColor, borderRatio);\n\n const result: any = {\n id: nodeId,\n name: node.name,\n value: val,\n path: node.path || node.name,\n sourceSize: node.sourceSize ?? (sizeType === 'stat' ? val : 0),\n bundledSize: node.bundledSize ?? (sizeType === 'parsed' ? val : 0),\n gzipSize: node.gzipSize ?? (sizeType === 'gzip' ? val : 0),\n itemStyle: {\n borderWidth: isHighlighted ? 4 : 1,\n color: nodeColor,\n borderColor: nodeBorderColor,\n ...(level === 0 && { gapWidth: 2 }),\n },\n };\n\n if (children && children.length > 0) {\n result.children = children;\n }\n\n if (isHighlighted) {\n result.emphasis = {\n itemStyle: {\n borderColor: '#ff4d4f',\n borderWidth: 4,\n color: '#fff5f5',\n },\n };\n }\n\n return result;\n }\n\n const data = treeData\n .map((item, index) =>\n convert(item, index, 0, undefined, index, treeData.length),\n )\n .filter(\n (item) =>\n item.value > 0 || (item.children && item.children.length > 0),\n );\n\n chartDataRef.current = data;\n\n setOption({\n color: TREE_COLORS,\n title: {\n text: 'Rsdoctor TreeMap',\n left: 'center',\n top: 10,\n textStyle: {\n fontSize: 16,\n fontWeight: 'bold',\n color: 'rgba(0, 0, 0, 0.8)',\n },\n },\n tooltip: {\n padding: 10,\n backgroundColor: '#fff',\n borderColor: '#eee',\n borderWidth: 1,\n textStyle: {\n color: 'rgba(0, 0, 0, 0.8)',\n },\n confine: true,\n extraCssText: 'max-width: 450px; word-wrap: break-word;',\n position: function (\n pos: any,\n _params: any,\n _dom: any,\n _rect: any,\n size: any,\n ) {\n var obj = { top: pos[1] + 10 };\n if (pos[0] < size.viewSize[0] / 2) {\n (obj as any).left = pos[0] + 10;\n } else {\n (obj as any).right = size.viewSize[0] - pos[0] + 10;\n }\n return obj;\n },\n formatter: function (info: any) {\n const node = info.data || {};\n const name = node.name;\n let path = node.path || name;\n\n if (rootPath && path) {\n const normalizedRoot = rootPath\n .replace(/\\\\/g, '/')\n .replace(/\\/$/, '');\n const normalizedPath = path.replace(/\\\\/g, '/');\n if (normalizedPath.startsWith(normalizedRoot + '/')) {\n path = normalizedPath.slice(normalizedRoot.length + 1);\n } else if (normalizedPath === normalizedRoot) {\n path = '';\n }\n }\n\n const sourceSize = node.sourceSize || node.value;\n const bundledSize = node.bundledSize;\n const gzipSize = node.gzipSize;\n\n function makeRow(label: string, value: string, color: string) {\n return `<div class=\"${Styles['tooltip-row']}\">\n <span class=\"${Styles['tooltip-label']}\" style=\"color: ${color};\">${label}</span>\n <span style=\"color: ${color};\">${value}</span>\n </div>`;\n }\n\n const rows = [];\n if (sourceSize !== undefined) {\n rows.push(\n makeRow('Stat size', formatSize(sourceSize), '#52c41a'),\n ); // Green\n }\n if (bundledSize !== undefined) {\n rows.push(\n makeRow('Parsed size', formatSize(bundledSize), '#fadb14'),\n ); // Yellow\n }\n if (gzipSize !== undefined) {\n rows.push(\n makeRow('Gzipped size', formatSize(gzipSize), '#1677ff'),\n ); // Blue\n }\n\n return `\n <div style=\"font-family: sans-serif; font-size: 12px; line-height: 1.5;\">\n <div style=\"margin-bottom: 6px; max-width: 400px; word-wrap: break-word; overflow-wrap: break-word; word-break: break-all; white-space: normal; color: rgba(0, 0, 0, 0.8);\">${echarts.format.encodeHTML(path)}</div>\n ${rows.join('')}\n </div>\n `;\n },\n },\n series: [\n {\n type: 'treemap',\n label: {\n show: true,\n formatter: '{b}',\n fontSize: 12,\n color: '#000',\n position: 'inside',\n fontWeight: 'normal',\n textBorderColor: '#fff',\n textBorderWidth: 2,\n padding: [4, 8, 4, 8],\n },\n upperLabel: {\n show: true,\n height: 30,\n color: '#000',\n fontSize: 12,\n fontWeight: 'normal',\n padding: [0, 0, 0, 4],\n },\n levels: getLevelOption(),\n data: data,\n breadcrumb: {\n show: true,\n left: 'center',\n top: 'bottom',\n height: 22,\n emptyItemWidth: 25,\n itemStyle: {\n color: '#999',\n borderColor: 'transparent',\n borderWidth: 0,\n borderRadius: 0,\n },\n emphasis: {\n itemStyle: {\n color: '#333',\n },\n },\n textStyle: {\n fontFamily: 'sans-serif',\n fontSize: 12,\n color: '#666',\n },\n },\n roam: true,\n nodeClick: false,\n zoomToNodeRatio: 0.5,\n animationDurationUpdate: 500,\n width: '100%',\n height: '100%',\n top: 40,\n bottom: 30,\n left: 0,\n right: 0,\n },\n ],\n });\n }, [treeData, sizeType, highlightNodeId, rootPath]);\n\n useEffect(() => {\n if (centerNodeId && chartRef.current && option) {\n const chartInstance = chartRef.current.getEchartsInstance();\n if (chartInstance) {\n const findNodeInfo = (\n data: any[],\n targetId: number,\n path: string[] = [],\n ): { name: string; path: string[] } | null => {\n for (const item of data) {\n const currentPath = [...path, item.name];\n if (item.id === targetId) {\n return { name: item.name, path: currentPath };\n }\n if (item.children) {\n const found = findNodeInfo(\n item.children,\n targetId,\n currentPath,\n );\n if (found) return found;\n }\n }\n return null;\n };\n\n setTimeout(() => {\n const nodeInfo = findNodeInfo(chartDataRef.current, centerNodeId);\n if (!nodeInfo) return;\n\n try {\n chartInstance.dispatchAction({\n type: 'highlight',\n seriesIndex: 0,\n name: nodeInfo.name,\n });\n } catch (e) {}\n\n const zoomStrategies: Array<() => void> = [\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n targetNodeId: String(centerNodeId),\n }),\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeInfo.name,\n }),\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeInfo.path.join('/'),\n }),\n () =>\n nodeInfo.path.length > 0 &&\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeInfo.path[nodeInfo.path.length - 1],\n }),\n ];\n\n for (const strategy of zoomStrategies) {\n try {\n strategy();\n return;\n } catch (e) {\n console.error(\n 'Failed to zoom to node with id:',\n centerNodeId,\n e,\n );\n }\n }\n\n console.warn('Failed to zoom to node with id:', centerNodeId);\n }, 200);\n }\n }\n }, [centerNodeId, option]);\n\n return option ? (\n <div className={Styles['chart-container']} style={style}>\n <EChartsReactCore\n ref={chartRef}\n option={option}\n echarts={echarts}\n onEvents={{\n click: (params: any) => {\n if (chartRef.current) {\n const instance = chartRef.current.getEchartsInstance();\n if (instance && params?.data?.id) {\n instance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n targetNodeId: String(params.data.id),\n });\n }\n }\n onChartClick?.(params);\n },\n }}\n style={{\n width: '100%',\n height: '100%',\n }}\n />\n </div>\n ) : null;\n },\n );\n\nexport const TreeMap = React.forwardRef<any, TreeMapProps>((props, ref) => (\n <TreeMapInner {...props} forwardedRef={ref} />\n));\n\nexport const AssetTreemapWithFilter: React.FC<{\n treeData: TreeNode[];\n onChartClick?: (params: any) => void;\n bundledSize?: boolean;\n}> = ({ treeData, onChartClick, bundledSize = true }) => {\n return (\n <ServerAPIProvider api={SDK.ServerAPI.API.GetProjectInfo}>\n {(projectInfo) => {\n return (\n <AssetTreemapWithFilterInner\n treeData={treeData}\n onChartClick={onChartClick}\n bundledSize={bundledSize}\n rootPath={projectInfo.root}\n />\n );\n }}\n </ServerAPIProvider>\n );\n};\n\nconst AssetTreemapWithFilterInner: React.FC<{\n treeData: TreeNode[];\n onChartClick?: (params: any) => void;\n bundledSize?: boolean;\n rootPath: string;\n}> = ({ treeData, onChartClick, bundledSize = true, rootPath }) => {\n const assetNames = useMemo(\n () => treeData.map((item) => item.name),\n [treeData],\n );\n\n const [checkedAssets, setCheckedAssets] = useState<string[]>(assetNames);\n const [collapsed, setCollapsed] = useState(false);\n const [sizeType, setSizeType] = useState<SizeType>(\n bundledSize ? 'parsed' : 'stat',\n );\n const [searchQuery, setSearchQuery] = useState('');\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [highlightNodeId, setHighlightNodeId] = useState<number | undefined>();\n const [centerNodeId, setCenterNodeId] = useState<number | undefined>();\n\n const chartRef = React.useRef<any>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const enterFullscreen = useCallback(() => {\n if (containerRef.current) {\n containerRef.current\n .requestFullscreen()\n .then(() => setIsFullscreen(true))\n .catch((err) => console.error('Failed to enter fullscreen:', err));\n }\n }, []);\n\n const exitFullscreen = useCallback(() => {\n document\n .exitFullscreen()\n .then(() => setIsFullscreen(false))\n .catch((err) => console.error('Failed to exit fullscreen:', err));\n }, []);\n\n const toggleFullscreen = useCallback(() => {\n if (isFullscreen) {\n exitFullscreen();\n } else {\n enterFullscreen();\n }\n }, [isFullscreen, enterFullscreen, exitFullscreen]);\n\n useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n const searchResults = useMemo(() => {\n if (!searchQuery.trim()) return [];\n\n const regex = new RegExp(searchQuery, 'i');\n const results: Array<{ path: string; nodeId: number }> = [];\n\n const collectMatchingPaths = (node: TreeNode) => {\n if (node.path && regex.test(node.path)) {\n const nodeId = hashString(node.path);\n results.push({ path: node.path, nodeId });\n }\n if (node.children) {\n node.children.forEach(collectMatchingPaths);\n }\n };\n\n treeData.forEach(collectMatchingPaths);\n return results;\n }, [treeData, searchQuery]);\n\n const filteredTreeData = useMemo(() => {\n let filtered = treeData.filter((item) => checkedAssets.includes(item.name));\n\n return filtered;\n }, [treeData, checkedAssets]);\n\n const handleSearchResultClick = useCallback((nodeId: number) => {\n setHighlightNodeId(nodeId);\n setCenterNodeId(nodeId);\n }, []);\n\n const removeRootPath = useCallback(\n (filepath: string): string => {\n if (!rootPath || !filepath) return filepath;\n const normalizedRoot = rootPath.replace(/\\\\/g, '/').replace(/\\/$/, '');\n const normalizedPath = filepath.replace(/\\\\/g, '/');\n\n if (normalizedPath.startsWith(normalizedRoot + '/')) {\n return normalizedPath.slice(normalizedRoot.length + 1);\n } else if (normalizedPath === normalizedRoot) {\n return '';\n }\n return filepath;\n },\n [rootPath],\n );\n\n const getSize = useCallback((node: TreeNode, type?: SizeType) => {\n if (type === 'stat') return node.sourceSize || 0;\n if (type === 'parsed') return node.bundledSize || 0;\n if (type === 'gzip') return node.gzipSize || 0;\n if (type === 'value') return node.value || 0;\n if (node.value) return node.value;\n return 0;\n }, []);\n\n const calculateNodeTotalSize = useCallback(\n (node: TreeNode, type: SizeType): number => {\n let size = getSize(node, type);\n\n if (node.children && node.children.length > 0) {\n const childrenSize = node.children.reduce(\n (sum, child) => sum + calculateNodeTotalSize(child, type),\n 0,\n );\n if (size === 0 || (!node.path && childrenSize > 0)) {\n size = childrenSize;\n }\n }\n\n return size;\n },\n [getSize],\n );\n\n const getChunkSize = useCallback(\n (name: string, type?: SizeType) => {\n const node = treeData.find((n) => n.name === name);\n if (!node) return 0;\n const sizeTypeToUse = type || sizeType;\n return calculateNodeTotalSize(node, sizeTypeToUse);\n },\n [treeData, sizeType, calculateNodeTotalSize],\n );\n\n return (\n <div className={Styles.treemap} ref={containerRef}>\n <button\n className={Styles['fullscreen-button']}\n onClick={toggleFullscreen}\n title={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n >\n {isFullscreen ? <FullscreenExitOutlined /> : <FullscreenOutlined />}\n </button>\n\n <div className={`${Styles.sidebar} ${collapsed ? Styles.collapsed : ''}`}>\n <div\n className={`${Styles['sidebar-toggle']} ${collapsed ? Styles.collapsed : ''}`}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <RightOutlined /> : <LeftOutlined />}\n </div>\n <div className={Styles['sidebar-content']}>\n <div>\n <h4>Treemap sizes</h4>\n <Radio.Group\n value={sizeType}\n onChange={(e) => setSizeType(e.target.value)}\n size=\"small\"\n buttonStyle=\"solid\"\n >\n <Radio.Button value=\"stat\">Stat</Radio.Button>\n <Radio.Button value=\"parsed\">Parsed</Radio.Button>\n <Radio.Button value=\"gzip\">Gzipped</Radio.Button>\n </Radio.Group>\n </div>\n\n <div>\n <h4>Search modules</h4>\n <Input\n placeholder=\"Enter regexp\"\n value={searchQuery}\n onChange={(e) => {\n setSearchQuery(e.target.value);\n setHighlightNodeId(undefined);\n setCenterNodeId(undefined);\n }}\n suffix={<SearchOutlined style={{ color: '#ccc' }} />}\n allowClear\n size=\"small\"\n />\n {searchQuery.trim() && searchResults.length > 0 && (\n <div className={Styles['search-results']}>\n <div className={Styles['search-results-header']}>\n Found {searchResults.length} file\n {searchResults.length > 1 ? 's' : ''}\n </div>\n <div className={Styles['search-results-list']}>\n {searchResults.map((result, index) => {\n const displayPath = removeRootPath(result.path);\n return (\n <div\n key={index}\n className={Styles['search-result-item']}\n onClick={() => handleSearchResultClick(result.nodeId)}\n title={result.path}\n >\n {displayPath || result.path}\n </div>\n );\n })}\n </div>\n </div>\n )}\n {searchQuery.trim() && searchResults.length === 0 && (\n <div className={Styles['search-results-empty']}>\n No files found matching \"{searchQuery}\"\n </div>\n )}\n </div>\n\n <div>\n <h4>Show chunks</h4>\n <Checkbox\n indeterminate={\n checkedAssets.length > 0 &&\n checkedAssets.length < assetNames.length\n }\n checked={checkedAssets.length === assetNames.length}\n onChange={(e) =>\n setCheckedAssets(e.target.checked ? assetNames : [])\n }\n className={Styles['all-none-checkbox']}\n >\n All\n </Checkbox>\n <div className={Styles['chunk-list']}>\n {assetNames.map((name) => (\n <div key={name} className={Styles['chunk-item']}>\n <Checkbox\n checked={checkedAssets.includes(name)}\n onChange={(e) => {\n if (e.target.checked) {\n setCheckedAssets([...checkedAssets, name]);\n } else {\n setCheckedAssets(\n checkedAssets.filter((a) => a !== name),\n );\n }\n }}\n >\n <span title={name}>{name}</span>\n </Checkbox>\n <span className={Styles['size-tag']}>\n {formatSize(getChunkSize(name, 'value'))}\n </span>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n <div className={Styles['chart-wrapper']}>\n <TreeMap\n ref={chartRef}\n treeData={filteredTreeData}\n sizeType={sizeType}\n onChartClick={onChartClick}\n highlightNodeId={highlightNodeId}\n centerNodeId={centerNodeId}\n rootPath={rootPath}\n style={{ width: '100%', height: '100%' }}\n />\n </div>\n </div>\n );\n};\n"],"names":["echarts","TreemapChart","TooltipComponent","CanvasRenderer","hashString","str","hash","i","blendWithWhite","hex","ratio","r","parseInt","g","b","blendedR","Math","blendedG","blendedB","getLevelOption","TreeMapInner","memo","treeData","sizeType","style","onChartClick","forwardedRef","highlightNodeId","centerNodeId","rootPath","option","setOption","useState","chartRef","React","chartDataRef","useEffect","convert","node","index","level","parentColor","siblingIndex","siblingCount","baseColor","TREE_COLORS","children","c","childIndex","val","nodeId","isHighlighted","baseColorRatio","baseBorderRatio","siblingGradientRange","siblingRatio","colorRatio","borderRatio","nodeColor","nodeBorderColor","result","data","item","undefined","pos","_params","_dom","_rect","size","obj","info","name","path","normalizedRoot","normalizedPath","sourceSize","bundledSize","gzipSize","makeRow","label","value","color","Styles","rows","formatSize","chartInstance","findNodeInfo","targetId","currentPath","found","setTimeout","nodeInfo","e","zoomStrategies","String","strategy","console","EChartsReactCore","params","instance","TreeMap","props","ref","AssetTreemapWithFilter","ServerAPIProvider","SDK","projectInfo","AssetTreemapWithFilterInner","assetNames","useMemo","checkedAssets","setCheckedAssets","collapsed","setCollapsed","setSizeType","searchQuery","setSearchQuery","isFullscreen","setIsFullscreen","setHighlightNodeId","setCenterNodeId","containerRef","enterFullscreen","useCallback","err","exitFullscreen","document","toggleFullscreen","handleFullscreenChange","searchResults","regex","RegExp","results","collectMatchingPaths","filteredTreeData","filtered","handleSearchResultClick","removeRootPath","filepath","getSize","type","calculateNodeTotalSize","childrenSize","sum","child","getChunkSize","n","sizeTypeToUse","FullscreenExitOutlined","FullscreenOutlined","RightOutlined","LeftOutlined","Radio","Input","SearchOutlined","displayPath","Checkbox","a"],"mappings":"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"}
1
+ {"version":3,"file":"components/Charts/TreeMap.mjs","sources":["../../../src/components/Charts/TreeMap.tsx"],"sourcesContent":["import React, { useEffect, useState, memo, useMemo, useCallback } from 'react';\nimport EChartsReactCore from 'echarts-for-react/esm/core';\nimport * as echarts from 'echarts/core';\nimport { TreemapChart, type TreemapSeriesOption } from 'echarts/charts';\nimport {\n TooltipComponent,\n TitleComponent,\n type TooltipComponentOption,\n type TitleComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { Alert, Checkbox, Radio, Input } from 'antd';\nimport {\n LeftOutlined,\n RightOutlined,\n SearchOutlined,\n FullscreenOutlined,\n FullscreenExitOutlined,\n} from '@ant-design/icons';\nimport type { ComposeOption, EChartsType } from 'echarts/core';\nimport { formatSize } from 'src/utils';\nimport { SDK } from '@rsdoctor/types';\nimport { ServerAPIProvider } from 'src/components/Manifest';\nimport { ModuleAnalyzeComponent } from '../../pages/ModuleAnalyze';\nimport Styles from './treemap.module.scss';\nimport { TREE_COLORS } from './constants';\nimport type {\n CallbackDataParams,\n ECElementEvent,\n} from 'echarts/types/dist/shared';\n\ntype TreeMapOption = ComposeOption<\n TreemapSeriesOption | TooltipComponentOption | TitleComponentOption\n>;\n\ntype TreemapDataNode = NonNullable<TreemapSeriesOption['data']>[number] & {\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n moduleId?: string | number;\n};\n\necharts.use([TreemapChart, TooltipComponent, TitleComponent, CanvasRenderer]);\n\nexport type TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n id?: string | number;\n};\n\nexport type SizeType = 'stat' | 'parsed' | 'gzip' | 'value';\n\ninterface TreeMapProps {\n treeData: TreeNode[];\n sizeType: SizeType;\n style?: React.CSSProperties;\n onChartClick?: (params: ECElementEvent) => void;\n highlightNodeId?: number;\n centerNodeId?: number;\n rootPath?: string;\n}\n\nfunction hashString(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash << 5) + hash + str.charCodeAt(i);\n }\n return hash >>> 0;\n}\n\nfunction blendWithWhite(hex: string, ratio: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n\n const blendedR = Math.round(r * ratio + 255 * (1 - ratio));\n const blendedG = Math.round(g * ratio + 255 * (1 - ratio));\n const blendedB = Math.round(b * ratio + 255 * (1 - ratio));\n\n return `#${blendedR.toString(16).padStart(2, '0')}${blendedG.toString(16).padStart(2, '0')}${blendedB.toString(16).padStart(2, '0')}`;\n}\n\nfunction getLuminance(hex: string): number {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n\n const [rs, gs, bs] = [r, g, b].map((val) => {\n return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);\n });\n\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n}\n\nfunction isDarkColor(hex: string): boolean {\n return getLuminance(hex) < 0.4;\n}\n\nfunction getLevelOption() {\n return [\n {\n itemStyle: {\n borderWidth: 0,\n gapWidth: 4,\n gapColor: '#ffffff',\n },\n },\n {\n itemStyle: {\n borderColorAlpha: [1, 0.3],\n borderWidth: 5,\n gapWidth: 4,\n gapColor: '#ffffff',\n },\n upperLabel: {\n show: true,\n color: '#ffffff',\n fontSize: 14,\n height: 30,\n },\n },\n ];\n}\n\nconst TreeMapInner: React.FC<\n TreeMapProps & { forwardedRef?: React.Ref<EChartsReactCore> }\n> = memo(\n ({\n treeData,\n sizeType,\n style,\n onChartClick,\n forwardedRef,\n highlightNodeId,\n centerNodeId,\n rootPath,\n }) => {\n const [option, setOption] = useState<TreeMapOption | null>(null);\n const chartRef = React.useRef<EChartsReactCore | null>(null);\n const chartDataRef = React.useRef<TreemapDataNode[]>([]);\n const clickTimeoutRef = React.useRef<number | null>(null);\n\n useEffect(() => {\n if (forwardedRef && chartRef.current) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(chartRef.current);\n } else {\n (\n forwardedRef as React.MutableRefObject<EChartsReactCore | null>\n ).current = chartRef.current;\n }\n }\n }, [forwardedRef, chartRef.current]);\n useEffect(() => {\n if (!treeData) return;\n function convert(\n node: TreeNode,\n index = 0,\n level = 0,\n parentColor?: string,\n siblingIndex = 0,\n siblingCount = 1,\n ): TreemapDataNode {\n const baseColor =\n parentColor || TREE_COLORS[index % TREE_COLORS.length];\n\n const children = node.children?.map((c, childIndex) =>\n convert(\n c,\n index,\n level + 1,\n baseColor,\n childIndex,\n node.children?.length || 0,\n ),\n );\n\n let val = 0;\n if (sizeType === 'stat') val = node.sourceSize || 0;\n else if (sizeType === 'parsed') val = node.bundledSize || 0;\n else if (sizeType === 'gzip') val = node.gzipSize || 0;\n else if (sizeType === 'value') val = node.value || 0;\n\n if (!val && node.value) val = node.value;\n\n const nodeId = node.path\n ? hashString(node.path)\n : hashString(node.name || '');\n const isHighlighted = highlightNodeId === nodeId;\n\n const baseColorRatio =\n level === 0 ? 1 : Math.max(0.35, 1 - level * 0.15);\n const baseBorderRatio =\n level === 0 ? 1 : Math.max(0.4, 1 - level * 0.15);\n\n const siblingGradientRange = 0.15;\n const siblingRatio =\n siblingCount > 1\n ? 1 - (siblingIndex / (siblingCount - 1)) * siblingGradientRange\n : 1;\n\n const colorRatio = baseColorRatio * siblingRatio;\n const borderRatio = baseBorderRatio * siblingRatio;\n\n const nodeColor = isHighlighted\n ? '#fff5f5'\n : level === 0\n ? blendWithWhite(baseColor, 0.8)\n : blendWithWhite(baseColor, colorRatio);\n\n const nodeBorderColor = isHighlighted\n ? '#ff4d4f'\n : level === 0\n ? baseColor\n : blendWithWhite(baseColor, borderRatio);\n\n const isDark = isDarkColor(nodeColor);\n const textColor = isDark ? '#ffffff' : '#000000';\n const textBorderColor = isDark\n ? 'rgba(255, 255, 255, 0.2)'\n : 'rgba(0, 0, 0, 0.1)';\n\n const result: TreemapDataNode = {\n id: nodeId,\n name: node.name,\n value: val,\n path: node.path || node.name,\n sourceSize:\n node.sourceSize ?? (sizeType === 'stat' ? val : undefined),\n bundledSize:\n node.bundledSize ?? (sizeType === 'parsed' ? val : undefined),\n gzipSize: node.gzipSize ?? (sizeType === 'gzip' ? val : undefined),\n moduleId: node.id,\n itemStyle: {\n borderWidth: isHighlighted ? 4 : 1,\n color: nodeColor,\n borderColor: nodeBorderColor,\n ...(level === 0 && { gapWidth: 2 }),\n },\n label: {\n show: true,\n color: textColor,\n textBorderColor: textBorderColor,\n textBorderWidth: 1,\n },\n upperLabel:\n level === 0\n ? undefined\n : {\n show: true,\n color: textColor,\n },\n };\n\n if (children && children.length > 0) {\n result.children = children;\n }\n\n if (isHighlighted) {\n result.emphasis = {\n itemStyle: {\n borderColor: '#ff4d4f',\n borderWidth: 4,\n color: '#fff5f5',\n },\n };\n } else {\n // Keep the same color on hover/click to prevent color change\n result.emphasis = {\n itemStyle: {\n color: nodeColor,\n borderColor: nodeBorderColor,\n borderWidth: isHighlighted ? 4 : 1,\n },\n };\n }\n\n return result;\n }\n\n const data = treeData\n .map((item, index) =>\n convert(item, index, 0, undefined, index, treeData.length),\n )\n .filter(\n (item) =>\n (typeof item.value === 'number' ? item.value > 0 : false) ||\n (item.children && item.children.length > 0),\n );\n\n chartDataRef.current = data;\n\n setOption({\n color: TREE_COLORS,\n tooltip: {\n padding: 10,\n backgroundColor: '#fff',\n borderColor: '#eee',\n borderWidth: 1,\n textStyle: {\n color: 'rgba(0, 0, 0, 0.8)',\n },\n confine: true,\n extraCssText: 'max-width: 450px; word-wrap: break-word;',\n position: function (pos, _params, _dom, _rect, size) {\n const obj: { top: number; left?: number; right?: number } = {\n top: pos[1] + 10,\n };\n if (pos[0] < size.viewSize[0] / 2) {\n obj.left = pos[0] + 10;\n } else {\n obj.right = size.viewSize[0] - pos[0] + 10;\n }\n return obj;\n } as TooltipComponentOption['position'],\n formatter: function (\n info: CallbackDataParams & { data?: TreemapDataNode },\n ) {\n const node = info.data || {};\n let path =\n typeof node.path === 'string'\n ? node.path\n : typeof node.name === 'string'\n ? node.name\n : String(node.name ?? '');\n\n if (rootPath && path) {\n const normalizedRoot = rootPath\n .replace(/\\\\/g, '/')\n .replace(/\\/$/, '');\n const normalizedPath = path.replace(/\\\\/g, '/');\n if (normalizedPath.startsWith(normalizedRoot + '/')) {\n path = normalizedPath.slice(normalizedRoot.length + 1);\n } else if (normalizedPath === normalizedRoot) {\n path = '';\n }\n }\n\n const sourceSize =\n typeof node.sourceSize === 'number' && node.sourceSize > 0\n ? node.sourceSize\n : typeof node.value === 'number' &&\n node.value > 0 &&\n sizeType === 'stat'\n ? node.value\n : undefined;\n const bundledSize =\n typeof node.bundledSize === 'number' && node.bundledSize > 0\n ? node.bundledSize\n : undefined;\n const gzipSize =\n typeof node.gzipSize === 'number' && node.gzipSize > 0\n ? node.gzipSize\n : undefined;\n\n function makeRow(label: string, value: string, color: string) {\n return `<div class=\"${Styles['tooltip-row']}\">\n <span class=\"${Styles['tooltip-label']}\" style=\"color: ${color};\">${label}</span>\n <span style=\"color: ${color};\">${value}</span>\n </div>`;\n }\n\n const rows = [];\n if (sourceSize !== undefined && sourceSize > 0) {\n rows.push(\n makeRow('Stat size', formatSize(sourceSize), '#52c41a'),\n );\n }\n if (bundledSize !== undefined && bundledSize > 0) {\n rows.push(\n makeRow('Parsed size', formatSize(bundledSize), '#d96420'),\n );\n }\n if (gzipSize !== undefined && gzipSize > 0) {\n rows.push(\n makeRow('Gzipped size', formatSize(gzipSize), '#1677ff'),\n );\n }\n\n return `\n <div style=\"font-family: sans-serif; font-size: 12px; line-height: 1.5;\">\n <div style=\"margin-bottom: 6px; max-width: 400px; word-wrap: break-word; overflow-wrap: break-word; word-break: break-all; white-space: normal; color: rgba(0, 0, 0, 0.8);\">${echarts.format.encodeHTML(path)}</div>\n ${rows.join('')}\n </div>\n `;\n },\n } as TooltipComponentOption,\n series: [\n {\n type: 'treemap',\n itemStyle: {\n gapColor: '#ffffff',\n },\n label: {\n show: true,\n formatter: '{b}',\n fontSize: 12,\n position: 'inside',\n fontWeight: 'normal',\n textBorderWidth: 1,\n padding: [4, 8, 4, 8],\n },\n upperLabel: {\n show: true,\n height: 30,\n fontSize: 12,\n fontWeight: 'normal',\n padding: [0, 0, 0, 4],\n },\n levels: getLevelOption(),\n data: data,\n breadcrumb: {\n show: true,\n left: 'center',\n top: 'bottom',\n height: 22,\n emptyItemWidth: 25,\n itemStyle: {\n color: '#999',\n borderColor: 'transparent',\n borderWidth: 0,\n borderRadius: 0,\n },\n emphasis: {\n itemStyle: {\n color: '#333',\n },\n },\n textStyle: {\n fontFamily: 'sans-serif',\n fontSize: 12,\n color: '#666',\n },\n },\n roam: true,\n nodeClick: false,\n zoomToNodeRatio: 0.7,\n animationDurationUpdate: 500,\n width: '100%',\n height: '100%',\n top: -10,\n bottom: 30,\n left: 0,\n right: 0,\n zoomLimit: {\n min: 0.5,\n max: 5,\n },\n } as TreemapSeriesOption,\n ],\n });\n }, [treeData, sizeType, highlightNodeId, rootPath]);\n\n useEffect(() => {\n if (centerNodeId && chartRef.current && option) {\n const chartInstance =\n chartRef.current.getEchartsInstance() as unknown as EChartsType;\n if (chartInstance) {\n const findNodeInfo = (\n data: TreemapDataNode[],\n targetId: number,\n path: string[] = [],\n ): { name: string; path: string[] } | null => {\n for (const item of data) {\n const itemName =\n typeof item.name === 'string'\n ? item.name\n : String(item.name ?? '');\n const currentPath = [...path, itemName];\n if (item.id === targetId) {\n return { name: itemName, path: currentPath };\n }\n if (item.children) {\n const found = findNodeInfo(\n item.children,\n targetId,\n currentPath,\n );\n if (found) return found;\n }\n }\n return null;\n };\n\n setTimeout(() => {\n const nodeInfo = findNodeInfo(chartDataRef.current, centerNodeId);\n if (!nodeInfo) return;\n const nodeName = nodeInfo.name;\n\n try {\n chartInstance.dispatchAction({\n type: 'highlight',\n seriesIndex: 0,\n name: nodeName,\n });\n } catch (e) {\n console.error('Failed to highlight node with name:', nodeName, e);\n }\n\n const zoomStrategies: Array<() => void> = [\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n targetNodeId: String(centerNodeId),\n }),\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeName,\n }),\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeInfo.path.join('/'),\n }),\n () =>\n nodeInfo.path.length > 0 &&\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeInfo.path[nodeInfo.path.length - 1],\n }),\n ];\n\n for (const strategy of zoomStrategies) {\n try {\n strategy();\n return;\n } catch (e) {\n console.error(\n 'Failed to zoom to node with id:',\n centerNodeId,\n e,\n );\n }\n }\n\n console.warn('Failed to zoom to node with id:', centerNodeId);\n }, 200);\n }\n }\n }, [centerNodeId, option]);\n\n useEffect(() => {\n return () => {\n if (clickTimeoutRef.current) {\n window.clearTimeout(clickTimeoutRef.current);\n }\n };\n }, []);\n\n return option ? (\n <div className={Styles['chart-container']} style={style}>\n <Alert\n message=\"If parsed size lacks detailed module information, you can enable sourceMap when RSDOCTOR = true. This is because Rsdoctor relies on SourceMap to obtain Parsed Size. Rspack provides SourceMap information to Rsdoctor by default without affecting the build output.\"\n type=\"info\"\n showIcon\n style={{ marginBottom: 0 }}\n />\n <EChartsReactCore\n ref={chartRef}\n option={option}\n echarts={echarts}\n onEvents={{\n click: (params: ECElementEvent) => {\n // Delay to differentiate from double-click; only zoom on single click\n if (clickTimeoutRef.current) {\n window.clearTimeout(clickTimeoutRef.current);\n }\n clickTimeoutRef.current = window.setTimeout(() => {\n if (chartRef.current) {\n const instance =\n chartRef.current.getEchartsInstance() as unknown as EChartsType;\n const data = params?.data as TreemapDataNode | undefined;\n if (instance && data?.id !== undefined) {\n instance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n targetNodeId: String(data.id),\n });\n }\n }\n }, 180);\n },\n dblclick: (params: ECElementEvent) => {\n // Double click: cancel pending single-click action and trigger analyze\n if (clickTimeoutRef.current) {\n window.clearTimeout(clickTimeoutRef.current);\n clickTimeoutRef.current = null;\n }\n onChartClick?.(params);\n },\n }}\n style={{\n width: '100%',\n height: '100%',\n }}\n />\n </div>\n ) : null;\n },\n);\n\nexport const TreeMap = React.forwardRef<EChartsReactCore, TreeMapProps>(\n (props, ref) => <TreeMapInner {...props} forwardedRef={ref} />,\n);\n\nexport const AssetTreemapWithFilter: React.FC<{\n treeData: TreeNode[];\n onChartClick?: (params: ECElementEvent) => void;\n bundledSize?: boolean;\n}> = ({ treeData, onChartClick, bundledSize = true }) => {\n return (\n <ServerAPIProvider api={SDK.ServerAPI.API.GetProjectInfo}>\n {(projectInfo) => {\n return (\n <AssetTreemapWithFilterInner\n treeData={treeData}\n onChartClick={onChartClick}\n bundledSize={bundledSize}\n rootPath={projectInfo.root}\n />\n );\n }}\n </ServerAPIProvider>\n );\n};\n\nconst AssetTreemapWithFilterInner: React.FC<{\n treeData: TreeNode[];\n onChartClick?: (params: ECElementEvent) => void;\n bundledSize?: boolean;\n rootPath: string;\n}> = ({ treeData, onChartClick, bundledSize = true, rootPath }) => {\n const assetNames = useMemo(\n () => treeData.map((item) => item.name),\n [treeData],\n );\n\n const [checkedAssets, setCheckedAssets] = useState<string[]>(assetNames);\n const [collapsed, setCollapsed] = useState(false);\n const [sizeType, setSizeType] = useState<SizeType>(\n bundledSize ? 'parsed' : 'stat',\n );\n const [searchQuery, setSearchQuery] = useState('');\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [highlightNodeId, setHighlightNodeId] = useState<number | undefined>();\n const [centerNodeId, setCenterNodeId] = useState<number | undefined>();\n const [moduleId, setModuleId] = useState<string | number>('');\n const [showAnalyze, setShowAnalyze] = useState(false);\n const [chunkSearchQuery, setChunkSearchQuery] = useState('');\n\n const chartRef = React.useRef<EChartsReactCore>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const handleChartClick = useCallback(\n (params: ECElementEvent) => {\n onChartClick?.(params);\n const data = params.data as TreemapDataNode | undefined;\n const moduleId = data?.moduleId;\n if (moduleId !== undefined) {\n setModuleId(moduleId);\n setShowAnalyze(true);\n }\n },\n [onChartClick],\n );\n\n const enterFullscreen = useCallback(() => {\n if (containerRef.current) {\n const el = containerRef.current as HTMLElement & {\n webkitRequestFullscreen?: () => void;\n mozRequestFullScreen?: () => void;\n msRequestFullscreen?: () => void;\n };\n if (el.requestFullscreen) {\n el.requestFullscreen()\n .then(() => setIsFullscreen(true))\n .catch((err: unknown) =>\n console.error('Failed to enter fullscreen:', err),\n );\n } else if (el.webkitRequestFullscreen) {\n try {\n el.webkitRequestFullscreen();\n setIsFullscreen(true);\n } catch (err) {\n console.error('Failed to enter fullscreen (webkit):', err);\n }\n } else if (el.mozRequestFullScreen) {\n try {\n el.mozRequestFullScreen();\n setIsFullscreen(true);\n } catch (err) {\n console.error('Failed to enter fullscreen (moz):', err);\n }\n } else if (el.msRequestFullscreen) {\n try {\n el.msRequestFullscreen();\n setIsFullscreen(true);\n } catch (err) {\n console.error('Failed to enter fullscreen (ms):', err);\n }\n } else {\n console.error('Fullscreen API is not supported in this browser.');\n }\n }\n }, []);\n\n const exitFullscreen = useCallback(() => {\n document\n .exitFullscreen()\n .then(() => setIsFullscreen(false))\n .catch((err) => console.error('Failed to exit fullscreen:', err));\n }, []);\n\n const toggleFullscreen = useCallback(() => {\n if (isFullscreen) {\n exitFullscreen();\n } else {\n enterFullscreen();\n }\n }, [isFullscreen, enterFullscreen, exitFullscreen]);\n\n useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n const filteredTreeData = useMemo(() => {\n let filtered = treeData.filter((item) => checkedAssets.includes(item.name));\n\n if (chunkSearchQuery.trim()) {\n const searchLower = chunkSearchQuery.toLowerCase();\n filtered = filtered.filter((item) =>\n item.name.toLowerCase().includes(searchLower),\n );\n }\n\n return filtered;\n }, [treeData, checkedAssets, chunkSearchQuery]);\n\n const searchResults = useMemo(() => {\n if (!searchQuery.trim()) return [];\n\n const regex = new RegExp(searchQuery, 'i');\n const results: Array<{ path: string; nodeId: number }> = [];\n\n const collectMatchingPaths = (node: TreeNode) => {\n if (node.path && regex.test(node.path)) {\n const nodeId = hashString(node.path);\n results.push({ path: node.path, nodeId });\n }\n if (node.children) {\n node.children.forEach(collectMatchingPaths);\n }\n };\n\n filteredTreeData.forEach(collectMatchingPaths);\n return results;\n }, [filteredTreeData, searchQuery]);\n\n const handleSearchResultClick = useCallback((nodeId: number) => {\n setHighlightNodeId(nodeId);\n setCenterNodeId(nodeId);\n }, []);\n\n const removeRootPath = useCallback(\n (filepath: string): string => {\n if (!rootPath || !filepath) return filepath;\n const normalizedRoot = rootPath.replace(/\\\\/g, '/').replace(/\\/$/, '');\n const normalizedPath = filepath.replace(/\\\\/g, '/');\n\n if (normalizedPath.startsWith(normalizedRoot + '/')) {\n return normalizedPath.slice(normalizedRoot.length + 1);\n } else if (normalizedPath === normalizedRoot) {\n return '';\n }\n return filepath;\n },\n [rootPath],\n );\n\n const getSize = useCallback((node: TreeNode, type?: SizeType) => {\n if (type === 'stat') return node.sourceSize || 0;\n if (type === 'parsed') return node.bundledSize || 0;\n if (type === 'gzip') return node.gzipSize || 0;\n if (type === 'value') return node.value || 0;\n if (node.value) return node.value;\n return 0;\n }, []);\n\n const calculateNodeTotalSize = useCallback(\n (node: TreeNode, type: SizeType): number => {\n let size = getSize(node, type);\n\n if (node.children && node.children.length > 0) {\n const childrenSize = node.children.reduce(\n (sum, child) => sum + calculateNodeTotalSize(child, type),\n 0,\n );\n if (size === 0 || (!node.path && childrenSize > 0)) {\n size = childrenSize;\n }\n }\n\n return size;\n },\n [getSize],\n );\n\n const getChunkSize = useCallback(\n (name: string, type?: SizeType) => {\n const node = treeData.find((n) => n.name === name);\n if (!node) return 0;\n const sizeTypeToUse = type || sizeType;\n return calculateNodeTotalSize(node, sizeTypeToUse);\n },\n [treeData, sizeType, calculateNodeTotalSize],\n );\n\n return (\n <div className={Styles.treemap} ref={containerRef}>\n <button\n className={Styles['fullscreen-button']}\n onClick={toggleFullscreen}\n title={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n >\n {isFullscreen ? <FullscreenExitOutlined /> : <FullscreenOutlined />}\n </button>\n\n <div className={`${Styles.sidebar} ${collapsed ? Styles.collapsed : ''}`}>\n <div\n className={`${Styles['sidebar-toggle']} ${collapsed ? Styles.collapsed : ''}`}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <RightOutlined /> : <LeftOutlined />}\n </div>\n <div className={Styles['sidebar-content']}>\n <div>\n <h4>Treemap sizes</h4>\n <Radio.Group\n value={sizeType}\n onChange={(e) => setSizeType(e.target.value)}\n size=\"small\"\n buttonStyle=\"solid\"\n >\n <Radio.Button value=\"stat\">Stat</Radio.Button>\n <Radio.Button value=\"parsed\">Parsed</Radio.Button>\n <Radio.Button value=\"gzip\">Gzipped</Radio.Button>\n </Radio.Group>\n </div>\n\n <div>\n <h4>Show chunks</h4>\n <Input\n placeholder=\"Search chunks\"\n value={chunkSearchQuery}\n onChange={(e) => setChunkSearchQuery(e.target.value)}\n suffix={<SearchOutlined style={{ color: '#ccc' }} />}\n allowClear\n size=\"small\"\n style={{ marginBottom: 8 }}\n />\n <Checkbox\n indeterminate={\n checkedAssets.length > 0 &&\n checkedAssets.length < assetNames.length\n }\n checked={checkedAssets.length === assetNames.length}\n onChange={(e) =>\n setCheckedAssets(e.target.checked ? assetNames : [])\n }\n className={Styles['all-none-checkbox']}\n >\n All\n </Checkbox>\n <div\n className={Styles['chunk-list']}\n style={{ maxHeight: 180, overflowY: 'auto' }}\n >\n {assetNames\n .filter((name) =>\n name.toLowerCase().includes(chunkSearchQuery.toLowerCase()),\n )\n .map((name) => (\n <div\n key={name}\n className={Styles['chunk-item']}\n style={{ height: 15, lineHeight: '15px' }}\n >\n <Checkbox\n checked={checkedAssets.includes(name)}\n onChange={(e) => {\n if (e.target.checked) {\n setCheckedAssets([...checkedAssets, name]);\n } else {\n setCheckedAssets(\n checkedAssets.filter((a) => a !== name),\n );\n }\n }}\n >\n <span title={name}>{name}</span>\n </Checkbox>\n <span className={Styles['size-tag']}>\n {formatSize(getChunkSize(name, 'value'))}\n </span>\n </div>\n ))}\n </div>\n </div>\n\n <div>\n <h4>Search modules</h4>\n <Input\n placeholder=\"Enter regexp\"\n value={searchQuery}\n onChange={(e) => {\n setSearchQuery(e.target.value);\n setHighlightNodeId(undefined);\n setCenterNodeId(undefined);\n }}\n suffix={<SearchOutlined style={{ color: '#ccc' }} />}\n allowClear\n size=\"small\"\n />\n {searchQuery.trim() && searchResults.length > 0 && (\n <div className={Styles['search-results']}>\n <div className={Styles['search-results-header']}>\n Found {searchResults.length} file\n {searchResults.length > 1 ? 's' : ''}\n </div>\n <div className={Styles['search-results-list']}>\n {searchResults.map((result, index) => {\n const displayPath = removeRootPath(result.path);\n return (\n <div\n key={index}\n className={Styles['search-result-item']}\n onClick={() => handleSearchResultClick(result.nodeId)}\n title={result.path}\n >\n {displayPath || result.path}\n </div>\n );\n })}\n </div>\n </div>\n )}\n {searchQuery.trim() && searchResults.length === 0 && (\n <div className={Styles['search-results-empty']}>\n No files found matching \"{searchQuery}\"\n </div>\n )}\n </div>\n </div>\n </div>\n\n <div className={Styles['chart-wrapper']}>\n <TreeMap\n ref={chartRef}\n treeData={filteredTreeData}\n sizeType={sizeType}\n onChartClick={handleChartClick}\n highlightNodeId={highlightNodeId}\n centerNodeId={centerNodeId}\n rootPath={rootPath}\n style={{ width: '100%', height: '100%' }}\n />\n {moduleId ? (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetAllModuleGraph}\n body={{}}\n >\n {(modules) => (\n <ModuleAnalyzeComponent\n cwd={rootPath}\n moduleId={moduleId}\n modules={modules}\n show={showAnalyze}\n setShow={setShowAnalyze}\n />\n )}\n </ServerAPIProvider>\n ) : null}\n </div>\n </div>\n );\n};\n"],"names":["echarts","TreemapChart","TooltipComponent","TitleComponent","CanvasRenderer","hashString","str","hash","i","blendWithWhite","hex","ratio","r","parseInt","g","b","blendedR","Math","blendedG","blendedB","getLuminance","rs","gs","bs","val","isDarkColor","getLevelOption","TreeMapInner","memo","treeData","sizeType","style","onChartClick","forwardedRef","highlightNodeId","centerNodeId","rootPath","option","setOption","useState","chartRef","React","chartDataRef","clickTimeoutRef","useEffect","convert","node","index","level","parentColor","siblingIndex","siblingCount","baseColor","TREE_COLORS","children","c","childIndex","nodeId","isHighlighted","baseColorRatio","baseBorderRatio","siblingGradientRange","siblingRatio","colorRatio","borderRatio","nodeColor","nodeBorderColor","isDark","textColor","textBorderColor","result","undefined","data","item","pos","_params","_dom","_rect","size","obj","info","path","String","normalizedRoot","normalizedPath","sourceSize","bundledSize","gzipSize","makeRow","label","value","color","Styles","rows","formatSize","chartInstance","findNodeInfo","targetId","itemName","currentPath","found","setTimeout","nodeInfo","nodeName","e","console","zoomStrategies","strategy","window","Alert","EChartsReactCore","params","instance","TreeMap","props","ref","AssetTreemapWithFilter","ServerAPIProvider","SDK","projectInfo","AssetTreemapWithFilterInner","assetNames","useMemo","checkedAssets","setCheckedAssets","collapsed","setCollapsed","setSizeType","searchQuery","setSearchQuery","isFullscreen","setIsFullscreen","setHighlightNodeId","setCenterNodeId","moduleId","setModuleId","showAnalyze","setShowAnalyze","chunkSearchQuery","setChunkSearchQuery","containerRef","handleChartClick","useCallback","enterFullscreen","el","err","exitFullscreen","document","toggleFullscreen","handleFullscreenChange","filteredTreeData","filtered","searchLower","searchResults","regex","RegExp","results","collectMatchingPaths","handleSearchResultClick","removeRootPath","filepath","getSize","type","calculateNodeTotalSize","childrenSize","sum","child","getChunkSize","name","n","sizeTypeToUse","FullscreenExitOutlined","FullscreenOutlined","RightOutlined","LeftOutlined","Radio","Input","SearchOutlined","Checkbox","a","displayPath","modules","ModuleAnalyzeComponent"],"mappings":"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"}
@@ -38,8 +38,8 @@ var constants_ChartTypes = /*#__PURE__*/ function(ChartTypes) {
38
38
  }({});
39
39
  const TREE_COLORS = [
40
40
  '#6F3FE1',
41
- '#5781FD',
42
- '#4DB1CB',
41
+ '#072da1',
42
+ '#0a5f74',
43
43
  '#3EBD7C',
44
44
  '#F7A925',
45
45
  '#bda29a',
@@ -1 +1 @@
1
- {"version":3,"file":"components/Charts/constants.mjs","sources":["../../../src/components/Charts/constants.ts"],"sourcesContent":["export const PALETTE_COLORS = [\n '#F2793D',\n '#F28B24',\n '#F2A200',\n '#F5CC00',\n '#F5E000',\n '#A3D900',\n '#66CC00',\n '#0AC419',\n '#0AC496',\n '#0AC7D1',\n '#00A8E0',\n '#1471F5',\n '#4060FF',\n '#7559FF',\n '#884DFF',\n '#A526FF',\n '#BA39E5',\n '#C700D9',\n '#D900B5',\n '#E50099',\n '#E52E6B',\n '#F24957',\n '#30B2F2',\n '#00BF70',\n '#5959FF',\n '#9F40FF',\n '#528BFF',\n];\n\nexport enum ChartTypes {\n Bootstrap,\n Compile,\n Done,\n Minify,\n Loader,\n Normal,\n}\n\nexport const TREE_COLORS = [\n '#6F3FE1',\n '#5781FD',\n '#4DB1CB',\n '#3EBD7C',\n '#F7A925',\n '#bda29a',\n '#ca8622',\n '#749f83',\n '#6e7074',\n '#546570',\n '#c4ccd3',\n];\n"],"names":["PALETTE_COLORS","ChartTypes","TREE_COLORS"],"mappings":"AAAO,MAAMA,iBAAiB;IAC5B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAEM,IAAKC,uBAAUA,WAAAA,GAAAA,SAAVA,UAAU;;;;;;;WAAVA;;AASL,MAAMC,cAAc;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD"}
1
+ {"version":3,"file":"components/Charts/constants.mjs","sources":["../../../src/components/Charts/constants.ts"],"sourcesContent":["export const PALETTE_COLORS = [\n '#F2793D',\n '#F28B24',\n '#F2A200',\n '#F5CC00',\n '#F5E000',\n '#A3D900',\n '#66CC00',\n '#0AC419',\n '#0AC496',\n '#0AC7D1',\n '#00A8E0',\n '#1471F5',\n '#4060FF',\n '#7559FF',\n '#884DFF',\n '#A526FF',\n '#BA39E5',\n '#C700D9',\n '#D900B5',\n '#E50099',\n '#E52E6B',\n '#F24957',\n '#30B2F2',\n '#00BF70',\n '#5959FF',\n '#9F40FF',\n '#528BFF',\n];\n\nexport enum ChartTypes {\n Bootstrap,\n Compile,\n Done,\n Minify,\n Loader,\n Normal,\n}\n\nexport const TREE_COLORS = [\n '#6F3FE1',\n '#072da1',\n '#0a5f74',\n '#3EBD7C',\n '#F7A925',\n '#bda29a',\n '#ca8622',\n '#749f83',\n '#6e7074',\n '#546570',\n '#c4ccd3',\n];\n"],"names":["PALETTE_COLORS","ChartTypes","TREE_COLORS"],"mappings":"AAAO,MAAMA,iBAAiB;IAC5B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAEM,IAAKC,uBAAUA,WAAAA,GAAAA,SAAVA,UAAU;;;;;;;WAAVA;;AASL,MAAMC,cAAc;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD"}
@@ -109,6 +109,7 @@ const MenusBase = (props)=>{
109
109
  onClick: (e)=>{
110
110
  if (!e.keyPath.includes(BuilderSwitchName)) navigate(e.key);
111
111
  },
112
+ disabledOverflow: true,
112
113
  overflowedIndicator: /*#__PURE__*/ jsx(MenuOutlined, {}),
113
114
  style: {
114
115
  height: Size.NavBarHeight,
@@ -1 +1 @@
1
- {"version":3,"file":"components/Layout/menus.mjs","sources":["../../../src/components/Layout/menus.tsx"],"sourcesContent":["import {\n BoxPlotFilled,\n MenuOutlined,\n FundFilled,\n ApiFilled,\n NodeIndexOutlined,\n} from '@ant-design/icons';\nimport { Manifest, SDK } from '@rsdoctor/types';\nimport { Menu, MenuProps } from 'antd';\nimport React, { useEffect, useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { Size } from '../../constants';\nimport * as OverallConstants from '../../pages/Overall/constants';\nimport {\n useI18n,\n hasBundle,\n hasCompile,\n getEnableRoutesFromUrlQuery,\n} from '../../utils';\nimport { withServerAPI } from '../Manifest';\nimport OverallActive from 'src/common/svg/navbar/overall-active.svg';\nimport OverallInActive from 'src/common/svg/navbar/overall-inactive.svg';\nimport CompileAnalysisActive from 'src/common/svg/navbar/compile-analysis-active.svg';\nimport CompileAnalysisInActive from 'src/common/svg/navbar/compile-analysis-inactive.svg';\nimport BundleSizeActive from 'src/common/svg/navbar/bundle-size-active.svg';\nimport BundleSizeInActive from 'src/common/svg/navbar/bundle-size-inactive.svg';\nimport {\n BundleSize,\n LoaderFiles,\n PluginsAnalyze,\n ModuleResolve,\n LoaderTimeline,\n} from 'src/pages';\nimport { CompileName } from './constants';\n\nconst BuilderSwitchName = 'builder-switcher';\n\nconst defaultInActive = {\n overall: <OverallInActive />,\n webpack: <CompileAnalysisInActive />,\n bundle: <BundleSizeInActive />,\n};\nconst MenusBase: React.FC<{\n style?: React.CSSProperties;\n routes: Manifest.RsdoctorManifestClientRoutes[];\n}> = (props) => {\n const { t } = useI18n();\n const { pathname } = useLocation();\n const navigate = useNavigate();\n const [navIcon, setNavIcon] = useState(defaultInActive);\n const { routes: apiRoutes } = props;\n\n // Get enableRoutes from URL query as fallback\n const urlEnableRoutes = getEnableRoutesFromUrlQuery();\n const enableRoutes =\n apiRoutes && apiRoutes.length > 0\n ? apiRoutes\n : (urlEnableRoutes as Manifest.RsdoctorManifestClientRoutes[]) || [];\n\n useEffect(() => {\n if (pathname.includes('webpack')) {\n setNavIcon({\n ...defaultInActive,\n webpack: <CompileAnalysisActive />,\n });\n } else if (pathname.includes('overall') || pathname === '/') {\n setNavIcon({\n ...defaultInActive,\n overall: <OverallActive />,\n });\n } else if (pathname.includes('bundle')) {\n setNavIcon({\n ...defaultInActive,\n bundle: <BundleSizeActive />,\n });\n }\n }, [pathname]);\n\n const iconStyle: React.CSSProperties = {\n color: 'rgba(96, 102, 114)',\n };\n const items: MenuProps['items'] = [];\n\n if (enableRoutes.includes(Manifest.RsdoctorManifestClientRoutes.Overall)) {\n items.push({\n label: t(OverallConstants.name),\n key: OverallConstants.route,\n icon: navIcon.overall,\n children: [],\n onTitleClick(e) {\n navigate(e.key);\n },\n });\n }\n\n if (hasCompile(enableRoutes)) {\n items.push({\n label: t(CompileName),\n key: CompileName,\n icon: navIcon.webpack,\n children: [\n enableRoutes.includes(\n Manifest.RsdoctorManifestClientRoutes.WebpackLoaders,\n ) && {\n label: t(LoaderTimeline.name),\n key: LoaderTimeline.route,\n icon: <BoxPlotFilled style={iconStyle} />,\n },\n enableRoutes.includes(\n Manifest.RsdoctorManifestClientRoutes.WebpackLoaders,\n ) && {\n label: t(LoaderFiles.name),\n key: LoaderFiles.route,\n icon: <FundFilled style={iconStyle} />,\n },\n enableRoutes.includes(\n Manifest.RsdoctorManifestClientRoutes.ModuleResolve,\n ) && {\n label: t(ModuleResolve.name),\n key: ModuleResolve.route,\n icon: <NodeIndexOutlined style={iconStyle} />,\n },\n enableRoutes.includes(\n Manifest.RsdoctorManifestClientRoutes.WebpackPlugins,\n ) && {\n label: t(PluginsAnalyze.name),\n key: PluginsAnalyze.route,\n icon: <ApiFilled style={iconStyle} />,\n },\n ].filter((e) => Boolean(e)) as MenuProps['items'],\n });\n }\n\n if (hasBundle(enableRoutes)) {\n items.push({\n label: t(BundleSize.name),\n key: BundleSize.name,\n icon: navIcon.bundle,\n children: [],\n onTitleClick() {\n navigate(BundleSize.route);\n },\n });\n }\n\n const MenuComponent = (\n <Menu\n items={items}\n mode=\"horizontal\"\n key={enableRoutes.join('')}\n onClick={(e) => {\n if (!e.keyPath.includes(BuilderSwitchName)) {\n navigate(e.key);\n }\n }}\n overflowedIndicator={<MenuOutlined />}\n style={{\n height: Size.NavBarHeight,\n lineHeight: `${Size.NavBarHeight}px`,\n minWidth: 0,\n justifyContent: 'flex-end',\n ...props.style,\n }}\n selectedKeys={[pathname === '/' ? OverallConstants.route : pathname]}\n />\n );\n\n return <div style={{ marginLeft: '30px' }}>{MenuComponent}</div>;\n};\n\nexport const Menus = withServerAPI({\n api: SDK.ServerAPI.API.GetClientRoutes,\n responsePropName: 'routes',\n Component: MenusBase,\n fallbackComponent: () => null,\n showSkeleton: false,\n});\n"],"names":["BuilderSwitchName","defaultInActive","OverallInActive","CompileAnalysisInActive","BundleSizeInActive","MenusBase","props","t","useI18n","pathname","useLocation","navigate","useNavigate","navIcon","setNavIcon","useState","apiRoutes","urlEnableRoutes","getEnableRoutesFromUrlQuery","enableRoutes","useEffect","CompileAnalysisActive","OverallActive","BundleSizeActive","iconStyle","items","Manifest","OverallConstants","e","hasCompile","CompileName","LoaderTimeline","BoxPlotFilled","LoaderFiles","FundFilled","ModuleResolve","NodeIndexOutlined","PluginsAnalyze","ApiFilled","Boolean","hasBundle","BundleSize","MenuComponent","Menu","MenuOutlined","Size","Menus","withServerAPI","SDK"],"mappings":"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"}
1
+ {"version":3,"file":"components/Layout/menus.mjs","sources":["../../../src/components/Layout/menus.tsx"],"sourcesContent":["import {\n BoxPlotFilled,\n MenuOutlined,\n FundFilled,\n ApiFilled,\n NodeIndexOutlined,\n} from '@ant-design/icons';\nimport { Manifest, SDK } from '@rsdoctor/types';\nimport { Menu, MenuProps } from 'antd';\nimport React, { useEffect, useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { Size } from '../../constants';\nimport * as OverallConstants from '../../pages/Overall/constants';\nimport {\n useI18n,\n hasBundle,\n hasCompile,\n getEnableRoutesFromUrlQuery,\n} from '../../utils';\nimport { withServerAPI } from '../Manifest';\nimport OverallActive from 'src/common/svg/navbar/overall-active.svg';\nimport OverallInActive from 'src/common/svg/navbar/overall-inactive.svg';\nimport CompileAnalysisActive from 'src/common/svg/navbar/compile-analysis-active.svg';\nimport CompileAnalysisInActive from 'src/common/svg/navbar/compile-analysis-inactive.svg';\nimport BundleSizeActive from 'src/common/svg/navbar/bundle-size-active.svg';\nimport BundleSizeInActive from 'src/common/svg/navbar/bundle-size-inactive.svg';\nimport {\n BundleSize,\n LoaderFiles,\n PluginsAnalyze,\n ModuleResolve,\n LoaderTimeline,\n} from 'src/pages';\nimport { CompileName } from './constants';\n\nconst BuilderSwitchName = 'builder-switcher';\n\nconst defaultInActive = {\n overall: <OverallInActive />,\n webpack: <CompileAnalysisInActive />,\n bundle: <BundleSizeInActive />,\n};\nconst MenusBase: React.FC<{\n style?: React.CSSProperties;\n routes: Manifest.RsdoctorManifestClientRoutes[];\n}> = (props) => {\n const { t } = useI18n();\n const { pathname } = useLocation();\n const navigate = useNavigate();\n const [navIcon, setNavIcon] = useState(defaultInActive);\n const { routes: apiRoutes } = props;\n\n // Get enableRoutes from URL query as fallback\n const urlEnableRoutes = getEnableRoutesFromUrlQuery();\n const enableRoutes =\n apiRoutes && apiRoutes.length > 0\n ? apiRoutes\n : (urlEnableRoutes as Manifest.RsdoctorManifestClientRoutes[]) || [];\n\n useEffect(() => {\n if (pathname.includes('webpack')) {\n setNavIcon({\n ...defaultInActive,\n webpack: <CompileAnalysisActive />,\n });\n } else if (pathname.includes('overall') || pathname === '/') {\n setNavIcon({\n ...defaultInActive,\n overall: <OverallActive />,\n });\n } else if (pathname.includes('bundle')) {\n setNavIcon({\n ...defaultInActive,\n bundle: <BundleSizeActive />,\n });\n }\n }, [pathname]);\n\n const iconStyle: React.CSSProperties = {\n color: 'rgba(96, 102, 114)',\n };\n const items: MenuProps['items'] = [];\n\n if (enableRoutes.includes(Manifest.RsdoctorManifestClientRoutes.Overall)) {\n items.push({\n label: t(OverallConstants.name),\n key: OverallConstants.route,\n icon: navIcon.overall,\n children: [],\n onTitleClick(e) {\n navigate(e.key);\n },\n });\n }\n\n if (hasCompile(enableRoutes)) {\n items.push({\n label: t(CompileName),\n key: CompileName,\n icon: navIcon.webpack,\n children: [\n enableRoutes.includes(\n Manifest.RsdoctorManifestClientRoutes.WebpackLoaders,\n ) && {\n label: t(LoaderTimeline.name),\n key: LoaderTimeline.route,\n icon: <BoxPlotFilled style={iconStyle} />,\n },\n enableRoutes.includes(\n Manifest.RsdoctorManifestClientRoutes.WebpackLoaders,\n ) && {\n label: t(LoaderFiles.name),\n key: LoaderFiles.route,\n icon: <FundFilled style={iconStyle} />,\n },\n enableRoutes.includes(\n Manifest.RsdoctorManifestClientRoutes.ModuleResolve,\n ) && {\n label: t(ModuleResolve.name),\n key: ModuleResolve.route,\n icon: <NodeIndexOutlined style={iconStyle} />,\n },\n enableRoutes.includes(\n Manifest.RsdoctorManifestClientRoutes.WebpackPlugins,\n ) && {\n label: t(PluginsAnalyze.name),\n key: PluginsAnalyze.route,\n icon: <ApiFilled style={iconStyle} />,\n },\n ].filter((e) => Boolean(e)) as MenuProps['items'],\n });\n }\n\n if (hasBundle(enableRoutes)) {\n items.push({\n label: t(BundleSize.name),\n key: BundleSize.name,\n icon: navIcon.bundle,\n children: [],\n onTitleClick() {\n navigate(BundleSize.route);\n },\n });\n }\n\n const MenuComponent = (\n <Menu\n items={items}\n mode=\"horizontal\"\n key={enableRoutes.join('')}\n onClick={(e) => {\n if (!e.keyPath.includes(BuilderSwitchName)) {\n navigate(e.key);\n }\n }}\n disabledOverflow\n overflowedIndicator={<MenuOutlined />}\n style={{\n height: Size.NavBarHeight,\n lineHeight: `${Size.NavBarHeight}px`,\n minWidth: 0,\n justifyContent: 'flex-end',\n ...props.style,\n }}\n selectedKeys={[pathname === '/' ? OverallConstants.route : pathname]}\n />\n );\n\n return <div style={{ marginLeft: '30px' }}>{MenuComponent}</div>;\n};\n\nexport const Menus = withServerAPI({\n api: SDK.ServerAPI.API.GetClientRoutes,\n responsePropName: 'routes',\n Component: MenusBase,\n fallbackComponent: () => null,\n showSkeleton: false,\n});\n"],"names":["BuilderSwitchName","defaultInActive","OverallInActive","CompileAnalysisInActive","BundleSizeInActive","MenusBase","props","t","useI18n","pathname","useLocation","navigate","useNavigate","navIcon","setNavIcon","useState","apiRoutes","urlEnableRoutes","getEnableRoutesFromUrlQuery","enableRoutes","useEffect","CompileAnalysisActive","OverallActive","BundleSizeActive","iconStyle","items","Manifest","OverallConstants","e","hasCompile","CompileName","LoaderTimeline","BoxPlotFilled","LoaderFiles","FundFilled","ModuleResolve","NodeIndexOutlined","PluginsAnalyze","ApiFilled","Boolean","hasBundle","BundleSize","MenuComponent","Menu","MenuOutlined","Size","Menus","withServerAPI","SDK"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from "./components/index.mjs";
2
2
  export * from "./utils/index.mjs";
3
- import * as __WEBPACK_EXTERNAL_MODULE__constants_mjs_225410ff__ from "./constants.mjs";
4
- export { __WEBPACK_EXTERNAL_MODULE__constants_mjs_225410ff__ as Constants };
3
+ import * as __rspack_external__constants_mjs_225410ff from "./constants.mjs";
4
+ export { __rspack_external__constants_mjs_225410ff as Constants };
@@ -1,12 +1,12 @@
1
- import * as __WEBPACK_EXTERNAL_MODULE__Overall_index_mjs_0ded43f9__ from "./Overall/index.mjs";
2
- import * as __WEBPACK_EXTERNAL_MODULE__BundleSize_index_mjs_d0a2fb23__ from "./BundleSize/index.mjs";
3
- import * as __WEBPACK_EXTERNAL_MODULE__ModuleAnalyze_index_mjs_4385c65f__ from "./ModuleAnalyze/index.mjs";
4
- import * as __WEBPACK_EXTERNAL_MODULE__WebpackLoaders_Overall_index_mjs_7fb4d495__ from "./WebpackLoaders/Overall/index.mjs";
5
- import * as __WEBPACK_EXTERNAL_MODULE__WebpackLoaders_Analysis_index_mjs_a1d3659a__ from "./WebpackLoaders/Analysis/index.mjs";
6
- import * as __WEBPACK_EXTERNAL_MODULE__WebpackPlugins_index_mjs_a5b22b8e__ from "./WebpackPlugins/index.mjs";
7
- import * as __WEBPACK_EXTERNAL_MODULE__ModuleResolve_index_mjs_2463b148__ from "./ModuleResolve/index.mjs";
8
- import * as __WEBPACK_EXTERNAL_MODULE__Resources_RuleIndex_index_mjs_458631cc__ from "./Resources/RuleIndex/index.mjs";
9
- import * as __WEBPACK_EXTERNAL_MODULE__TreeShaking_index_mjs_1daf5cdb__ from "./TreeShaking/index.mjs";
10
- import * as __WEBPACK_EXTERNAL_MODULE__Resources_BundleDiff_index_mjs_3b739fff__ from "./Resources/BundleDiff/index.mjs";
11
- import * as __WEBPACK_EXTERNAL_MODULE__Uploader_index_mjs_e3f3ea84__ from "./Uploader/index.mjs";
12
- export { __WEBPACK_EXTERNAL_MODULE__Resources_BundleDiff_index_mjs_3b739fff__ as BundleDiff, __WEBPACK_EXTERNAL_MODULE__BundleSize_index_mjs_d0a2fb23__ as BundleSize, __WEBPACK_EXTERNAL_MODULE__WebpackLoaders_Analysis_index_mjs_a1d3659a__ as LoaderFiles, __WEBPACK_EXTERNAL_MODULE__WebpackLoaders_Overall_index_mjs_7fb4d495__ as LoaderTimeline, __WEBPACK_EXTERNAL_MODULE__ModuleAnalyze_index_mjs_4385c65f__ as ModuleAnalyze, __WEBPACK_EXTERNAL_MODULE__ModuleResolve_index_mjs_2463b148__ as ModuleResolve, __WEBPACK_EXTERNAL_MODULE__Overall_index_mjs_0ded43f9__ as Overall, __WEBPACK_EXTERNAL_MODULE__WebpackPlugins_index_mjs_a5b22b8e__ as PluginsAnalyze, __WEBPACK_EXTERNAL_MODULE__Resources_RuleIndex_index_mjs_458631cc__ as RuleIndex, __WEBPACK_EXTERNAL_MODULE__TreeShaking_index_mjs_1daf5cdb__ as TreeShaking, __WEBPACK_EXTERNAL_MODULE__Uploader_index_mjs_e3f3ea84__ as Uploader };
1
+ import * as __rspack_external__Overall_index_mjs_0ded43f9 from "./Overall/index.mjs";
2
+ import * as __rspack_external__BundleSize_index_mjs_d0a2fb23 from "./BundleSize/index.mjs";
3
+ import * as __rspack_external__ModuleAnalyze_index_mjs_4385c65f from "./ModuleAnalyze/index.mjs";
4
+ import * as __rspack_external__WebpackLoaders_Overall_index_mjs_7fb4d495 from "./WebpackLoaders/Overall/index.mjs";
5
+ import * as __rspack_external__WebpackLoaders_Analysis_index_mjs_a1d3659a from "./WebpackLoaders/Analysis/index.mjs";
6
+ import * as __rspack_external__WebpackPlugins_index_mjs_a5b22b8e from "./WebpackPlugins/index.mjs";
7
+ import * as __rspack_external__ModuleResolve_index_mjs_2463b148 from "./ModuleResolve/index.mjs";
8
+ import * as __rspack_external__Resources_RuleIndex_index_mjs_458631cc from "./Resources/RuleIndex/index.mjs";
9
+ import * as __rspack_external__TreeShaking_index_mjs_1daf5cdb from "./TreeShaking/index.mjs";
10
+ import * as __rspack_external__Resources_BundleDiff_index_mjs_3b739fff from "./Resources/BundleDiff/index.mjs";
11
+ import * as __rspack_external__Uploader_index_mjs_e3f3ea84 from "./Uploader/index.mjs";
12
+ export { __rspack_external__Resources_BundleDiff_index_mjs_3b739fff as BundleDiff, __rspack_external__BundleSize_index_mjs_d0a2fb23 as BundleSize, __rspack_external__WebpackLoaders_Analysis_index_mjs_a1d3659a as LoaderFiles, __rspack_external__WebpackLoaders_Overall_index_mjs_7fb4d495 as LoaderTimeline, __rspack_external__ModuleAnalyze_index_mjs_4385c65f as ModuleAnalyze, __rspack_external__ModuleResolve_index_mjs_2463b148 as ModuleResolve, __rspack_external__Overall_index_mjs_0ded43f9 as Overall, __rspack_external__WebpackPlugins_index_mjs_a5b22b8e as PluginsAnalyze, __rspack_external__Resources_RuleIndex_index_mjs_458631cc as RuleIndex, __rspack_external__TreeShaking_index_mjs_1daf5cdb as TreeShaking, __rspack_external__Uploader_index_mjs_e3f3ea84 as Uploader };
@@ -40,6 +40,7 @@ type TreeNode = {
40
40
  sourceSize?: number;
41
41
  bundledSize?: number;
42
42
  gzipSize?: number;
43
+ id?: string | number;
43
44
  _map?: Map<string, TreeNode>;
44
45
  };
45
46
  export declare function buildTreemapData(modules: SDK.ModuleData[], rootName?: string): TreeNode;
@@ -168,7 +168,8 @@ function buildTreemapData(modules, rootName = 'dist') {
168
168
  path: mod.path,
169
169
  sourceSize: mod.size?.sourceSize ?? 0,
170
170
  bundledSize: mod.size?.parsedSize ?? 0,
171
- gzipSize: mod.size?.gzipSize ?? 0
171
+ gzipSize: mod.size?.gzipSize ?? 0,
172
+ id: mod.id
172
173
  });
173
174
  } else {
174
175
  if (!current._map) current._map = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"utils/file.mjs","sources":["../../src/utils/file.tsx"],"sourcesContent":["import { get } from 'es-toolkit/compat';\nimport { Common, SDK } from '@rsdoctor/types';\nimport { message, Space, TreeNodeProps, UploadFile } from 'antd';\nimport { FieldDataNode } from 'rc-tree';\nimport {\n FolderOpenTwoTone,\n FolderTwoTone,\n FileOutlined,\n RightOutlined,\n} from '@ant-design/icons';\nimport { getFileCom } from 'src/components/FileTree';\n\nexport type DataNode = FieldDataNode<{\n key: string | number;\n title?: React.ReactNode | ((data: DataNode) => React.ReactNode);\n}> & { __BASENAME__?: any; __RESOURCEPATH__?: any; children?: DataNode[] };\n\nexport const rootDirname = (file: string, sep = '/'): string | null => {\n const idx = file?.indexOf(sep);\n if (idx === -1) {\n return null;\n }\n if (idx === 0) {\n return sep + (rootDirname(file?.slice(1)) || '');\n }\n return file?.slice(0, idx);\n};\n\nexport function mapFileKey(\n arr: DataNode[],\n depth = 2,\n filter: (node: DataNode) => boolean = () => true,\n): DataNode['key'][] {\n let d = 0;\n const res: DataNode['key'][] = [];\n let parent: DataNode[] = arr;\n while (d < depth) {\n parent.filter(filter).forEach((e) => {\n if (!e.isLeaf) {\n res.push(e.key);\n }\n });\n parent = parent.reduce<DataNode[]>(\n (t, e) => t.concat(e.children || []),\n [],\n );\n if (!parent.length) break;\n d++;\n }\n return res;\n}\n\nconst basenameKey = '__BASENAME__';\n\nexport function flattenDirectory(\n n: DataNode,\n parent: DataNode,\n sep = '/',\n inlinedResourcePathKey: keyof DataNode,\n dirTitle = (_dir: DataNode, defaultTitle: string): JSX.Element | string =>\n defaultTitle,\n) {\n if (n.isLeaf) return;\n if (parent.children && parent.children.length === 1) {\n const defaultTitle = [parent[basenameKey], n[basenameKey]].join(sep);\n parent[inlinedResourcePathKey] = n[inlinedResourcePathKey];\n parent[basenameKey] = defaultTitle;\n parent.key = [parent.key, n.key].join('-');\n parent.children = n.children;\n parent.title = dirTitle(parent, defaultTitle);\n\n n.children &&\n n.children.forEach((c) => {\n flattenDirectory(c, parent, sep, inlinedResourcePathKey, dirTitle);\n });\n } else {\n // parent has more than 1 child.\n n.title = dirTitle(n, n[basenameKey]);\n\n n.children &&\n n.children.forEach((c) => {\n flattenDirectory(c, n, sep, inlinedResourcePathKey, dirTitle);\n });\n }\n}\n\nexport function createFileStructures({\n files,\n sep = '/',\n inlinedResourcePathKey = '__RESOURCEPATH__',\n fileTitle = (_file: string, basename: string) => basename,\n dirTitle = (_dir: DataNode, defaultTitle: string) => defaultTitle,\n page = 'other',\n}: {\n files: string[];\n cwd?: string;\n sep?: string;\n inlinedResourcePathKey?: keyof DataNode;\n dirTitle?(dir: DataNode, defaultTitle: string): JSX.Element | string;\n fileTitle?(file: string, basename: string): JSX.Element | string;\n page?: 'bundle' | 'other';\n}): DataNode[] {\n const sepRegexp = new RegExp(sep);\n\n const res = files.reduce<DataNode>(\n (t, file) => {\n let dir = rootDirname(file, sep);\n let basename = dir ? file?.slice(dir.length + 1) : file;\n let parent: DataNode = t;\n\n while (dir) {\n // find the match directory.\n let exist = parent.children!.find((e) => e.title === dir) as DataNode;\n if (!exist) {\n const p = [parent[inlinedResourcePathKey], dir]\n .filter(Boolean)\n .join(sep);\n exist = {\n title: dir,\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps, false)\n : null,\n // key: [parent.key, parent.children!.length].join('-'),\n key: p,\n children: [],\n [inlinedResourcePathKey]: p,\n [basenameKey]: dir,\n };\n parent.children!.push(exist);\n }\n\n parent = exist;\n dir = rootDirname(basename);\n basename = dir\n ? basename.slice(dir.length).replace(sepRegexp, '')\n : basename;\n }\n\n // uniq\n if (parent.children!.some((e) => get(e, inlinedResourcePathKey) === file))\n return t;\n\n parent.children!.push({\n title() {\n return fileTitle(file, basename);\n },\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps)\n : null,\n key: file,\n isLeaf: true,\n [inlinedResourcePathKey]: file,\n [basenameKey]: basename,\n });\n\n return t;\n },\n { key: '0', children: [] },\n ).children!;\n\n res.forEach((e) => {\n e.children &&\n e.children.forEach((item) =>\n flattenDirectory(item, e, sep, inlinedResourcePathKey, dirTitle),\n );\n });\n\n return res;\n}\n\nexport function beautifyPath(path: string, cwd: string) {\n if (path.startsWith(cwd)) {\n return path.replace(cwd, '.');\n }\n\n return path;\n}\n\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: UploadFile,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: Blob,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: unknown,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const { result } = reader;\n console.log('reader result: ', result);\n try {\n const json = JSON.parse(result!.toString());\n resolve(json);\n } catch (err) {\n message.error('json parse error');\n reject(err);\n }\n };\n reader.onerror = () => {\n const msg = 'upload json file error, please try again.';\n message.error(msg);\n reject(new Error(msg));\n };\n reader.readAsText(((file as UploadFile).originFileObj || file) as Blob);\n });\n}\n\n/**\n * beautify module path, will replace cwd & last 'node_modules'\n */\nexport function beautifyModulePath(modulePath: string, cwd: string) {\n const res = beautifyPath(modulePath, cwd);\n\n const str = '/node_modules/';\n\n const idx = res.lastIndexOf(str);\n\n if (idx > -1) {\n return {\n alias: res.slice(idx + str.length),\n inNodeModules: true,\n };\n }\n\n return {\n alias: res,\n inNodeModules: false,\n };\n}\n\nexport function getFileIcon(props: TreeNodeProps, addRowIcon = true) {\n const { data } = props;\n const expanded = props.expanded;\n if (data?.children) {\n return (\n <Space>\n {addRowIcon ? (\n <RightOutlined\n className={`file-tree-switcher-arrow ${expanded ? 'file-tree-switcher-arrow-expand' : ''}`}\n />\n ) : (\n <></>\n )}\n {expanded ? <FolderOpenTwoTone /> : <FolderTwoTone />}\n </Space>\n );\n }\n if (props.eventKey && typeof props.eventKey === 'string') {\n return getFileCom(props.eventKey);\n }\n return <FileOutlined />;\n}\n\ntype TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n // Internal helper, not exported\n _map?: Map<string, TreeNode>;\n};\n\nexport function buildTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const root: TreeNode = { name: rootName, children: [], _map: new Map() };\n\n for (const mod of modules) {\n const parts = mod.path.split(/[\\\\/]/).filter(Boolean);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (i === parts.length - 1) {\n // File node\n if (!current.children) current.children = [];\n current.children.push({\n name: part,\n path: mod.path,\n sourceSize: mod.size?.sourceSize ?? 0,\n bundledSize: mod.size?.parsedSize ?? 0,\n gzipSize: mod.size?.gzipSize ?? 0,\n });\n } else {\n // Directory node\n if (!current._map) current._map = new Map();\n let child = current._map.get(part);\n if (!child) {\n child = { name: part, children: [], _map: new Map() };\n current.children!.push(child);\n current._map.set(part, child);\n }\n current = child;\n }\n }\n }\n\n // Clean up _map property\n function clean(node: TreeNode) {\n delete node._map;\n if (node.children) node.children.forEach(clean);\n }\n clean(root);\n\n return root;\n}\n\nfunction flattenSingleChildDirs(node: TreeNode): TreeNode {\n // Return directly if leaf node\n if (!node.children || node.children.length === 0) return node;\n\n let current = node;\n // As long as children has only one child and it's not a leaf, merge\n while (\n current.children &&\n current.children.length === 1 &&\n !current.children[0].sourceSize // Not a leaf\n ) {\n current = {\n name: current.name + '/' + current.children[0].name,\n children: current.children[0].children,\n };\n }\n\n // Recursively process all child nodes\n if (current.children) {\n current.children = current.children.map(flattenSingleChildDirs);\n }\n return current;\n}\n\nfunction sumDirValue(node: TreeNode): {\n sourceSize: number;\n bundledSize: number;\n gzipSize: number;\n} {\n if (!node.children || node.children.length === 0) {\n // Leaf node, just return value\n return {\n sourceSize: node.sourceSize ?? 0,\n bundledSize: node.bundledSize ?? 0,\n gzipSize: node.gzipSize ?? 0,\n };\n }\n // Recursively sum all child nodes\n let sourceSum = 0;\n let bundledSum = 0;\n let gzipSum = 0;\n for (const child of node.children) {\n const { sourceSize, bundledSize, gzipSize } = sumDirValue(child);\n sourceSum += sourceSize;\n bundledSum += bundledSize;\n gzipSum += gzipSize;\n }\n node.sourceSize = sourceSum;\n node.bundledSize = bundledSum;\n node.gzipSize = gzipSum;\n return { sourceSize: sourceSum, bundledSize: bundledSum, gzipSize: gzipSum };\n}\n\nexport function flattenTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const rawTree = buildTreemapData(modules, rootName);\n const flattenedTree = flattenSingleChildDirs(rawTree);\n sumDirValue(flattenedTree); // Recursive sum\n return flattenedTree;\n}\n"],"names":["rootDirname","file","sep","idx","mapFileKey","arr","depth","filter","d","res","parent","e","t","basenameKey","flattenDirectory","n","inlinedResourcePathKey","dirTitle","_dir","defaultTitle","c","createFileStructures","files","fileTitle","_file","basename","page","sepRegexp","RegExp","dir","exist","p","Boolean","props","getFileIcon","get","item","beautifyPath","path","cwd","readJSONByFileReader","Promise","resolve","reject","reader","FileReader","result","console","json","JSON","err","message","msg","Error","beautifyModulePath","modulePath","str","addRowIcon","data","expanded","Space","RightOutlined","FolderOpenTwoTone","FolderTwoTone","getFileCom","FileOutlined","buildTreemapData","modules","rootName","root","Map","mod","parts","current","i","part","child","clean","node","flattenSingleChildDirs","sumDirValue","sourceSum","bundledSum","gzipSum","sourceSize","bundledSize","gzipSize","flattenTreemapData","rawTree","flattenedTree"],"mappings":"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"}
1
+ {"version":3,"file":"utils/file.mjs","sources":["../../src/utils/file.tsx"],"sourcesContent":["import { get } from 'es-toolkit/compat';\nimport { Common, SDK } from '@rsdoctor/types';\nimport { message, Space, TreeNodeProps, UploadFile } from 'antd';\nimport { FieldDataNode } from 'rc-tree';\nimport {\n FolderOpenTwoTone,\n FolderTwoTone,\n FileOutlined,\n RightOutlined,\n} from '@ant-design/icons';\nimport { getFileCom } from 'src/components/FileTree';\n\nexport type DataNode = FieldDataNode<{\n key: string | number;\n title?: React.ReactNode | ((data: DataNode) => React.ReactNode);\n}> & { __BASENAME__?: any; __RESOURCEPATH__?: any; children?: DataNode[] };\n\nexport const rootDirname = (file: string, sep = '/'): string | null => {\n const idx = file?.indexOf(sep);\n if (idx === -1) {\n return null;\n }\n if (idx === 0) {\n return sep + (rootDirname(file?.slice(1)) || '');\n }\n return file?.slice(0, idx);\n};\n\nexport function mapFileKey(\n arr: DataNode[],\n depth = 2,\n filter: (node: DataNode) => boolean = () => true,\n): DataNode['key'][] {\n let d = 0;\n const res: DataNode['key'][] = [];\n let parent: DataNode[] = arr;\n while (d < depth) {\n parent.filter(filter).forEach((e) => {\n if (!e.isLeaf) {\n res.push(e.key);\n }\n });\n parent = parent.reduce<DataNode[]>(\n (t, e) => t.concat(e.children || []),\n [],\n );\n if (!parent.length) break;\n d++;\n }\n return res;\n}\n\nconst basenameKey = '__BASENAME__';\n\nexport function flattenDirectory(\n n: DataNode,\n parent: DataNode,\n sep = '/',\n inlinedResourcePathKey: keyof DataNode,\n dirTitle = (_dir: DataNode, defaultTitle: string): JSX.Element | string =>\n defaultTitle,\n) {\n if (n.isLeaf) return;\n if (parent.children && parent.children.length === 1) {\n const defaultTitle = [parent[basenameKey], n[basenameKey]].join(sep);\n parent[inlinedResourcePathKey] = n[inlinedResourcePathKey];\n parent[basenameKey] = defaultTitle;\n parent.key = [parent.key, n.key].join('-');\n parent.children = n.children;\n parent.title = dirTitle(parent, defaultTitle);\n\n n.children &&\n n.children.forEach((c) => {\n flattenDirectory(c, parent, sep, inlinedResourcePathKey, dirTitle);\n });\n } else {\n // parent has more than 1 child.\n n.title = dirTitle(n, n[basenameKey]);\n\n n.children &&\n n.children.forEach((c) => {\n flattenDirectory(c, n, sep, inlinedResourcePathKey, dirTitle);\n });\n }\n}\n\nexport function createFileStructures({\n files,\n sep = '/',\n inlinedResourcePathKey = '__RESOURCEPATH__',\n fileTitle = (_file: string, basename: string) => basename,\n dirTitle = (_dir: DataNode, defaultTitle: string) => defaultTitle,\n page = 'other',\n}: {\n files: string[];\n cwd?: string;\n sep?: string;\n inlinedResourcePathKey?: keyof DataNode;\n dirTitle?(dir: DataNode, defaultTitle: string): JSX.Element | string;\n fileTitle?(file: string, basename: string): JSX.Element | string;\n page?: 'bundle' | 'other';\n}): DataNode[] {\n const sepRegexp = new RegExp(sep);\n\n const res = files.reduce<DataNode>(\n (t, file) => {\n let dir = rootDirname(file, sep);\n let basename = dir ? file?.slice(dir.length + 1) : file;\n let parent: DataNode = t;\n\n while (dir) {\n // find the match directory.\n let exist = parent.children!.find((e) => e.title === dir) as DataNode;\n if (!exist) {\n const p = [parent[inlinedResourcePathKey], dir]\n .filter(Boolean)\n .join(sep);\n exist = {\n title: dir,\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps, false)\n : null,\n // key: [parent.key, parent.children!.length].join('-'),\n key: p,\n children: [],\n [inlinedResourcePathKey]: p,\n [basenameKey]: dir,\n };\n parent.children!.push(exist);\n }\n\n parent = exist;\n dir = rootDirname(basename);\n basename = dir\n ? basename.slice(dir.length).replace(sepRegexp, '')\n : basename;\n }\n\n // uniq\n if (parent.children!.some((e) => get(e, inlinedResourcePathKey) === file))\n return t;\n\n parent.children!.push({\n title() {\n return fileTitle(file, basename);\n },\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps)\n : null,\n key: file,\n isLeaf: true,\n [inlinedResourcePathKey]: file,\n [basenameKey]: basename,\n });\n\n return t;\n },\n { key: '0', children: [] },\n ).children!;\n\n res.forEach((e) => {\n e.children &&\n e.children.forEach((item) =>\n flattenDirectory(item, e, sep, inlinedResourcePathKey, dirTitle),\n );\n });\n\n return res;\n}\n\nexport function beautifyPath(path: string, cwd: string) {\n if (path.startsWith(cwd)) {\n return path.replace(cwd, '.');\n }\n\n return path;\n}\n\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: UploadFile,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: Blob,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: unknown,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const { result } = reader;\n console.log('reader result: ', result);\n try {\n const json = JSON.parse(result!.toString());\n resolve(json);\n } catch (err) {\n message.error('json parse error');\n reject(err);\n }\n };\n reader.onerror = () => {\n const msg = 'upload json file error, please try again.';\n message.error(msg);\n reject(new Error(msg));\n };\n reader.readAsText(((file as UploadFile).originFileObj || file) as Blob);\n });\n}\n\n/**\n * beautify module path, will replace cwd & last 'node_modules'\n */\nexport function beautifyModulePath(modulePath: string, cwd: string) {\n const res = beautifyPath(modulePath, cwd);\n\n const str = '/node_modules/';\n\n const idx = res.lastIndexOf(str);\n\n if (idx > -1) {\n return {\n alias: res.slice(idx + str.length),\n inNodeModules: true,\n };\n }\n\n return {\n alias: res,\n inNodeModules: false,\n };\n}\n\nexport function getFileIcon(props: TreeNodeProps, addRowIcon = true) {\n const { data } = props;\n const expanded = props.expanded;\n if (data?.children) {\n return (\n <Space>\n {addRowIcon ? (\n <RightOutlined\n className={`file-tree-switcher-arrow ${expanded ? 'file-tree-switcher-arrow-expand' : ''}`}\n />\n ) : (\n <></>\n )}\n {expanded ? <FolderOpenTwoTone /> : <FolderTwoTone />}\n </Space>\n );\n }\n if (props.eventKey && typeof props.eventKey === 'string') {\n return getFileCom(props.eventKey);\n }\n return <FileOutlined />;\n}\n\ntype TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n id?: string | number;\n // Internal helper, not exported\n _map?: Map<string, TreeNode>;\n};\n\nexport function buildTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const root: TreeNode = { name: rootName, children: [], _map: new Map() };\n\n for (const mod of modules) {\n const parts = mod.path.split(/[\\\\/]/).filter(Boolean);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (i === parts.length - 1) {\n // File node\n if (!current.children) current.children = [];\n current.children.push({\n name: part,\n path: mod.path,\n sourceSize: mod.size?.sourceSize ?? 0,\n bundledSize: mod.size?.parsedSize ?? 0,\n gzipSize: mod.size?.gzipSize ?? 0,\n id: mod.id,\n });\n } else {\n // Directory node\n if (!current._map) current._map = new Map();\n let child = current._map.get(part);\n if (!child) {\n child = { name: part, children: [], _map: new Map() };\n current.children!.push(child);\n current._map.set(part, child);\n }\n current = child;\n }\n }\n }\n\n // Clean up _map property\n function clean(node: TreeNode) {\n delete node._map;\n if (node.children) node.children.forEach(clean);\n }\n clean(root);\n\n return root;\n}\n\nfunction flattenSingleChildDirs(node: TreeNode): TreeNode {\n // Return directly if leaf node\n if (!node.children || node.children.length === 0) return node;\n\n let current = node;\n // As long as children has only one child and it's not a leaf, merge\n while (\n current.children &&\n current.children.length === 1 &&\n !current.children[0].sourceSize // Not a leaf\n ) {\n current = {\n name: current.name + '/' + current.children[0].name,\n children: current.children[0].children,\n };\n }\n\n // Recursively process all child nodes\n if (current.children) {\n current.children = current.children.map(flattenSingleChildDirs);\n }\n return current;\n}\n\nfunction sumDirValue(node: TreeNode): {\n sourceSize: number;\n bundledSize: number;\n gzipSize: number;\n} {\n if (!node.children || node.children.length === 0) {\n // Leaf node, just return value\n return {\n sourceSize: node.sourceSize ?? 0,\n bundledSize: node.bundledSize ?? 0,\n gzipSize: node.gzipSize ?? 0,\n };\n }\n // Recursively sum all child nodes\n let sourceSum = 0;\n let bundledSum = 0;\n let gzipSum = 0;\n for (const child of node.children) {\n const { sourceSize, bundledSize, gzipSize } = sumDirValue(child);\n sourceSum += sourceSize;\n bundledSum += bundledSize;\n gzipSum += gzipSize;\n }\n node.sourceSize = sourceSum;\n node.bundledSize = bundledSum;\n node.gzipSize = gzipSum;\n return { sourceSize: sourceSum, bundledSize: bundledSum, gzipSize: gzipSum };\n}\n\nexport function flattenTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const rawTree = buildTreemapData(modules, rootName);\n const flattenedTree = flattenSingleChildDirs(rawTree);\n sumDirValue(flattenedTree); // Recursive sum\n return flattenedTree;\n}\n"],"names":["rootDirname","file","sep","idx","mapFileKey","arr","depth","filter","d","res","parent","e","t","basenameKey","flattenDirectory","n","inlinedResourcePathKey","dirTitle","_dir","defaultTitle","c","createFileStructures","files","fileTitle","_file","basename","page","sepRegexp","RegExp","dir","exist","p","Boolean","props","getFileIcon","get","item","beautifyPath","path","cwd","readJSONByFileReader","Promise","resolve","reject","reader","FileReader","result","console","json","JSON","err","message","msg","Error","beautifyModulePath","modulePath","str","addRowIcon","data","expanded","Space","RightOutlined","FolderOpenTwoTone","FolderTwoTone","getFileCom","FileOutlined","buildTreemapData","modules","rootName","root","Map","mod","parts","current","i","part","child","clean","node","flattenSingleChildDirs","sumDirValue","sourceSum","bundledSum","gzipSum","sourceSize","bundledSize","gzipSize","flattenTreemapData","rawTree","flattenedTree"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsdoctor/components",
3
- "version": "1.3.13-beta.1",
3
+ "version": "1.3.14",
4
4
  "license": "MIT",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": {
@@ -55,7 +55,7 @@
55
55
  "@monaco-editor/react": "4.7.0",
56
56
  "ansi-to-react": "6.1.6",
57
57
  "antd": "5.19.1",
58
- "axios": "^1.12.2",
58
+ "axios": "^1.13.2",
59
59
  "clsx": "^2.1.1",
60
60
  "dayjs": "1.11.19",
61
61
  "echarts": "^5.6.0",
@@ -74,9 +74,9 @@
74
74
  "react-router-dom": "6.4.3",
75
75
  "socket.io-client": "4.8.1",
76
76
  "url-parse": "1.5.10",
77
- "@rsdoctor/utils": "1.3.13-beta.1",
78
- "@rsdoctor/graph": "1.3.13-beta.1",
79
- "@rsdoctor/types": "1.3.13-beta.1"
77
+ "@rsdoctor/graph": "1.3.14",
78
+ "@rsdoctor/types": "1.3.14",
79
+ "@rsdoctor/utils": "1.3.14"
80
80
  },
81
81
  "peerDependencies": {
82
82
  "react": ">=18.3.1",