@rsdoctor/components 1.4.0 → 1.4.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,7 +69,7 @@ function getLevelOption() {
69
69
  upperLabel: {
70
70
  show: true,
71
71
  color: '#ffffff',
72
- fontSize: 14,
72
+ fontSize: 12,
73
73
  height: 30
74
74
  }
75
75
  }
@@ -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, 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 chunkPath?: string,\n ): TreemapDataNode {\n const baseColor =\n parentColor || TREE_COLORS[index % TREE_COLORS.length];\n\n // For level 0 (chunk level), use the chunk's path/name as chunkPath\n const currentChunkPath =\n level === 0 ? node.path || node.name || '' : chunkPath || '';\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 currentChunkPath,\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 // Include chunk path in nodeId for non-root nodes to ensure uniqueness across chunks\n const nodeIdString =\n level === 0\n ? node.path || node.name || ''\n : `${currentChunkPath}::${node.path || node.name || ''}`;\n const nodeId = hashString(nodeIdString);\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, undefined),\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, chunkPath?: string) => {\n // For chunk level (root of filteredTreeData), use its path/name as chunkPath\n const currentChunkPath = chunkPath || node.path || node.name || '';\n\n if (node.path && regex.test(node.path)) {\n // Use the same nodeId calculation as in convert function\n const nodeIdString = chunkPath\n ? `${chunkPath}::${node.path}`\n : node.path;\n const nodeId = hashString(nodeIdString);\n results.push({ path: node.path, nodeId });\n }\n if (node.children) {\n node.children.forEach((child) =>\n collectMatchingPaths(child, currentChunkPath),\n );\n }\n };\n\n filteredTreeData.forEach((chunk) => collectMatchingPaths(chunk));\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","chunkPath","baseColor","TREE_COLORS","currentChunkPath","children","c","childIndex","nodeIdString","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","child","chunk","handleSearchResultClick","removeRootPath","filepath","getSize","type","calculateNodeTotalSize","childrenSize","sum","getChunkSize","name","n","sizeTypeToUse","FullscreenExitOutlined","FullscreenOutlined","RightOutlined","LeftOutlined","Radio","Input","SearchOutlined","Checkbox","a","displayPath","modules","ModuleAnalyzeComponent"],"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: 12,\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 chunkPath?: string,\n ): TreemapDataNode {\n const baseColor =\n parentColor || TREE_COLORS[index % TREE_COLORS.length];\n\n // For level 0 (chunk level), use the chunk's path/name as chunkPath\n const currentChunkPath =\n level === 0 ? node.path || node.name || '' : chunkPath || '';\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 currentChunkPath,\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 // Include chunk path in nodeId for non-root nodes to ensure uniqueness across chunks\n const nodeIdString =\n level === 0\n ? node.path || node.name || ''\n : `${currentChunkPath}::${node.path || node.name || ''}`;\n const nodeId = hashString(nodeIdString);\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, undefined),\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, chunkPath?: string) => {\n // For chunk level (root of filteredTreeData), use its path/name as chunkPath\n const currentChunkPath = chunkPath || node.path || node.name || '';\n\n if (node.path && regex.test(node.path)) {\n // Use the same nodeId calculation as in convert function\n const nodeIdString = chunkPath\n ? `${chunkPath}::${node.path}`\n : node.path;\n const nodeId = hashString(nodeIdString);\n results.push({ path: node.path, nodeId });\n }\n if (node.children) {\n node.children.forEach((child) =>\n collectMatchingPaths(child, currentChunkPath),\n );\n }\n };\n\n filteredTreeData.forEach((chunk) => collectMatchingPaths(chunk));\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","chunkPath","baseColor","TREE_COLORS","currentChunkPath","children","c","childIndex","nodeIdString","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","child","chunk","handleSearchResultClick","removeRootPath","filepath","getSize","type","calculateNodeTotalSize","childrenSize","sum","getChunkSize","name","n","sizeTypeToUse","FullscreenExitOutlined","FullscreenOutlined","RightOutlined","LeftOutlined","Radio","Input","SearchOutlined","Checkbox","a","displayPath","modules","ModuleAnalyzeComponent"],"mappings":"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"}
@@ -37,17 +37,15 @@ var constants_ChartTypes = /*#__PURE__*/ function(ChartTypes) {
37
37
  return ChartTypes;
38
38
  }({});
39
39
  const TREE_COLORS = [
40
+ '#bda29a',
40
41
  '#6F3FE1',
41
- '#072da1',
42
+ '#3966ed',
42
43
  '#0a5f74',
43
44
  '#3EBD7C',
44
45
  '#F7A925',
45
- '#bda29a',
46
46
  '#ca8622',
47
47
  '#749f83',
48
- '#6e7074',
49
- '#546570',
50
- '#c4ccd3'
48
+ '#6e7074'
51
49
  ];
52
50
  export { constants_ChartTypes as ChartTypes, PALETTE_COLORS, TREE_COLORS };
53
51
 
@@ -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 '#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"}
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 '#bda29a',\n '#6F3FE1',\n '#3966ed',\n '#0a5f74',\n '#3EBD7C',\n '#F7A925',\n '#ca8622',\n '#749f83',\n '#6e7074',\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;CACD"}
@@ -6,6 +6,18 @@ import { Header } from "./header.mjs";
6
6
  import { getEnableRoutesFromUrlQuery, getFirstVisitFromStorage, getLanguage, setFirstVisitToStorage, useI18n, useLocale, useUrlQuery } from "../../utils/index.mjs";
7
7
  import { Progress } from "./progress.mjs";
8
8
  import { ConfigContext } from "../../config.mjs";
9
+ import { SDK } from "@rsdoctor/types";
10
+ import { ServerAPIProvider } from "../Manifest/index.mjs";
11
+ import { ProjectInfoContext } from "./project-info-context.mjs";
12
+ const TitleUpdater = ({ name })=>{
13
+ useEffect(()=>{
14
+ if (name) document.title = `Rsdoctor - ${name}`;
15
+ else document.title = 'Rsdoctor';
16
+ }, [
17
+ name
18
+ ]);
19
+ return null;
20
+ };
9
21
  const Layout_Layout = (props)=>{
10
22
  const locale = useLocale();
11
23
  const { i18n } = useI18n();
@@ -32,26 +44,38 @@ const Layout_Layout = (props)=>{
32
44
  query
33
45
  ]);
34
46
  const ctx = useContext(ConfigContext);
35
- return /*#__PURE__*/ jsxs(Layout, {
36
- children: [
37
- ctx.embedded ? null : /*#__PURE__*/ jsx(Header, {
38
- enableRoutes: enableRoutes
39
- }),
40
- /*#__PURE__*/ jsx(Progress, {}),
41
- /*#__PURE__*/ jsxs(Layout.Content, {
42
- style: {
43
- height: '100%',
44
- minHeight: '100vh',
45
- padding: Size.BasePadding,
46
- marginTop: ctx.embedded ? 0 : Size.NavBarHeight,
47
- background: MAIN_BG
47
+ return /*#__PURE__*/ jsx(ServerAPIProvider, {
48
+ api: SDK.ServerAPI.API.GetProjectInfo,
49
+ showSkeleton: false,
50
+ children: (project)=>/*#__PURE__*/ jsx(ProjectInfoContext.Provider, {
51
+ value: {
52
+ project
48
53
  },
49
- children: [
50
- children,
51
- /*#__PURE__*/ jsx(FloatButton.BackTop, {})
52
- ]
54
+ children: /*#__PURE__*/ jsxs(Layout, {
55
+ children: [
56
+ /*#__PURE__*/ jsx(TitleUpdater, {
57
+ name: project?.name
58
+ }),
59
+ ctx.embedded ? null : /*#__PURE__*/ jsx(Header, {
60
+ enableRoutes: enableRoutes
61
+ }),
62
+ /*#__PURE__*/ jsx(Progress, {}),
63
+ /*#__PURE__*/ jsxs(Layout.Content, {
64
+ style: {
65
+ height: '100%',
66
+ minHeight: '100vh',
67
+ padding: Size.BasePadding,
68
+ marginTop: ctx.embedded ? 0 : Size.NavBarHeight,
69
+ background: MAIN_BG
70
+ },
71
+ children: [
72
+ children,
73
+ /*#__PURE__*/ jsx(FloatButton.BackTop, {})
74
+ ]
75
+ })
76
+ ]
77
+ })
53
78
  })
54
- ]
55
79
  });
56
80
  };
57
81
  export { Layout_Layout as Layout };
@@ -1 +1 @@
1
- {"version":3,"file":"components/Layout/index.mjs","sources":["../../../src/components/Layout/index.tsx"],"sourcesContent":["import { PropsWithChildren, useContext, useEffect, useState } from 'react';\nimport { FloatButton, Layout as L } from 'antd';\nimport { Language, MAIN_BG, Size } from '../../constants';\nimport { Header } from './header';\nimport {\n useLocale,\n useI18n,\n getFirstVisitFromStorage,\n setFirstVisitToStorage,\n getLanguage,\n useUrlQuery,\n getEnableRoutesFromUrlQuery,\n} from '../../utils';\nimport { Progress } from './progress';\nimport { ConfigContext } from '../../config';\n\nexport interface LayoutProps {\n children: JSX.Element;\n}\n\nexport const Layout = (props: PropsWithChildren<LayoutProps>): JSX.Element => {\n const locale = useLocale();\n const { i18n } = useI18n();\n const { children } = props;\n const query = useUrlQuery();\n const [enableRoutes, setEnableRoutes] = useState<string[] | undefined>(\n () => getEnableRoutesFromUrlQuery() || undefined,\n );\n\n useEffect(() => {\n let currentLocale = locale;\n // Check if the user is visiting the site for the first time\n const visited = getFirstVisitFromStorage();\n if (!visited) {\n setFirstVisitToStorage('1');\n const targetLang = window.navigator.language.split('-')[0];\n const userLang = getLanguage(targetLang);\n\n if (Object.values(Language).includes(userLang)) {\n currentLocale = userLang;\n }\n }\n\n if (i18n.language !== currentLocale) {\n i18n.changeLanguage(currentLocale);\n }\n }, [locale]);\n\n // Listen for enableRoutes changes in URL query parameters\n useEffect(() => {\n const newEnableRoutes = getEnableRoutesFromUrlQuery();\n setEnableRoutes(newEnableRoutes || undefined);\n }, [query]);\n\n const ctx = useContext(ConfigContext);\n return (\n <L>\n {!ctx.embedded ? <Header enableRoutes={enableRoutes} /> : null}\n <Progress />\n <L.Content\n style={{\n height: '100%',\n minHeight: '100vh',\n padding: Size.BasePadding,\n marginTop: !ctx.embedded ? Size.NavBarHeight : 0,\n background: MAIN_BG,\n }}\n >\n {children}\n <FloatButton.BackTop />\n </L.Content>\n </L>\n );\n};\n"],"names":["Layout","props","locale","useLocale","i18n","useI18n","children","query","useUrlQuery","enableRoutes","setEnableRoutes","useState","getEnableRoutesFromUrlQuery","undefined","useEffect","currentLocale","visited","getFirstVisitFromStorage","setFirstVisitToStorage","targetLang","window","userLang","getLanguage","Object","Language","newEnableRoutes","ctx","useContext","ConfigContext","L","Header","Progress","Size","MAIN_BG","FloatButton"],"mappings":";;;;;;;;AAoBO,MAAMA,gBAAS,CAACC;IACrB,MAAMC,SAASC;IACf,MAAM,EAAEC,IAAI,EAAE,GAAGC;IACjB,MAAM,EAAEC,QAAQ,EAAE,GAAGL;IACrB,MAAMM,QAAQC;IACd,MAAM,CAACC,cAAcC,gBAAgB,GAAGC,SACtC,IAAMC,iCAAiCC;IAGzCC,UAAU;QACR,IAAIC,gBAAgBb;QAEpB,MAAMc,UAAUC;QAChB,IAAI,CAACD,SAAS;YACZE,uBAAuB;YACvB,MAAMC,aAAaC,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC1D,MAAMC,WAAWC,YAAYH;YAE7B,IAAII,OAAO,MAAM,CAACC,UAAU,QAAQ,CAACH,WACnCN,gBAAgBM;QAEpB;QAEA,IAAIjB,KAAK,QAAQ,KAAKW,eACpBX,KAAK,cAAc,CAACW;IAExB,GAAG;QAACb;KAAO;IAGXY,UAAU;QACR,MAAMW,kBAAkBb;QACxBF,gBAAgBe,mBAAmBZ;IACrC,GAAG;QAACN;KAAM;IAEV,MAAMmB,MAAMC,WAAWC;IACvB,OAAO,WAAP,GACE,KAACC,QAACA;;YACEH,IAAI,QAAQ,GAA4C,OAAzC,WAAH,GAAG,IAACI,QAAMA;gBAAC,cAAcrB;;0BACvC,IAACsB,UAAQA,CAAAA;0BACT,KAACF,OAAAA,OAAS;gBACR,OAAO;oBACL,QAAQ;oBACR,WAAW;oBACX,SAASG,KAAK,WAAW;oBACzB,WAAW,AAACN,IAAI,QAAQ,GAAuB,IAApBM,KAAK,YAAY;oBAC5C,YAAYC;gBACd;;oBAEC3B;kCACD,IAAC4B,YAAY,OAAO;;;;;AAI5B"}
1
+ {"version":3,"file":"components/Layout/index.mjs","sources":["../../../src/components/Layout/index.tsx"],"sourcesContent":["import { PropsWithChildren, useContext, useEffect, useState } from 'react';\nimport { FloatButton, Layout as L } from 'antd';\nimport { Language, MAIN_BG, Size } from '../../constants';\nimport { Header } from './header';\nimport {\n useLocale,\n useI18n,\n getFirstVisitFromStorage,\n setFirstVisitToStorage,\n getLanguage,\n useUrlQuery,\n getEnableRoutesFromUrlQuery,\n} from '../../utils';\nimport { Progress } from './progress';\nimport { ConfigContext } from '../../config';\nimport { SDK } from '@rsdoctor/types';\nimport { ServerAPIProvider } from '../Manifest';\nimport { ProjectInfoContext } from './project-info-context';\n\nexport interface LayoutProps {\n children: JSX.Element;\n}\n\nconst TitleUpdater: React.FC<{\n name?: string;\n}> = ({ name }) => {\n useEffect(() => {\n if (name) {\n document.title = `Rsdoctor - ${name}`;\n } else {\n document.title = 'Rsdoctor';\n }\n }, [name]);\n\n return null;\n};\n\nexport const Layout = (props: PropsWithChildren<LayoutProps>): JSX.Element => {\n const locale = useLocale();\n const { i18n } = useI18n();\n const { children } = props;\n const query = useUrlQuery();\n const [enableRoutes, setEnableRoutes] = useState<string[] | undefined>(\n () => getEnableRoutesFromUrlQuery() || undefined,\n );\n\n useEffect(() => {\n let currentLocale = locale;\n // Check if the user is visiting the site for the first time\n const visited = getFirstVisitFromStorage();\n if (!visited) {\n setFirstVisitToStorage('1');\n const targetLang = window.navigator.language.split('-')[0];\n const userLang = getLanguage(targetLang);\n\n if (Object.values(Language).includes(userLang)) {\n currentLocale = userLang;\n }\n }\n\n if (i18n.language !== currentLocale) {\n i18n.changeLanguage(currentLocale);\n }\n }, [locale]);\n\n // Listen for enableRoutes changes in URL query parameters\n useEffect(() => {\n const newEnableRoutes = getEnableRoutesFromUrlQuery();\n setEnableRoutes(newEnableRoutes || undefined);\n }, [query]);\n\n const ctx = useContext(ConfigContext);\n\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetProjectInfo}\n showSkeleton={false}\n >\n {(project) => (\n <ProjectInfoContext.Provider value={{ project }}>\n <L>\n <TitleUpdater name={project?.name} />\n {!ctx.embedded ? <Header enableRoutes={enableRoutes} /> : null}\n <Progress />\n <L.Content\n style={{\n height: '100%',\n minHeight: '100vh',\n padding: Size.BasePadding,\n marginTop: !ctx.embedded ? Size.NavBarHeight : 0,\n background: MAIN_BG,\n }}\n >\n {children}\n <FloatButton.BackTop />\n </L.Content>\n </L>\n </ProjectInfoContext.Provider>\n )}\n </ServerAPIProvider>\n );\n};\n"],"names":["TitleUpdater","name","useEffect","document","Layout","props","locale","useLocale","i18n","useI18n","children","query","useUrlQuery","enableRoutes","setEnableRoutes","useState","getEnableRoutesFromUrlQuery","undefined","currentLocale","visited","getFirstVisitFromStorage","setFirstVisitToStorage","targetLang","window","userLang","getLanguage","Object","Language","newEnableRoutes","ctx","useContext","ConfigContext","ServerAPIProvider","SDK","project","ProjectInfoContext","L","Header","Progress","Size","MAIN_BG","FloatButton"],"mappings":";;;;;;;;;;;AAuBA,MAAMA,eAED,CAAC,EAAEC,IAAI,EAAE;IACZC,UAAU;QACR,IAAID,MACFE,SAAS,KAAK,GAAG,CAAC,WAAW,EAAEF,MAAM;aAErCE,SAAS,KAAK,GAAG;IAErB,GAAG;QAACF;KAAK;IAET,OAAO;AACT;AAEO,MAAMG,gBAAS,CAACC;IACrB,MAAMC,SAASC;IACf,MAAM,EAAEC,IAAI,EAAE,GAAGC;IACjB,MAAM,EAAEC,QAAQ,EAAE,GAAGL;IACrB,MAAMM,QAAQC;IACd,MAAM,CAACC,cAAcC,gBAAgB,GAAGC,SACtC,IAAMC,iCAAiCC;IAGzCf,UAAU;QACR,IAAIgB,gBAAgBZ;QAEpB,MAAMa,UAAUC;QAChB,IAAI,CAACD,SAAS;YACZE,uBAAuB;YACvB,MAAMC,aAAaC,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC1D,MAAMC,WAAWC,YAAYH;YAE7B,IAAII,OAAO,MAAM,CAACC,UAAU,QAAQ,CAACH,WACnCN,gBAAgBM;QAEpB;QAEA,IAAIhB,KAAK,QAAQ,KAAKU,eACpBV,KAAK,cAAc,CAACU;IAExB,GAAG;QAACZ;KAAO;IAGXJ,UAAU;QACR,MAAM0B,kBAAkBZ;QACxBF,gBAAgBc,mBAAmBX;IACrC,GAAG;QAACN;KAAM;IAEV,MAAMkB,MAAMC,WAAWC;IAEvB,OAAO,WAAP,GACE,IAACC,mBAAiBA;QAChB,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;QACrC,cAAc;kBAEb,CAACC,UAAAA,WAAAA,GACA,IAACC,mBAAmB,QAAQ;gBAAC,OAAO;oBAAED;gBAAQ;0BAC5C,mBAACE,QAACA;;sCACA,IAACpC,cAAAA;4BAAa,MAAMkC,SAAS;;wBAC3BL,IAAI,QAAQ,GAA4C,OAAzC,WAAH,GAAG,IAACQ,QAAMA;4BAAC,cAAcxB;;sCACvC,IAACyB,UAAQA,CAAAA;sCACT,KAACF,OAAAA,OAAS;4BACR,OAAO;gCACL,QAAQ;gCACR,WAAW;gCACX,SAASG,KAAK,WAAW;gCACzB,WAAW,AAACV,IAAI,QAAQ,GAAuB,IAApBU,KAAK,YAAY;gCAC5C,YAAYC;4BACd;;gCAEC9B;8CACD,IAAC+B,YAAY,OAAO;;;;;;;AAOlC"}
@@ -0,0 +1,6 @@
1
+ import { SDK } from '@rsdoctor/types';
2
+ export interface ProjectInfoContextValue {
3
+ project: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetProjectInfo> | null;
4
+ }
5
+ export declare const ProjectInfoContext: import("react").Context<ProjectInfoContextValue>;
6
+ export declare function useProjectInfo(): ProjectInfoContextValue;
@@ -0,0 +1,10 @@
1
+ import { createContext, useContext } from "react";
2
+ const ProjectInfoContext = /*#__PURE__*/ createContext({
3
+ project: null
4
+ });
5
+ function useProjectInfo() {
6
+ return useContext(ProjectInfoContext);
7
+ }
8
+ export { ProjectInfoContext, useProjectInfo };
9
+
10
+ //# sourceMappingURL=project-info-context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Layout/project-info-context.mjs","sources":["../../../src/components/Layout/project-info-context.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport { SDK } from '@rsdoctor/types';\n\nexport interface ProjectInfoContextValue {\n project: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetProjectInfo> | null;\n}\n\nexport const ProjectInfoContext = createContext<ProjectInfoContextValue>({\n project: null,\n});\n\nexport function useProjectInfo() {\n return useContext(ProjectInfoContext);\n}\n"],"names":["ProjectInfoContext","createContext","useProjectInfo","useContext"],"mappings":";AAOO,MAAMA,qBAAqB,WAArBA,GAAqBC,cAAuC;IACvE,SAAS;AACX;AAEO,SAASC;IACd,OAAOC,WAAWH;AACpB"}
@@ -4,4 +4,5 @@ export declare const ProjectOverall: React.FC<{
4
4
  cwd: string;
5
5
  envinfo: SDK.EnvInfo;
6
6
  alerts: SDK.ErrorsData;
7
+ name?: string;
7
8
  }>;
@@ -10,11 +10,18 @@ import project_module from "./project.module.mjs";
10
10
  import list_module from "./list.module.mjs";
11
11
  import card_module from "./card.module.mjs";
12
12
  import { SDK } from "@rsdoctor/types";
13
- const ProjectOverall = ({ configs = [], cwd, envinfo, alerts = [] })=>{
13
+ const ProjectOverall = ({ configs = [], cwd, envinfo, alerts = [], name })=>{
14
14
  const { t } = useI18n();
15
15
  const warns = alerts.filter((e)=>'warn' === e.level).length;
16
16
  const errors = alerts.length - warns;
17
17
  const items = [
18
+ ...name ? [
19
+ {
20
+ key: 'name',
21
+ label: 'Builder',
22
+ children: name
23
+ }
24
+ ] : [],
18
25
  ...Object.keys(envinfo).map((key)=>{
19
26
  const regexp = /Version$/;
20
27
  const isVersion = regexp.test(key);
@@ -25,10 +32,10 @@ const ProjectOverall = ({ configs = [], cwd, envinfo, alerts = [] })=>{
25
32
  };
26
33
  }),
27
34
  ...configs.filter((item)=>!!item.version).map((config)=>{
28
- const { name, version } = config;
35
+ const { name: configName, version } = config;
29
36
  return {
30
- key: name,
31
- label: name,
37
+ key: configName,
38
+ label: configName,
32
39
  children: version
33
40
  };
34
41
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"components/Overall/project.mjs","sources":["../../../src/components/Overall/project.tsx"],"sourcesContent":["import { Descriptions, DescriptionsProps, Avatar } from 'antd';\nimport {\n CloseCircleFilled,\n WarningFilled,\n FileFilled,\n ExperimentFilled,\n} from '@ant-design/icons';\n\nimport { ServerAPIProvider } from '../Manifest';\nimport { useI18n, formatSize } from '../../utils';\nimport { WebpackConfigurationViewer } from '../Configuration';\nimport { Card } from '../Card';\nimport { Overview } from './overview';\nimport styles from './project.module.scss';\n\nimport listStyles from './list.module.scss';\nimport cardStyles from './card.module.scss';\nimport projectStyles from './project.module.scss';\n\nimport { SDK } from '@rsdoctor/types';\n\nexport const ProjectOverall: React.FC<{\n configs: SDK.ConfigData;\n cwd: string;\n envinfo: SDK.EnvInfo;\n alerts: SDK.ErrorsData;\n}> = ({ configs = [], cwd, envinfo, alerts = [] }) => {\n const { t } = useI18n();\n\n const warns = alerts.filter((e) => e.level === 'warn').length;\n\n const errors = alerts.length - warns;\n\n const items: DescriptionsProps['items'] = [\n ...Object.keys(envinfo).map((key) => {\n const regexp = /Version$/;\n const isVersion = regexp.test(key);\n return {\n key,\n label: isVersion ? key.replace(regexp, '') : key,\n children: envinfo ? envinfo[key] : undefined,\n };\n }),\n ...configs\n .filter((item) => !!item.version)\n .map((config) => {\n const { name, version } = config;\n return {\n key: name,\n label: name,\n children: version,\n };\n }),\n {\n key: 'cwd',\n label: 'cwd',\n children: cwd,\n },\n ];\n\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetAssetsSummary}\n body={{ withFileContent: false }}\n >\n {(res) => {\n const totalSizeStr = formatSize(res.all.total.size);\n const totalFiles = res.all.total.count;\n const [size, unit] = totalSizeStr.split(' ');\n const overViewData = [\n {\n title: 'Errors',\n description: <span style={{ color: '#FF4D4F' }}>{errors}</span>,\n icon: (\n <Avatar\n style={{ background: '#FF4D4F' }}\n shape=\"circle\"\n icon={<CloseCircleFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Warnings',\n description: <span style={{ color: '#FAAD14' }}>{warns}</span>,\n icon: (\n <Avatar\n style={{ background: '#FAAD14' }}\n shape=\"circle\"\n icon={<WarningFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Total Files',\n description: <span>{totalFiles}</span>,\n icon: (\n <Avatar\n style={{ background: '#3874F6' }}\n shape=\"circle\"\n icon={<FileFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Total Size',\n description: (\n <>\n <span style={{ fontSize: '20px' }}>{size}</span>\n <span style={{ fontSize: '13px', marginLeft: '5px' }}>\n {unit}\n </span>\n </>\n ),\n icon: (\n <Avatar\n style={{ background: 'rgba(226, 129, 73)' }}\n shape=\"circle\"\n icon={<ExperimentFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n ];\n\n return (\n <Card className={cardStyles.card}>\n <div>\n <div className={styles.title}>\n <span className={styles.left}>{t('Project Overall')}</span>\n <WebpackConfigurationViewer />\n </div>\n <div className={projectStyles.overview}>\n {overViewData.map((data, idx) => (\n <Overview\n key={idx}\n title={data.title}\n description={<span>{data.description}</span>}\n icon={data.icon}\n />\n ))}\n </div>\n <Descriptions\n className={listStyles.projectOverall}\n items={items}\n />\n </div>\n </Card>\n );\n }}\n </ServerAPIProvider>\n );\n};\n"],"names":["ProjectOverall","configs","cwd","envinfo","alerts","t","useI18n","warns","e","errors","items","Object","key","regexp","isVersion","undefined","item","config","name","version","ServerAPIProvider","SDK","res","totalSizeStr","formatSize","totalFiles","size","unit","overViewData","Avatar","CloseCircleFilled","WarningFilled","FileFilled","ExperimentFilled","Card","cardStyles","styles","WebpackConfigurationViewer","projectStyles","data","idx","Overview","Descriptions","listStyles"],"mappings":"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"}
1
+ {"version":3,"file":"components/Overall/project.mjs","sources":["../../../src/components/Overall/project.tsx"],"sourcesContent":["import { Descriptions, DescriptionsProps, Avatar } from 'antd';\nimport {\n CloseCircleFilled,\n WarningFilled,\n FileFilled,\n ExperimentFilled,\n} from '@ant-design/icons';\n\nimport { ServerAPIProvider } from '../Manifest';\nimport { useI18n, formatSize } from '../../utils';\nimport { WebpackConfigurationViewer } from '../Configuration';\nimport { Card } from '../Card';\nimport { Overview } from './overview';\nimport styles from './project.module.scss';\n\nimport listStyles from './list.module.scss';\nimport cardStyles from './card.module.scss';\nimport projectStyles from './project.module.scss';\n\nimport { SDK } from '@rsdoctor/types';\n\nexport const ProjectOverall: React.FC<{\n configs: SDK.ConfigData;\n cwd: string;\n envinfo: SDK.EnvInfo;\n alerts: SDK.ErrorsData;\n name?: string;\n}> = ({ configs = [], cwd, envinfo, alerts = [], name }) => {\n const { t } = useI18n();\n\n const warns = alerts.filter((e) => e.level === 'warn').length;\n\n const errors = alerts.length - warns;\n\n const items: DescriptionsProps['items'] = [\n ...(name\n ? [\n {\n key: 'name',\n label: 'Builder',\n children: name,\n },\n ]\n : []),\n ...Object.keys(envinfo).map((key) => {\n const regexp = /Version$/;\n const isVersion = regexp.test(key);\n return {\n key,\n label: isVersion ? key.replace(regexp, '') : key,\n children: envinfo ? envinfo[key] : undefined,\n };\n }),\n ...configs\n .filter((item) => !!item.version)\n .map((config) => {\n const { name: configName, version } = config;\n return {\n key: configName,\n label: configName,\n children: version,\n };\n }),\n {\n key: 'cwd',\n label: 'cwd',\n children: cwd,\n },\n ];\n\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetAssetsSummary}\n body={{ withFileContent: false }}\n >\n {(res) => {\n const totalSizeStr = formatSize(res.all.total.size);\n const totalFiles = res.all.total.count;\n const [size, unit] = totalSizeStr.split(' ');\n const overViewData = [\n {\n title: 'Errors',\n description: <span style={{ color: '#FF4D4F' }}>{errors}</span>,\n icon: (\n <Avatar\n style={{ background: '#FF4D4F' }}\n shape=\"circle\"\n icon={<CloseCircleFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Warnings',\n description: <span style={{ color: '#FAAD14' }}>{warns}</span>,\n icon: (\n <Avatar\n style={{ background: '#FAAD14' }}\n shape=\"circle\"\n icon={<WarningFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Total Files',\n description: <span>{totalFiles}</span>,\n icon: (\n <Avatar\n style={{ background: '#3874F6' }}\n shape=\"circle\"\n icon={<FileFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Total Size',\n description: (\n <>\n <span style={{ fontSize: '20px' }}>{size}</span>\n <span style={{ fontSize: '13px', marginLeft: '5px' }}>\n {unit}\n </span>\n </>\n ),\n icon: (\n <Avatar\n style={{ background: 'rgba(226, 129, 73)' }}\n shape=\"circle\"\n icon={<ExperimentFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n ];\n\n return (\n <Card className={cardStyles.card}>\n <div>\n <div className={styles.title}>\n <span className={styles.left}>{t('Project Overall')}</span>\n <WebpackConfigurationViewer />\n </div>\n <div className={projectStyles.overview}>\n {overViewData.map((data, idx) => (\n <Overview\n key={idx}\n title={data.title}\n description={<span>{data.description}</span>}\n icon={data.icon}\n />\n ))}\n </div>\n <Descriptions\n className={listStyles.projectOverall}\n items={items}\n />\n </div>\n </Card>\n );\n }}\n </ServerAPIProvider>\n );\n};\n"],"names":["ProjectOverall","configs","cwd","envinfo","alerts","name","t","useI18n","warns","e","errors","items","Object","key","regexp","isVersion","undefined","item","config","configName","version","ServerAPIProvider","SDK","res","totalSizeStr","formatSize","totalFiles","size","unit","overViewData","Avatar","CloseCircleFilled","WarningFilled","FileFilled","ExperimentFilled","Card","cardStyles","styles","WebpackConfigurationViewer","projectStyles","data","idx","Overview","Descriptions","listStyles"],"mappings":"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"}
@@ -430,11 +430,12 @@ const AssetDetail = ({ asset, chunks: includeChunks, modules: includeModules, mo
430
430
  moduleSizeLimit
431
431
  ]);
432
432
  const fileStructures = useMemo(()=>{
433
+ const normalizePath = (path)=>path.replace(/\\/g, '/');
433
434
  const res = createFileStructures({
434
435
  files: filteredModules.map((e)=>e.path).filter(Boolean),
435
436
  inlinedResourcePathKey,
436
437
  fileTitle (file, basename) {
437
- const mod = filteredModules.find((e)=>e.path === file);
438
+ const mod = filteredModules.find((e)=>normalizePath(e.path) === normalizePath(file));
438
439
  if (!mod) return basename;
439
440
  const { parsedSize = 0, sourceSize = 0, gzipSize = 0 } = mod.size;
440
441
  const isConcatenation = mod.kind === SDK.ModuleKind.Concatenation;
@@ -566,9 +567,10 @@ const AssetDetail = ({ asset, chunks: includeChunks, modules: includeModules, mo
566
567
  const mods = [];
567
568
  const paths = getChildrenModule(dir, mods);
568
569
  if (paths.length) {
569
- const mods = paths.map((e)=>includeModules.find((m)=>m.path === e));
570
- const parsedSize = sumBy(mods, (e)=>e.size?.parsedSize || 0);
571
- const sourceSize = sumBy(mods, (e)=>e.size?.sourceSize || 0);
570
+ const normalizePath = (path)=>path.replace(/\\/g, '/');
571
+ const mods = paths.map((e)=>includeModules.find((m)=>normalizePath(m.path) === normalizePath(e)));
572
+ const parsedSize = sumBy(mods, (e)=>e?.size?.parsedSize || 0);
573
+ const sourceSize = sumBy(mods, (e)=>e?.size?.sourceSize || 0);
572
574
  return /*#__PURE__*/ jsxs("div", {
573
575
  className: index_module["bundle-tree"],
574
576
  children: [