@rsdoctor/components 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Manifest/api.mjs +10 -1
- package/dist/components/Manifest/api.mjs.map +1 -1
- package/dist/components/Overall/project.mjs +1 -1
- package/dist/components/Overall/project.mjs.map +1 -1
- package/dist/pages/Overall/index_module.css.map +1 -1
- package/dist/utils/file.mjs +0 -1
- package/dist/utils/file.mjs.map +1 -1
- package/dist/utils/request.mjs +8 -5
- package/dist/utils/request.mjs.map +1 -1
- package/package.json +11 -11
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import { Constants, SDK } from "@rsdoctor/types";
|
|
2
|
+
import { Client, Constants, SDK } from "@rsdoctor/types";
|
|
3
3
|
import { Skeleton, Spin } from "antd";
|
|
4
4
|
import { useCallback, useEffect, useState } from "react";
|
|
5
5
|
import { isEqual } from "es-toolkit/compat";
|
|
@@ -7,6 +7,10 @@ import { fetchManifest, useDataLoader } from "../../utils/index.mjs";
|
|
|
7
7
|
import { ComponentState } from "../../constants.mjs";
|
|
8
8
|
import { FailedStatus } from "../Status/index.mjs";
|
|
9
9
|
import { Lodash } from "@rsdoctor/utils/common";
|
|
10
|
+
function isUploaderRoute() {
|
|
11
|
+
if ("u" < typeof window) return false;
|
|
12
|
+
return window.location.hash.includes(Client.RsdoctorClientRoutes.Uploader);
|
|
13
|
+
}
|
|
10
14
|
const ServerAPIProvider = (props)=>{
|
|
11
15
|
const { manifestLoader = fetchManifest, api, children, body = null, showSkeleton = true, fallbackComponent } = props;
|
|
12
16
|
let promise;
|
|
@@ -57,6 +61,11 @@ const ServerAPIProvider = (props)=>{
|
|
|
57
61
|
return pro.then((manifest)=>{
|
|
58
62
|
setManifest(manifest);
|
|
59
63
|
}).catch((err)=>{
|
|
64
|
+
if (isUploaderRoute()) {
|
|
65
|
+
console.warn('[ServerAPIProvider] Failed to load manifest for uploader route, continuing with empty manifest:', err);
|
|
66
|
+
setState(ComponentState.Success);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
60
69
|
setState(ComponentState.Fail);
|
|
61
70
|
throw err;
|
|
62
71
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/Manifest/api.mjs","sources":["../../../src/components/Manifest/api.tsx"],"sourcesContent":["import { Constants, Manifest, SDK } from '@rsdoctor/types';\nimport { Skeleton, Spin } from 'antd';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { isEqual } from 'es-toolkit/compat';\nimport { fetchManifest, useDataLoader } from '../../utils';\nimport { ComponentState } from '../../constants';\nimport { FailedStatus } from '../Status';\nimport { BaseDataLoader } from '../../utils/data/base';\nimport { Lodash } from '@rsdoctor/utils/common';\n\nexport type InferServerAPIBody<T> =\n SDK.ServerAPI.InferRequestBodyType<T> extends void\n ? {\n // use `any` to avoid ts check when need not to define the body in this component.\n body?: any;\n }\n : {\n body: SDK.ServerAPI.InferRequestBodyType<T>;\n };\n\ntype ServerAPIProviderProps<\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n> = {\n manifestLoader?: () => Promise<Manifest.RsdoctorManifestWithShardingFiles>;\n api: T;\n children: (response: SDK.ServerAPI.InferResponseType<T>) => JSX.Element;\n fallbackComponent?: React.FC;\n showSkeleton?: boolean;\n} & InferServerAPIBody<T>;\n\n/**\n * this component will request server api to the sdk of Rsdoctor in local development.\n * otherwise it will fallback to load full manifest for the data.\n *\n * @example usage\n * <ServerAPIProvider {...props}>\n * {(response) => {\n * <Component {...}></Component>\n * }}\n * </ServerAPIProvider>\n */\nexport const ServerAPIProvider = <\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n>(\n props: ServerAPIProviderProps<T>,\n): JSX.Element | null => {\n const {\n manifestLoader = fetchManifest,\n api,\n children,\n // default value of \"body\" must be \"null\" to avoid the response type not match when the socket received message.\n body = null,\n showSkeleton = true,\n fallbackComponent,\n } = props;\n let promise: Promise<Manifest.RsdoctorManifestWithShardingFiles>;\n\n const [manifest, setManifest] =\n useState<Manifest.RsdoctorManifestWithShardingFiles>();\n const [state, setState] = useState(ComponentState.Pending);\n const [res, setRes] = useState({} as SDK.ServerAPI.InferResponseType<T>);\n\n const { loader } = useDataLoader(manifest);\n\n function init(loader: BaseDataLoader | void) {\n if (window[Constants.WINDOW_RSDOCTOR_TAG]) {\n executeLoader(loader);\n } else {\n promise = manifestLoader();\n ensureManifest(promise).then(() => {\n executeLoader(loader);\n });\n }\n }\n\n const update = useCallback(\n ({ req, res: response }: SDK.ServerAPI.SocketResponseType<T>) => {\n if (req.api === api) {\n // body is equal.\n // both two body are null or undefined.\n if (\n isEqual(req.body, body) ||\n (Lodash.isNil(req.body) && Lodash.isNil(body))\n ) {\n if (!isEqual(res, response)) {\n setRes(response);\n }\n }\n }\n // make sure update successful.\n setState(ComponentState.Success);\n },\n [res, api, body],\n );\n\n useEffect(() => {\n init(loader);\n }, [loader, api, body]);\n\n useEffect(() => {\n if (!loader) return;\n // add update event listener\n loader.onDataUpdate(api, update);\n return () => {\n // remove update event when the component unmount.\n loader.removeOnDataUpdate(api, update);\n };\n }, [loader, api, body]);\n\n function ensureManifest(\n pro: Promise<Manifest.RsdoctorManifestWithShardingFiles>,\n ) {\n return pro\n .then((manifest) => {\n setManifest(manifest);\n })\n .catch((err) => {\n setState(ComponentState.Fail);\n throw err;\n });\n }\n\n function executeLoader(loader: BaseDataLoader | void) {\n if (!loader) return;\n\n const exts = Object.values(SDK.ServerAPI.APIExtends);\n\n // extends api will wait for update only.\n if (exts.includes(api as SDK.ServerAPI.APIExtends)) {\n // extends api need to handle \"undefined\" response inside component.\n setState(ComponentState.Success);\n return;\n }\n\n loader\n .loadAPI(api as SDK.ServerAPI.API, body)\n .then((e) => {\n // if (process.env.NODE_ENV === 'development') {\n // console.log('[ServerAPIProvider] props: ', e, api, loader);\n // }\n // maybe the data not prepared.\n if (Lodash.isNil(e)) {\n return;\n }\n setRes(e as SDK.ServerAPI.InferResponseType<T>);\n setState(ComponentState.Success);\n })\n .catch((err) => {\n console.error(err);\n setState(ComponentState.Fail);\n });\n }\n\n if (state === ComponentState.Pending) {\n return showSkeleton ? <Skeleton active /> : null;\n }\n\n if (state === ComponentState.Fail) {\n if (fallbackComponent)\n return fallbackComponent as unknown as React.ReactElement;\n\n return (\n <FailedStatus\n retry={() => {\n setState(ComponentState.Pending);\n promise = manifestLoader();\n init();\n }}\n />\n );\n }\n\n if (state === ComponentState.Updating) {\n return <Spin spinning>{children(res)}</Spin>;\n }\n\n return children(res);\n};\n\nexport function withServerAPI<\n T,\n P extends keyof T,\n A extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n>({\n Component,\n api,\n responsePropName,\n body: bodyInRoot,\n fallbackComponent,\n showSkeleton,\n}: {\n Component: React.FC<T>;\n api: A;\n responsePropName: P;\n fallbackComponent?: React.FC;\n showSkeleton?: boolean;\n} & Partial<Partial<InferServerAPIBody<A>>>): React.FC<\n Omit<T, P> & Partial<InferServerAPIBody<A>>\n> {\n return function _(props) {\n const { body = bodyInRoot, ...rest } = props;\n\n return (\n // @ts-ignore\n <ServerAPIProvider\n api={api}\n body={body}\n showSkeleton={showSkeleton}\n fallbackComponent={fallbackComponent}\n >\n {(res) => {\n const _props = {\n ...rest,\n [responsePropName]: res,\n } as T & JSX.IntrinsicAttributes;\n\n return <Component {..._props} />;\n }}\n </ServerAPIProvider>\n );\n };\n}\n"],"names":["ServerAPIProvider","props","manifestLoader","fetchManifest","api","children","body","showSkeleton","fallbackComponent","promise","manifest","setManifest","useState","state","setState","ComponentState","res","setRes","loader","useDataLoader","init","window","Constants","executeLoader","ensureManifest","update","useCallback","req","response","isEqual","Lodash","useEffect","pro","err","exts","Object","SDK","e","console","Skeleton","FailedStatus","Spin","withServerAPI","Component","responsePropName","bodyInRoot","rest","_props"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components/Manifest/api.mjs","sources":["../../../src/components/Manifest/api.tsx"],"sourcesContent":["import { Constants, Manifest, SDK } from '@rsdoctor/types';\nimport { Skeleton, Spin } from 'antd';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { isEqual } from 'es-toolkit/compat';\nimport { fetchManifest, useDataLoader } from '../../utils';\nimport { ComponentState } from '../../constants';\nimport { FailedStatus } from '../Status';\nimport { BaseDataLoader } from '../../utils/data/base';\nimport { Lodash } from '@rsdoctor/utils/common';\nimport { Client } from '@rsdoctor/types';\n\n/**\n * Checks if the current route is uploader route\n */\nfunction isUploaderRoute(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n return window.location.hash.includes(Client.RsdoctorClientRoutes.Uploader);\n}\n\nexport type InferServerAPIBody<T> =\n SDK.ServerAPI.InferRequestBodyType<T> extends void\n ? {\n // use `any` to avoid ts check when need not to define the body in this component.\n body?: any;\n }\n : {\n body: SDK.ServerAPI.InferRequestBodyType<T>;\n };\n\ntype ServerAPIProviderProps<\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n> = {\n manifestLoader?: () => Promise<Manifest.RsdoctorManifestWithShardingFiles>;\n api: T;\n children: (response: SDK.ServerAPI.InferResponseType<T>) => JSX.Element;\n fallbackComponent?: React.FC;\n showSkeleton?: boolean;\n} & InferServerAPIBody<T>;\n\n/**\n * this component will request server api to the sdk of Rsdoctor in local development.\n * otherwise it will fallback to load full manifest for the data.\n *\n * @example usage\n * <ServerAPIProvider {...props}>\n * {(response) => {\n * <Component {...}></Component>\n * }}\n * </ServerAPIProvider>\n */\nexport const ServerAPIProvider = <\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n>(\n props: ServerAPIProviderProps<T>,\n): JSX.Element | null => {\n const {\n manifestLoader = fetchManifest,\n api,\n children,\n // default value of \"body\" must be \"null\" to avoid the response type not match when the socket received message.\n body = null,\n showSkeleton = true,\n fallbackComponent,\n } = props;\n let promise: Promise<Manifest.RsdoctorManifestWithShardingFiles>;\n\n const [manifest, setManifest] =\n useState<Manifest.RsdoctorManifestWithShardingFiles>();\n const [state, setState] = useState(ComponentState.Pending);\n const [res, setRes] = useState({} as SDK.ServerAPI.InferResponseType<T>);\n\n const { loader } = useDataLoader(manifest);\n\n function init(loader: BaseDataLoader | void) {\n if (window[Constants.WINDOW_RSDOCTOR_TAG]) {\n executeLoader(loader);\n } else {\n promise = manifestLoader();\n ensureManifest(promise).then(() => {\n executeLoader(loader);\n });\n }\n }\n\n const update = useCallback(\n ({ req, res: response }: SDK.ServerAPI.SocketResponseType<T>) => {\n if (req.api === api) {\n // body is equal.\n // both two body are null or undefined.\n if (\n isEqual(req.body, body) ||\n (Lodash.isNil(req.body) && Lodash.isNil(body))\n ) {\n if (!isEqual(res, response)) {\n setRes(response);\n }\n }\n }\n // make sure update successful.\n setState(ComponentState.Success);\n },\n [res, api, body],\n );\n\n useEffect(() => {\n init(loader);\n }, [loader, api, body]);\n\n useEffect(() => {\n if (!loader) return;\n // add update event listener\n loader.onDataUpdate(api, update);\n return () => {\n // remove update event when the component unmount.\n loader.removeOnDataUpdate(api, update);\n };\n }, [loader, api, body]);\n\n function ensureManifest(\n pro: Promise<Manifest.RsdoctorManifestWithShardingFiles>,\n ) {\n return pro\n .then((manifest) => {\n setManifest(manifest);\n })\n .catch((err) => {\n // If route is uploader, set empty manifest and continue instead of failing\n if (isUploaderRoute()) {\n console.warn(\n '[ServerAPIProvider] Failed to load manifest for uploader route, continuing with empty manifest:',\n err,\n );\n setState(ComponentState.Success);\n return;\n }\n setState(ComponentState.Fail);\n throw err;\n });\n }\n\n function executeLoader(loader: BaseDataLoader | void) {\n if (!loader) {\n return;\n }\n\n const exts = Object.values(SDK.ServerAPI.APIExtends);\n\n // extends api will wait for update only.\n if (exts.includes(api as SDK.ServerAPI.APIExtends)) {\n // extends api need to handle \"undefined\" response inside component.\n setState(ComponentState.Success);\n return;\n }\n\n loader\n .loadAPI(api as SDK.ServerAPI.API, body)\n .then((e) => {\n // if (process.env.NODE_ENV === 'development') {\n // console.log('[ServerAPIProvider] props: ', e, api, loader);\n // }\n // maybe the data not prepared.\n if (Lodash.isNil(e)) {\n return;\n }\n setRes(e as SDK.ServerAPI.InferResponseType<T>);\n setState(ComponentState.Success);\n })\n .catch((err) => {\n console.error(err);\n setState(ComponentState.Fail);\n });\n }\n\n if (state === ComponentState.Pending) {\n return showSkeleton ? <Skeleton active /> : null;\n }\n\n if (state === ComponentState.Fail) {\n if (fallbackComponent)\n return fallbackComponent as unknown as React.ReactElement;\n\n return (\n <FailedStatus\n retry={() => {\n setState(ComponentState.Pending);\n promise = manifestLoader();\n init();\n }}\n />\n );\n }\n\n if (state === ComponentState.Updating) {\n return <Spin spinning>{children(res)}</Spin>;\n }\n\n return children(res);\n};\n\nexport function withServerAPI<\n T,\n P extends keyof T,\n A extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n>({\n Component,\n api,\n responsePropName,\n body: bodyInRoot,\n fallbackComponent,\n showSkeleton,\n}: {\n Component: React.FC<T>;\n api: A;\n responsePropName: P;\n fallbackComponent?: React.FC;\n showSkeleton?: boolean;\n} & Partial<Partial<InferServerAPIBody<A>>>): React.FC<\n Omit<T, P> & Partial<InferServerAPIBody<A>>\n> {\n return function _(props) {\n const { body = bodyInRoot, ...rest } = props;\n\n return (\n // @ts-ignore\n <ServerAPIProvider\n api={api}\n body={body}\n showSkeleton={showSkeleton}\n fallbackComponent={fallbackComponent}\n >\n {(res) => {\n const _props = {\n ...rest,\n [responsePropName]: res,\n } as T & JSX.IntrinsicAttributes;\n\n return <Component {..._props} />;\n }}\n </ServerAPIProvider>\n );\n };\n}\n"],"names":["isUploaderRoute","window","Client","ServerAPIProvider","props","manifestLoader","fetchManifest","api","children","body","showSkeleton","fallbackComponent","promise","manifest","setManifest","useState","state","setState","ComponentState","res","setRes","loader","useDataLoader","init","Constants","executeLoader","ensureManifest","update","useCallback","req","response","isEqual","Lodash","useEffect","pro","err","console","exts","Object","SDK","e","Skeleton","FailedStatus","Spin","withServerAPI","Component","responsePropName","bodyInRoot","rest","_props"],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ const ProjectOverall = ({ configs = [], cwd, envinfo, alerts = [], name })=>{
|
|
|
22
22
|
children: name
|
|
23
23
|
}
|
|
24
24
|
] : [],
|
|
25
|
-
...Object.keys(envinfo).map((key)=>{
|
|
25
|
+
...Object.keys(envinfo || {}).map((key)=>{
|
|
26
26
|
const regexp = /Version$/;
|
|
27
27
|
const isVersion = regexp.test(key);
|
|
28
28
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/Overall/project.mjs","sources":["../../../src/components/Overall/project.tsx"],"sourcesContent":["import { Descriptions, DescriptionsProps, Avatar } from 'antd';\nimport {\n CloseCircleFilled,\n WarningFilled,\n FileFilled,\n ExperimentFilled,\n} from '@ant-design/icons';\n\nimport { ServerAPIProvider } from '../Manifest';\nimport { useI18n, formatSize } from '../../utils';\nimport { WebpackConfigurationViewer } from '../Configuration';\nimport { Card } from '../Card';\nimport { Overview } from './overview';\nimport styles from './project.module.scss';\n\nimport listStyles from './list.module.scss';\nimport cardStyles from './card.module.scss';\nimport projectStyles from './project.module.scss';\n\nimport { SDK } from '@rsdoctor/types';\n\nexport const ProjectOverall: React.FC<{\n configs: SDK.ConfigData;\n cwd: string;\n envinfo: SDK.EnvInfo;\n alerts: SDK.ErrorsData;\n name?: string;\n}> = ({ configs = [], cwd, envinfo, alerts = [], name }) => {\n const { t } = useI18n();\n\n const warns = alerts.filter((e) => e.level === 'warn').length;\n\n const errors = alerts.length - warns;\n\n const items: DescriptionsProps['items'] = [\n ...(name\n ? [\n {\n key: 'name',\n label: 'Builder',\n children: name,\n },\n ]\n : []),\n ...Object.keys(envinfo).map((key) => {\n const regexp = /Version$/;\n const isVersion = regexp.test(key);\n return {\n key,\n label: isVersion ? key.replace(regexp, '') : key,\n children: envinfo ? envinfo[key] : undefined,\n };\n }),\n ...configs\n .filter((item) => !!item.version)\n .map((config) => {\n const { name: configName, version } = config;\n return {\n key: configName,\n label: configName,\n children: version,\n };\n }),\n {\n key: 'cwd',\n label: 'cwd',\n children: cwd,\n },\n ];\n\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetAssetsSummary}\n body={{ withFileContent: false }}\n >\n {(res) => {\n const totalSizeStr = formatSize(res.all.total.size);\n const totalFiles = res.all.total.count;\n const [size, unit] = totalSizeStr.split(' ');\n const overViewData = [\n {\n title: 'Errors',\n description: <span style={{ color: '#FF4D4F' }}>{errors}</span>,\n icon: (\n <Avatar\n style={{ background: '#FF4D4F' }}\n shape=\"circle\"\n icon={<CloseCircleFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Warnings',\n description: <span style={{ color: '#FAAD14' }}>{warns}</span>,\n icon: (\n <Avatar\n style={{ background: '#FAAD14' }}\n shape=\"circle\"\n icon={<WarningFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Total Files',\n description: <span>{totalFiles}</span>,\n icon: (\n <Avatar\n style={{ background: '#3874F6' }}\n shape=\"circle\"\n icon={<FileFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Total Size',\n description: (\n <>\n <span style={{ fontSize: '20px' }}>{size}</span>\n <span style={{ fontSize: '13px', marginLeft: '5px' }}>\n {unit}\n </span>\n </>\n ),\n icon: (\n <Avatar\n style={{ background: 'rgba(226, 129, 73)' }}\n shape=\"circle\"\n icon={<ExperimentFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n ];\n\n return (\n <Card className={cardStyles.card}>\n <div>\n <div className={styles.title}>\n <span className={styles.left}>{t('Project Overall')}</span>\n <WebpackConfigurationViewer />\n </div>\n <div className={projectStyles.overview}>\n {overViewData.map((data, idx) => (\n <Overview\n key={idx}\n title={data.title}\n description={<span>{data.description}</span>}\n icon={data.icon}\n />\n ))}\n </div>\n <Descriptions\n className={listStyles.projectOverall}\n items={items}\n />\n </div>\n </Card>\n );\n }}\n </ServerAPIProvider>\n );\n};\n"],"names":["ProjectOverall","configs","cwd","envinfo","alerts","name","t","useI18n","warns","e","errors","items","Object","key","regexp","isVersion","undefined","item","config","configName","version","ServerAPIProvider","SDK","res","totalSizeStr","formatSize","totalFiles","size","unit","overViewData","Avatar","CloseCircleFilled","WarningFilled","FileFilled","ExperimentFilled","Card","cardStyles","styles","WebpackConfigurationViewer","projectStyles","data","idx","Overview","Descriptions","listStyles"],"mappings":";;;;;;;;;;;;AAqBO,MAAMA,iBAMR,CAAC,EAAEC,UAAU,EAAE,EAAEC,GAAG,EAAEC,OAAO,EAAEC,SAAS,EAAE,EAAEC,IAAI,EAAE;IACrD,MAAM,EAAEC,CAAC,EAAE,GAAGC;IAEd,MAAMC,QAAQJ,OAAO,MAAM,CAAC,CAACK,IAAMA,AAAY,WAAZA,EAAE,KAAK,EAAa,MAAM;IAE7D,MAAMC,SAASN,OAAO,MAAM,GAAGI;IAE/B,MAAMG,QAAoC;WACpCN,OACA;YACE;gBACE,KAAK;gBACL,OAAO;gBACP,UAAUA;YACZ;SACD,GACD,EAAE;WACHO,OAAO,IAAI,CAACT,
|
|
1
|
+
{"version":3,"file":"components/Overall/project.mjs","sources":["../../../src/components/Overall/project.tsx"],"sourcesContent":["import { Descriptions, DescriptionsProps, Avatar } from 'antd';\nimport {\n CloseCircleFilled,\n WarningFilled,\n FileFilled,\n ExperimentFilled,\n} from '@ant-design/icons';\n\nimport { ServerAPIProvider } from '../Manifest';\nimport { useI18n, formatSize } from '../../utils';\nimport { WebpackConfigurationViewer } from '../Configuration';\nimport { Card } from '../Card';\nimport { Overview } from './overview';\nimport styles from './project.module.scss';\n\nimport listStyles from './list.module.scss';\nimport cardStyles from './card.module.scss';\nimport projectStyles from './project.module.scss';\n\nimport { SDK } from '@rsdoctor/types';\n\nexport const ProjectOverall: React.FC<{\n configs: SDK.ConfigData;\n cwd: string;\n envinfo: SDK.EnvInfo;\n alerts: SDK.ErrorsData;\n name?: string;\n}> = ({ configs = [], cwd, envinfo, alerts = [], name }) => {\n const { t } = useI18n();\n\n const warns = alerts.filter((e) => e.level === 'warn').length;\n\n const errors = alerts.length - warns;\n\n const items: DescriptionsProps['items'] = [\n ...(name\n ? [\n {\n key: 'name',\n label: 'Builder',\n children: name,\n },\n ]\n : []),\n ...Object.keys(envinfo || {}).map((key) => {\n const regexp = /Version$/;\n const isVersion = regexp.test(key);\n return {\n key,\n label: isVersion ? key.replace(regexp, '') : key,\n children: envinfo ? envinfo[key] : undefined,\n };\n }),\n ...configs\n .filter((item) => !!item.version)\n .map((config) => {\n const { name: configName, version } = config;\n return {\n key: configName,\n label: configName,\n children: version,\n };\n }),\n {\n key: 'cwd',\n label: 'cwd',\n children: cwd,\n },\n ];\n\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetAssetsSummary}\n body={{ withFileContent: false }}\n >\n {(res) => {\n const totalSizeStr = formatSize(res.all.total.size);\n const totalFiles = res.all.total.count;\n const [size, unit] = totalSizeStr.split(' ');\n const overViewData = [\n {\n title: 'Errors',\n description: <span style={{ color: '#FF4D4F' }}>{errors}</span>,\n icon: (\n <Avatar\n style={{ background: '#FF4D4F' }}\n shape=\"circle\"\n icon={<CloseCircleFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Warnings',\n description: <span style={{ color: '#FAAD14' }}>{warns}</span>,\n icon: (\n <Avatar\n style={{ background: '#FAAD14' }}\n shape=\"circle\"\n icon={<WarningFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Total Files',\n description: <span>{totalFiles}</span>,\n icon: (\n <Avatar\n style={{ background: '#3874F6' }}\n shape=\"circle\"\n icon={<FileFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n {\n title: 'Total Size',\n description: (\n <>\n <span style={{ fontSize: '20px' }}>{size}</span>\n <span style={{ fontSize: '13px', marginLeft: '5px' }}>\n {unit}\n </span>\n </>\n ),\n icon: (\n <Avatar\n style={{ background: 'rgba(226, 129, 73)' }}\n shape=\"circle\"\n icon={<ExperimentFilled style={{ fontSize: '18px' }} />}\n />\n ),\n },\n ];\n\n return (\n <Card className={cardStyles.card}>\n <div>\n <div className={styles.title}>\n <span className={styles.left}>{t('Project Overall')}</span>\n <WebpackConfigurationViewer />\n </div>\n <div className={projectStyles.overview}>\n {overViewData.map((data, idx) => (\n <Overview\n key={idx}\n title={data.title}\n description={<span>{data.description}</span>}\n icon={data.icon}\n />\n ))}\n </div>\n <Descriptions\n className={listStyles.projectOverall}\n items={items}\n />\n </div>\n </Card>\n );\n }}\n </ServerAPIProvider>\n );\n};\n"],"names":["ProjectOverall","configs","cwd","envinfo","alerts","name","t","useI18n","warns","e","errors","items","Object","key","regexp","isVersion","undefined","item","config","configName","version","ServerAPIProvider","SDK","res","totalSizeStr","formatSize","totalFiles","size","unit","overViewData","Avatar","CloseCircleFilled","WarningFilled","FileFilled","ExperimentFilled","Card","cardStyles","styles","WebpackConfigurationViewer","projectStyles","data","idx","Overview","Descriptions","listStyles"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://./src/pages/Overall/index.module.scss"],"names":[],"mappings":"AADA;EAEE,6NAA6N;AAC/N;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,8BAA8B;EAC9B,aAAa;AACf;;AAEA;EACE,mBAAmB;AACrB","sourcesContent":[":root{--font-family-code: Roboto, Roboto Mono, -apple-system, BlinkMacSystemFont,
|
|
1
|
+
{"version":3,"sources":["webpack://./src/pages/Overall/index.module.scss"],"names":[],"mappings":"AADA;EAEE,6NAA6N;AAC/N;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,8BAA8B;EAC9B,aAAa;AACf;;AAEA;EACE,mBAAmB;AACrB","sourcesContent":[":root{--font-family-code: Roboto, Roboto Mono, -apple-system, BlinkMacSystemFont, 'Segoe UI', Menlo, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'}:root :global .ant-layout-content{padding:16px 32px !important}:root :global .ant-tree-title{flex:1}:root :global .ant-tree-node-content-wrapper-normal{display:flex}.overall{display:flex;justify-content:space-between}.layout .row{margin-bottom:16px}"],"sourceRoot":""}
|
package/dist/utils/file.mjs
CHANGED
|
@@ -108,7 +108,6 @@ function readJSONByFileReader(file) {
|
|
|
108
108
|
const reader = new FileReader();
|
|
109
109
|
reader.onloadend = ()=>{
|
|
110
110
|
const { result } = reader;
|
|
111
|
-
console.log('reader result: ', result);
|
|
112
111
|
try {
|
|
113
112
|
const json = JSON.parse(result.toString());
|
|
114
113
|
resolve(json);
|
package/dist/utils/file.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils/file.mjs","sources":["../../src/utils/file.tsx"],"sourcesContent":["import { get } from 'es-toolkit/compat';\nimport { Common, SDK } from '@rsdoctor/types';\nimport { message, Space, TreeNodeProps, UploadFile } from 'antd';\nimport { FieldDataNode } from 'rc-tree';\nimport {\n FolderOpenTwoTone,\n FolderTwoTone,\n FileOutlined,\n RightOutlined,\n} from '@ant-design/icons';\nimport { getFileCom } from 'src/components/FileTree';\n\nexport type DataNode = FieldDataNode<{\n key: string | number;\n title?: React.ReactNode | ((data: DataNode) => React.ReactNode);\n}> & { __BASENAME__?: any; __RESOURCEPATH__?: any; children?: DataNode[] };\n\nexport const rootDirname = (file: string, sep = '/'): string | null => {\n const idx = file?.indexOf(sep);\n if (idx === -1) {\n return null;\n }\n if (idx === 0) {\n return sep + (rootDirname(file?.slice(1), sep) || '');\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 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 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 // Normalize all paths to use forward slash as internal separator for consistency\n // This ensures Windows paths (using backslash) are properly converted to forward slashes\n const normalizedFiles = files.map((file) => {\n // Always convert backslashes to forward slashes for internal processing\n return file.replace(/\\\\/g, '/');\n });\n\n // Use forward slash as the internal separator for consistency\n const internalSep = '/';\n const sepRegexp = new RegExp(internalSep);\n\n const res = normalizedFiles.reduce<DataNode>(\n (t, file) => {\n let dir = rootDirname(file, internalSep);\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(internalSep);\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, internalSep);\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(\n item,\n e,\n internalSep,\n inlinedResourcePathKey,\n dirTitle,\n ),\n );\n });\n\n return res;\n}\n\nexport function beautifyPath(path: string, cwd: string) {\n if (path.startsWith(cwd)) {\n return path.replace(cwd, '.');\n }\n\n return path;\n}\n\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: UploadFile,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: Blob,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: unknown,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const { result } = reader;\n console.log('reader result: ', result);\n try {\n const json = JSON.parse(result!.toString());\n resolve(json);\n } catch (err) {\n message.error('json parse error');\n reject(err);\n }\n };\n reader.onerror = () => {\n const msg = 'upload json file error, please try again.';\n message.error(msg);\n reject(new Error(msg));\n };\n reader.readAsText(((file as UploadFile).originFileObj || file) as Blob);\n });\n}\n\n/**\n * beautify module path, will replace cwd & last 'node_modules'\n */\nexport function beautifyModulePath(modulePath: string, cwd: string) {\n const res = beautifyPath(modulePath, cwd);\n\n const str = '/node_modules/';\n\n const idx = res.lastIndexOf(str);\n\n if (idx > -1) {\n return {\n alias: res.slice(idx + str.length),\n inNodeModules: true,\n };\n }\n\n return {\n alias: res,\n inNodeModules: false,\n };\n}\n\nexport function getFileIcon(props: TreeNodeProps, addRowIcon = true) {\n const { data } = props;\n const expanded = props.expanded;\n if (data?.children) {\n return (\n <Space>\n {addRowIcon ? (\n <RightOutlined\n className={`file-tree-switcher-arrow ${expanded ? 'file-tree-switcher-arrow-expand' : ''}`}\n />\n ) : (\n <></>\n )}\n {expanded ? <FolderOpenTwoTone /> : <FolderTwoTone />}\n </Space>\n );\n }\n if (props.eventKey && typeof props.eventKey === 'string') {\n return getFileCom(props.eventKey);\n }\n return <FileOutlined />;\n}\n\ntype TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n id?: string | number;\n // Internal helper, not exported\n _map?: Map<string, TreeNode>;\n};\n\nexport function buildTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const root: TreeNode = { name: rootName, children: [], _map: new Map() };\n\n for (const mod of modules) {\n const parts = mod.path.split(/[\\\\/]/).filter(Boolean);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (i === parts.length - 1) {\n // File node\n if (!current.children) current.children = [];\n current.children.push({\n name: part,\n path: mod.path,\n sourceSize: mod.size?.sourceSize ?? 0,\n bundledSize: mod.size?.parsedSize ?? 0,\n gzipSize: mod.size?.gzipSize ?? 0,\n id: mod.id,\n });\n } else {\n // Directory node\n if (!current._map) current._map = new Map();\n let child = current._map.get(part);\n if (!child) {\n child = { name: part, children: [], _map: new Map() };\n current.children!.push(child);\n current._map.set(part, child);\n }\n current = child;\n }\n }\n }\n\n // Clean up _map property\n function clean(node: TreeNode) {\n delete node._map;\n if (node.children) node.children.forEach(clean);\n }\n clean(root);\n\n return root;\n}\n\nfunction flattenSingleChildDirs(node: TreeNode): TreeNode {\n // Return directly if leaf node\n if (!node.children || node.children.length === 0) return node;\n\n let current = node;\n // As long as children has only one child and it's not a leaf, merge\n while (\n current.children &&\n current.children.length === 1 &&\n !current.children[0].sourceSize // Not a leaf\n ) {\n current = {\n name: current.name + '/' + current.children[0].name,\n children: current.children[0].children,\n };\n }\n\n // Recursively process all child nodes\n if (current.children) {\n current.children = current.children.map(flattenSingleChildDirs);\n }\n return current;\n}\n\nfunction sumDirValue(node: TreeNode): {\n sourceSize: number;\n bundledSize: number;\n gzipSize: number;\n} {\n if (!node.children || node.children.length === 0) {\n // Leaf node, just return value\n return {\n sourceSize: node.sourceSize ?? 0,\n bundledSize: node.bundledSize ?? 0,\n gzipSize: node.gzipSize ?? 0,\n };\n }\n // Recursively sum all child nodes\n let sourceSum = 0;\n let bundledSum = 0;\n let gzipSum = 0;\n for (const child of node.children) {\n const { sourceSize, bundledSize, gzipSize } = sumDirValue(child);\n sourceSum += sourceSize;\n bundledSum += bundledSize;\n gzipSum += gzipSize;\n }\n node.sourceSize = sourceSum;\n node.bundledSize = bundledSum;\n node.gzipSize = gzipSum;\n return { sourceSize: sourceSum, bundledSize: bundledSum, gzipSize: gzipSum };\n}\n\nexport function flattenTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const rawTree = buildTreemapData(modules, rootName);\n const flattenedTree = flattenSingleChildDirs(rawTree);\n sumDirValue(flattenedTree); // Recursive sum\n return flattenedTree;\n}\n"],"names":["rootDirname","file","sep","idx","mapFileKey","arr","depth","filter","d","res","parent","e","t","basenameKey","flattenDirectory","n","inlinedResourcePathKey","dirTitle","_dir","defaultTitle","c","createFileStructures","files","fileTitle","_file","basename","page","normalizedFiles","internalSep","sepRegexp","RegExp","dir","exist","p","Boolean","props","getFileIcon","get","item","beautifyPath","path","cwd","readJSONByFileReader","Promise","resolve","reject","reader","FileReader","result","console","json","JSON","err","message","msg","Error","beautifyModulePath","modulePath","str","addRowIcon","data","expanded","Space","RightOutlined","FolderOpenTwoTone","FolderTwoTone","getFileCom","FileOutlined","buildTreemapData","modules","rootName","root","Map","mod","parts","current","i","part","child","clean","node","flattenSingleChildDirs","sumDirValue","sourceSum","bundledSum","gzipSum","sourceSize","bundledSize","gzipSize","flattenTreemapData","rawTree","flattenedTree"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils/file.mjs","sources":["../../src/utils/file.tsx"],"sourcesContent":["import { get } from 'es-toolkit/compat';\nimport { Common, SDK } from '@rsdoctor/types';\nimport { message, Space, TreeNodeProps, UploadFile } from 'antd';\nimport { FieldDataNode } from 'rc-tree';\nimport {\n FolderOpenTwoTone,\n FolderTwoTone,\n FileOutlined,\n RightOutlined,\n} from '@ant-design/icons';\nimport { getFileCom } from 'src/components/FileTree';\n\nexport type DataNode = FieldDataNode<{\n key: string | number;\n title?: React.ReactNode | ((data: DataNode) => React.ReactNode);\n}> & { __BASENAME__?: any; __RESOURCEPATH__?: any; children?: DataNode[] };\n\nexport const rootDirname = (file: string, sep = '/'): string | null => {\n const idx = file?.indexOf(sep);\n if (idx === -1) {\n return null;\n }\n if (idx === 0) {\n return sep + (rootDirname(file?.slice(1), sep) || '');\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 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 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 // Normalize all paths to use forward slash as internal separator for consistency\n // This ensures Windows paths (using backslash) are properly converted to forward slashes\n const normalizedFiles = files.map((file) => {\n // Always convert backslashes to forward slashes for internal processing\n return file.replace(/\\\\/g, '/');\n });\n\n // Use forward slash as the internal separator for consistency\n const internalSep = '/';\n const sepRegexp = new RegExp(internalSep);\n\n const res = normalizedFiles.reduce<DataNode>(\n (t, file) => {\n let dir = rootDirname(file, internalSep);\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(internalSep);\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, internalSep);\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(\n item,\n e,\n internalSep,\n inlinedResourcePathKey,\n dirTitle,\n ),\n );\n });\n\n return res;\n}\n\nexport function beautifyPath(path: string, cwd: string) {\n if (path.startsWith(cwd)) {\n return path.replace(cwd, '.');\n }\n\n return path;\n}\n\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: UploadFile,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: Blob,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: unknown,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const { result } = reader;\n try {\n const json = JSON.parse(result!.toString());\n resolve(json);\n } catch (err) {\n message.error('json parse error');\n reject(err);\n }\n };\n reader.onerror = () => {\n const msg = 'upload json file error, please try again.';\n message.error(msg);\n reject(new Error(msg));\n };\n reader.readAsText(((file as UploadFile).originFileObj || file) as Blob);\n });\n}\n\n/**\n * beautify module path, will replace cwd & last 'node_modules'\n */\nexport function beautifyModulePath(modulePath: string, cwd: string) {\n const res = beautifyPath(modulePath, cwd);\n\n const str = '/node_modules/';\n\n const idx = res.lastIndexOf(str);\n\n if (idx > -1) {\n return {\n alias: res.slice(idx + str.length),\n inNodeModules: true,\n };\n }\n\n return {\n alias: res,\n inNodeModules: false,\n };\n}\n\nexport function getFileIcon(props: TreeNodeProps, addRowIcon = true) {\n const { data } = props;\n const expanded = props.expanded;\n if (data?.children) {\n return (\n <Space>\n {addRowIcon ? (\n <RightOutlined\n className={`file-tree-switcher-arrow ${expanded ? 'file-tree-switcher-arrow-expand' : ''}`}\n />\n ) : (\n <></>\n )}\n {expanded ? <FolderOpenTwoTone /> : <FolderTwoTone />}\n </Space>\n );\n }\n if (props.eventKey && typeof props.eventKey === 'string') {\n return getFileCom(props.eventKey);\n }\n return <FileOutlined />;\n}\n\ntype TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n id?: string | number;\n // Internal helper, not exported\n _map?: Map<string, TreeNode>;\n};\n\nexport function buildTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const root: TreeNode = { name: rootName, children: [], _map: new Map() };\n\n for (const mod of modules) {\n const parts = mod.path.split(/[\\\\/]/).filter(Boolean);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (i === parts.length - 1) {\n // File node\n if (!current.children) current.children = [];\n current.children.push({\n name: part,\n path: mod.path,\n sourceSize: mod.size?.sourceSize ?? 0,\n bundledSize: mod.size?.parsedSize ?? 0,\n gzipSize: mod.size?.gzipSize ?? 0,\n id: mod.id,\n });\n } else {\n // Directory node\n if (!current._map) current._map = new Map();\n let child = current._map.get(part);\n if (!child) {\n child = { name: part, children: [], _map: new Map() };\n current.children!.push(child);\n current._map.set(part, child);\n }\n current = child;\n }\n }\n }\n\n // Clean up _map property\n function clean(node: TreeNode) {\n delete node._map;\n if (node.children) node.children.forEach(clean);\n }\n clean(root);\n\n return root;\n}\n\nfunction flattenSingleChildDirs(node: TreeNode): TreeNode {\n // Return directly if leaf node\n if (!node.children || node.children.length === 0) return node;\n\n let current = node;\n // As long as children has only one child and it's not a leaf, merge\n while (\n current.children &&\n current.children.length === 1 &&\n !current.children[0].sourceSize // Not a leaf\n ) {\n current = {\n name: current.name + '/' + current.children[0].name,\n children: current.children[0].children,\n };\n }\n\n // Recursively process all child nodes\n if (current.children) {\n current.children = current.children.map(flattenSingleChildDirs);\n }\n return current;\n}\n\nfunction sumDirValue(node: TreeNode): {\n sourceSize: number;\n bundledSize: number;\n gzipSize: number;\n} {\n if (!node.children || node.children.length === 0) {\n // Leaf node, just return value\n return {\n sourceSize: node.sourceSize ?? 0,\n bundledSize: node.bundledSize ?? 0,\n gzipSize: node.gzipSize ?? 0,\n };\n }\n // Recursively sum all child nodes\n let sourceSum = 0;\n let bundledSum = 0;\n let gzipSum = 0;\n for (const child of node.children) {\n const { sourceSize, bundledSize, gzipSize } = sumDirValue(child);\n sourceSum += sourceSize;\n bundledSum += bundledSize;\n gzipSum += gzipSize;\n }\n node.sourceSize = sourceSum;\n node.bundledSize = bundledSum;\n node.gzipSize = gzipSum;\n return { sourceSize: sourceSum, bundledSize: bundledSum, gzipSize: gzipSum };\n}\n\nexport function flattenTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const rawTree = buildTreemapData(modules, rootName);\n const flattenedTree = flattenSingleChildDirs(rawTree);\n sumDirValue(flattenedTree); // Recursive sum\n return flattenedTree;\n}\n"],"names":["rootDirname","file","sep","idx","mapFileKey","arr","depth","filter","d","res","parent","e","t","basenameKey","flattenDirectory","n","inlinedResourcePathKey","dirTitle","_dir","defaultTitle","c","createFileStructures","files","fileTitle","_file","basename","page","normalizedFiles","internalSep","sepRegexp","RegExp","dir","exist","p","Boolean","props","getFileIcon","get","item","beautifyPath","path","cwd","readJSONByFileReader","Promise","resolve","reject","reader","FileReader","result","json","JSON","err","message","msg","Error","beautifyModulePath","modulePath","str","addRowIcon","data","expanded","Space","RightOutlined","FolderOpenTwoTone","FolderTwoTone","getFileCom","FileOutlined","buildTreemapData","modules","rootName","root","Map","mod","parts","current","i","part","child","clean","node","flattenSingleChildDirs","sumDirValue","sourceSum","bundledSum","gzipSum","sourceSize","bundledSize","gzipSize","flattenTreemapData","rawTree","flattenedTree"],"mappings":"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"}
|
package/dist/utils/request.mjs
CHANGED
|
@@ -20,11 +20,14 @@ async function loadManifestByUrl(url) {
|
|
|
20
20
|
return res;
|
|
21
21
|
}
|
|
22
22
|
async function fetchJSONByUrl(url) {
|
|
23
|
-
|
|
23
|
+
const res = await axios.get(url, {
|
|
24
24
|
timeout: 30000
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
});
|
|
26
|
+
let json = res.data;
|
|
27
|
+
if ('string' == typeof json) {
|
|
28
|
+
const trimmed = json.trim();
|
|
29
|
+
json = /^<!doctype html\b/i.test(trimmed) || /^<html\b/i.test(trimmed) ? {} : JSON.parse(json);
|
|
30
|
+
}
|
|
28
31
|
return json;
|
|
29
32
|
}
|
|
30
33
|
function fetchJSONByUrls(urls) {
|
|
@@ -39,7 +42,7 @@ async function parseManifest(json) {
|
|
|
39
42
|
console.log('cloudData load error: ', error);
|
|
40
43
|
}
|
|
41
44
|
else transformedData = await common_Manifest.fetchShardingFiles(json.data, fetchShardingFile);
|
|
42
|
-
} catch
|
|
45
|
+
} catch {
|
|
43
46
|
transformedData = await common_Manifest.fetchShardingFiles(json.data, fetchShardingFile);
|
|
44
47
|
}
|
|
45
48
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils/request.mjs","sources":["../../src/utils/request.ts"],"sourcesContent":["import axios from 'axios';\nimport { Manifest, SDK } from '@rsdoctor/types';\nimport { Manifest as ManifestMethod, Url } from '@rsdoctor/utils/common';\nimport { APILoaderMode4Dev } from '../constants';\nimport { getManifestUrlFromUrlQuery } from './url';\nimport { getAPILoaderModeFromStorage } from './storage';\n\nfunction random() {\n return `${Date.now()}${Math.floor(Math.random() * 10000)}`;\n}\n\nexport async function fetchShardingFile(url: string): Promise<string> {\n if (Url.isUrl(url)) {\n return axios\n .get(url, { timeout: 999999, responseType: 'text' })\n .then((e) => e.data);\n }\n // json string\n return url;\n}\n\nexport async function loadManifestByUrl(url: string) {\n const json = await fetchJSONByUrl(url);\n\n const res = await parseManifest(json);\n return res;\n}\n\nexport async function fetchJSONByUrl(url: string) {\n
|
|
1
|
+
{"version":3,"file":"utils/request.mjs","sources":["../../src/utils/request.ts"],"sourcesContent":["import axios from 'axios';\nimport { Manifest, SDK } from '@rsdoctor/types';\nimport { Manifest as ManifestMethod, Url } from '@rsdoctor/utils/common';\nimport { APILoaderMode4Dev } from '../constants';\nimport { getManifestUrlFromUrlQuery } from './url';\nimport { getAPILoaderModeFromStorage } from './storage';\n\nfunction random() {\n return `${Date.now()}${Math.floor(Math.random() * 10000)}`;\n}\n\nexport async function fetchShardingFile(url: string): Promise<string> {\n if (Url.isUrl(url)) {\n return axios\n .get(url, { timeout: 999999, responseType: 'text' })\n .then((e) => e.data);\n }\n // json string\n return url;\n}\n\nexport async function loadManifestByUrl(url: string) {\n const json = await fetchJSONByUrl(url);\n\n const res = await parseManifest(json);\n return res;\n}\n\nexport async function fetchJSONByUrl(url: string) {\n const res = await axios.get(url, { timeout: 30000 });\n let json: unknown = res.data;\n\n if (typeof json === 'string') {\n const trimmed = json.trim();\n // If we got an HTML document (usually error page / SPA fallback), skip JSON.parse\n if (/^<!doctype html\\b/i.test(trimmed) || /^<html\\b/i.test(trimmed)) {\n json = {} as Manifest.RsdoctorManifestWithShardingFiles;\n } else {\n json = JSON.parse(json);\n }\n }\n\n return json as Manifest.RsdoctorManifestWithShardingFiles;\n}\n\nexport function fetchJSONByUrls(urls: string[]) {\n return Promise.all(urls.map((url) => fetchJSONByUrl(url)));\n}\n\nexport async function parseManifest(\n json: Manifest.RsdoctorManifestWithShardingFiles,\n) {\n let transformedData: Manifest.RsdoctorManifestData;\n\n try {\n // try to load cloud data first\n if (json.cloudData) {\n try {\n transformedData = await ManifestMethod.fetchShardingFiles(\n json.cloudData,\n fetchShardingFile,\n );\n } catch (error) {\n console.log('cloudData load error: ', error);\n }\n } else {\n transformedData = await ManifestMethod.fetchShardingFiles(\n json.data,\n fetchShardingFile,\n );\n }\n } catch {\n transformedData = await ManifestMethod.fetchShardingFiles(\n json.data,\n fetchShardingFile,\n );\n }\n\n return {\n ...json,\n data: transformedData!,\n };\n}\n\nconst manifestUrlForDev = '/manifest.json';\n\nexport function getManifestUrl(): string {\n let file: string | void;\n\n if (\n (window as { [key: string]: any })[\n Manifest.RsdoctorManifestClientConstant.WindowPropertyForManifestUrl\n ]\n ) {\n // load from window property\n file = (window as { [key: string]: any })[\n Manifest.RsdoctorManifestClientConstant.WindowPropertyForManifestUrl\n ];\n } else {\n // load from url query\n file = getManifestUrlFromUrlQuery();\n }\n\n if (!file) {\n file = SDK.ServerAPI.API.Manifest;\n }\n\n return file;\n}\n\nconst pool = new Map<\n string,\n Promise<Manifest.RsdoctorManifestWithShardingFiles>\n>();\n\nexport async function fetchManifest(url = getManifestUrl()) {\n if (!pool.has(url)) {\n pool.set(\n url,\n fetchJSONByUrl(url).catch((err) => {\n pool.delete(url);\n throw err;\n }),\n );\n }\n\n const res = await pool.get(url)!;\n\n return res;\n}\n\n// test for cli\nif (process.env.NODE_ENV === 'development') {\n if (getAPILoaderModeFromStorage() === APILoaderMode4Dev.Local) {\n axios.interceptors.request.use((c) => {\n c.withCredentials = false;\n if (c.url?.startsWith('/')) {\n if (c.url === manifestUrlForDev) {\n c.url = SDK.ServerAPI.API.Manifest;\n }\n const url = new URL(location.href);\n url.port = String(process.env.LOCAL_CLI_PORT!);\n return {\n ...c,\n url: `${url.origin}${c.url}`,\n };\n }\n\n return c;\n });\n }\n}\n\nexport async function postServerAPI<\n T extends SDK.ServerAPI.API,\n B extends\n SDK.ServerAPI.InferRequestBodyType<T> = SDK.ServerAPI.InferRequestBodyType<T>,\n R extends\n SDK.ServerAPI.InferResponseType<T> = SDK.ServerAPI.InferResponseType<T>,\n>(...args: B extends void ? [api: T] : [api: T, body: B]): Promise<R> {\n const [api, body] = args;\n const timeout = process.env.NODE_ENV === 'development' ? 10000 : 60000;\n const { data } = await axios.post<SDK.ServerAPI.InferResponseType<T>>(\n `${api}?_t=${random()}`,\n body,\n { timeout },\n );\n return data as R;\n}\n"],"names":["random","Date","Math","fetchShardingFile","url","Url","axios","e","loadManifestByUrl","json","fetchJSONByUrl","res","parseManifest","trimmed","JSON","fetchJSONByUrls","urls","Promise","transformedData","ManifestMethod","error","console","manifestUrlForDev","getManifestUrl","file","window","Manifest","getManifestUrlFromUrlQuery","SDK","pool","Map","fetchManifest","err","process","getAPILoaderModeFromStorage","APILoaderMode4Dev","c","URL","location","String","postServerAPI","args","api","body","timeout","data"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdoctor/components",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"repository": {
|
|
@@ -38,16 +38,17 @@
|
|
|
38
38
|
}
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@rsbuild/plugin-check-syntax": "1.6.
|
|
42
|
-
"@rsbuild/plugin-react": "^1.4.
|
|
43
|
-
"@rsbuild/plugin-sass": "^1.4.
|
|
44
|
-
"@rsbuild/plugin-svgr": "^1.2.
|
|
41
|
+
"@rsbuild/plugin-check-syntax": "1.6.1",
|
|
42
|
+
"@rsbuild/plugin-react": "^1.4.3",
|
|
43
|
+
"@rsbuild/plugin-sass": "^1.4.1",
|
|
44
|
+
"@rsbuild/plugin-svgr": "^1.2.4",
|
|
45
45
|
"@types/node": "^22.8.1",
|
|
46
46
|
"@types/path-browserify": "1.0.3",
|
|
47
47
|
"@types/react": "^18.3.27",
|
|
48
48
|
"@types/react-highlight-words": "^0.20.1",
|
|
49
49
|
"@types/url-parse": "1.4.11",
|
|
50
50
|
"react": "18.3.1",
|
|
51
|
+
"react-router-dom": "6.30.3",
|
|
51
52
|
"typescript": "^5.9.2"
|
|
52
53
|
},
|
|
53
54
|
"dependencies": {
|
|
@@ -55,11 +56,11 @@
|
|
|
55
56
|
"@monaco-editor/react": "4.7.0",
|
|
56
57
|
"ansi-to-react": "6.1.6",
|
|
57
58
|
"antd": "5.19.1",
|
|
58
|
-
"axios": "^1.13.
|
|
59
|
+
"axios": "^1.13.4",
|
|
59
60
|
"clsx": "^2.1.1",
|
|
60
61
|
"dayjs": "1.11.19",
|
|
61
62
|
"echarts": "^5.6.0",
|
|
62
|
-
"echarts-for-react": "^3.0.
|
|
63
|
+
"echarts-for-react": "^3.0.6",
|
|
63
64
|
"es-toolkit": "^1.43.0",
|
|
64
65
|
"i18next": "22.0.4",
|
|
65
66
|
"monaco-editor": "0.49.0",
|
|
@@ -71,12 +72,11 @@
|
|
|
71
72
|
"react-i18next": "12.0.0",
|
|
72
73
|
"react-json-view": "1.21.3",
|
|
73
74
|
"react-markdown": "^9.1.0",
|
|
74
|
-
"react-router-dom": "6.4.3",
|
|
75
75
|
"socket.io-client": "4.8.1",
|
|
76
76
|
"url-parse": "1.5.10",
|
|
77
|
-
"@rsdoctor/
|
|
78
|
-
"@rsdoctor/
|
|
79
|
-
"@rsdoctor/utils": "1.5.
|
|
77
|
+
"@rsdoctor/graph": "1.5.1",
|
|
78
|
+
"@rsdoctor/types": "1.5.1",
|
|
79
|
+
"@rsdoctor/utils": "1.5.1"
|
|
80
80
|
},
|
|
81
81
|
"peerDependencies": {
|
|
82
82
|
"react": ">=18.3.1",
|