@rsdoctor/components 1.3.13-beta.1 → 1.3.13

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.
@@ -7,13 +7,13 @@ import { CanvasRenderer } from "echarts/renderers";
7
7
  import dayjs from "dayjs";
8
8
  import { groupBy } from "es-toolkit/compat";
9
9
  import { ChartTypes, PALETTE_COLORS } from "../constants.mjs";
10
- import * as __WEBPACK_EXTERNAL_MODULE_echarts_core_d2845954__ from "echarts/core";
10
+ import * as __rspack_external_echarts_core_d2845954 from "echarts/core";
11
11
  const LINE_HEIGHT = 60;
12
12
  const TimelineCom = /*#__PURE__*/ memo(({ loaderData, pluginsData, formatterFn, chartType = ChartTypes.Normal, exts = null })=>{
13
13
  const data = [];
14
14
  let categories = [];
15
15
  const [optionsData, setOptionsData] = useState({});
16
- __WEBPACK_EXTERNAL_MODULE_echarts_core_d2845954__.use([
16
+ __rspack_external_echarts_core_d2845954.use([
17
17
  CustomChart,
18
18
  TooltipComponent,
19
19
  GridComponent,
@@ -110,7 +110,7 @@ const TimelineCom = /*#__PURE__*/ memo(({ loaderData, pluginsData, formatterFn,
110
110
  0,
111
111
  1
112
112
  ])[1];
113
- const rectShape = __WEBPACK_EXTERNAL_MODULE_echarts_core_d2845954__.graphic.clipRectByRect({
113
+ const rectShape = __rspack_external_echarts_core_d2845954.graphic.clipRectByRect({
114
114
  x: start[0],
115
115
  y: chartType === ChartTypes.Loader ? start[1] - (categoryIndex % 2 !== 0 ? 0 : 2 * height) : start[1],
116
116
  width: end[0] - start[0] || 5,
@@ -223,7 +223,7 @@ const TimelineCom = /*#__PURE__*/ memo(({ loaderData, pluginsData, formatterFn,
223
223
  ]);
224
224
  return /*#__PURE__*/ jsx(core, {
225
225
  option: optionsData,
226
- echarts: __WEBPACK_EXTERNAL_MODULE_echarts_core_d2845954__,
226
+ echarts: __rspack_external_echarts_core_d2845954,
227
227
  style: {
228
228
  width: '100%',
229
229
  minHeight: chartType === ChartTypes.Loader ? '500px' : chartType === ChartTypes.Minify ? '100px' : '200px',
@@ -1 +1 @@
1
- {"version":3,"file":"components/Charts/TimelineCharts/index.mjs","sources":["../../../../src/components/Charts/TimelineCharts/index.tsx"],"sourcesContent":["import React, { useState, useEffect, memo } from 'react';\nimport ReactEChartsCore from 'echarts-for-react/esm/core';\nimport * as echarts from 'echarts/core';\nimport { CustomChart } from 'echarts/charts';\nimport {\n TooltipComponent,\n GridComponent,\n DataZoomComponent,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport dayjs from 'dayjs';\nimport { ChartProps, DurationMetric, ITraceEventData } from '../types';\nimport { groupBy } from 'es-toolkit/compat';\nimport { ChartTypes, PALETTE_COLORS } from '../constants';\n\ninterface CoordSysType {\n x: number;\n y: number;\n width: number;\n height: number;\n}\ntype LoaderType = {\n name: string;\n value: number[];\n itemStyle: { normal: { color: string; opacity?: number } };\n ext?: Record<string, any>;\n};\n\nconst LINE_HEIGHT = 60;\n\nexport const TimelineCom: React.FC<{\n loaderData?: DurationMetric[];\n pluginsData?: ITraceEventData[];\n formatterFn: Function;\n chartType?: ChartTypes;\n exts?: { endTimestamp: number; startTimestamp: number };\n}> = memo(\n ({\n loaderData,\n pluginsData,\n formatterFn,\n chartType = ChartTypes.Normal,\n exts = null,\n }) => {\n const data: LoaderType[] = [];\n let categories: string[] = [];\n const [optionsData, setOptionsData] = useState({});\n\n // Register the required components\n echarts.use([\n CustomChart,\n TooltipComponent,\n GridComponent,\n DataZoomComponent,\n CanvasRenderer,\n ]);\n\n useEffect(() => {\n if (!loaderData) return;\n const _categories: string[] = [];\n loaderData.forEach((_l) => {\n _categories.unshift(_l.n + ' total');\n _categories.unshift(_l.n);\n });\n\n // Generate mock data\n loaderData.forEach(function (_loaderData, _i) {\n data.push({\n name: _loaderData.n + ' total',\n value: [\n _categories.indexOf(_loaderData.n + ' total'),\n _loaderData.s,\n _loaderData.e,\n _loaderData.e - _loaderData.s,\n ],\n itemStyle: {\n normal: {\n color: PALETTE_COLORS[Math.floor(Math.random() * 27)],\n opacity: 0.25,\n },\n },\n });\n\n if (!_loaderData?.c) return;\n for (let l = 0; l < _loaderData?.c?.length; l++) {\n data.push({\n name: _loaderData.n,\n value: [\n _categories.indexOf(_loaderData.n),\n _loaderData.c[l].s,\n _loaderData.c[l].e,\n _loaderData.c[l].e - _loaderData.c[l].s,\n ],\n itemStyle: {\n normal: {\n color: PALETTE_COLORS[Math.floor(Math.random() * 27)],\n opacity: 0.25,\n },\n },\n ext: _loaderData.c[l].ext as ChartProps['loaders'][0],\n });\n }\n });\n\n categories = _categories.map((val, i) => {\n if (i % 2 !== 0) {\n return val.replace(' total', '');\n } else {\n return '';\n }\n });\n }, [loaderData]);\n\n useEffect(() => {\n if (!pluginsData) return;\n\n const _pluginsData = groupBy(pluginsData, (e: ITraceEventData) => e.pid);\n\n Object.keys(_pluginsData)\n .reverse()\n .forEach(function (key, i) {\n _pluginsData[key].forEach((_plugin, _i) => {\n data.push({\n name: String(_plugin.pid),\n value: [\n i,\n _plugin.args.s,\n _plugin.args.e,\n _plugin.args.e - _plugin.args.s,\n ],\n itemStyle: {\n normal: {\n color: PALETTE_COLORS[Math.floor(Math.random() * 27)],\n opacity: 0.25,\n },\n },\n ext: _plugin,\n });\n });\n categories.push(String(key.charAt(0).toUpperCase() + key.slice(1)));\n });\n }, [pluginsData]);\n\n useEffect(() => {\n function renderItem(\n params: { coordSys: CoordSysType },\n api: {\n value: (arg0: number) => number;\n coord: (arg0: number[]) => any;\n size: (arg0: number[]) => number[];\n style: () => string;\n },\n ) {\n const categoryIndex = api.value(0);\n const start = api.coord([api.value(1), categoryIndex]);\n const end = api.coord([api.value(2), categoryIndex]);\n const height = api.size([0, 1])[1] * 0.3;\n\n const rectShape = echarts.graphic.clipRectByRect(\n {\n x: start[0],\n y:\n chartType === ChartTypes.Loader\n ? start[1] - (categoryIndex % 2 !== 0 ? 0 : height * 2)\n : start[1],\n width: end[0] - start[0] || 5,\n height: height,\n },\n {\n x: params.coordSys.x,\n y: params.coordSys.y,\n width: params.coordSys.width,\n height: params.coordSys.height,\n },\n );\n return (\n rectShape && {\n type: 'rect',\n transition: ['shape'],\n shape: rectShape,\n style: api.style(),\n enterFrom: {\n style: { opacity: 0 },\n x: 0,\n },\n }\n );\n }\n\n const option = {\n tooltip: {\n formatter: (raw: any) => {\n return formatterFn(raw);\n },\n },\n dataZoom: [\n {\n type: 'slider',\n filterMode: 'weakFilter',\n showDataShadow: false,\n top: -10,\n },\n {\n type: 'inside',\n filterMode: 'weakFilter',\n },\n ],\n grid: {\n top: 10,\n left: 0,\n bottom: 10,\n right: 0,\n height:\n categories.length > (chartType === ChartTypes.Loader ? 6 : 3)\n ? 'auto'\n : categories.length * LINE_HEIGHT,\n containLabel: true,\n },\n xAxis: {\n interval:\n exts?.endTimestamp && exts?.startTimestamp\n ? Math.floor((exts.endTimestamp - exts.startTimestamp) / 8)\n : null,\n position: 'top',\n splitLine: {\n show: true,\n },\n scale: true,\n axisLine: {\n show: false,\n },\n axisLabel: {\n formatter(val: number) {\n return dayjs(val as number).format('HH:mm:ss:SSS');\n },\n },\n },\n yAxis: {\n type: 'category',\n splitLine: {\n show: false,\n },\n axisLabel: {\n inside: true,\n lineHeight: 20,\n width: 100,\n fontSize: 12,\n color: '#000',\n verticalAlign: 'bottom',\n },\n axisLine: {\n show: false,\n },\n axisTick: {\n show: false,\n },\n data: categories,\n },\n series: [\n {\n type: 'custom',\n renderItem,\n itemStyle: {\n opacity: 0.8,\n },\n encode: {\n x: [1, 2],\n y: 0,\n },\n data,\n },\n ],\n };\n setOptionsData(option);\n }, [loaderData, pluginsData, exts]);\n\n return (\n <ReactEChartsCore\n option={optionsData}\n echarts={echarts}\n style={{\n width: '100%',\n minHeight:\n chartType === ChartTypes.Loader\n ? '500px'\n : chartType === ChartTypes.Minify\n ? '100px'\n : '200px',\n maxHeight: chartType === ChartTypes.Minify ? '100px' : '1000px',\n border: '1px solid #eee',\n borderRadius: '10px',\n }}\n />\n );\n },\n);\n"],"names":["LINE_HEIGHT","TimelineCom","memo","loaderData","pluginsData","formatterFn","chartType","ChartTypes","exts","data","categories","optionsData","setOptionsData","useState","echarts","CustomChart","TooltipComponent","GridComponent","DataZoomComponent","CanvasRenderer","useEffect","_categories","_l","_loaderData","_i","PALETTE_COLORS","Math","l","val","i","_pluginsData","groupBy","e","Object","key","_plugin","String","renderItem","params","api","categoryIndex","start","end","height","rectShape","option","raw","dayjs","ReactEChartsCore"],"mappings":"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"}
1
+ {"version":3,"file":"components/Charts/TimelineCharts/index.mjs","sources":["../../../../src/components/Charts/TimelineCharts/index.tsx"],"sourcesContent":["import React, { useState, useEffect, memo } from 'react';\nimport ReactEChartsCore from 'echarts-for-react/esm/core';\nimport * as echarts from 'echarts/core';\nimport { CustomChart } from 'echarts/charts';\nimport {\n TooltipComponent,\n GridComponent,\n DataZoomComponent,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport dayjs from 'dayjs';\nimport { ChartProps, DurationMetric, ITraceEventData } from '../types';\nimport { groupBy } from 'es-toolkit/compat';\nimport { ChartTypes, PALETTE_COLORS } from '../constants';\n\ninterface CoordSysType {\n x: number;\n y: number;\n width: number;\n height: number;\n}\ntype LoaderType = {\n name: string;\n value: number[];\n itemStyle: { normal: { color: string; opacity?: number } };\n ext?: Record<string, any>;\n};\n\nconst LINE_HEIGHT = 60;\n\nexport const TimelineCom: React.FC<{\n loaderData?: DurationMetric[];\n pluginsData?: ITraceEventData[];\n formatterFn: Function;\n chartType?: ChartTypes;\n exts?: { endTimestamp: number; startTimestamp: number };\n}> = memo(\n ({\n loaderData,\n pluginsData,\n formatterFn,\n chartType = ChartTypes.Normal,\n exts = null,\n }) => {\n const data: LoaderType[] = [];\n let categories: string[] = [];\n const [optionsData, setOptionsData] = useState({});\n\n // Register the required components\n echarts.use([\n CustomChart,\n TooltipComponent,\n GridComponent,\n DataZoomComponent,\n CanvasRenderer,\n ]);\n\n useEffect(() => {\n if (!loaderData) return;\n const _categories: string[] = [];\n loaderData.forEach((_l) => {\n _categories.unshift(_l.n + ' total');\n _categories.unshift(_l.n);\n });\n\n // Generate mock data\n loaderData.forEach(function (_loaderData, _i) {\n data.push({\n name: _loaderData.n + ' total',\n value: [\n _categories.indexOf(_loaderData.n + ' total'),\n _loaderData.s,\n _loaderData.e,\n _loaderData.e - _loaderData.s,\n ],\n itemStyle: {\n normal: {\n color: PALETTE_COLORS[Math.floor(Math.random() * 27)],\n opacity: 0.25,\n },\n },\n });\n\n if (!_loaderData?.c) return;\n for (let l = 0; l < _loaderData?.c?.length; l++) {\n data.push({\n name: _loaderData.n,\n value: [\n _categories.indexOf(_loaderData.n),\n _loaderData.c[l].s,\n _loaderData.c[l].e,\n _loaderData.c[l].e - _loaderData.c[l].s,\n ],\n itemStyle: {\n normal: {\n color: PALETTE_COLORS[Math.floor(Math.random() * 27)],\n opacity: 0.25,\n },\n },\n ext: _loaderData.c[l].ext as ChartProps['loaders'][0],\n });\n }\n });\n\n categories = _categories.map((val, i) => {\n if (i % 2 !== 0) {\n return val.replace(' total', '');\n } else {\n return '';\n }\n });\n }, [loaderData]);\n\n useEffect(() => {\n if (!pluginsData) return;\n\n const _pluginsData = groupBy(pluginsData, (e: ITraceEventData) => e.pid);\n\n Object.keys(_pluginsData)\n .reverse()\n .forEach(function (key, i) {\n _pluginsData[key].forEach((_plugin, _i) => {\n data.push({\n name: String(_plugin.pid),\n value: [\n i,\n _plugin.args.s,\n _plugin.args.e,\n _plugin.args.e - _plugin.args.s,\n ],\n itemStyle: {\n normal: {\n color: PALETTE_COLORS[Math.floor(Math.random() * 27)],\n opacity: 0.25,\n },\n },\n ext: _plugin,\n });\n });\n categories.push(String(key.charAt(0).toUpperCase() + key.slice(1)));\n });\n }, [pluginsData]);\n\n useEffect(() => {\n function renderItem(\n params: { coordSys: CoordSysType },\n api: {\n value: (arg0: number) => number;\n coord: (arg0: number[]) => any;\n size: (arg0: number[]) => number[];\n style: () => string;\n },\n ) {\n const categoryIndex = api.value(0);\n const start = api.coord([api.value(1), categoryIndex]);\n const end = api.coord([api.value(2), categoryIndex]);\n const height = api.size([0, 1])[1] * 0.3;\n\n const rectShape = echarts.graphic.clipRectByRect(\n {\n x: start[0],\n y:\n chartType === ChartTypes.Loader\n ? start[1] - (categoryIndex % 2 !== 0 ? 0 : height * 2)\n : start[1],\n width: end[0] - start[0] || 5,\n height: height,\n },\n {\n x: params.coordSys.x,\n y: params.coordSys.y,\n width: params.coordSys.width,\n height: params.coordSys.height,\n },\n );\n return (\n rectShape && {\n type: 'rect',\n transition: ['shape'],\n shape: rectShape,\n style: api.style(),\n enterFrom: {\n style: { opacity: 0 },\n x: 0,\n },\n }\n );\n }\n\n const option = {\n tooltip: {\n formatter: (raw: any) => {\n return formatterFn(raw);\n },\n },\n dataZoom: [\n {\n type: 'slider',\n filterMode: 'weakFilter',\n showDataShadow: false,\n top: -10,\n },\n {\n type: 'inside',\n filterMode: 'weakFilter',\n },\n ],\n grid: {\n top: 10,\n left: 0,\n bottom: 10,\n right: 0,\n height:\n categories.length > (chartType === ChartTypes.Loader ? 6 : 3)\n ? 'auto'\n : categories.length * LINE_HEIGHT,\n containLabel: true,\n },\n xAxis: {\n interval:\n exts?.endTimestamp && exts?.startTimestamp\n ? Math.floor((exts.endTimestamp - exts.startTimestamp) / 8)\n : null,\n position: 'top',\n splitLine: {\n show: true,\n },\n scale: true,\n axisLine: {\n show: false,\n },\n axisLabel: {\n formatter(val: number) {\n return dayjs(val as number).format('HH:mm:ss:SSS');\n },\n },\n },\n yAxis: {\n type: 'category',\n splitLine: {\n show: false,\n },\n axisLabel: {\n inside: true,\n lineHeight: 20,\n width: 100,\n fontSize: 12,\n color: '#000',\n verticalAlign: 'bottom',\n },\n axisLine: {\n show: false,\n },\n axisTick: {\n show: false,\n },\n data: categories,\n },\n series: [\n {\n type: 'custom',\n renderItem,\n itemStyle: {\n opacity: 0.8,\n },\n encode: {\n x: [1, 2],\n y: 0,\n },\n data,\n },\n ],\n };\n setOptionsData(option);\n }, [loaderData, pluginsData, exts]);\n\n return (\n <ReactEChartsCore\n option={optionsData}\n echarts={echarts}\n style={{\n width: '100%',\n minHeight:\n chartType === ChartTypes.Loader\n ? '500px'\n : chartType === ChartTypes.Minify\n ? '100px'\n : '200px',\n maxHeight: chartType === ChartTypes.Minify ? '100px' : '1000px',\n border: '1px solid #eee',\n borderRadius: '10px',\n }}\n />\n );\n },\n);\n"],"names":["LINE_HEIGHT","TimelineCom","memo","loaderData","pluginsData","formatterFn","chartType","ChartTypes","exts","data","categories","optionsData","setOptionsData","useState","echarts","CustomChart","TooltipComponent","GridComponent","DataZoomComponent","CanvasRenderer","useEffect","_categories","_l","_loaderData","_i","PALETTE_COLORS","Math","l","val","i","_pluginsData","groupBy","e","Object","key","_plugin","String","renderItem","params","api","categoryIndex","start","end","height","rectShape","option","raw","dayjs","ReactEChartsCore"],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import React from 'react';
2
+ import EChartsReactCore from 'echarts-for-react/esm/core';
3
+ import type { ECElementEvent } from 'echarts/types/dist/shared';
2
4
  export type TreeNode = {
3
5
  name: string;
4
6
  value?: number;
@@ -7,21 +9,22 @@ export type TreeNode = {
7
9
  sourceSize?: number;
8
10
  bundledSize?: number;
9
11
  gzipSize?: number;
12
+ id?: string | number;
10
13
  };
11
14
  export type SizeType = 'stat' | 'parsed' | 'gzip' | 'value';
12
15
  interface TreeMapProps {
13
16
  treeData: TreeNode[];
14
17
  sizeType: SizeType;
15
18
  style?: React.CSSProperties;
16
- onChartClick?: (params: any) => void;
19
+ onChartClick?: (params: ECElementEvent) => void;
17
20
  highlightNodeId?: number;
18
21
  centerNodeId?: number;
19
22
  rootPath?: string;
20
23
  }
21
- export declare const TreeMap: React.ForwardRefExoticComponent<TreeMapProps & React.RefAttributes<any>>;
24
+ export declare const TreeMap: React.ForwardRefExoticComponent<TreeMapProps & React.RefAttributes<EChartsReactCore>>;
22
25
  export declare const AssetTreemapWithFilter: React.FC<{
23
26
  treeData: TreeNode[];
24
- onChartClick?: (params: any) => void;
27
+ onChartClick?: (params: ECElementEvent) => void;
25
28
  bundledSize?: boolean;
26
29
  }>;
27
30
  export {};
@@ -2,19 +2,21 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import react, { memo, useCallback, useEffect, useMemo, useState } from "react";
3
3
  import core from "echarts-for-react/esm/core";
4
4
  import { TreemapChart } from "echarts/charts";
5
- import { TooltipComponent } from "echarts/components";
5
+ import { TitleComponent, TooltipComponent } from "echarts/components";
6
6
  import { CanvasRenderer } from "echarts/renderers";
7
7
  import { Checkbox, Input, Radio } from "antd";
8
8
  import { FullscreenExitOutlined, FullscreenOutlined, LeftOutlined, RightOutlined, SearchOutlined } from "@ant-design/icons";
9
9
  import { formatSize } from "../../utils/index.mjs";
10
10
  import { SDK } from "@rsdoctor/types";
11
11
  import { ServerAPIProvider } from "../Manifest/index.mjs";
12
+ import { ModuleAnalyzeComponent } from "../../pages/ModuleAnalyze/index.mjs";
12
13
  import treemap_module from "./treemap.module.mjs";
13
14
  import { TREE_COLORS } from "./constants.mjs";
14
- import * as __WEBPACK_EXTERNAL_MODULE_echarts_core_d2845954__ from "echarts/core";
15
- __WEBPACK_EXTERNAL_MODULE_echarts_core_d2845954__.use([
15
+ import * as __rspack_external_echarts_core_d2845954 from "echarts/core";
16
+ __rspack_external_echarts_core_d2845954.use([
16
17
  TreemapChart,
17
18
  TooltipComponent,
19
+ TitleComponent,
18
20
  CanvasRenderer
19
21
  ]);
20
22
  function hashString(str) {
@@ -31,6 +33,20 @@ function blendWithWhite(hex, ratio) {
31
33
  const blendedB = Math.round(b * ratio + 255 * (1 - ratio));
32
34
  return `#${blendedR.toString(16).padStart(2, '0')}${blendedG.toString(16).padStart(2, '0')}${blendedB.toString(16).padStart(2, '0')}`;
33
35
  }
36
+ function getLuminance(hex) {
37
+ const r = parseInt(hex.slice(1, 3), 16) / 255;
38
+ const g = parseInt(hex.slice(3, 5), 16) / 255;
39
+ const b = parseInt(hex.slice(5, 7), 16) / 255;
40
+ const [rs, gs, bs] = [
41
+ r,
42
+ g,
43
+ b
44
+ ].map((val)=>val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4));
45
+ return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;
46
+ }
47
+ function isDarkColor(hex) {
48
+ return getLuminance(hex) < 0.4;
49
+ }
34
50
  function getLevelOption() {
35
51
  return [
36
52
  {
@@ -50,7 +66,8 @@ function getLevelOption() {
50
66
  },
51
67
  upperLabel: {
52
68
  show: true,
53
- color: '#555555',
69
+ color: '#ffffff',
70
+ fontSize: 14,
54
71
  height: 30
55
72
  },
56
73
  emphasis: {
@@ -93,14 +110,18 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
93
110
  const borderRatio = baseBorderRatio * siblingRatio;
94
111
  const nodeColor = isHighlighted ? '#fff5f5' : 0 === level ? blendWithWhite(baseColor, 0.8) : blendWithWhite(baseColor, colorRatio);
95
112
  const nodeBorderColor = isHighlighted ? '#ff4d4f' : 0 === level ? baseColor : blendWithWhite(baseColor, borderRatio);
113
+ const isDark = isDarkColor(nodeColor);
114
+ const textColor = isDark ? '#ffffff' : '#000000';
115
+ const textBorderColor = isDark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.1)';
96
116
  const result = {
97
117
  id: nodeId,
98
118
  name: node.name,
99
119
  value: val,
100
120
  path: node.path || node.name,
101
- sourceSize: node.sourceSize ?? ('stat' === sizeType ? val : 0),
102
- bundledSize: node.bundledSize ?? ('parsed' === sizeType ? val : 0),
103
- gzipSize: node.gzipSize ?? ('gzip' === sizeType ? val : 0),
121
+ sourceSize: node.sourceSize ?? ('stat' === sizeType ? val : void 0),
122
+ bundledSize: node.bundledSize ?? ('parsed' === sizeType ? val : void 0),
123
+ gzipSize: node.gzipSize ?? ('gzip' === sizeType ? val : void 0),
124
+ moduleId: node.id,
104
125
  itemStyle: {
105
126
  borderWidth: isHighlighted ? 4 : 1,
106
127
  color: nodeColor,
@@ -108,6 +129,16 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
108
129
  ...0 === level && {
109
130
  gapWidth: 2
110
131
  }
132
+ },
133
+ label: {
134
+ show: true,
135
+ color: textColor,
136
+ textBorderColor: textBorderColor,
137
+ textBorderWidth: 1
138
+ },
139
+ upperLabel: 0 === level ? void 0 : {
140
+ show: true,
141
+ color: textColor
111
142
  }
112
143
  };
113
144
  if (children && children.length > 0) result.children = children;
@@ -120,7 +151,7 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
120
151
  };
121
152
  return result;
122
153
  }
123
- const data = treeData.map((item, index)=>convert(item, index, 0, void 0, index, treeData.length)).filter((item)=>item.value > 0 || item.children && item.children.length > 0);
154
+ const data = treeData.map((item, index)=>convert(item, index, 0, void 0, index, treeData.length)).filter((item)=>('number' == typeof item.value ? item.value > 0 : false) || item.children && item.children.length > 0);
124
155
  chartDataRef.current = data;
125
156
  setOption({
126
157
  color: TREE_COLORS,
@@ -145,7 +176,7 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
145
176
  confine: true,
146
177
  extraCssText: 'max-width: 450px; word-wrap: break-word;',
147
178
  position: function(pos, _params, _dom, _rect, size) {
148
- var obj = {
179
+ const obj = {
149
180
  top: pos[1] + 10
150
181
  };
151
182
  if (pos[0] < size.viewSize[0] / 2) obj.left = pos[0] + 10;
@@ -154,17 +185,16 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
154
185
  },
155
186
  formatter: function(info) {
156
187
  const node = info.data || {};
157
- const name = node.name;
158
- let path = node.path || name;
188
+ let path = 'string' == typeof node.path ? node.path : 'string' == typeof node.name ? node.name : String(node.name ?? '');
159
189
  if (rootPath && path) {
160
190
  const normalizedRoot = rootPath.replace(/\\/g, '/').replace(/\/$/, '');
161
191
  const normalizedPath = path.replace(/\\/g, '/');
162
192
  if (normalizedPath.startsWith(normalizedRoot + '/')) path = normalizedPath.slice(normalizedRoot.length + 1);
163
193
  else if (normalizedPath === normalizedRoot) path = '';
164
194
  }
165
- const sourceSize = node.sourceSize || node.value;
166
- const bundledSize = node.bundledSize;
167
- const gzipSize = node.gzipSize;
195
+ const sourceSize = 'number' == typeof node.sourceSize && node.sourceSize > 0 ? node.sourceSize : 'number' == typeof node.value && node.value > 0 && 'stat' === sizeType ? node.value : void 0;
196
+ const bundledSize = 'number' == typeof node.bundledSize && node.bundledSize > 0 ? node.bundledSize : void 0;
197
+ const gzipSize = 'number' == typeof node.gzipSize && node.gzipSize > 0 ? node.gzipSize : void 0;
168
198
  function makeRow(label, value, color) {
169
199
  return `<div class="${treemap_module["tooltip-row"]}">
170
200
  <span class="${treemap_module["tooltip-label"]}" style="color: ${color};">${label}</span>
@@ -172,12 +202,12 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
172
202
  </div>`;
173
203
  }
174
204
  const rows = [];
175
- if (void 0 !== sourceSize) rows.push(makeRow('Stat size', formatSize(sourceSize), '#52c41a'));
176
- if (void 0 !== bundledSize) rows.push(makeRow('Parsed size', formatSize(bundledSize), '#fadb14'));
177
- if (void 0 !== gzipSize) rows.push(makeRow('Gzipped size', formatSize(gzipSize), '#1677ff'));
205
+ if (void 0 !== sourceSize && sourceSize > 0) rows.push(makeRow('Stat size', formatSize(sourceSize), '#52c41a'));
206
+ if (void 0 !== bundledSize && bundledSize > 0) rows.push(makeRow('Parsed size', formatSize(bundledSize), '#d96420'));
207
+ if (void 0 !== gzipSize && gzipSize > 0) rows.push(makeRow('Gzipped size', formatSize(gzipSize), '#1677ff'));
178
208
  return `
179
209
  <div style="font-family: sans-serif; font-size: 12px; line-height: 1.5;">
180
- <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);">${__WEBPACK_EXTERNAL_MODULE_echarts_core_d2845954__.format.encodeHTML(path)}</div>
210
+ <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);">${__rspack_external_echarts_core_d2845954.format.encodeHTML(path)}</div>
181
211
  ${rows.join('')}
182
212
  </div>
183
213
  `;
@@ -190,11 +220,9 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
190
220
  show: true,
191
221
  formatter: '{b}',
192
222
  fontSize: 12,
193
- color: '#000',
194
223
  position: 'inside',
195
224
  fontWeight: 'normal',
196
- textBorderColor: '#fff',
197
- textBorderWidth: 2,
225
+ textBorderWidth: 1,
198
226
  padding: [
199
227
  4,
200
228
  8,
@@ -205,7 +233,6 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
205
233
  upperLabel: {
206
234
  show: true,
207
235
  height: 30,
208
- color: '#000',
209
236
  fontSize: 12,
210
237
  fontWeight: 'normal',
211
238
  padding: [
@@ -249,7 +276,11 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
249
276
  top: 40,
250
277
  bottom: 30,
251
278
  left: 0,
252
- right: 0
279
+ right: 0,
280
+ zoomLimit: {
281
+ min: 0.5,
282
+ max: 5
283
+ }
253
284
  }
254
285
  ]
255
286
  });
@@ -265,12 +296,13 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
265
296
  if (chartInstance) {
266
297
  const findNodeInfo = (data, targetId, path = [])=>{
267
298
  for (const item of data){
299
+ const itemName = 'string' == typeof item.name ? item.name : String(item.name ?? '');
268
300
  const currentPath = [
269
301
  ...path,
270
- item.name
302
+ itemName
271
303
  ];
272
304
  if (item.id === targetId) return {
273
- name: item.name,
305
+ name: itemName,
274
306
  path: currentPath
275
307
  };
276
308
  if (item.children) {
@@ -283,13 +315,16 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
283
315
  setTimeout(()=>{
284
316
  const nodeInfo = findNodeInfo(chartDataRef.current, centerNodeId);
285
317
  if (!nodeInfo) return;
318
+ const nodeName = nodeInfo.name;
286
319
  try {
287
320
  chartInstance.dispatchAction({
288
321
  type: 'highlight',
289
322
  seriesIndex: 0,
290
- name: nodeInfo.name
323
+ name: nodeName
291
324
  });
292
- } catch (e) {}
325
+ } catch (e) {
326
+ console.error('Failed to highlight node with name:', nodeName, e);
327
+ }
293
328
  const zoomStrategies = [
294
329
  ()=>chartInstance.dispatchAction({
295
330
  type: 'treemapZoomToNode',
@@ -299,7 +334,7 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
299
334
  ()=>chartInstance.dispatchAction({
300
335
  type: 'treemapZoomToNode',
301
336
  seriesIndex: 0,
302
- name: nodeInfo.name
337
+ name: nodeName
303
338
  }),
304
339
  ()=>chartInstance.dispatchAction({
305
340
  type: 'treemapZoomToNode',
@@ -326,21 +361,41 @@ const TreeMapInner = /*#__PURE__*/ memo(({ treeData, sizeType, style, onChartCli
326
361
  centerNodeId,
327
362
  option
328
363
  ]);
364
+ useEffect(()=>{
365
+ if (!chartRef.current || !option) return;
366
+ const chartInstance = chartRef.current.getEchartsInstance();
367
+ if (!chartInstance) return;
368
+ const handleDblClick = ()=>{
369
+ try {
370
+ chartInstance.dispatchAction({
371
+ type: 'treemapRootToNode',
372
+ seriesIndex: 0
373
+ });
374
+ } catch (e) {}
375
+ };
376
+ chartInstance.on('dblclick', handleDblClick);
377
+ return ()=>{
378
+ chartInstance.off('dblclick', handleDblClick);
379
+ };
380
+ }, [
381
+ option
382
+ ]);
329
383
  return option ? /*#__PURE__*/ jsx("div", {
330
384
  className: treemap_module["chart-container"],
331
385
  style: style,
332
386
  children: /*#__PURE__*/ jsx(core, {
333
387
  ref: chartRef,
334
388
  option: option,
335
- echarts: __WEBPACK_EXTERNAL_MODULE_echarts_core_d2845954__,
389
+ echarts: __rspack_external_echarts_core_d2845954,
336
390
  onEvents: {
337
391
  click: (params)=>{
338
392
  if (chartRef.current) {
339
393
  const instance = chartRef.current.getEchartsInstance();
340
- if (instance && params?.data?.id) instance.dispatchAction({
394
+ const data = params?.data;
395
+ if (instance && data?.id !== void 0) instance.dispatchAction({
341
396
  type: 'treemapZoomToNode',
342
397
  seriesIndex: 0,
343
- targetNodeId: String(params.data.id)
398
+ targetNodeId: String(data.id)
344
399
  });
345
400
  }
346
401
  onChartClick?.(params);
@@ -377,10 +432,46 @@ const AssetTreemapWithFilterInner = ({ treeData, onChartClick, bundledSize = tru
377
432
  const [isFullscreen, setIsFullscreen] = useState(false);
378
433
  const [highlightNodeId, setHighlightNodeId] = useState();
379
434
  const [centerNodeId, setCenterNodeId] = useState();
435
+ const [moduleId, setModuleId] = useState('');
436
+ const [showAnalyze, setShowAnalyze] = useState(false);
437
+ const [chunkSearchQuery, setChunkSearchQuery] = useState('');
380
438
  const chartRef = react.useRef(null);
381
439
  const containerRef = react.useRef(null);
440
+ const handleChartClick = useCallback((params)=>{
441
+ onChartClick?.(params);
442
+ const data = params.data;
443
+ const moduleId = data?.moduleId;
444
+ if (void 0 !== moduleId) {
445
+ setModuleId(moduleId);
446
+ setShowAnalyze(true);
447
+ }
448
+ }, [
449
+ onChartClick
450
+ ]);
382
451
  const enterFullscreen = useCallback(()=>{
383
- if (containerRef.current) containerRef.current.requestFullscreen().then(()=>setIsFullscreen(true)).catch((err)=>console.error('Failed to enter fullscreen:', err));
452
+ if (containerRef.current) {
453
+ const el = containerRef.current;
454
+ if (el.requestFullscreen) el.requestFullscreen().then(()=>setIsFullscreen(true)).catch((err)=>console.error('Failed to enter fullscreen:', err));
455
+ else if (el.webkitRequestFullscreen) try {
456
+ el.webkitRequestFullscreen();
457
+ setIsFullscreen(true);
458
+ } catch (err) {
459
+ console.error('Failed to enter fullscreen (webkit):', err);
460
+ }
461
+ else if (el.mozRequestFullScreen) try {
462
+ el.mozRequestFullScreen();
463
+ setIsFullscreen(true);
464
+ } catch (err) {
465
+ console.error('Failed to enter fullscreen (moz):', err);
466
+ }
467
+ else if (el.msRequestFullscreen) try {
468
+ el.msRequestFullscreen();
469
+ setIsFullscreen(true);
470
+ } catch (err) {
471
+ console.error('Failed to enter fullscreen (ms):', err);
472
+ }
473
+ else console.error('Fullscreen API is not supported in this browser.');
474
+ }
384
475
  }, []);
385
476
  const exitFullscreen = useCallback(()=>{
386
477
  document.exitFullscreen().then(()=>setIsFullscreen(false)).catch((err)=>console.error('Failed to exit fullscreen:', err));
@@ -402,6 +493,18 @@ const AssetTreemapWithFilterInner = ({ treeData, onChartClick, bundledSize = tru
402
493
  document.removeEventListener('fullscreenchange', handleFullscreenChange);
403
494
  };
404
495
  }, []);
496
+ const filteredTreeData = useMemo(()=>{
497
+ let filtered = treeData.filter((item)=>checkedAssets.includes(item.name));
498
+ if (chunkSearchQuery.trim()) {
499
+ const searchLower = chunkSearchQuery.toLowerCase();
500
+ filtered = filtered.filter((item)=>item.name.toLowerCase().includes(searchLower));
501
+ }
502
+ return filtered;
503
+ }, [
504
+ treeData,
505
+ checkedAssets,
506
+ chunkSearchQuery
507
+ ]);
405
508
  const searchResults = useMemo(()=>{
406
509
  if (!searchQuery.trim()) return [];
407
510
  const regex = new RegExp(searchQuery, 'i');
@@ -416,19 +519,12 @@ const AssetTreemapWithFilterInner = ({ treeData, onChartClick, bundledSize = tru
416
519
  }
417
520
  if (node.children) node.children.forEach(collectMatchingPaths);
418
521
  };
419
- treeData.forEach(collectMatchingPaths);
522
+ filteredTreeData.forEach(collectMatchingPaths);
420
523
  return results;
421
524
  }, [
422
- treeData,
525
+ filteredTreeData,
423
526
  searchQuery
424
527
  ]);
425
- const filteredTreeData = useMemo(()=>{
426
- let filtered = treeData.filter((item)=>checkedAssets.includes(item.name));
427
- return filtered;
428
- }, [
429
- treeData,
430
- checkedAssets
431
- ]);
432
528
  const handleSearchResultClick = useCallback((nodeId)=>{
433
529
  setHighlightNodeId(nodeId);
434
530
  setCenterNodeId(nodeId);
@@ -520,6 +616,60 @@ const AssetTreemapWithFilterInner = ({ treeData, onChartClick, bundledSize = tru
520
616
  })
521
617
  ]
522
618
  }),
619
+ /*#__PURE__*/ jsxs("div", {
620
+ children: [
621
+ /*#__PURE__*/ jsx("h4", {
622
+ children: "Show chunks"
623
+ }),
624
+ /*#__PURE__*/ jsx(Input, {
625
+ placeholder: "Search chunks",
626
+ value: chunkSearchQuery,
627
+ onChange: (e)=>setChunkSearchQuery(e.target.value),
628
+ suffix: /*#__PURE__*/ jsx(SearchOutlined, {
629
+ style: {
630
+ color: '#ccc'
631
+ }
632
+ }),
633
+ allowClear: true,
634
+ size: "small",
635
+ style: {
636
+ marginBottom: 8
637
+ }
638
+ }),
639
+ /*#__PURE__*/ jsx(Checkbox, {
640
+ indeterminate: checkedAssets.length > 0 && checkedAssets.length < assetNames.length,
641
+ checked: checkedAssets.length === assetNames.length,
642
+ onChange: (e)=>setCheckedAssets(e.target.checked ? assetNames : []),
643
+ className: treemap_module["all-none-checkbox"],
644
+ children: "All"
645
+ }),
646
+ /*#__PURE__*/ jsx("div", {
647
+ className: treemap_module["chunk-list"],
648
+ children: assetNames.filter((name)=>name.toLowerCase().includes(chunkSearchQuery.toLowerCase())).map((name)=>/*#__PURE__*/ jsxs("div", {
649
+ className: treemap_module["chunk-item"],
650
+ children: [
651
+ /*#__PURE__*/ jsx(Checkbox, {
652
+ checked: checkedAssets.includes(name),
653
+ onChange: (e)=>{
654
+ e.target.checked ? setCheckedAssets([
655
+ ...checkedAssets,
656
+ name
657
+ ]) : setCheckedAssets(checkedAssets.filter((a)=>a !== name));
658
+ },
659
+ children: /*#__PURE__*/ jsx("span", {
660
+ title: name,
661
+ children: name
662
+ })
663
+ }),
664
+ /*#__PURE__*/ jsx("span", {
665
+ className: treemap_module["size-tag"],
666
+ children: formatSize(getChunkSize(name, 'value'))
667
+ })
668
+ ]
669
+ }, name))
670
+ })
671
+ ]
672
+ }),
523
673
  /*#__PURE__*/ jsxs("div", {
524
674
  children: [
525
675
  /*#__PURE__*/ jsx("h4", {
@@ -576,65 +726,39 @@ const AssetTreemapWithFilterInner = ({ treeData, onChartClick, bundledSize = tru
576
726
  ]
577
727
  })
578
728
  ]
579
- }),
580
- /*#__PURE__*/ jsxs("div", {
581
- children: [
582
- /*#__PURE__*/ jsx("h4", {
583
- children: "Show chunks"
584
- }),
585
- /*#__PURE__*/ jsx(Checkbox, {
586
- indeterminate: checkedAssets.length > 0 && checkedAssets.length < assetNames.length,
587
- checked: checkedAssets.length === assetNames.length,
588
- onChange: (e)=>setCheckedAssets(e.target.checked ? assetNames : []),
589
- className: treemap_module["all-none-checkbox"],
590
- children: "All"
591
- }),
592
- /*#__PURE__*/ jsx("div", {
593
- className: treemap_module["chunk-list"],
594
- children: assetNames.map((name)=>/*#__PURE__*/ jsxs("div", {
595
- className: treemap_module["chunk-item"],
596
- children: [
597
- /*#__PURE__*/ jsx(Checkbox, {
598
- checked: checkedAssets.includes(name),
599
- onChange: (e)=>{
600
- e.target.checked ? setCheckedAssets([
601
- ...checkedAssets,
602
- name
603
- ]) : setCheckedAssets(checkedAssets.filter((a)=>a !== name));
604
- },
605
- children: /*#__PURE__*/ jsx("span", {
606
- title: name,
607
- children: name
608
- })
609
- }),
610
- /*#__PURE__*/ jsx("span", {
611
- className: treemap_module["size-tag"],
612
- children: formatSize(getChunkSize(name, 'value'))
613
- })
614
- ]
615
- }, name))
616
- })
617
- ]
618
729
  })
619
730
  ]
620
731
  })
621
732
  ]
622
733
  }),
623
- /*#__PURE__*/ jsx("div", {
734
+ /*#__PURE__*/ jsxs("div", {
624
735
  className: treemap_module["chart-wrapper"],
625
- children: /*#__PURE__*/ jsx(TreeMap, {
626
- ref: chartRef,
627
- treeData: filteredTreeData,
628
- sizeType: sizeType,
629
- onChartClick: onChartClick,
630
- highlightNodeId: highlightNodeId,
631
- centerNodeId: centerNodeId,
632
- rootPath: rootPath,
633
- style: {
634
- width: '100%',
635
- height: '100%'
636
- }
637
- })
736
+ children: [
737
+ /*#__PURE__*/ jsx(TreeMap, {
738
+ ref: chartRef,
739
+ treeData: filteredTreeData,
740
+ sizeType: sizeType,
741
+ onChartClick: handleChartClick,
742
+ highlightNodeId: highlightNodeId,
743
+ centerNodeId: centerNodeId,
744
+ rootPath: rootPath,
745
+ style: {
746
+ width: '100%',
747
+ height: '100%'
748
+ }
749
+ }),
750
+ moduleId ? /*#__PURE__*/ jsx(ServerAPIProvider, {
751
+ api: SDK.ServerAPI.API.GetAllModuleGraph,
752
+ body: {},
753
+ children: (modules)=>/*#__PURE__*/ jsx(ModuleAnalyzeComponent, {
754
+ cwd: rootPath,
755
+ moduleId: moduleId,
756
+ modules: modules,
757
+ show: showAnalyze,
758
+ setShow: setShowAnalyze
759
+ })
760
+ }) : null
761
+ ]
638
762
  })
639
763
  ]
640
764
  });
@@ -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 { 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: 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: '#ffffff',\n fontSize: 14,\n height: 30,\n },\n emphasis: {\n itemStyle: {\n borderColor: '#ccc',\n },\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\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 = 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 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 }\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 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 (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 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.5,\n animationDurationUpdate: 500,\n width: '100%',\n height: '100%',\n top: 40,\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 if (!chartRef.current || !option) return;\n\n const chartInstance =\n chartRef.current.getEchartsInstance() as unknown as EChartsType;\n if (!chartInstance) return;\n\n const handleDblClick = () => {\n try {\n chartInstance.dispatchAction({\n type: 'treemapRootToNode',\n seriesIndex: 0,\n });\n } catch (e) {}\n };\n\n chartInstance.on('dblclick', handleDblClick);\n\n return () => {\n chartInstance.off('dblclick', handleDblClick);\n };\n }, [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: ECElementEvent) => {\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 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 className={Styles['chunk-list']}>\n {assetNames\n .filter((name) =>\n name.toLowerCase().includes(chunkSearchQuery.toLowerCase()),\n )\n .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\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","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","handleDblClick","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":";;;;;;;;;;;;;;;AA2CAA,wCAAAA,GAAW,CAAC;IAACC;IAAcC;IAAkBC;IAAgBC;CAAe;AAyB5E,SAASC,WAAWC,GAAW;IAC7B,IAAIC,OAAO;IACX,IAAK,IAAIC,IAAI,GAAGA,IAAIF,IAAI,MAAM,EAAEE,IAC9BD,OAAQA,AAAAA,CAAAA,QAAQ,KAAKA,OAAOD,IAAI,UAAU,CAACE;IAE7C,OAAOD,SAAS;AAClB;AAEA,SAASE,eAAeC,GAAW,EAAEC,KAAa;IAChD,MAAMC,IAAIC,SAASH,IAAI,KAAK,CAAC,GAAG,IAAI;IACpC,MAAMI,IAAID,SAASH,IAAI,KAAK,CAAC,GAAG,IAAI;IACpC,MAAMK,IAAIF,SAASH,IAAI,KAAK,CAAC,GAAG,IAAI;IAEpC,MAAMM,WAAWC,KAAK,KAAK,CAACL,IAAID,QAAQ,MAAO,KAAIA,KAAI;IACvD,MAAMO,WAAWD,KAAK,KAAK,CAACH,IAAIH,QAAQ,MAAO,KAAIA,KAAI;IACvD,MAAMQ,WAAWF,KAAK,KAAK,CAACF,IAAIJ,QAAQ,MAAO,KAAIA,KAAI;IAEvD,OAAO,CAAC,CAAC,EAAEK,SAAS,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,OAAOE,SAAS,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,OAAOC,SAAS,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,MAAM;AACvI;AAEA,SAASC,aAAaV,GAAW;IAC/B,MAAME,IAAIC,SAASH,IAAI,KAAK,CAAC,GAAG,IAAI,MAAM;IAC1C,MAAMI,IAAID,SAASH,IAAI,KAAK,CAAC,GAAG,IAAI,MAAM;IAC1C,MAAMK,IAAIF,SAASH,IAAI,KAAK,CAAC,GAAG,IAAI,MAAM;IAE1C,MAAM,CAACW,IAAIC,IAAIC,GAAG,GAAG;QAACX;QAAGE;QAAGC;KAAE,CAAC,GAAG,CAAC,CAACS,MAC3BA,OAAO,UAAUA,MAAM,QAAQP,KAAK,GAAG,CAAEO,AAAAA,CAAAA,MAAM,KAAI,IAAK,OAAO;IAGxE,OAAO,SAASH,KAAK,SAASC,KAAK,SAASC;AAC9C;AAEA,SAASE,YAAYf,GAAW;IAC9B,OAAOU,aAAaV,OAAO;AAC7B;AAEA,SAASgB;IACP,OAAO;QACL;YACE,WAAW;gBACT,aAAa;gBACb,UAAU;YACZ;QACF;QACA;YACE,WAAW;gBACT,kBAAkB;oBAAC;oBAAG;iBAAI;gBAC1B,aAAa;gBACb,UAAU;YACZ;YACA,YAAY;gBACV,MAAM;gBACN,OAAO;gBACP,UAAU;gBACV,QAAQ;YACV;YACA,UAAU;gBACR,WAAW;oBACT,aAAa;gBACf;YACF;QACF;KACD;AACH;AAEA,MAAMC,eAAAA,WAAAA,GAEFC,KACF,CAAC,EACCC,QAAQ,EACRC,QAAQ,EACRC,KAAK,EACLC,YAAY,EACZC,YAAY,EACZC,eAAe,EACfC,YAAY,EACZC,QAAQ,EACT;IACC,MAAM,CAACC,QAAQC,UAAU,GAAGC,SAA+B;IAC3D,MAAMC,WAAWC,MAAAA,MAAY,CAA0B;IACvD,MAAMC,eAAeD,MAAAA,MAAY,CAAoB,EAAE;IAEvDE,UAAU;QACR,IAAIV,gBAAgBO,SAAS,OAAO,EAClC,IAAI,AAAwB,cAAxB,OAAOP,cACTA,aAAaO,SAAS,OAAO;aAG3BP,aACA,OAAO,GAAGO,SAAS,OAAO;IAGlC,GAAG;QAACP;QAAcO,SAAS,OAAO;KAAC;IACnCG,UAAU;QACR,IAAI,CAACd,UAAU;QACf,SAASe,QACPC,IAAc,EACdC,QAAQ,CAAC,EACTC,QAAQ,CAAC,EACTC,WAAoB,EACpBC,eAAe,CAAC,EAChBC,eAAe,CAAC;YAEhB,MAAMC,YACJH,eAAeI,WAAW,CAACN,QAAQM,YAAY,MAAM,CAAC;YAExD,MAAMC,WAAWR,KAAK,QAAQ,EAAE,IAAI,CAACS,GAAGC,aACtCX,QACEU,GACAR,OACAC,QAAQ,GACRI,WACAI,YACAV,KAAK,QAAQ,EAAE,UAAU;YAI7B,IAAIrB,MAAM;YACV,IAAIM,AAAa,WAAbA,UAAqBN,MAAMqB,KAAK,UAAU,IAAI;iBAC7C,IAAIf,AAAa,aAAbA,UAAuBN,MAAMqB,KAAK,WAAW,IAAI;iBACrD,IAAIf,AAAa,WAAbA,UAAqBN,MAAMqB,KAAK,QAAQ,IAAI;iBAChD,IAAIf,AAAa,YAAbA,UAAsBN,MAAMqB,KAAK,KAAK,IAAI;YAEnD,IAAI,CAACrB,OAAOqB,KAAK,KAAK,EAAErB,MAAMqB,KAAK,KAAK;YAExC,MAAMW,SAASX,KAAK,IAAI,GACpBxC,WAAWwC,KAAK,IAAI,IACpBxC,WAAWwC,KAAK,IAAI,IAAI;YAC5B,MAAMY,gBAAgBvB,oBAAoBsB;YAE1C,MAAME,iBAAiBX,AAAU,MAAVA,QAAc,IAAI9B,KAAK,GAAG,CAAC,KAAK,IAAI8B,AAAQ,MAARA;YAC3D,MAAMY,kBACJZ,AAAU,MAAVA,QAAc,IAAI9B,KAAK,GAAG,CAAC,KAAK,IAAI8B,AAAQ,OAARA;YAEtC,MAAMa,uBAAuB;YAC7B,MAAMC,eACJX,eAAe,IACX,IAAKD,eAAgBC,CAAAA,eAAe,KAAMU,uBAC1C;YAEN,MAAME,aAAaJ,iBAAiBG;YACpC,MAAME,cAAcJ,kBAAkBE;YAEtC,MAAMG,YAAYP,gBACd,YACAV,AAAU,MAAVA,QACEtC,eAAe0C,WAAW,OAC1B1C,eAAe0C,WAAWW;YAEhC,MAAMG,kBAAkBR,gBACpB,YACAV,AAAU,MAAVA,QACEI,YACA1C,eAAe0C,WAAWY;YAEhC,MAAMG,SAASzC,YAAYuC;YAC3B,MAAMG,YAAYD,SAAS,YAAY;YACvC,MAAME,kBAAkBF,SACpB,6BACA;YAEJ,MAAMG,SAA0B;gBAC9B,IAAIb;gBACJ,MAAMX,KAAK,IAAI;gBACf,OAAOrB;gBACP,MAAMqB,KAAK,IAAI,IAAIA,KAAK,IAAI;gBAC5B,YACEA,KAAK,UAAU,IAAKf,CAAAA,AAAa,WAAbA,WAAsBN,MAAM8C,MAAQ;gBAC1D,aACEzB,KAAK,WAAW,IAAKf,CAAAA,AAAa,aAAbA,WAAwBN,MAAM8C,MAAQ;gBAC7D,UAAUzB,KAAK,QAAQ,IAAKf,CAAAA,AAAa,WAAbA,WAAsBN,MAAM8C,MAAQ;gBAChE,UAAUzB,KAAK,EAAE;gBACjB,WAAW;oBACT,aAAaY,gBAAgB,IAAI;oBACjC,OAAOO;oBACP,aAAaC;oBACb,GAAIlB,AAAU,MAAVA,SAAe;wBAAE,UAAU;oBAAE,CAAC;gBACpC;gBACA,OAAO;oBACL,MAAM;oBACN,OAAOoB;oBACP,iBAAiBC;oBACjB,iBAAiB;gBACnB;gBACA,YACErB,AAAU,MAAVA,QACIuB,SACA;oBACE,MAAM;oBACN,OAAOH;gBACT;YACR;YAEA,IAAId,YAAYA,SAAS,MAAM,GAAG,GAChCgB,OAAO,QAAQ,GAAGhB;YAGpB,IAAII,eACFY,OAAO,QAAQ,GAAG;gBAChB,WAAW;oBACT,aAAa;oBACb,aAAa;oBACb,OAAO;gBACT;YACF;YAGF,OAAOA;QACT;QAEA,MAAME,OAAO1C,SACV,GAAG,CAAC,CAAC2C,MAAM1B,QACVF,QAAQ4B,MAAM1B,OAAO,GAAGwB,QAAWxB,OAAOjB,SAAS,MAAM,GAE1D,MAAM,CACL,CAAC2C,OACE,CAAsB,YAAtB,OAAOA,KAAK,KAAK,GAAgBA,KAAK,KAAK,GAAG,IAAI,KAAI,KACtDA,KAAK,QAAQ,IAAIA,KAAK,QAAQ,CAAC,MAAM,GAAG;QAG/C9B,aAAa,OAAO,GAAG6B;QAEvBjC,UAAU;YACR,OAAOc;YACP,OAAO;gBACL,MAAM;gBACN,MAAM;gBACN,KAAK;gBACL,WAAW;oBACT,UAAU;oBACV,YAAY;oBACZ,OAAO;gBACT;YACF;YACA,SAAS;gBACP,SAAS;gBACT,iBAAiB;gBACjB,aAAa;gBACb,aAAa;gBACb,WAAW;oBACT,OAAO;gBACT;gBACA,SAAS;gBACT,cAAc;gBACd,UAAU,SAAUqB,GAAG,EAAEC,OAAO,EAAEC,IAAI,EAAEC,KAAK,EAAEC,IAAI;oBACjD,MAAMC,MAAsD;wBAC1D,KAAKL,GAAG,CAAC,EAAE,GAAG;oBAChB;oBACA,IAAIA,GAAG,CAAC,EAAE,GAAGI,KAAK,QAAQ,CAAC,EAAE,GAAG,GAC9BC,IAAI,IAAI,GAAGL,GAAG,CAAC,EAAE,GAAG;yBAEpBK,IAAI,KAAK,GAAGD,KAAK,QAAQ,CAAC,EAAE,GAAGJ,GAAG,CAAC,EAAE,GAAG;oBAE1C,OAAOK;gBACT;gBACA,WAAW,SACTC,IAAqD;oBAErD,MAAMlC,OAAOkC,KAAK,IAAI,IAAI,CAAC;oBAC3B,IAAIC,OACF,AAAqB,YAArB,OAAOnC,KAAK,IAAI,GACZA,KAAK,IAAI,GACT,AAAqB,YAArB,OAAOA,KAAK,IAAI,GACdA,KAAK,IAAI,GACToC,OAAOpC,KAAK,IAAI,IAAI;oBAE5B,IAAIT,YAAY4C,MAAM;wBACpB,MAAME,iBAAiB9C,SACpB,OAAO,CAAC,OAAO,KACf,OAAO,CAAC,OAAO;wBAClB,MAAM+C,iBAAiBH,KAAK,OAAO,CAAC,OAAO;wBAC3C,IAAIG,eAAe,UAAU,CAACD,iBAAiB,MAC7CF,OAAOG,eAAe,KAAK,CAACD,eAAe,MAAM,GAAG;6BAC/C,IAAIC,mBAAmBD,gBAC5BF,OAAO;oBAEX;oBAEA,MAAMI,aACJ,AAA2B,YAA3B,OAAOvC,KAAK,UAAU,IAAiBA,KAAK,UAAU,GAAG,IACrDA,KAAK,UAAU,GACf,AAAsB,YAAtB,OAAOA,KAAK,KAAK,IACfA,KAAK,KAAK,GAAG,KACbf,AAAa,WAAbA,WACAe,KAAK,KAAK,GACVyB;oBACR,MAAMe,cACJ,AAA4B,YAA5B,OAAOxC,KAAK,WAAW,IAAiBA,KAAK,WAAW,GAAG,IACvDA,KAAK,WAAW,GAChByB;oBACN,MAAMgB,WACJ,AAAyB,YAAzB,OAAOzC,KAAK,QAAQ,IAAiBA,KAAK,QAAQ,GAAG,IACjDA,KAAK,QAAQ,GACbyB;oBAEN,SAASiB,QAAQC,KAAa,EAAEC,KAAa,EAAEC,KAAa;wBAC1D,OAAO,CAAC,YAAY,EAAEC,cAAAA,CAAAA,cAAqB,CAAC;iCACzB,EAAEA,cAAAA,CAAAA,gBAAuB,CAAC,gBAAgB,EAAED,MAAM,GAAG,EAAEF,MAAM;wCACtD,EAAEE,MAAM,GAAG,EAAED,MAAM;sBACrC,CAAC;oBACX;oBAEA,MAAMG,OAAO,EAAE;oBACf,IAAIR,AAAed,WAAfc,cAA4BA,aAAa,GAC3CQ,KAAK,IAAI,CACPL,QAAQ,aAAaM,WAAWT,aAAa;oBAGjD,IAAIC,AAAgBf,WAAhBe,eAA6BA,cAAc,GAC7CO,KAAK,IAAI,CACPL,QAAQ,eAAeM,WAAWR,cAAc;oBAGpD,IAAIC,AAAahB,WAAbgB,YAA0BA,WAAW,GACvCM,KAAK,IAAI,CACPL,QAAQ,gBAAgBM,WAAWP,WAAW;oBAIlD,OAAO,CAAC;;8LAE0K,EAAEtF,wCAAAA,MAAAA,CAAAA,UAAyB,CAACgF,MAAM;kBAC9M,EAAEY,KAAK,IAAI,CAAC,IAAI;;cAEpB,CAAC;gBACL;YACF;YACA,QAAQ;gBACN;oBACE,MAAM;oBACN,OAAO;wBACL,MAAM;wBACN,WAAW;wBACX,UAAU;wBACV,UAAU;wBACV,YAAY;wBACZ,iBAAiB;wBACjB,SAAS;4BAAC;4BAAG;4BAAG;4BAAG;yBAAE;oBACvB;oBACA,YAAY;wBACV,MAAM;wBACN,QAAQ;wBACR,UAAU;wBACV,YAAY;wBACZ,SAAS;4BAAC;4BAAG;4BAAG;4BAAG;yBAAE;oBACvB;oBACA,QAAQlE;oBACR,MAAM6C;oBACN,YAAY;wBACV,MAAM;wBACN,MAAM;wBACN,KAAK;wBACL,QAAQ;wBACR,gBAAgB;wBAChB,WAAW;4BACT,OAAO;4BACP,aAAa;4BACb,aAAa;4BACb,cAAc;wBAChB;wBACA,UAAU;4BACR,WAAW;gCACT,OAAO;4BACT;wBACF;wBACA,WAAW;4BACT,YAAY;4BACZ,UAAU;4BACV,OAAO;wBACT;oBACF;oBACA,MAAM;oBACN,WAAW;oBACX,iBAAiB;oBACjB,yBAAyB;oBACzB,OAAO;oBACP,QAAQ;oBACR,KAAK;oBACL,QAAQ;oBACR,MAAM;oBACN,OAAO;oBACP,WAAW;wBACT,KAAK;wBACL,KAAK;oBACP;gBACF;aACD;QACH;IACF,GAAG;QAAC1C;QAAUC;QAAUI;QAAiBE;KAAS;IAElDO,UAAU;QACR,IAAIR,gBAAgBK,SAAS,OAAO,IAAIH,QAAQ;YAC9C,MAAMyD,gBACJtD,SAAS,OAAO,CAAC,kBAAkB;YACrC,IAAIsD,eAAe;gBACjB,MAAMC,eAAe,CACnBxB,MACAyB,UACAhB,OAAiB,EAAE;oBAEnB,KAAK,MAAMR,QAAQD,KAAM;wBACvB,MAAM0B,WACJ,AAAqB,YAArB,OAAOzB,KAAK,IAAI,GACZA,KAAK,IAAI,GACTS,OAAOT,KAAK,IAAI,IAAI;wBAC1B,MAAM0B,cAAc;+BAAIlB;4BAAMiB;yBAAS;wBACvC,IAAIzB,KAAK,EAAE,KAAKwB,UACd,OAAO;4BAAE,MAAMC;4BAAU,MAAMC;wBAAY;wBAE7C,IAAI1B,KAAK,QAAQ,EAAE;4BACjB,MAAM2B,QAAQJ,aACZvB,KAAK,QAAQ,EACbwB,UACAE;4BAEF,IAAIC,OAAO,OAAOA;wBACpB;oBACF;oBACA,OAAO;gBACT;gBAEAC,WAAW;oBACT,MAAMC,WAAWN,aAAarD,aAAa,OAAO,EAAEP;oBACpD,IAAI,CAACkE,UAAU;oBACf,MAAMC,WAAWD,SAAS,IAAI;oBAE9B,IAAI;wBACFP,cAAc,cAAc,CAAC;4BAC3B,MAAM;4BACN,aAAa;4BACb,MAAMQ;wBACR;oBACF,EAAE,OAAOC,GAAG;wBACVC,QAAQ,KAAK,CAAC,uCAAuCF,UAAUC;oBACjE;oBAEA,MAAME,iBAAoC;wBACxC,IACEX,cAAc,cAAc,CAAC;gCAC3B,MAAM;gCACN,aAAa;gCACb,cAAcb,OAAO9C;4BACvB;wBACF,IACE2D,cAAc,cAAc,CAAC;gCAC3B,MAAM;gCACN,aAAa;gCACb,MAAMQ;4BACR;wBACF,IACER,cAAc,cAAc,CAAC;gCAC3B,MAAM;gCACN,aAAa;gCACb,MAAMO,SAAS,IAAI,CAAC,IAAI,CAAC;4BAC3B;wBACF,IACEA,SAAS,IAAI,CAAC,MAAM,GAAG,KACvBP,cAAc,cAAc,CAAC;gCAC3B,MAAM;gCACN,aAAa;gCACb,MAAMO,SAAS,IAAI,CAACA,SAAS,IAAI,CAAC,MAAM,GAAG,EAAE;4BAC/C;qBACH;oBAED,KAAK,MAAMK,YAAYD,eACrB,IAAI;wBACFC;wBACA;oBACF,EAAE,OAAOH,GAAG;wBACVC,QAAQ,KAAK,CACX,mCACArE,cACAoE;oBAEJ;oBAGFC,QAAQ,IAAI,CAAC,mCAAmCrE;gBAClD,GAAG;YACL;QACF;IACF,GAAG;QAACA;QAAcE;KAAO;IAEzBM,UAAU;QACR,IAAI,CAACH,SAAS,OAAO,IAAI,CAACH,QAAQ;QAElC,MAAMyD,gBACJtD,SAAS,OAAO,CAAC,kBAAkB;QACrC,IAAI,CAACsD,eAAe;QAEpB,MAAMa,iBAAiB;YACrB,IAAI;gBACFb,cAAc,cAAc,CAAC;oBAC3B,MAAM;oBACN,aAAa;gBACf;YACF,EAAE,OAAOS,GAAG,CAAC;QACf;QAEAT,cAAc,EAAE,CAAC,YAAYa;QAE7B,OAAO;YACLb,cAAc,GAAG,CAAC,YAAYa;QAChC;IACF,GAAG;QAACtE;KAAO;IAEX,OAAOA,SAAS,WAATA,GACL,IAAC;QAAI,WAAWsD,cAAAA,CAAAA,kBAAyB;QAAE,OAAO5D;kBAChD,kBAAC6E,MAAgBA;YACf,KAAKpE;YACL,QAAQH;YACR,SAASrC;YACT,UAAU;gBACR,OAAO,CAAC6G;oBACN,IAAIrE,SAAS,OAAO,EAAE;wBACpB,MAAMsE,WACJtE,SAAS,OAAO,CAAC,kBAAkB;wBACrC,MAAM+B,OAAOsC,QAAQ;wBACrB,IAAIC,YAAYvC,MAAM,OAAOD,QAC3BwC,SAAS,cAAc,CAAC;4BACtB,MAAM;4BACN,aAAa;4BACb,cAAc7B,OAAOV,KAAK,EAAE;wBAC9B;oBAEJ;oBACAvC,eAAe6E;gBACjB;YACF;YACA,OAAO;gBACL,OAAO;gBACP,QAAQ;YACV;;SAGF;AACN;AAGK,MAAME,UAAU,WAAVA,GAAUtE,MAAAA,UAAgB,CACrC,CAACuE,OAAOC,MAAAA,WAAAA,GAAQ,IAACtF,cAAAA;QAAc,GAAGqF,KAAK;QAAE,cAAcC;;AAGlD,MAAMC,yBAIR,CAAC,EAAErF,QAAQ,EAAEG,YAAY,EAAEqD,cAAc,IAAI,EAAE,GAC3C,WAAP,GACE,IAAC8B,mBAAiBA;QAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;kBACrD,CAACC,cACO,WAAP,GACE,IAACC,6BAAAA;gBACC,UAAUzF;gBACV,cAAcG;gBACd,aAAaqD;gBACb,UAAUgC,YAAY,IAAI;;;AAQtC,MAAMC,8BAKD,CAAC,EAAEzF,QAAQ,EAAEG,YAAY,EAAEqD,cAAc,IAAI,EAAEjD,QAAQ,EAAE;IAC5D,MAAMmF,aAAaC,QACjB,IAAM3F,SAAS,GAAG,CAAC,CAAC2C,OAASA,KAAK,IAAI,GACtC;QAAC3C;KAAS;IAGZ,MAAM,CAAC4F,eAAeC,iBAAiB,GAAGnF,SAAmBgF;IAC7D,MAAM,CAACI,WAAWC,aAAa,GAAGrF,SAAS;IAC3C,MAAM,CAACT,UAAU+F,YAAY,GAAGtF,SAC9B8C,cAAc,WAAW;IAE3B,MAAM,CAACyC,aAAaC,eAAe,GAAGxF,SAAS;IAC/C,MAAM,CAACyF,cAAcC,gBAAgB,GAAG1F,SAAS;IACjD,MAAM,CAACL,iBAAiBgG,mBAAmB,GAAG3F;IAC9C,MAAM,CAACJ,cAAcgG,gBAAgB,GAAG5F;IACxC,MAAM,CAAC6F,UAAUC,YAAY,GAAG9F,SAA0B;IAC1D,MAAM,CAAC+F,aAAaC,eAAe,GAAGhG,SAAS;IAC/C,MAAM,CAACiG,kBAAkBC,oBAAoB,GAAGlG,SAAS;IAEzD,MAAMC,WAAWC,MAAAA,MAAY,CAAmB;IAChD,MAAMiG,eAAejG,MAAAA,MAAY,CAAiB;IAElD,MAAMkG,mBAAmBC,YACvB,CAAC/B;QACC7E,eAAe6E;QACf,MAAMtC,OAAOsC,OAAO,IAAI;QACxB,MAAMuB,WAAW7D,MAAM;QACvB,IAAI6D,AAAa9D,WAAb8D,UAAwB;YAC1BC,YAAYD;YACZG,eAAe;QACjB;IACF,GACA;QAACvG;KAAa;IAGhB,MAAM6G,kBAAkBD,YAAY;QAClC,IAAIF,aAAa,OAAO,EAAE;YACxB,MAAMI,KAAKJ,aAAa,OAAO;YAK/B,IAAII,GAAG,iBAAiB,EACtBA,GAAG,iBAAiB,GACjB,IAAI,CAAC,IAAMb,gBAAgB,OAC3B,KAAK,CAAC,CAACc,MACNvC,QAAQ,KAAK,CAAC,+BAA+BuC;iBAE5C,IAAID,GAAG,uBAAuB,EACnC,IAAI;gBACFA,GAAG,uBAAuB;gBAC1Bb,gBAAgB;YAClB,EAAE,OAAOc,KAAK;gBACZvC,QAAQ,KAAK,CAAC,wCAAwCuC;YACxD;iBACK,IAAID,GAAG,oBAAoB,EAChC,IAAI;gBACFA,GAAG,oBAAoB;gBACvBb,gBAAgB;YAClB,EAAE,OAAOc,KAAK;gBACZvC,QAAQ,KAAK,CAAC,qCAAqCuC;YACrD;iBACK,IAAID,GAAG,mBAAmB,EAC/B,IAAI;gBACFA,GAAG,mBAAmB;gBACtBb,gBAAgB;YAClB,EAAE,OAAOc,KAAK;gBACZvC,QAAQ,KAAK,CAAC,oCAAoCuC;YACpD;iBAEAvC,QAAQ,KAAK,CAAC;QAElB;IACF,GAAG,EAAE;IAEL,MAAMwC,iBAAiBJ,YAAY;QACjCK,SACG,cAAc,GACd,IAAI,CAAC,IAAMhB,gBAAgB,QAC3B,KAAK,CAAC,CAACc,MAAQvC,QAAQ,KAAK,CAAC,8BAA8BuC;IAChE,GAAG,EAAE;IAEL,MAAMG,mBAAmBN,YAAY;QACnC,IAAIZ,cACFgB;aAEAH;IAEJ,GAAG;QAACb;QAAca;QAAiBG;KAAe;IAElDrG,UAAU;QACR,MAAMwG,yBAAyB;YAC7BlB,gBAAgB,CAAC,CAACgB,SAAS,iBAAiB;QAC9C;QACAA,SAAS,gBAAgB,CAAC,oBAAoBE;QAC9C,OAAO;YACLF,SAAS,mBAAmB,CAAC,oBAAoBE;QACnD;IACF,GAAG,EAAE;IAEL,MAAMC,mBAAmB5B,QAAQ;QAC/B,IAAI6B,WAAWxH,SAAS,MAAM,CAAC,CAAC2C,OAASiD,cAAc,QAAQ,CAACjD,KAAK,IAAI;QAEzE,IAAIgE,iBAAiB,IAAI,IAAI;YAC3B,MAAMc,cAAcd,iBAAiB,WAAW;YAChDa,WAAWA,SAAS,MAAM,CAAC,CAAC7E,OAC1BA,KAAK,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC8E;QAErC;QAEA,OAAOD;IACT,GAAG;QAACxH;QAAU4F;QAAee;KAAiB;IAE9C,MAAMe,gBAAgB/B,QAAQ;QAC5B,IAAI,CAACM,YAAY,IAAI,IAAI,OAAO,EAAE;QAElC,MAAM0B,QAAQ,IAAIC,OAAO3B,aAAa;QACtC,MAAM4B,UAAmD,EAAE;QAE3D,MAAMC,uBAAuB,CAAC9G;YAC5B,IAAIA,KAAK,IAAI,IAAI2G,MAAM,IAAI,CAAC3G,KAAK,IAAI,GAAG;gBACtC,MAAMW,SAASnD,WAAWwC,KAAK,IAAI;gBACnC6G,QAAQ,IAAI,CAAC;oBAAE,MAAM7G,KAAK,IAAI;oBAAEW;gBAAO;YACzC;YACA,IAAIX,KAAK,QAAQ,EACfA,KAAK,QAAQ,CAAC,OAAO,CAAC8G;QAE1B;QAEAP,iBAAiB,OAAO,CAACO;QACzB,OAAOD;IACT,GAAG;QAACN;QAAkBtB;KAAY;IAElC,MAAM8B,0BAA0BhB,YAAY,CAACpF;QAC3C0E,mBAAmB1E;QACnB2E,gBAAgB3E;IAClB,GAAG,EAAE;IAEL,MAAMqG,iBAAiBjB,YACrB,CAACkB;QACC,IAAI,CAAC1H,YAAY,CAAC0H,UAAU,OAAOA;QACnC,MAAM5E,iBAAiB9C,SAAS,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;QACnE,MAAM+C,iBAAiB2E,SAAS,OAAO,CAAC,OAAO;QAE/C,IAAI3E,eAAe,UAAU,CAACD,iBAAiB,MAC7C,OAAOC,eAAe,KAAK,CAACD,eAAe,MAAM,GAAG;QAC/C,IAAIC,mBAAmBD,gBAC5B,OAAO;QAET,OAAO4E;IACT,GACA;QAAC1H;KAAS;IAGZ,MAAM2H,UAAUnB,YAAY,CAAC/F,MAAgBmH;QAC3C,IAAIA,AAAS,WAATA,MAAiB,OAAOnH,KAAK,UAAU,IAAI;QAC/C,IAAImH,AAAS,aAATA,MAAmB,OAAOnH,KAAK,WAAW,IAAI;QAClD,IAAImH,AAAS,WAATA,MAAiB,OAAOnH,KAAK,QAAQ,IAAI;QAC7C,IAAImH,AAAS,YAATA,MAAkB,OAAOnH,KAAK,KAAK,IAAI;QAC3C,IAAIA,KAAK,KAAK,EAAE,OAAOA,KAAK,KAAK;QACjC,OAAO;IACT,GAAG,EAAE;IAEL,MAAMoH,yBAAyBrB,YAC7B,CAAC/F,MAAgBmH;QACf,IAAInF,OAAOkF,QAAQlH,MAAMmH;QAEzB,IAAInH,KAAK,QAAQ,IAAIA,KAAK,QAAQ,CAAC,MAAM,GAAG,GAAG;YAC7C,MAAMqH,eAAerH,KAAK,QAAQ,CAAC,MAAM,CACvC,CAACsH,KAAKC,QAAUD,MAAMF,uBAAuBG,OAAOJ,OACpD;YAEF,IAAInF,AAAS,MAATA,QAAe,CAAChC,KAAK,IAAI,IAAIqH,eAAe,GAC9CrF,OAAOqF;QAEX;QAEA,OAAOrF;IACT,GACA;QAACkF;KAAQ;IAGX,MAAMM,eAAezB,YACnB,CAAC0B,MAAcN;QACb,MAAMnH,OAAOhB,SAAS,IAAI,CAAC,CAAC0I,IAAMA,EAAE,IAAI,KAAKD;QAC7C,IAAI,CAACzH,MAAM,OAAO;QAClB,MAAM2H,gBAAgBR,QAAQlI;QAC9B,OAAOmI,uBAAuBpH,MAAM2H;IACtC,GACA;QAAC3I;QAAUC;QAAUmI;KAAuB;IAG9C,OAAO,WAAP,GACE,KAAC;QAAI,WAAWtE,eAAAA,OAAc;QAAE,KAAK+C;;0BACnC,IAAC;gBACC,WAAW/C,cAAAA,CAAAA,oBAA2B;gBACtC,SAASuD;gBACT,OAAOlB,eAAe,oBAAoB;gBAC1C,cAAYA,eAAe,oBAAoB;0BAE9CA,eAAe,WAAfA,GAAe,IAACyC,wBAAsBA,CAAAA,KAAAA,WAAAA,GAAM,IAACC,oBAAkBA,CAAAA;;0BAGlE,KAAC;gBAAI,WAAW,GAAG/E,eAAAA,OAAc,CAAC,CAAC,EAAEgC,YAAYhC,eAAAA,SAAgB,GAAG,IAAI;;kCACtE,IAAC;wBACC,WAAW,GAAGA,cAAAA,CAAAA,iBAAwB,CAAC,CAAC,EAAEgC,YAAYhC,eAAAA,SAAgB,GAAG,IAAI;wBAC7E,SAAS,IAAMiC,aAAa,CAACD;kCAE5BA,YAAY,WAAZA,GAAY,IAACgD,eAAaA,CAAAA,KAAAA,WAAAA,GAAM,IAACC,cAAYA,CAAAA;;kCAEhD,KAAC;wBAAI,WAAWjF,cAAAA,CAAAA,kBAAyB;;0CACvC,KAAC;;kDACC,IAAC;kDAAG;;kDACJ,KAACkF,MAAM,KAAK;wCACV,OAAO/I;wCACP,UAAU,CAACyE,IAAMsB,YAAYtB,EAAE,MAAM,CAAC,KAAK;wCAC3C,MAAK;wCACL,aAAY;;0DAEZ,IAACsE,MAAM,MAAM;gDAAC,OAAM;0DAAO;;0DAC3B,IAACA,MAAM,MAAM;gDAAC,OAAM;0DAAS;;0DAC7B,IAACA,MAAM,MAAM;gDAAC,OAAM;0DAAO;;;;;;0CAI/B,KAAC;;kDACC,IAAC;kDAAG;;kDACJ,IAACC,OAAKA;wCACJ,aAAY;wCACZ,OAAOtC;wCACP,UAAU,CAACjC,IAAMkC,oBAAoBlC,EAAE,MAAM,CAAC,KAAK;wCACnD,sBAAQ,IAACwE,gBAAcA;4CAAC,OAAO;gDAAE,OAAO;4CAAO;;wCAC/C,YAAU;wCACV,MAAK;wCACL,OAAO;4CAAE,cAAc;wCAAE;;kDAE3B,IAACC,UAAQA;wCACP,eACEvD,cAAc,MAAM,GAAG,KACvBA,cAAc,MAAM,GAAGF,WAAW,MAAM;wCAE1C,SAASE,cAAc,MAAM,KAAKF,WAAW,MAAM;wCACnD,UAAU,CAAChB,IACTmB,iBAAiBnB,EAAE,MAAM,CAAC,OAAO,GAAGgB,aAAa,EAAE;wCAErD,WAAW5B,cAAAA,CAAAA,oBAA2B;kDACvC;;kDAGD,IAAC;wCAAI,WAAWA,cAAAA,CAAAA,aAAoB;kDACjC4B,WACE,MAAM,CAAC,CAAC+C,OACPA,KAAK,WAAW,GAAG,QAAQ,CAAC9B,iBAAiB,WAAW,KAEzD,GAAG,CAAC,CAAC8B,OAAAA,WAAAA,GACJ,KAAC;gDAAe,WAAW3E,cAAAA,CAAAA,aAAoB;;kEAC7C,IAACqF,UAAQA;wDACP,SAASvD,cAAc,QAAQ,CAAC6C;wDAChC,UAAU,CAAC/D;4DACLA,EAAE,MAAM,CAAC,OAAO,GAClBmB,iBAAiB;mEAAID;gEAAe6C;6DAAK,IAEzC5C,iBACED,cAAc,MAAM,CAAC,CAACwD,IAAMA,MAAMX;wDAGxC;kEAEA,kBAAC;4DAAK,OAAOA;sEAAOA;;;kEAEtB,IAAC;wDAAK,WAAW3E,cAAAA,CAAAA,WAAkB;kEAChCE,WAAWwE,aAAaC,MAAM;;;+CAhBzBA;;;;0CAuBlB,KAAC;;kDACC,IAAC;kDAAG;;kDACJ,IAACQ,OAAKA;wCACJ,aAAY;wCACZ,OAAOhD;wCACP,UAAU,CAACvB;4CACTwB,eAAexB,EAAE,MAAM,CAAC,KAAK;4CAC7B2B,mBAAmB5D;4CACnB6D,gBAAgB7D;wCAClB;wCACA,sBAAQ,IAACyG,gBAAcA;4CAAC,OAAO;gDAAE,OAAO;4CAAO;;wCAC/C,YAAU;wCACV,MAAK;;oCAENjD,YAAY,IAAI,MAAMyB,cAAc,MAAM,GAAG,KAAK,WAAL,GAC5C,KAAC;wCAAI,WAAW5D,cAAAA,CAAAA,iBAAwB;;0DACtC,KAAC;gDAAI,WAAWA,cAAAA,CAAAA,wBAA+B;;oDAAE;oDACxC4D,cAAc,MAAM;oDAAC;oDAC3BA,cAAc,MAAM,GAAG,IAAI,MAAM;;;0DAEpC,IAAC;gDAAI,WAAW5D,cAAAA,CAAAA,sBAA6B;0DAC1C4D,cAAc,GAAG,CAAC,CAAClF,QAAQvB;oDAC1B,MAAMoI,cAAcrB,eAAexF,OAAO,IAAI;oDAC9C,OAAO,WAAP,GACE,IAAC;wDAEC,WAAWsB,cAAAA,CAAAA,qBAA4B;wDACvC,SAAS,IAAMiE,wBAAwBvF,OAAO,MAAM;wDACpD,OAAOA,OAAO,IAAI;kEAEjB6G,eAAe7G,OAAO,IAAI;uDALtBvB;gDAQX;;;;oCAILgF,YAAY,IAAI,MAAMyB,AAAyB,MAAzBA,cAAc,MAAM,IAAU,WAAL,GAC9C,KAAC;wCAAI,WAAW5D,cAAAA,CAAAA,uBAA8B;;4CAAE;4CACpBmC;4CAAY;;;;;;;;;0BAOhD,KAAC;gBAAI,WAAWnC,cAAAA,CAAAA,gBAAuB;;kCACrC,IAACoB,SAAAA;wBACC,KAAKvE;wBACL,UAAU4G;wBACV,UAAUtH;wBACV,cAAc6G;wBACd,iBAAiBzG;wBACjB,cAAcC;wBACd,UAAUC;wBACV,OAAO;4BAAE,OAAO;4BAAQ,QAAQ;wBAAO;;oBAExCgG,WAAW,WAAXA,GACC,IAACjB,mBAAiBA;wBAChB,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,iBAAiB;wBACxC,MAAM,CAAC;kCAEN,CAAC+D,UAAAA,WAAAA,GACA,IAACC,wBAAsBA;gCACrB,KAAKhJ;gCACL,UAAUgG;gCACV,SAAS+C;gCACT,MAAM7C;gCACN,SAASC;;yBAIb;;;;;AAIZ"}
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.13",
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.13",
78
+ "@rsdoctor/utils": "1.3.13",
79
+ "@rsdoctor/types": "1.3.13"
80
80
  },
81
81
  "peerDependencies": {
82
82
  "react": ">=18.3.1",