@rsdoctor/components 1.3.3 → 1.3.5-beta.0

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.
Files changed (67) hide show
  1. package/dist/components/Alert/package-relation.mjs +1 -1
  2. package/dist/components/Alert/package-relation.mjs.map +1 -1
  3. package/dist/components/Alerts/bundle-alert.mjs +0 -1
  4. package/dist/components/Alerts/bundle-alert.mjs.map +1 -1
  5. package/dist/components/Alerts/collapse.mjs +1 -1
  6. package/dist/components/Alerts/collapse.mjs.map +1 -1
  7. package/dist/components/Card/size.mjs +1 -1
  8. package/dist/components/Card/size.mjs.map +1 -1
  9. package/dist/components/Charts/TimelineCharts/index.mjs +1 -1
  10. package/dist/components/Charts/TimelineCharts/index.mjs.map +1 -1
  11. package/dist/components/Charts/loader.mjs +1 -1
  12. package/dist/components/Charts/loader.mjs.map +1 -1
  13. package/dist/components/Charts/utils.mjs +1 -1
  14. package/dist/components/Charts/utils.mjs.map +1 -1
  15. package/dist/components/Loader/Analysis/files.mjs +1 -1
  16. package/dist/components/Loader/Analysis/files.mjs.map +1 -1
  17. package/dist/components/Manifest/api.mjs +1 -1
  18. package/dist/components/Manifest/api.mjs.map +1 -1
  19. package/dist/components/Overall/bundle_module.css +0 -1
  20. package/dist/components/Overall/bundle_module.css.map +1 -1
  21. package/dist/components/Overall/help-center_module.css +0 -2
  22. package/dist/components/Overall/help-center_module.css.map +1 -1
  23. package/dist/components/Overall/list_module.css +12 -2
  24. package/dist/components/Overall/list_module.css.map +1 -1
  25. package/dist/components/Overall/project_module.css +0 -1
  26. package/dist/components/Overall/project_module.css.map +1 -1
  27. package/dist/components/Plugins/webpack.mjs +1 -1
  28. package/dist/components/Plugins/webpack.mjs.map +1 -1
  29. package/dist/components/Resolver/analysis.mjs +1 -1
  30. package/dist/components/Resolver/analysis.mjs.map +1 -1
  31. package/dist/components/Title/index.mjs +2 -2
  32. package/dist/components/Title/index.mjs.map +1 -1
  33. package/dist/components/base/CodeViewer/utils.mjs +1 -1
  34. package/dist/components/base/CodeViewer/utils.mjs.map +1 -1
  35. package/dist/pages/BundleSize/components/asset.mjs +1 -1
  36. package/dist/pages/BundleSize/components/asset.mjs.map +1 -1
  37. package/dist/pages/BundleSize/components/index.mjs +1 -1
  38. package/dist/pages/BundleSize/components/index.mjs.map +1 -1
  39. package/dist/pages/BundleSize/components/index_module.css +6 -2
  40. package/dist/pages/BundleSize/components/index_module.css.map +1 -1
  41. package/dist/pages/ModuleAnalyze/chunks.mjs +1 -1
  42. package/dist/pages/ModuleAnalyze/chunks.mjs.map +1 -1
  43. package/dist/pages/Resources/BundleDiff/DiffContainer/assets.mjs +1 -1
  44. package/dist/pages/Resources/BundleDiff/DiffContainer/assets.mjs.map +1 -1
  45. package/dist/pages/Resources/BundleDiff/DiffContainer/modules.mjs +1 -1
  46. package/dist/pages/Resources/BundleDiff/DiffContainer/modules.mjs.map +1 -1
  47. package/dist/pages/Resources/BundleDiff/DiffContainer/packages.mjs +1 -1
  48. package/dist/pages/Resources/BundleDiff/DiffContainer/packages.mjs.map +1 -1
  49. package/dist/pages/Resources/BundleDiff/DiffContainer/row.mjs +1 -1
  50. package/dist/pages/Resources/BundleDiff/DiffContainer/row.mjs.map +1 -1
  51. package/dist/pages/Resources/BundleDiff/DiffServerAPIProvider/index.mjs +11 -2
  52. package/dist/pages/Resources/BundleDiff/DiffServerAPIProvider/index.mjs.map +1 -1
  53. package/dist/pages/TreeShaking/index.css +28 -4
  54. package/dist/pages/TreeShaking/index.css.map +1 -1
  55. package/dist/pages/TreeShaking/utils.mjs +2 -2
  56. package/dist/pages/TreeShaking/utils.mjs.map +1 -1
  57. package/dist/utils/data/local.mjs +1 -1
  58. package/dist/utils/data/local.mjs.map +1 -1
  59. package/dist/utils/data/remote.mjs +1 -1
  60. package/dist/utils/data/remote.mjs.map +1 -1
  61. package/dist/utils/file.mjs +1 -1
  62. package/dist/utils/file.mjs.map +1 -1
  63. package/dist/utils/hooks.mjs +1 -1
  64. package/dist/utils/hooks.mjs.map +1 -1
  65. package/dist/utils/stats.mjs +1 -1
  66. package/dist/utils/stats.mjs.map +1 -1
  67. package/package.json +5 -6
@@ -2,7 +2,7 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { Constants, SDK } from "@rsdoctor/types";
3
3
  import { Skeleton, Spin } from "antd";
4
4
  import { useCallback, useEffect, useState } from "react";
5
- import { isEqual } from "lodash-es";
5
+ import { isEqual } from "es-toolkit/compat";
6
6
  import { fetchManifest, useDataLoader } from "../../utils/index.mjs";
7
7
  import { ComponentState } from "../../constants.mjs";
8
8
  import { FailedStatus } from "../Status/index.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"components/Manifest/api.mjs","sources":["webpack://@rsdoctor/components/./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 'lodash-es';\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":["webpack://@rsdoctor/components/./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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"}
@@ -64,7 +64,6 @@
64
64
  .label-vITl7c {
65
65
  text-align: left;
66
66
  text-underline-position: from-font;
67
- -webkit-text-decoration-skip-ink: none;
68
67
  text-decoration-skip-ink: none;
69
68
  color: #000000a6;
70
69
  font-size: 12px;
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://./src/components/Overall/bundle.module.scss"],"names":[],"mappings":"AADA;EAEE,gBAAgB;EAChB,8BAA8B;EAC9B,mBAAmB;EACnB,YAAY;EACZ,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,aAAa;EACb,kBAAkB;EAClB,UAAU;AACZ;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,iBAAiB;EACjB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE;IACE,eAAe;EACjB;AACF;;AAEA;EACE,WAAW;EACX,eAAe;EACf,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,iCAAiC;EACjC,OAAO;EACP,qBAAqB;EACrB,2BAA2B;AAC7B;;AAEA;EACE,qBAAqB;EACrB,qBAAqB;EACrB,eAAe;AACjB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,gBAAgB;EAChB,kCAAkC;EAClC,sCAAsC;EACtC,8BAA8B;EAC9B,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;AACnB","sourcesContent":[".title{height:40px;display:flex;justify-content:space-between;align-items:center;font-size:16px;font-weight:500;line-height:20px;text-align:left;position:relative;top:-10px}.column{margin-bottom:14px}.description{font-size:20px;font-weight:500;line-height:32px;margin-right:5px;color:#000}@media(max-width: 1500px){.description{font-size:16px}}.unit{font-size:12px;font-weight:400;line-height:32px;color:#000}.treeContainer{display:flex}.treeContainer .line{border-bottom:1px dashed #e5e6eb;flex:1;transform:translateY(-45%);margin:0 15px 0 10px}.treeContainer .treeTitle{word-wrap:break-word;word-break:break-all;flex-wrap:wrap}.treeContainer .icon{font-size:16px}.treeContainer .tag{height:23px}.label{font-size:12px;font-weight:400;line-height:20px;text-align:left;text-underline-position:from-font;text-decoration-skip-ink:none;color:rgba(0,0,0,.6509803922)}"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack://./src/components/Overall/bundle.module.scss"],"names":[],"mappings":"AADA;EAEE,gBAAgB;EAChB,8BAA8B;EAC9B,mBAAmB;EACnB,YAAY;EACZ,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,aAAa;EACb,kBAAkB;EAClB,UAAU;AACZ;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,iBAAiB;EACjB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE;IACE,eAAe;EACjB;AACF;;AAEA;EACE,WAAW;EACX,eAAe;EACf,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,iCAAiC;EACjC,OAAO;EACP,qBAAqB;EACrB,2BAA2B;AAC7B;;AAEA;EACE,qBAAqB;EACrB,qBAAqB;EACrB,eAAe;AACjB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,gBAAgB;EAChB,kCAAkC;EAClC,8BAA8B;EAC9B,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;AACnB","sourcesContent":[".title{height:40px;display:flex;justify-content:space-between;align-items:center;font-size:16px;font-weight:500;line-height:20px;text-align:left;position:relative;top:-10px}.column{margin-bottom:14px}.description{font-size:20px;font-weight:500;line-height:32px;margin-right:5px;color:#000}@media(max-width: 1500px){.description{font-size:16px}}.unit{font-size:12px;font-weight:400;line-height:32px;color:#000}.treeContainer{display:flex}.treeContainer .line{border-bottom:1px dashed #e5e6eb;flex:1;transform:translateY(-45%);margin:0 15px 0 10px}.treeContainer .treeTitle{word-wrap:break-word;word-break:break-all;flex-wrap:wrap}.treeContainer .icon{font-size:16px}.treeContainer .tag{height:23px}.label{font-size:12px;font-weight:400;line-height:20px;text-align:left;text-underline-position:from-font;text-decoration-skip-ink:none;color:rgba(0,0,0,.6509803922)}"],"sourceRoot":""}
@@ -1,7 +1,6 @@
1
1
  .title-dP_KVY {
2
2
  text-align: left;
3
3
  text-underline-position: from-font;
4
- -webkit-text-decoration-skip-ink: none;
5
4
  text-decoration-skip-ink: none;
6
5
  justify-content: space-between;
7
6
  align-items: center;
@@ -24,7 +23,6 @@
24
23
  cursor: pointer;
25
24
  text-align: left;
26
25
  text-underline-position: from-font;
27
- -webkit-text-decoration-skip-ink: none;
28
26
  text-decoration-skip-ink: none;
29
27
  width: 48%;
30
28
  font-size: 14px;
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://./src/components/Overall/help-center.module.scss"],"names":[],"mappings":"AADA;EAEE,gBAAgB;EAChB,kCAAkC;EAClC,sCAAsC;EACtC,8BAA8B;EAC9B,8BAA8B;EAC9B,mBAAmB;EACnB,YAAY;EACZ,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,aAAa;EACb,kBAAkB;EAClB,UAAU;AACZ;;AAEA;EACE,eAAe;EACf,8BAA8B;EAC9B,aAAa;AACf;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,kCAAkC;EAClC,sCAAsC;EACtC,8BAA8B;EAC9B,UAAU;EACV,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,qBAAqB;AACvB;;AAEA;EACE,cAAc;AAChB","sourcesContent":[".title{display:flex;align-items:center;justify-content:space-between;position:relative;height:36px;position:relative;top:-12px;font-size:16px;font-weight:500;line-height:20px;text-align:left;text-underline-position:from-font;text-decoration-skip-ink:none}.container{display:flex;justify-content:space-between;flex-wrap:wrap}.container .content{cursor:pointer;width:48%;transition:color .5s ease;font-size:14px;font-weight:400;line-height:16px;text-align:left;text-underline-position:from-font;text-decoration-skip-ink:none}.container .content:hover{color:#1677ff}"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack://./src/components/Overall/help-center.module.scss"],"names":[],"mappings":"AADA;EAEE,gBAAgB;EAChB,kCAAkC;EAClC,8BAA8B;EAC9B,8BAA8B;EAC9B,mBAAmB;EACnB,YAAY;EACZ,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,aAAa;EACb,kBAAkB;EAClB,UAAU;AACZ;;AAEA;EACE,eAAe;EACf,8BAA8B;EAC9B,aAAa;AACf;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,kCAAkC;EAClC,8BAA8B;EAC9B,UAAU;EACV,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,qBAAqB;AACvB;;AAEA;EACE,cAAc;AAChB","sourcesContent":[".title{display:flex;align-items:center;justify-content:space-between;position:relative;height:36px;position:relative;top:-12px;font-size:16px;font-weight:500;line-height:20px;text-align:left;text-underline-position:from-font;text-decoration-skip-ink:none}.container{display:flex;justify-content:space-between;flex-wrap:wrap}.container .content{cursor:pointer;width:48%;transition:color .5s ease;font-size:14px;font-weight:400;line-height:16px;text-align:left;text-underline-position:from-font;text-decoration-skip-ink:none}.container .content:hover{color:#1677ff}"],"sourceRoot":""}
@@ -1,4 +1,9 @@
1
- :is(.projectOverall-T7onhG .ant-descriptions-item-label, .projectOverall-T7onhG .ant-descriptions-item-content) {
1
+ .projectOverall-T7onhG .ant-descriptions-item-label {
2
+ color: #000000a6;
3
+ font-size: 13px;
4
+ }
5
+
6
+ .projectOverall-T7onhG .ant-descriptions-item-content {
2
7
  color: #000000a6;
3
8
  font-size: 13px;
4
9
  }
@@ -7,7 +12,12 @@
7
12
  padding-bottom: 10px !important;
8
13
  }
9
14
 
10
- :is(.bundleOverall-Ay7WmZ .ant-descriptions-item-label, .bundleOverall-Ay7WmZ .ant-descriptions-item-content) {
15
+ .bundleOverall-Ay7WmZ .ant-descriptions-item-label {
16
+ color: #000000a6;
17
+ font-size: 13px;
18
+ }
19
+
20
+ .bundleOverall-Ay7WmZ .ant-descriptions-item-content {
11
21
  color: #000000a6;
12
22
  font-size: 13px;
13
23
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://./src/components/Overall/list.module.scss"],"names":[],"mappings":"AADA;EAEE,gBAAgB;EAChB,eAAe;AACjB;;AAEA;EACE,+BAA+B;AACjC;;AAEA;EACE,gBAAgB;EAChB,eAAe;AACjB;;AAEA;EACE,4BAA4B;AAC9B","sourcesContent":[".projectOverall :global(.ant-descriptions-item-label),.projectOverall :global(.ant-descriptions-item-content){font-size:13px;color:rgba(0,0,0,.6509803922)}.projectOverall :global(.ant-descriptions-item){padding-bottom:10px !important}.bundleOverall :global(.ant-descriptions-item-label),.bundleOverall :global(.ant-descriptions-item-content){font-size:13px;color:rgba(0,0,0,.6509803922)}.bundleOverall :global(.ant-descriptions-item){padding-bottom:0px !important}"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack://./src/components/Overall/list.module.scss"],"names":[],"mappings":"AADA;EAEE,gBAAgB;EAChB,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,eAAe;AACjB;;AAEA;EACE,+BAA+B;AACjC;;AAEA;EACE,gBAAgB;EAChB,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,eAAe;AACjB;;AAEA;EACE,4BAA4B;AAC9B","sourcesContent":[".projectOverall :global(.ant-descriptions-item-label),.projectOverall :global(.ant-descriptions-item-content){font-size:13px;color:rgba(0,0,0,.6509803922)}.projectOverall :global(.ant-descriptions-item){padding-bottom:10px !important}.bundleOverall :global(.ant-descriptions-item-label),.bundleOverall :global(.ant-descriptions-item-content){font-size:13px;color:rgba(0,0,0,.6509803922)}.bundleOverall :global(.ant-descriptions-item){padding-bottom:0px !important}"],"sourceRoot":""}
@@ -13,7 +13,6 @@
13
13
  .title-cqt0lp .left-sk7eLC {
14
14
  text-align: left;
15
15
  text-underline-position: from-font;
16
- -webkit-text-decoration-skip-ink: none;
17
16
  text-decoration-skip-ink: none;
18
17
  font-size: 16px;
19
18
  font-weight: 500;
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack://./src/components/Overall/project.module.scss"],"names":[],"mappings":"AADA;EAEE,mBAAmB;EACnB,aAAa;AACf;;AAEA;EACE,8BAA8B;EAC9B,mBAAmB;EACnB,oBAAoB;EACpB,aAAa;AACf;;AAEA;EACE,gBAAgB;EAChB,kCAAkC;EAClC,sCAAsC;EACtC,8BAA8B;EAC9B,eAAe;EACf,gBAAgB;EAChB,iBAAiB;AACnB","sourcesContent":[".overview{display:flex;margin-bottom:19px}.title{display:flex;justify-content:space-between;align-items:center;padding-bottom:20px}.title .left{font-size:16px;font-weight:500;line-height:24px;text-align:left;text-underline-position:from-font;text-decoration-skip-ink:none}"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack://./src/components/Overall/project.module.scss"],"names":[],"mappings":"AADA;EAEE,mBAAmB;EACnB,aAAa;AACf;;AAEA;EACE,8BAA8B;EAC9B,mBAAmB;EACnB,oBAAoB;EACpB,aAAa;AACf;;AAEA;EACE,gBAAgB;EAChB,kCAAkC;EAClC,8BAA8B;EAC9B,eAAe;EACf,gBAAgB;EAChB,iBAAiB;AACnB","sourcesContent":[".overview{display:flex;margin-bottom:19px}.title{display:flex;justify-content:space-between;align-items:center;padding-bottom:20px}.title .left{font-size:16px;font-weight:500;line-height:24px;text-align:left;text-underline-position:from-font;text-decoration-skip-ink:none}"],"sourceRoot":""}
@@ -1,7 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { useMemo } from "react";
3
3
  import { Table, Tooltip } from "antd";
4
- import { sumBy, uniq } from "lodash-es";
4
+ import { sumBy, uniq } from "es-toolkit/compat";
5
5
  import { formatCosts } from "../../utils/index.mjs";
6
6
  function useWebpackPluginsDataSource(plugin, selectedTapNames, selectedHooks) {
7
7
  const tapNames = useMemo(()=>uniq(Object.values(plugin).flat().map((e)=>e.tapName)), [
@@ -1 +1 @@
1
- {"version":3,"file":"components/Plugins/webpack.mjs","sources":["webpack://@rsdoctor/components/./src/components/Plugins/webpack.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { Table, Tooltip } from 'antd';\nimport { sumBy, uniq } from 'lodash-es';\nimport { SDK } from '@rsdoctor/types';\nimport { formatCosts } from '../../utils';\n\ninterface WebpackPluginsTableDataItem {\n tapName: string;\n hook: string;\n key: string;\n hookData: SDK.PluginHookData[];\n}\nexport interface WebpackPluginsDataTableProps {\n dataSource: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetPluginData>;\n}\n\nexport function useWebpackPluginsDataSource(\n plugin: SDK.PluginData,\n selectedTapNames: string[],\n selectedHooks: string[],\n) {\n const tapNames = useMemo(\n () =>\n uniq(\n Object.values(plugin)\n .flat()\n .map((e) => e.tapName),\n ),\n [plugin],\n );\n\n const hooks = useMemo(() => Object.keys(plugin), [plugin]);\n\n const dataSource = useMemo(() => {\n if (!tapNames.length) return [];\n\n return tapNames.reduce((total, tapName) => {\n if (selectedTapNames.length && !selectedTapNames.includes(tapName)) {\n return total;\n }\n\n hooks.forEach((hook) => {\n if (selectedHooks.length && !selectedHooks.includes(hook)) {\n return;\n }\n\n const hookData = plugin[hook].filter((e) => e.tapName === tapName);\n if (hookData.length === 0) return;\n total.push({\n tapName,\n hook,\n key: `${tapName}${hook}`,\n hookData,\n });\n });\n\n return total;\n }, [] as WebpackPluginsTableDataItem[]);\n }, [plugin, selectedTapNames, selectedHooks]);\n\n return {\n dataSource,\n tapNames,\n hooks,\n };\n}\n\nexport const WebpackPluginsDataTable: React.FC<\n WebpackPluginsDataTableProps\n> = ({ dataSource }) => {\n return (\n <Table\n dataSource={dataSource}\n rowKey={(v) => `${v.tapName}_${v.hook}`}\n columns={[\n {\n title: `Plugin Tap Name`,\n render: (_v, r) => r.tapName,\n },\n {\n title: `Hook`,\n render: (_v, r) => r.hook,\n },\n {\n title: 'calls',\n render: (_v, r) => (\n <Tooltip\n title={`\"${r.hook}\" has been called ${r.data.length} times by \"${r.tapName}\"`}\n >\n {r.data.length}\n </Tooltip>\n ),\n sorter(a, b) {\n return a.data.length - b.data.length;\n },\n },\n {\n title: 'duration(total)',\n render: (_v, r) => formatCosts(sumBy(r.data, (e) => e.costs)),\n sorter(a, b) {\n return (\n sumBy(a.data, (e) => e.costs) - sumBy(b.data, (e) => e.costs)\n );\n },\n defaultSortOrder: 'descend',\n },\n ]}\n />\n );\n};\n"],"names":["useWebpackPluginsDataSource","plugin","selectedTapNames","selectedHooks","tapNames","useMemo","uniq","Object","e","hooks","dataSource","total","tapName","hook","hookData","WebpackPluginsDataTable","Table","v","_v","r","Tooltip","a","b","formatCosts","sumBy"],"mappings":";;;;;AAgBO,SAASA,4BACdC,MAAsB,EACtBC,gBAA0B,EAC1BC,aAAuB;IAEvB,MAAMC,WAAWC,QACf,IACEC,KACEC,OAAO,MAAM,CAACN,QACX,IAAI,GACJ,GAAG,CAAC,CAACO,IAAMA,EAAE,OAAO,IAE3B;QAACP;KAAO;IAGV,MAAMQ,QAAQJ,QAAQ,IAAME,OAAO,IAAI,CAACN,SAAS;QAACA;KAAO;IAEzD,MAAMS,aAAaL,QAAQ;QACzB,IAAI,CAACD,SAAS,MAAM,EAAE,OAAO,EAAE;QAE/B,OAAOA,SAAS,MAAM,CAAC,CAACO,OAAOC;YAC7B,IAAIV,iBAAiB,MAAM,IAAI,CAACA,iBAAiB,QAAQ,CAACU,UACxD,OAAOD;YAGTF,MAAM,OAAO,CAAC,CAACI;gBACb,IAAIV,cAAc,MAAM,IAAI,CAACA,cAAc,QAAQ,CAACU,OAClD;gBAGF,MAAMC,WAAWb,MAAM,CAACY,KAAK,CAAC,MAAM,CAAC,CAACL,IAAMA,EAAE,OAAO,KAAKI;gBAC1D,IAAIE,AAAoB,MAApBA,SAAS,MAAM,EAAQ;gBAC3BH,MAAM,IAAI,CAAC;oBACTC;oBACAC;oBACA,KAAK,GAAGD,UAAUC,MAAM;oBACxBC;gBACF;YACF;YAEA,OAAOH;QACT,GAAG,EAAE;IACP,GAAG;QAACV;QAAQC;QAAkBC;KAAc;IAE5C,OAAO;QACLO;QACAN;QACAK;IACF;AACF;AAEO,MAAMM,0BAET,CAAC,EAAEL,UAAU,EAAE,GACV,WAAP,GACE,IAACM,OAAKA;QACJ,YAAYN;QACZ,QAAQ,CAACO,IAAM,GAAGA,EAAE,OAAO,CAAC,CAAC,EAAEA,EAAE,IAAI,EAAE;QACvC,SAAS;YACP;gBACE,OAAO;gBACP,QAAQ,CAACC,IAAIC,IAAMA,EAAE,OAAO;YAC9B;YACA;gBACE,OAAO;gBACP,QAAQ,CAACD,IAAIC,IAAMA,EAAE,IAAI;YAC3B;YACA;gBACE,OAAO;gBACP,QAAQ,CAACD,IAAIC,IAAAA,WAAAA,GACX,IAACC,SAAOA;wBACN,OAAO,CAAC,CAAC,EAAED,EAAE,IAAI,CAAC,kBAAkB,EAAEA,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAEA,EAAE,OAAO,CAAC,CAAC,CAAC;kCAE5EA,EAAE,IAAI,CAAC,MAAM;;gBAGlB,QAAOE,CAAC,EAAEC,CAAC;oBACT,OAAOD,EAAE,IAAI,CAAC,MAAM,GAAGC,EAAE,IAAI,CAAC,MAAM;gBACtC;YACF;YACA;gBACE,OAAO;gBACP,QAAQ,CAACJ,IAAIC,IAAMI,YAAYC,MAAML,EAAE,IAAI,EAAE,CAACX,IAAMA,EAAE,KAAK;gBAC3D,QAAOa,CAAC,EAAEC,CAAC;oBACT,OACEE,MAAMH,EAAE,IAAI,EAAE,CAACb,IAAMA,EAAE,KAAK,IAAIgB,MAAMF,EAAE,IAAI,EAAE,CAACd,IAAMA,EAAE,KAAK;gBAEhE;gBACA,kBAAkB;YACpB;SACD"}
1
+ {"version":3,"file":"components/Plugins/webpack.mjs","sources":["webpack://@rsdoctor/components/./src/components/Plugins/webpack.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { Table, Tooltip } from 'antd';\nimport { sumBy, uniq } from 'es-toolkit/compat';\nimport { SDK } from '@rsdoctor/types';\nimport { formatCosts } from '../../utils';\n\ninterface WebpackPluginsTableDataItem {\n tapName: string;\n hook: string;\n key: string;\n hookData: SDK.PluginHookData[];\n}\nexport interface WebpackPluginsDataTableProps {\n dataSource: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetPluginData>;\n}\n\nexport function useWebpackPluginsDataSource(\n plugin: SDK.PluginData,\n selectedTapNames: string[],\n selectedHooks: string[],\n) {\n const tapNames = useMemo(\n () =>\n uniq(\n Object.values(plugin)\n .flat()\n .map((e) => e.tapName),\n ),\n [plugin],\n );\n\n const hooks = useMemo(() => Object.keys(plugin), [plugin]);\n\n const dataSource = useMemo(() => {\n if (!tapNames.length) return [];\n\n return tapNames.reduce((total, tapName) => {\n if (selectedTapNames.length && !selectedTapNames.includes(tapName)) {\n return total;\n }\n\n hooks.forEach((hook) => {\n if (selectedHooks.length && !selectedHooks.includes(hook)) {\n return;\n }\n\n const hookData = plugin[hook].filter((e) => e.tapName === tapName);\n if (hookData.length === 0) return;\n total.push({\n tapName,\n hook,\n key: `${tapName}${hook}`,\n hookData,\n });\n });\n\n return total;\n }, [] as WebpackPluginsTableDataItem[]);\n }, [plugin, selectedTapNames, selectedHooks]);\n\n return {\n dataSource,\n tapNames,\n hooks,\n };\n}\n\nexport const WebpackPluginsDataTable: React.FC<\n WebpackPluginsDataTableProps\n> = ({ dataSource }) => {\n return (\n <Table\n dataSource={dataSource}\n rowKey={(v) => `${v.tapName}_${v.hook}`}\n columns={[\n {\n title: `Plugin Tap Name`,\n render: (_v, r) => r.tapName,\n },\n {\n title: `Hook`,\n render: (_v, r) => r.hook,\n },\n {\n title: 'calls',\n render: (_v, r) => (\n <Tooltip\n title={`\"${r.hook}\" has been called ${r.data.length} times by \"${r.tapName}\"`}\n >\n {r.data.length}\n </Tooltip>\n ),\n sorter(a, b) {\n return a.data.length - b.data.length;\n },\n },\n {\n title: 'duration(total)',\n render: (_v, r) => formatCosts(sumBy(r.data, (e) => e.costs)),\n sorter(a, b) {\n return (\n sumBy(a.data, (e) => e.costs) - sumBy(b.data, (e) => e.costs)\n );\n },\n defaultSortOrder: 'descend',\n },\n ]}\n />\n );\n};\n"],"names":["useWebpackPluginsDataSource","plugin","selectedTapNames","selectedHooks","tapNames","useMemo","uniq","Object","e","hooks","dataSource","total","tapName","hook","hookData","WebpackPluginsDataTable","Table","v","_v","r","Tooltip","a","b","formatCosts","sumBy"],"mappings":";;;;;AAgBO,SAASA,4BACdC,MAAsB,EACtBC,gBAA0B,EAC1BC,aAAuB;IAEvB,MAAMC,WAAWC,QACf,IACEC,KACEC,OAAO,MAAM,CAACN,QACX,IAAI,GACJ,GAAG,CAAC,CAACO,IAAMA,EAAE,OAAO,IAE3B;QAACP;KAAO;IAGV,MAAMQ,QAAQJ,QAAQ,IAAME,OAAO,IAAI,CAACN,SAAS;QAACA;KAAO;IAEzD,MAAMS,aAAaL,QAAQ;QACzB,IAAI,CAACD,SAAS,MAAM,EAAE,OAAO,EAAE;QAE/B,OAAOA,SAAS,MAAM,CAAC,CAACO,OAAOC;YAC7B,IAAIV,iBAAiB,MAAM,IAAI,CAACA,iBAAiB,QAAQ,CAACU,UACxD,OAAOD;YAGTF,MAAM,OAAO,CAAC,CAACI;gBACb,IAAIV,cAAc,MAAM,IAAI,CAACA,cAAc,QAAQ,CAACU,OAClD;gBAGF,MAAMC,WAAWb,MAAM,CAACY,KAAK,CAAC,MAAM,CAAC,CAACL,IAAMA,EAAE,OAAO,KAAKI;gBAC1D,IAAIE,AAAoB,MAApBA,SAAS,MAAM,EAAQ;gBAC3BH,MAAM,IAAI,CAAC;oBACTC;oBACAC;oBACA,KAAK,GAAGD,UAAUC,MAAM;oBACxBC;gBACF;YACF;YAEA,OAAOH;QACT,GAAG,EAAE;IACP,GAAG;QAACV;QAAQC;QAAkBC;KAAc;IAE5C,OAAO;QACLO;QACAN;QACAK;IACF;AACF;AAEO,MAAMM,0BAET,CAAC,EAAEL,UAAU,EAAE,GACV,WAAP,GACE,IAACM,OAAKA;QACJ,YAAYN;QACZ,QAAQ,CAACO,IAAM,GAAGA,EAAE,OAAO,CAAC,CAAC,EAAEA,EAAE,IAAI,EAAE;QACvC,SAAS;YACP;gBACE,OAAO;gBACP,QAAQ,CAACC,IAAIC,IAAMA,EAAE,OAAO;YAC9B;YACA;gBACE,OAAO;gBACP,QAAQ,CAACD,IAAIC,IAAMA,EAAE,IAAI;YAC3B;YACA;gBACE,OAAO;gBACP,QAAQ,CAACD,IAAIC,IAAAA,WAAAA,GACX,IAACC,SAAOA;wBACN,OAAO,CAAC,CAAC,EAAED,EAAE,IAAI,CAAC,kBAAkB,EAAEA,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAEA,EAAE,OAAO,CAAC,CAAC,CAAC;kCAE5EA,EAAE,IAAI,CAAC,MAAM;;gBAGlB,QAAOE,CAAC,EAAEC,CAAC;oBACT,OAAOD,EAAE,IAAI,CAAC,MAAM,GAAGC,EAAE,IAAI,CAAC,MAAM;gBACtC;YACF;YACA;gBACE,OAAO;gBACP,QAAQ,CAACJ,IAAIC,IAAMI,YAAYC,MAAML,EAAE,IAAI,EAAE,CAACX,IAAMA,EAAE,KAAK;gBAC3D,QAAOa,CAAC,EAAEC,CAAC;oBACT,OACEE,MAAMH,EAAE,IAAI,EAAE,CAACb,IAAMA,EAAE,KAAK,IAAIgB,MAAMF,EAAE,IAAI,EAAE,CAACd,IAAMA,EAAE,KAAK;gBAEhE;gBACA,kBAAkB;YACpB;SACD"}
@@ -3,7 +3,7 @@ import { CloseCircleOutlined, FileSearchOutlined, MenuFoldOutlined, MenuUnfoldOu
3
3
  import { SDK } from "@rsdoctor/types";
4
4
  import { Resolver } from "@rsdoctor/utils/common";
5
5
  import { Button, Card, Col, Row, Space, Table, Typography } from "antd";
6
- import { get } from "lodash-es";
6
+ import { get } from "es-toolkit/compat";
7
7
  import react, { useMemo, useState } from "react";
8
8
  import { Size } from "../../constants.mjs";
9
9
  import { createFileStructures, formatCosts, mapFileKey } from "../../utils/index.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"components/Resolver/analysis.mjs","sources":["webpack://@rsdoctor/components/./src/components/Resolver/analysis.tsx"],"sourcesContent":["/* eslint-disable react/no-unescaped-entities */\nimport {\n CloseCircleOutlined,\n FileSearchOutlined,\n MenuFoldOutlined,\n MenuUnfoldOutlined,\n} from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport { Resolver } from '@rsdoctor/utils/common';\nimport { Button, Card, Col, Row, Space, Table, Typography } from 'antd';\nimport { get } from 'lodash-es';\nimport React, { useMemo, useState } from 'react';\nimport { Size } from '../../constants';\nimport { createFileStructures, formatCosts, mapFileKey } from '../../utils';\nimport { FileTree } from '../FileTree';\nimport { KeywordInput } from '../Form/keyword';\nimport { ServerAPIProvider, withServerAPI } from '../Manifest';\nimport { DiffViewer } from '../base';\n\nconst height = 735;\n\nconst ResolverDetailsPanel: React.FC<\n SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetResolverFileDetails>\n> = ({ filepath, before, after, resolvers }) => {\n const [collapsed, setCollapsed] = useState(false);\n\n return (\n <React.Fragment>\n <Col flex={1}>\n <Card\n title=\"Resolve Diff Viewer\"\n styles={{ body: { padding: 0, overflow: 'hidden' } }}\n >\n <DiffViewer\n style={{\n height: height + 50,\n }}\n isEmbed\n originalFilePath={filepath}\n modifiedFilePath={filepath}\n original={before}\n modified={after}\n />\n </Card>\n </Col>\n <Col span={collapsed ? 2 : 7}>\n <Card\n title={collapsed ? '...' : 'Resolve Details'}\n extra={\n <Button\n onClick={() => setCollapsed(!collapsed)}\n size=\"small\"\n icon={collapsed ? <MenuFoldOutlined /> : <MenuUnfoldOutlined />}\n ></Button>\n }\n style={collapsed ? { width: 80 } : undefined}\n >\n {collapsed ? null : (\n <Table\n style={{\n width: '100%',\n height,\n overflowY: 'scroll',\n wordBreak: 'break-all',\n }}\n size=\"small\"\n pagination={false}\n bordered\n rowKey={(e) => e.request}\n columns={[\n {\n title: 'Source Code',\n width: 200,\n render: (_v, r) => (\n <Typography.Text copyable>\n <Typography.Text code strong>\n {r.request}\n </Typography.Text>\n </Typography.Text>\n ),\n },\n {\n title: 'Duration',\n width: 80,\n render: (_v, r) => (\n <Typography.Text strong>\n {formatCosts(r.costs)}\n </Typography.Text>\n ),\n sorter: (a, b) => a.costs - b.costs,\n sortDirections: ['descend', 'ascend'],\n },\n {\n title: 'Resolve Result',\n render: (_v, r) => {\n if (Resolver.isResolveSuccessData(r))\n return (\n <Typography.Text copyable>{r.result}</Typography.Text>\n );\n return <CloseCircleOutlined style={{ color: '#f50' }} />;\n },\n },\n ]}\n dataSource={resolvers}\n />\n )}\n </Card>\n </Col>\n </React.Fragment>\n );\n};\n\nexport const ResolverFiles: React.FC<{\n filename: string;\n cwd: string;\n resolver: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetResolverFileTree>;\n}> = (props) => {\n const { resolver, cwd } = props;\n\n const [filepath, setFilepath] = useState('');\n\n const inlinedResourcePathKey = '__RESOURCEPATH__';\n const n = '/node_modules/';\n\n const paths = useMemo(() => {\n return resolver.map((e) => e.issuerPath).filter(Boolean);\n }, [resolver]);\n\n const filterPaths = useMemo(() => {\n return paths.filter((e) =>\n props.filename ? e.indexOf(props.filename) > -1 : true,\n );\n }, [props.filename, paths]);\n\n const allNodeModules =\n filterPaths.length && filterPaths.every((e) => e.indexOf(n) > -1);\n\n const files = useMemo(() => {\n return createFileStructures({\n files: filterPaths.length ? filterPaths : paths,\n cwd,\n fileTitle(file, basename) {\n return <div onClick={() => setFilepath(file)}>{basename}</div>;\n },\n });\n }, [props.filename]);\n\n return (\n <Row justify=\"start\" align=\"top\" wrap={false} gutter={Size.BasePadding}>\n <Col span={7}>\n <Card title=\"Files\">\n <FileTree\n style={{ width: '100%', height, overflow: 'scroll' }}\n treeData={files}\n defaultExpandedKeys={mapFileKey(\n files,\n allNodeModules ? 1 : 4,\n allNodeModules\n ? undefined\n : (node) => {\n const resourcePath: string = get(\n node,\n inlinedResourcePathKey,\n )!;\n const isNodeModules = resourcePath.indexOf(n) > -1;\n\n if (\n filterPaths.length &&\n filterPaths.every((e) => e.indexOf(n) > -1)\n ) {\n return true;\n }\n\n return !isNodeModules;\n },\n )}\n key={`tree_${props.filename}`}\n />\n </Card>\n </Col>\n {filepath && (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetResolverFileDetails}\n body={{ filepath }}\n >\n {(resolvers) => <ResolverDetailsPanel {...resolvers} />}\n </ServerAPIProvider>\n )}\n </Row>\n );\n};\n\nexport const ResolverAnalysisBase: React.FC<{\n project: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetProjectInfo>;\n}> = ({ project }) => {\n const { root: cwd } = project;\n const [filename, setFilename] = useState('');\n\n return (\n <div style={{ width: '100%' }}>\n <Space\n style={{ marginTop: Size.BasePadding, marginBottom: Size.BasePadding }}\n >\n <KeywordInput\n icon={<FileSearchOutlined />}\n label=\"Filename\"\n placeholder=\"search filename by keyword\"\n onChange={(e) => setFilename(e)}\n />\n </Space>\n <ServerAPIProvider api={SDK.ServerAPI.API.GetResolverFileTree}>\n {(resolver) => (\n <ResolverFiles filename={filename} resolver={resolver} cwd={cwd} />\n )}\n </ServerAPIProvider>\n </div>\n );\n};\n\nexport const ResolverAnalysis = withServerAPI({\n api: SDK.ServerAPI.API.GetProjectInfo,\n responsePropName: 'project',\n Component: ResolverAnalysisBase,\n});\n"],"names":["height","ResolverDetailsPanel","filepath","before","after","resolvers","collapsed","setCollapsed","useState","React","Col","Card","DiffViewer","Button","MenuFoldOutlined","MenuUnfoldOutlined","undefined","Table","e","_v","r","Typography","formatCosts","a","b","Resolver","CloseCircleOutlined","ResolverFiles","props","resolver","cwd","setFilepath","inlinedResourcePathKey","n","paths","useMemo","Boolean","filterPaths","allNodeModules","files","createFileStructures","file","basename","Row","Size","FileTree","mapFileKey","node","resourcePath","get","isNodeModules","ServerAPIProvider","SDK","ResolverAnalysisBase","project","filename","setFilename","Space","KeywordInput","FileSearchOutlined","ResolverAnalysis","withServerAPI"],"mappings":"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"}
1
+ {"version":3,"file":"components/Resolver/analysis.mjs","sources":["webpack://@rsdoctor/components/./src/components/Resolver/analysis.tsx"],"sourcesContent":["/* eslint-disable react/no-unescaped-entities */\nimport {\n CloseCircleOutlined,\n FileSearchOutlined,\n MenuFoldOutlined,\n MenuUnfoldOutlined,\n} from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport { Resolver } from '@rsdoctor/utils/common';\nimport { Button, Card, Col, Row, Space, Table, Typography } from 'antd';\nimport { get } from 'es-toolkit/compat';\nimport React, { useMemo, useState } from 'react';\nimport { Size } from '../../constants';\nimport { createFileStructures, formatCosts, mapFileKey } from '../../utils';\nimport { FileTree } from '../FileTree';\nimport { KeywordInput } from '../Form/keyword';\nimport { ServerAPIProvider, withServerAPI } from '../Manifest';\nimport { DiffViewer } from '../base';\n\nconst height = 735;\n\nconst ResolverDetailsPanel: React.FC<\n SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetResolverFileDetails>\n> = ({ filepath, before, after, resolvers }) => {\n const [collapsed, setCollapsed] = useState(false);\n\n return (\n <React.Fragment>\n <Col flex={1}>\n <Card\n title=\"Resolve Diff Viewer\"\n styles={{ body: { padding: 0, overflow: 'hidden' } }}\n >\n <DiffViewer\n style={{\n height: height + 50,\n }}\n isEmbed\n originalFilePath={filepath}\n modifiedFilePath={filepath}\n original={before}\n modified={after}\n />\n </Card>\n </Col>\n <Col span={collapsed ? 2 : 7}>\n <Card\n title={collapsed ? '...' : 'Resolve Details'}\n extra={\n <Button\n onClick={() => setCollapsed(!collapsed)}\n size=\"small\"\n icon={collapsed ? <MenuFoldOutlined /> : <MenuUnfoldOutlined />}\n ></Button>\n }\n style={collapsed ? { width: 80 } : undefined}\n >\n {collapsed ? null : (\n <Table\n style={{\n width: '100%',\n height,\n overflowY: 'scroll',\n wordBreak: 'break-all',\n }}\n size=\"small\"\n pagination={false}\n bordered\n rowKey={(e) => e.request}\n columns={[\n {\n title: 'Source Code',\n width: 200,\n render: (_v, r) => (\n <Typography.Text copyable>\n <Typography.Text code strong>\n {r.request}\n </Typography.Text>\n </Typography.Text>\n ),\n },\n {\n title: 'Duration',\n width: 80,\n render: (_v, r) => (\n <Typography.Text strong>\n {formatCosts(r.costs)}\n </Typography.Text>\n ),\n sorter: (a, b) => a.costs - b.costs,\n sortDirections: ['descend', 'ascend'],\n },\n {\n title: 'Resolve Result',\n render: (_v, r) => {\n if (Resolver.isResolveSuccessData(r))\n return (\n <Typography.Text copyable>{r.result}</Typography.Text>\n );\n return <CloseCircleOutlined style={{ color: '#f50' }} />;\n },\n },\n ]}\n dataSource={resolvers}\n />\n )}\n </Card>\n </Col>\n </React.Fragment>\n );\n};\n\nexport const ResolverFiles: React.FC<{\n filename: string;\n cwd: string;\n resolver: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetResolverFileTree>;\n}> = (props) => {\n const { resolver, cwd } = props;\n\n const [filepath, setFilepath] = useState('');\n\n const inlinedResourcePathKey = '__RESOURCEPATH__';\n const n = '/node_modules/';\n\n const paths = useMemo(() => {\n return resolver.map((e) => e.issuerPath).filter(Boolean);\n }, [resolver]);\n\n const filterPaths = useMemo(() => {\n return paths.filter((e) =>\n props.filename ? e.indexOf(props.filename) > -1 : true,\n );\n }, [props.filename, paths]);\n\n const allNodeModules =\n filterPaths.length && filterPaths.every((e) => e.indexOf(n) > -1);\n\n const files = useMemo(() => {\n return createFileStructures({\n files: filterPaths.length ? filterPaths : paths,\n cwd,\n fileTitle(file, basename) {\n return <div onClick={() => setFilepath(file)}>{basename}</div>;\n },\n });\n }, [props.filename]);\n\n return (\n <Row justify=\"start\" align=\"top\" wrap={false} gutter={Size.BasePadding}>\n <Col span={7}>\n <Card title=\"Files\">\n <FileTree\n style={{ width: '100%', height, overflow: 'scroll' }}\n treeData={files}\n defaultExpandedKeys={mapFileKey(\n files,\n allNodeModules ? 1 : 4,\n allNodeModules\n ? undefined\n : (node) => {\n const resourcePath: string = get(\n node,\n inlinedResourcePathKey,\n )!;\n const isNodeModules = resourcePath.indexOf(n) > -1;\n\n if (\n filterPaths.length &&\n filterPaths.every((e) => e.indexOf(n) > -1)\n ) {\n return true;\n }\n\n return !isNodeModules;\n },\n )}\n key={`tree_${props.filename}`}\n />\n </Card>\n </Col>\n {filepath && (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetResolverFileDetails}\n body={{ filepath }}\n >\n {(resolvers) => <ResolverDetailsPanel {...resolvers} />}\n </ServerAPIProvider>\n )}\n </Row>\n );\n};\n\nexport const ResolverAnalysisBase: React.FC<{\n project: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetProjectInfo>;\n}> = ({ project }) => {\n const { root: cwd } = project;\n const [filename, setFilename] = useState('');\n\n return (\n <div style={{ width: '100%' }}>\n <Space\n style={{ marginTop: Size.BasePadding, marginBottom: Size.BasePadding }}\n >\n <KeywordInput\n icon={<FileSearchOutlined />}\n label=\"Filename\"\n placeholder=\"search filename by keyword\"\n onChange={(e) => setFilename(e)}\n />\n </Space>\n <ServerAPIProvider api={SDK.ServerAPI.API.GetResolverFileTree}>\n {(resolver) => (\n <ResolverFiles filename={filename} resolver={resolver} cwd={cwd} />\n )}\n </ServerAPIProvider>\n </div>\n );\n};\n\nexport const ResolverAnalysis = withServerAPI({\n api: SDK.ServerAPI.API.GetProjectInfo,\n responsePropName: 'project',\n Component: ResolverAnalysisBase,\n});\n"],"names":["height","ResolverDetailsPanel","filepath","before","after","resolvers","collapsed","setCollapsed","useState","React","Col","Card","DiffViewer","Button","MenuFoldOutlined","MenuUnfoldOutlined","undefined","Table","e","_v","r","Typography","formatCosts","a","b","Resolver","CloseCircleOutlined","ResolverFiles","props","resolver","cwd","setFilepath","inlinedResourcePathKey","n","paths","useMemo","Boolean","filterPaths","allNodeModules","files","createFileStructures","file","basename","Row","Size","FileTree","mapFileKey","node","resourcePath","get","isNodeModules","ServerAPIProvider","SDK","ResolverAnalysisBase","project","filename","setFilename","Space","KeywordInput","FileSearchOutlined","ResolverAnalysis","withServerAPI"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import "react";
3
3
  import { Typography } from "antd";
4
- import { upperFirst as external_lodash_es_upperFirst } from "lodash-es";
4
+ import { upperFirst as compat_upperFirst } from "es-toolkit/compat";
5
5
  const Title = ({ upperFirst = true, fontSize = 16, text, hash })=>{
6
- const t = 'string' == typeof text ? upperFirst ? external_lodash_es_upperFirst(text) : text : text;
6
+ const t = 'string' == typeof text ? upperFirst ? compat_upperFirst(text) : text : text;
7
7
  return /*#__PURE__*/ jsx(Typography.Text, {
8
8
  style: {
9
9
  fontSize
@@ -1 +1 @@
1
- {"version":3,"file":"components/Title/index.mjs","sources":["webpack://@rsdoctor/components/./src/components/Title/index.tsx"],"sourcesContent":["import React, { PropsWithChildren } from 'react';\nimport { Typography } from 'antd';\nimport { upperFirst as upf } from 'lodash-es';\n\ninterface TitleProps {\n /**\n * @default true\n */\n upperFirst?: boolean;\n /**\n * @default 16\n */\n fontSize?: number;\n text: string | React.ReactNode;\n hash?: string;\n}\n\nexport const Title: React.FC<PropsWithChildren<TitleProps>> = ({\n upperFirst = true,\n fontSize = 16,\n text,\n hash,\n}) => {\n const t = typeof text === 'string' ? (upperFirst ? upf(text) : text) : text;\n return (\n <Typography.Text style={{ fontSize }} strong>\n {hash ? (\n <a href={hash} id={hash.replace(/^#/, '')} style={{ color: 'inherit' }}>\n {t}\n </a>\n ) : (\n t\n )}\n </Typography.Text>\n );\n};\n"],"names":["Title","upperFirst","fontSize","text","hash","t","upf","Typography"],"mappings":";;;;AAiBO,MAAMA,QAAiD,CAAC,EAC7DC,aAAa,IAAI,EACjBC,WAAW,EAAE,EACbC,IAAI,EACJC,IAAI,EACL;IACC,MAAMC,IAAI,AAAgB,YAAhB,OAAOF,OAAqBF,aAAaK,8BAAIH,QAAQA,OAAQA;IACvE,OAAO,WAAP,GACE,IAACI,WAAW,IAAI;QAAC,OAAO;YAAEL;QAAS;QAAG,QAAM;kBACzCE,OAAO,WAAPA,GACC,IAAC;YAAE,MAAMA;YAAM,IAAIA,KAAK,OAAO,CAAC,MAAM;YAAK,OAAO;gBAAE,OAAO;YAAU;sBAClEC;aAGHA;;AAIR"}
1
+ {"version":3,"file":"components/Title/index.mjs","sources":["webpack://@rsdoctor/components/./src/components/Title/index.tsx"],"sourcesContent":["import React, { PropsWithChildren } from 'react';\nimport { Typography } from 'antd';\nimport { upperFirst as upf } from 'es-toolkit/compat';\n\ninterface TitleProps {\n /**\n * @default true\n */\n upperFirst?: boolean;\n /**\n * @default 16\n */\n fontSize?: number;\n text: string | React.ReactNode;\n hash?: string;\n}\n\nexport const Title: React.FC<PropsWithChildren<TitleProps>> = ({\n upperFirst = true,\n fontSize = 16,\n text,\n hash,\n}) => {\n const t = typeof text === 'string' ? (upperFirst ? upf(text) : text) : text;\n return (\n <Typography.Text style={{ fontSize }} strong>\n {hash ? (\n <a href={hash} id={hash.replace(/^#/, '')} style={{ color: 'inherit' }}>\n {t}\n </a>\n ) : (\n t\n )}\n </Typography.Text>\n );\n};\n"],"names":["Title","upperFirst","fontSize","text","hash","t","upf","Typography"],"mappings":";;;;AAiBO,MAAMA,QAAiD,CAAC,EAC7DC,aAAa,IAAI,EACjBC,WAAW,EAAE,EACbC,IAAI,EACJC,IAAI,EACL;IACC,MAAMC,IAAI,AAAgB,YAAhB,OAAOF,OAAqBF,aAAaK,kBAAIH,QAAQA,OAAQA;IACvE,OAAO,WAAP,GACE,IAACI,WAAW,IAAI;QAAC,OAAO;YAAEL;QAAS;QAAG,QAAM;kBACzCE,OAAO,WAAPA,GACC,IAAC;YAAE,MAAMA;YAAM,IAAIA,KAAK,OAAO,CAAC,MAAM;YAAK,OAAO;gBAAE,OAAO;YAAU;sBAClEC;aAGHA;;AAIR"}
@@ -20,7 +20,7 @@ function getDataProtocolFormat(content) {
20
20
  return '';
21
21
  }
22
22
  } catch (error) {
23
- console.error('解析 data 协议文件格式失败:', error);
23
+ console.error('解析 data 协议文件格式失败::', error);
24
24
  return '';
25
25
  }
26
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"components/base/CodeViewer/utils.mjs","sources":["webpack://@rsdoctor/components/./src/components/base/CodeViewer/utils.ts"],"sourcesContent":["import { Monaco } from '@monaco-editor/react';\nimport { SDK } from '@rsdoctor/types';\nimport type { Range as RangeClass } from 'monaco-editor';\nimport { editor } from 'monaco-editor';\nimport { extname } from 'path';\n\n/**\n * 判断 data 协议文件格式 `data:[<mediatype>][;base64],<data>`\n * 完整协议: https://www.rfc-editor.org/rfc/rfc2397.html\n * @param {string} content 文件内容\n * @returns {string} 文件格式类型\n */\nfunction getDataProtocolFormat(content: string): string {\n // 如果内容为空返回空\n if (!content) {\n return '';\n }\n\n try {\n const prefix = 'data:';\n // 检查是否以 data: 开头\n if (!content.startsWith(prefix)) {\n return '';\n }\n\n const { mimeType } = parseDataUrl(content);\n\n // 根据 MIME 类型返回对应的格式\n switch (mimeType) {\n case 'text/javascript':\n return 'javascript';\n case 'text/html':\n return 'html';\n case 'text/css':\n return 'css';\n case 'text/plain':\n return 'text';\n case 'application/json':\n return 'json';\n // 可以根据需要添加更多类型\n default:\n return '';\n }\n } catch (error) {\n console.error('解析 data 协议文件格式失败:', error);\n return '';\n }\n}\n\n/**\n * 解析 Data URL 并提取 MIME 类型\n * @param {string} dataUrl - 要解析的 Data URL 字符串\n * @returns {Object} 包含解析结果的对象\n */\nfunction parseDataUrl(dataUrl: string) {\n // 检查是否是 Data URL\n if (!dataUrl.startsWith('data:')) {\n throw new Error('输入不是有效的 Data URL');\n }\n\n // 提取内容部分 (去掉 \"data:\" 前缀)\n const content = dataUrl.substring(5);\n\n // 查找分隔数据和元数据的逗号\n const commaIndex = content.indexOf(',');\n\n if (commaIndex === -1) {\n throw new Error('无效的 Data URL 格式: 缺少数据分隔符');\n }\n\n // 提取元数据部分\n const metadataPart = content.substring(0, commaIndex);\n\n // 提取数据部分\n const dataPart = content.substring(commaIndex + 1);\n\n // 解析元数据\n let mimeType = '';\n let charset = '';\n let isBase64 = false;\n\n // 分割元数据部分\n const metadataSegments = metadataPart.split(';');\n\n // 第一部分通常是 MIME 类型\n if (metadataSegments.length > 0) {\n mimeType = metadataSegments[0] || 'text/plain'; // 默认为 text/plain\n }\n\n // 检查其他元数据参数\n for (let i = 1; i < metadataSegments.length; i++) {\n const segment = metadataSegments[i];\n\n if (segment === 'base64') {\n isBase64 = true;\n } else if (segment.startsWith('charset=')) {\n charset = segment.substring(8);\n }\n }\n\n // 返回解析结果\n return {\n mimeType,\n charset,\n isBase64,\n data: dataPart,\n };\n}\n\nexport function getFilePathFormat(filePath: string): string {\n if (!filePath) return '';\n\n const i = getDataProtocolFormat(filePath);\n\n if (i) {\n return i;\n }\n\n try {\n const ext = extname(filePath).slice(1);\n switch (ext) {\n case 'js':\n case 'cjs':\n case 'mjs':\n case 'jsx':\n return 'javascript';\n case 'ts':\n case 'tsx':\n return 'typescript';\n case 'md':\n return 'markdown';\n default:\n return ext;\n }\n } catch (e) {\n return '';\n }\n}\n\n/**\n * 默认编辑器样式, 适合预览代码\n */\nexport const DefaultEditorConfig: editor.IStandaloneEditorConstructionOptions =\n {\n // 设置编辑器为只读模式\n readOnly: true,\n // 设置 DOM 元素为只读模式\n domReadOnly: true,\n // 设置字体大小为 14px\n fontSize: 14,\n // 设置制表符宽度为 2 个空格\n tabSize: 2,\n // 设置行高为 24px\n lineHeight: 24,\n // 关闭验证装饰器的渲染(如错误、警告标记等)\n renderValidationDecorations: 'off',\n // 在概览标尺中隐藏光标\n hideCursorInOverviewRuler: true,\n // 启用平滑滚动\n smoothScrolling: true,\n // 设置文本换行方式\n wordWrap: 'on',\n // 启用颜色装饰器(如显示颜色预览)\n colorDecorators: true,\n // 禁用代码镜头功能(如显示引用次数等)\n codeLens: false,\n // 设置光标宽度为 0(隐藏光标)\n cursorWidth: 0,\n // 禁用右侧的小地图预览\n minimap: {\n enabled: false,\n },\n\n /** 禁用编辑器内置的右键菜单 */\n contextmenu: false,\n /** 禁用定义跳转功能 */\n gotoLocation: {\n multiple: 'goto',\n multipleDefinitions: 'goto',\n multipleTypeDefinitions: 'goto',\n multipleDeclarations: 'goto',\n multipleImplementations: 'goto',\n multipleReferences: 'goto',\n },\n /** 禁用悬停提示功能 */\n hover: { enabled: false },\n // 禁用链接功能 - 会禁用 Command/Ctrl + 点击\n links: false,\n };\n\n/**\n * get monaco options, it'll combine default config\n * @param options\n * @returns target options\n */\nexport function defineMonacoOptions(\n options?: editor.IStandaloneEditorConstructionOptions,\n): editor.IStandaloneEditorConstructionOptions {\n return {\n ...structuredClone(DefaultEditorConfig),\n ...options,\n };\n}\n\nexport function getFileName(filePath: string): string {\n // 如果内容为空返回空\n if (!filePath) {\n return '';\n }\n\n const prefix = 'data:';\n // 检查是否以 data: 开头\n if (filePath.startsWith(prefix)) {\n return 'data';\n }\n\n return filePath.split('/').at(-1) || '';\n}\n\nexport function getSelectionRange(\n source: SDK.SourceRange,\n Range: typeof RangeClass,\n) {\n const { start, end } = source;\n const { line = 1, column = 0 } = start;\n return new Range(\n line,\n column + 1,\n end?.line ?? line,\n (end?.column ?? 9999) + 1,\n );\n}\n\nexport function editorShowRange(\n editor: editor.IStandaloneCodeEditor,\n monaco: Monaco,\n ranges?: SDK.SourceRange[],\n) {\n if (!ranges || ranges.length === 0) return;\n\n const decorations = ranges.map((range) => ({\n range: getSelectionRange(range, monaco.Range),\n options: {\n inlineClassName: 'file-inline-decoration',\n },\n }));\n editor.deltaDecorations([], decorations);\n\n setTimeout(() => {\n editor.revealLine(decorations[0].range.startLineNumber);\n });\n}\n"],"names":["getDataProtocolFormat","content","prefix","mimeType","parseDataUrl","error","console","dataUrl","Error","commaIndex","metadataPart","dataPart","charset","isBase64","metadataSegments","i","segment","getFilePathFormat","filePath","ext","extname","e","DefaultEditorConfig","defineMonacoOptions","options","structuredClone","getFileName","getSelectionRange","source","Range","start","end","line","column","editorShowRange","editor","monaco","ranges","decorations","range","setTimeout"],"mappings":";AAYA,SAASA,sBAAsBC,OAAe;IAE5C,IAAI,CAACA,SACH,OAAO;IAGT,IAAI;QACF,MAAMC,SAAS;QAEf,IAAI,CAACD,QAAQ,UAAU,CAACC,SACtB,OAAO;QAGT,MAAM,EAAEC,QAAQ,EAAE,GAAGC,aAAaH;QAGlC,OAAQE;YACN,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YAET;gBACE,OAAO;QACX;IACF,EAAE,OAAOE,OAAO;QACdC,QAAQ,KAAK,CAAC,qBAAqBD;QACnC,OAAO;IACT;AACF;AAOA,SAASD,aAAaG,OAAe;IAEnC,IAAI,CAACA,QAAQ,UAAU,CAAC,UACtB,MAAM,IAAIC,MAAM;IAIlB,MAAMP,UAAUM,QAAQ,SAAS,CAAC;IAGlC,MAAME,aAAaR,QAAQ,OAAO,CAAC;IAEnC,IAAIQ,AAAe,OAAfA,YACF,MAAM,IAAID,MAAM;IAIlB,MAAME,eAAeT,QAAQ,SAAS,CAAC,GAAGQ;IAG1C,MAAME,WAAWV,QAAQ,SAAS,CAACQ,aAAa;IAGhD,IAAIN,WAAW;IACf,IAAIS,UAAU;IACd,IAAIC,WAAW;IAGf,MAAMC,mBAAmBJ,aAAa,KAAK,CAAC;IAG5C,IAAII,iBAAiB,MAAM,GAAG,GAC5BX,WAAWW,gBAAgB,CAAC,EAAE,IAAI;IAIpC,IAAK,IAAIC,IAAI,GAAGA,IAAID,iBAAiB,MAAM,EAAEC,IAAK;QAChD,MAAMC,UAAUF,gBAAgB,CAACC,EAAE;QAEnC,IAAIC,AAAY,aAAZA,SACFH,WAAW;aACN,IAAIG,QAAQ,UAAU,CAAC,aAC5BJ,UAAUI,QAAQ,SAAS,CAAC;IAEhC;IAGA,OAAO;QACLb;QACAS;QACAC;QACA,MAAMF;IACR;AACF;AAEO,SAASM,kBAAkBC,QAAgB;IAChD,IAAI,CAACA,UAAU,OAAO;IAEtB,MAAMH,IAAIf,sBAAsBkB;IAEhC,IAAIH,GACF,OAAOA;IAGT,IAAI;QACF,MAAMI,MAAMC,QAAQF,UAAU,KAAK,CAAC;QACpC,OAAQC;YACN,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAO;YACT,KAAK;YACL,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT;gBACE,OAAOA;QACX;IACF,EAAE,OAAOE,GAAG;QACV,OAAO;IACT;AACF;AAKO,MAAMC,sBACX;IAEE,UAAU;IAEV,aAAa;IAEb,UAAU;IAEV,SAAS;IAET,YAAY;IAEZ,6BAA6B;IAE7B,2BAA2B;IAE3B,iBAAiB;IAEjB,UAAU;IAEV,iBAAiB;IAEjB,UAAU;IAEV,aAAa;IAEb,SAAS;QACP,SAAS;IACX;IAGA,aAAa;IAEb,cAAc;QACZ,UAAU;QACV,qBAAqB;QACrB,yBAAyB;QACzB,sBAAsB;QACtB,yBAAyB;QACzB,oBAAoB;IACtB;IAEA,OAAO;QAAE,SAAS;IAAM;IAExB,OAAO;AACT;AAOK,SAASC,oBACdC,OAAqD;IAErD,OAAO;QACL,GAAGC,gBAAgBH,oBAAoB;QACvC,GAAGE,OAAO;IACZ;AACF;AAEO,SAASE,YAAYR,QAAgB;IAE1C,IAAI,CAACA,UACH,OAAO;IAGT,MAAMhB,SAAS;IAEf,IAAIgB,SAAS,UAAU,CAAChB,SACtB,OAAO;IAGT,OAAOgB,SAAS,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO;AACvC;AAEO,SAASS,kBACdC,MAAuB,EACvBC,KAAwB;IAExB,MAAM,EAAEC,KAAK,EAAEC,GAAG,EAAE,GAAGH;IACvB,MAAM,EAAEI,OAAO,CAAC,EAAEC,SAAS,CAAC,EAAE,GAAGH;IACjC,OAAO,IAAID,MACTG,MACAC,SAAS,GACTF,AAAAA,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,IAAI,AAAD,KAAKC,MACZD,AAAAA,CAAAA,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,MAAM,AAAD,KAAK,IAAG,IAAK;AAE5B;AAEO,SAASG,gBACdC,MAAoC,EACpCC,MAAc,EACdC,MAA0B;IAE1B,IAAI,CAACA,UAAUA,AAAkB,MAAlBA,OAAO,MAAM,EAAQ;IAEpC,MAAMC,cAAcD,OAAO,GAAG,CAAC,CAACE,QAAW;YACzC,OAAOZ,kBAAkBY,OAAOH,OAAO,KAAK;YAC5C,SAAS;gBACP,iBAAiB;YACnB;QACF;IACAD,OAAO,gBAAgB,CAAC,EAAE,EAAEG;IAE5BE,WAAW;QACTL,OAAO,UAAU,CAACG,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe;IACxD;AACF"}
1
+ {"version":3,"file":"components/base/CodeViewer/utils.mjs","sources":["webpack://@rsdoctor/components/./src/components/base/CodeViewer/utils.ts"],"sourcesContent":["import { Monaco } from '@monaco-editor/react';\nimport { SDK } from '@rsdoctor/types';\nimport type { Range as RangeClass } from 'monaco-editor';\nimport { editor } from 'monaco-editor';\nimport { extname } from 'path';\n\n/**\n * 判断 data 协议文件格式 `data:[<mediatype>][;base64],<data>`\n * 完整协议: https://www.rfc-editor.org/rfc/rfc2397.html\n * @param {string} content 文件内容\n * @returns {string} 文件格式类型\n */\nfunction getDataProtocolFormat(content: string): string {\n // 如果内容为空返回空\n if (!content) {\n return '';\n }\n\n try {\n const prefix = 'data:';\n // 检查是否以 data: 开头\n if (!content.startsWith(prefix)) {\n return '';\n }\n\n const { mimeType } = parseDataUrl(content);\n\n // 根据 MIME 类型返回对应的格式\n switch (mimeType) {\n case 'text/javascript':\n return 'javascript';\n case 'text/html':\n return 'html';\n case 'text/css':\n return 'css';\n case 'text/plain':\n return 'text';\n case 'application/json':\n return 'json';\n // 可以根据需要添加更多类型\n default:\n return '';\n }\n } catch (error) {\n console.error('解析 data 协议文件格式失败::', error);\n return '';\n }\n}\n\n/**\n * 解析 Data URL 并提取 MIME 类型\n * @param {string} dataUrl - 要解析的 Data URL 字符串\n * @returns {Object} 包含解析结果的对象\n */\nfunction parseDataUrl(dataUrl: string) {\n // 检查是否是 Data URL\n if (!dataUrl.startsWith('data:')) {\n throw new Error('输入不是有效的 Data URL');\n }\n\n // 提取内容部分 (去掉 \"data:\" 前缀)\n const content = dataUrl.substring(5);\n\n // 查找分隔数据和元数据的逗号\n const commaIndex = content.indexOf(',');\n\n if (commaIndex === -1) {\n throw new Error('无效的 Data URL 格式: 缺少数据分隔符');\n }\n\n // 提取元数据部分\n const metadataPart = content.substring(0, commaIndex);\n\n // 提取数据部分\n const dataPart = content.substring(commaIndex + 1);\n\n // 解析元数据\n let mimeType = '';\n let charset = '';\n let isBase64 = false;\n\n // 分割元数据部分\n const metadataSegments = metadataPart.split(';');\n\n // 第一部分通常是 MIME 类型\n if (metadataSegments.length > 0) {\n mimeType = metadataSegments[0] || 'text/plain'; // 默认为 text/plain\n }\n\n // 检查其他元数据参数\n for (let i = 1; i < metadataSegments.length; i++) {\n const segment = metadataSegments[i];\n\n if (segment === 'base64') {\n isBase64 = true;\n } else if (segment.startsWith('charset=')) {\n charset = segment.substring(8);\n }\n }\n\n // 返回解析结果\n return {\n mimeType,\n charset,\n isBase64,\n data: dataPart,\n };\n}\n\nexport function getFilePathFormat(filePath: string): string {\n if (!filePath) return '';\n\n const i = getDataProtocolFormat(filePath);\n\n if (i) {\n return i;\n }\n\n try {\n const ext = extname(filePath).slice(1);\n switch (ext) {\n case 'js':\n case 'cjs':\n case 'mjs':\n case 'jsx':\n return 'javascript';\n case 'ts':\n case 'tsx':\n return 'typescript';\n case 'md':\n return 'markdown';\n default:\n return ext;\n }\n } catch (e) {\n return '';\n }\n}\n\n/**\n * 默认编辑器样式, 适合预览代码\n */\nexport const DefaultEditorConfig: editor.IStandaloneEditorConstructionOptions =\n {\n // 设置编辑器为只读模式\n readOnly: true,\n // 设置 DOM 元素为只读模式\n domReadOnly: true,\n // 设置字体大小为 14px\n fontSize: 14,\n // 设置制表符宽度为 2 个空格\n tabSize: 2,\n // 设置行高为 24px\n lineHeight: 24,\n // 关闭验证装饰器的渲染(如错误、警告标记等)\n renderValidationDecorations: 'off',\n // 在概览标尺中隐藏光标\n hideCursorInOverviewRuler: true,\n // 启用平滑滚动\n smoothScrolling: true,\n // 设置文本换行方式\n wordWrap: 'on',\n // 启用颜色装饰器(如显示颜色预览)\n colorDecorators: true,\n // 禁用代码镜头功能(如显示引用次数等)\n codeLens: false,\n // 设置光标宽度为 0(隐藏光标)\n cursorWidth: 0,\n // 禁用右侧的小地图预览\n minimap: {\n enabled: false,\n },\n\n /** 禁用编辑器内置的右键菜单 */\n contextmenu: false,\n /** 禁用定义跳转功能 */\n gotoLocation: {\n multiple: 'goto',\n multipleDefinitions: 'goto',\n multipleTypeDefinitions: 'goto',\n multipleDeclarations: 'goto',\n multipleImplementations: 'goto',\n multipleReferences: 'goto',\n },\n /** 禁用悬停提示功能 */\n hover: { enabled: false },\n // 禁用链接功能 - 会禁用 Command/Ctrl + 点击\n links: false,\n };\n\n/**\n * get monaco options, it'll combine default config\n * @param options\n * @returns target options\n */\nexport function defineMonacoOptions(\n options?: editor.IStandaloneEditorConstructionOptions,\n): editor.IStandaloneEditorConstructionOptions {\n return {\n ...structuredClone(DefaultEditorConfig),\n ...options,\n };\n}\n\nexport function getFileName(filePath: string): string {\n // 如果内容为空返回空\n if (!filePath) {\n return '';\n }\n\n const prefix = 'data:';\n // 检查是否以 data: 开头\n if (filePath.startsWith(prefix)) {\n return 'data';\n }\n\n return filePath.split('/').at(-1) || '';\n}\n\nexport function getSelectionRange(\n source: SDK.SourceRange,\n Range: typeof RangeClass,\n) {\n const { start, end } = source;\n const { line = 1, column = 0 } = start;\n return new Range(\n line,\n column + 1,\n end?.line ?? line,\n (end?.column ?? 9999) + 1,\n );\n}\n\nexport function editorShowRange(\n editor: editor.IStandaloneCodeEditor,\n monaco: Monaco,\n ranges?: SDK.SourceRange[],\n) {\n if (!ranges || ranges.length === 0) return;\n\n const decorations = ranges.map((range) => ({\n range: getSelectionRange(range, monaco.Range),\n options: {\n inlineClassName: 'file-inline-decoration',\n },\n }));\n editor.deltaDecorations([], decorations);\n\n setTimeout(() => {\n editor.revealLine(decorations[0].range.startLineNumber);\n });\n}\n"],"names":["getDataProtocolFormat","content","prefix","mimeType","parseDataUrl","error","console","dataUrl","Error","commaIndex","metadataPart","dataPart","charset","isBase64","metadataSegments","i","segment","getFilePathFormat","filePath","ext","extname","e","DefaultEditorConfig","defineMonacoOptions","options","structuredClone","getFileName","getSelectionRange","source","Range","start","end","line","column","editorShowRange","editor","monaco","ranges","decorations","range","setTimeout"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
2
  import { CodepenCircleOutlined, ColumnHeightOutlined, InfoCircleOutlined } from "@ant-design/icons";
3
3
  import { SDK } from "@rsdoctor/types";
4
4
  import { Button, Card, Col, Divider, Empty, Popover, Row, Space, Tag, Tooltip, Tree, Typography } from "antd";
5
- import { omitBy, sumBy } from "lodash-es";
5
+ import { omitBy, sumBy } from "es-toolkit/compat";
6
6
  import { dirname, relative } from "path";
7
7
  import { useEffect, useMemo, useState } from "react";
8
8
  import { CodeViewer } from "../../../components/base/index.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"pages/BundleSize/components/asset.mjs","sources":["webpack://@rsdoctor/components/./src/pages/BundleSize/components/asset.tsx"],"sourcesContent":["import {\n CodepenCircleOutlined,\n ColumnHeightOutlined,\n InfoCircleOutlined,\n} from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Button,\n Card,\n Col,\n Divider,\n Empty,\n Popover,\n Row,\n Space,\n Tag,\n Tooltip,\n Tree,\n Typography,\n} from 'antd';\nimport { DataNode as AntdDataNode } from 'antd/es/tree';\nimport { omitBy, sumBy } from 'lodash-es';\nimport { dirname, relative } from 'path';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { CodeViewer } from 'src/components/base';\nimport { Badge as Bdg } from '../../../components/Badge';\nimport { KeywordInput } from '../../../components/Form/keyword';\nimport { Keyword } from '../../../components/Keyword';\nimport { ServerAPIProvider } from '../../../components/Manifest';\nimport { TextDrawer } from '../../../components/TextDrawer';\nimport { Size } from '../../../constants';\nimport {\n DataNode,\n createFileStructures,\n formatSize,\n isJsDataUrl,\n useI18n,\n} from '../../../utils';\nimport { ModuleAnalyzeComponent } from '../../ModuleAnalyze';\nimport { ModuleGraphListContext } from '../config';\nimport styles from './index.module.scss';\n\nconst { DirectoryTree } = Tree;\n\nlet expandedModulesKeys: React.Key[] = [];\nconst TAB_MAP = {\n source: 'source code',\n transformed: 'Transformed Code (After compile)',\n parsedSource: 'Bundled Code (After bundle and tree-shaking)',\n};\n\nconst tagStyle = {\n margin: 'none',\n marginInlineEnd: 0,\n};\n\nconst EmptyCodeItem = () => (\n <Empty\n description={`Do not have the module code.\n (1) If you use the brief mode, there will not have any codes to show.\n (2) If you use lite mode, there will not have source codes.`}\n />\n);\n\nexport const ModuleCodeViewer: React.FC<{ data: SDK.ModuleData }> = ({\n data,\n}) => {\n const [tab, setTab] = useState('');\n const { t } = useI18n();\n\n const TAB_LAB_MAP: Record<string, string> = {\n source: 'Source Code',\n transformed: `Transformed Code(${t('After Compile')})`,\n parsedSource: `Bundled Code(${t('After Bundled')})`,\n };\n if (!data) return null;\n\n const { path } = data;\n\n return (\n <TextDrawer\n text=\"\"\n buttonProps={{\n size: 'small',\n icon: (\n <Popover content=\"Open the Codes Box\">\n <CodepenCircleOutlined />\n </Popover>\n ),\n type: 'default',\n }}\n buttonStyle={{ padding: `0 4px` }}\n drawerProps={{\n destroyOnClose: true,\n title: `Code of \"${path}\"`,\n }}\n >\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetModuleCodeByModuleId}\n body={{ moduleId: data.id }}\n >\n {(source) => {\n return (\n <>\n {!source['source'] &&\n !source['parsedSource'] &&\n !source['transformed'] ? (\n <EmptyCodeItem />\n ) : (\n <Card\n className=\"code-size-card\"\n style={{ width: '100%' }}\n tabList={Object.keys(omitBy(source, (s) => !s))\n .map((k) => ({ tab: k }))\n .map((e) => ({\n ...e,\n tab: TAB_LAB_MAP[e.tab],\n key: e.tab,\n }))}\n defaultActiveTabKey={\n source['parsedSource'] ? 'parsedSource' : 'source'\n }\n onTabChange={(v) => setTab(v)}\n tabBarExtraContent={\n <Popover\n placement=\"bottom\"\n title={\n <Typography.Title level={5}>Explain</Typography.Title>\n }\n content={\n <>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: 30,\n }}\n >\n <div>\n <Typography.Text strong>Source: </Typography.Text>\n <Typography.Text>\n {TAB_MAP.source}\n </Typography.Text>\n </div>\n <div>\n <Typography.Text strong>\n Transformed:\n </Typography.Text>\n <Typography.Text>\n {TAB_MAP.transformed}\n </Typography.Text>\n </div>\n <div>\n <Typography.Text strong>\n Bundled Source:\n </Typography.Text>\n <Typography.Text>\n {TAB_MAP.parsedSource}\n </Typography.Text>\n </div>\n <br />\n <Typography.Text strong>{'More'}</Typography.Text>\n <Typography.Text>\n {t('CodeModeExplain')}\n </Typography.Text>\n </div>\n </>\n }\n trigger={'hover'}\n >\n <a href=\"#\">Explain</a>\n </Popover>\n }\n styles={{ body: { padding: 0, overflow: 'hidden' } }}\n >\n {source['parsedSource'] ||\n source['source'] ||\n source['transformed'] ? (\n <CodeViewer\n isEmbed\n code={\n tab\n ? source[tab as keyof SDK.ModuleSource]\n : source['parsedSource']\n ? source['parsedSource']\n : source['source']\n }\n filePath={path}\n />\n ) : (\n <EmptyCodeItem />\n )}\n </Card>\n )}\n </>\n );\n }}\n </ServerAPIProvider>\n </TextDrawer>\n );\n};\n\nexport const ModuleGraphViewer: React.FC<{\n id: number | string;\n show: boolean;\n setShow: (_show: boolean) => void;\n cwd: string;\n}> = ({ id, show, setShow, cwd }) => {\n if (!id) return null;\n\n return (\n <ServerAPIProvider api={SDK.ServerAPI.API.GetAllModuleGraph} body={{}}>\n {(modules) => (\n <ModuleAnalyzeComponent\n cwd={cwd}\n moduleId={id}\n modules={modules}\n show={show}\n setShow={setShow}\n />\n )}\n </ServerAPIProvider>\n );\n};\n\nconst inlinedResourcePathKey = '__RESOURCEPATH__';\n\nexport function getChildrenModule(node: DataNode, mods: string[]) {\n node.children &&\n node.children.forEach((n: DataNode) => {\n if (n.isLeaf) {\n mods.push(n[inlinedResourcePathKey]);\n } else {\n getChildrenModule(n, mods);\n }\n });\n\n return mods;\n}\n\nexport const ModulesStatistics: React.FC<{\n modules: SDK.ModuleData[];\n chunks: SDK.ChunkData[];\n filteredModules: SDK.ModuleData[];\n}> = ({ modules, chunks, filteredModules }) => {\n const { sourceSize, parsedSize, filteredParsedSize, filteredSourceSize } =\n useMemo(() => {\n return {\n sourceSize: sumBy(modules, (e) => e.size.sourceSize),\n parsedSize: sumBy(modules, (e) => e.size.parsedSize),\n filteredSourceSize: sumBy(filteredModules, (e) => e.size.sourceSize),\n filteredParsedSize: sumBy(filteredModules, (e) => e.size.parsedSize),\n };\n }, [modules, filteredModules]);\n\n return (\n <Space>\n <Tooltip\n title={`total modules count is ${modules.length}, the filtered modules count is ${filteredModules.length}`}\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Modules: {filteredModules.length} / {modules.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n Total modules bundled size: {formatSize(parsedSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Total modules source size: {formatSize(sourceSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Filtered modules bundled size: {formatSize(filteredParsedSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Filtered modules source size: {formatSize(filteredSourceSize)}\n </Typography.Text>\n </Space>\n }\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Modules Size:\n {filteredParsedSize === parsedSize\n ? formatSize(parsedSize)\n : `${formatSize(filteredParsedSize)} / ${formatSize(parsedSize)}`}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n this asset includes {chunks.length} chunks:\n </Typography.Text>\n {chunks.map((e) => (\n <Bdg label=\"chunk\" value={e.name} key={e.name} />\n ))}\n </Space>\n }\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Chunks: {chunks.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n </Space>\n );\n};\n\nconst ConcatenatedTag = ({ moduleCount }: { moduleCount: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n This is a concatenated container module that includes {moduleCount}{' '}\n modules\n </Typography.Text>\n </Space>\n }\n >\n <Tag color=\"blue\" style={tagStyle}>\n concatenated container\n </Tag>\n </Tooltip>\n );\n};\n\nconst TotalBundledSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The total output size of all the files in this folder. If you\n enabled minification, this value shows the minified size.\n </Typography.Text>\n </Space>\n }\n >\n <Tag style={tagStyle} color={'geekblue'}>\n {`bundled size: ${formatSize(size)}`}\n </Tag>\n </Tooltip>\n );\n};\n\nconst BundledSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The final output size of this file. If you enabled minification,\n this value shows the minified size.\n </Typography.Text>\n </Space>\n }\n >\n <Tag color={'geekblue'}>{`bundled size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nconst GzippedSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The compressed file size that users actually download, as most web\n servers use gzip compression.\n </Typography.Text>\n </Space>\n }\n >\n <Tag color={'orange'}>{`gzipped: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nconst TotalSourceSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The total original size of all the files in this folder, before any\n transformations and minification.\n </Typography.Text>\n </Space>\n }\n >\n <Tag\n style={tagStyle}\n color={'cyan'}\n >{`source size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nconst SourceSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The original size of this file, before any transformations and\n minification.\n </Typography.Text>\n </Space>\n }\n >\n <Tag color={'cyan'}>{`source size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nexport const AssetDetail: React.FC<{\n asset: SDK.AssetData;\n chunks: SDK.ChunkData[];\n modules: SDK.ModuleData[];\n moduleSizeLimit?: number;\n height?: number;\n root: string;\n}> = ({\n asset,\n chunks: includeChunks,\n modules: includeModules,\n moduleSizeLimit,\n height,\n root,\n}) => {\n const [moduleKeyword, setModuleKeyword] = useState('');\n const [defaultExpandAll, setDefaultExpandAll] = useState(false);\n const [moduleJumpList, setModuleJumpList] = useState([] as number[]);\n const [show, setShow] = useState(false);\n\n const filteredModules = useMemo(() => {\n let res = includeModules.slice();\n if (moduleKeyword) {\n const regexp = new RegExp(moduleKeyword, 'i');\n res = res.filter((e) => regexp.test(e.path));\n }\n\n if (moduleSizeLimit) {\n res = res.filter((e) => e.size.parsedSize >= moduleSizeLimit);\n }\n\n return res;\n }, [includeModules, moduleKeyword, moduleSizeLimit]);\n\n const fileStructures = useMemo(() => {\n const res = createFileStructures({\n files: filteredModules.map((e) => e.path).filter(Boolean),\n inlinedResourcePathKey,\n fileTitle(file, basename) {\n const mod = filteredModules.find((e) => e.path === file)!;\n\n if (!mod) return basename;\n\n const { parsedSize = 0, sourceSize = 0, gzipSize = 0 } = mod.size;\n const isConcatenation = mod.kind === SDK.ModuleKind.Concatenation;\n\n const containedOtherModules =\n !isConcatenation &&\n parsedSize === 0 &&\n includeModules.filter(\n (e) => e !== mod && e.modules && e.modules.indexOf(mod.id) > -1,\n );\n\n return (\n <div className={styles['bundle-tree']}>\n <Popover\n content={`Open the ${basename}’s module reasons tree.`}\n placement=\"bottom\"\n >\n <div\n className={styles.box}\n onClick={() => {\n setModuleJumpList([mod.id]);\n setShow(true);\n }}\n >\n <div className={styles.keywords}>\n <Keyword ellipsis text={basename} keyword={''} />\n </div>\n <div className={styles.dividerDiv}>\n <Divider className={styles.divider} dashed />\n </div>\n </div>\n </Popover>\n <Space>\n {parsedSize !== 0 ? (\n <>\n {typeof gzipSize === 'number' ? (\n <Popover\n placement=\"bottom\"\n content={<SourceSizeTag size={sourceSize} />}\n >\n <Space direction=\"horizontal\">\n <BundledSizeTag size={parsedSize} />\n <GzippedSizeTag size={gzipSize} />\n </Space>\n </Popover>\n ) : (\n <Space direction=\"horizontal\">\n <BundledSizeTag size={parsedSize} />\n <SourceSizeTag size={sourceSize} />\n </Space>\n )}\n </>\n ) : sourceSize !== 0 ? (\n // fallback to display tag for source size\n <SourceSizeTag size={sourceSize} />\n ) : null}\n {isConcatenation ? (\n <ConcatenatedTag moduleCount={mod.modules?.length || 0} />\n ) : null}\n {containedOtherModules && containedOtherModules.length ? (\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n This module is concatenated into another container\n module:\n </Typography.Text>\n {containedOtherModules.map(({ id, path }) => {\n if (isJsDataUrl(path)) {\n return (\n <Typography.Paragraph\n ellipsis={{ rows: 4 }}\n key={id}\n style={{ color: 'inherit', maxWidth: '100%' }}\n code\n >\n {path}\n </Typography.Paragraph>\n );\n }\n\n const p = relative(dirname(mod.path), path);\n if (p.startsWith('javascript;charset=utf-8;base64,')) {\n return (\n <Typography.Text\n key={id}\n style={{ color: 'inherit', maxWidth: '100%' }}\n code\n >\n {p[0] === '.' ? p : `./${p}`}\n </Typography.Text>\n );\n }\n\n return (\n <Typography.Text\n key={id}\n style={{ color: 'inherit' }}\n code\n >\n {p[0] === '.' ? p : `./${p}`}\n </Typography.Text>\n );\n })}\n </Space>\n }\n >\n <Tag color=\"green\">concatenated</Tag>\n </Tooltip>\n ) : null}\n\n <ModuleCodeViewer data={mod} />\n </Space>\n </div>\n );\n },\n dirTitle(dir, defaultTitle) {\n const mods: string[] = [];\n const paths = getChildrenModule(dir, mods);\n if (paths.length) {\n const mods = paths.map(\n (e) => includeModules.find((m) => m.path === e)!,\n );\n\n const parsedSize = sumBy(mods, (e) => e.size?.parsedSize || 0);\n const sourceSize = sumBy(mods, (e) => e.size?.sourceSize || 0);\n return (\n <div className={styles['bundle-tree']}>\n <div className={styles.box}>\n <div className={styles.keywords}>\n <Keyword ellipsis text={defaultTitle} keyword={''} />\n </div>\n <div className={styles.dividerDiv}>\n <Divider className={styles.divider} dashed />\n </div>\n </div>\n <Space>\n {parsedSize > 0 ? (\n <>\n <TotalBundledSizeTag size={parsedSize} />\n <TotalSourceSizeTag size={sourceSize} />\n </>\n ) : (\n <TotalSourceSizeTag size={sourceSize} />\n )}\n </Space>\n </div>\n );\n }\n\n return defaultTitle;\n },\n page: 'bundle',\n });\n return res;\n }, [filteredModules]);\n\n const onSearch = (value: string) => setModuleKeyword(value);\n\n useEffect(() => {\n setModuleKeyword('');\n setDefaultExpandAll(false);\n }, [asset]);\n\n useEffect(() => {\n setDefaultExpandAll(false);\n }, [moduleKeyword]);\n\n return (\n <ModuleGraphListContext.Provider\n value={{ moduleJumpList, setModuleJumpList }}\n >\n <Card\n className={styles.bundle}\n title={`Modules of \"${asset.path}\"`}\n bodyStyle={{ minHeight: height }}\n size=\"small\"\n >\n {includeModules.length ? (\n <Row>\n <Col span={24}>\n <ModulesStatistics\n modules={includeModules}\n chunks={includeChunks}\n filteredModules={filteredModules}\n />\n </Col>\n <Col span={24}>\n <Space>\n <KeywordInput\n placeholder=\"search module by keyword\"\n onChange={onSearch}\n key={asset.path}\n />\n <Button\n onClick={() => setDefaultExpandAll(true)}\n size=\"small\"\n icon={<ColumnHeightOutlined />}\n />\n </Space>\n </Col>\n <Col span={24} style={{ marginTop: Size.BasePadding }}>\n {filteredModules.length ? (\n <DirectoryTree\n key={`tree_${moduleKeyword}_${defaultExpandAll}_${asset.path}`}\n selectable={false}\n defaultExpandAll={\n defaultExpandAll || filteredModules.length <= 20\n }\n onExpand={(expandedKeys) => {\n expandedModulesKeys = expandedKeys;\n }}\n defaultExpandParent\n // @ts-ignore\n defaultExpandedKeys={\n expandedModulesKeys?.length\n ? expandedModulesKeys\n : fileStructures.length === 1\n ? [fileStructures[0].key]\n : []\n }\n treeData={fileStructures as AntdDataNode[]}\n rootStyle={{\n maxHeight: '500px',\n overflow: 'auto',\n border: '1px solid rgba(235, 237, 241)',\n padding: '14px 20px',\n }}\n />\n ) : (\n <Empty\n description={\n <Typography.Text\n strong\n >{`\"${moduleKeyword}\" can't match any modules`}</Typography.Text>\n }\n />\n )}\n </Col>\n </Row>\n ) : (\n <Empty\n description={\n <Typography.Text\n strong\n >{`\"${asset.path}\" doesn't have any modules`}</Typography.Text>\n }\n />\n )}\n\n <ModuleGraphViewer\n id={\n moduleJumpList?.length\n ? moduleJumpList[moduleJumpList.length - 1]\n : ''\n }\n show={show}\n setShow={setShow}\n cwd={root}\n />\n </Card>\n </ModuleGraphListContext.Provider>\n );\n};\n"],"names":["DirectoryTree","Tree","expandedModulesKeys","TAB_MAP","tagStyle","EmptyCodeItem","Empty","ModuleCodeViewer","data","tab","setTab","useState","t","useI18n","TAB_LAB_MAP","path","TextDrawer","Popover","CodepenCircleOutlined","ServerAPIProvider","SDK","source","Card","Object","omitBy","s","k","e","v","Typography","CodeViewer","ModuleGraphViewer","id","show","setShow","cwd","modules","ModuleAnalyzeComponent","inlinedResourcePathKey","getChildrenModule","node","mods","n","ModulesStatistics","chunks","filteredModules","sourceSize","parsedSize","filteredParsedSize","filteredSourceSize","useMemo","sumBy","Space","Tooltip","InfoCircleOutlined","Divider","formatSize","Bdg","ConcatenatedTag","moduleCount","Tag","TotalBundledSizeTag","size","BundledSizeTag","GzippedSizeTag","TotalSourceSizeTag","SourceSizeTag","AssetDetail","asset","includeChunks","includeModules","moduleSizeLimit","height","root","moduleKeyword","setModuleKeyword","defaultExpandAll","setDefaultExpandAll","moduleJumpList","setModuleJumpList","res","regexp","RegExp","fileStructures","createFileStructures","Boolean","file","basename","_mod_modules","mod","gzipSize","isConcatenation","containedOtherModules","styles","Keyword","isJsDataUrl","p","relative","dirname","dir","defaultTitle","paths","m","_e_size","onSearch","value","useEffect","ModuleGraphListContext","Row","Col","KeywordInput","Button","ColumnHeightOutlined","Size","expandedKeys"],"mappings":"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"}
1
+ {"version":3,"file":"pages/BundleSize/components/asset.mjs","sources":["webpack://@rsdoctor/components/./src/pages/BundleSize/components/asset.tsx"],"sourcesContent":["import {\n CodepenCircleOutlined,\n ColumnHeightOutlined,\n InfoCircleOutlined,\n} from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Button,\n Card,\n Col,\n Divider,\n Empty,\n Popover,\n Row,\n Space,\n Tag,\n Tooltip,\n Tree,\n Typography,\n} from 'antd';\nimport { DataNode as AntdDataNode } from 'antd/es/tree';\nimport { omitBy, sumBy } from 'es-toolkit/compat';\nimport { dirname, relative } from 'path';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { CodeViewer } from 'src/components/base';\nimport { Badge as Bdg } from '../../../components/Badge';\nimport { KeywordInput } from '../../../components/Form/keyword';\nimport { Keyword } from '../../../components/Keyword';\nimport { ServerAPIProvider } from '../../../components/Manifest';\nimport { TextDrawer } from '../../../components/TextDrawer';\nimport { Size } from '../../../constants';\nimport {\n DataNode,\n createFileStructures,\n formatSize,\n isJsDataUrl,\n useI18n,\n} from '../../../utils';\nimport { ModuleAnalyzeComponent } from '../../ModuleAnalyze';\nimport { ModuleGraphListContext } from '../config';\nimport styles from './index.module.scss';\n\nconst { DirectoryTree } = Tree;\n\nlet expandedModulesKeys: React.Key[] = [];\nconst TAB_MAP = {\n source: 'source code',\n transformed: 'Transformed Code (After compile)',\n parsedSource: 'Bundled Code (After bundle and tree-shaking)',\n};\n\nconst tagStyle = {\n margin: 'none',\n marginInlineEnd: 0,\n};\n\nconst EmptyCodeItem = () => (\n <Empty\n description={`Do not have the module code.\n (1) If you use the brief mode, there will not have any codes to show.\n (2) If you use lite mode, there will not have source codes.`}\n />\n);\n\nexport const ModuleCodeViewer: React.FC<{ data: SDK.ModuleData }> = ({\n data,\n}) => {\n const [tab, setTab] = useState('');\n const { t } = useI18n();\n\n const TAB_LAB_MAP: Record<string, string> = {\n source: 'Source Code',\n transformed: `Transformed Code(${t('After Compile')})`,\n parsedSource: `Bundled Code(${t('After Bundled')})`,\n };\n if (!data) return null;\n\n const { path } = data;\n\n return (\n <TextDrawer\n text=\"\"\n buttonProps={{\n size: 'small',\n icon: (\n <Popover content=\"Open the Codes Box\">\n <CodepenCircleOutlined />\n </Popover>\n ),\n type: 'default',\n }}\n buttonStyle={{ padding: `0 4px` }}\n drawerProps={{\n destroyOnClose: true,\n title: `Code of \"${path}\"`,\n }}\n >\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetModuleCodeByModuleId}\n body={{ moduleId: data.id }}\n >\n {(source) => {\n return (\n <>\n {!source['source'] &&\n !source['parsedSource'] &&\n !source['transformed'] ? (\n <EmptyCodeItem />\n ) : (\n <Card\n className=\"code-size-card\"\n style={{ width: '100%' }}\n tabList={Object.keys(omitBy(source, (s) => !s))\n .map((k) => ({ tab: k }))\n .map((e) => ({\n ...e,\n tab: TAB_LAB_MAP[e.tab],\n key: e.tab,\n }))}\n defaultActiveTabKey={\n source['parsedSource'] ? 'parsedSource' : 'source'\n }\n onTabChange={(v) => setTab(v)}\n tabBarExtraContent={\n <Popover\n placement=\"bottom\"\n title={\n <Typography.Title level={5}>Explain</Typography.Title>\n }\n content={\n <>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: 30,\n }}\n >\n <div>\n <Typography.Text strong>Source: </Typography.Text>\n <Typography.Text>\n {TAB_MAP.source}\n </Typography.Text>\n </div>\n <div>\n <Typography.Text strong>\n Transformed:\n </Typography.Text>\n <Typography.Text>\n {TAB_MAP.transformed}\n </Typography.Text>\n </div>\n <div>\n <Typography.Text strong>\n Bundled Source:\n </Typography.Text>\n <Typography.Text>\n {TAB_MAP.parsedSource}\n </Typography.Text>\n </div>\n <br />\n <Typography.Text strong>{'More'}</Typography.Text>\n <Typography.Text>\n {t('CodeModeExplain')}\n </Typography.Text>\n </div>\n </>\n }\n trigger={'hover'}\n >\n <a href=\"#\">Explain</a>\n </Popover>\n }\n styles={{ body: { padding: 0, overflow: 'hidden' } }}\n >\n {source['parsedSource'] ||\n source['source'] ||\n source['transformed'] ? (\n <CodeViewer\n isEmbed\n code={\n tab\n ? source[tab as keyof SDK.ModuleSource]\n : source['parsedSource']\n ? source['parsedSource']\n : source['source']\n }\n filePath={path}\n />\n ) : (\n <EmptyCodeItem />\n )}\n </Card>\n )}\n </>\n );\n }}\n </ServerAPIProvider>\n </TextDrawer>\n );\n};\n\nexport const ModuleGraphViewer: React.FC<{\n id: number | string;\n show: boolean;\n setShow: (_show: boolean) => void;\n cwd: string;\n}> = ({ id, show, setShow, cwd }) => {\n if (!id) return null;\n\n return (\n <ServerAPIProvider api={SDK.ServerAPI.API.GetAllModuleGraph} body={{}}>\n {(modules) => (\n <ModuleAnalyzeComponent\n cwd={cwd}\n moduleId={id}\n modules={modules}\n show={show}\n setShow={setShow}\n />\n )}\n </ServerAPIProvider>\n );\n};\n\nconst inlinedResourcePathKey = '__RESOURCEPATH__';\n\nexport function getChildrenModule(node: DataNode, mods: string[]) {\n node.children &&\n node.children.forEach((n: DataNode) => {\n if (n.isLeaf) {\n mods.push(n[inlinedResourcePathKey]);\n } else {\n getChildrenModule(n, mods);\n }\n });\n\n return mods;\n}\n\nexport const ModulesStatistics: React.FC<{\n modules: SDK.ModuleData[];\n chunks: SDK.ChunkData[];\n filteredModules: SDK.ModuleData[];\n}> = ({ modules, chunks, filteredModules }) => {\n const { sourceSize, parsedSize, filteredParsedSize, filteredSourceSize } =\n useMemo(() => {\n return {\n sourceSize: sumBy(modules, (e) => e.size.sourceSize),\n parsedSize: sumBy(modules, (e) => e.size.parsedSize),\n filteredSourceSize: sumBy(filteredModules, (e) => e.size.sourceSize),\n filteredParsedSize: sumBy(filteredModules, (e) => e.size.parsedSize),\n };\n }, [modules, filteredModules]);\n\n return (\n <Space>\n <Tooltip\n title={`total modules count is ${modules.length}, the filtered modules count is ${filteredModules.length}`}\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Modules: {filteredModules.length} / {modules.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n Total modules bundled size: {formatSize(parsedSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Total modules source size: {formatSize(sourceSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Filtered modules bundled size: {formatSize(filteredParsedSize)}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit' }}>\n Filtered modules source size: {formatSize(filteredSourceSize)}\n </Typography.Text>\n </Space>\n }\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Modules Size:\n {filteredParsedSize === parsedSize\n ? formatSize(parsedSize)\n : `${formatSize(filteredParsedSize)} / ${formatSize(parsedSize)}`}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n <Divider type=\"vertical\" />\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n this asset includes {chunks.length} chunks:\n </Typography.Text>\n {chunks.map((e) => (\n <Bdg label=\"chunk\" value={e.name} key={e.name} />\n ))}\n </Space>\n }\n >\n <Space>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12, fontWeight: 400 }}\n >\n Chunks: {chunks.length}\n </Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n </Space>\n );\n};\n\nconst ConcatenatedTag = ({ moduleCount }: { moduleCount: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n This is a concatenated container module that includes {moduleCount}{' '}\n modules\n </Typography.Text>\n </Space>\n }\n >\n <Tag color=\"blue\" style={tagStyle}>\n concatenated container\n </Tag>\n </Tooltip>\n );\n};\n\nconst TotalBundledSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The total output size of all the files in this folder. If you\n enabled minification, this value shows the minified size.\n </Typography.Text>\n </Space>\n }\n >\n <Tag style={tagStyle} color={'geekblue'}>\n {`bundled size: ${formatSize(size)}`}\n </Tag>\n </Tooltip>\n );\n};\n\nconst BundledSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The final output size of this file. If you enabled minification,\n this value shows the minified size.\n </Typography.Text>\n </Space>\n }\n >\n <Tag color={'geekblue'}>{`bundled size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nconst GzippedSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The compressed file size that users actually download, as most web\n servers use gzip compression.\n </Typography.Text>\n </Space>\n }\n >\n <Tag color={'orange'}>{`gzipped: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nconst TotalSourceSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The total original size of all the files in this folder, before any\n transformations and minification.\n </Typography.Text>\n </Space>\n }\n >\n <Tag\n style={tagStyle}\n color={'cyan'}\n >{`source size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nconst SourceSizeTag = ({ size }: { size: number }) => {\n return (\n <Tooltip\n title={\n <Space>\n <Typography.Text style={{ color: 'inherit' }}>\n The original size of this file, before any transformations and\n minification.\n </Typography.Text>\n </Space>\n }\n >\n <Tag color={'cyan'}>{`source size: ${formatSize(size)}`}</Tag>\n </Tooltip>\n );\n};\n\nexport const AssetDetail: React.FC<{\n asset: SDK.AssetData;\n chunks: SDK.ChunkData[];\n modules: SDK.ModuleData[];\n moduleSizeLimit?: number;\n height?: number;\n root: string;\n}> = ({\n asset,\n chunks: includeChunks,\n modules: includeModules,\n moduleSizeLimit,\n height,\n root,\n}) => {\n const [moduleKeyword, setModuleKeyword] = useState('');\n const [defaultExpandAll, setDefaultExpandAll] = useState(false);\n const [moduleJumpList, setModuleJumpList] = useState([] as number[]);\n const [show, setShow] = useState(false);\n\n const filteredModules = useMemo(() => {\n let res = includeModules.slice();\n if (moduleKeyword) {\n const regexp = new RegExp(moduleKeyword, 'i');\n res = res.filter((e) => regexp.test(e.path));\n }\n\n if (moduleSizeLimit) {\n res = res.filter((e) => e.size.parsedSize >= moduleSizeLimit);\n }\n\n return res;\n }, [includeModules, moduleKeyword, moduleSizeLimit]);\n\n const fileStructures = useMemo(() => {\n const res = createFileStructures({\n files: filteredModules.map((e) => e.path).filter(Boolean),\n inlinedResourcePathKey,\n fileTitle(file, basename) {\n const mod = filteredModules.find((e) => e.path === file)!;\n\n if (!mod) return basename;\n\n const { parsedSize = 0, sourceSize = 0, gzipSize = 0 } = mod.size;\n const isConcatenation = mod.kind === SDK.ModuleKind.Concatenation;\n\n const containedOtherModules =\n !isConcatenation &&\n parsedSize === 0 &&\n includeModules.filter(\n (e) => e !== mod && e.modules && e.modules.indexOf(mod.id) > -1,\n );\n\n return (\n <div className={styles['bundle-tree']}>\n <Popover\n content={`Open the ${basename}’s module reasons tree.`}\n placement=\"bottom\"\n >\n <div\n className={styles.box}\n onClick={() => {\n setModuleJumpList([mod.id]);\n setShow(true);\n }}\n >\n <div className={styles.keywords}>\n <Keyword ellipsis text={basename} keyword={''} />\n </div>\n <div className={styles.dividerDiv}>\n <Divider className={styles.divider} dashed />\n </div>\n </div>\n </Popover>\n <Space>\n {parsedSize !== 0 ? (\n <>\n {typeof gzipSize === 'number' ? (\n <Popover\n placement=\"bottom\"\n content={<SourceSizeTag size={sourceSize} />}\n >\n <Space direction=\"horizontal\">\n <BundledSizeTag size={parsedSize} />\n <GzippedSizeTag size={gzipSize} />\n </Space>\n </Popover>\n ) : (\n <Space direction=\"horizontal\">\n <BundledSizeTag size={parsedSize} />\n <SourceSizeTag size={sourceSize} />\n </Space>\n )}\n </>\n ) : sourceSize !== 0 ? (\n // fallback to display tag for source size\n <SourceSizeTag size={sourceSize} />\n ) : null}\n {isConcatenation ? (\n <ConcatenatedTag moduleCount={mod.modules?.length || 0} />\n ) : null}\n {containedOtherModules && containedOtherModules.length ? (\n <Tooltip\n title={\n <Space direction=\"vertical\">\n <Typography.Text style={{ color: 'inherit' }}>\n This module is concatenated into another container\n module:\n </Typography.Text>\n {containedOtherModules.map(({ id, path }) => {\n if (isJsDataUrl(path)) {\n return (\n <Typography.Paragraph\n ellipsis={{ rows: 4 }}\n key={id}\n style={{ color: 'inherit', maxWidth: '100%' }}\n code\n >\n {path}\n </Typography.Paragraph>\n );\n }\n\n const p = relative(dirname(mod.path), path);\n if (p.startsWith('javascript;charset=utf-8;base64,')) {\n return (\n <Typography.Text\n key={id}\n style={{ color: 'inherit', maxWidth: '100%' }}\n code\n >\n {p[0] === '.' ? p : `./${p}`}\n </Typography.Text>\n );\n }\n\n return (\n <Typography.Text\n key={id}\n style={{ color: 'inherit' }}\n code\n >\n {p[0] === '.' ? p : `./${p}`}\n </Typography.Text>\n );\n })}\n </Space>\n }\n >\n <Tag color=\"green\">concatenated</Tag>\n </Tooltip>\n ) : null}\n\n <ModuleCodeViewer data={mod} />\n </Space>\n </div>\n );\n },\n dirTitle(dir, defaultTitle) {\n const mods: string[] = [];\n const paths = getChildrenModule(dir, mods);\n if (paths.length) {\n const mods = paths.map(\n (e) => includeModules.find((m) => m.path === e)!,\n );\n\n const parsedSize = sumBy(mods, (e) => e.size?.parsedSize || 0);\n const sourceSize = sumBy(mods, (e) => e.size?.sourceSize || 0);\n return (\n <div className={styles['bundle-tree']}>\n <div className={styles.box}>\n <div className={styles.keywords}>\n <Keyword ellipsis text={defaultTitle} keyword={''} />\n </div>\n <div className={styles.dividerDiv}>\n <Divider className={styles.divider} dashed />\n </div>\n </div>\n <Space>\n {parsedSize > 0 ? (\n <>\n <TotalBundledSizeTag size={parsedSize} />\n <TotalSourceSizeTag size={sourceSize} />\n </>\n ) : (\n <TotalSourceSizeTag size={sourceSize} />\n )}\n </Space>\n </div>\n );\n }\n\n return defaultTitle;\n },\n page: 'bundle',\n });\n return res;\n }, [filteredModules]);\n\n const onSearch = (value: string) => setModuleKeyword(value);\n\n useEffect(() => {\n setModuleKeyword('');\n setDefaultExpandAll(false);\n }, [asset]);\n\n useEffect(() => {\n setDefaultExpandAll(false);\n }, [moduleKeyword]);\n\n return (\n <ModuleGraphListContext.Provider\n value={{ moduleJumpList, setModuleJumpList }}\n >\n <Card\n className={styles.bundle}\n title={`Modules of \"${asset.path}\"`}\n bodyStyle={{ minHeight: height }}\n size=\"small\"\n >\n {includeModules.length ? (\n <Row>\n <Col span={24}>\n <ModulesStatistics\n modules={includeModules}\n chunks={includeChunks}\n filteredModules={filteredModules}\n />\n </Col>\n <Col span={24}>\n <Space>\n <KeywordInput\n placeholder=\"search module by keyword\"\n onChange={onSearch}\n key={asset.path}\n />\n <Button\n onClick={() => setDefaultExpandAll(true)}\n size=\"small\"\n icon={<ColumnHeightOutlined />}\n />\n </Space>\n </Col>\n <Col span={24} style={{ marginTop: Size.BasePadding }}>\n {filteredModules.length ? (\n <DirectoryTree\n key={`tree_${moduleKeyword}_${defaultExpandAll}_${asset.path}`}\n selectable={false}\n defaultExpandAll={\n defaultExpandAll || filteredModules.length <= 20\n }\n onExpand={(expandedKeys) => {\n expandedModulesKeys = expandedKeys;\n }}\n defaultExpandParent\n // @ts-ignore\n defaultExpandedKeys={\n expandedModulesKeys?.length\n ? expandedModulesKeys\n : fileStructures.length === 1\n ? [fileStructures[0].key]\n : []\n }\n treeData={fileStructures as AntdDataNode[]}\n rootStyle={{\n maxHeight: '500px',\n overflow: 'auto',\n border: '1px solid rgba(235, 237, 241)',\n padding: '14px 20px',\n }}\n />\n ) : (\n <Empty\n description={\n <Typography.Text\n strong\n >{`\"${moduleKeyword}\" can't match any modules`}</Typography.Text>\n }\n />\n )}\n </Col>\n </Row>\n ) : (\n <Empty\n description={\n <Typography.Text\n strong\n >{`\"${asset.path}\" doesn't have any modules`}</Typography.Text>\n }\n />\n )}\n\n <ModuleGraphViewer\n id={\n moduleJumpList?.length\n ? moduleJumpList[moduleJumpList.length - 1]\n : ''\n }\n show={show}\n setShow={setShow}\n cwd={root}\n />\n </Card>\n </ModuleGraphListContext.Provider>\n );\n};\n"],"names":["DirectoryTree","Tree","expandedModulesKeys","TAB_MAP","tagStyle","EmptyCodeItem","Empty","ModuleCodeViewer","data","tab","setTab","useState","t","useI18n","TAB_LAB_MAP","path","TextDrawer","Popover","CodepenCircleOutlined","ServerAPIProvider","SDK","source","Card","Object","omitBy","s","k","e","v","Typography","CodeViewer","ModuleGraphViewer","id","show","setShow","cwd","modules","ModuleAnalyzeComponent","inlinedResourcePathKey","getChildrenModule","node","mods","n","ModulesStatistics","chunks","filteredModules","sourceSize","parsedSize","filteredParsedSize","filteredSourceSize","useMemo","sumBy","Space","Tooltip","InfoCircleOutlined","Divider","formatSize","Bdg","ConcatenatedTag","moduleCount","Tag","TotalBundledSizeTag","size","BundledSizeTag","GzippedSizeTag","TotalSourceSizeTag","SourceSizeTag","AssetDetail","asset","includeChunks","includeModules","moduleSizeLimit","height","root","moduleKeyword","setModuleKeyword","defaultExpandAll","setDefaultExpandAll","moduleJumpList","setModuleJumpList","res","regexp","RegExp","fileStructures","createFileStructures","Boolean","file","basename","_mod_modules","mod","gzipSize","isConcatenation","containedOtherModules","styles","Keyword","isJsDataUrl","p","relative","dirname","dir","defaultTitle","paths","m","_e_size","onSearch","value","useEffect","ModuleGraphListContext","Row","Col","KeywordInput","Button","ColumnHeightOutlined","Size","expandedKeys"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
2
  import { CodeOutlined, CodepenCircleOutlined, DeploymentUnitOutlined, InfoCircleOutlined } from "@ant-design/icons";
3
3
  import { SDK } from "@rsdoctor/types";
4
4
  import { Button, Card, Col, Divider, Empty, InputNumber, Row, Select, Space, Tag, Tooltip, Typography } from "antd";
5
- import { debounce, sumBy } from "lodash-es";
5
+ import { debounce, sumBy } from "es-toolkit/compat";
6
6
  import { useCallback, useEffect, useMemo, useState } from "react";
7
7
  import { useCodeDrawer } from "../../../components/base/CodeViewer/useCodeDrawer.mjs";
8
8
  import { Badge } from "../../../components/Badge/index.mjs";