@rsdoctor/components 1.1.4 → 1.1.5

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.
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ export type TreeNode = {
3
+ name: string;
4
+ value?: number;
5
+ children?: TreeNode[];
6
+ path?: string;
7
+ sourceSize?: number;
8
+ bundledSize?: number;
9
+ };
10
+ interface TreeMapProps {
11
+ treeData: TreeNode[];
12
+ valueKey?: 'sourceSize' | 'bundledSize';
13
+ style?: React.CSSProperties;
14
+ onChartClick?: (params: any) => void;
15
+ }
16
+ export declare const TreeMap: React.ForwardRefExoticComponent<TreeMapProps & React.RefAttributes<any>>;
17
+ export declare const AssetTreemapWithFilter: React.FC<{
18
+ treeData: TreeNode[];
19
+ onChartClick?: (params: any) => void;
20
+ }>;
21
+ export {};
@@ -0,0 +1,284 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import React, { useEffect, useState, memo, useMemo } from "react";
3
+ import ReactEChartsCore from "echarts-for-react/lib/core";
4
+ import * as echarts from "echarts/core";
5
+ import { TreemapChart } from "echarts/charts";
6
+ import { TooltipComponent } from "echarts/components";
7
+ import { CanvasRenderer } from "echarts/renderers";
8
+ import { BUNDLE_ANALYZER_COLORS, COLOR_GROUPS } from "./constants";
9
+ import { Checkbox, Card, Typography, Space } from "antd";
10
+ import {
11
+ VerticalAlignBottomOutlined,
12
+ VerticalAlignTopOutlined
13
+ } from "@ant-design/icons";
14
+ import { formatSize, useI18n } from "../../utils";
15
+ import { SearchModal } from "../../pages/BundleSize/components/search-modal";
16
+ function hashString(str) {
17
+ let hash = 5381;
18
+ for (let i = 0; i < str.length; i++) {
19
+ hash = (hash << 5) + hash + str.charCodeAt(i);
20
+ }
21
+ return hash >>> 0;
22
+ }
23
+ function getLevelOption() {
24
+ return [
25
+ {
26
+ itemStyle: {
27
+ color: "white",
28
+ borderColor: "#eee",
29
+ borderWidth: 5,
30
+ gapWidth: 5
31
+ },
32
+ emphasis: {
33
+ itemStyle: {
34
+ borderColor: "#a29f9f"
35
+ }
36
+ }
37
+ },
38
+ {
39
+ colorSaturation: [0.25, 0.5],
40
+ itemStyle: {
41
+ borderWidth: 5,
42
+ gapWidth: 5,
43
+ borderColorSaturation: 0.5,
44
+ borderColor: "#eee"
45
+ }
46
+ }
47
+ ];
48
+ }
49
+ const TreeMapInner = memo(
50
+ ({
51
+ treeData,
52
+ valueKey = "sourceSize",
53
+ style,
54
+ onChartClick,
55
+ forwardedRef
56
+ }) => {
57
+ const [option, setOption] = useState(null);
58
+ const chartRef = React.useRef(null);
59
+ useEffect(() => {
60
+ if (forwardedRef && chartRef.current) {
61
+ if (typeof forwardedRef === "function") {
62
+ forwardedRef(chartRef.current);
63
+ } else {
64
+ forwardedRef.current = chartRef.current;
65
+ }
66
+ }
67
+ }, [forwardedRef, chartRef.current]);
68
+ useEffect(() => {
69
+ echarts.use([TreemapChart, TooltipComponent, CanvasRenderer]);
70
+ }, []);
71
+ useEffect(() => {
72
+ if (!treeData)
73
+ return;
74
+ function convert(node, colorGroup, level = 0) {
75
+ const groupColors = BUNDLE_ANALYZER_COLORS[colorGroup];
76
+ const children = node.children?.map(
77
+ (c, _i) => convert(c, colorGroup, level + 1)
78
+ );
79
+ return {
80
+ id: node.path ? hashString(node.path) : void 0,
81
+ name: node.name,
82
+ value: node[valueKey] ?? node.value ?? 0,
83
+ path: node.path,
84
+ sourceSize: node.sourceSize ?? node.value,
85
+ bundledSize: node.bundledSize,
86
+ children: children && children.length > 0 ? children : void 0,
87
+ itemStyle: {
88
+ borderWidth: 2,
89
+ gapWidth: 2,
90
+ borderColorSaturation: 0.2,
91
+ colorSaturation: 0.2,
92
+ color: groupColors[level % groupColors.length],
93
+ borderColor: groupColors[level % groupColors.length]
94
+ },
95
+ level
96
+ };
97
+ }
98
+ const data = treeData.map((item, index) => {
99
+ const group = COLOR_GROUPS[index % COLOR_GROUPS.length];
100
+ return convert(item, group, 0);
101
+ });
102
+ setOption({
103
+ title: {
104
+ text: "Bundle Tree Map",
105
+ left: "center"
106
+ },
107
+ tooltip: {
108
+ position: "top",
109
+ formatter: function(info) {
110
+ var treePathInfo = info.treePathInfo;
111
+ var treePath = [];
112
+ for (var i = 1; i < treePathInfo.length; i++) {
113
+ treePath.push(treePathInfo[i].name);
114
+ }
115
+ var node = info.data || {};
116
+ var path = node.path || treePath.join("/");
117
+ var sourceSize = node.sourceSize;
118
+ var bundledSize = node.bundledSize;
119
+ return [
120
+ '<div class="tooltip-title">' + echarts.format.encodeHTML(path) + "</div>",
121
+ "<div><b>Source Size:</b> <b>" + (sourceSize !== void 0 ? formatSize(sourceSize) : "-") + "</b></div>",
122
+ "<div><b>Bundled Size:</b> <b>" + (bundledSize !== void 0 ? formatSize(bundledSize) : "-") + "</b></div>"
123
+ ].join("");
124
+ }
125
+ },
126
+ series: [
127
+ {
128
+ name: "Bundle Tree Map",
129
+ id: "bundle-treemap",
130
+ type: "treemap",
131
+ visibleMin: 300,
132
+ left: 10,
133
+ right: 10,
134
+ top: 10,
135
+ bottom: 10,
136
+ label: {
137
+ show: true,
138
+ formatter: "{b}",
139
+ color: "#000"
140
+ },
141
+ upperLabel: {
142
+ show: true,
143
+ height: 30
144
+ },
145
+ levels: getLevelOption(),
146
+ data
147
+ }
148
+ ]
149
+ });
150
+ }, [treeData, valueKey]);
151
+ return option ? /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
152
+ ReactEChartsCore,
153
+ {
154
+ ref: chartRef,
155
+ option,
156
+ echarts,
157
+ onEvents: onChartClick ? { click: onChartClick } : void 0,
158
+ style: {
159
+ width: "100%",
160
+ minHeight: "500px",
161
+ maxHeight: "1000px",
162
+ border: "5px solid white",
163
+ borderRadius: "10px",
164
+ ...style
165
+ }
166
+ }
167
+ ) }) : null;
168
+ }
169
+ );
170
+ const TreeMap = React.forwardRef((props, ref) => /* @__PURE__ */ jsx(TreeMapInner, { ...props, forwardedRef: ref }));
171
+ const AssetTreemapWithFilter = ({ treeData, onChartClick }) => {
172
+ const assetNames = useMemo(
173
+ () => treeData.map((item) => item.name),
174
+ [treeData]
175
+ );
176
+ const [checkedAssets, setCheckedAssets] = useState(assetNames);
177
+ const [collapsed, setCollapsed] = useState(false);
178
+ const [searchModalOpen, setSearchModalOpen] = useState(false);
179
+ const chartRef = React.useRef(null);
180
+ const { t } = useI18n();
181
+ const filteredTreeData = useMemo(
182
+ () => treeData.filter((item) => checkedAssets.includes(item.name)),
183
+ [treeData, checkedAssets]
184
+ );
185
+ const handleModuleClick = (module) => {
186
+ if (!module?.path)
187
+ return;
188
+ const nodeId = hashString(module.path);
189
+ if (chartRef.current) {
190
+ const echartsInstance = chartRef.current.getEchartsInstance();
191
+ echartsInstance.dispatchAction({
192
+ type: "treemapZoomToNode",
193
+ seriesId: "bundle-treemap",
194
+ targetNodeId: nodeId.toString()
195
+ });
196
+ echartsInstance.dispatchAction({
197
+ type: "highlight",
198
+ seriesId: "bundle-treemap",
199
+ targetNodeId: nodeId.toString()
200
+ });
201
+ }
202
+ setSearchModalOpen(false);
203
+ };
204
+ return /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: 16 }, children: /* @__PURE__ */ jsxs(Space, { direction: "vertical", style: { width: "100%" }, children: [
205
+ /* @__PURE__ */ jsx(
206
+ Card,
207
+ {
208
+ title: /* @__PURE__ */ jsxs(Space, { children: [
209
+ /* @__PURE__ */ jsx(Typography.Text, { children: t("Output Assets List") }),
210
+ /* @__PURE__ */ jsx(
211
+ SearchModal,
212
+ {
213
+ onModuleClick: handleModuleClick,
214
+ open: searchModalOpen,
215
+ setOpen: setSearchModalOpen,
216
+ isIcon: true
217
+ }
218
+ )
219
+ ] }),
220
+ extra: /* @__PURE__ */ jsx(
221
+ "span",
222
+ {
223
+ style: { cursor: "pointer", marginLeft: 8 },
224
+ onClick: () => setCollapsed((c) => !c),
225
+ "aria-label": collapsed ? t("Expand") : t("Collapse"),
226
+ children: collapsed ? /* @__PURE__ */ jsx(VerticalAlignBottomOutlined, {}) : /* @__PURE__ */ jsx(VerticalAlignTopOutlined, {})
227
+ }
228
+ ),
229
+ size: "small",
230
+ bodyStyle: {
231
+ overflow: "hidden",
232
+ height: collapsed ? 0 : void 0,
233
+ padding: collapsed ? 0 : void 0,
234
+ transition: "height 0.3s cubic-bezier(.4,0,.2,1), padding 0.3s"
235
+ },
236
+ children: /* @__PURE__ */ jsxs(
237
+ "div",
238
+ {
239
+ style: {
240
+ opacity: collapsed ? 0 : 1,
241
+ transition: "opacity 0.3s",
242
+ gap: 8
243
+ },
244
+ children: [
245
+ /* @__PURE__ */ jsx(
246
+ Checkbox,
247
+ {
248
+ indeterminate: checkedAssets.length > 0 && checkedAssets.length < assetNames.length,
249
+ checked: checkedAssets.length === assetNames.length,
250
+ onChange: (e) => setCheckedAssets(e.target.checked ? assetNames : []),
251
+ style: { marginBottom: 4 },
252
+ children: "ALL / NONE"
253
+ }
254
+ ),
255
+ /* @__PURE__ */ jsx(
256
+ Checkbox.Group,
257
+ {
258
+ options: assetNames,
259
+ value: checkedAssets,
260
+ onChange: setCheckedAssets,
261
+ style: { display: "flex", gap: 8, fontWeight: 500 }
262
+ }
263
+ )
264
+ ]
265
+ }
266
+ )
267
+ }
268
+ ),
269
+ /* @__PURE__ */ jsx("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsx(
270
+ TreeMap,
271
+ {
272
+ ref: chartRef,
273
+ treeData: filteredTreeData,
274
+ onChartClick
275
+ }
276
+ ) })
277
+ ] }) });
278
+ };
279
+ export {
280
+ AssetTreemapWithFilter,
281
+ TreeMap
282
+ };
283
+
284
+ //# sourceMappingURL=TreeMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../src/components/Charts/TreeMap.tsx"],"sourcesContent":["import React, { useEffect, useState, memo, useMemo } from 'react';\nimport ReactEChartsCore from 'echarts-for-react/lib/core';\nimport * as echarts from 'echarts/core';\nimport { TreemapChart } from 'echarts/charts';\nimport { TooltipComponent } from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { BUNDLE_ANALYZER_COLORS, COLOR_GROUPS } from './constants';\nimport { Checkbox, Card, Typography, Space } from 'antd';\nimport {\n VerticalAlignBottomOutlined,\n VerticalAlignTopOutlined,\n} from '@ant-design/icons';\nimport { formatSize, useI18n } from '../../utils';\nimport { SearchModal } from '../../pages/BundleSize/components/search-modal';\n\n// TreeNode type should match the output of flattenTreemapData\nexport type TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n};\n\ninterface TreeMapProps {\n treeData: TreeNode[];\n valueKey?: 'sourceSize' | 'bundledSize'; // which value to show as area\n style?: React.CSSProperties;\n onChartClick?: (params: any) => void;\n}\n\n// Simple hash function for string (djb2)\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); /* hash * 33 + c */\n }\n return hash >>> 0; // Ensure unsigned\n}\n\nfunction getLevelOption() {\n return [\n {\n itemStyle: {\n color: 'white',\n borderColor: '#eee',\n borderWidth: 5,\n gapWidth: 5,\n },\n emphasis: {\n itemStyle: {\n borderColor: '#a29f9f',\n },\n },\n },\n {\n colorSaturation: [0.25, 0.5],\n itemStyle: {\n borderWidth: 5,\n gapWidth: 5,\n borderColorSaturation: 0.5,\n borderColor: '#eee',\n },\n },\n ];\n}\n\nconst TreeMapInner: React.FC<TreeMapProps & { forwardedRef?: React.Ref<any> }> =\n memo(\n ({\n treeData,\n valueKey = 'sourceSize',\n style,\n onChartClick,\n forwardedRef,\n }) => {\n const [option, setOption] = useState<any>(null);\n const chartRef = React.useRef<any>(null);\n\n // Expose chartRef to parent if forwardedRef is provided\n useEffect(() => {\n if (forwardedRef && chartRef.current) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(chartRef.current);\n } else {\n (forwardedRef as React.MutableRefObject<any>).current =\n chartRef.current;\n }\n }\n }, [forwardedRef, chartRef.current]);\n\n // Register ECharts components\n useEffect(() => {\n echarts.use([TreemapChart, TooltipComponent, CanvasRenderer]);\n }, []);\n\n useEffect(() => {\n if (!treeData) return;\n // Helper to recursively add value field for ECharts\n function convert(\n node: TreeNode,\n colorGroup: keyof typeof BUNDLE_ANALYZER_COLORS,\n level = 0,\n ): any {\n const groupColors = BUNDLE_ANALYZER_COLORS[colorGroup];\n const children = node.children?.map((c, _i) =>\n convert(c, colorGroup, level + 1),\n );\n\n return {\n id: node.path ? hashString(node.path) : undefined,\n name: node.name,\n value: node[valueKey] ?? node.value ?? 0,\n path: node.path,\n sourceSize: node.sourceSize ?? node.value,\n bundledSize: node.bundledSize,\n children: children && children.length > 0 ? children : undefined,\n itemStyle: {\n borderWidth: 2,\n gapWidth: 2,\n borderColorSaturation: 0.2,\n colorSaturation: 0.2,\n color: groupColors[level % groupColors.length],\n borderColor: groupColors[level % groupColors.length],\n },\n level,\n };\n }\n const data = treeData.map((item, index) => {\n const group = COLOR_GROUPS[index % COLOR_GROUPS.length];\n return convert(item, group, 0);\n });\n\n setOption({\n title: {\n text: 'Bundle Tree Map',\n left: 'center',\n },\n tooltip: {\n position: 'top',\n formatter: function (info: any) {\n var treePathInfo = info.treePathInfo;\n var treePath = [];\n for (var i = 1; i < treePathInfo.length; i++) {\n treePath.push(treePathInfo[i].name);\n }\n // Get extra info from node data\n var node = info.data || {};\n var path = node.path || treePath.join('/');\n var sourceSize = node.sourceSize;\n var bundledSize = node.bundledSize;\n return [\n '<div class=\"tooltip-title\">' +\n echarts.format.encodeHTML(path) +\n '</div>',\n '<div><b>Source Size:</b> <b>' +\n (sourceSize !== undefined ? formatSize(sourceSize) : '-') +\n '</b></div>',\n '<div><b>Bundled Size:</b> <b>' +\n (bundledSize !== undefined ? formatSize(bundledSize) : '-') +\n '</b></div>',\n ].join('');\n },\n },\n series: [\n {\n name: 'Bundle Tree Map',\n id: 'bundle-treemap',\n type: 'treemap',\n visibleMin: 300,\n left: 10,\n right: 10,\n top: 10,\n bottom: 10,\n label: {\n show: true,\n formatter: '{b}',\n color: '#000',\n },\n upperLabel: {\n show: true,\n height: 30,\n },\n\n levels: getLevelOption(),\n data: data,\n },\n ],\n });\n }, [treeData, valueKey]);\n\n return option ? (\n <div>\n <ReactEChartsCore\n ref={chartRef}\n option={option}\n echarts={echarts}\n onEvents={onChartClick ? { click: onChartClick } : undefined}\n style={{\n width: '100%',\n minHeight: '500px',\n maxHeight: '1000px',\n border: '5px solid white',\n borderRadius: '10px',\n ...style,\n }}\n />\n </div>\n ) : null;\n },\n );\n\nexport const TreeMap = React.forwardRef<any, TreeMapProps>((props, ref) => (\n <TreeMapInner {...props} forwardedRef={ref} />\n));\n\nexport const AssetTreemapWithFilter: React.FC<{\n treeData: TreeNode[];\n onChartClick?: (params: any) => void;\n}> = ({ treeData, onChartClick }) => {\n const assetNames = useMemo(\n () => treeData.map((item) => item.name),\n [treeData],\n );\n const [checkedAssets, setCheckedAssets] = useState<string[]>(assetNames);\n const [collapsed, setCollapsed] = useState(false);\n const [searchModalOpen, setSearchModalOpen] = useState(false);\n const chartRef = React.useRef<any>(null);\n const { t } = useI18n();\n\n const filteredTreeData = useMemo(\n () => treeData.filter((item) => checkedAssets.includes(item.name)),\n [treeData, checkedAssets],\n );\n\n // Handler for search modal click\n const handleModuleClick = (module: any) => {\n if (!module?.path) return;\n const nodeId = hashString(module.path);\n if (chartRef.current) {\n const echartsInstance = chartRef.current.getEchartsInstance();\n echartsInstance.dispatchAction({\n type: 'treemapZoomToNode',\n seriesId: 'bundle-treemap',\n targetNodeId: nodeId.toString(),\n });\n echartsInstance.dispatchAction({\n type: 'highlight',\n seriesId: 'bundle-treemap',\n targetNodeId: nodeId.toString(),\n });\n }\n setSearchModalOpen(false);\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n <Card\n title={\n <Space>\n <Typography.Text>{t('Output Assets List')}</Typography.Text>\n <SearchModal\n onModuleClick={handleModuleClick}\n open={searchModalOpen}\n setOpen={setSearchModalOpen}\n isIcon={true}\n />\n </Space>\n }\n extra={\n <span\n style={{ cursor: 'pointer', marginLeft: 8 }}\n onClick={() => setCollapsed((c) => !c)}\n aria-label={collapsed ? t('Expand') : t('Collapse')}\n >\n {collapsed ? (\n <VerticalAlignBottomOutlined />\n ) : (\n <VerticalAlignTopOutlined />\n )}\n </span>\n }\n size=\"small\"\n bodyStyle={{\n overflow: 'hidden',\n height: collapsed ? 0 : undefined,\n padding: collapsed ? 0 : undefined,\n transition: 'height 0.3s cubic-bezier(.4,0,.2,1), padding 0.3s',\n }}\n >\n <div\n style={{\n opacity: collapsed ? 0 : 1,\n transition: 'opacity 0.3s',\n gap: 8,\n }}\n >\n <Checkbox\n indeterminate={\n checkedAssets.length > 0 &&\n checkedAssets.length < assetNames.length\n }\n checked={checkedAssets.length === assetNames.length}\n onChange={(e) =>\n setCheckedAssets(e.target.checked ? assetNames : [])\n }\n style={{ marginBottom: 4 }}\n >\n {'ALL / NONE'}\n </Checkbox>\n <Checkbox.Group\n options={assetNames}\n value={checkedAssets}\n onChange={setCheckedAssets}\n style={{ display: 'flex', gap: 8, fontWeight: 500 }}\n />\n </div>\n </Card>\n <div style={{ flex: 1 }}>\n <TreeMap\n ref={chartRef}\n treeData={filteredTreeData}\n onChartClick={onChartClick}\n />\n </div>\n </Space>\n </div>\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
@@ -7,3 +7,13 @@ export declare enum ChartTypes {
7
7
  Loader = 4,
8
8
  Normal = 5
9
9
  }
10
+ export declare const BUNDLE_ANALYZER_COLORS: {
11
+ readonly green: readonly [string, string, string, string, string, string, string];
12
+ readonly blue: readonly [string, string, string, string, string, string, string];
13
+ readonly purple: readonly [string, string, string, string, string, string, string];
14
+ readonly yellow: readonly [string, string, string, string, string, string, string];
15
+ readonly grey: readonly [string, string, string, string, string, string, string];
16
+ };
17
+ type ColorGroup = keyof typeof BUNDLE_ANALYZER_COLORS;
18
+ export declare const COLOR_GROUPS: ColorGroup[];
19
+ export {};
@@ -36,7 +36,69 @@ var ChartTypes = /* @__PURE__ */ ((ChartTypes2) => {
36
36
  ChartTypes2[ChartTypes2["Normal"] = 5] = "Normal";
37
37
  return ChartTypes2;
38
38
  })(ChartTypes || {});
39
+ const BUNDLE_ANALYZER_COLORS = {
40
+ green: [
41
+ hexToRgba("#32b26a", 0.6),
42
+ hexToRgba("#5fcf92", 0.6),
43
+ hexToRgba("#8ee2b6", 0.8),
44
+ hexToRgba("#b7e1cd", 1),
45
+ hexToRgba("#cdeee0", 1),
46
+ hexToRgba("#e0f7ef", 1),
47
+ hexToRgba("#c8e6d6", 1)
48
+ ],
49
+ blue: [
50
+ hexToRgba("#3498f7", 0.6),
51
+ hexToRgba("#5eb3fa", 0.6),
52
+ hexToRgba("#8ccafc", 0.8),
53
+ hexToRgba("#b3d8f8", 1),
54
+ hexToRgba("#cde6fa", 1),
55
+ hexToRgba("#e0f2fd", 1),
56
+ hexToRgba("#c8e0ef", 1)
57
+ ],
58
+ purple: [
59
+ hexToRgba("#a04ddb", 0.6),
60
+ hexToRgba("#b26ef0", 0.6),
61
+ hexToRgba("#c49ff5", 0.8),
62
+ hexToRgba("#d1b3e6", 1),
63
+ hexToRgba("#e0c8f2", 1),
64
+ hexToRgba("#f0e6fa", 1),
65
+ hexToRgba("#d6c8e6", 1)
66
+ ],
67
+ yellow: [
68
+ hexToRgba("#ffe066", 0.6),
69
+ hexToRgba("#ffec80", 0.6),
70
+ hexToRgba("#fff599", 0.8),
71
+ hexToRgba("#fff9c4", 1),
72
+ hexToRgba("#fffbe0", 1),
73
+ hexToRgba("#fffde7", 1),
74
+ hexToRgba("#f5f2c8", 1)
75
+ ],
76
+ grey: [
77
+ hexToRgba("#7a7a7a", 0.7),
78
+ hexToRgba("#969696", 0.7),
79
+ hexToRgba("#b0b0b0", 0.8),
80
+ hexToRgba("#c8c8c8", 1),
81
+ hexToRgba("#dcdcdc", 1),
82
+ hexToRgba("#ededed", 1),
83
+ hexToRgba("#f7f7f7", 1)
84
+ ]
85
+ };
86
+ function hexToRgba(hex, alpha = 1) {
87
+ const r = parseInt(hex.slice(1, 3), 16);
88
+ const g = parseInt(hex.slice(3, 5), 16);
89
+ const b = parseInt(hex.slice(5, 7), 16);
90
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
91
+ }
92
+ const COLOR_GROUPS = [
93
+ "blue",
94
+ "purple",
95
+ "yellow",
96
+ "grey",
97
+ "green"
98
+ ];
39
99
  export {
100
+ BUNDLE_ANALYZER_COLORS,
101
+ COLOR_GROUPS,
40
102
  ChartTypes,
41
103
  PALETTE_COLORS
42
104
  };
@@ -1 +1 @@
1
- {"version":3,"mappings":"AAAO,MAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AANU,SAAAA;AAAA","names":["ChartTypes"],"ignoreList":[],"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"]}
1
+ {"version":3,"mappings":"AAAO,MAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AACA,EAAAA,wBAAA;AANU,SAAAA;AAAA;AASL,MAAM,yBAAyB;AAAA,EACpC,OAAO;AAAA,IACL,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,EACxB;AAAA,EACA,MAAM;AAAA,IACJ,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,EACxB;AAAA,EACA,QAAQ;AAAA,IACN,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,EACxB;AAAA,EACA,QAAQ;AAAA,IACN,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,EACxB;AAAA,EACA,MAAM;AAAA,IACJ,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,GAAG;AAAA,IACxB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,IACtB,UAAU,WAAW,CAAC;AAAA,EACxB;AACF;AAEA,SAAS,UAAU,KAAa,QAAQ,GAAG;AACzC,QAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,QAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,QAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,SAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK;AACxC;AAGO,MAAM,eAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF","names":["ChartTypes"],"ignoreList":[],"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 BUNDLE_ANALYZER_COLORS = {\n green: [\n hexToRgba('#32b26a', 0.6),\n hexToRgba('#5fcf92', 0.6),\n hexToRgba('#8ee2b6', 0.8),\n hexToRgba('#b7e1cd', 1),\n hexToRgba('#cdeee0', 1),\n hexToRgba('#e0f7ef', 1),\n hexToRgba('#c8e6d6', 1),\n ],\n blue: [\n hexToRgba('#3498f7', 0.6),\n hexToRgba('#5eb3fa', 0.6),\n hexToRgba('#8ccafc', 0.8),\n hexToRgba('#b3d8f8', 1),\n hexToRgba('#cde6fa', 1),\n hexToRgba('#e0f2fd', 1),\n hexToRgba('#c8e0ef', 1),\n ],\n purple: [\n hexToRgba('#a04ddb', 0.6),\n hexToRgba('#b26ef0', 0.6),\n hexToRgba('#c49ff5', 0.8),\n hexToRgba('#d1b3e6', 1),\n hexToRgba('#e0c8f2', 1),\n hexToRgba('#f0e6fa', 1),\n hexToRgba('#d6c8e6', 1),\n ],\n yellow: [\n hexToRgba('#ffe066', 0.6),\n hexToRgba('#ffec80', 0.6),\n hexToRgba('#fff599', 0.8),\n hexToRgba('#fff9c4', 1),\n hexToRgba('#fffbe0', 1),\n hexToRgba('#fffde7', 1),\n hexToRgba('#f5f2c8', 1),\n ],\n grey: [\n hexToRgba('#7a7a7a', 0.7),\n hexToRgba('#969696', 0.7),\n hexToRgba('#b0b0b0', 0.8),\n hexToRgba('#c8c8c8', 1),\n hexToRgba('#dcdcdc', 1),\n hexToRgba('#ededed', 1),\n hexToRgba('#f7f7f7', 1),\n ],\n} as const;\n\nfunction hexToRgba(hex: string, alpha = 1) {\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 return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\ntype ColorGroup = keyof typeof BUNDLE_ANALYZER_COLORS;\nexport const COLOR_GROUPS: ColorGroup[] = [\n 'blue',\n 'purple',\n 'yellow',\n 'grey',\n 'green',\n];\n"]}
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["mods"],"ignoreList":[],"sources":["../../../../src/pages/BundleSize/components/asset.tsx"],"sourcesContent":["import {\n CodepenCircleOutlined,\n ColumnHeightOutlined,\n InfoCircleOutlined,\n} from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Button,\n Card,\n Col,\n Divider,\n Empty,\n Popover,\n Row,\n Space,\n Tag,\n Tooltip,\n Tree,\n Typography,\n} from 'antd';\nimport { DataNode as AntdDataNode } from 'antd/es/tree';\nimport { omitBy, sumBy } from 'lodash-es';\nimport { dirname, relative } from 'path';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { CodeViewer } from '../../../components/base';\nimport { Badge as Bdg } from '../../../components/Badge';\nimport { KeywordInput } from '../../../components/Form/keyword';\nimport { Keyword } from '../../../components/Keyword';\nimport { ServerAPIProvider } from '../../../components/Manifest';\nimport { TextDrawer } from '../../../components/TextDrawer';\nimport { Size } from '../../../constants';\nimport {\n DataNode,\n createFileStructures,\n formatSize,\n isJsDataUrl,\n useI18n,\n} from '../../../utils';\nimport { ModuleAnalyzeComponent } from '../../ModuleAnalyze';\nimport { ModuleGraphListContext } from '../config';\nimport styles from './index.module';\n\nconst { DirectoryTree } = Tree;\n\nlet expandedModulesKeys: React.Key[] = [];\nconst TAB_MAP = {\n source: 'source code',\n transformed: 'Transformed Code (After compile)',\n parsedSource: 'Bundled Code (After bundle and tree-shaking)',\n};\n\nconst tagStyle = {\n margin: 'none',\n marginInlineEnd: 0,\n};\n\nconst EmptyCodeItem = () => (\n <Empty\n description={`Do not have the module code.\n (1) If you use the brief mode, there will not have any codes to show.\n (2) If you use lite mode, there will not have source codes.`}\n />\n);\n\nexport const ModuleCodeViewer: React.FC<{ data: SDK.ModuleData }> = ({\n data,\n}) => {\n const [tab, setTab] = useState('');\n const { t } = useI18n();\n\n const TAB_LAB_MAP: Record<string, string> = {\n source: 'Source Code',\n transformed: `Transformed Code(${t('After Compile')})`,\n parsedSource: `Bundled Code(${t('After Bundled')})`,\n };\n if (!data) return null;\n\n const { path } = data;\n\n return (\n <TextDrawer\n text=\"\"\n buttonProps={{\n size: 'small',\n icon: (\n <Popover content=\"Open the Codes Box\">\n <CodepenCircleOutlined />\n </Popover>\n ),\n type: 'default',\n }}\n buttonStyle={{ padding: `0 4px` }}\n drawerProps={{\n destroyOnClose: true,\n title: `Code of \"${path}\"`,\n }}\n >\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetModuleCodeByModuleId}\n body={{ moduleId: data.id }}\n >\n {(source) => {\n return (\n <>\n {!source['source'] &&\n !source['parsedSource'] &&\n !source['transformed'] ? (\n <EmptyCodeItem />\n ) : (\n <Card\n className=\"code-size-card\"\n style={{ width: '100%' }}\n tabList={Object.keys(omitBy(source, (s) => !s))\n .map((k) => ({ tab: k }))\n .map((e) => ({\n ...e,\n tab: TAB_LAB_MAP[e.tab],\n key: e.tab,\n }))}\n defaultActiveTabKey={\n source['parsedSource'] ? 'parsedSource' : 'source'\n }\n onTabChange={(v) => setTab(v)}\n tabBarExtraContent={\n <Popover\n placement=\"bottom\"\n title={\n <Typography.Title level={5}>Explain</Typography.Title>\n }\n content={\n <>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: 30,\n }}\n >\n <div>\n <Typography.Text strong>Source: </Typography.Text>\n <Typography.Text>\n {TAB_MAP.source}\n </Typography.Text>\n </div>\n <div>\n <Typography.Text strong>\n Transformed:\n </Typography.Text>\n <Typography.Text>\n {TAB_MAP.transformed}\n </Typography.Text>\n </div>\n <div>\n <Typography.Text strong>\n Bundled Source:\n </Typography.Text>\n <Typography.Text>\n {TAB_MAP.parsedSource}\n </Typography.Text>\n </div>\n <br />\n <Typography.Text strong>{'More'}</Typography.Text>\n <Typography.Text>\n {t('CodeModeExplain')}\n </Typography.Text>\n </div>\n </>\n }\n trigger={'hover'}\n >\n <a href=\"#\">Explain</a>\n </Popover>\n }\n styles={{ body: { padding: 0, overflow: 'hidden' } }}\n >\n {source['parsedSource'] ||\n source['source'] ||\n source['transformed'] ? (\n <CodeViewer\n isEmbed\n code={\n tab\n ? source[tab as keyof SDK.ModuleSource]\n : source['parsedSource']\n ? source['parsedSource']\n : source['source']\n }\n filePath={path}\n />\n ) : (\n <EmptyCodeItem />\n )}\n </Card>\n )}\n </>\n );\n }}\n </ServerAPIProvider>\n </TextDrawer>\n );\n};\n\nexport const ModuleGraphViewer: React.FC<{\n id: number | string;\n show: boolean;\n setShow: (_show: boolean) => void;\n cwd: string;\n}> = ({ id, show, setShow, cwd }) => {\n if (!id) return null;\n\n return (\n <ServerAPIProvider api={SDK.ServerAPI.API.GetAllModuleGraph} body={{}}>\n {(modules) => (\n <ModuleAnalyzeComponent\n cwd={cwd}\n moduleId={id}\n modules={modules}\n show={show}\n setShow={setShow}\n />\n )}\n </ServerAPIProvider>\n );\n};\n\nconst inlinedResourcePathKey = '__RESOURCEPATH__';\n\nexport function getChildrenModule(node: DataNode, mods: string[]) {\n node.children &&\n node.children.forEach((n: DataNode) => {\n if (n.isLeaf) {\n mods.push(n[inlinedResourcePathKey]);\n } else {\n getChildrenModule(n, mods);\n }\n });\n\n return mods;\n}\n\nexport const ModulesStatistics: React.FC<{\n modules: SDK.ModuleData[];\n chunks: SDK.ChunkData[];\n filteredModules: SDK.ModuleData[];\n}> = ({ modules, chunks, filteredModules }) => {\n const { sourceSize, parsedSize, filteredParsedSize, filteredSourceSize } =\n useMemo(() => {\n return {\n sourceSize: sumBy(modules, (e) => e.size.sourceSize),\n parsedSize: sumBy(modules, (e) => e.size.parsedSize),\n filteredSourceSize: sumBy(filteredModules, (e) => e.size.sourceSize),\n filteredParsedSize: sumBy(filteredModules, (e) => e.size.parsedSize),\n };\n }, [modules, filteredModules]);\n\n return (\n <Space>\n <Tooltip\n title={`total modules count is ${modules.length}, the filtered modules count is ${filteredModules.length}`}\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Modules: {filteredModules.length} / {modules.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n Total modules bundled size: {formatSize(parsedSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Total modules source size: {formatSize(sourceSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Filtered modules bundled size: {formatSize(filteredParsedSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Filtered modules source size: {formatSize(filteredSourceSize)}\n </Typography.Text>\n </Space>\n }\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Modules Size:\n {filteredParsedSize === parsedSize\n ? formatSize(parsedSize)\n : `${formatSize(filteredParsedSize)} / ${formatSize(parsedSize)}`}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n this asset includes {chunks.length} chunks:\n </Typography.Text>\n {chunks.map((e) => (\n <Bdg label=\"chunk\" value={e.name} key={e.name} />\n ))}\n </Space>\n }\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Chunks: {chunks.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n </Space>\n );\n};\n\nconst ConcatenatedTag = ({ moduleCount }: { moduleCount: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n This is a concatenated container module that includes {moduleCount}{' '}\n modules\n </Typography.Text>\n </Space>\n }\n >\n <Tag color=\"blue\" style={tagStyle}>\n concatenated container\n </Tag>\n </Tooltip>\n );\n};\n\nconst TotalBundledSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The total output size of all the files in this folder. If you\n enabled minification, this value shows the minified size.\n </Typography.Text>\n </Space>\n }\n >\n <Tag style={tagStyle} color={'geekblue'}>\n {`bundled size: ${formatSize(size)}`}\n </Tag>\n </Tooltip>\n );\n};\n\nconst BundledSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The final output size of this file. If you enabled minification,\n this value shows the minified size.\n </Typography.Text>\n </Space>\n }\n >\n <Tag color={'geekblue'}>{`bundled size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nconst TotalSourceSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The total original size of all the files in this folder, before any\n transformations and minification.\n </Typography.Text>\n </Space>\n }\n >\n <Tag\n style={tagStyle}\n color={'cyan'}\n >{`source size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nconst SourceSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The original size of this file, before any transformations and\n minification.\n </Typography.Text>\n </Space>\n }\n >\n <Tag color={'cyan'}>{`source size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nexport const AssetDetail: React.FC<{\n asset: SDK.AssetData;\n chunks: SDK.ChunkData[];\n modules: SDK.ModuleData[];\n moduleSizeLimit?: number;\n height?: number;\n root: string;\n}> = ({\n asset,\n chunks: includeChunks,\n modules: includeModules,\n moduleSizeLimit,\n height,\n root,\n}) => {\n const [moduleKeyword, setModuleKeyword] = useState('');\n const [defaultExpandAll, setDefaultExpandAll] = useState(false);\n const [moduleJumpList, setModuleJumpList] = useState([] as number[]);\n const [show, setShow] = useState(false);\n\n const filteredModules = useMemo(() => {\n let res = includeModules.slice();\n if (moduleKeyword) {\n const regexp = new RegExp(moduleKeyword, 'i');\n res = res.filter((e) => regexp.test(e.path));\n }\n\n if (moduleSizeLimit) {\n res = res.filter((e) => e.size.parsedSize >= moduleSizeLimit);\n }\n\n return res;\n }, [includeModules, moduleKeyword, moduleSizeLimit]);\n\n const fileStructures = useMemo(() => {\n const res = createFileStructures({\n files: filteredModules.map((e) => e.path).filter(Boolean),\n inlinedResourcePathKey,\n fileTitle(file, basename) {\n const mod = filteredModules.find((e) => e.path === file)!;\n\n if (!mod) return basename;\n\n const { parsedSize = 0, sourceSize = 0 } = mod.size;\n const isConcatenation = mod.kind === SDK.ModuleKind.Concatenation;\n\n const containedOtherModules =\n !isConcatenation &&\n parsedSize === 0 &&\n includeModules.filter(\n (e) => e !== mod && e.modules && e.modules.indexOf(mod.id) > -1,\n );\n\n return (\n <div className={styles['bundle-tree']}>\n <Popover\n content={`Open the ${basename}’s module reasons tree.`}\n placement=\"bottom\"\n >\n <div\n className={styles.box}\n onClick={() => {\n setModuleJumpList([mod.id]);\n setShow(true);\n }}\n >\n <div className={styles.keywords}>\n <Keyword ellipsis text={basename} keyword={''} />\n </div>\n <div className={styles.dividerDiv}>\n <Divider className={styles.divider} dashed />\n </div>\n </div>\n </Popover>\n <Space>\n {parsedSize !== 0 ? (\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <BundledSizeTag size={parsedSize} />\n <SourceSizeTag size={sourceSize} />\n </Space>\n }\n color={'white'}\n >\n <BundledSizeTag size={parsedSize} />\n </Tooltip>\n ) : sourceSize !== 0 ? (\n // fallback to display tag for source size\n <SourceSizeTag size={sourceSize} />\n ) : null}\n {isConcatenation ? (\n <ConcatenatedTag moduleCount={mod.modules?.length || 0} />\n ) : null}\n {containedOtherModules && containedOtherModules.length ? (\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n This module is concatenated into another container\n module:\n </Typography.Text>\n {containedOtherModules.map(({ id, path }) => {\n if (isJsDataUrl(path)) {\n return (\n <Typography.Paragraph\n ellipsis={{ rows: 4 }}\n key={id}\n style={{ color: 'inherit', maxWidth: '100%' }}\n code\n >\n {path}\n </Typography.Paragraph>\n );\n }\n\n const p = relative(dirname(mod.path), path);\n if (p.startsWith('javascript;charset=utf-8;base64,')) {\n return (\n <Typography.Text\n key={id}\n style={{ color: 'inherit', maxWidth: '100%' }}\n code\n >\n {p[0] === '.' ? p : `./${p}`}\n </Typography.Text>\n );\n }\n\n return (\n <Typography.Text\n key={id}\n style={{ color: 'inherit' }}\n code\n >\n {p[0] === '.' ? p : `./${p}`}\n </Typography.Text>\n );\n })}\n </Space>\n }\n >\n <Tag color=\"green\">concatenated</Tag>\n </Tooltip>\n ) : null}\n\n <ModuleCodeViewer data={mod} />\n </Space>\n </div>\n );\n },\n dirTitle(dir, defaultTitle) {\n const mods: string[] = [];\n const paths = getChildrenModule(dir, mods);\n if (paths.length) {\n const mods = paths.map(\n (e) => includeModules.find((m) => m.path === e)!,\n );\n\n const parsedSize = sumBy(mods, (e) => e.size?.parsedSize || 0);\n const sourceSize = sumBy(mods, (e) => e.size?.sourceSize || 0);\n return (\n <div className={styles['bundle-tree']}>\n <div className={styles.box}>\n <div className={styles.keywords}>\n <Keyword ellipsis text={defaultTitle} keyword={''} />\n </div>\n <div className={styles.dividerDiv}>\n <Divider className={styles.divider} dashed />\n </div>\n </div>\n <Space>\n {parsedSize > 0 ? (\n <>\n <TotalBundledSizeTag size={parsedSize} />\n <TotalSourceSizeTag size={sourceSize} />\n </>\n ) : (\n <TotalSourceSizeTag size={sourceSize} />\n )}\n </Space>\n </div>\n );\n }\n\n return defaultTitle;\n },\n page: 'bundle',\n });\n return res;\n }, [filteredModules]);\n\n const onSearch = (value: string) => setModuleKeyword(value);\n\n useEffect(() => {\n setModuleKeyword('');\n setDefaultExpandAll(false);\n }, [asset]);\n\n useEffect(() => {\n setDefaultExpandAll(false);\n }, [moduleKeyword]);\n\n return (\n <ModuleGraphListContext.Provider\n value={{ moduleJumpList, setModuleJumpList }}\n >\n <Card\n className={styles.bundle}\n title={`Modules of \"${asset.path}\"`}\n bodyStyle={{ minHeight: height }}\n size=\"small\"\n >\n {includeModules.length ? (\n <Row>\n <Col span={24}>\n <ModulesStatistics\n modules={includeModules}\n chunks={includeChunks}\n filteredModules={filteredModules}\n />\n </Col>\n <Col span={24}>\n <Space>\n <KeywordInput\n placeholder=\"search module by keyword\"\n onChange={onSearch}\n key={asset.path}\n />\n <Button\n onClick={() => setDefaultExpandAll(true)}\n size=\"small\"\n icon={<ColumnHeightOutlined />}\n />\n </Space>\n </Col>\n <Col span={24} style={{ marginTop: Size.BasePadding }}>\n {filteredModules.length ? (\n <DirectoryTree\n key={`tree_${moduleKeyword}_${defaultExpandAll}_${asset.path}`}\n selectable={false}\n defaultExpandAll={\n defaultExpandAll || filteredModules.length <= 20\n }\n onExpand={(expandedKeys) => {\n expandedModulesKeys = expandedKeys;\n }}\n defaultExpandParent\n defaultExpandedKeys={\n expandedModulesKeys?.length\n ? expandedModulesKeys\n : fileStructures.length === 1\n ? [fileStructures[0].key]\n : []\n }\n treeData={fileStructures as AntdDataNode[]}\n rootStyle={{\n maxHeight: '500px',\n overflow: 'auto',\n border: '1px solid rgba(235, 237, 241)',\n padding: '14px 20px',\n }}\n />\n ) : (\n <Empty\n description={\n <Typography.Text\n strong\n >{`\"${moduleKeyword}\" can't match any modules`}</Typography.Text>\n }\n />\n )}\n </Col>\n </Row>\n ) : (\n <Empty\n description={\n <Typography.Text\n strong\n >{`\"${asset.path}\" doesn't have any modules`}</Typography.Text>\n }\n />\n )}\n\n <ModuleGraphViewer\n id={\n moduleJumpList?.length\n ? moduleJumpList[moduleJumpList.length - 1]\n : ''\n }\n show={show}\n setShow={setShow}\n cwd={root}\n />\n </Card>\n </ModuleGraphListContext.Provider>\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
1
+ {"version":3,"mappings":"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","names":["mods"],"ignoreList":[],"sources":["../../../../src/pages/BundleSize/components/asset.tsx"],"sourcesContent":["import {\n CodepenCircleOutlined,\n ColumnHeightOutlined,\n InfoCircleOutlined,\n} from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Button,\n Card,\n Col,\n Divider,\n Empty,\n Popover,\n Row,\n Space,\n Tag,\n Tooltip,\n Tree,\n Typography,\n} from 'antd';\nimport { DataNode as AntdDataNode } from 'antd/es/tree';\nimport { omitBy, sumBy } from 'lodash-es';\nimport { dirname, relative } from 'path';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { CodeViewer } from '../../../components/base';\nimport { Badge as Bdg } from '../../../components/Badge';\nimport { KeywordInput } from '../../../components/Form/keyword';\nimport { Keyword } from '../../../components/Keyword';\nimport { ServerAPIProvider } from '../../../components/Manifest';\nimport { TextDrawer } from '../../../components/TextDrawer';\nimport { Size } from '../../../constants';\nimport {\n DataNode,\n createFileStructures,\n formatSize,\n isJsDataUrl,\n useI18n,\n} from '../../../utils';\nimport { ModuleAnalyzeComponent } from '../../ModuleAnalyze';\nimport { ModuleGraphListContext } from '../config';\nimport styles from './index.module';\n\nconst { DirectoryTree } = Tree;\n\nlet expandedModulesKeys: React.Key[] = [];\nconst TAB_MAP = {\n source: 'source code',\n transformed: 'Transformed Code (After compile)',\n parsedSource: 'Bundled Code (After bundle and tree-shaking)',\n};\n\nconst tagStyle = {\n margin: 'none',\n marginInlineEnd: 0,\n};\n\nconst EmptyCodeItem = () => (\n <Empty\n description={`Do not have the module code.\n (1) If you use the brief mode, there will not have any codes to show.\n (2) If you use lite mode, there will not have source codes.`}\n />\n);\n\nexport const ModuleCodeViewer: React.FC<{ data: SDK.ModuleData }> = ({\n data,\n}) => {\n const [tab, setTab] = useState('');\n const { t } = useI18n();\n\n const TAB_LAB_MAP: Record<string, string> = {\n source: 'Source Code',\n transformed: `Transformed Code(${t('After Compile')})`,\n parsedSource: `Bundled Code(${t('After Bundled')})`,\n };\n if (!data) return null;\n\n const { path } = data;\n\n return (\n <TextDrawer\n text=\"\"\n buttonProps={{\n size: 'small',\n icon: (\n <Popover content=\"Open the Codes Box\">\n <CodepenCircleOutlined />\n </Popover>\n ),\n type: 'default',\n }}\n buttonStyle={{ padding: `0 4px` }}\n drawerProps={{\n destroyOnClose: true,\n title: `Code of \"${path}\"`,\n }}\n >\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetModuleCodeByModuleId}\n body={{ moduleId: data.id }}\n >\n {(source) => {\n return (\n <>\n {!source['source'] &&\n !source['parsedSource'] &&\n !source['transformed'] ? (\n <EmptyCodeItem />\n ) : (\n <Card\n className=\"code-size-card\"\n style={{ width: '100%' }}\n tabList={Object.keys(omitBy(source, (s) => !s))\n .map((k) => ({ tab: k }))\n .map((e) => ({\n ...e,\n tab: TAB_LAB_MAP[e.tab],\n key: e.tab,\n }))}\n defaultActiveTabKey={\n source['parsedSource'] ? 'parsedSource' : 'source'\n }\n onTabChange={(v) => setTab(v)}\n tabBarExtraContent={\n <Popover\n placement=\"bottom\"\n title={\n <Typography.Title level={5}>Explain</Typography.Title>\n }\n content={\n <>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: 30,\n }}\n >\n <div>\n <Typography.Text strong>Source: </Typography.Text>\n <Typography.Text>\n {TAB_MAP.source}\n </Typography.Text>\n </div>\n <div>\n <Typography.Text strong>\n Transformed:\n </Typography.Text>\n <Typography.Text>\n {TAB_MAP.transformed}\n </Typography.Text>\n </div>\n <div>\n <Typography.Text strong>\n Bundled Source:\n </Typography.Text>\n <Typography.Text>\n {TAB_MAP.parsedSource}\n </Typography.Text>\n </div>\n <br />\n <Typography.Text strong>{'More'}</Typography.Text>\n <Typography.Text>\n {t('CodeModeExplain')}\n </Typography.Text>\n </div>\n </>\n }\n trigger={'hover'}\n >\n <a href=\"#\">Explain</a>\n </Popover>\n }\n styles={{ body: { padding: 0, overflow: 'hidden' } }}\n >\n {source['parsedSource'] ||\n source['source'] ||\n source['transformed'] ? (\n <CodeViewer\n isEmbed\n code={\n tab\n ? source[tab as keyof SDK.ModuleSource]\n : source['parsedSource']\n ? source['parsedSource']\n : source['source']\n }\n filePath={path}\n />\n ) : (\n <EmptyCodeItem />\n )}\n </Card>\n )}\n </>\n );\n }}\n </ServerAPIProvider>\n </TextDrawer>\n );\n};\n\nexport const ModuleGraphViewer: React.FC<{\n id: number | string;\n show: boolean;\n setShow: (_show: boolean) => void;\n cwd: string;\n}> = ({ id, show, setShow, cwd }) => {\n if (!id) return null;\n\n return (\n <ServerAPIProvider api={SDK.ServerAPI.API.GetAllModuleGraph} body={{}}>\n {(modules) => (\n <ModuleAnalyzeComponent\n cwd={cwd}\n moduleId={id}\n modules={modules}\n show={show}\n setShow={setShow}\n />\n )}\n </ServerAPIProvider>\n );\n};\n\nconst inlinedResourcePathKey = '__RESOURCEPATH__';\n\nexport function getChildrenModule(node: DataNode, mods: string[]) {\n node.children &&\n node.children.forEach((n: DataNode) => {\n if (n.isLeaf) {\n mods.push(n[inlinedResourcePathKey]);\n } else {\n getChildrenModule(n, mods);\n }\n });\n\n return mods;\n}\n\nexport const ModulesStatistics: React.FC<{\n modules: SDK.ModuleData[];\n chunks: SDK.ChunkData[];\n filteredModules: SDK.ModuleData[];\n}> = ({ modules, chunks, filteredModules }) => {\n const { sourceSize, parsedSize, filteredParsedSize, filteredSourceSize } =\n useMemo(() => {\n return {\n sourceSize: sumBy(modules, (e) => e.size.sourceSize),\n parsedSize: sumBy(modules, (e) => e.size.parsedSize),\n filteredSourceSize: sumBy(filteredModules, (e) => e.size.sourceSize),\n filteredParsedSize: sumBy(filteredModules, (e) => e.size.parsedSize),\n };\n }, [modules, filteredModules]);\n\n return (\n <Space>\n <Tooltip\n title={`total modules count is ${modules.length}, the filtered modules count is ${filteredModules.length}`}\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Modules: {filteredModules.length} / {modules.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n Total modules bundled size: {formatSize(parsedSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Total modules source size: {formatSize(sourceSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Filtered modules bundled size: {formatSize(filteredParsedSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Filtered modules source size: {formatSize(filteredSourceSize)}\n </Typography.Text>\n </Space>\n }\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Modules Size:\n {filteredParsedSize === parsedSize\n ? formatSize(parsedSize)\n : `${formatSize(filteredParsedSize)} / ${formatSize(parsedSize)}`}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n this asset includes {chunks.length} chunks:\n </Typography.Text>\n {chunks.map((e) => (\n <Bdg label=\"chunk\" value={e.name} key={e.name} />\n ))}\n </Space>\n }\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Chunks: {chunks.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n </Space>\n );\n};\n\nconst ConcatenatedTag = ({ moduleCount }: { moduleCount: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n This is a concatenated container module that includes {moduleCount}{' '}\n modules\n </Typography.Text>\n </Space>\n }\n >\n <Tag color=\"blue\" style={tagStyle}>\n concatenated container\n </Tag>\n </Tooltip>\n );\n};\n\nconst TotalBundledSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The total output size of all the files in this folder. If you\n enabled minification, this value shows the minified size.\n </Typography.Text>\n </Space>\n }\n >\n <Tag style={tagStyle} color={'geekblue'}>\n {`bundled size: ${formatSize(size)}`}\n </Tag>\n </Tooltip>\n );\n};\n\nconst BundledSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The final output size of this file. If you enabled minification,\n this value shows the minified size.\n </Typography.Text>\n </Space>\n }\n >\n <Tag color={'geekblue'}>{`bundled size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nconst TotalSourceSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The total original size of all the files in this folder, before any\n transformations and minification.\n </Typography.Text>\n </Space>\n }\n >\n <Tag\n style={tagStyle}\n color={'cyan'}\n >{`source size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nconst SourceSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The original size of this file, before any transformations and\n minification.\n </Typography.Text>\n </Space>\n }\n >\n <Tag color={'cyan'}>{`source size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nexport const AssetDetail: React.FC<{\n asset: SDK.AssetData;\n chunks: SDK.ChunkData[];\n modules: SDK.ModuleData[];\n moduleSizeLimit?: number;\n height?: number;\n root: string;\n}> = ({\n asset,\n chunks: includeChunks,\n modules: includeModules,\n moduleSizeLimit,\n height,\n root,\n}) => {\n const [moduleKeyword, setModuleKeyword] = useState('');\n const [defaultExpandAll, setDefaultExpandAll] = useState(false);\n const [moduleJumpList, setModuleJumpList] = useState([] as number[]);\n const [show, setShow] = useState(false);\n\n const filteredModules = useMemo(() => {\n let res = includeModules.slice();\n if (moduleKeyword) {\n const regexp = new RegExp(moduleKeyword, 'i');\n res = res.filter((e) => regexp.test(e.path));\n }\n\n if (moduleSizeLimit) {\n res = res.filter((e) => e.size.parsedSize >= moduleSizeLimit);\n }\n\n return res;\n }, [includeModules, moduleKeyword, moduleSizeLimit]);\n\n const fileStructures = useMemo(() => {\n const res = createFileStructures({\n files: filteredModules.map((e) => e.path).filter(Boolean),\n inlinedResourcePathKey,\n fileTitle(file, basename) {\n const mod = filteredModules.find((e) => e.path === file)!;\n\n if (!mod) return basename;\n\n const { parsedSize = 0, sourceSize = 0 } = mod.size;\n const isConcatenation = mod.kind === SDK.ModuleKind.Concatenation;\n\n const containedOtherModules =\n !isConcatenation &&\n parsedSize === 0 &&\n includeModules.filter(\n (e) => e !== mod && e.modules && e.modules.indexOf(mod.id) > -1,\n );\n\n return (\n <div className={styles['bundle-tree']}>\n <Popover\n content={`Open the ${basename}’s module reasons tree.`}\n placement=\"bottom\"\n >\n <div\n className={styles.box}\n onClick={() => {\n setModuleJumpList([mod.id]);\n setShow(true);\n }}\n >\n <div className={styles.keywords}>\n <Keyword ellipsis text={basename} keyword={''} />\n </div>\n <div className={styles.dividerDiv}>\n <Divider className={styles.divider} dashed />\n </div>\n </div>\n </Popover>\n <Space>\n {parsedSize !== 0 ? (\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <BundledSizeTag size={parsedSize} />\n <SourceSizeTag size={sourceSize} />\n </Space>\n }\n color={'white'}\n >\n <BundledSizeTag size={parsedSize} />\n </Tooltip>\n ) : sourceSize !== 0 ? (\n // fallback to display tag for source size\n <SourceSizeTag size={sourceSize} />\n ) : null}\n {isConcatenation ? (\n <ConcatenatedTag moduleCount={mod.modules?.length || 0} />\n ) : null}\n {containedOtherModules && containedOtherModules.length ? (\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n This module is concatenated into another container\n module:\n </Typography.Text>\n {containedOtherModules.map(({ id, path }) => {\n if (isJsDataUrl(path)) {\n return (\n <Typography.Paragraph\n ellipsis={{ rows: 4 }}\n key={id}\n style={{ color: 'inherit', maxWidth: '100%' }}\n code\n >\n {path}\n </Typography.Paragraph>\n );\n }\n\n const p = relative(dirname(mod.path), path);\n if (p.startsWith('javascript;charset=utf-8;base64,')) {\n return (\n <Typography.Text\n key={id}\n style={{ color: 'inherit', maxWidth: '100%' }}\n code\n >\n {p[0] === '.' ? p : `./${p}`}\n </Typography.Text>\n );\n }\n\n return (\n <Typography.Text\n key={id}\n style={{ color: 'inherit' }}\n code\n >\n {p[0] === '.' ? p : `./${p}`}\n </Typography.Text>\n );\n })}\n </Space>\n }\n >\n <Tag color=\"green\">concatenated</Tag>\n </Tooltip>\n ) : null}\n\n <ModuleCodeViewer data={mod} />\n </Space>\n </div>\n );\n },\n dirTitle(dir, defaultTitle) {\n const mods: string[] = [];\n const paths = getChildrenModule(dir, mods);\n if (paths.length) {\n const mods = paths.map(\n (e) => includeModules.find((m) => m.path === e)!,\n );\n\n const parsedSize = sumBy(mods, (e) => e.size?.parsedSize || 0);\n const sourceSize = sumBy(mods, (e) => e.size?.sourceSize || 0);\n return (\n <div className={styles['bundle-tree']}>\n <div className={styles.box}>\n <div className={styles.keywords}>\n <Keyword ellipsis text={defaultTitle} keyword={''} />\n </div>\n <div className={styles.dividerDiv}>\n <Divider className={styles.divider} dashed />\n </div>\n </div>\n <Space>\n {parsedSize > 0 ? (\n <>\n <TotalBundledSizeTag size={parsedSize} />\n <TotalSourceSizeTag size={sourceSize} />\n </>\n ) : (\n <TotalSourceSizeTag size={sourceSize} />\n )}\n </Space>\n </div>\n );\n }\n\n return defaultTitle;\n },\n page: 'bundle',\n });\n return res;\n }, [filteredModules]);\n\n const onSearch = (value: string) => setModuleKeyword(value);\n\n useEffect(() => {\n setModuleKeyword('');\n setDefaultExpandAll(false);\n }, [asset]);\n\n useEffect(() => {\n setDefaultExpandAll(false);\n }, [moduleKeyword]);\n\n return (\n <ModuleGraphListContext.Provider\n value={{ moduleJumpList, setModuleJumpList }}\n >\n <Card\n className={styles.bundle}\n title={`Modules of \"${asset.path}\"`}\n bodyStyle={{ minHeight: height }}\n size=\"small\"\n >\n {includeModules.length ? (\n <Row>\n <Col span={24}>\n <ModulesStatistics\n modules={includeModules}\n chunks={includeChunks}\n filteredModules={filteredModules}\n />\n </Col>\n <Col span={24}>\n <Space>\n <KeywordInput\n placeholder=\"search module by keyword\"\n onChange={onSearch}\n key={asset.path}\n />\n <Button\n onClick={() => setDefaultExpandAll(true)}\n size=\"small\"\n icon={<ColumnHeightOutlined />}\n />\n </Space>\n </Col>\n <Col span={24} style={{ marginTop: Size.BasePadding }}>\n {filteredModules.length ? (\n <DirectoryTree\n key={`tree_${moduleKeyword}_${defaultExpandAll}_${asset.path}`}\n selectable={false}\n defaultExpandAll={\n defaultExpandAll || filteredModules.length <= 20\n }\n onExpand={(expandedKeys) => {\n expandedModulesKeys = expandedKeys;\n }}\n defaultExpandParent\n // @ts-ignore\n defaultExpandedKeys={\n expandedModulesKeys?.length\n ? expandedModulesKeys\n : fileStructures.length === 1\n ? [fileStructures[0].key]\n : []\n }\n treeData={fileStructures as AntdDataNode[]}\n rootStyle={{\n maxHeight: '500px',\n overflow: 'auto',\n border: '1px solid rgba(235, 237, 241)',\n padding: '14px 20px',\n }}\n />\n ) : (\n <Empty\n description={\n <Typography.Text\n strong\n >{`\"${moduleKeyword}\" can't match any modules`}</Typography.Text>\n }\n />\n )}\n </Col>\n </Row>\n ) : (\n <Empty\n description={\n <Typography.Text\n strong\n >{`\"${asset.path}\" doesn't have any modules`}</Typography.Text>\n }\n />\n )}\n\n <ModuleGraphViewer\n id={\n moduleJumpList?.length\n ? moduleJumpList[moduleJumpList.length - 1]\n : ''\n }\n show={show}\n setShow={setShow}\n cwd={root}\n />\n </Card>\n </ModuleGraphListContext.Provider>\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}