@rsdoctor/components 1.1.4 → 1.1.6
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/Charts/TreeMap.d.ts +21 -0
- package/dist/components/Charts/TreeMap.js +281 -0
- package/dist/components/Charts/TreeMap.js.map +1 -0
- package/dist/components/Charts/constants.d.ts +10 -0
- package/dist/components/Charts/constants.js +62 -0
- package/dist/components/Charts/constants.js.map +1 -1
- package/dist/components/Overall/help-center.js +2 -1
- package/dist/components/Overall/help-center.js.map +1 -1
- package/dist/pages/BundleSize/components/asset.js.map +1 -1
- package/dist/pages/BundleSize/components/cards.js +8 -1
- package/dist/pages/BundleSize/components/cards.js.map +1 -1
- package/dist/pages/BundleSize/components/index.js +26 -33
- package/dist/pages/BundleSize/components/index.js.map +1 -1
- package/dist/pages/BundleSize/components/index_module.css +4 -0
- package/dist/pages/BundleSize/components/search-modal.d.ts +7 -1
- package/dist/pages/BundleSize/components/search-modal.js +72 -31
- package/dist/pages/BundleSize/components/search-modal.js.map +1 -1
- package/dist/utils/file.d.ts +13 -1
- package/dist/utils/file.js +78 -0
- package/dist/utils/file.js.map +1 -1
- package/dist/utils/i18n/cn.js +3 -1
- package/dist/utils/i18n/cn.js.map +1 -1
- package/dist/utils/i18n/en.d.ts +2 -0
- package/dist/utils/i18n/en.js +3 -1
- package/dist/utils/i18n/en.js.map +1 -1
- package/package.json +4 -4
|
@@ -13,11 +13,20 @@ import {
|
|
|
13
13
|
import { ServerAPIProvider } from "../../../components";
|
|
14
14
|
import { SDK } from "@rsdoctor/types";
|
|
15
15
|
import styles from "./index.module";
|
|
16
|
+
import { SearchOutlined } from "@ant-design/icons";
|
|
16
17
|
const { Search } = Input;
|
|
17
|
-
const SearchModal = (
|
|
18
|
+
const SearchModal = ({
|
|
19
|
+
onModuleClick = void 0,
|
|
20
|
+
onClose,
|
|
21
|
+
open,
|
|
22
|
+
setOpen,
|
|
23
|
+
isIcon = false
|
|
24
|
+
}) => {
|
|
18
25
|
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
19
26
|
const [searchModule, setSearchModule] = useState("");
|
|
20
27
|
const [searchChunk, setSearchChunk] = useState("");
|
|
28
|
+
const modalOpen = open !== void 0 ? open : isModalOpen;
|
|
29
|
+
const setModalOpen = setOpen || setIsModalOpen;
|
|
21
30
|
const onSearch = useCallback(
|
|
22
31
|
(...args) => {
|
|
23
32
|
const [value, _event] = args;
|
|
@@ -26,16 +35,26 @@ const SearchModal = () => {
|
|
|
26
35
|
[]
|
|
27
36
|
);
|
|
28
37
|
const showModal = () => {
|
|
29
|
-
|
|
38
|
+
setModalOpen(true);
|
|
30
39
|
};
|
|
31
40
|
const handleOk = () => {
|
|
32
|
-
|
|
41
|
+
setModalOpen(false);
|
|
42
|
+
onClose?.();
|
|
33
43
|
};
|
|
34
44
|
const handleCancel = () => {
|
|
35
|
-
|
|
45
|
+
setModalOpen(false);
|
|
46
|
+
onClose?.();
|
|
36
47
|
};
|
|
37
48
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
38
|
-
/* @__PURE__ */ jsx(
|
|
49
|
+
isIcon ? /* @__PURE__ */ jsx(SearchOutlined, { onClick: showModal }) : /* @__PURE__ */ jsx(
|
|
50
|
+
Button,
|
|
51
|
+
{
|
|
52
|
+
className: styles["search-btn"],
|
|
53
|
+
color: "cyan",
|
|
54
|
+
onClick: showModal,
|
|
55
|
+
children: "Search Module"
|
|
56
|
+
}
|
|
57
|
+
),
|
|
39
58
|
/* @__PURE__ */ jsx(
|
|
40
59
|
ServerAPIProvider,
|
|
41
60
|
{
|
|
@@ -50,7 +69,7 @@ const SearchModal = () => {
|
|
|
50
69
|
title: "Search Modules",
|
|
51
70
|
onOk: handleOk,
|
|
52
71
|
onCancel: handleCancel,
|
|
53
|
-
open:
|
|
72
|
+
open: modalOpen,
|
|
54
73
|
width: "65rem",
|
|
55
74
|
footer: "",
|
|
56
75
|
children: [
|
|
@@ -76,7 +95,12 @@ const SearchModal = () => {
|
|
|
76
95
|
key: id,
|
|
77
96
|
children: ModulesModal(
|
|
78
97
|
searchModule,
|
|
79
|
-
searchChunk || defaultChunkId
|
|
98
|
+
searchChunk || defaultChunkId,
|
|
99
|
+
(item) => {
|
|
100
|
+
onModuleClick?.(item);
|
|
101
|
+
setModalOpen(false);
|
|
102
|
+
onClose?.();
|
|
103
|
+
}
|
|
80
104
|
)
|
|
81
105
|
};
|
|
82
106
|
})
|
|
@@ -90,7 +114,7 @@ const SearchModal = () => {
|
|
|
90
114
|
)
|
|
91
115
|
] });
|
|
92
116
|
};
|
|
93
|
-
const ModulesModal = (searchModule, chunk) => {
|
|
117
|
+
const ModulesModal = (searchModule, chunk, onModuleClick) => {
|
|
94
118
|
return /* @__PURE__ */ jsx(
|
|
95
119
|
ServerAPIProvider,
|
|
96
120
|
{
|
|
@@ -106,30 +130,47 @@ const ModulesModal = (searchModule, chunk) => {
|
|
|
106
130
|
dataSource: modules,
|
|
107
131
|
renderItem: (item) => {
|
|
108
132
|
const itemPathArr = item.relativePath.split(searchModule);
|
|
109
|
-
return /* @__PURE__ */ jsx(
|
|
110
|
-
List.Item
|
|
133
|
+
return /* @__PURE__ */ jsx(
|
|
134
|
+
List.Item,
|
|
111
135
|
{
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
136
|
+
className: onModuleClick ? "search-list-item clickable" : "search-list-item",
|
|
137
|
+
onClick: onModuleClick ? () => onModuleClick(item) : void 0,
|
|
138
|
+
children: /* @__PURE__ */ jsx(Skeleton, { avatar: true, title: false, loading: !item.path, active: true, children: /* @__PURE__ */ jsx(
|
|
139
|
+
List.Item.Meta,
|
|
140
|
+
{
|
|
141
|
+
description: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
142
|
+
/* @__PURE__ */ jsx(Typography.Text, { code: true, children: "Module:" }),
|
|
143
|
+
itemPathArr.map((cur, index) => {
|
|
144
|
+
if (index < itemPathArr.length - 1) {
|
|
145
|
+
return /* @__PURE__ */ jsxs(
|
|
146
|
+
Typography.Text,
|
|
147
|
+
{
|
|
148
|
+
style: { fontWeight: 200 },
|
|
149
|
+
children: [
|
|
150
|
+
cur,
|
|
151
|
+
/* @__PURE__ */ jsx(
|
|
152
|
+
Typography.Text,
|
|
153
|
+
{
|
|
154
|
+
strong: true,
|
|
155
|
+
style: { fontWeight: 600 },
|
|
156
|
+
children: searchModule
|
|
157
|
+
},
|
|
158
|
+
`${cur}-${index}-strong`
|
|
159
|
+
)
|
|
160
|
+
]
|
|
161
|
+
},
|
|
162
|
+
`${cur}-${index}`
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
return /* @__PURE__ */ jsx(Typography.Text, { style: { fontWeight: 200 }, children: cur });
|
|
166
|
+
})
|
|
167
|
+
] })
|
|
168
|
+
},
|
|
169
|
+
`${item.path}-${item.relativePath}-meta`
|
|
170
|
+
) })
|
|
171
|
+
},
|
|
172
|
+
`${item.path}-${item.relativePath}`
|
|
173
|
+
);
|
|
133
174
|
}
|
|
134
175
|
}
|
|
135
176
|
) : /* @__PURE__ */ jsx(Empty, {}) })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../src/pages/BundleSize/components/search-modal.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport {\n Button,\n Modal,\n Input,\n Tabs,\n List,\n Skeleton,\n Typography,\n Empty,\n} from 'antd';\nimport { SearchProps } from 'antd/es/input';\nimport { ServerAPIProvider } from '../../../components';\nimport { SDK } from '@rsdoctor/types';\nimport styles from './index.module';\n\nconst { Search } = Input;\n\ntype OnSearchParams = Parameters<NonNullable<SearchProps['onSearch']>>;\n\nexport const SearchModal: React.FC = () => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [searchModule, setSearchModule] = useState('');\n const [searchChunk, setSearchChunk] = useState('');\n\n const onSearch: SearchProps['onSearch'] = useCallback(\n (...args: OnSearchParams) => {\n const [value, _event] = args;\n setSearchModule(value);\n },\n [],\n );\n\n const showModal = () => {\n setIsModalOpen(true);\n };\n\n const handleOk = () => {\n setIsModalOpen(false);\n };\n\n const handleCancel = () => {\n setIsModalOpen(false);\n };\n\n return (\n <>\n <Button className={styles['search-btn']} color=\"cyan\" onClick={showModal}>\n Search Module\n </Button>\n\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetSearchModules}\n body={{ moduleName: String(searchModule) }}\n >\n {(assetsChunksList) => {\n const defaultChunkId = Object.keys(assetsChunksList)[0];\n return (\n <>\n <Modal\n className={styles.modal}\n title=\"Search Modules\"\n onOk={handleOk}\n onCancel={handleCancel}\n open={isModalOpen}\n width={'65rem'}\n footer=\"\"\n >\n <Search\n placeholder=\"input search module name\"\n allowClear\n onSearch={onSearch}\n style={{ width: 500 }}\n />\n {defaultChunkId ? (\n <Tabs\n defaultActiveKey={defaultChunkId}\n tabPosition={'top'}\n onChange={(value) => setSearchChunk(value)}\n items={Object.keys(assetsChunksList).map((chunk, _i) => {\n const id = chunk;\n return {\n label: assetsChunksList[chunk],\n key: id,\n children: ModulesModal(\n searchModule,\n searchChunk || defaultChunkId,\n ),\n };\n })}\n />\n ) : (\n <Empty description={'No modules found.'} />\n )}\n </Modal>\n </>\n );\n }}\n </ServerAPIProvider>\n </>\n );\n};\n\nconst ModulesModal = (searchModule: string, chunk: string) => {\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetSearchModuleInChunk}\n body={{ moduleName: String(searchModule), chunk }}\n >\n {(modules) => (\n <>\n {modules?.length !== 0 ? (\n <List\n className={styles['search-modal-list']}\n loading={!modules.length}\n itemLayout=\"horizontal\"\n pagination={{ position: 'bottom', align: 'center' }}\n dataSource={modules}\n renderItem={(item) => {\n const itemPathArr = item.relativePath.split(searchModule);\n return (\n <List.Item>\n <Skeleton avatar title={false} loading={!item.path} active>\n <List.Item.Meta\n description={\n <>\n <Typography.Text code>{'Module:'}</Typography.Text>\n {itemPathArr.map((cur, index) => {\n if (index < itemPathArr.length - 1) {\n return (\n <Typography.Text style={{ fontWeight: 200 }}>\n {cur}\n <Typography.Text\n strong\n style={{ fontWeight: 600 }}\n >\n {searchModule}\n </Typography.Text>\n </Typography.Text>\n );\n }\n return (\n <Typography.Text style={{ fontWeight: 200 }}>\n {cur}\n </Typography.Text>\n );\n })}\n </>\n }\n />\n </Skeleton>\n </List.Item>\n );\n }}\n />\n ) : (\n <Empty />\n )}\n </>\n )}\n </ServerAPIProvider>\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../src/pages/BundleSize/components/search-modal.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport {\n Button,\n Modal,\n Input,\n Tabs,\n List,\n Skeleton,\n Typography,\n Empty,\n} from 'antd';\nimport { SearchProps } from 'antd/es/input';\nimport { ServerAPIProvider } from '../../../components';\nimport { SDK } from '@rsdoctor/types';\nimport styles from './index.module';\nimport { SearchOutlined } from '@ant-design/icons';\n\nconst { Search } = Input;\n\ntype OnSearchParams = Parameters<NonNullable<SearchProps['onSearch']>>;\n\nexport const SearchModal: React.FC<{\n onModuleClick?: (module: any) => void;\n onClose?: () => void;\n open?: boolean;\n setOpen?: (open: boolean) => void;\n isIcon?: boolean;\n}> = ({\n onModuleClick = undefined,\n onClose,\n open,\n setOpen,\n isIcon = false,\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [searchModule, setSearchModule] = useState('');\n const [searchChunk, setSearchChunk] = useState('');\n\n const modalOpen = open !== undefined ? open : isModalOpen;\n const setModalOpen = setOpen || setIsModalOpen;\n\n const onSearch: SearchProps['onSearch'] = useCallback(\n (...args: OnSearchParams) => {\n const [value, _event] = args;\n setSearchModule(value);\n },\n [],\n );\n\n const showModal = () => {\n setModalOpen(true);\n };\n\n const handleOk = () => {\n setModalOpen(false);\n onClose?.();\n };\n\n const handleCancel = () => {\n setModalOpen(false);\n onClose?.();\n };\n\n return (\n <>\n {isIcon ? (\n <SearchOutlined onClick={showModal} />\n ) : (\n <Button\n className={styles['search-btn']}\n color=\"cyan\"\n onClick={showModal}\n >\n Search Module\n </Button>\n )}\n\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetSearchModules}\n body={{ moduleName: String(searchModule) }}\n >\n {(assetsChunksList) => {\n const defaultChunkId = Object.keys(assetsChunksList)[0];\n return (\n <>\n <Modal\n className={styles.modal}\n title=\"Search Modules\"\n onOk={handleOk}\n onCancel={handleCancel}\n open={modalOpen}\n width={'65rem'}\n footer=\"\"\n >\n <Search\n placeholder=\"input search module name\"\n allowClear\n onSearch={onSearch}\n style={{ width: 500 }}\n />\n {defaultChunkId ? (\n <Tabs\n defaultActiveKey={defaultChunkId}\n tabPosition={'top'}\n onChange={(value) => setSearchChunk(value)}\n items={Object.keys(assetsChunksList).map((chunk, _i) => {\n const id = chunk;\n return {\n label: assetsChunksList[chunk],\n key: id,\n children: ModulesModal(\n searchModule,\n searchChunk || defaultChunkId,\n (item) => {\n onModuleClick?.(item);\n setModalOpen(false);\n onClose?.();\n },\n ),\n };\n })}\n />\n ) : (\n <Empty description={'No modules found.'} />\n )}\n </Modal>\n </>\n );\n }}\n </ServerAPIProvider>\n </>\n );\n};\n\nconst ModulesModal = (\n searchModule: string,\n chunk: string,\n onModuleClick?: (module: any) => void | undefined,\n) => {\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetSearchModuleInChunk}\n body={{ moduleName: String(searchModule), chunk }}\n >\n {(modules) => (\n <>\n {modules?.length !== 0 ? (\n <List\n className={styles['search-modal-list']}\n loading={!modules.length}\n itemLayout=\"horizontal\"\n pagination={{ position: 'bottom', align: 'center' }}\n dataSource={modules}\n renderItem={(item) => {\n const itemPathArr = item.relativePath.split(searchModule);\n return (\n <List.Item\n className={\n onModuleClick\n ? 'search-list-item clickable'\n : 'search-list-item'\n }\n key={`${item.path}-${item.relativePath}`}\n onClick={\n onModuleClick ? () => onModuleClick(item) : undefined\n }\n >\n <Skeleton avatar title={false} loading={!item.path} active>\n <List.Item.Meta\n key={`${item.path}-${item.relativePath}-meta`}\n description={\n <>\n <Typography.Text code>{'Module:'}</Typography.Text>\n {itemPathArr.map((cur, index) => {\n if (index < itemPathArr.length - 1) {\n return (\n <Typography.Text\n key={`${cur}-${index}`}\n style={{ fontWeight: 200 }}\n >\n {cur}\n <Typography.Text\n strong\n key={`${cur}-${index}-strong`}\n style={{ fontWeight: 600 }}\n >\n {searchModule}\n </Typography.Text>\n </Typography.Text>\n );\n }\n return (\n <Typography.Text style={{ fontWeight: 200 }}>\n {cur}\n </Typography.Text>\n );\n })}\n </>\n }\n />\n </Skeleton>\n </List.Item>\n );\n }}\n />\n ) : (\n <Empty />\n )}\n </>\n )}\n </ServerAPIProvider>\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
|
package/dist/utils/file.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Common } from '@rsdoctor/types';
|
|
1
|
+
import { Common, SDK } from '@rsdoctor/types';
|
|
2
2
|
import { TreeNodeProps, UploadFile } from 'antd';
|
|
3
3
|
import { FieldDataNode } from 'rc-tree';
|
|
4
4
|
export type DataNode = FieldDataNode<{
|
|
@@ -32,3 +32,15 @@ export declare function beautifyModulePath(modulePath: string, cwd: string): {
|
|
|
32
32
|
inNodeModules: boolean;
|
|
33
33
|
};
|
|
34
34
|
export declare function getFileIcon(props: TreeNodeProps, addRowIcon?: boolean): import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
type TreeNode = {
|
|
36
|
+
name: string;
|
|
37
|
+
value?: number;
|
|
38
|
+
children?: TreeNode[];
|
|
39
|
+
path?: string;
|
|
40
|
+
sourceSize?: number;
|
|
41
|
+
bundledSize?: number;
|
|
42
|
+
_map?: Map<string, TreeNode>;
|
|
43
|
+
};
|
|
44
|
+
export declare function buildTreemapData(modules: SDK.ModuleData[], rootName?: string): TreeNode;
|
|
45
|
+
export declare function flattenTreemapData(modules: SDK.ModuleData[], rootName?: string): TreeNode;
|
|
46
|
+
export {};
|
package/dist/utils/file.js
CHANGED
|
@@ -177,11 +177,89 @@ function getFileIcon(props, addRowIcon = true) {
|
|
|
177
177
|
}
|
|
178
178
|
return /* @__PURE__ */ jsx(FileOutlined, {});
|
|
179
179
|
}
|
|
180
|
+
function buildTreemapData(modules, rootName = "dist") {
|
|
181
|
+
const root = { name: rootName, children: [], _map: /* @__PURE__ */ new Map() };
|
|
182
|
+
for (const mod of modules) {
|
|
183
|
+
const parts = mod.path.split(/[\\/]/).filter(Boolean);
|
|
184
|
+
let current = root;
|
|
185
|
+
for (let i = 0; i < parts.length; i++) {
|
|
186
|
+
const part = parts[i];
|
|
187
|
+
if (i === parts.length - 1) {
|
|
188
|
+
if (!current.children)
|
|
189
|
+
current.children = [];
|
|
190
|
+
current.children.push({
|
|
191
|
+
name: part,
|
|
192
|
+
path: mod.path,
|
|
193
|
+
sourceSize: mod.size?.sourceSize ?? 0,
|
|
194
|
+
bundledSize: mod.size?.parsedSize ?? 0
|
|
195
|
+
});
|
|
196
|
+
} else {
|
|
197
|
+
if (!current._map)
|
|
198
|
+
current._map = /* @__PURE__ */ new Map();
|
|
199
|
+
let child = current._map.get(part);
|
|
200
|
+
if (!child) {
|
|
201
|
+
child = { name: part, children: [], _map: /* @__PURE__ */ new Map() };
|
|
202
|
+
current.children.push(child);
|
|
203
|
+
current._map.set(part, child);
|
|
204
|
+
}
|
|
205
|
+
current = child;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function clean(node) {
|
|
210
|
+
delete node._map;
|
|
211
|
+
if (node.children)
|
|
212
|
+
node.children.forEach(clean);
|
|
213
|
+
}
|
|
214
|
+
clean(root);
|
|
215
|
+
return root;
|
|
216
|
+
}
|
|
217
|
+
function flattenSingleChildDirs(node) {
|
|
218
|
+
if (!node.children || node.children.length === 0)
|
|
219
|
+
return node;
|
|
220
|
+
let current = node;
|
|
221
|
+
while (current.children && current.children.length === 1 && !current.children[0].sourceSize) {
|
|
222
|
+
current = {
|
|
223
|
+
name: current.name + "/" + current.children[0].name,
|
|
224
|
+
children: current.children[0].children
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (current.children) {
|
|
228
|
+
current.children = current.children.map(flattenSingleChildDirs);
|
|
229
|
+
}
|
|
230
|
+
return current;
|
|
231
|
+
}
|
|
232
|
+
function sumDirValue(node) {
|
|
233
|
+
if (!node.children || node.children.length === 0) {
|
|
234
|
+
return {
|
|
235
|
+
sourceSize: node.sourceSize ?? 0,
|
|
236
|
+
bundledSize: node.bundledSize ?? 0
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
let sourceSum = 0;
|
|
240
|
+
let bundledSum = 0;
|
|
241
|
+
for (const child of node.children) {
|
|
242
|
+
const { sourceSize, bundledSize } = sumDirValue(child);
|
|
243
|
+
sourceSum += sourceSize;
|
|
244
|
+
bundledSum += bundledSize;
|
|
245
|
+
}
|
|
246
|
+
node.sourceSize = sourceSum;
|
|
247
|
+
node.bundledSize = bundledSum;
|
|
248
|
+
return { sourceSize: sourceSum, bundledSize: bundledSum };
|
|
249
|
+
}
|
|
250
|
+
function flattenTreemapData(modules, rootName = "dist") {
|
|
251
|
+
const rawTree = buildTreemapData(modules, rootName);
|
|
252
|
+
const flattenedTree = flattenSingleChildDirs(rawTree);
|
|
253
|
+
sumDirValue(flattenedTree);
|
|
254
|
+
return flattenedTree;
|
|
255
|
+
}
|
|
180
256
|
export {
|
|
181
257
|
beautifyModulePath,
|
|
182
258
|
beautifyPath,
|
|
259
|
+
buildTreemapData,
|
|
183
260
|
createFileStructures,
|
|
184
261
|
flattenDirectory,
|
|
262
|
+
flattenTreemapData,
|
|
185
263
|
getFileIcon,
|
|
186
264
|
mapFileKey,
|
|
187
265
|
readJSONByFileReader,
|
package/dist/utils/file.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../src/utils/file.tsx"],"sourcesContent":["import { get, startsWith } from 'lodash-es';\nimport { Common } from '@rsdoctor/types';\nimport { message, Space, TreeNodeProps, UploadFile } from 'antd';\nimport { FieldDataNode } from 'rc-tree';\nimport {\n FolderOpenTwoTone,\n FolderTwoTone,\n FileOutlined,\n RightOutlined,\n} from '@ant-design/icons';\nimport { getFileCom } from '../components/FileTree';\n\nexport type DataNode = FieldDataNode<{\n key: string | number;\n title?: React.ReactNode | ((data: DataNode) => React.ReactNode);\n}> & { __BASENAME__?: any; __RESOURCEPATH__?: any; children?: DataNode[] };\n\nexport const rootDirname = (file: string, sep = '/'): string | null => {\n const idx = file?.indexOf(sep);\n if (idx === -1) {\n return null;\n }\n if (idx === 0) {\n return sep + (rootDirname(file?.slice(1)) || '');\n }\n return file?.slice(0, idx);\n};\n\nexport function mapFileKey(\n arr: DataNode[],\n depth = 2,\n filter: (node: DataNode) => boolean = () => true,\n): DataNode['key'][] {\n let d = 0;\n const res: DataNode['key'][] = [];\n let parent: DataNode[] = arr;\n while (d < depth) {\n parent.filter(filter).forEach((e) => {\n if (!e.isLeaf) {\n res.push(e.key);\n }\n });\n parent = parent.reduce<DataNode[]>(\n (t, e) => t.concat(e.children || []),\n [],\n );\n if (!parent.length) break;\n d++;\n }\n return res;\n}\n\nconst basenameKey = '__BASENAME__';\n\nexport function flattenDirectory(\n n: DataNode,\n parent: DataNode,\n sep = '/',\n inlinedResourcePathKey: keyof DataNode,\n dirTitle = (_dir: DataNode, defaultTitle: string): JSX.Element | string =>\n defaultTitle,\n) {\n if (n.isLeaf) return;\n if (parent.children && parent.children.length === 1) {\n const defaultTitle = [parent[basenameKey], n[basenameKey]].join(sep);\n parent[inlinedResourcePathKey] = n[inlinedResourcePathKey];\n parent[basenameKey] = defaultTitle;\n parent.key = [parent.key, n.key].join('-');\n parent.children = n.children;\n parent.title = dirTitle(parent, defaultTitle);\n\n n.children &&\n n.children.forEach((c) => {\n flattenDirectory(c, parent, sep, inlinedResourcePathKey, dirTitle);\n });\n } else {\n // parent has more than 1 child.\n n.title = dirTitle(n, n[basenameKey]);\n\n n.children &&\n n.children.forEach((c) => {\n flattenDirectory(c, n, sep, inlinedResourcePathKey, dirTitle);\n });\n }\n}\n\nexport function createFileStructures({\n files,\n sep = '/',\n inlinedResourcePathKey = '__RESOURCEPATH__',\n fileTitle = (_file: string, basename: string) => basename,\n dirTitle = (_dir: DataNode, defaultTitle: string) => defaultTitle,\n page = 'other',\n}: {\n files: string[];\n cwd?: string;\n sep?: string;\n inlinedResourcePathKey?: keyof DataNode;\n dirTitle?(dir: DataNode, defaultTitle: string): JSX.Element | string;\n fileTitle?(file: string, basename: string): JSX.Element | string;\n page?: 'bundle' | 'other';\n}): DataNode[] {\n const sepRegexp = new RegExp(sep);\n\n const res = files.reduce<DataNode>(\n (t, file) => {\n let dir = rootDirname(file, sep);\n let basename = dir ? file?.slice(dir.length + 1) : file;\n let parent: DataNode = t;\n\n while (dir) {\n // find the match directory.\n let exist = parent.children!.find((e) => e.title === dir) as DataNode;\n if (!exist) {\n const p = [parent[inlinedResourcePathKey], dir]\n .filter(Boolean)\n .join(sep);\n exist = {\n title: dir,\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps, false)\n : null,\n // key: [parent.key, parent.children!.length].join('-'),\n key: p,\n children: [],\n [inlinedResourcePathKey]: p,\n [basenameKey]: dir,\n };\n parent.children!.push(exist);\n }\n\n parent = exist;\n dir = rootDirname(basename);\n basename = dir\n ? basename.slice(dir.length).replace(sepRegexp, '')\n : basename;\n }\n\n // uniq\n if (parent.children!.some((e) => get(e, inlinedResourcePathKey) === file))\n return t;\n\n parent.children!.push({\n title() {\n return fileTitle(file, basename);\n },\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps)\n : null,\n key: file,\n isLeaf: true,\n [inlinedResourcePathKey]: file,\n [basenameKey]: basename,\n });\n\n return t;\n },\n { key: '0', children: [] },\n ).children!;\n\n res.forEach((e) => {\n e.children &&\n e.children.forEach((item) =>\n flattenDirectory(item, e, sep, inlinedResourcePathKey, dirTitle),\n );\n });\n\n return res;\n}\n\nexport function beautifyPath(path: string, cwd: string) {\n if (startsWith(path, cwd)) {\n return path.replace(cwd, '.');\n }\n\n return path;\n}\n\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: UploadFile,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: Blob,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: unknown,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const { result } = reader;\n console.log('reader result: ', result);\n try {\n const json = JSON.parse(result!.toString());\n resolve(json);\n } catch (err) {\n message.error('json parse error');\n reject(err);\n }\n };\n reader.onerror = () => {\n const msg = 'upload json file error, please try again.';\n message.error(msg);\n reject(new Error(msg));\n };\n reader.readAsText(((file as UploadFile).originFileObj || file) as Blob);\n });\n}\n\n/**\n * beautify module path, will replace cwd & last 'node_modules'\n */\nexport function beautifyModulePath(modulePath: string, cwd: string) {\n const res = beautifyPath(modulePath, cwd);\n\n const str = '/node_modules/';\n\n const idx = res.lastIndexOf(str);\n\n if (idx > -1) {\n return {\n alias: res.slice(idx + str.length),\n inNodeModules: true,\n };\n }\n\n return {\n alias: res,\n inNodeModules: false,\n };\n}\n\nexport function getFileIcon(props: TreeNodeProps, addRowIcon = true) {\n const { data } = props;\n const expanded = props.expanded;\n if (data?.children) {\n return (\n <Space>\n {addRowIcon ? (\n <RightOutlined\n className={`file-tree-switcher-arrow ${expanded ? 'file-tree-switcher-arrow-expand' : ''}`}\n />\n ) : (\n <></>\n )}\n {expanded ? <FolderOpenTwoTone /> : <FolderTwoTone />}\n </Space>\n );\n }\n if (props.eventKey && typeof props.eventKey === 'string') {\n return getFileCom(props.eventKey);\n }\n return <FileOutlined />;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../src/utils/file.tsx"],"sourcesContent":["import { get, startsWith } from 'lodash-es';\nimport { Common, SDK } from '@rsdoctor/types';\nimport { message, Space, TreeNodeProps, UploadFile } from 'antd';\nimport { FieldDataNode } from 'rc-tree';\nimport {\n FolderOpenTwoTone,\n FolderTwoTone,\n FileOutlined,\n RightOutlined,\n} from '@ant-design/icons';\nimport { getFileCom } from '../components/FileTree';\n\nexport type DataNode = FieldDataNode<{\n key: string | number;\n title?: React.ReactNode | ((data: DataNode) => React.ReactNode);\n}> & { __BASENAME__?: any; __RESOURCEPATH__?: any; children?: DataNode[] };\n\nexport const rootDirname = (file: string, sep = '/'): string | null => {\n const idx = file?.indexOf(sep);\n if (idx === -1) {\n return null;\n }\n if (idx === 0) {\n return sep + (rootDirname(file?.slice(1)) || '');\n }\n return file?.slice(0, idx);\n};\n\nexport function mapFileKey(\n arr: DataNode[],\n depth = 2,\n filter: (node: DataNode) => boolean = () => true,\n): DataNode['key'][] {\n let d = 0;\n const res: DataNode['key'][] = [];\n let parent: DataNode[] = arr;\n while (d < depth) {\n parent.filter(filter).forEach((e) => {\n if (!e.isLeaf) {\n res.push(e.key);\n }\n });\n parent = parent.reduce<DataNode[]>(\n (t, e) => t.concat(e.children || []),\n [],\n );\n if (!parent.length) break;\n d++;\n }\n return res;\n}\n\nconst basenameKey = '__BASENAME__';\n\nexport function flattenDirectory(\n n: DataNode,\n parent: DataNode,\n sep = '/',\n inlinedResourcePathKey: keyof DataNode,\n dirTitle = (_dir: DataNode, defaultTitle: string): JSX.Element | string =>\n defaultTitle,\n) {\n if (n.isLeaf) return;\n if (parent.children && parent.children.length === 1) {\n const defaultTitle = [parent[basenameKey], n[basenameKey]].join(sep);\n parent[inlinedResourcePathKey] = n[inlinedResourcePathKey];\n parent[basenameKey] = defaultTitle;\n parent.key = [parent.key, n.key].join('-');\n parent.children = n.children;\n parent.title = dirTitle(parent, defaultTitle);\n\n n.children &&\n n.children.forEach((c) => {\n flattenDirectory(c, parent, sep, inlinedResourcePathKey, dirTitle);\n });\n } else {\n // parent has more than 1 child.\n n.title = dirTitle(n, n[basenameKey]);\n\n n.children &&\n n.children.forEach((c) => {\n flattenDirectory(c, n, sep, inlinedResourcePathKey, dirTitle);\n });\n }\n}\n\nexport function createFileStructures({\n files,\n sep = '/',\n inlinedResourcePathKey = '__RESOURCEPATH__',\n fileTitle = (_file: string, basename: string) => basename,\n dirTitle = (_dir: DataNode, defaultTitle: string) => defaultTitle,\n page = 'other',\n}: {\n files: string[];\n cwd?: string;\n sep?: string;\n inlinedResourcePathKey?: keyof DataNode;\n dirTitle?(dir: DataNode, defaultTitle: string): JSX.Element | string;\n fileTitle?(file: string, basename: string): JSX.Element | string;\n page?: 'bundle' | 'other';\n}): DataNode[] {\n const sepRegexp = new RegExp(sep);\n\n const res = files.reduce<DataNode>(\n (t, file) => {\n let dir = rootDirname(file, sep);\n let basename = dir ? file?.slice(dir.length + 1) : file;\n let parent: DataNode = t;\n\n while (dir) {\n // find the match directory.\n let exist = parent.children!.find((e) => e.title === dir) as DataNode;\n if (!exist) {\n const p = [parent[inlinedResourcePathKey], dir]\n .filter(Boolean)\n .join(sep);\n exist = {\n title: dir,\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps, false)\n : null,\n // key: [parent.key, parent.children!.length].join('-'),\n key: p,\n children: [],\n [inlinedResourcePathKey]: p,\n [basenameKey]: dir,\n };\n parent.children!.push(exist);\n }\n\n parent = exist;\n dir = rootDirname(basename);\n basename = dir\n ? basename.slice(dir.length).replace(sepRegexp, '')\n : basename;\n }\n\n // uniq\n if (parent.children!.some((e) => get(e, inlinedResourcePathKey) === file))\n return t;\n\n parent.children!.push({\n title() {\n return fileTitle(file, basename);\n },\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps)\n : null,\n key: file,\n isLeaf: true,\n [inlinedResourcePathKey]: file,\n [basenameKey]: basename,\n });\n\n return t;\n },\n { key: '0', children: [] },\n ).children!;\n\n res.forEach((e) => {\n e.children &&\n e.children.forEach((item) =>\n flattenDirectory(item, e, sep, inlinedResourcePathKey, dirTitle),\n );\n });\n\n return res;\n}\n\nexport function beautifyPath(path: string, cwd: string) {\n if (startsWith(path, cwd)) {\n return path.replace(cwd, '.');\n }\n\n return path;\n}\n\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: UploadFile,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: Blob,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: unknown,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const { result } = reader;\n console.log('reader result: ', result);\n try {\n const json = JSON.parse(result!.toString());\n resolve(json);\n } catch (err) {\n message.error('json parse error');\n reject(err);\n }\n };\n reader.onerror = () => {\n const msg = 'upload json file error, please try again.';\n message.error(msg);\n reject(new Error(msg));\n };\n reader.readAsText(((file as UploadFile).originFileObj || file) as Blob);\n });\n}\n\n/**\n * beautify module path, will replace cwd & last 'node_modules'\n */\nexport function beautifyModulePath(modulePath: string, cwd: string) {\n const res = beautifyPath(modulePath, cwd);\n\n const str = '/node_modules/';\n\n const idx = res.lastIndexOf(str);\n\n if (idx > -1) {\n return {\n alias: res.slice(idx + str.length),\n inNodeModules: true,\n };\n }\n\n return {\n alias: res,\n inNodeModules: false,\n };\n}\n\nexport function getFileIcon(props: TreeNodeProps, addRowIcon = true) {\n const { data } = props;\n const expanded = props.expanded;\n if (data?.children) {\n return (\n <Space>\n {addRowIcon ? (\n <RightOutlined\n className={`file-tree-switcher-arrow ${expanded ? 'file-tree-switcher-arrow-expand' : ''}`}\n />\n ) : (\n <></>\n )}\n {expanded ? <FolderOpenTwoTone /> : <FolderTwoTone />}\n </Space>\n );\n }\n if (props.eventKey && typeof props.eventKey === 'string') {\n return getFileCom(props.eventKey);\n }\n return <FileOutlined />;\n}\n\ntype TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n // Internal helper, not exported\n _map?: Map<string, TreeNode>;\n};\n\nexport function buildTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const root: TreeNode = { name: rootName, children: [], _map: new Map() };\n\n for (const mod of modules) {\n const parts = mod.path.split(/[\\\\/]/).filter(Boolean);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (i === parts.length - 1) {\n // File node\n if (!current.children) current.children = [];\n current.children.push({\n name: part,\n path: mod.path,\n sourceSize: mod.size?.sourceSize ?? 0,\n bundledSize: mod.size?.parsedSize ?? 0,\n });\n } else {\n // Directory node\n if (!current._map) current._map = new Map();\n let child = current._map.get(part);\n if (!child) {\n child = { name: part, children: [], _map: new Map() };\n current.children!.push(child);\n current._map.set(part, child);\n }\n current = child;\n }\n }\n }\n\n // Clean up _map property\n function clean(node: TreeNode) {\n delete node._map;\n if (node.children) node.children.forEach(clean);\n }\n clean(root);\n\n return root;\n}\n\nfunction flattenSingleChildDirs(node: TreeNode): TreeNode {\n // Return directly if leaf node\n if (!node.children || node.children.length === 0) return node;\n\n let current = node;\n // As long as children has only one child and it's not a leaf, merge\n while (\n current.children &&\n current.children.length === 1 &&\n !current.children[0].sourceSize // Not a leaf\n ) {\n current = {\n name: current.name + '/' + current.children[0].name,\n children: current.children[0].children,\n };\n }\n\n // Recursively process all child nodes\n if (current.children) {\n current.children = current.children.map(flattenSingleChildDirs);\n }\n return current;\n}\n\nfunction sumDirValue(node: TreeNode): {\n sourceSize: number;\n bundledSize: number;\n} {\n if (!node.children || node.children.length === 0) {\n // Leaf node, just return value\n return {\n sourceSize: node.sourceSize ?? 0,\n bundledSize: node.bundledSize ?? 0,\n };\n }\n // Recursively sum all child nodes\n let sourceSum = 0;\n let bundledSum = 0;\n for (const child of node.children) {\n const { sourceSize, bundledSize } = sumDirValue(child);\n sourceSum += sourceSize;\n bundledSum += bundledSize;\n }\n node.sourceSize = sourceSum;\n node.bundledSize = bundledSum;\n return { sourceSize: sourceSum, bundledSize: bundledSum };\n}\n\nexport function flattenTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const rawTree = buildTreemapData(modules, rootName);\n const flattenedTree = flattenSingleChildDirs(rawTree);\n sumDirValue(flattenedTree); // Recursive sum\n return flattenedTree;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
|
package/dist/utils/i18n/cn.js
CHANGED
|
@@ -32,7 +32,9 @@ const cn = {
|
|
|
32
32
|
CodeModeExplain: "Lite 模式下或纯 stats.json 上传的情况下只有 source code.",
|
|
33
33
|
DuplicatePakCodeExplain: "纯 stats.json 输入的情况下没有代码,可使用 Rsdoctor 插件参与构建会有对应代码。",
|
|
34
34
|
AsyncLoaderInfo: "对于异步 loader,单个 loader 的耗时可能不准确。例如:mini-css-extract-plugin 的 loader。",
|
|
35
|
-
Details: "详情"
|
|
35
|
+
Details: "详情",
|
|
36
|
+
Expand: "展开",
|
|
37
|
+
Collapse: "收起"
|
|
36
38
|
};
|
|
37
39
|
var cn_default = cn;
|
|
38
40
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"AAEA,MAAM,KAAgB;AAAA,EACpB,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,yBAAyB;AAAA,EACzB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBACE;AAAA,EACF,oBACE;AAAA,EAEF,gEACE;AAAA;AAAA,EAGF,sBAAsB;AAAA,EACtB,uEACE;AAAA,EACF,iEACE;AAAA,EACF,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,yBACE;AAAA,EACF,iBACE;AAAA,EACF,SAAS;
|
|
1
|
+
{"version":3,"mappings":"AAEA,MAAM,KAAgB;AAAA,EACpB,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,yBAAyB;AAAA,EACzB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBACE;AAAA,EACF,oBACE;AAAA,EAEF,gEACE;AAAA;AAAA,EAGF,sBAAsB;AAAA,EACtB,uEACE;AAAA,EACF,iEACE;AAAA,EACF,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,yBACE;AAAA,EACF,iBACE;AAAA,EACF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AACZ;AAEA,IAAO,aAAQ","names":[],"ignoreList":[],"sources":["../../../src/utils/i18n/cn.ts"],"sourcesContent":["import en from './en';\n// TODO: fix this\nconst cn: typeof en = {\n Overall: '概览',\n 'Compile Analysis': '编译分析',\n 'Bundle Alerts': '编译预警',\n 'Help Center': '帮助中心',\n 'Rsdoctor Introduction': 'Rsdoctor 介绍',\n 'Compilation Alerts': '编译预警',\n 'Plugins Analysis': 'Plugins 分析',\n LoadersAnalysis: 'Loaders 分析',\n 'Loaders Timeline': 'Loaders 概览',\n 'Loaders Analysis': 'Loaders 分析',\n PluginsAnalysis: 'Plugins 分析',\n ModuleResolve: 'Module Resolve 分析',\n 'Bundle Analysis': '产物分析',\n BundleSize: '产物体积分析',\n 'Module Graph': 'Module Graph',\n TreeShaking: 'Tree Shaking',\n 'Rule Index': '错误索引信息',\n Resources: '资源',\n 'Project Overall': '项目信息概览',\n 'Compile Overall': '编译数据概览',\n 'Bundle Overall': '产物数据概览',\n 'Expand Omitted':\n ' reasons 树会默认折叠中间的第三方引入的模块,点击这个图标可以查看完整树图',\n 'Concatenated Tag':\n '串联模块,hover 上去可以显示聚合成的主模块名称。注:聚合模块 bundled size 为零,有可能是因为被聚合到了主模块中。',\n\n 'the file content not changed after transpiled by this loader':\n '该文件内容在 loader 处理前后没有发生变化',\n\n /** Bundle Size */\n 'Output Assets List': '产物文件列表',\n 'filter the output assets which size is greater than the input value':\n '筛选大小大于输入值的产物文件',\n 'filter the modules which size is greater than the input value':\n '筛选大小大于输入值的模块',\n 'After Compile': '编译后',\n 'After Bundle': '打包后',\n CodeModeExplain: 'Lite 模式下或纯 stats.json 上传的情况下只有 source code.',\n DuplicatePakCodeExplain:\n '纯 stats.json 输入的情况下没有代码,可使用 Rsdoctor 插件参与构建会有对应代码。',\n AsyncLoaderInfo:\n '对于异步 loader,单个 loader 的耗时可能不准确。例如:mini-css-extract-plugin 的 loader。',\n Details: '详情',\n Expand: '展开',\n Collapse: '收起',\n};\n\nexport default cn;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
|
package/dist/utils/i18n/en.d.ts
CHANGED
package/dist/utils/i18n/en.js
CHANGED
|
@@ -32,7 +32,9 @@ const en = {
|
|
|
32
32
|
CodeModeExplain: "In lite mode or pure stats.json upload, only source code.",
|
|
33
33
|
DuplicatePakCodeExplain: "There is no code, when in the case of pure stats.json.",
|
|
34
34
|
AsyncLoaderInfo: "For async loaders, the time cost of each loader is not accurate. For example: mini-css-extract-plugin's loader.",
|
|
35
|
-
Details: "Details"
|
|
35
|
+
Details: "Details",
|
|
36
|
+
Expand: "Expand",
|
|
37
|
+
Collapse: "Collapse"
|
|
36
38
|
};
|
|
37
39
|
var en_default = en;
|
|
38
40
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"AACA,MAAM,KAAK;AAAA,EACT,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBACE;AAAA,EACF,oBACE;AAAA,EAEF,gEACE;AAAA;AAAA,EAGF,sBAAsB;AAAA,EACtB,uEACE;AAAA,EACF,iEACE;AAAA,EACF,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,yBACE;AAAA,EACF,iBACE;AAAA,EACF,SAAS;
|
|
1
|
+
{"version":3,"mappings":"AACA,MAAM,KAAK;AAAA,EACT,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBACE;AAAA,EACF,oBACE;AAAA,EAEF,gEACE;AAAA;AAAA,EAGF,sBAAsB;AAAA,EACtB,uEACE;AAAA,EACF,iEACE;AAAA,EACF,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,yBACE;AAAA,EACF,iBACE;AAAA,EACF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AACZ;AAEA,IAAO,aAAQ","names":[],"ignoreList":[],"sources":["../../../src/utils/i18n/en.ts"],"sourcesContent":["// TODO: fix this\nconst en = {\n Overall: 'Overall',\n 'Compile Analysis': 'Compile Analysis',\n 'Bundle Alerts': 'Bundle Alerts',\n 'Help Center': 'Help Center',\n LoadersAnalysis: 'Loaders Analysis',\n 'Loaders Timeline': 'Loaders Timeline',\n 'Loaders Analysis': 'Loaders Analysis',\n 'Rsdoctor Introduction': 'Rsdoctor Introduction',\n 'Compilation Alerts': 'Compilation Alerts',\n 'Plugins Analysis': 'Plugins Analysis',\n PluginsAnalysis: 'Plugins Analysis',\n ModuleResolve: 'Module Resolve',\n 'Bundle Analysis': 'Bundle Analysis',\n BundleSize: 'Bundle Size',\n 'Module Graph': 'Module Graph',\n TreeShaking: 'Tree Shaking',\n 'Rule Index': 'Rule Index',\n Resources: 'Resources',\n 'Project Overall': 'Project Overall',\n 'Compile Overall': 'Compile Overall',\n 'Bundle Overall': 'Bundle Overall',\n 'Expand Omitted':\n 'By default, the reasons tree collapses to the middle of the module introduced by a third party. Click on this icon to view the full tree diagram',\n 'Concatenated Tag':\n 'Concatenated Module,hover can display the name of the concatenated main module. Note: the bundled size of the concatenated module is zero, possibly because it is aggregated into the main module.',\n\n 'the file content not changed after transpiled by this loader':\n 'the file content not changed after transpiled by this loader',\n\n /** Bundle Size */\n 'Output Assets List': 'Output Assets List',\n 'filter the output assets which size is greater than the input value':\n 'filter the output assets which size is greater than the input value',\n 'filter the modules which size is greater than the input value':\n 'filter the modules which size is greater than the input value',\n 'After Compile': 'After Compile',\n 'After Bundle': 'After Bundle',\n CodeModeExplain: 'In lite mode or pure stats.json upload, only source code.',\n DuplicatePakCodeExplain:\n 'There is no code, when in the case of pure stats.json.',\n AsyncLoaderInfo:\n \"For async loaders, the time cost of each loader is not accurate. For example: mini-css-extract-plugin's loader.\",\n Details: 'Details',\n Expand: 'Expand',\n Collapse: 'Collapse',\n};\n\nexport default en;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdoctor/components",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.6",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -74,9 +74,9 @@
|
|
|
74
74
|
"react-router-dom": "6.4.3",
|
|
75
75
|
"socket.io-client": "4.6.1",
|
|
76
76
|
"url-parse": "1.5.10",
|
|
77
|
-
"@rsdoctor/graph": "1.1.
|
|
78
|
-
"@rsdoctor/utils": "1.1.
|
|
79
|
-
"@rsdoctor/types": "1.1.
|
|
77
|
+
"@rsdoctor/graph": "1.1.6",
|
|
78
|
+
"@rsdoctor/utils": "1.1.6",
|
|
79
|
+
"@rsdoctor/types": "1.1.6"
|
|
80
80
|
},
|
|
81
81
|
"publishConfig": {
|
|
82
82
|
"access": "public",
|