@rsdoctor/components 1.6.0 → 1.6.1
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.
- package/dist/components/Alerts/bundle-alert.mjs +4 -2
- package/dist/components/Alerts/bundle-alert.mjs.map +1 -1
- package/dist/components/Alerts/bundle.mjs +2 -2
- package/dist/components/Alerts/bundle.mjs.map +1 -1
- package/dist/components/Card/size.d.ts +1 -0
- package/dist/components/Card/size.mjs +29 -7
- package/dist/components/Card/size.mjs.map +1 -1
- package/dist/components/Card/size.module.mjs +1 -0
- package/dist/components/Card/size.module.mjs.map +1 -1
- package/dist/components/Card/size_module.css +5 -0
- package/dist/components/Card/size_module.css.map +1 -1
- package/dist/components/Charts/TimelineCharts/index.mjs +116 -116
- package/dist/components/Charts/TimelineCharts/index.mjs.map +1 -1
- package/dist/components/Charts/TreeMap.d.ts +2 -1
- package/dist/components/Charts/TreeMap.mjs +28 -30
- package/dist/components/Charts/TreeMap.mjs.map +1 -1
- package/dist/components/Charts/constants.d.ts +1 -0
- package/dist/components/Charts/constants.mjs +11 -1
- package/dist/components/Charts/constants.mjs.map +1 -1
- package/dist/components/Charts/loader.css +1 -1
- package/dist/components/Charts/loader.css.map +1 -1
- package/dist/components/Charts/treeMapSize.d.ts +10 -0
- package/dist/components/Charts/treeMapSize.mjs +17 -0
- package/dist/components/Charts/treeMapSize.mjs.map +1 -0
- package/dist/components/Charts/treeMapSize.test.d.ts +1 -0
- package/dist/components/Charts/treeMapSize.test.mjs +44 -0
- package/dist/components/Charts/treeMapSize.test.mjs.map +1 -0
- package/dist/components/Layout/header.mjs +24 -18
- package/dist/components/Layout/header.mjs.map +1 -1
- package/dist/components/Layout/header.module.mjs +5 -1
- package/dist/components/Layout/header.module.mjs.map +1 -1
- package/dist/components/Layout/header_module.css +69 -15
- package/dist/components/Layout/header_module.css.map +1 -1
- package/dist/components/Layout/index.mjs +9 -2
- package/dist/components/Layout/index.mjs.map +1 -1
- package/dist/components/Layout/menus.mjs +6 -5
- package/dist/components/Layout/menus.mjs.map +1 -1
- package/dist/components/Overall/DataSummary.d.ts +1 -1
- package/dist/components/Overall/DataSummary.mjs +1 -1
- package/dist/components/Overall/DataSummary.mjs.map +1 -1
- package/dist/components/Overall/DataSummary_module.css +6 -1
- package/dist/components/Overall/DataSummary_module.css.map +1 -1
- package/dist/components/Overall/bundle.mjs +2 -3
- package/dist/components/Overall/bundle.mjs.map +1 -1
- package/dist/components/Overall/bundle.module.mjs +1 -0
- package/dist/components/Overall/bundle.module.mjs.map +1 -1
- package/dist/components/Overall/bundle_module.css +11 -0
- package/dist/components/Overall/bundle_module.css.map +1 -1
- package/dist/components/Overall/list_module.css +18 -0
- package/dist/components/Overall/list_module.css.map +1 -1
- package/dist/components/Overall/overview_module.css +12 -4
- package/dist/components/Overall/overview_module.css.map +1 -1
- package/dist/components/Overall/project.mjs +1 -1
- package/dist/components/Overall/project.mjs.map +1 -1
- package/dist/components/Overall/project_module.css +8 -0
- package/dist/components/Overall/project_module.css.map +1 -1
- package/dist/pages/BundleSize/components/card_module.css +7 -1
- package/dist/pages/BundleSize/components/card_module.css.map +1 -1
- package/dist/pages/BundleSize/components/tree-graph.mjs +2 -2
- package/dist/pages/BundleSize/components/tree-graph.mjs.map +1 -1
- package/dist/pages/Overall/index.mjs +5 -13
- package/dist/pages/Overall/index.mjs.map +1 -1
- package/dist/pages/Overall/index.module.mjs +3 -0
- package/dist/pages/Overall/index.module.mjs.map +1 -1
- package/dist/pages/Overall/index_module.css +35 -2
- package/dist/pages/Overall/index_module.css.map +1 -1
- package/dist/pages/Overall/responsiveLayout.mjs +3 -3
- package/dist/pages/Overall/responsiveLayout.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/Charts/TimelineCharts/index.mjs","sources":["../../../../src/components/Charts/TimelineCharts/index.tsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, 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';\nimport { useTheme, useThemeToken } from 'src/utils';\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;\nconst DARK_MODE_LOADER_BAR_OPACITY = 0.6;\n\nfunction buildTimelineData(\n loaderData?: DurationMetric[],\n pluginsData?: ITraceEventData[],\n) {\n const data: LoaderType[] = [];\n const categories: string[] = [];\n\n if (loaderData) {\n const loaderCategories: string[] = [];\n loaderData.forEach((_l) => {\n loaderCategories.unshift(_l.n + ' total');\n loaderCategories.unshift(_l.n);\n });\n\n loaderData.forEach((_loaderData) => {\n data.push({\n name: _loaderData.n + ' total',\n value: [\n loaderCategories.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 loaderCategories.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.push(\n ...loaderCategories.map((val, i) =>\n i % 2 !== 0 ? val.replace(' total', '') : '',\n ),\n );\n }\n\n if (pluginsData) {\n const plugins = groupBy(pluginsData, (e: ITraceEventData) => e.pid);\n\n Object.keys(plugins)\n .reverse()\n .forEach((key, i) => {\n plugins[key].forEach((_plugin) => {\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 }\n\n return { data, categories };\n}\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 [optionsData, setOptionsData] = useState({});\n const { isDark } = useTheme();\n const themeToken = useThemeToken();\n const { data, categories } = useMemo(\n () => buildTimelineData(loaderData, pluginsData),\n [loaderData, pluginsData],\n );\n const themedData = useMemo(() => {\n if (!isDark || chartType !== ChartTypes.Loader) {\n return data;\n }\n\n return data.map((item) => ({\n ...item,\n itemStyle: {\n normal: {\n ...item.itemStyle.normal,\n opacity: DARK_MODE_LOADER_BAR_OPACITY,\n },\n },\n }));\n }, [chartType, data, isDark]);\n\n // Register the required components\n echarts.use([\n CustomChart,\n TooltipComponent,\n GridComponent,\n DataZoomComponent,\n CanvasRenderer,\n ]);\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: themeToken.colorText,\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: themedData,\n },\n ],\n };\n setOptionsData(option);\n }, [chartType, exts, formatterFn, themeToken, categories, themedData]);\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 var(--color-border)',\n borderRadius: '10px',\n }}\n />\n );\n },\n);\n"],"names":["LINE_HEIGHT","DARK_MODE_LOADER_BAR_OPACITY","buildTimelineData","loaderData","pluginsData","data","categories","loaderCategories","_l","_loaderData","PALETTE_COLORS","Math","l","val","i","plugins","groupBy","e","Object","key","_plugin","String","TimelineCom","memo","formatterFn","chartType","ChartTypes","exts","optionsData","setOptionsData","useState","isDark","useTheme","themeToken","useThemeToken","useMemo","themedData","item","echarts","CustomChart","TooltipComponent","GridComponent","DataZoomComponent","CanvasRenderer","useEffect","renderItem","params","api","categoryIndex","start","end","height","rectShape","option","raw","dayjs","ReactEChartsCore"],"mappings":";;;;;;;;;;;AA8BA,MAAMA,cAAc;AACpB,MAAMC,+BAA+B;AAErC,SAASC,kBACPC,UAA6B,EAC7BC,WAA+B;IAE/B,MAAMC,OAAqB,EAAE;IAC7B,MAAMC,aAAuB,EAAE;IAE/B,IAAIH,YAAY;QACd,MAAMI,mBAA6B,EAAE;QACrCJ,WAAW,OAAO,CAAC,CAACK;YAClBD,iBAAiB,OAAO,CAACC,GAAG,CAAC,GAAG;YAChCD,iBAAiB,OAAO,CAACC,GAAG,CAAC;QAC/B;QAEAL,WAAW,OAAO,CAAC,CAACM;YAClBJ,KAAK,IAAI,CAAC;gBACR,MAAMI,YAAY,CAAC,GAAG;gBACtB,OAAO;oBACLF,iBAAiB,OAAO,CAACE,YAAY,CAAC,GAAG;oBACzCA,YAAY,CAAC;oBACbA,YAAY,CAAC;oBACbA,YAAY,CAAC,GAAGA,YAAY,CAAC;iBAC9B;gBACD,WAAW;oBACT,QAAQ;wBACN,OAAOC,cAAc,CAACC,KAAK,KAAK,CAACA,AAAgB,KAAhBA,KAAK,MAAM,IAAS;wBACrD,SAAS;oBACX;gBACF;YACF;YAEA,IAAI,CAACF,aAAa,GAAG;YACrB,IAAK,IAAIG,IAAI,GAAGA,IAAIH,YAAY,CAAC,CAAC,MAAM,EAAEG,IACxCP,KAAK,IAAI,CAAC;gBACR,MAAMI,YAAY,CAAC;gBACnB,OAAO;oBACLF,iBAAiB,OAAO,CAACE,YAAY,CAAC;oBACtCA,YAAY,CAAC,CAACG,EAAE,CAAC,CAAC;oBAClBH,YAAY,CAAC,CAACG,EAAE,CAAC,CAAC;oBAClBH,YAAY,CAAC,CAACG,EAAE,CAAC,CAAC,GAAGH,YAAY,CAAC,CAACG,EAAE,CAAC,CAAC;iBACxC;gBACD,WAAW;oBACT,QAAQ;wBACN,OAAOF,cAAc,CAACC,KAAK,KAAK,CAACA,AAAgB,KAAhBA,KAAK,MAAM,IAAS;wBACrD,SAAS;oBACX;gBACF;gBACA,KAAKF,YAAY,CAAC,CAACG,EAAE,CAAC,GAAG;YAC3B;QAEJ;QAEAN,WAAW,IAAI,IACVC,iBAAiB,GAAG,CAAC,CAACM,KAAKC,IAC5BA,IAAI,MAAM,IAAID,IAAI,OAAO,CAAC,UAAU,MAAM;IAGhD;IAEA,IAAIT,aAAa;QACf,MAAMW,UAAUC,QAAQZ,aAAa,CAACa,IAAuBA,EAAE,GAAG;QAElEC,OAAO,IAAI,CAACH,SACT,OAAO,GACP,OAAO,CAAC,CAACI,KAAKL;YACbC,OAAO,CAACI,IAAI,CAAC,OAAO,CAAC,CAACC;gBACpBf,KAAK,IAAI,CAAC;oBACR,MAAMgB,OAAOD,QAAQ,GAAG;oBACxB,OAAO;wBACLN;wBACAM,QAAQ,IAAI,CAAC,CAAC;wBACdA,QAAQ,IAAI,CAAC,CAAC;wBACdA,QAAQ,IAAI,CAAC,CAAC,GAAGA,QAAQ,IAAI,CAAC,CAAC;qBAChC;oBACD,WAAW;wBACT,QAAQ;4BACN,OAAOV,cAAc,CAACC,KAAK,KAAK,CAACA,AAAgB,KAAhBA,KAAK,MAAM,IAAS;4BACrD,SAAS;wBACX;oBACF;oBACA,KAAKS;gBACP;YACF;YACAd,WAAW,IAAI,CAACe,OAAOF,IAAI,MAAM,CAAC,GAAG,WAAW,KAAKA,IAAI,KAAK,CAAC;QACjE;IACJ;IAEA,OAAO;QAAEd;QAAMC;IAAW;AAC5B;AAEO,MAAMgB,cAAWA,WAAAA,GAMnBC,KACH,CAAC,EACCpB,UAAU,EACVC,WAAW,EACXoB,WAAW,EACXC,YAAYC,WAAW,MAAM,EAC7BC,OAAO,IAAI,EACZ;IACC,MAAM,CAACC,aAAaC,eAAe,GAAGC,SAAS,CAAC;IAChD,MAAM,EAAEC,MAAM,EAAE,GAAGC;IACnB,MAAMC,aAAaC;IACnB,MAAM,EAAE7B,IAAI,EAAEC,UAAU,EAAE,GAAG6B,QAC3B,IAAMjC,kBAAkBC,YAAYC,cACpC;QAACD;QAAYC;KAAY;IAE3B,MAAMgC,aAAaD,QAAQ;QACzB,IAAI,CAACJ,UAAUN,cAAcC,WAAW,MAAM,EAC5C,OAAOrB;QAGT,OAAOA,KAAK,GAAG,CAAC,CAACgC,OAAU;gBACzB,GAAGA,IAAI;gBACP,WAAW;oBACT,QAAQ;wBACN,GAAGA,KAAK,SAAS,CAAC,MAAM;wBACxB,SAASpC;oBACX;gBACF;YACF;IACF,GAAG;QAACwB;QAAWpB;QAAM0B;KAAO;IAG5BO,wCAAAA,GAAW,CAAC;QACVC;QACAC;QACAC;QACAC;QACAC;KACD;IAEDC,UAAU;QACR,SAASC,WACPC,MAAkC,EAClCC,GAKC;YAED,MAAMC,gBAAgBD,IAAI,KAAK,CAAC;YAChC,MAAME,QAAQF,IAAI,KAAK,CAAC;gBAACA,IAAI,KAAK,CAAC;gBAAIC;aAAc;YACrD,MAAME,MAAMH,IAAI,KAAK,CAAC;gBAACA,IAAI,KAAK,CAAC;gBAAIC;aAAc;YACnD,MAAMG,SAASJ,AAAsB,MAAtBA,IAAI,IAAI,CAAC;gBAAC;gBAAG;aAAE,CAAC,CAAC,EAAE;YAElC,MAAMK,YAAYd,wCAAAA,OAAAA,CAAAA,cAA8B,CAC9C;gBACE,GAAGW,KAAK,CAAC,EAAE;gBACX,GACExB,cAAcC,WAAW,MAAM,GAC3BuB,KAAK,CAAC,EAAE,GAAID,CAAAA,gBAAgB,MAAM,IAAI,IAAIG,AAAS,IAATA,MAAS,IACnDF,KAAK,CAAC,EAAE;gBACd,OAAOC,GAAG,CAAC,EAAE,GAAGD,KAAK,CAAC,EAAE,IAAI;gBAC5B,QAAQE;YACV,GACA;gBACE,GAAGL,OAAO,QAAQ,CAAC,CAAC;gBACpB,GAAGA,OAAO,QAAQ,CAAC,CAAC;gBACpB,OAAOA,OAAO,QAAQ,CAAC,KAAK;gBAC5B,QAAQA,OAAO,QAAQ,CAAC,MAAM;YAChC;YAEF,OACEM,aAAa;gBACX,MAAM;gBACN,YAAY;oBAAC;iBAAQ;gBACrB,OAAOA;gBACP,OAAOL,IAAI,KAAK;gBAChB,WAAW;oBACT,OAAO;wBAAE,SAAS;oBAAE;oBACpB,GAAG;gBACL;YACF;QAEJ;QAEA,MAAMM,SAAS;YACb,SAAS;gBACP,WAAW,CAACC,MACH9B,YAAY8B;YAEvB;YACA,UAAU;gBACR;oBACE,MAAM;oBACN,YAAY;oBACZ,gBAAgB;oBAChB,KAAK;gBACP;gBACA;oBACE,MAAM;oBACN,YAAY;gBACd;aACD;YACD,MAAM;gBACJ,KAAK;gBACL,MAAM;gBACN,QAAQ;gBACR,OAAO;gBACP,QACEhD,WAAW,MAAM,GAAImB,CAAAA,cAAcC,WAAW,MAAM,GAAG,IAAI,KACvD,SACApB,WAAW,MAAM,GAAGN;gBAC1B,cAAc;YAChB;YACA,OAAO;gBACL,UACE2B,MAAM,gBAAgBA,MAAM,iBACxBhB,KAAK,KAAK,CAAEgB,AAAAA,CAAAA,KAAK,YAAY,GAAGA,KAAK,cAAa,IAAK,KACvD;gBACN,UAAU;gBACV,WAAW;oBACT,MAAM;gBACR;gBACA,OAAO;gBACP,UAAU;oBACR,MAAM;gBACR;gBACA,WAAW;oBACT,WAAUd,GAAW;wBACnB,OAAO0C,MAAM1C,KAAe,MAAM,CAAC;oBACrC;gBACF;YACF;YACA,OAAO;gBACL,MAAM;gBACN,WAAW;oBACT,MAAM;gBACR;gBACA,WAAW;oBACT,QAAQ;oBACR,YAAY;oBACZ,OAAO;oBACP,UAAU;oBACV,OAAOoB,WAAW,SAAS;oBAC3B,eAAe;gBACjB;gBACA,UAAU;oBACR,MAAM;gBACR;gBACA,UAAU;oBACR,MAAM;gBACR;gBACA,MAAM3B;YACR;YACA,QAAQ;gBACN;oBACE,MAAM;oBACNuC;oBACA,WAAW;wBACT,SAAS;oBACX;oBACA,QAAQ;wBACN,GAAG;4BAAC;4BAAG;yBAAE;wBACT,GAAG;oBACL;oBACA,MAAMT;gBACR;aACD;QACH;QACAP,eAAewB;IACjB,GAAG;QAAC5B;QAAWE;QAAMH;QAAaS;QAAY3B;QAAY8B;KAAW;IAErE,OAAO,WAAP,GACE,IAACoB,MAAgBA;QACf,QAAQ5B;QACR,SAASU;QACT,OAAO;YACL,OAAO;YACP,WACEb,cAAcC,WAAW,MAAM,GAC3B,UACAD,cAAcC,WAAW,MAAM,GAC7B,UACA;YACR,WAAWD,cAAcC,WAAW,MAAM,GAAG,UAAU;YACvD,QAAQ;YACR,cAAc;QAChB;;AAGN"}
|
|
1
|
+
{"version":3,"file":"components/Charts/TimelineCharts/index.mjs","sources":["../../../../src/components/Charts/TimelineCharts/index.tsx"],"sourcesContent":["import React, { useState, useEffect, memo, useMemo } 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, TIMELINE_PALETTE_COLORS } from '../constants';\nimport { useThemeToken } from 'src/utils';\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 = 46;\n\necharts.use([\n CustomChart,\n TooltipComponent,\n GridComponent,\n DataZoomComponent,\n CanvasRenderer,\n]);\n\nexport const TimelineCom: React.FC<{\n loaderData?: DurationMetric[];\n pluginsData?: ITraceEventData[];\n // rslint-disable-next-line @typescript-eslint/no-unsafe-function-type\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 [optionsData, setOptionsData] = useState({});\n const themeToken = useThemeToken();\n\n const { data, categories } = useMemo(() => {\n const chartData: LoaderType[] = [];\n const categoryLabels: string[] = [];\n\n if (loaderData) {\n loaderData.forEach((loader) => {\n categoryLabels.unshift(loader.n + ' total');\n categoryLabels.unshift(loader.n);\n });\n\n loaderData.forEach((loader, loaderIndex) => {\n const totalColor =\n TIMELINE_PALETTE_COLORS[\n loaderIndex % TIMELINE_PALETTE_COLORS.length\n ];\n chartData.push({\n name: loader.n + ' total',\n value: [\n categoryLabels.indexOf(loader.n + ' total'),\n loader.s,\n loader.e,\n loader.e - loader.s,\n ],\n itemStyle: {\n normal: {\n color: totalColor,\n opacity: 0.34,\n },\n },\n });\n\n loader.c?.forEach((child, childIndex) => {\n chartData.push({\n name: loader.n,\n value: [\n categoryLabels.indexOf(loader.n),\n child.s,\n child.e,\n child.e - child.s,\n ],\n itemStyle: {\n normal: {\n color:\n TIMELINE_PALETTE_COLORS[\n (loaderIndex + childIndex) %\n TIMELINE_PALETTE_COLORS.length\n ],\n opacity: 0.78,\n },\n },\n ext: child.ext as ChartProps['loaders'][0],\n });\n });\n });\n\n for (let index = 0; index < categoryLabels.length; index++) {\n categoryLabels[index] =\n index % 2 !== 0 ? categoryLabels[index].replace(' total', '') : '';\n }\n }\n\n if (pluginsData) {\n const groupedPlugins = groupBy(\n pluginsData,\n (event: ITraceEventData) => event.pid,\n );\n\n Object.keys(groupedPlugins)\n .reverse()\n .forEach((key, groupIndex) => {\n groupedPlugins[key].forEach((plugin, pluginIndex) => {\n chartData.push({\n name: String(plugin.pid),\n value: [\n groupIndex,\n plugin.args.s,\n plugin.args.e,\n plugin.args.e - plugin.args.s,\n ],\n itemStyle: {\n normal: {\n color:\n TIMELINE_PALETTE_COLORS[\n (groupIndex + pluginIndex) %\n TIMELINE_PALETTE_COLORS.length\n ],\n opacity: 0.78,\n },\n },\n ext: plugin,\n });\n });\n categoryLabels.push(\n String(key.charAt(0).toUpperCase() + key.slice(1)),\n );\n });\n }\n\n return {\n data: chartData,\n categories: categoryLabels,\n };\n }, [loaderData, pluginsData]);\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.36;\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: -8,\n height: 14,\n borderColor: themeToken.colorBorderSecondary,\n backgroundColor: themeToken.colorFillQuaternary,\n fillerColor: themeToken.colorPrimaryBg,\n handleStyle: {\n color: themeToken.colorTextSecondary,\n borderColor: themeToken.colorBorder,\n },\n },\n {\n type: 'inside',\n filterMode: 'weakFilter',\n },\n ],\n grid: {\n top: 18,\n left: 12,\n bottom: 12,\n right: 16,\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 lineStyle: {\n color: themeToken.colorBorderSecondary,\n width: 1,\n },\n },\n scale: true,\n axisLine: {\n show: false,\n },\n axisLabel: {\n color: themeToken.colorTextSecondary,\n fontSize: 11,\n margin: 10,\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: false,\n lineHeight: 20,\n width: chartType === ChartTypes.Loader ? 220 : 140,\n overflow: 'truncate',\n margin: 16,\n fontSize: 12,\n color: themeToken.colorTextSecondary,\n verticalAlign: 'middle',\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: 1,\n },\n encode: {\n x: [1, 2],\n y: 0,\n },\n data,\n },\n ],\n };\n setOptionsData(option);\n }, [categories, chartType, data, exts, formatterFn, themeToken]);\n\n const categoryCount = loaderData\n ? loaderData.length * 2\n : new Set(pluginsData?.map((item) => item.pid)).size;\n const chartHeight =\n chartType === ChartTypes.Minify\n ? 100\n : chartType === ChartTypes.Loader\n ? Math.min(Math.max(categoryCount * LINE_HEIGHT + 80, 300), 1000)\n : Math.min(Math.max(categoryCount * LINE_HEIGHT + 70, 200), 1000);\n\n return (\n <ReactEChartsCore\n option={optionsData}\n echarts={echarts}\n style={{\n width: '100%',\n height: `${chartHeight}px`,\n border: '1px solid var(--color-border)',\n borderRadius: '10px',\n }}\n />\n );\n },\n);\n"],"names":["LINE_HEIGHT","echarts","CustomChart","TooltipComponent","GridComponent","DataZoomComponent","CanvasRenderer","TimelineCom","memo","loaderData","pluginsData","formatterFn","chartType","ChartTypes","exts","optionsData","setOptionsData","useState","themeToken","useThemeToken","data","categories","useMemo","chartData","categoryLabels","loader","loaderIndex","totalColor","TIMELINE_PALETTE_COLORS","child","childIndex","index","groupedPlugins","groupBy","event","Object","key","groupIndex","plugin","pluginIndex","String","useEffect","renderItem","params","api","categoryIndex","start","end","height","rectShape","option","raw","Math","val","dayjs","categoryCount","Set","item","chartHeight","ReactEChartsCore"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { ECElementEvent } from 'echarts/types/dist/shared';
|
|
3
|
+
import { type TreeMapSizeType } from './treeMapSize.js';
|
|
3
4
|
export type TreeNode = {
|
|
4
5
|
name: string;
|
|
5
6
|
value?: number;
|
|
@@ -10,7 +11,7 @@ export type TreeNode = {
|
|
|
10
11
|
gzipSize?: number;
|
|
11
12
|
id?: string | number;
|
|
12
13
|
};
|
|
13
|
-
export type SizeType =
|
|
14
|
+
export type SizeType = TreeMapSizeType;
|
|
14
15
|
interface TreeMapProps {
|
|
15
16
|
treeData: TreeNode[];
|
|
16
17
|
sizeType: SizeType;
|
|
@@ -14,6 +14,7 @@ import { ModuleAnalyzeComponent } from "../../pages/ModuleAnalyze/index.mjs";
|
|
|
14
14
|
import treemap_module from "./treemap.module.mjs";
|
|
15
15
|
import { TREE_COLORS } from "./constants.mjs";
|
|
16
16
|
import { isJavaScriptAsset } from "../../utils/assets.mjs";
|
|
17
|
+
import { calculateTreeNodeTotalSize, calculateTreeNodesTotalSize } from "./treeMapSize.mjs";
|
|
17
18
|
__rspack_external_echarts_core_d2845954.use([
|
|
18
19
|
TreemapChart,
|
|
19
20
|
TooltipComponent,
|
|
@@ -48,13 +49,13 @@ function getLuminance(hex) {
|
|
|
48
49
|
function isDarkColor(hex) {
|
|
49
50
|
return getLuminance(hex) < 0.4;
|
|
50
51
|
}
|
|
51
|
-
function getLevelOption() {
|
|
52
|
+
function getLevelOption(gapColor) {
|
|
52
53
|
return [
|
|
53
54
|
{
|
|
54
55
|
itemStyle: {
|
|
55
56
|
borderWidth: 0,
|
|
56
57
|
gapWidth: 4,
|
|
57
|
-
gapColor
|
|
58
|
+
gapColor
|
|
58
59
|
}
|
|
59
60
|
},
|
|
60
61
|
{
|
|
@@ -65,7 +66,7 @@ function getLevelOption() {
|
|
|
65
66
|
],
|
|
66
67
|
borderWidth: 5,
|
|
67
68
|
gapWidth: 4,
|
|
68
|
-
gapColor
|
|
69
|
+
gapColor
|
|
69
70
|
},
|
|
70
71
|
upperLabel: {
|
|
71
72
|
show: true,
|
|
@@ -194,9 +195,9 @@ const TreeMap = /*#__PURE__*/ memo(({ treeData, sizeType, onChartClick, highligh
|
|
|
194
195
|
</div>`;
|
|
195
196
|
}
|
|
196
197
|
const rows = [];
|
|
197
|
-
if (void 0 !== sourceSize && sourceSize > 0) rows.push(makeRow('Stat size', formatSize(sourceSize), '#
|
|
198
|
-
if (void 0 !== bundledSize && bundledSize > 0) rows.push(makeRow('Parsed size', formatSize(bundledSize), '#
|
|
199
|
-
if (void 0 !== gzipSize && gzipSize > 0) rows.push(makeRow('Gzipped size', formatSize(gzipSize), '#
|
|
198
|
+
if (void 0 !== sourceSize && sourceSize > 0) rows.push(makeRow('Stat size', formatSize(sourceSize), '#43c6d9'));
|
|
199
|
+
if (void 0 !== bundledSize && bundledSize > 0) rows.push(makeRow('Parsed size', formatSize(bundledSize), '#5b8ff9'));
|
|
200
|
+
if (void 0 !== gzipSize && gzipSize > 0) rows.push(makeRow('Gzipped size', formatSize(gzipSize), '#f2b84b'));
|
|
200
201
|
return `
|
|
201
202
|
<div style="font-family: sans-serif; font-size: 12px; line-height: 1.5;">
|
|
202
203
|
<div style="margin-bottom: 6px; max-width: 400px; word-wrap: break-word; overflow-wrap: break-word; word-break: break-all; white-space: normal; color: ${textColor};">${__rspack_external_echarts_core_d2845954.format.encodeHTML(path)}</div>
|
|
@@ -234,7 +235,7 @@ const TreeMap = /*#__PURE__*/ memo(({ treeData, sizeType, onChartClick, highligh
|
|
|
234
235
|
4
|
|
235
236
|
]
|
|
236
237
|
},
|
|
237
|
-
levels: getLevelOption(),
|
|
238
|
+
levels: getLevelOption(themeToken.colorBgContainer),
|
|
238
239
|
data: data,
|
|
239
240
|
breadcrumb: {
|
|
240
241
|
show: true,
|
|
@@ -550,28 +551,16 @@ const AssetTreemapWithFilterInner = ({ treeData, onChartClick, bundledSize = tru
|
|
|
550
551
|
if (normalizedPath === normalizedRoot) return '';
|
|
551
552
|
return filepath;
|
|
552
553
|
};
|
|
553
|
-
const getSize = (node, type)=>{
|
|
554
|
-
if ('stat' === type) return node.sourceSize || 0;
|
|
555
|
-
if ('parsed' === type) return node.bundledSize || 0;
|
|
556
|
-
if ('gzip' === type) return node.gzipSize || 0;
|
|
557
|
-
if ('value' === type) return node.value || 0;
|
|
558
|
-
if (node.value) return node.value;
|
|
559
|
-
return 0;
|
|
560
|
-
};
|
|
561
|
-
const calculateNodeTotalSize = (node, type)=>{
|
|
562
|
-
let size = getSize(node, type);
|
|
563
|
-
if (node.children && node.children.length > 0) {
|
|
564
|
-
const childrenSize = node.children.reduce((sum, child)=>sum + calculateNodeTotalSize(child, type), 0);
|
|
565
|
-
if (0 === size || !node.path && childrenSize > 0) size = childrenSize;
|
|
566
|
-
}
|
|
567
|
-
return size;
|
|
568
|
-
};
|
|
569
554
|
const getChunkSize = (name, type)=>{
|
|
570
555
|
const node = treeData.find((n)=>n.name === name);
|
|
571
556
|
if (!node) return 0;
|
|
572
557
|
const sizeTypeToUse = type || sizeType;
|
|
573
|
-
return
|
|
558
|
+
return calculateTreeNodeTotalSize(node, sizeTypeToUse);
|
|
574
559
|
};
|
|
560
|
+
const allAssetsSize = useMemo(()=>calculateTreeNodesTotalSize(filteredTreeData, sizeType), [
|
|
561
|
+
filteredTreeData,
|
|
562
|
+
sizeType
|
|
563
|
+
]);
|
|
575
564
|
return /*#__PURE__*/ jsxs("div", {
|
|
576
565
|
className: treemap_module.treemap,
|
|
577
566
|
ref: containerRef,
|
|
@@ -641,12 +630,21 @@ const AssetTreemapWithFilterInner = ({ treeData, onChartClick, bundledSize = tru
|
|
|
641
630
|
marginBottom: 8
|
|
642
631
|
}
|
|
643
632
|
}),
|
|
644
|
-
/*#__PURE__*/
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
633
|
+
/*#__PURE__*/ jsxs("div", {
|
|
634
|
+
className: treemap_module["chunk-item"],
|
|
635
|
+
children: [
|
|
636
|
+
/*#__PURE__*/ jsx(Checkbox, {
|
|
637
|
+
indeterminate: checkedAssets.length > 0 && checkedAssets.length < visibleAssetNames.length,
|
|
638
|
+
checked: visibleAssetNames.length > 0 && checkedAssets.length === visibleAssetNames.length,
|
|
639
|
+
onChange: (e)=>setCheckedAssets(e.target.checked ? visibleAssetNames : []),
|
|
640
|
+
className: treemap_module["all-none-checkbox"],
|
|
641
|
+
children: "All"
|
|
642
|
+
}),
|
|
643
|
+
/*#__PURE__*/ jsx("span", {
|
|
644
|
+
className: treemap_module["size-tag"],
|
|
645
|
+
children: formatSize(allAssetsSize)
|
|
646
|
+
})
|
|
647
|
+
]
|
|
650
648
|
}),
|
|
651
649
|
/*#__PURE__*/ jsx(Checkbox, {
|
|
652
650
|
checked: showOnlyJavaScriptAssets,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/Charts/TreeMap.mjs","sources":["../../../src/components/Charts/TreeMap.tsx"],"sourcesContent":["import React, { useEffect, useState, memo, useMemo, useCallback } from 'react';\nimport EChartsReactCore from 'echarts-for-react/esm/core';\nimport * as echarts from 'echarts/core';\nimport { TreemapChart, type TreemapSeriesOption } from 'echarts/charts';\nimport {\n TooltipComponent,\n TitleComponent,\n type TooltipComponentOption,\n type TitleComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { Alert, Checkbox, Radio, Input } from 'antd';\nimport {\n LeftOutlined,\n RightOutlined,\n SearchOutlined,\n FullscreenOutlined,\n FullscreenExitOutlined,\n} from '@ant-design/icons';\nimport type { ComposeOption, EChartsType } from 'echarts/core';\nimport { formatSize, useThemeToken } 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 { isJavaScriptAsset } from '../../utils/assets';\nimport type {\n CallbackDataParams,\n ECElementEvent,\n} from 'echarts/types/dist/shared';\n\ntype TreeMapOption = ComposeOption<\n TreemapSeriesOption | TooltipComponentOption | TitleComponentOption\n>;\n\ntype TreemapDataNode = NonNullable<TreemapSeriesOption['data']>[number] & {\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n moduleId?: string | number;\n};\n\necharts.use([TreemapChart, TooltipComponent, TitleComponent, CanvasRenderer]);\n\nexport type TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n id?: string | number;\n};\n\nexport type SizeType = 'stat' | 'parsed' | 'gzip' | 'value';\n\ninterface TreeMapProps {\n treeData: TreeNode[];\n sizeType: SizeType;\n style?: React.CSSProperties;\n onChartClick?: (params: ECElementEvent) => void;\n highlightNodeId?: number;\n centerNodeId?: number;\n rootPath?: string;\n}\n\nfunction hashString(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash << 5) + hash + str.charCodeAt(i);\n }\n return hash >>> 0;\n}\n\nfunction blendWithWhite(hex: string, ratio: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n\n const blendedR = Math.round(r * ratio + 255 * (1 - ratio));\n const blendedG = Math.round(g * ratio + 255 * (1 - ratio));\n const blendedB = Math.round(b * ratio + 255 * (1 - ratio));\n\n return `#${blendedR.toString(16).padStart(2, '0')}${blendedG.toString(16).padStart(2, '0')}${blendedB.toString(16).padStart(2, '0')}`;\n}\n\nfunction getLuminance(hex: string): number {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n\n const [rs, gs, bs] = [r, g, b].map((val) => {\n return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);\n });\n\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n}\n\nfunction isDarkColor(hex: string): boolean {\n return getLuminance(hex) < 0.4;\n}\n\nfunction getLevelOption() {\n return [\n {\n itemStyle: {\n borderWidth: 0,\n gapWidth: 4,\n gapColor: '#ffffff',\n },\n },\n {\n itemStyle: {\n borderColorAlpha: [1, 0.3],\n borderWidth: 5,\n gapWidth: 4,\n gapColor: '#ffffff',\n },\n upperLabel: {\n show: true,\n color: '#ffffff',\n fontSize: 12,\n height: 30,\n },\n },\n ];\n}\n\nexport const TreeMap: React.FC<TreeMapProps> = memo(\n ({\n treeData,\n sizeType,\n onChartClick,\n highlightNodeId,\n centerNodeId,\n rootPath,\n }) => {\n const [option, setOption] = useState<TreeMapOption | null>(null);\n const chartRef = React.useRef<EChartsReactCore | null>(null);\n const chartDataRef = React.useRef<TreemapDataNode[]>([]);\n const clickTimeoutRef = React.useRef<number | null>(null);\n const themeToken = useThemeToken();\n\n useEffect(() => {\n if (!treeData) return;\n function convert(\n node: TreeNode,\n index = 0,\n level = 0,\n parentColor?: string,\n siblingIndex = 0,\n siblingCount = 1,\n chunkPath?: string,\n ): TreemapDataNode {\n const baseColor =\n parentColor || TREE_COLORS[index % TREE_COLORS.length];\n\n // For level 0 (chunk level), use the chunk's path/name as chunkPath\n const currentChunkPath =\n level === 0 ? node.path || node.name || '' : chunkPath || '';\n\n const children = node.children?.map((c, childIndex) =>\n convert(\n c,\n index,\n level + 1,\n baseColor,\n childIndex,\n node.children?.length || 0,\n currentChunkPath,\n ),\n );\n\n let val = 0;\n if (sizeType === 'stat') val = node.sourceSize || 0;\n else if (sizeType === 'parsed') val = node.bundledSize || 0;\n else if (sizeType === 'gzip') val = node.gzipSize || 0;\n else if (sizeType === 'value') val = node.value || 0;\n\n // Include chunk path in nodeId for non-root nodes to ensure uniqueness across chunks\n const nodeIdString =\n level === 0\n ? node.path || node.name || ''\n : `${currentChunkPath}::${node.path || node.name || ''}`;\n const nodeId = hashString(nodeIdString);\n const isHighlighted = highlightNodeId === nodeId;\n\n const baseColorRatio =\n level === 0 ? 1 : Math.max(0.35, 1 - level * 0.15);\n const baseBorderRatio =\n level === 0 ? 1 : Math.max(0.4, 1 - level * 0.15);\n\n const siblingGradientRange = 0.15;\n const siblingRatio =\n siblingCount > 1\n ? 1 - (siblingIndex / (siblingCount - 1)) * siblingGradientRange\n : 1;\n\n const colorRatio = baseColorRatio * siblingRatio;\n const borderRatio = baseBorderRatio * siblingRatio;\n\n const nodeColor = isHighlighted\n ? '#fff5f5'\n : level === 0\n ? blendWithWhite(baseColor, 0.8)\n : blendWithWhite(baseColor, colorRatio);\n\n const nodeBorderColor = isHighlighted\n ? '#ff4d4f'\n : level === 0\n ? baseColor\n : blendWithWhite(baseColor, borderRatio);\n\n const isDark = isDarkColor(nodeColor);\n const textColor = isDark ? '#ffffff' : '#000000';\n const textBorderColor = isDark\n ? 'rgba(255, 255, 255, 0.2)'\n : 'rgba(0, 0, 0, 0.1)';\n\n const result: TreemapDataNode = {\n id: nodeId,\n name: node.name,\n value: val,\n path: node.path || node.name,\n sourceSize:\n node.sourceSize ?? (sizeType === 'stat' ? val : undefined),\n bundledSize:\n node.bundledSize ?? (sizeType === 'parsed' ? val : undefined),\n gzipSize: node.gzipSize ?? (sizeType === 'gzip' ? val : undefined),\n moduleId: node.id,\n itemStyle: {\n borderWidth: isHighlighted ? 4 : 1,\n color: nodeColor,\n borderColor: nodeBorderColor,\n ...(level === 0 && { gapWidth: 2 }),\n },\n label: {\n show: true,\n color: textColor,\n textBorderColor: textBorderColor,\n textBorderWidth: 1,\n },\n upperLabel:\n level === 0\n ? undefined\n : {\n show: true,\n color: textColor,\n },\n };\n\n if (children && children.length > 0) {\n result.children = children;\n }\n\n if (isHighlighted) {\n result.emphasis = {\n itemStyle: {\n borderColor: '#ff4d4f',\n borderWidth: 4,\n color: '#fff5f5',\n },\n };\n } else {\n // Keep the same color on hover/click to prevent color change\n result.emphasis = {\n itemStyle: {\n color: nodeColor,\n borderColor: nodeBorderColor,\n borderWidth: isHighlighted ? 4 : 1,\n },\n };\n }\n\n return result;\n }\n\n const data = treeData\n .map((item, index) =>\n convert(item, index, 0, undefined, index, treeData.length, undefined),\n )\n .filter(\n (item) =>\n (typeof item.value === 'number' ? item.value > 0 : false) ||\n (item.children && item.children.length > 0),\n );\n\n chartDataRef.current = data;\n\n const textColor = themeToken.colorText;\n setOption({\n color: TREE_COLORS,\n tooltip: {\n padding: 10,\n backgroundColor: themeToken.colorBgElevated,\n borderColor: themeToken.colorBorder,\n borderWidth: 1,\n textStyle: {\n color: textColor,\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 },\n formatter: function (info) {\n const node =\n (info as CallbackDataParams & { data?: TreemapDataNode }).data ||\n {};\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: ${textColor};\">${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 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 textStyle: {\n fontFamily: 'sans-serif',\n fontSize: 12,\n color: 'white',\n },\n },\n emphasis: {\n itemStyle: {\n color: '#333',\n },\n },\n },\n roam: true,\n nodeClick: false,\n zoomToNodeRatio: 0.7,\n animationDurationUpdate: 500,\n width: '100%',\n height: '100%',\n top: -10,\n bottom: 30,\n left: 0,\n right: 0,\n scaleLimit: {\n min: 0.5,\n max: 5,\n },\n },\n ],\n });\n }, [treeData, sizeType, highlightNodeId, rootPath, themeToken]);\n\n useEffect(() => {\n if (centerNodeId && chartRef.current && option) {\n const chartInstance =\n chartRef.current.getEchartsInstance() as unknown as EChartsType;\n if (chartInstance) {\n const findNodeInfo = (\n data: TreemapDataNode[],\n targetId: number,\n path: string[] = [],\n ): { name: string; path: string[] } | null => {\n for (const item of data) {\n const itemName =\n typeof item.name === 'string'\n ? item.name\n : String(item.name ?? '');\n const currentPath = [...path, itemName];\n if (item.id === targetId) {\n return { name: itemName, path: currentPath };\n }\n if (item.children) {\n const found = findNodeInfo(\n item.children,\n targetId,\n currentPath,\n );\n if (found) return found;\n }\n }\n return null;\n };\n\n setTimeout(() => {\n const nodeInfo = findNodeInfo(chartDataRef.current, centerNodeId);\n if (!nodeInfo) return;\n const nodeName = nodeInfo.name;\n\n try {\n chartInstance.dispatchAction({\n type: 'highlight',\n seriesIndex: 0,\n name: nodeName,\n });\n } catch (e) {\n console.error('Failed to highlight node with name:', nodeName, e);\n }\n\n const zoomStrategies: Array<() => void> = [\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n targetNodeId: String(centerNodeId),\n }),\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeName,\n }),\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeInfo.path.join('/'),\n }),\n () =>\n nodeInfo.path.length > 0 &&\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeInfo.path[nodeInfo.path.length - 1],\n }),\n ];\n\n for (const strategy of zoomStrategies) {\n try {\n strategy();\n return;\n } catch (e) {\n console.error(\n 'Failed to zoom to node with id:',\n centerNodeId,\n e,\n );\n }\n }\n\n console.warn('Failed to zoom to node with id:', centerNodeId);\n }, 200);\n }\n }\n }, [centerNodeId, option]);\n\n useEffect(() => {\n return () => {\n if (clickTimeoutRef.current) {\n window.clearTimeout(clickTimeoutRef.current);\n }\n };\n }, []);\n\n return option ? (\n <div className={Styles['chart-container']}>\n <Alert\n message=\"If parsed size lacks detailed module information, you can enable sourceMap when RSDOCTOR = true. This is because Rsdoctor relies on SourceMap to obtain Parsed Size. Rspack provides SourceMap information to Rsdoctor by default without affecting the build output.\"\n type=\"info\"\n showIcon\n style={{ marginBottom: 0 }}\n />\n <div\n style={{\n flex: 1,\n }}\n >\n <EChartsReactCore\n ref={chartRef}\n option={option}\n echarts={echarts}\n onEvents={{\n click: (params: ECElementEvent) => {\n // Delay to differentiate from double-click; only zoom on single click\n if (clickTimeoutRef.current) {\n window.clearTimeout(clickTimeoutRef.current);\n }\n clickTimeoutRef.current = window.setTimeout(() => {\n if (chartRef.current) {\n const instance =\n chartRef.current.getEchartsInstance() as unknown as EChartsType;\n const data = params?.data as TreemapDataNode | undefined;\n if (instance && data?.id !== undefined) {\n instance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n targetNodeId: String(data.id),\n });\n }\n }\n }, 180);\n },\n dblclick: (params: ECElementEvent) => {\n // Double click: cancel pending single-click action and trigger analyze\n if (clickTimeoutRef.current) {\n window.clearTimeout(clickTimeoutRef.current);\n clickTimeoutRef.current = null;\n }\n onChartClick?.(params);\n },\n }}\n style={{\n width: '100%',\n height: '100%',\n }}\n />\n </div>\n </div>\n ) : null;\n },\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 const [showOnlyJavaScriptAssets, setShowOnlyJavaScriptAssets] =\n useState(false);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const visibleAssetNames = useMemo(() => {\n if (!showOnlyJavaScriptAssets) {\n return assetNames;\n }\n\n return assetNames.filter(isJavaScriptAsset);\n }, [assetNames, showOnlyJavaScriptAssets]);\n\n const visibleAssetNamesKey = useMemo(\n () => visibleAssetNames.join('\\0'),\n [visibleAssetNames],\n );\n const previousVisibleAssetNamesKeyRef = React.useRef<string | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (previousVisibleAssetNamesKeyRef.current === visibleAssetNamesKey) {\n return;\n }\n\n previousVisibleAssetNamesKeyRef.current = visibleAssetNamesKey;\n setCheckedAssets(visibleAssetNames);\n }, [visibleAssetNames, visibleAssetNamesKey]);\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 = () => {\n if (!containerRef.current) return;\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 const exitFullscreen = () => {\n document\n .exitFullscreen()\n .then(() => setIsFullscreen(false))\n .catch((err) => console.error('Failed to exit fullscreen:', err));\n };\n\n const toggleFullscreen = () => {\n if (isFullscreen) {\n exitFullscreen();\n } else {\n enterFullscreen();\n }\n };\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(\n (item) =>\n visibleAssetNames.includes(item.name) &&\n checkedAssets.includes(item.name),\n );\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, visibleAssetNames]);\n\n const searchResults = useMemo(() => {\n if (!searchQuery.trim()) return [];\n\n const regex = new RegExp(searchQuery, 'i');\n const results: Array<{ path: string; nodeId: number }> = [];\n\n const collectMatchingPaths = (node: TreeNode, chunkPath?: string) => {\n // For chunk level (root of filteredTreeData), use its path/name as chunkPath\n const currentChunkPath = chunkPath || node.path || node.name || '';\n\n if (node.path && regex.test(node.path)) {\n // Use the same nodeId calculation as in convert function\n const nodeIdString = chunkPath\n ? `${chunkPath}::${node.path}`\n : node.path;\n const nodeId = hashString(nodeIdString);\n results.push({ path: node.path, nodeId });\n }\n if (node.children) {\n node.children.forEach((child) =>\n collectMatchingPaths(child, currentChunkPath),\n );\n }\n };\n\n filteredTreeData.forEach((chunk) => collectMatchingPaths(chunk));\n return results;\n }, [filteredTreeData, searchQuery]);\n\n const handleSearchResultClick = (nodeId: number) => {\n setHighlightNodeId(nodeId);\n setCenterNodeId(nodeId);\n };\n\n const removeRootPath = (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\n const getSize = (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 = (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\n const getChunkSize = (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\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 < visibleAssetNames.length\n }\n checked={\n visibleAssetNames.length > 0 &&\n checkedAssets.length === visibleAssetNames.length\n }\n onChange={(e) =>\n setCheckedAssets(e.target.checked ? visibleAssetNames : [])\n }\n className={Styles['all-none-checkbox']}\n >\n All\n </Checkbox>\n <Checkbox\n checked={showOnlyJavaScriptAssets}\n onChange={(e) => {\n setShowOnlyJavaScriptAssets(e.target.checked);\n }}\n className={Styles['all-none-checkbox']}\n >\n JS only\n </Checkbox>\n <div\n className={Styles['chunk-list']}\n style={{ maxHeight: 180, overflowY: 'auto' }}\n >\n {visibleAssetNames\n .filter((name) =>\n name.toLowerCase().includes(chunkSearchQuery.toLowerCase()),\n )\n .map((name) => (\n <div\n key={name}\n className={Styles['chunk-item']}\n style={{ height: 15, lineHeight: '15px' }}\n >\n <Checkbox\n checked={checkedAssets.includes(name)}\n onChange={(e) => {\n if (e.target.checked) {\n setCheckedAssets([...checkedAssets, name]);\n } else {\n setCheckedAssets(\n checkedAssets.filter((a) => a !== name),\n );\n }\n }}\n >\n <span title={name}>{name}</span>\n </Checkbox>\n <span className={Styles['size-tag']}>\n {formatSize(getChunkSize(name, sizeType))}\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 treeData={filteredTreeData}\n sizeType={sizeType}\n onChartClick={handleChartClick}\n highlightNodeId={highlightNodeId}\n centerNodeId={centerNodeId}\n rootPath={rootPath}\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","TreeMap","memo","treeData","sizeType","onChartClick","highlightNodeId","centerNodeId","rootPath","option","setOption","useState","chartRef","React","chartDataRef","clickTimeoutRef","themeToken","useThemeToken","useEffect","convert","node","index","level","parentColor","siblingIndex","siblingCount","chunkPath","baseColor","TREE_COLORS","currentChunkPath","children","c","childIndex","nodeIdString","nodeId","isHighlighted","baseColorRatio","baseBorderRatio","siblingGradientRange","siblingRatio","colorRatio","borderRatio","nodeColor","nodeBorderColor","isDark","textColor","textBorderColor","result","undefined","data","item","pos","_params","_dom","_rect","size","obj","info","path","String","normalizedRoot","normalizedPath","sourceSize","bundledSize","gzipSize","makeRow","label","value","color","Styles","rows","formatSize","chartInstance","findNodeInfo","targetId","itemName","currentPath","found","setTimeout","nodeInfo","nodeName","e","console","zoomStrategies","strategy","window","Alert","EChartsReactCore","params","instance","AssetTreemapWithFilter","ServerAPIProvider","SDK","projectInfo","AssetTreemapWithFilterInner","assetNames","useMemo","checkedAssets","setCheckedAssets","collapsed","setCollapsed","setSizeType","searchQuery","setSearchQuery","isFullscreen","setIsFullscreen","setHighlightNodeId","setCenterNodeId","moduleId","setModuleId","showAnalyze","setShowAnalyze","chunkSearchQuery","setChunkSearchQuery","showOnlyJavaScriptAssets","setShowOnlyJavaScriptAssets","containerRef","visibleAssetNames","isJavaScriptAsset","visibleAssetNamesKey","previousVisibleAssetNamesKeyRef","handleChartClick","useCallback","enterFullscreen","el","err","exitFullscreen","document","toggleFullscreen","handleFullscreenChange","filteredTreeData","filtered","searchLower","searchResults","regex","RegExp","results","collectMatchingPaths","child","chunk","handleSearchResultClick","removeRootPath","filepath","getSize","type","calculateNodeTotalSize","childrenSize","sum","getChunkSize","name","n","sizeTypeToUse","FullscreenExitOutlined","FullscreenOutlined","RightOutlined","LeftOutlined","Radio","Input","SearchOutlined","Checkbox","a","displayPath","modules","ModuleAnalyzeComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components/Charts/TreeMap.mjs","sources":["../../../src/components/Charts/TreeMap.tsx"],"sourcesContent":["import React, { useEffect, useState, memo, useMemo, useCallback } from 'react';\nimport EChartsReactCore from 'echarts-for-react/esm/core';\nimport * as echarts from 'echarts/core';\nimport { TreemapChart, type TreemapSeriesOption } from 'echarts/charts';\nimport {\n TooltipComponent,\n TitleComponent,\n type TooltipComponentOption,\n type TitleComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { Alert, Checkbox, Radio, Input } from 'antd';\nimport {\n LeftOutlined,\n RightOutlined,\n SearchOutlined,\n FullscreenOutlined,\n FullscreenExitOutlined,\n} from '@ant-design/icons';\nimport type { ComposeOption, EChartsType } from 'echarts/core';\nimport { formatSize, useThemeToken } 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 { isJavaScriptAsset } from '../../utils/assets';\nimport type {\n CallbackDataParams,\n ECElementEvent,\n} from 'echarts/types/dist/shared';\nimport {\n calculateTreeNodeTotalSize,\n calculateTreeNodesTotalSize,\n type TreeMapSizeType,\n} from './treeMapSize';\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 = TreeMapSizeType;\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(gapColor: string) {\n return [\n {\n itemStyle: {\n borderWidth: 0,\n gapWidth: 4,\n gapColor,\n },\n },\n {\n itemStyle: {\n borderColorAlpha: [1, 0.3],\n borderWidth: 5,\n gapWidth: 4,\n gapColor,\n },\n upperLabel: {\n show: true,\n color: '#ffffff',\n fontSize: 12,\n height: 30,\n },\n },\n ];\n}\n\nexport const TreeMap: React.FC<TreeMapProps> = memo(\n ({\n treeData,\n sizeType,\n onChartClick,\n highlightNodeId,\n centerNodeId,\n rootPath,\n }) => {\n const [option, setOption] = useState<TreeMapOption | null>(null);\n const chartRef = React.useRef<EChartsReactCore | null>(null);\n const chartDataRef = React.useRef<TreemapDataNode[]>([]);\n const clickTimeoutRef = React.useRef<number | null>(null);\n const themeToken = useThemeToken();\n\n useEffect(() => {\n if (!treeData) return;\n function convert(\n node: TreeNode,\n index = 0,\n level = 0,\n parentColor?: string,\n siblingIndex = 0,\n siblingCount = 1,\n chunkPath?: string,\n ): TreemapDataNode {\n const baseColor =\n parentColor || TREE_COLORS[index % TREE_COLORS.length];\n\n // For level 0 (chunk level), use the chunk's path/name as chunkPath\n const currentChunkPath =\n level === 0 ? node.path || node.name || '' : chunkPath || '';\n\n const children = node.children?.map((c, childIndex) =>\n convert(\n c,\n index,\n level + 1,\n baseColor,\n childIndex,\n node.children?.length || 0,\n currentChunkPath,\n ),\n );\n\n let val = 0;\n if (sizeType === 'stat') val = node.sourceSize || 0;\n else if (sizeType === 'parsed') val = node.bundledSize || 0;\n else if (sizeType === 'gzip') val = node.gzipSize || 0;\n else if (sizeType === 'value') val = node.value || 0;\n\n // Include chunk path in nodeId for non-root nodes to ensure uniqueness across chunks\n const nodeIdString =\n level === 0\n ? node.path || node.name || ''\n : `${currentChunkPath}::${node.path || node.name || ''}`;\n const nodeId = hashString(nodeIdString);\n const isHighlighted = highlightNodeId === nodeId;\n\n const baseColorRatio =\n level === 0 ? 1 : Math.max(0.35, 1 - level * 0.15);\n const baseBorderRatio =\n level === 0 ? 1 : Math.max(0.4, 1 - level * 0.15);\n\n const siblingGradientRange = 0.15;\n const siblingRatio =\n siblingCount > 1\n ? 1 - (siblingIndex / (siblingCount - 1)) * siblingGradientRange\n : 1;\n\n const colorRatio = baseColorRatio * siblingRatio;\n const borderRatio = baseBorderRatio * siblingRatio;\n\n const nodeColor = isHighlighted\n ? '#fff5f5'\n : level === 0\n ? blendWithWhite(baseColor, 0.8)\n : blendWithWhite(baseColor, colorRatio);\n\n const nodeBorderColor = isHighlighted\n ? '#ff4d4f'\n : level === 0\n ? baseColor\n : blendWithWhite(baseColor, borderRatio);\n\n const isDark = isDarkColor(nodeColor);\n const textColor = isDark ? '#ffffff' : '#000000';\n const textBorderColor = isDark\n ? 'rgba(255, 255, 255, 0.2)'\n : 'rgba(0, 0, 0, 0.1)';\n\n const result: TreemapDataNode = {\n id: nodeId,\n name: node.name,\n value: val,\n path: node.path || node.name,\n sourceSize:\n node.sourceSize ?? (sizeType === 'stat' ? val : undefined),\n bundledSize:\n node.bundledSize ?? (sizeType === 'parsed' ? val : undefined),\n gzipSize: node.gzipSize ?? (sizeType === 'gzip' ? val : undefined),\n moduleId: node.id,\n itemStyle: {\n borderWidth: isHighlighted ? 4 : 1,\n color: nodeColor,\n borderColor: nodeBorderColor,\n ...(level === 0 && { gapWidth: 2 }),\n },\n label: {\n show: true,\n color: textColor,\n textBorderColor: textBorderColor,\n textBorderWidth: 1,\n },\n upperLabel:\n level === 0\n ? undefined\n : {\n show: true,\n color: textColor,\n },\n };\n\n if (children && children.length > 0) {\n result.children = children;\n }\n\n if (isHighlighted) {\n result.emphasis = {\n itemStyle: {\n borderColor: '#ff4d4f',\n borderWidth: 4,\n color: '#fff5f5',\n },\n };\n } else {\n // Keep the same color on hover/click to prevent color change\n result.emphasis = {\n itemStyle: {\n color: nodeColor,\n borderColor: nodeBorderColor,\n borderWidth: isHighlighted ? 4 : 1,\n },\n };\n }\n\n return result;\n }\n\n const data = treeData\n .map((item, index) =>\n convert(item, index, 0, undefined, index, treeData.length, undefined),\n )\n .filter(\n (item) =>\n (typeof item.value === 'number' ? item.value > 0 : false) ||\n (item.children && item.children.length > 0),\n );\n\n chartDataRef.current = data;\n\n const textColor = themeToken.colorText;\n setOption({\n color: TREE_COLORS,\n tooltip: {\n padding: 10,\n backgroundColor: themeToken.colorBgElevated,\n borderColor: themeToken.colorBorder,\n borderWidth: 1,\n textStyle: {\n color: textColor,\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 },\n formatter: function (info) {\n const node =\n (info as CallbackDataParams & { data?: TreemapDataNode }).data ||\n {};\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), '#43c6d9'),\n );\n }\n if (bundledSize !== undefined && bundledSize > 0) {\n rows.push(\n makeRow('Parsed size', formatSize(bundledSize), '#5b8ff9'),\n );\n }\n if (gzipSize !== undefined && gzipSize > 0) {\n rows.push(\n makeRow('Gzipped size', formatSize(gzipSize), '#f2b84b'),\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: ${textColor};\">${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 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(themeToken.colorBgContainer),\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 textStyle: {\n fontFamily: 'sans-serif',\n fontSize: 12,\n color: 'white',\n },\n },\n emphasis: {\n itemStyle: {\n color: '#333',\n },\n },\n },\n roam: true,\n nodeClick: false,\n zoomToNodeRatio: 0.7,\n animationDurationUpdate: 500,\n width: '100%',\n height: '100%',\n top: -10,\n bottom: 30,\n left: 0,\n right: 0,\n scaleLimit: {\n min: 0.5,\n max: 5,\n },\n },\n ],\n });\n }, [treeData, sizeType, highlightNodeId, rootPath, themeToken]);\n\n useEffect(() => {\n if (centerNodeId && chartRef.current && option) {\n const chartInstance =\n chartRef.current.getEchartsInstance() as unknown as EChartsType;\n if (chartInstance) {\n const findNodeInfo = (\n data: TreemapDataNode[],\n targetId: number,\n path: string[] = [],\n ): { name: string; path: string[] } | null => {\n for (const item of data) {\n const itemName =\n typeof item.name === 'string'\n ? item.name\n : String(item.name ?? '');\n const currentPath = [...path, itemName];\n if (item.id === targetId) {\n return { name: itemName, path: currentPath };\n }\n if (item.children) {\n const found = findNodeInfo(\n item.children,\n targetId,\n currentPath,\n );\n if (found) return found;\n }\n }\n return null;\n };\n\n setTimeout(() => {\n const nodeInfo = findNodeInfo(chartDataRef.current, centerNodeId);\n if (!nodeInfo) return;\n const nodeName = nodeInfo.name;\n\n try {\n chartInstance.dispatchAction({\n type: 'highlight',\n seriesIndex: 0,\n name: nodeName,\n });\n } catch (e) {\n console.error('Failed to highlight node with name:', nodeName, e);\n }\n\n const zoomStrategies: Array<() => void> = [\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n targetNodeId: String(centerNodeId),\n }),\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeName,\n }),\n () =>\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeInfo.path.join('/'),\n }),\n () =>\n nodeInfo.path.length > 0 &&\n chartInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n name: nodeInfo.path[nodeInfo.path.length - 1],\n }),\n ];\n\n for (const strategy of zoomStrategies) {\n try {\n strategy();\n return;\n } catch (e) {\n console.error(\n 'Failed to zoom to node with id:',\n centerNodeId,\n e,\n );\n }\n }\n\n console.warn('Failed to zoom to node with id:', centerNodeId);\n }, 200);\n }\n }\n }, [centerNodeId, option]);\n\n useEffect(() => {\n return () => {\n if (clickTimeoutRef.current) {\n window.clearTimeout(clickTimeoutRef.current);\n }\n };\n }, []);\n\n return option ? (\n <div className={Styles['chart-container']}>\n <Alert\n message=\"If parsed size lacks detailed module information, you can enable sourceMap when RSDOCTOR = true. This is because Rsdoctor relies on SourceMap to obtain Parsed Size. Rspack provides SourceMap information to Rsdoctor by default without affecting the build output.\"\n type=\"info\"\n showIcon\n style={{ marginBottom: 0 }}\n />\n <div\n style={{\n flex: 1,\n }}\n >\n <EChartsReactCore\n ref={chartRef}\n option={option}\n echarts={echarts}\n onEvents={{\n click: (params: ECElementEvent) => {\n // Delay to differentiate from double-click; only zoom on single click\n if (clickTimeoutRef.current) {\n window.clearTimeout(clickTimeoutRef.current);\n }\n clickTimeoutRef.current = window.setTimeout(() => {\n if (chartRef.current) {\n const instance =\n chartRef.current.getEchartsInstance() as unknown as EChartsType;\n const data = params?.data as TreemapDataNode | undefined;\n if (instance && data?.id !== undefined) {\n instance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesIndex: 0,\n targetNodeId: String(data.id),\n });\n }\n }\n }, 180);\n },\n dblclick: (params: ECElementEvent) => {\n // Double click: cancel pending single-click action and trigger analyze\n if (clickTimeoutRef.current) {\n window.clearTimeout(clickTimeoutRef.current);\n clickTimeoutRef.current = null;\n }\n onChartClick?.(params);\n },\n }}\n style={{\n width: '100%',\n height: '100%',\n }}\n />\n </div>\n </div>\n ) : null;\n },\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 const [showOnlyJavaScriptAssets, setShowOnlyJavaScriptAssets] =\n useState(false);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const visibleAssetNames = useMemo(() => {\n if (!showOnlyJavaScriptAssets) {\n return assetNames;\n }\n\n return assetNames.filter(isJavaScriptAsset);\n }, [assetNames, showOnlyJavaScriptAssets]);\n\n const visibleAssetNamesKey = useMemo(\n () => visibleAssetNames.join('\\0'),\n [visibleAssetNames],\n );\n const previousVisibleAssetNamesKeyRef = React.useRef<string | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (previousVisibleAssetNamesKeyRef.current === visibleAssetNamesKey) {\n return;\n }\n\n previousVisibleAssetNamesKeyRef.current = visibleAssetNamesKey;\n setCheckedAssets(visibleAssetNames);\n }, [visibleAssetNames, visibleAssetNamesKey]);\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 = () => {\n if (!containerRef.current) return;\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 const exitFullscreen = () => {\n document\n .exitFullscreen()\n .then(() => setIsFullscreen(false))\n .catch((err) => console.error('Failed to exit fullscreen:', err));\n };\n\n const toggleFullscreen = () => {\n if (isFullscreen) {\n exitFullscreen();\n } else {\n enterFullscreen();\n }\n };\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(\n (item) =>\n visibleAssetNames.includes(item.name) &&\n checkedAssets.includes(item.name),\n );\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, visibleAssetNames]);\n\n const searchResults = useMemo(() => {\n if (!searchQuery.trim()) return [];\n\n const regex = new RegExp(searchQuery, 'i');\n const results: Array<{ path: string; nodeId: number }> = [];\n\n const collectMatchingPaths = (node: TreeNode, chunkPath?: string) => {\n // For chunk level (root of filteredTreeData), use its path/name as chunkPath\n const currentChunkPath = chunkPath || node.path || node.name || '';\n\n if (node.path && regex.test(node.path)) {\n // Use the same nodeId calculation as in convert function\n const nodeIdString = chunkPath\n ? `${chunkPath}::${node.path}`\n : node.path;\n const nodeId = hashString(nodeIdString);\n results.push({ path: node.path, nodeId });\n }\n if (node.children) {\n node.children.forEach((child) =>\n collectMatchingPaths(child, currentChunkPath),\n );\n }\n };\n\n filteredTreeData.forEach((chunk) => collectMatchingPaths(chunk));\n return results;\n }, [filteredTreeData, searchQuery]);\n\n const handleSearchResultClick = (nodeId: number) => {\n setHighlightNodeId(nodeId);\n setCenterNodeId(nodeId);\n };\n\n const removeRootPath = (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\n const getChunkSize = (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 calculateTreeNodeTotalSize(node, sizeTypeToUse);\n };\n\n const allAssetsSize = useMemo(\n () => calculateTreeNodesTotalSize(filteredTreeData, sizeType),\n [filteredTreeData, sizeType],\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 <div className={Styles['chunk-item']}>\n <Checkbox\n indeterminate={\n checkedAssets.length > 0 &&\n checkedAssets.length < visibleAssetNames.length\n }\n checked={\n visibleAssetNames.length > 0 &&\n checkedAssets.length === visibleAssetNames.length\n }\n onChange={(e) =>\n setCheckedAssets(e.target.checked ? visibleAssetNames : [])\n }\n className={Styles['all-none-checkbox']}\n >\n All\n </Checkbox>\n <span className={Styles['size-tag']}>\n {formatSize(allAssetsSize)}\n </span>\n </div>\n <Checkbox\n checked={showOnlyJavaScriptAssets}\n onChange={(e) => {\n setShowOnlyJavaScriptAssets(e.target.checked);\n }}\n className={Styles['all-none-checkbox']}\n >\n JS only\n </Checkbox>\n <div\n className={Styles['chunk-list']}\n style={{ maxHeight: 180, overflowY: 'auto' }}\n >\n {visibleAssetNames\n .filter((name) =>\n name.toLowerCase().includes(chunkSearchQuery.toLowerCase()),\n )\n .map((name) => (\n <div\n key={name}\n className={Styles['chunk-item']}\n style={{ height: 15, lineHeight: '15px' }}\n >\n <Checkbox\n checked={checkedAssets.includes(name)}\n onChange={(e) => {\n if (e.target.checked) {\n setCheckedAssets([...checkedAssets, name]);\n } else {\n setCheckedAssets(\n checkedAssets.filter((a) => a !== name),\n );\n }\n }}\n >\n <span title={name}>{name}</span>\n </Checkbox>\n <span className={Styles['size-tag']}>\n {formatSize(getChunkSize(name, sizeType))}\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 treeData={filteredTreeData}\n sizeType={sizeType}\n onChartClick={handleChartClick}\n highlightNodeId={highlightNodeId}\n centerNodeId={centerNodeId}\n rootPath={rootPath}\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","gapColor","TreeMap","memo","treeData","sizeType","onChartClick","highlightNodeId","centerNodeId","rootPath","option","setOption","useState","chartRef","React","chartDataRef","clickTimeoutRef","themeToken","useThemeToken","useEffect","convert","node","index","level","parentColor","siblingIndex","siblingCount","chunkPath","baseColor","TREE_COLORS","currentChunkPath","children","c","childIndex","nodeIdString","nodeId","isHighlighted","baseColorRatio","baseBorderRatio","siblingGradientRange","siblingRatio","colorRatio","borderRatio","nodeColor","nodeBorderColor","isDark","textColor","textBorderColor","result","undefined","data","item","pos","_params","_dom","_rect","size","obj","info","path","String","normalizedRoot","normalizedPath","sourceSize","bundledSize","gzipSize","makeRow","label","value","color","Styles","rows","formatSize","chartInstance","findNodeInfo","targetId","itemName","currentPath","found","setTimeout","nodeInfo","nodeName","e","console","zoomStrategies","strategy","window","Alert","EChartsReactCore","params","instance","AssetTreemapWithFilter","ServerAPIProvider","SDK","projectInfo","AssetTreemapWithFilterInner","assetNames","useMemo","checkedAssets","setCheckedAssets","collapsed","setCollapsed","setSizeType","searchQuery","setSearchQuery","isFullscreen","setIsFullscreen","setHighlightNodeId","setCenterNodeId","moduleId","setModuleId","showAnalyze","setShowAnalyze","chunkSearchQuery","setChunkSearchQuery","showOnlyJavaScriptAssets","setShowOnlyJavaScriptAssets","containerRef","visibleAssetNames","isJavaScriptAsset","visibleAssetNamesKey","previousVisibleAssetNamesKeyRef","handleChartClick","useCallback","enterFullscreen","el","err","exitFullscreen","document","toggleFullscreen","handleFullscreenChange","filteredTreeData","filtered","searchLower","searchResults","regex","RegExp","results","collectMatchingPaths","child","chunk","handleSearchResultClick","removeRootPath","filepath","getChunkSize","name","type","n","sizeTypeToUse","calculateTreeNodeTotalSize","allAssetsSize","calculateTreeNodesTotalSize","FullscreenExitOutlined","FullscreenOutlined","RightOutlined","LeftOutlined","Radio","Input","SearchOutlined","Checkbox","a","displayPath","modules","ModuleAnalyzeComponent"],"mappings":"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"}
|
|
@@ -27,6 +27,16 @@ const PALETTE_COLORS = [
|
|
|
27
27
|
'#9F40FF',
|
|
28
28
|
'#528BFF'
|
|
29
29
|
];
|
|
30
|
+
const TIMELINE_PALETTE_COLORS = [
|
|
31
|
+
'#5B8FF9',
|
|
32
|
+
'#43C6D9',
|
|
33
|
+
'#A78BFA',
|
|
34
|
+
'#F2B84B',
|
|
35
|
+
'#F27D62',
|
|
36
|
+
'#5CCB8A',
|
|
37
|
+
'#7C9CF5',
|
|
38
|
+
'#D879B9'
|
|
39
|
+
];
|
|
30
40
|
var constants_ChartTypes = /*#__PURE__*/ function(ChartTypes) {
|
|
31
41
|
ChartTypes[ChartTypes["Bootstrap"] = 0] = "Bootstrap";
|
|
32
42
|
ChartTypes[ChartTypes["Compile"] = 1] = "Compile";
|
|
@@ -47,6 +57,6 @@ const TREE_COLORS = [
|
|
|
47
57
|
'#749f83',
|
|
48
58
|
'#6e7074'
|
|
49
59
|
];
|
|
50
|
-
export { PALETTE_COLORS, TREE_COLORS, constants_ChartTypes as ChartTypes };
|
|
60
|
+
export { PALETTE_COLORS, TIMELINE_PALETTE_COLORS, TREE_COLORS, constants_ChartTypes as ChartTypes };
|
|
51
61
|
|
|
52
62
|
//# sourceMappingURL=constants.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/Charts/constants.mjs","sources":["../../../src/components/Charts/constants.ts"],"sourcesContent":["export const PALETTE_COLORS = [\n '#F2793D',\n '#F28B24',\n '#F2A200',\n '#F5CC00',\n '#F5E000',\n '#A3D900',\n '#66CC00',\n '#0AC419',\n '#0AC496',\n '#0AC7D1',\n '#00A8E0',\n '#1471F5',\n '#4060FF',\n '#7559FF',\n '#884DFF',\n '#A526FF',\n '#BA39E5',\n '#C700D9',\n '#D900B5',\n '#E50099',\n '#E52E6B',\n '#F24957',\n '#30B2F2',\n '#00BF70',\n '#5959FF',\n '#9F40FF',\n '#528BFF',\n];\n\nexport enum ChartTypes {\n Bootstrap,\n Compile,\n Done,\n Minify,\n Loader,\n Normal,\n}\n\nexport const TREE_COLORS = [\n '#bda29a',\n '#6F3FE1',\n '#3966ed',\n '#0a5f74',\n '#3EBD7C',\n '#F7A925',\n '#ca8622',\n '#749f83',\n '#6e7074',\n];\n"],"names":["PALETTE_COLORS","ChartTypes","TREE_COLORS"],"mappings":"AAAO,MAAMA,iBAAiB;IAC5B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAEM,IAAKC,uBAAUA,WAAAA,GAAAA,SAAVA,UAAU;;;;;;;WAAVA;;AASL,MAAMC,cAAc;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD"}
|
|
1
|
+
{"version":3,"file":"components/Charts/constants.mjs","sources":["../../../src/components/Charts/constants.ts"],"sourcesContent":["export const PALETTE_COLORS = [\n '#F2793D',\n '#F28B24',\n '#F2A200',\n '#F5CC00',\n '#F5E000',\n '#A3D900',\n '#66CC00',\n '#0AC419',\n '#0AC496',\n '#0AC7D1',\n '#00A8E0',\n '#1471F5',\n '#4060FF',\n '#7559FF',\n '#884DFF',\n '#A526FF',\n '#BA39E5',\n '#C700D9',\n '#D900B5',\n '#E50099',\n '#E52E6B',\n '#F24957',\n '#30B2F2',\n '#00BF70',\n '#5959FF',\n '#9F40FF',\n '#528BFF',\n];\n\nexport const TIMELINE_PALETTE_COLORS = [\n '#5B8FF9',\n '#43C6D9',\n '#A78BFA',\n '#F2B84B',\n '#F27D62',\n '#5CCB8A',\n '#7C9CF5',\n '#D879B9',\n];\n\nexport enum ChartTypes {\n Bootstrap,\n Compile,\n Done,\n Minify,\n Loader,\n Normal,\n}\n\nexport const TREE_COLORS = [\n '#bda29a',\n '#6F3FE1',\n '#3966ed',\n '#0a5f74',\n '#3EBD7C',\n '#F7A925',\n '#ca8622',\n '#749f83',\n '#6e7074',\n];\n"],"names":["PALETTE_COLORS","TIMELINE_PALETTE_COLORS","ChartTypes","TREE_COLORS"],"mappings":"AAAO,MAAMA,iBAAiB;IAC5B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAEM,MAAMC,0BAA0B;IACrC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAEM,IAAKC,uBAAUA,WAAAA,GAAAA,SAAVA,UAAU;;;;;;;WAAVA;;AASL,MAAMC,cAAc;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://./src/components/Charts/loader.scss"],"names":[],"mappings":"AAAA;EACE,eAAe;EACf,gBAAgB;EAChB,qDAAqD;AACvD;;AAJ+H;EAO7H,qDAAqD;AACvD;;AAR8N;EAW5N,oDAAoD;AACtD;;AAZ0T;EAexT,0BAA0B;AAC5B;;AAhBuX;EAmBrX,gBAAgB;EAChB,yBAAyB;EACzB,0BAA0B;AAC5B;;AAtB8e;EAyB5e,aAAa;AACf;;AA1BirB;EA6B/qB,
|
|
1
|
+
{"version":3,"sources":["webpack://./src/components/Charts/loader.scss"],"names":[],"mappings":"AAAA;EACE,eAAe;EACf,gBAAgB;EAChB,qDAAqD;AACvD;;AAJ+H;EAO7H,qDAAqD;AACvD;;AAR8N;EAW5N,oDAAoD;AACtD;;AAZ0T;EAexT,0BAA0B;AAC5B;;AAhBuX;EAmBrX,gBAAgB;EAChB,yBAAyB;EACzB,0BAA0B;AAC5B;;AAtB8e;EAyB5e,aAAa;AACf;;AA1BirB;EA6B/qB,kCAAkC;AACpC","sourcesContent":[".loader-chart-container .x-axis .tick text{transform:translate(28px, 10px) rotate(0) !important;font-size:12px;font-weight:500}.loader-chart-container:nth-child(2) text{transform:translate(52px, 10px) rotate(0) !important}.loader-chart-container:last-child text{transform:translate(5px, 10px) rotate(0) !important}.loader-chart-container .area .civ{transform:translateY(5px)}.loader-chart-container .area .civ .label-text{font-weight:500;font-size:12px !important;transform:translate(8px, 0px)}.loader-chart-container .area .civ path[fill=\"#000000\"]{display:none}.loader-chart-container .pia-metrics-y-label{display:none}.loader-chart-container .pia-metrics-y-label .triangle{display:none}.loader-chart-container_dark .area .civ .label-text{fill:var(--text-color) !important}"],"sourceRoot":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type TreeMapSizeType = 'stat' | 'parsed' | 'gzip' | 'value';
|
|
2
|
+
export interface TreeMapSizeNode {
|
|
3
|
+
value?: number;
|
|
4
|
+
children?: TreeMapSizeNode[];
|
|
5
|
+
sourceSize?: number;
|
|
6
|
+
bundledSize?: number;
|
|
7
|
+
gzipSize?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function calculateTreeNodeTotalSize(node: TreeMapSizeNode, sizeType: TreeMapSizeType): number;
|
|
10
|
+
export declare function calculateTreeNodesTotalSize(nodes: TreeMapSizeNode[], sizeType: TreeMapSizeType): number;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function getOwnSize(node, sizeType) {
|
|
2
|
+
if ('stat' === sizeType) return node.sourceSize ?? 0;
|
|
3
|
+
if ('parsed' === sizeType) return node.bundledSize ?? 0;
|
|
4
|
+
if ('gzip' === sizeType) return node.gzipSize ?? 0;
|
|
5
|
+
return node.value ?? 0;
|
|
6
|
+
}
|
|
7
|
+
function calculateTreeNodeTotalSize(node, sizeType) {
|
|
8
|
+
const ownSize = getOwnSize(node, sizeType);
|
|
9
|
+
if (ownSize > 0 || !node.children?.length) return ownSize;
|
|
10
|
+
return node.children.reduce((total, child)=>total + calculateTreeNodeTotalSize(child, sizeType), 0);
|
|
11
|
+
}
|
|
12
|
+
function calculateTreeNodesTotalSize(nodes, sizeType) {
|
|
13
|
+
return nodes.reduce((total, node)=>total + calculateTreeNodeTotalSize(node, sizeType), 0);
|
|
14
|
+
}
|
|
15
|
+
export { calculateTreeNodeTotalSize, calculateTreeNodesTotalSize };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=treeMapSize.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components/Charts/treeMapSize.mjs","sources":["../../../src/components/Charts/treeMapSize.ts"],"sourcesContent":["export type TreeMapSizeType = 'stat' | 'parsed' | 'gzip' | 'value';\n\nexport interface TreeMapSizeNode {\n value?: number;\n children?: TreeMapSizeNode[];\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n}\n\nfunction getOwnSize(node: TreeMapSizeNode, sizeType: TreeMapSizeType) {\n if (sizeType === 'stat') return node.sourceSize ?? 0;\n if (sizeType === 'parsed') return node.bundledSize ?? 0;\n if (sizeType === 'gzip') return node.gzipSize ?? 0;\n return node.value ?? 0;\n}\n\nexport function calculateTreeNodeTotalSize(\n node: TreeMapSizeNode,\n sizeType: TreeMapSizeType,\n): number {\n const ownSize = getOwnSize(node, sizeType);\n if (ownSize > 0 || !node.children?.length) {\n return ownSize;\n }\n\n return node.children.reduce(\n (total, child) => total + calculateTreeNodeTotalSize(child, sizeType),\n 0,\n );\n}\n\nexport function calculateTreeNodesTotalSize(\n nodes: TreeMapSizeNode[],\n sizeType: TreeMapSizeType,\n): number {\n return nodes.reduce(\n (total, node) => total + calculateTreeNodeTotalSize(node, sizeType),\n 0,\n );\n}\n"],"names":["getOwnSize","node","sizeType","calculateTreeNodeTotalSize","ownSize","total","child","calculateTreeNodesTotalSize","nodes"],"mappings":"AAUA,SAASA,WAAWC,IAAqB,EAAEC,QAAyB;IAClE,IAAIA,AAAa,WAAbA,UAAqB,OAAOD,KAAK,UAAU,IAAI;IACnD,IAAIC,AAAa,aAAbA,UAAuB,OAAOD,KAAK,WAAW,IAAI;IACtD,IAAIC,AAAa,WAAbA,UAAqB,OAAOD,KAAK,QAAQ,IAAI;IACjD,OAAOA,KAAK,KAAK,IAAI;AACvB;AAEO,SAASE,2BACdF,IAAqB,EACrBC,QAAyB;IAEzB,MAAME,UAAUJ,WAAWC,MAAMC;IACjC,IAAIE,UAAU,KAAK,CAACH,KAAK,QAAQ,EAAE,QACjC,OAAOG;IAGT,OAAOH,KAAK,QAAQ,CAAC,MAAM,CACzB,CAACI,OAAOC,QAAUD,QAAQF,2BAA2BG,OAAOJ,WAC5D;AAEJ;AAEO,SAASK,4BACdC,KAAwB,EACxBN,QAAyB;IAEzB,OAAOM,MAAM,MAAM,CACjB,CAACH,OAAOJ,OAASI,QAAQF,2BAA2BF,MAAMC,WAC1D;AAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|