@rsdoctor/components 1.5.11 → 1.5.12

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 (37) hide show
  1. package/dist/components/Alert/types.d.ts +2 -2
  2. package/dist/components/Alerts/bundle-alert.d.ts +1 -1
  3. package/dist/components/Alerts/bundle-alert.mjs.map +1 -1
  4. package/dist/components/Alerts/overlay.mjs.map +1 -1
  5. package/dist/components/Charts/done.mjs.map +1 -1
  6. package/dist/components/Configuration/builder.d.ts +1 -5
  7. package/dist/components/Configuration/builder.mjs.map +1 -1
  8. package/dist/components/Layout/index.d.ts +2 -2
  9. package/dist/components/Layout/index.mjs.map +1 -1
  10. package/dist/components/Loader/Analysis/files.mjs.map +1 -1
  11. package/dist/components/Loader/Analysis/index.d.ts +1 -7
  12. package/dist/components/Loader/Analysis/index.mjs.map +1 -1
  13. package/dist/components/Loader/executions.d.ts +1 -1
  14. package/dist/components/Loader/executions.mjs.map +1 -1
  15. package/dist/components/Manifest/api.d.ts +2 -2
  16. package/dist/components/Manifest/api.mjs.map +1 -1
  17. package/dist/components/Opener/code.d.ts +1 -1
  18. package/dist/components/Opener/code.mjs.map +1 -1
  19. package/dist/components/Opener/ide.d.ts +1 -1
  20. package/dist/components/Opener/ide.mjs.map +1 -1
  21. package/dist/components/Overall/bundle.d.ts +1 -1
  22. package/dist/components/Overall/bundle.mjs.map +1 -1
  23. package/dist/components/TextDrawer/index.d.ts +1 -1
  24. package/dist/components/TextDrawer/index.mjs.map +1 -1
  25. package/dist/components/base/CodeViewer/index.mjs +2 -2
  26. package/dist/components/base/CodeViewer/index.mjs.map +1 -1
  27. package/dist/components/base/DiffViewer/index.mjs +1 -1
  28. package/dist/components/base/DiffViewer/index.mjs.map +1 -1
  29. package/dist/pages/ModuleAnalyze/chunks.mjs.map +1 -1
  30. package/dist/pages/Resources/BundleDiff/DiffContainer/types.d.ts +1 -1
  31. package/dist/pages/Resources/BundleDiff/DiffServerAPIProvider/index.d.ts +1 -1
  32. package/dist/pages/Resources/BundleDiff/DiffServerAPIProvider/index.mjs.map +1 -1
  33. package/dist/pages/TreeShaking/editor.mjs +2 -2
  34. package/dist/pages/TreeShaking/editor.mjs.map +1 -1
  35. package/dist/utils/file.d.ts +3 -3
  36. package/dist/utils/file.mjs.map +1 -1
  37. package/package.json +11 -11
@@ -7,10 +7,10 @@ export interface AlertProps extends Omit<PackageRelationAlertProps, 'data'> {
7
7
  }
8
8
  export interface PackageRelationAlertProps {
9
9
  data: Rule.PackageRelationDiffRuleStoreData;
10
- getPackageRelationContentComponent: React.FC<{
10
+ getPackageRelationContentComponent(props: {
11
11
  data: Rule.PackageRelationDiffRuleStoreData;
12
12
  package: Rule.PackageRelationData;
13
- }>;
13
+ }): React.JSX.Element;
14
14
  cwd: string;
15
15
  }
16
16
  export interface FileRelationAlertProps {
@@ -8,7 +8,7 @@ interface BundleAlertProps {
8
8
  extraData: Omit<AlertProps, 'data'>;
9
9
  viewMode: ViewMode;
10
10
  setViewMode(mode: ViewMode): void;
11
- extraCom?: JSX.Element | undefined;
11
+ extraCom?: React.JSX.Element | undefined;
12
12
  }
13
13
  export declare const BundleAlert: React.FC<BundleAlertProps>;
14
14
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"components/Alerts/bundle-alert.mjs","sources":["../../../src/components/Alerts/bundle-alert.tsx"],"sourcesContent":["import { Tabs, Empty, Tag } from 'antd';\n\nimport { Card } from '../Card';\nimport { ECMAVersionCheck } from '../Alert/ecma-version-check';\nimport { Overview } from '../Overall/overview';\nimport { AlertCollapse } from './collapse';\nimport { CommonList } from './list';\nimport { ViewMode } from '../../constants';\n\nimport { AlertProps } from '../Alert/types';\n\nimport type { Rule } from '@rsdoctor/types';\n\nimport styles from './bundle-alert.module.scss';\nimport { CSSProperties, useState } from 'react';\nimport { CrossChunksAlertCollapse } from './collapse-cross-chunks';\nimport { ModuleMixedChunksAlertCollapse } from './collapse-module-mixed-chunks';\nimport { SideEffectsOnlyImportsAlertCollapse } from './collapse-side-effects-only-imports';\nimport { CjsRequireAlertCollapse } from './collapse-cjs-require';\nimport { EsmResolvedToCjsAlertCollapse } from './collapse-esm-cjs';\n\ninterface BundleAlertProps {\n title: string;\n cwd: string;\n dataSource: Rule.RuleStoreDataItem[];\n extraData: Omit<AlertProps, 'data'>;\n viewMode: ViewMode;\n setViewMode(mode: ViewMode): void;\n extraCom?: JSX.Element | undefined;\n}\n\nexport const BundleAlert: React.FC<BundleAlertProps> = ({\n title,\n dataSource,\n extraData,\n}) => {\n const firstKeyWithData =\n [\n 'E1001',\n 'E1002',\n 'E1003',\n 'E1004',\n 'E1005',\n 'E1006',\n 'E1007',\n 'E1008',\n 'E1009',\n ].find((code) => dataSource.some((d) => d.code === code)) ?? 'E1001';\n const [activeKey, setActiveKey] = useState(firstKeyWithData);\n const tabData: Array<{\n key: string;\n label: string;\n data: Array<Rule.RuleStoreDataItem>;\n }> = [\n {\n key: 'E1001',\n label: 'Duplicate Packages',\n data: [],\n },\n {\n key: 'E1002',\n label: 'Cross Chunks Package',\n data: [],\n },\n {\n key: 'E1003',\n label: 'Loader Performance Optimization',\n data: [],\n },\n {\n key: 'E1004',\n label: 'ECMA Version Check',\n data: [],\n },\n {\n key: 'E1005',\n label: 'Default Import Check',\n data: [],\n },\n {\n key: 'E1006',\n label: 'Module Mixed Chunks',\n data: [],\n },\n {\n key: 'E1007',\n label: 'Tree Shaking Side Effects Only',\n data: [],\n },\n {\n key: 'E1008',\n label: 'CJS Require Cannot Tree-Shake',\n data: [],\n },\n {\n key: 'E1009',\n label: 'ESM Import Resolved to CJS',\n data: [],\n },\n ];\n\n dataSource.forEach((data) => {\n const target = tabData.find((td) => td.key === data.code)?.data;\n target?.push(data);\n });\n\n tabData.sort(\n (a, b) => (b.data.length > 0 ? 1 : 0) - (a.data.length > 0 ? 1 : 0),\n );\n\n const tabItems = tabData.map((td) => {\n const tagStyle =\n activeKey === td.key\n ? ({\n border: '1px solid #91D5FF',\n backgroundColor: '#E6F7FF',\n } as CSSProperties)\n : {};\n\n const tagTextStyle =\n activeKey === td.key\n ? {\n color: '#1890FF',\n }\n : {};\n\n const LabelComponent = () => (\n <Overview\n style={{\n backgroundColor: 'transparent',\n paddingLeft: 0,\n paddingRight: 0,\n width: '100%',\n }}\n title={<span className={styles.labelTitle}>{td.label}</span>}\n description={\n <div className={styles.labelDescription}>\n <span>{td.data.length}</span>\n <Tag\n style={{ fontFamily: 'Menlo', borderRadius: '2px', ...tagStyle }}\n >\n <span style={{ ...tagTextStyle }}>{td.key}</span>\n </Tag>\n </div>\n }\n />\n );\n\n let children, description;\n switch (td.key) {\n case 'E1001':\n children = <AlertCollapse data={td.data} extraData={extraData} />;\n break;\n case 'E1002':\n children = (\n <CrossChunksAlertCollapse data={td.data} extraData={extraData} />\n );\n break;\n case 'E1003':\n children = <CommonList data={td.data} />;\n break;\n case 'E1004':\n description = (\n <span>\n No ECMA Version Check Rules were found. Please refer to\n 「https://rsdoctor.rs/guide/usage/rule-config」.\n </span>\n );\n children = <ECMAVersionCheck data={td.data} />;\n break;\n case 'E1005':\n children = <CommonList data={td.data} />;\n break;\n case 'E1006':\n children = (\n <ModuleMixedChunksAlertCollapse\n data={td.data}\n extraData={extraData}\n />\n );\n break;\n case 'E1007':\n children = (\n <SideEffectsOnlyImportsAlertCollapse\n data={td.data}\n extraData={extraData}\n />\n );\n break;\n case 'E1008':\n children = (\n <CjsRequireAlertCollapse data={td.data} extraData={extraData} />\n );\n break;\n case 'E1009':\n children = (\n <EsmResolvedToCjsAlertCollapse data={td.data} extraData={extraData} />\n );\n break;\n default:\n children = null;\n break;\n }\n\n if (!td.data.length) {\n children = (\n <Empty description={description} image={Empty.PRESENTED_IMAGE_SIMPLE} />\n );\n }\n\n return {\n key: td.key,\n label: <LabelComponent />,\n children: (\n <Card\n className={styles.card}\n type=\"inner\"\n title={\n <>\n <Tag\n style={{\n fontFamily: 'Menlo',\n fontWeight: '700',\n fontSize: '13px',\n backgroundColor: '#EAEDF1',\n borderRadius: '2px',\n }}\n >\n {td.key}\n </Tag>\n <span>{td.label}</span>\n </>\n }\n >\n {children}\n </Card>\n ),\n };\n });\n\n return (\n <Card style={{ width: '100%', borderRadius: '12px' }}>\n <div className={styles.container}>\n <div className={styles.title}>{title}</div>\n {!dataSource.length ? (\n <div\n style={{\n minHeight: '480px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <Empty\n description={'No Bundle Alerts Data'}\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n </div>\n ) : (\n <Tabs\n onChange={setActiveKey}\n tabBarGutter={10}\n type=\"card\"\n defaultActiveKey={tabData[0]?.key ?? 'E1001'}\n items={tabItems}\n />\n )}\n </div>\n </Card>\n );\n};\n"],"names":["BundleAlert","title","dataSource","extraData","firstKeyWithData","code","d","activeKey","setActiveKey","useState","tabData","data","target","td","a","b","tabItems","tagStyle","tagTextStyle","LabelComponent","Overview","styles","Tag","children","description","AlertCollapse","CrossChunksAlertCollapse","CommonList","ECMAVersionCheck","ModuleMixedChunksAlertCollapse","SideEffectsOnlyImportsAlertCollapse","CjsRequireAlertCollapse","EsmResolvedToCjsAlertCollapse","Empty","Card","Tabs"],"mappings":"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"}
1
+ {"version":3,"file":"components/Alerts/bundle-alert.mjs","sources":["../../../src/components/Alerts/bundle-alert.tsx"],"sourcesContent":["import { Tabs, Empty, Tag } from 'antd';\n\nimport { Card } from '../Card';\nimport { ECMAVersionCheck } from '../Alert/ecma-version-check';\nimport { Overview } from '../Overall/overview';\nimport { AlertCollapse } from './collapse';\nimport { CommonList } from './list';\nimport { ViewMode } from '../../constants';\n\nimport { AlertProps } from '../Alert/types';\n\nimport type { Rule } from '@rsdoctor/types';\n\nimport styles from './bundle-alert.module.scss';\nimport { CSSProperties, useState } from 'react';\nimport { CrossChunksAlertCollapse } from './collapse-cross-chunks';\nimport { ModuleMixedChunksAlertCollapse } from './collapse-module-mixed-chunks';\nimport { SideEffectsOnlyImportsAlertCollapse } from './collapse-side-effects-only-imports';\nimport { CjsRequireAlertCollapse } from './collapse-cjs-require';\nimport { EsmResolvedToCjsAlertCollapse } from './collapse-esm-cjs';\n\ninterface BundleAlertProps {\n title: string;\n cwd: string;\n dataSource: Rule.RuleStoreDataItem[];\n extraData: Omit<AlertProps, 'data'>;\n viewMode: ViewMode;\n setViewMode(mode: ViewMode): void;\n extraCom?: React.JSX.Element | undefined;\n}\n\nexport const BundleAlert: React.FC<BundleAlertProps> = ({\n title,\n dataSource,\n extraData,\n}) => {\n const firstKeyWithData =\n [\n 'E1001',\n 'E1002',\n 'E1003',\n 'E1004',\n 'E1005',\n 'E1006',\n 'E1007',\n 'E1008',\n 'E1009',\n ].find((code) => dataSource.some((d) => d.code === code)) ?? 'E1001';\n const [activeKey, setActiveKey] = useState(firstKeyWithData);\n const tabData: Array<{\n key: string;\n label: string;\n data: Array<Rule.RuleStoreDataItem>;\n }> = [\n {\n key: 'E1001',\n label: 'Duplicate Packages',\n data: [],\n },\n {\n key: 'E1002',\n label: 'Cross Chunks Package',\n data: [],\n },\n {\n key: 'E1003',\n label: 'Loader Performance Optimization',\n data: [],\n },\n {\n key: 'E1004',\n label: 'ECMA Version Check',\n data: [],\n },\n {\n key: 'E1005',\n label: 'Default Import Check',\n data: [],\n },\n {\n key: 'E1006',\n label: 'Module Mixed Chunks',\n data: [],\n },\n {\n key: 'E1007',\n label: 'Tree Shaking Side Effects Only',\n data: [],\n },\n {\n key: 'E1008',\n label: 'CJS Require Cannot Tree-Shake',\n data: [],\n },\n {\n key: 'E1009',\n label: 'ESM Import Resolved to CJS',\n data: [],\n },\n ];\n\n dataSource.forEach((data) => {\n const target = tabData.find((td) => td.key === data.code)?.data;\n target?.push(data);\n });\n\n tabData.sort(\n (a, b) => (b.data.length > 0 ? 1 : 0) - (a.data.length > 0 ? 1 : 0),\n );\n\n const tabItems = tabData.map((td) => {\n const tagStyle =\n activeKey === td.key\n ? ({\n border: '1px solid #91D5FF',\n backgroundColor: '#E6F7FF',\n } as CSSProperties)\n : {};\n\n const tagTextStyle =\n activeKey === td.key\n ? {\n color: '#1890FF',\n }\n : {};\n\n const LabelComponent = () => (\n <Overview\n style={{\n backgroundColor: 'transparent',\n paddingLeft: 0,\n paddingRight: 0,\n width: '100%',\n }}\n title={<span className={styles.labelTitle}>{td.label}</span>}\n description={\n <div className={styles.labelDescription}>\n <span>{td.data.length}</span>\n <Tag\n style={{ fontFamily: 'Menlo', borderRadius: '2px', ...tagStyle }}\n >\n <span style={{ ...tagTextStyle }}>{td.key}</span>\n </Tag>\n </div>\n }\n />\n );\n\n let children, description;\n switch (td.key) {\n case 'E1001':\n children = <AlertCollapse data={td.data} extraData={extraData} />;\n break;\n case 'E1002':\n children = (\n <CrossChunksAlertCollapse data={td.data} extraData={extraData} />\n );\n break;\n case 'E1003':\n children = <CommonList data={td.data} />;\n break;\n case 'E1004':\n description = (\n <span>\n No ECMA Version Check Rules were found. Please refer to\n 「https://rsdoctor.rs/guide/usage/rule-config」.\n </span>\n );\n children = <ECMAVersionCheck data={td.data} />;\n break;\n case 'E1005':\n children = <CommonList data={td.data} />;\n break;\n case 'E1006':\n children = (\n <ModuleMixedChunksAlertCollapse\n data={td.data}\n extraData={extraData}\n />\n );\n break;\n case 'E1007':\n children = (\n <SideEffectsOnlyImportsAlertCollapse\n data={td.data}\n extraData={extraData}\n />\n );\n break;\n case 'E1008':\n children = (\n <CjsRequireAlertCollapse data={td.data} extraData={extraData} />\n );\n break;\n case 'E1009':\n children = (\n <EsmResolvedToCjsAlertCollapse data={td.data} extraData={extraData} />\n );\n break;\n default:\n children = null;\n break;\n }\n\n if (!td.data.length) {\n children = (\n <Empty description={description} image={Empty.PRESENTED_IMAGE_SIMPLE} />\n );\n }\n\n return {\n key: td.key,\n label: <LabelComponent />,\n children: (\n <Card\n className={styles.card}\n type=\"inner\"\n title={\n <>\n <Tag\n style={{\n fontFamily: 'Menlo',\n fontWeight: '700',\n fontSize: '13px',\n backgroundColor: '#EAEDF1',\n borderRadius: '2px',\n }}\n >\n {td.key}\n </Tag>\n <span>{td.label}</span>\n </>\n }\n >\n {children}\n </Card>\n ),\n };\n });\n\n return (\n <Card style={{ width: '100%', borderRadius: '12px' }}>\n <div className={styles.container}>\n <div className={styles.title}>{title}</div>\n {!dataSource.length ? (\n <div\n style={{\n minHeight: '480px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <Empty\n description={'No Bundle Alerts Data'}\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n </div>\n ) : (\n <Tabs\n onChange={setActiveKey}\n tabBarGutter={10}\n type=\"card\"\n defaultActiveKey={tabData[0]?.key ?? 'E1001'}\n items={tabItems}\n />\n )}\n </div>\n </Card>\n );\n};\n"],"names":["BundleAlert","title","dataSource","extraData","firstKeyWithData","code","d","activeKey","setActiveKey","useState","tabData","data","target","td","a","b","tabItems","tagStyle","tagTextStyle","LabelComponent","Overview","styles","Tag","children","description","AlertCollapse","CrossChunksAlertCollapse","CommonList","ECMAVersionCheck","ModuleMixedChunksAlertCollapse","SideEffectsOnlyImportsAlertCollapse","CjsRequireAlertCollapse","EsmResolvedToCjsAlertCollapse","Empty","Card","Tabs"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"components/Alerts/overlay.mjs","sources":["../../../src/components/Alerts/overlay.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Alert,\n Button,\n Col,\n Collapse,\n Row,\n Tag,\n Typography,\n Badge,\n} from 'antd';\nimport {\n BugOutlined,\n CloseCircleOutlined,\n DownOutlined,\n RightOutlined,\n} from '@ant-design/icons';\nimport Dialog from 'rc-dialog';\nimport Ansi from 'ansi-to-react';\n\nimport { withServerAPI } from '../Manifest';\nimport { Size, Color } from '../../constants';\n\nimport styles from './overlay.module.scss';\n\nimport 'rc-dialog/assets/index.css';\n\nfunction getOverlayAlertsMessage(\n alerts: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetOverlayAlerts>,\n) {\n let warns = 0;\n let errors = 0;\n\n alerts.forEach((item) => {\n if (item.level === 'warn') {\n warns++;\n } else {\n errors++;\n }\n });\n\n const suffixText =\n warns !== 0 && errors !== 0 ? 'problems' : warns === 0 ? 'errors' : 'warns';\n\n const fontSize = 16;\n\n return {\n title: `${alerts.length} compiled ${suffixText}`,\n detail: (\n <Typography.Text strong style={{ color: '#fff', marginBottom: 0 }}>\n <Typography.Text style={{ color: 'inherit', fontSize }}>\n Compiled with\n </Typography.Text>\n <Typography.Text strong style={{ color: Color.Red, fontSize }}>\n {' '}\n {errors} {errors === 1 ? 'error' : 'errors'}{' '}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit', fontSize }}>\n and\n </Typography.Text>\n <Typography.Text strong style={{ color: Color.Yellow, fontSize }}>\n {' '}\n {warns} {warns === 1 ? 'warning' : 'warnings'}\n </Typography.Text>\n </Typography.Text>\n ),\n warns,\n errors,\n };\n}\n\nexport const OverlayAlertsModal: React.FC<{\n alerts: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetOverlayAlerts>;\n open: boolean;\n onClose(): void;\n}> = ({ alerts = [], open, onClose }) => {\n if (!alerts.length) return null;\n\n return (\n <Dialog\n visible={open}\n onClose={() => onClose()}\n style={{ width: '100%', height: '100%', margin: 0, zIndex: 1000 }}\n closable={false}\n modalRender={(e) => {\n return React.cloneElement(e as React.ReactElement, {\n style: {\n background: 'rgba(0, 0, 0, 0.7)',\n color: '#fff',\n height: '100%',\n overflow: 'scroll',\n borderRadius: 0,\n },\n });\n }}\n >\n <Row justify=\"space-between\" align=\"middle\">\n {getOverlayAlertsMessage(alerts).detail}\n <Button\n onClick={() => onClose()}\n type=\"text\"\n style={{ color: '#fff' }}\n size=\"large\"\n icon={<CloseCircleOutlined />}\n ></Button>\n </Row>\n <Row gutter={[0, Size.BasePadding]}>\n {alerts.map((e) => {\n return (\n <Col\n span={24}\n key={e.id}\n style={{\n whiteSpace: 'pre-wrap',\n lineHeight: `16px`,\n fontSize: 14,\n }}\n >\n <Collapse\n ghost\n style={{ background: '#000' }}\n defaultActiveKey={[e.id]}\n expandIcon={(e) => {\n return e.isActive ? (\n <DownOutlined style={{ color: '#fff' }} />\n ) : (\n <RightOutlined style={{ color: '#fff' }} />\n );\n }}\n >\n <Collapse.Panel\n header={\n <div style={{ color: '#fff' }}>\n {e.level === 'warn' ? (\n <Tag color={Color.Yellow}>WARNING</Tag>\n ) : (\n <Tag color={Color.Red}>ERROR</Tag>\n )}\n <Ansi>{e.description || e.title}</Ansi>\n </div>\n }\n key={e.id}\n >\n <div style={{ color: '#fff' }}>\n <Ansi>{e.stack}</Ansi>\n </div>\n </Collapse.Panel>\n </Collapse>\n </Col>\n );\n })}\n </Row>\n </Dialog>\n );\n};\n\nexport const OverlayAlertsTips: React.FC<{\n alerts: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetOverlayAlerts>;\n defaultOpen?: boolean;\n}> = ({ alerts = [], defaultOpen = alerts.length > 0 }) => {\n if (!alerts.length) return null;\n\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <React.Fragment>\n <Alert\n banner\n message={React.cloneElement(getOverlayAlertsMessage(alerts).detail, {\n style: {\n color: '#000',\n },\n })}\n icon={<BugOutlined />}\n action={\n <Button onClick={() => setOpen(true)} size=\"small\">\n More\n </Button>\n }\n ></Alert>\n <OverlayAlertsModal\n alerts={alerts}\n open={open}\n onClose={() => setOpen(false)}\n />\n </React.Fragment>\n );\n};\n\nexport const OverlayAlertsButton: React.FC<{\n alerts: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetOverlayAlerts>;\n}> = ({ alerts = [] }) => {\n if (!alerts.length) return null;\n\n const [open, setOpen] = useState(false);\n\n return (\n <div className={styles.container}>\n <div onClick={() => setOpen(!open)} className={styles.badgeContainer}>\n <Badge count={alerts.length} size=\"small\">\n <BugOutlined style={{ fontSize: 15 }} />\n </Badge>\n </div>\n <OverlayAlertsModal\n alerts={alerts}\n open={open}\n onClose={() => setOpen(false)}\n />\n </div>\n );\n};\n\nexport const OverlayAlertsWithButton = withServerAPI({\n api: SDK.ServerAPI.API.GetOverlayAlerts,\n Component: OverlayAlertsButton,\n responsePropName: 'alerts',\n fallbackComponent: () => null,\n});\n\nexport const OverlayAlertsWithTips = withServerAPI({\n api: SDK.ServerAPI.API.GetOverlayAlerts,\n Component: OverlayAlertsTips,\n responsePropName: 'alerts',\n fallbackComponent: () => null,\n});\n"],"names":["getOverlayAlertsMessage","alerts","warns","errors","item","suffixText","fontSize","Typography","Color","OverlayAlertsModal","open","onClose","Dialog","e","React","Row","Button","CloseCircleOutlined","Size","Col","Collapse","DownOutlined","RightOutlined","Tag","Ansi","OverlayAlertsTips","defaultOpen","setOpen","useState","Alert","BugOutlined","OverlayAlertsButton","styles","Badge","OverlayAlertsWithButton","withServerAPI","SDK","OverlayAlertsWithTips"],"mappings":"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"}
1
+ {"version":3,"file":"components/Alerts/overlay.mjs","sources":["../../../src/components/Alerts/overlay.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Alert,\n Button,\n Col,\n Collapse,\n Row,\n Tag,\n Typography,\n Badge,\n} from 'antd';\nimport {\n BugOutlined,\n CloseCircleOutlined,\n DownOutlined,\n RightOutlined,\n} from '@ant-design/icons';\nimport Dialog from 'rc-dialog';\nimport Ansi from 'ansi-to-react';\n\nimport { withServerAPI } from '../Manifest';\nimport { Size, Color } from '../../constants';\n\nimport styles from './overlay.module.scss';\n\nimport 'rc-dialog/assets/index.css';\n\nfunction getOverlayAlertsMessage(\n alerts: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetOverlayAlerts>,\n) {\n let warns = 0;\n let errors = 0;\n\n alerts.forEach((item) => {\n if (item.level === 'warn') {\n warns++;\n } else {\n errors++;\n }\n });\n\n const suffixText =\n warns !== 0 && errors !== 0 ? 'problems' : warns === 0 ? 'errors' : 'warns';\n\n const fontSize = 16;\n\n return {\n title: `${alerts.length} compiled ${suffixText}`,\n detail: (\n <Typography.Text strong style={{ color: '#fff', marginBottom: 0 }}>\n <Typography.Text style={{ color: 'inherit', fontSize }}>\n Compiled with\n </Typography.Text>\n <Typography.Text strong style={{ color: Color.Red, fontSize }}>\n {' '}\n {errors} {errors === 1 ? 'error' : 'errors'}{' '}\n </Typography.Text>\n <Typography.Text style={{ color: 'inherit', fontSize }}>\n and\n </Typography.Text>\n <Typography.Text strong style={{ color: Color.Yellow, fontSize }}>\n {' '}\n {warns} {warns === 1 ? 'warning' : 'warnings'}\n </Typography.Text>\n </Typography.Text>\n ),\n warns,\n errors,\n };\n}\n\nexport const OverlayAlertsModal: React.FC<{\n alerts: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetOverlayAlerts>;\n open: boolean;\n onClose(): void;\n}> = ({ alerts = [], open, onClose }) => {\n if (!alerts.length) return null;\n\n return (\n <Dialog\n visible={open}\n onClose={() => onClose()}\n style={{ width: '100%', height: '100%', margin: 0, zIndex: 1000 }}\n closable={false}\n modalRender={(e) => {\n return React.cloneElement(\n e as React.ReactElement<{ style?: React.CSSProperties }>,\n {\n style: {\n background: 'rgba(0, 0, 0, 0.7)',\n color: '#fff',\n height: '100%',\n overflow: 'scroll',\n borderRadius: 0,\n },\n },\n );\n }}\n >\n <Row justify=\"space-between\" align=\"middle\">\n {getOverlayAlertsMessage(alerts).detail}\n <Button\n onClick={() => onClose()}\n type=\"text\"\n style={{ color: '#fff' }}\n size=\"large\"\n icon={<CloseCircleOutlined />}\n ></Button>\n </Row>\n <Row gutter={[0, Size.BasePadding]}>\n {alerts.map((e) => {\n return (\n <Col\n span={24}\n key={e.id}\n style={{\n whiteSpace: 'pre-wrap',\n lineHeight: `16px`,\n fontSize: 14,\n }}\n >\n <Collapse\n ghost\n style={{ background: '#000' }}\n defaultActiveKey={[e.id]}\n expandIcon={(e) => {\n return e.isActive ? (\n <DownOutlined style={{ color: '#fff' }} />\n ) : (\n <RightOutlined style={{ color: '#fff' }} />\n );\n }}\n >\n <Collapse.Panel\n header={\n <div style={{ color: '#fff' }}>\n {e.level === 'warn' ? (\n <Tag color={Color.Yellow}>WARNING</Tag>\n ) : (\n <Tag color={Color.Red}>ERROR</Tag>\n )}\n <Ansi>{e.description || e.title}</Ansi>\n </div>\n }\n key={e.id}\n >\n <div style={{ color: '#fff' }}>\n <Ansi>{e.stack}</Ansi>\n </div>\n </Collapse.Panel>\n </Collapse>\n </Col>\n );\n })}\n </Row>\n </Dialog>\n );\n};\n\nexport const OverlayAlertsTips: React.FC<{\n alerts: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetOverlayAlerts>;\n defaultOpen?: boolean;\n}> = ({ alerts = [], defaultOpen = alerts.length > 0 }) => {\n if (!alerts.length) return null;\n\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <React.Fragment>\n <Alert\n banner\n message={React.cloneElement(\n getOverlayAlertsMessage(alerts).detail as React.ReactElement<{\n style?: React.CSSProperties;\n }>,\n {\n style: {\n color: '#000',\n },\n },\n )}\n icon={<BugOutlined />}\n action={\n <Button onClick={() => setOpen(true)} size=\"small\">\n More\n </Button>\n }\n ></Alert>\n <OverlayAlertsModal\n alerts={alerts}\n open={open}\n onClose={() => setOpen(false)}\n />\n </React.Fragment>\n );\n};\n\nexport const OverlayAlertsButton: React.FC<{\n alerts: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetOverlayAlerts>;\n}> = ({ alerts = [] }) => {\n if (!alerts.length) return null;\n\n const [open, setOpen] = useState(false);\n\n return (\n <div className={styles.container}>\n <div onClick={() => setOpen(!open)} className={styles.badgeContainer}>\n <Badge count={alerts.length} size=\"small\">\n <BugOutlined style={{ fontSize: 15 }} />\n </Badge>\n </div>\n <OverlayAlertsModal\n alerts={alerts}\n open={open}\n onClose={() => setOpen(false)}\n />\n </div>\n );\n};\n\nexport const OverlayAlertsWithButton = withServerAPI({\n api: SDK.ServerAPI.API.GetOverlayAlerts,\n Component: OverlayAlertsButton,\n responsePropName: 'alerts',\n fallbackComponent: () => null,\n});\n\nexport const OverlayAlertsWithTips = withServerAPI({\n api: SDK.ServerAPI.API.GetOverlayAlerts,\n Component: OverlayAlertsTips,\n responsePropName: 'alerts',\n fallbackComponent: () => null,\n});\n"],"names":["getOverlayAlertsMessage","alerts","warns","errors","item","suffixText","fontSize","Typography","Color","OverlayAlertsModal","open","onClose","Dialog","e","React","Row","Button","CloseCircleOutlined","Size","Col","Collapse","DownOutlined","RightOutlined","Tag","Ansi","OverlayAlertsTips","defaultOpen","setOpen","useState","Alert","BugOutlined","OverlayAlertsButton","styles","Badge","OverlayAlertsWithButton","withServerAPI","SDK","OverlayAlertsWithTips"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"components/Charts/done.mjs","sources":["../../../src/components/Charts/done.tsx"],"sourcesContent":["import React from 'react';\nimport { Divider, Space } from 'antd';\nimport { SDK } from '@rsdoctor/types';\nimport { Summary } from '@rsdoctor/utils/common';\nimport { TextDrawer } from '../TextDrawer';\nimport { Card } from '../Card';\nimport {\n CommonChartProps,\n CommonExecutionsChart,\n CommonExecutionEmptyTips,\n} from './common';\nimport { WebpackPluginsDataTable } from '../Plugins/webpack';\nimport { ServerAPIProvider } from '../Manifest';\n\nimport './loader.scss';\nimport './tooltips.scss';\nimport { ChartTypes } from './constants';\n\nexport const DoneChartContainer: React.FC<CommonChartProps> = ({\n summary,\n}): JSX.Element | null => {\n const { costs = [] } = summary || {};\n const target = costs.find(\n (e) => e.name === Summary.SummaryCostsDataName.Done,\n );\n\n const hooks: Array<string> = [\n 'afterCompile',\n 'shouldEmit',\n 'emit',\n 'afterEmit',\n 'assetEmitted',\n 'done',\n ];\n\n const suffix = 'of the \"AfterCompile -> Done\" stage';\n\n if (!target) return null;\n\n return (\n <TextDrawer\n containerProps={{ style: { display: 'inline' } }}\n drawerProps={{ title: `Details ${suffix}` }}\n text={<Space>detail</Space>}\n >\n <ServerAPIProvider api={SDK.ServerAPI.API.GetPluginData} body={{ hooks }}>\n {(res) =>\n res && res.length ? (\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n <Card title={`Plugin DataSource of ${suffix}`} collapsable>\n <WebpackPluginsDataTable dataSource={res} />\n </Card>\n <Divider />\n <Card title={`Chart ${suffix}`}>\n <CommonExecutionsChart plugins={res} type={ChartTypes.Done} />\n </Card>\n </Space>\n ) : (\n <CommonExecutionEmptyTips />\n )\n }\n </ServerAPIProvider>\n </TextDrawer>\n );\n};\n"],"names":["DoneChartContainer","summary","costs","target","e","Summary","hooks","suffix","TextDrawer","Space","ServerAPIProvider","SDK","res","Card","WebpackPluginsDataTable","Divider","CommonExecutionsChart","ChartTypes","CommonExecutionEmptyTips"],"mappings":";;;;;;;;;;;;;AAkBO,MAAMA,qBAAiD,CAAC,EAC7DC,OAAO,EACR;IACC,MAAM,EAAEC,QAAQ,EAAE,EAAE,GAAGD,WAAW,CAAC;IACnC,MAAME,SAASD,MAAM,IAAI,CACvB,CAACE,IAAMA,EAAE,IAAI,KAAKC,QAAQ,oBAAoB,CAAC,IAAI;IAGrD,MAAMC,QAAuB;QAC3B;QACA;QACA;QACA;QACA;QACA;KACD;IAED,MAAMC,SAAS;IAEf,IAAI,CAACJ,QAAQ,OAAO;IAEpB,OAAO,WAAP,GACE,IAACK,YAAUA;QACT,gBAAgB;YAAE,OAAO;gBAAE,SAAS;YAAS;QAAE;QAC/C,aAAa;YAAE,OAAO,CAAC,QAAQ,EAAED,QAAQ;QAAC;QAC1C,oBAAM,IAACE,OAAKA;sBAAC;;kBAEb,kBAACC,mBAAiBA;YAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa;YAAE,MAAM;gBAAEL;YAAM;sBACpE,CAACM,MACAA,OAAOA,IAAI,MAAM,GAAG,WAAH,GACf,KAACH,OAAKA;oBAAC,WAAU;oBAAW,OAAO;wBAAE,OAAO;oBAAO;;sCACjD,IAACI,MAAIA;4BAAC,OAAO,CAAC,qBAAqB,EAAEN,QAAQ;4BAAE,aAAW;sCACxD,kBAACO,yBAAuBA;gCAAC,YAAYF;;;sCAEvC,IAACG,SAAOA,CAAAA;sCACR,IAACF,MAAIA;4BAAC,OAAO,CAAC,MAAM,EAAEN,QAAQ;sCAC5B,kBAACS,uBAAqBA;gCAAC,SAASJ;gCAAK,MAAMK,WAAW,IAAI;;;;mCAI9D,IAACC,0BAAwBA,CAAAA;;;AAMrC"}
1
+ {"version":3,"file":"components/Charts/done.mjs","sources":["../../../src/components/Charts/done.tsx"],"sourcesContent":["import React from 'react';\nimport { Divider, Space } from 'antd';\nimport { SDK } from '@rsdoctor/types';\nimport { Summary } from '@rsdoctor/utils/common';\nimport { TextDrawer } from '../TextDrawer';\nimport { Card } from '../Card';\nimport {\n CommonChartProps,\n CommonExecutionsChart,\n CommonExecutionEmptyTips,\n} from './common';\nimport { WebpackPluginsDataTable } from '../Plugins/webpack';\nimport { ServerAPIProvider } from '../Manifest';\n\nimport './loader.scss';\nimport './tooltips.scss';\nimport { ChartTypes } from './constants';\n\nexport const DoneChartContainer: React.FC<CommonChartProps> = ({\n summary,\n}): React.JSX.Element | null => {\n const { costs = [] } = summary || {};\n const target = costs.find(\n (e) => e.name === Summary.SummaryCostsDataName.Done,\n );\n\n const hooks: Array<string> = [\n 'afterCompile',\n 'shouldEmit',\n 'emit',\n 'afterEmit',\n 'assetEmitted',\n 'done',\n ];\n\n const suffix = 'of the \"AfterCompile -> Done\" stage';\n\n if (!target) return null;\n\n return (\n <TextDrawer\n containerProps={{ style: { display: 'inline' } }}\n drawerProps={{ title: `Details ${suffix}` }}\n text={<Space>detail</Space>}\n >\n <ServerAPIProvider api={SDK.ServerAPI.API.GetPluginData} body={{ hooks }}>\n {(res) =>\n res && res.length ? (\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n <Card title={`Plugin DataSource of ${suffix}`} collapsable>\n <WebpackPluginsDataTable dataSource={res} />\n </Card>\n <Divider />\n <Card title={`Chart ${suffix}`}>\n <CommonExecutionsChart plugins={res} type={ChartTypes.Done} />\n </Card>\n </Space>\n ) : (\n <CommonExecutionEmptyTips />\n )\n }\n </ServerAPIProvider>\n </TextDrawer>\n );\n};\n"],"names":["DoneChartContainer","summary","costs","target","e","Summary","hooks","suffix","TextDrawer","Space","ServerAPIProvider","SDK","res","Card","WebpackPluginsDataTable","Divider","CommonExecutionsChart","ChartTypes","CommonExecutionEmptyTips"],"mappings":";;;;;;;;;;;;;AAkBO,MAAMA,qBAAiD,CAAC,EAC7DC,OAAO,EACR;IACC,MAAM,EAAEC,QAAQ,EAAE,EAAE,GAAGD,WAAW,CAAC;IACnC,MAAME,SAASD,MAAM,IAAI,CACvB,CAACE,IAAMA,EAAE,IAAI,KAAKC,QAAQ,oBAAoB,CAAC,IAAI;IAGrD,MAAMC,QAAuB;QAC3B;QACA;QACA;QACA;QACA;QACA;KACD;IAED,MAAMC,SAAS;IAEf,IAAI,CAACJ,QAAQ,OAAO;IAEpB,OAAO,WAAP,GACE,IAACK,YAAUA;QACT,gBAAgB;YAAE,OAAO;gBAAE,SAAS;YAAS;QAAE;QAC/C,aAAa;YAAE,OAAO,CAAC,QAAQ,EAAED,QAAQ;QAAC;QAC1C,oBAAM,IAACE,OAAKA;sBAAC;;kBAEb,kBAACC,mBAAiBA;YAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa;YAAE,MAAM;gBAAEL;YAAM;sBACpE,CAACM,MACAA,OAAOA,IAAI,MAAM,GAAG,WAAH,GACf,KAACH,OAAKA;oBAAC,WAAU;oBAAW,OAAO;wBAAE,OAAO;oBAAO;;sCACjD,IAACI,MAAIA;4BAAC,OAAO,CAAC,qBAAqB,EAAEN,QAAQ;4BAAE,aAAW;sCACxD,kBAACO,yBAAuBA;gCAAC,YAAYF;;;sCAEvC,IAACG,SAAOA,CAAAA;sCACR,IAACF,MAAIA;4BAAC,OAAO,CAAC,MAAM,EAAEN,QAAQ;sCAC5B,kBAACS,uBAAqBA;gCAAC,SAASJ;gCAAK,MAAMK,WAAW,IAAI;;;;mCAI9D,IAACC,0BAAwBA,CAAAA;;;AAMrC"}
@@ -5,9 +5,5 @@ interface WebpackConfigurationViewerBaseProps {
5
5
  configs: SDK.ConfigData;
6
6
  }
7
7
  export declare const WebpackConfigurationViewerBase: React.FC<WebpackConfigurationViewerBaseProps>;
8
- export declare const WebpackConfigurationViewer: React.FC<Omit<WebpackConfigurationViewerBaseProps, "configs"> & Partial<{
9
- body: {
10
- key: import("node_modules/@rsdoctor/types/dist/manifest").RsdoctorManifestMappingKeys;
11
- };
12
- }>>;
8
+ export declare const WebpackConfigurationViewer: React.FC<Omit<WebpackConfigurationViewerBaseProps, 'configs'>>;
13
9
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"components/Configuration/builder.mjs","sources":["../../../src/components/Configuration/builder.tsx"],"sourcesContent":["import { SDK } from '@rsdoctor/types';\nimport { Divider, Row, Select, Space, Typography } from 'antd';\nimport { RightOutlined } from '@ant-design/icons';\nimport React, { useState } from 'react';\nimport ReactJson from 'react-json-view';\nimport { useWebpackConfigurationByConfigs } from '../../utils';\nimport { withServerAPI } from '../Manifest';\nimport { TextDrawer } from '../TextDrawer';\nimport { Title } from '../Title';\n\nimport styles from './builder.module.scss';\nimport { Lodash } from '@rsdoctor/utils/common';\n\ninterface WebpackConfigurationViewerBaseProps {\n defaultKeys?: string[];\n configs: SDK.ConfigData;\n}\n\nexport const WebpackConfigurationViewerBase: React.FC<\n WebpackConfigurationViewerBaseProps\n> = ({ defaultKeys, configs }) => {\n const builderConfigData = useWebpackConfigurationByConfigs(configs || []);\n\n if (!builderConfigData) return null;\n\n const { config, version, name } = builderConfigData;\n const keys = Object.keys(config);\n const [selectKeys, setSelectKeys] = useState<string[]>(defaultKeys || keys);\n\n return (\n <TextDrawer\n text={\n <div className={styles.title}>\n <span style={{ marginRight: '8px', fontSize: '13px' }}>\n View Bundler Config\n </span>\n <RightOutlined style={{ fontSize: '10px' }} />\n </div>\n }\n >\n <Row>\n <Title text={`Bundler Config Viewer`} />\n <Divider />\n <Space>\n <Typography.Text>Properties: </Typography.Text>\n <Select\n dropdownStyle={{ zIndex: 999 }}\n mode=\"multiple\"\n allowClear\n value={selectKeys.length === keys.length ? [] : selectKeys}\n style={{ width: 350 }}\n popupMatchSelectWidth\n placeholder={'Show Selected Properties Only.'}\n onChange={(e) => {\n setSelectKeys(e);\n }}\n >\n {keys.map((e) => {\n return (\n <Select.Option key={e} label={e} value={e}>\n {e}\n </Select.Option>\n );\n })}\n </Select>\n </Space>\n <Divider />\n </Row>\n <ReactJson\n name={\n version && version !== 'unknown'\n ? `${name}@${version}`\n : `webpack.config`\n }\n theme=\"monokai\"\n src={\n selectKeys.length === 0\n ? config\n : Lodash.pick(config, selectKeys as (keyof typeof config)[])\n }\n displayDataTypes={false}\n displayObjectSize={false}\n style={{ overflowX: 'auto' }}\n />\n </TextDrawer>\n );\n};\n\nexport const WebpackConfigurationViewer = withServerAPI({\n Component: WebpackConfigurationViewerBase,\n api: SDK.ServerAPI.API.LoadDataByKey,\n responsePropName: 'configs',\n body: {\n key: 'configs',\n },\n showSkeleton: false,\n});\n"],"names":["WebpackConfigurationViewerBase","defaultKeys","configs","builderConfigData","useWebpackConfigurationByConfigs","config","version","name","keys","Object","selectKeys","setSelectKeys","useState","TextDrawer","styles","RightOutlined","Row","Title","Divider","Space","Typography","Select","e","ReactJson","Lodash","WebpackConfigurationViewer","withServerAPI","SDK"],"mappings":";;;;;;;;;;;;AAkBO,MAAMA,iCAET,CAAC,EAAEC,WAAW,EAAEC,OAAO,EAAE;IAC3B,MAAMC,oBAAoBC,iCAAiCF,WAAW,EAAE;IAExE,IAAI,CAACC,mBAAmB,OAAO;IAE/B,MAAM,EAAEE,MAAM,EAAEC,OAAO,EAAEC,IAAI,EAAE,GAAGJ;IAClC,MAAMK,OAAOC,OAAO,IAAI,CAACJ;IACzB,MAAM,CAACK,YAAYC,cAAc,GAAGC,SAAmBX,eAAeO;IAEtE,OAAO,WAAP,GACE,KAACK,YAAUA;QACT,oBACE,KAAC;YAAI,WAAWC,eAAAA,KAAY;;8BAC1B,IAAC;oBAAK,OAAO;wBAAE,aAAa;wBAAO,UAAU;oBAAO;8BAAG;;8BAGvD,IAACC,eAAaA;oBAAC,OAAO;wBAAE,UAAU;oBAAO;;;;;0BAI7C,KAACC,KAAGA;;kCACF,IAACC,OAAKA;wBAAC,MAAM;;kCACb,IAACC,SAAOA,CAAAA;kCACR,KAACC,OAAKA;;0CACJ,IAACC,WAAW,IAAI;0CAAC;;0CACjB,IAACC,QAAMA;gCACL,eAAe;oCAAE,QAAQ;gCAAI;gCAC7B,MAAK;gCACL,YAAU;gCACV,OAAOX,WAAW,MAAM,KAAKF,KAAK,MAAM,GAAG,EAAE,GAAGE;gCAChD,OAAO;oCAAE,OAAO;gCAAI;gCACpB,uBAAqB;gCACrB,aAAa;gCACb,UAAU,CAACY;oCACTX,cAAcW;gCAChB;0CAECd,KAAK,GAAG,CAAC,CAACc,IACF,WAAP,GACE,IAACD,OAAO,MAAM;wCAAS,OAAOC;wCAAG,OAAOA;kDACrCA;uCADiBA;;;;kCAO5B,IAACJ,SAAOA,CAAAA;;;0BAEV,IAACK,iBAASA;gBACR,MACEjB,WAAWA,AAAY,cAAZA,UACP,GAAGC,KAAK,CAAC,EAAED,SAAS,GACpB;gBAEN,OAAM;gBACN,KACEI,AAAsB,MAAtBA,WAAW,MAAM,GACbL,SACAmB,OAAO,IAAI,CAACnB,QAAQK;gBAE1B,kBAAkB;gBAClB,mBAAmB;gBACnB,OAAO;oBAAE,WAAW;gBAAO;;;;AAInC;AAEO,MAAMe,6BAA6BC,cAAc;IACtD,WAAW1B;IACX,KAAK2B,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa;IACpC,kBAAkB;IAClB,MAAM;QACJ,KAAK;IACP;IACA,cAAc;AAChB"}
1
+ {"version":3,"file":"components/Configuration/builder.mjs","sources":["../../../src/components/Configuration/builder.tsx"],"sourcesContent":["import { SDK } from '@rsdoctor/types';\nimport { Divider, Row, Select, Space, Typography } from 'antd';\nimport { RightOutlined } from '@ant-design/icons';\nimport React, { useState } from 'react';\nimport ReactJson from 'react-json-view';\nimport { useWebpackConfigurationByConfigs } from '../../utils';\nimport { withServerAPI } from '../Manifest';\nimport { TextDrawer } from '../TextDrawer';\nimport { Title } from '../Title';\n\nimport styles from './builder.module.scss';\nimport { Lodash } from '@rsdoctor/utils/common';\n\ninterface WebpackConfigurationViewerBaseProps {\n defaultKeys?: string[];\n configs: SDK.ConfigData;\n}\n\nexport const WebpackConfigurationViewerBase: React.FC<\n WebpackConfigurationViewerBaseProps\n> = ({ defaultKeys, configs }) => {\n const builderConfigData = useWebpackConfigurationByConfigs(configs || []);\n\n if (!builderConfigData) return null;\n\n const { config, version, name } = builderConfigData;\n const keys = Object.keys(config);\n const [selectKeys, setSelectKeys] = useState<string[]>(defaultKeys || keys);\n\n return (\n <TextDrawer\n text={\n <div className={styles.title}>\n <span style={{ marginRight: '8px', fontSize: '13px' }}>\n View Bundler Config\n </span>\n <RightOutlined style={{ fontSize: '10px' }} />\n </div>\n }\n >\n <Row>\n <Title text={`Bundler Config Viewer`} />\n <Divider />\n <Space>\n <Typography.Text>Properties: </Typography.Text>\n <Select\n dropdownStyle={{ zIndex: 999 }}\n mode=\"multiple\"\n allowClear\n value={selectKeys.length === keys.length ? [] : selectKeys}\n style={{ width: 350 }}\n popupMatchSelectWidth\n placeholder={'Show Selected Properties Only.'}\n onChange={(e) => {\n setSelectKeys(e);\n }}\n >\n {keys.map((e) => {\n return (\n <Select.Option key={e} label={e} value={e}>\n {e}\n </Select.Option>\n );\n })}\n </Select>\n </Space>\n <Divider />\n </Row>\n <ReactJson\n name={\n version && version !== 'unknown'\n ? `${name}@${version}`\n : `webpack.config`\n }\n theme=\"monokai\"\n src={\n selectKeys.length === 0\n ? config\n : Lodash.pick(config, selectKeys as (keyof typeof config)[])\n }\n displayDataTypes={false}\n displayObjectSize={false}\n style={{ overflowX: 'auto' }}\n />\n </TextDrawer>\n );\n};\n\nexport const WebpackConfigurationViewer: React.FC<\n Omit<WebpackConfigurationViewerBaseProps, 'configs'>\n> = withServerAPI({\n Component: WebpackConfigurationViewerBase,\n api: SDK.ServerAPI.API.LoadDataByKey,\n responsePropName: 'configs',\n body: {\n key: 'configs',\n },\n showSkeleton: false,\n});\n"],"names":["WebpackConfigurationViewerBase","defaultKeys","configs","builderConfigData","useWebpackConfigurationByConfigs","config","version","name","keys","Object","selectKeys","setSelectKeys","useState","TextDrawer","styles","RightOutlined","Row","Title","Divider","Space","Typography","Select","e","ReactJson","Lodash","WebpackConfigurationViewer","withServerAPI","SDK"],"mappings":";;;;;;;;;;;;AAkBO,MAAMA,iCAET,CAAC,EAAEC,WAAW,EAAEC,OAAO,EAAE;IAC3B,MAAMC,oBAAoBC,iCAAiCF,WAAW,EAAE;IAExE,IAAI,CAACC,mBAAmB,OAAO;IAE/B,MAAM,EAAEE,MAAM,EAAEC,OAAO,EAAEC,IAAI,EAAE,GAAGJ;IAClC,MAAMK,OAAOC,OAAO,IAAI,CAACJ;IACzB,MAAM,CAACK,YAAYC,cAAc,GAAGC,SAAmBX,eAAeO;IAEtE,OAAO,WAAP,GACE,KAACK,YAAUA;QACT,oBACE,KAAC;YAAI,WAAWC,eAAAA,KAAY;;8BAC1B,IAAC;oBAAK,OAAO;wBAAE,aAAa;wBAAO,UAAU;oBAAO;8BAAG;;8BAGvD,IAACC,eAAaA;oBAAC,OAAO;wBAAE,UAAU;oBAAO;;;;;0BAI7C,KAACC,KAAGA;;kCACF,IAACC,OAAKA;wBAAC,MAAM;;kCACb,IAACC,SAAOA,CAAAA;kCACR,KAACC,OAAKA;;0CACJ,IAACC,WAAW,IAAI;0CAAC;;0CACjB,IAACC,QAAMA;gCACL,eAAe;oCAAE,QAAQ;gCAAI;gCAC7B,MAAK;gCACL,YAAU;gCACV,OAAOX,WAAW,MAAM,KAAKF,KAAK,MAAM,GAAG,EAAE,GAAGE;gCAChD,OAAO;oCAAE,OAAO;gCAAI;gCACpB,uBAAqB;gCACrB,aAAa;gCACb,UAAU,CAACY;oCACTX,cAAcW;gCAChB;0CAECd,KAAK,GAAG,CAAC,CAACc,IACF,WAAP,GACE,IAACD,OAAO,MAAM;wCAAS,OAAOC;wCAAG,OAAOA;kDACrCA;uCADiBA;;;;kCAO5B,IAACJ,SAAOA,CAAAA;;;0BAEV,IAACK,iBAASA;gBACR,MACEjB,WAAWA,AAAY,cAAZA,UACP,GAAGC,KAAK,CAAC,EAAED,SAAS,GACpB;gBAEN,OAAM;gBACN,KACEI,AAAsB,MAAtBA,WAAW,MAAM,GACbL,SACAmB,OAAO,IAAI,CAACnB,QAAQK;gBAE1B,kBAAkB;gBAClB,mBAAmB;gBACnB,OAAO;oBAAE,WAAW;gBAAO;;;;AAInC;AAEO,MAAMe,6BAETC,cAAc;IAChB,WAAW1B;IACX,KAAK2B,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa;IACpC,kBAAkB;IAClB,MAAM;QACJ,KAAK;IACP;IACA,cAAc;AAChB"}
@@ -1,5 +1,5 @@
1
1
  import { PropsWithChildren } from 'react';
2
2
  export interface LayoutProps {
3
- children: JSX.Element;
3
+ children: React.JSX.Element;
4
4
  }
5
- export declare const Layout: (props: PropsWithChildren<LayoutProps>) => JSX.Element;
5
+ export declare const Layout: (props: PropsWithChildren<LayoutProps>) => React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"components/Layout/index.mjs","sources":["../../../src/components/Layout/index.tsx"],"sourcesContent":["import { PropsWithChildren, useContext, useEffect, useState } from 'react';\nimport { FloatButton, Layout as L } from 'antd';\nimport { Language, MAIN_BG, Size } from '../../constants';\nimport { Header } from './header';\nimport {\n useLocale,\n useI18n,\n getFirstVisitFromStorage,\n setFirstVisitToStorage,\n getLanguage,\n useUrlQuery,\n getEnableRoutesFromUrlQuery,\n} from '../../utils';\nimport { Progress } from './progress';\nimport { ConfigContext } from '../../config';\nimport { SDK } from '@rsdoctor/types';\nimport { ServerAPIProvider } from '../Manifest';\nimport { ProjectInfoContext } from './project-info-context';\n\nexport interface LayoutProps {\n children: JSX.Element;\n}\n\nconst TitleUpdater: React.FC<{\n name?: string;\n}> = ({ name }) => {\n useEffect(() => {\n if (name) {\n document.title = `Rsdoctor - ${name}`;\n } else {\n document.title = 'Rsdoctor';\n }\n }, [name]);\n\n return null;\n};\n\nexport const Layout = (props: PropsWithChildren<LayoutProps>): JSX.Element => {\n const locale = useLocale();\n const { i18n } = useI18n();\n const { children } = props;\n const query = useUrlQuery();\n const [enableRoutes, setEnableRoutes] = useState<string[] | undefined>(\n () => getEnableRoutesFromUrlQuery() || undefined,\n );\n\n useEffect(() => {\n let currentLocale = locale;\n // Check if the user is visiting the site for the first time\n const visited = getFirstVisitFromStorage();\n if (!visited) {\n setFirstVisitToStorage('1');\n const targetLang = window.navigator.language.split('-')[0];\n const userLang = getLanguage(targetLang);\n\n if (Object.values(Language).includes(userLang)) {\n currentLocale = userLang;\n }\n }\n\n if (i18n.language !== currentLocale) {\n i18n.changeLanguage(currentLocale);\n }\n }, [locale]);\n\n // Listen for enableRoutes changes in URL query parameters\n useEffect(() => {\n const newEnableRoutes = getEnableRoutesFromUrlQuery();\n setEnableRoutes(newEnableRoutes || undefined);\n }, [query]);\n\n const ctx = useContext(ConfigContext);\n\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetProjectInfo}\n showSkeleton={false}\n >\n {(project) => (\n <ProjectInfoContext.Provider value={{ project }}>\n <L>\n <TitleUpdater name={project?.name} />\n {!ctx.embedded ? <Header enableRoutes={enableRoutes} /> : null}\n <Progress />\n <L.Content\n style={{\n height: '100%',\n minHeight: '100vh',\n padding: Size.BasePadding,\n marginTop: !ctx.embedded ? Size.NavBarHeight : 0,\n background: MAIN_BG,\n }}\n >\n {children}\n <FloatButton.BackTop />\n </L.Content>\n </L>\n </ProjectInfoContext.Provider>\n )}\n </ServerAPIProvider>\n );\n};\n"],"names":["TitleUpdater","name","useEffect","document","Layout","props","locale","useLocale","i18n","useI18n","children","query","useUrlQuery","enableRoutes","setEnableRoutes","useState","getEnableRoutesFromUrlQuery","undefined","currentLocale","visited","getFirstVisitFromStorage","setFirstVisitToStorage","targetLang","window","userLang","getLanguage","Object","Language","newEnableRoutes","ctx","useContext","ConfigContext","ServerAPIProvider","SDK","project","ProjectInfoContext","L","Header","Progress","Size","MAIN_BG","FloatButton"],"mappings":";;;;;;;;;;;AAuBA,MAAMA,eAED,CAAC,EAAEC,IAAI,EAAE;IACZC,UAAU;QACR,IAAID,MACFE,SAAS,KAAK,GAAG,CAAC,WAAW,EAAEF,MAAM;aAErCE,SAAS,KAAK,GAAG;IAErB,GAAG;QAACF;KAAK;IAET,OAAO;AACT;AAEO,MAAMG,gBAAS,CAACC;IACrB,MAAMC,SAASC;IACf,MAAM,EAAEC,IAAI,EAAE,GAAGC;IACjB,MAAM,EAAEC,QAAQ,EAAE,GAAGL;IACrB,MAAMM,QAAQC;IACd,MAAM,CAACC,cAAcC,gBAAgB,GAAGC,SACtC,IAAMC,iCAAiCC;IAGzCf,UAAU;QACR,IAAIgB,gBAAgBZ;QAEpB,MAAMa,UAAUC;QAChB,IAAI,CAACD,SAAS;YACZE,uBAAuB;YACvB,MAAMC,aAAaC,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC1D,MAAMC,WAAWC,YAAYH;YAE7B,IAAII,OAAO,MAAM,CAACC,UAAU,QAAQ,CAACH,WACnCN,gBAAgBM;QAEpB;QAEA,IAAIhB,KAAK,QAAQ,KAAKU,eACpBV,KAAK,cAAc,CAACU;IAExB,GAAG;QAACZ;KAAO;IAGXJ,UAAU;QACR,MAAM0B,kBAAkBZ;QACxBF,gBAAgBc,mBAAmBX;IACrC,GAAG;QAACN;KAAM;IAEV,MAAMkB,MAAMC,WAAWC;IAEvB,OAAO,WAAP,GACE,IAACC,mBAAiBA;QAChB,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;QACrC,cAAc;kBAEb,CAACC,UAAAA,WAAAA,GACA,IAACC,mBAAmB,QAAQ;gBAAC,OAAO;oBAAED;gBAAQ;0BAC5C,mBAACE,QAACA;;sCACA,IAACpC,cAAYA;4BAAC,MAAMkC,SAAS;;wBAC3BL,IAAI,QAAQ,GAA4C,OAAzC,WAAH,GAAG,IAACQ,QAAMA;4BAAC,cAAcxB;;sCACvC,IAACyB,UAAQA,CAAAA;sCACT,KAACF,OAAAA,OAAS;4BACR,OAAO;gCACL,QAAQ;gCACR,WAAW;gCACX,SAASG,KAAK,WAAW;gCACzB,WAAW,AAACV,IAAI,QAAQ,GAAuB,IAApBU,KAAK,YAAY;gCAC5C,YAAYC;4BACd;;gCAEC9B;8CACD,IAAC+B,YAAY,OAAO;;;;;;;AAOlC"}
1
+ {"version":3,"file":"components/Layout/index.mjs","sources":["../../../src/components/Layout/index.tsx"],"sourcesContent":["import { PropsWithChildren, useContext, useEffect, useState } from 'react';\nimport { FloatButton, Layout as L } from 'antd';\nimport { Language, MAIN_BG, Size } from '../../constants';\nimport { Header } from './header';\nimport {\n useLocale,\n useI18n,\n getFirstVisitFromStorage,\n setFirstVisitToStorage,\n getLanguage,\n useUrlQuery,\n getEnableRoutesFromUrlQuery,\n} from '../../utils';\nimport { Progress } from './progress';\nimport { ConfigContext } from '../../config';\nimport { SDK } from '@rsdoctor/types';\nimport { ServerAPIProvider } from '../Manifest';\nimport { ProjectInfoContext } from './project-info-context';\n\nexport interface LayoutProps {\n children: React.JSX.Element;\n}\n\nconst TitleUpdater: React.FC<{\n name?: string;\n}> = ({ name }) => {\n useEffect(() => {\n if (name) {\n document.title = `Rsdoctor - ${name}`;\n } else {\n document.title = 'Rsdoctor';\n }\n }, [name]);\n\n return null;\n};\n\nexport const Layout = (\n props: PropsWithChildren<LayoutProps>,\n): React.JSX.Element => {\n const locale = useLocale();\n const { i18n } = useI18n();\n const { children } = props;\n const query = useUrlQuery();\n const [enableRoutes, setEnableRoutes] = useState<string[] | undefined>(\n () => getEnableRoutesFromUrlQuery() || undefined,\n );\n\n useEffect(() => {\n let currentLocale = locale;\n // Check if the user is visiting the site for the first time\n const visited = getFirstVisitFromStorage();\n if (!visited) {\n setFirstVisitToStorage('1');\n const targetLang = window.navigator.language.split('-')[0];\n const userLang = getLanguage(targetLang);\n\n if (Object.values(Language).includes(userLang)) {\n currentLocale = userLang;\n }\n }\n\n if (i18n.language !== currentLocale) {\n i18n.changeLanguage(currentLocale);\n }\n }, [locale]);\n\n // Listen for enableRoutes changes in URL query parameters\n useEffect(() => {\n const newEnableRoutes = getEnableRoutesFromUrlQuery();\n setEnableRoutes(newEnableRoutes || undefined);\n }, [query]);\n\n const ctx = useContext(ConfigContext);\n\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetProjectInfo}\n showSkeleton={false}\n >\n {(project) => (\n <ProjectInfoContext.Provider value={{ project }}>\n <L>\n <TitleUpdater name={project?.name} />\n {!ctx.embedded ? <Header enableRoutes={enableRoutes} /> : null}\n <Progress />\n <L.Content\n style={{\n height: '100%',\n minHeight: '100vh',\n padding: Size.BasePadding,\n marginTop: !ctx.embedded ? Size.NavBarHeight : 0,\n background: MAIN_BG,\n }}\n >\n {children}\n <FloatButton.BackTop />\n </L.Content>\n </L>\n </ProjectInfoContext.Provider>\n )}\n </ServerAPIProvider>\n );\n};\n"],"names":["TitleUpdater","name","useEffect","document","Layout","props","locale","useLocale","i18n","useI18n","children","query","useUrlQuery","enableRoutes","setEnableRoutes","useState","getEnableRoutesFromUrlQuery","undefined","currentLocale","visited","getFirstVisitFromStorage","setFirstVisitToStorage","targetLang","window","userLang","getLanguage","Object","Language","newEnableRoutes","ctx","useContext","ConfigContext","ServerAPIProvider","SDK","project","ProjectInfoContext","L","Header","Progress","Size","MAIN_BG","FloatButton"],"mappings":";;;;;;;;;;;AAuBA,MAAMA,eAED,CAAC,EAAEC,IAAI,EAAE;IACZC,UAAU;QACR,IAAID,MACFE,SAAS,KAAK,GAAG,CAAC,WAAW,EAAEF,MAAM;aAErCE,SAAS,KAAK,GAAG;IAErB,GAAG;QAACF;KAAK;IAET,OAAO;AACT;AAEO,MAAMG,gBAAS,CACpBC;IAEA,MAAMC,SAASC;IACf,MAAM,EAAEC,IAAI,EAAE,GAAGC;IACjB,MAAM,EAAEC,QAAQ,EAAE,GAAGL;IACrB,MAAMM,QAAQC;IACd,MAAM,CAACC,cAAcC,gBAAgB,GAAGC,SACtC,IAAMC,iCAAiCC;IAGzCf,UAAU;QACR,IAAIgB,gBAAgBZ;QAEpB,MAAMa,UAAUC;QAChB,IAAI,CAACD,SAAS;YACZE,uBAAuB;YACvB,MAAMC,aAAaC,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC1D,MAAMC,WAAWC,YAAYH;YAE7B,IAAII,OAAO,MAAM,CAACC,UAAU,QAAQ,CAACH,WACnCN,gBAAgBM;QAEpB;QAEA,IAAIhB,KAAK,QAAQ,KAAKU,eACpBV,KAAK,cAAc,CAACU;IAExB,GAAG;QAACZ;KAAO;IAGXJ,UAAU;QACR,MAAM0B,kBAAkBZ;QACxBF,gBAAgBc,mBAAmBX;IACrC,GAAG;QAACN;KAAM;IAEV,MAAMkB,MAAMC,WAAWC;IAEvB,OAAO,WAAP,GACE,IAACC,mBAAiBA;QAChB,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;QACrC,cAAc;kBAEb,CAACC,UAAAA,WAAAA,GACA,IAACC,mBAAmB,QAAQ;gBAAC,OAAO;oBAAED;gBAAQ;0BAC5C,mBAACE,QAACA;;sCACA,IAACpC,cAAYA;4BAAC,MAAMkC,SAAS;;wBAC3BL,IAAI,QAAQ,GAA4C,OAAzC,WAAH,GAAG,IAACQ,QAAMA;4BAAC,cAAcxB;;sCACvC,IAACyB,UAAQA,CAAAA;sCACT,KAACF,OAAAA,OAAS;4BACR,OAAO;gCACL,QAAQ;gCACR,WAAW;gCACX,SAASG,KAAK,WAAW;gCACzB,WAAW,AAACV,IAAI,QAAQ,GAAuB,IAApBU,KAAK,YAAY;gCAC5C,YAAYC;4BACd;;gCAEC9B;8CACD,IAAC+B,YAAY,OAAO;;;;;;;AAOlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"components/Loader/Analysis/files.mjs","sources":["../../../../src/components/Loader/Analysis/files.tsx"],"sourcesContent":["import { CloseCircleOutlined } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Card,\n Col,\n Divider,\n Drawer,\n List,\n Popover,\n Row,\n Space,\n Table,\n Tag,\n Tooltip,\n Typography,\n} from 'antd';\nimport { get } from 'es-toolkit/compat';\nimport React, { useMemo, useState } from 'react';\nimport { drawerWidth, Size } from '../../../constants';\nimport {\n createFileStructures,\n DataNode,\n filterLoader,\n formatCosts,\n mapFileKey,\n} from '../../../utils';\nimport { FileTree } from '../../FileTree';\nimport { Keyword } from '../../Keyword';\nimport { ServerAPIProvider } from '../../Manifest';\nimport { LoaderExecutions } from '../executions';\nimport styles from './style.module.scss';\n\nconst ADDITION_LOADER_NUMBER = 3;\n\nexport const LoaderFiles: React.FC<{\n filetree: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderFileTree>;\n cwd: string;\n loaders: string[];\n filename: string;\n layer?: string;\n}> = (props) => {\n const { cwd, filetree } = props;\n const [drawerVisible, setDrawerVisible] = useState(false);\n const [resourcePath, setResourcePath] = useState('');\n const [loaderIndex, setLoaderIndex] = useState(0);\n const [selectedNode, setSelectedNode] = useState<DataNode | null>(null);\n\n const maxHeight = 800;\n\n const filteredFiles = useMemo(\n () =>\n filetree.filter((e) =>\n e.loaders.some((l) =>\n filterLoader(\n e.path,\n l.loader,\n props.filename,\n props.loaders,\n e.layer,\n props?.layer,\n ),\n ),\n ),\n [props.filename, props.loaders, props.layer],\n );\n\n const inlinedResourcePathKey = '__RESOURCEPATH__';\n\n const files = useMemo(() => {\n return createFileStructures({\n files: filteredFiles.map((e) => e.path),\n cwd,\n fileTitle(file, basename) {\n const { loaders, layer } = filetree.find((e) => e.path === file)!;\n\n const additionalLoaders: (Pick<\n SDK.LoaderTransformData,\n 'path' | 'loader' | 'errors'\n > & { costs: number })[] = [];\n\n loaders.forEach(\n (l, i) => i > ADDITION_LOADER_NUMBER && additionalLoaders.push(l),\n );\n\n return (\n <div\n style={{\n wordBreak: 'break-all',\n display: 'flex',\n cursor: 'pointer',\n }}\n onClick={() => {\n setLoaderIndex(0);\n setResourcePath(file);\n setDrawerVisible(true);\n }}\n >\n <div className={styles.box}>\n <div className={styles.keywords}>\n <Keyword text={basename.replace(/\\[.*?\\]/g, '')} keyword={''} />\n </div>\n </div>\n <div className={styles.dividerDiv} style={{ flex: 1 }}>\n <Divider className={styles.divider} dashed />\n </div>\n\n {layer && (\n <Tag color=\"cyan\" bordered={false}>\n {layer}\n </Tag>\n )}\n <Space>\n {loaders.slice(0, ADDITION_LOADER_NUMBER).map((e, i) => {\n const isError = e.errors && e.errors.length;\n const key = `${file}_${e.loader}_${i}`;\n if (i <= ADDITION_LOADER_NUMBER) {\n return (\n <Tooltip title={e.path} key={key}>\n <Typography.Text\n className={styles.textBox}\n style={{ color: isError ? '#f50' : 'inherit' }}\n onClick={(ev) => {\n ev.stopPropagation();\n setResourcePath(file);\n setLoaderIndex(i);\n setDrawerVisible(true);\n }}\n >\n <Typography.Text className={styles.text} ellipsis>\n {e.loader.match(/([^/]+-loader)/g)?.[0] || e.loader}\n </Typography.Text>\n <Divider type=\"vertical\" />\n {isError ? (\n <CloseCircleOutlined />\n ) : (\n <Typography.Text className={styles.text}>\n {formatCosts(e.costs)}\n </Typography.Text>\n )}\n </Typography.Text>\n </Tooltip>\n );\n }\n })}\n {additionalLoaders?.length ? (\n <Popover\n content={\n <List\n dataSource={additionalLoaders}\n renderItem={(e, i) => {\n const isError = e.errors && e.errors.length;\n const key = `${file}_${e.loader}_${i + ADDITION_LOADER_NUMBER}`;\n\n return (\n <List.Item>\n <Tooltip title={e.path} key={key}>\n <div style={{ paddingBottom: 5 }}>\n <Typography.Text\n className={styles.textBox}\n style={{\n color: isError ? '#f50' : 'inherit',\n }}\n onClick={(ev) => {\n ev.stopPropagation();\n setResourcePath(file);\n setLoaderIndex(i);\n setDrawerVisible(true);\n }}\n >\n <Typography.Text\n className={styles.text}\n ellipsis\n >\n {e.loader.match(/([^/]+-loader)/g)?.[0] ||\n e.loader}\n </Typography.Text>\n <Divider type=\"vertical\" />\n <Typography.Text className={styles.text}>\n {formatCosts(e.costs)}\n </Typography.Text>\n </Typography.Text>\n </div>\n </Tooltip>\n </List.Item>\n );\n }}\n />\n }\n >\n <div className={styles.textBox}>\n <Typography.Text>···</Typography.Text>\n </div>\n </Popover>\n ) : (\n <></>\n )}\n </Space>\n </div>\n );\n },\n dirTitle(_dir, defaultTitle) {\n return (\n <div style={{ display: 'flex', cursor: 'pointer' }}>\n <Keyword text={defaultTitle} keyword={''} />\n </div>\n );\n },\n });\n }, [filteredFiles]);\n\n return (\n <Row style={{ width: '100%', marginLeft: 0 }} gutter={Size.BasePadding}>\n <Col span={24}>\n <Card\n title={\n <Space>\n <Typography.Text strong>Files</Typography.Text>\n <Typography.Text\n style={{\n fontSize: 12,\n fontWeight: 400,\n color: '#1C1F2399',\n opacity: 0.6,\n }}\n >\n Total Files: {filteredFiles.length}\n </Typography.Text>\n </Space>\n }\n bodyStyle={{\n overflow: 'auto',\n maxHeight,\n minHeight: '40rem',\n padding: 14,\n }}\n >\n <FileTree\n defaultExpandedKeys={mapFileKey(\n files,\n filteredFiles.length >= 100 ? 3 : 4,\n (node) => {\n const resourcePath: string = get(node, inlinedResourcePathKey)!;\n const isNodeModules =\n resourcePath.indexOf('/node_modules/') > -1;\n\n return !isNodeModules;\n },\n )}\n treeData={files}\n key={`${props.loaders.join('|')}_${props.filename}`}\n onSelect={(_e, info) => {\n if (!info.node.isLeaf) {\n setSelectedNode(info.node);\n }\n }}\n selectedKeys={selectedNode ? [selectedNode.key] : undefined}\n expandAction=\"click\"\n />\n <Drawer\n open={drawerVisible}\n onClose={() => setDrawerVisible(false)}\n maskClosable\n width={drawerWidth}\n zIndex={999}\n bodyStyle={{ padding: 0 }}\n >\n {drawerVisible ? (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetLoaderFileDetails}\n body={{ path: resourcePath }}\n >\n {(data) => (\n <LoaderExecutions data={data} cwd={cwd} index={loaderIndex} />\n )}\n </ServerAPIProvider>\n ) : null}\n </Drawer>\n </Card>\n </Col>\n\n <Drawer\n open={!!selectedNode}\n onClose={() => setSelectedNode(null)}\n maskClosable\n width={drawerWidth}\n zIndex={999}\n bodyStyle={{ padding: 0 }}\n >\n {selectedNode && (\n <Row>\n <Col span={24}>\n <Card\n title={\n <Tooltip\n title={React.cloneElement(\n selectedNode.title as React.ReactElement,\n { style: { color: '#fff' } },\n )}\n >\n <Typography.Text>\n {`Statistics of`}\n {selectedNode.title as React.ReactNode}\n </Typography.Text>\n </Tooltip>\n }\n >\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetLoaderFolderStatistics}\n body={{ folder: selectedNode[inlinedResourcePathKey] }}\n >\n {(tableData) => (\n <Table\n style={{\n width: '100%',\n maxHeight,\n height: '40rem',\n overflowY: 'scroll',\n wordBreak: 'break-all',\n }}\n pagination={false}\n bordered\n rowKey={(e) => e.loader}\n columns={[\n {\n title: 'Loader Name',\n dataIndex: 'loader',\n },\n {\n title: 'Files',\n dataIndex: 'files',\n },\n {\n title: 'Total Duration',\n dataIndex: 'costs',\n render: (v) => (\n <Typography.Text strong>\n {formatCosts(v)}\n </Typography.Text>\n ),\n sorter: (a, b) => a.costs - b.costs,\n defaultSortOrder: 'descend',\n sortDirections: ['descend', 'ascend'],\n },\n ]}\n dataSource={tableData!}\n />\n )}\n </ServerAPIProvider>\n </Card>\n </Col>\n </Row>\n )}\n </Drawer>\n </Row>\n );\n};\n"],"names":["ADDITION_LOADER_NUMBER","LoaderFiles","props","cwd","filetree","drawerVisible","setDrawerVisible","useState","resourcePath","setResourcePath","loaderIndex","setLoaderIndex","selectedNode","setSelectedNode","maxHeight","filteredFiles","useMemo","e","l","filterLoader","inlinedResourcePathKey","files","createFileStructures","file","basename","loaders","layer","additionalLoaders","i","styles","Keyword","Divider","Tag","Space","isError","key","Tooltip","Typography","ev","CloseCircleOutlined","formatCosts","Popover","List","_dir","defaultTitle","Row","Size","Col","Card","FileTree","mapFileKey","node","get","isNodeModules","_e","info","undefined","Drawer","drawerWidth","ServerAPIProvider","SDK","data","LoaderExecutions","React","tableData","Table","v","a","b"],"mappings":";;;;;;;;;;;;;AAgCA,MAAMA,yBAAyB;AAExB,MAAMC,cAMR,CAACC;IACJ,MAAM,EAAEC,GAAG,EAAEC,QAAQ,EAAE,GAAGF;IAC1B,MAAM,CAACG,eAAeC,iBAAiB,GAAGC,SAAS;IACnD,MAAM,CAACC,cAAcC,gBAAgB,GAAGF,SAAS;IACjD,MAAM,CAACG,aAAaC,eAAe,GAAGJ,SAAS;IAC/C,MAAM,CAACK,cAAcC,gBAAgB,GAAGN,SAA0B;IAElE,MAAMO,YAAY;IAElB,MAAMC,gBAAgBC,QACpB,IACEZ,SAAS,MAAM,CAAC,CAACa,IACfA,EAAE,OAAO,CAAC,IAAI,CAAC,CAACC,IACdC,aACEF,EAAE,IAAI,EACNC,EAAE,MAAM,EACRhB,MAAM,QAAQ,EACdA,MAAM,OAAO,EACbe,EAAE,KAAK,EACPf,OAAO,UAIf;QAACA,MAAM,QAAQ;QAAEA,MAAM,OAAO;QAAEA,MAAM,KAAK;KAAC;IAG9C,MAAMkB,yBAAyB;IAE/B,MAAMC,QAAQL,QAAQ,IACbM,qBAAqB;YAC1B,OAAOP,cAAc,GAAG,CAAC,CAACE,IAAMA,EAAE,IAAI;YACtCd;YACA,WAAUoB,IAAI,EAAEC,QAAQ;gBACtB,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAE,GAAGtB,SAAS,IAAI,CAAC,CAACa,IAAMA,EAAE,IAAI,KAAKM;gBAE3D,MAAMI,oBAGqB,EAAE;gBAE7BF,QAAQ,OAAO,CACb,CAACP,GAAGU,IAAMA,IAAI5B,0BAA0B2B,kBAAkB,IAAI,CAACT;gBAGjE,OAAO,WAAP,GACE,KAAC;oBACC,OAAO;wBACL,WAAW;wBACX,SAAS;wBACT,QAAQ;oBACV;oBACA,SAAS;wBACPP,eAAe;wBACfF,gBAAgBc;wBAChBjB,iBAAiB;oBACnB;;sCAEA,IAAC;4BAAI,WAAWuB,aAAAA,GAAU;sCACxB,kBAAC;gCAAI,WAAWA,aAAAA,QAAe;0CAC7B,kBAACC,SAAOA;oCAAC,MAAMN,SAAS,OAAO,CAAC,YAAY;oCAAK,SAAS;;;;sCAG9D,IAAC;4BAAI,WAAWK,aAAAA,UAAiB;4BAAE,OAAO;gCAAE,MAAM;4BAAE;sCAClD,kBAACE,SAAOA;gCAAC,WAAWF,aAAAA,OAAc;gCAAE,QAAM;;;wBAG3CH,SAAS,WAATA,GACC,IAACM,KAAGA;4BAAC,OAAM;4BAAO,UAAU;sCACzBN;;sCAGL,KAACO,OAAKA;;gCACHR,QAAQ,KAAK,CAAC,GAAGzB,wBAAwB,GAAG,CAAC,CAACiB,GAAGW;oCAChD,MAAMM,UAAUjB,EAAE,MAAM,IAAIA,EAAE,MAAM,CAAC,MAAM;oCAC3C,MAAMkB,MAAM,GAAGZ,KAAK,CAAC,EAAEN,EAAE,MAAM,CAAC,CAAC,EAAEW,GAAG;oCACtC,IAAIA,KAAK5B,wBACP,OAAO,WAAP,GACE,IAACoC,SAAOA;wCAAC,OAAOnB,EAAE,IAAI;kDACpB,mBAACoB,WAAW,IAAI;4CACd,WAAWR,aAAAA,OAAc;4CACzB,OAAO;gDAAE,OAAOK,UAAU,SAAS;4CAAU;4CAC7C,SAAS,CAACI;gDACRA,GAAG,eAAe;gDAClB7B,gBAAgBc;gDAChBZ,eAAeiB;gDACftB,iBAAiB;4CACnB;;8DAEA,IAAC+B,WAAW,IAAI;oDAAC,WAAWR,aAAAA,IAAW;oDAAE,UAAQ;8DAC9CZ,EAAE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,IAAIA,EAAE,MAAM;;8DAErD,IAACc,SAAOA;oDAAC,MAAK;;gDACbG,UAAU,WAAVA,GACC,IAACK,qBAAmBA,CAAAA,KAAAA,WAAAA,GAEpB,IAACF,WAAW,IAAI;oDAAC,WAAWR,aAAAA,IAAW;8DACpCW,YAAYvB,EAAE,KAAK;;;;uCAnBCkB;gCA0BnC;gCACCR,mBAAmB,SAAS,WAAT,GAClB,IAACc,SAAOA;oCACN,uBACE,IAACC,MAAIA;wCACH,YAAYf;wCACZ,YAAY,CAACV,GAAGW;4CACd,MAAMM,UAAUjB,EAAE,MAAM,IAAIA,EAAE,MAAM,CAAC,MAAM;4CAC3C,MAAMkB,MAAM,GAAGZ,KAAK,CAAC,EAAEN,EAAE,MAAM,CAAC,CAAC,EAAEW,IAAI5B,wBAAwB;4CAE/D,OAAO,WAAP,GACE,IAAC0C,KAAK,IAAI;0DACR,kBAACN,SAAOA;oDAAC,OAAOnB,EAAE,IAAI;8DACpB,kBAAC;wDAAI,OAAO;4DAAE,eAAe;wDAAE;kEAC7B,mBAACoB,WAAW,IAAI;4DACd,WAAWR,aAAAA,OAAc;4DACzB,OAAO;gEACL,OAAOK,UAAU,SAAS;4DAC5B;4DACA,SAAS,CAACI;gEACRA,GAAG,eAAe;gEAClB7B,gBAAgBc;gEAChBZ,eAAeiB;gEACftB,iBAAiB;4DACnB;;8EAEA,IAAC+B,WAAW,IAAI;oEACd,WAAWR,aAAAA,IAAW;oEACtB,UAAQ;8EAEPZ,EAAE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,IACrCA,EAAE,MAAM;;8EAEZ,IAACc,SAAOA;oEAAC,MAAK;;8EACd,IAACM,WAAW,IAAI;oEAAC,WAAWR,aAAAA,IAAW;8EACpCW,YAAYvB,EAAE,KAAK;;;;;mDAvBCkB;;wCA8BnC;;8CAIJ,kBAAC;wCAAI,WAAWN,aAAAA,OAAc;kDAC5B,kBAACQ,WAAW,IAAI;sDAAC;;;mDAIrB;;;;;YAKV;YACA,UAASM,IAAI,EAAEC,YAAY;gBACzB,OAAO,WAAP,GACE,IAAC;oBAAI,OAAO;wBAAE,SAAS;wBAAQ,QAAQ;oBAAU;8BAC/C,kBAACd,SAAOA;wBAAC,MAAMc;wBAAc,SAAS;;;YAG5C;QACF,IACC;QAAC7B;KAAc;IAElB,OAAO,WAAP,GACE,KAAC8B,KAAGA;QAAC,OAAO;YAAE,OAAO;YAAQ,YAAY;QAAE;QAAG,QAAQC,KAAK,WAAW;;0BACpE,IAACC,KAAGA;gBAAC,MAAM;0BACT,mBAACC,MAAIA;oBACH,qBACE,KAACf,OAAKA;;0CACJ,IAACI,WAAW,IAAI;gCAAC,QAAM;0CAAC;;0CACxB,KAACA,WAAW,IAAI;gCACd,OAAO;oCACL,UAAU;oCACV,YAAY;oCACZ,OAAO;oCACP,SAAS;gCACX;;oCACD;oCACetB,cAAc,MAAM;;;;;oBAIxC,WAAW;wBACT,UAAU;wBACVD;wBACA,WAAW;wBACX,SAAS;oBACX;;sCAEA,IAACmC,UAAQA;4BACP,qBAAqBC,WACnB7B,OACAN,cAAc,MAAM,IAAI,MAAM,IAAI,GAClC,CAACoC;gCACC,MAAM3C,eAAuB4C,IAAID,MAAM/B;gCACvC,MAAMiC,gBACJ7C,aAAa,OAAO,CAAC,oBAAoB;gCAE3C,OAAO,CAAC6C;4BACV;4BAEF,UAAUhC;4BAEV,UAAU,CAACiC,IAAIC;gCACb,IAAI,CAACA,KAAK,IAAI,CAAC,MAAM,EACnB1C,gBAAgB0C,KAAK,IAAI;4BAE7B;4BACA,cAAc3C,eAAe;gCAACA,aAAa,GAAG;6BAAC,GAAG4C;4BAClD,cAAa;2BAPR,GAAGtD,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAEA,MAAM,QAAQ,EAAE;sCASrD,IAACuD,QAAMA;4BACL,MAAMpD;4BACN,SAAS,IAAMC,iBAAiB;4BAChC,cAAY;4BACZ,OAAOoD;4BACP,QAAQ;4BACR,WAAW;gCAAE,SAAS;4BAAE;sCAEvBrD,gBAAgB,WAAhBA,GACC,IAACsD,mBAAiBA;gCAChB,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,oBAAoB;gCAC3C,MAAM;oCAAE,MAAMpD;gCAAa;0CAE1B,CAACqD,OAAAA,WAAAA,GACA,IAACC,kBAAgBA;wCAAC,MAAMD;wCAAM,KAAK1D;wCAAK,OAAOO;;iCAGjD;;;;;0BAKV,IAAC+C,QAAMA;gBACL,MAAM,CAAC,CAAC7C;gBACR,SAAS,IAAMC,gBAAgB;gBAC/B,cAAY;gBACZ,OAAO6C;gBACP,QAAQ;gBACR,WAAW;oBAAE,SAAS;gBAAE;0BAEvB9C,gBAAgB,WAAhBA,GACC,IAACiC,KAAGA;8BACF,kBAACE,KAAGA;wBAAC,MAAM;kCACT,kBAACC,MAAIA;4BACH,qBACE,IAACZ,SAAOA;gCACN,qBAAO2B,MAAAA,YAAkB,CACvBnD,aAAa,KAAK,EAClB;oCAAE,OAAO;wCAAE,OAAO;oCAAO;gCAAE;0CAG7B,mBAACyB,WAAW,IAAI;;wCACb;wCACAzB,aAAa,KAAK;;;;sCAKzB,kBAAC+C,mBAAiBA;gCAChB,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,yBAAyB;gCAChD,MAAM;oCAAE,QAAQhD,YAAY,CAACQ,uBAAuB;gCAAC;0CAEpD,CAAC4C,YAAAA,WAAAA,GACA,IAACC,OAAKA;wCACJ,OAAO;4CACL,OAAO;4CACPnD;4CACA,QAAQ;4CACR,WAAW;4CACX,WAAW;wCACb;wCACA,YAAY;wCACZ,UAAQ;wCACR,QAAQ,CAACG,IAAMA,EAAE,MAAM;wCACvB,SAAS;4CACP;gDACE,OAAO;gDACP,WAAW;4CACb;4CACA;gDACE,OAAO;gDACP,WAAW;4CACb;4CACA;gDACE,OAAO;gDACP,WAAW;gDACX,QAAQ,CAACiD,IAAAA,WAAAA,GACP,IAAC7B,WAAW,IAAI;wDAAC,QAAM;kEACpBG,YAAY0B;;gDAGjB,QAAQ,CAACC,GAAGC,IAAMD,EAAE,KAAK,GAAGC,EAAE,KAAK;gDACnC,kBAAkB;gDAClB,gBAAgB;oDAAC;oDAAW;iDAAS;4CACvC;yCACD;wCACD,YAAYJ;;;;;;;;;AAWlC"}
1
+ {"version":3,"file":"components/Loader/Analysis/files.mjs","sources":["../../../../src/components/Loader/Analysis/files.tsx"],"sourcesContent":["import { CloseCircleOutlined } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Card,\n Col,\n Divider,\n Drawer,\n List,\n Popover,\n Row,\n Space,\n Table,\n Tag,\n Tooltip,\n Typography,\n} from 'antd';\nimport { get } from 'es-toolkit/compat';\nimport React, { useMemo, useState } from 'react';\nimport { drawerWidth, Size } from '../../../constants';\nimport {\n createFileStructures,\n DataNode,\n filterLoader,\n formatCosts,\n mapFileKey,\n} from '../../../utils';\nimport { FileTree } from '../../FileTree';\nimport { Keyword } from '../../Keyword';\nimport { ServerAPIProvider } from '../../Manifest';\nimport { LoaderExecutions } from '../executions';\nimport styles from './style.module.scss';\n\nconst ADDITION_LOADER_NUMBER = 3;\n\nexport const LoaderFiles: React.FC<{\n filetree: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderFileTree>;\n cwd: string;\n loaders: string[];\n filename: string;\n layer?: string;\n}> = (props) => {\n const { cwd, filetree } = props;\n const [drawerVisible, setDrawerVisible] = useState(false);\n const [resourcePath, setResourcePath] = useState('');\n const [loaderIndex, setLoaderIndex] = useState(0);\n const [selectedNode, setSelectedNode] = useState<DataNode | null>(null);\n\n const maxHeight = 800;\n\n const filteredFiles = useMemo(\n () =>\n filetree.filter((e) =>\n e.loaders.some((l) =>\n filterLoader(\n e.path,\n l.loader,\n props.filename,\n props.loaders,\n e.layer,\n props?.layer,\n ),\n ),\n ),\n [props.filename, props.loaders, props.layer],\n );\n\n const inlinedResourcePathKey = '__RESOURCEPATH__';\n\n const files = useMemo(() => {\n return createFileStructures({\n files: filteredFiles.map((e) => e.path),\n cwd,\n fileTitle(file, basename) {\n const { loaders, layer } = filetree.find((e) => e.path === file)!;\n\n const additionalLoaders: (Pick<\n SDK.LoaderTransformData,\n 'path' | 'loader' | 'errors'\n > & { costs: number })[] = [];\n\n loaders.forEach(\n (l, i) => i > ADDITION_LOADER_NUMBER && additionalLoaders.push(l),\n );\n\n return (\n <div\n style={{\n wordBreak: 'break-all',\n display: 'flex',\n cursor: 'pointer',\n }}\n onClick={() => {\n setLoaderIndex(0);\n setResourcePath(file);\n setDrawerVisible(true);\n }}\n >\n <div className={styles.box}>\n <div className={styles.keywords}>\n <Keyword text={basename.replace(/\\[.*?\\]/g, '')} keyword={''} />\n </div>\n </div>\n <div className={styles.dividerDiv} style={{ flex: 1 }}>\n <Divider className={styles.divider} dashed />\n </div>\n\n {layer && (\n <Tag color=\"cyan\" bordered={false}>\n {layer}\n </Tag>\n )}\n <Space>\n {loaders.slice(0, ADDITION_LOADER_NUMBER).map((e, i) => {\n const isError = e.errors && e.errors.length;\n const key = `${file}_${e.loader}_${i}`;\n if (i <= ADDITION_LOADER_NUMBER) {\n return (\n <Tooltip title={e.path} key={key}>\n <Typography.Text\n className={styles.textBox}\n style={{ color: isError ? '#f50' : 'inherit' }}\n onClick={(ev) => {\n ev.stopPropagation();\n setResourcePath(file);\n setLoaderIndex(i);\n setDrawerVisible(true);\n }}\n >\n <Typography.Text className={styles.text} ellipsis>\n {e.loader.match(/([^/]+-loader)/g)?.[0] || e.loader}\n </Typography.Text>\n <Divider type=\"vertical\" />\n {isError ? (\n <CloseCircleOutlined />\n ) : (\n <Typography.Text className={styles.text}>\n {formatCosts(e.costs)}\n </Typography.Text>\n )}\n </Typography.Text>\n </Tooltip>\n );\n }\n })}\n {additionalLoaders?.length ? (\n <Popover\n content={\n <List\n dataSource={additionalLoaders}\n renderItem={(e, i) => {\n const isError = e.errors && e.errors.length;\n const key = `${file}_${e.loader}_${i + ADDITION_LOADER_NUMBER}`;\n\n return (\n <List.Item>\n <Tooltip title={e.path} key={key}>\n <div style={{ paddingBottom: 5 }}>\n <Typography.Text\n className={styles.textBox}\n style={{\n color: isError ? '#f50' : 'inherit',\n }}\n onClick={(ev) => {\n ev.stopPropagation();\n setResourcePath(file);\n setLoaderIndex(i);\n setDrawerVisible(true);\n }}\n >\n <Typography.Text\n className={styles.text}\n ellipsis\n >\n {e.loader.match(/([^/]+-loader)/g)?.[0] ||\n e.loader}\n </Typography.Text>\n <Divider type=\"vertical\" />\n <Typography.Text className={styles.text}>\n {formatCosts(e.costs)}\n </Typography.Text>\n </Typography.Text>\n </div>\n </Tooltip>\n </List.Item>\n );\n }}\n />\n }\n >\n <div className={styles.textBox}>\n <Typography.Text>···</Typography.Text>\n </div>\n </Popover>\n ) : (\n <></>\n )}\n </Space>\n </div>\n );\n },\n dirTitle(_dir, defaultTitle) {\n return (\n <div style={{ display: 'flex', cursor: 'pointer' }}>\n <Keyword text={defaultTitle} keyword={''} />\n </div>\n );\n },\n });\n }, [filteredFiles]);\n\n return (\n <Row style={{ width: '100%', marginLeft: 0 }} gutter={Size.BasePadding}>\n <Col span={24}>\n <Card\n title={\n <Space>\n <Typography.Text strong>Files</Typography.Text>\n <Typography.Text\n style={{\n fontSize: 12,\n fontWeight: 400,\n color: '#1C1F2399',\n opacity: 0.6,\n }}\n >\n Total Files: {filteredFiles.length}\n </Typography.Text>\n </Space>\n }\n bodyStyle={{\n overflow: 'auto',\n maxHeight,\n minHeight: '40rem',\n padding: 14,\n }}\n >\n <FileTree\n defaultExpandedKeys={mapFileKey(\n files,\n filteredFiles.length >= 100 ? 3 : 4,\n (node) => {\n const resourcePath: string = get(node, inlinedResourcePathKey)!;\n const isNodeModules =\n resourcePath.indexOf('/node_modules/') > -1;\n\n return !isNodeModules;\n },\n )}\n treeData={files}\n key={`${props.loaders.join('|')}_${props.filename}`}\n onSelect={(_e, info) => {\n if (!info.node.isLeaf) {\n setSelectedNode(info.node);\n }\n }}\n selectedKeys={selectedNode ? [selectedNode.key] : undefined}\n expandAction=\"click\"\n />\n <Drawer\n open={drawerVisible}\n onClose={() => setDrawerVisible(false)}\n maskClosable\n width={drawerWidth}\n zIndex={999}\n bodyStyle={{ padding: 0 }}\n >\n {drawerVisible ? (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetLoaderFileDetails}\n body={{ path: resourcePath }}\n >\n {(data) => (\n <LoaderExecutions data={data} cwd={cwd} index={loaderIndex} />\n )}\n </ServerAPIProvider>\n ) : null}\n </Drawer>\n </Card>\n </Col>\n\n <Drawer\n open={!!selectedNode}\n onClose={() => setSelectedNode(null)}\n maskClosable\n width={drawerWidth}\n zIndex={999}\n bodyStyle={{ padding: 0 }}\n >\n {selectedNode && (\n <Row>\n <Col span={24}>\n <Card\n title={\n <Tooltip\n title={React.cloneElement(\n selectedNode.title as React.ReactElement<{\n style?: React.CSSProperties;\n }>,\n { style: { color: '#fff' } },\n )}\n >\n <Typography.Text>\n {`Statistics of`}\n {selectedNode.title as React.ReactNode}\n </Typography.Text>\n </Tooltip>\n }\n >\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetLoaderFolderStatistics}\n body={{ folder: selectedNode[inlinedResourcePathKey] }}\n >\n {(tableData) => (\n <Table\n style={{\n width: '100%',\n maxHeight,\n height: '40rem',\n overflowY: 'scroll',\n wordBreak: 'break-all',\n }}\n pagination={false}\n bordered\n rowKey={(e) => e.loader}\n columns={[\n {\n title: 'Loader Name',\n dataIndex: 'loader',\n },\n {\n title: 'Files',\n dataIndex: 'files',\n },\n {\n title: 'Total Duration',\n dataIndex: 'costs',\n render: (v) => (\n <Typography.Text strong>\n {formatCosts(v)}\n </Typography.Text>\n ),\n sorter: (a, b) => a.costs - b.costs,\n defaultSortOrder: 'descend',\n sortDirections: ['descend', 'ascend'],\n },\n ]}\n dataSource={tableData!}\n />\n )}\n </ServerAPIProvider>\n </Card>\n </Col>\n </Row>\n )}\n </Drawer>\n </Row>\n );\n};\n"],"names":["ADDITION_LOADER_NUMBER","LoaderFiles","props","cwd","filetree","drawerVisible","setDrawerVisible","useState","resourcePath","setResourcePath","loaderIndex","setLoaderIndex","selectedNode","setSelectedNode","maxHeight","filteredFiles","useMemo","e","l","filterLoader","inlinedResourcePathKey","files","createFileStructures","file","basename","loaders","layer","additionalLoaders","i","styles","Keyword","Divider","Tag","Space","isError","key","Tooltip","Typography","ev","CloseCircleOutlined","formatCosts","Popover","List","_dir","defaultTitle","Row","Size","Col","Card","FileTree","mapFileKey","node","get","isNodeModules","_e","info","undefined","Drawer","drawerWidth","ServerAPIProvider","SDK","data","LoaderExecutions","React","tableData","Table","v","a","b"],"mappings":"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"}
@@ -2,10 +2,4 @@ import React from 'react';
2
2
  export declare const LoaderAnalysisBase: React.FC<{
3
3
  cwd: string;
4
4
  }>;
5
- export declare const LoaderAnalysis: React.FC<Omit<{
6
- cwd: string;
7
- }, "cwd"> & Partial<{
8
- body: {
9
- key: import("node_modules/@rsdoctor/types/dist/manifest").RsdoctorManifestMappingKeys;
10
- };
11
- }>>;
5
+ export declare const LoaderAnalysis: React.FC;
@@ -1 +1 @@
1
- {"version":3,"file":"components/Loader/Analysis/index.mjs","sources":["../../../../src/components/Loader/Analysis/index.tsx"],"sourcesContent":["import { SDK } from '@rsdoctor/types';\nimport { ConfigProvider } from 'antd';\nimport React, { useState } from 'react';\nimport { ConfigContext } from 'src/config';\nimport { getLocale } from 'src/utils';\nimport { ServerAPIProvider, withServerAPI } from '../../Manifest';\nimport { ISelectLoaderProps, LoaderCommonSelect } from '../../Select';\nimport { LoaderFiles } from './files';\nimport styles from './style.module.scss';\n\nexport const LoaderAnalysisBase: React.FC<{\n cwd: string;\n}> = ({ cwd }) => {\n const [store, setStore] = useState({\n filename: '',\n loaders: [] as string[],\n layer: '',\n } as ISelectLoaderProps);\n\n return (\n <ConfigContext.Consumer>\n {(v) => {\n return (\n <ConfigProvider\n locale={getLocale(v.locale)}\n theme={{\n token: {\n padding: 16,\n fontSize: 14,\n },\n }}\n >\n <div className={styles.loaderAnalysis}>\n <ServerAPIProvider api={SDK.ServerAPI.API.GetLoaderNames}>\n {(loaderNames) => (\n <LoaderCommonSelect\n onChange={(e) => setStore(e)}\n loaderNames={loaderNames}\n />\n )}\n </ServerAPIProvider>\n <ServerAPIProvider api={SDK.ServerAPI.API.GetLoaderFileTree}>\n {(filetree) => (\n <LoaderFiles\n filename={store.filename}\n filetree={filetree}\n loaders={store.loaders}\n layer={store.layer}\n cwd={cwd}\n />\n )}\n </ServerAPIProvider>\n </div>\n </ConfigProvider>\n );\n }}\n </ConfigContext.Consumer>\n );\n};\n\nexport const LoaderAnalysis = withServerAPI({\n api: SDK.ServerAPI.API.LoadDataByKey,\n body: { key: 'root' },\n responsePropName: 'cwd',\n Component: LoaderAnalysisBase,\n});\n"],"names":["LoaderAnalysisBase","cwd","store","setStore","useState","ConfigContext","v","ConfigProvider","getLocale","styles","ServerAPIProvider","SDK","loaderNames","LoaderCommonSelect","e","filetree","LoaderFiles","LoaderAnalysis","withServerAPI"],"mappings":";;;;;;;;;;AAUO,MAAMA,qBAER,CAAC,EAAEC,GAAG,EAAE;IACX,MAAM,CAACC,OAAOC,SAAS,GAAGC,SAAS;QACjC,UAAU;QACV,SAAS,EAAE;QACX,OAAO;IACT;IAEA,OAAO,WAAP,GACE,IAACC,cAAc,QAAQ;kBACpB,CAACC,IACO,WAAP,GACE,IAACC,gBAAcA;gBACb,QAAQC,UAAUF,EAAE,MAAM;gBAC1B,OAAO;oBACL,OAAO;wBACL,SAAS;wBACT,UAAU;oBACZ;gBACF;0BAEA,mBAAC;oBAAI,WAAWG,aAAAA,cAAqB;;sCACnC,IAACC,mBAAiBA;4BAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;sCACrD,CAACC,cAAAA,WAAAA,GACA,IAACC,oBAAkBA;oCACjB,UAAU,CAACC,IAAMX,SAASW;oCAC1B,aAAaF;;;sCAInB,IAACF,mBAAiBA;4BAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,iBAAiB;sCACxD,CAACI,WAAAA,WAAAA,GACA,IAACC,aAAWA;oCACV,UAAUd,MAAM,QAAQ;oCACxB,UAAUa;oCACV,SAASb,MAAM,OAAO;oCACtB,OAAOA,MAAM,KAAK;oCAClB,KAAKD;;;;;;;AAUzB;AAEO,MAAMgB,iBAAiBC,cAAc;IAC1C,KAAKP,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa;IACpC,MAAM;QAAE,KAAK;IAAO;IACpB,kBAAkB;IAClB,WAAWX;AACb"}
1
+ {"version":3,"file":"components/Loader/Analysis/index.mjs","sources":["../../../../src/components/Loader/Analysis/index.tsx"],"sourcesContent":["import { SDK } from '@rsdoctor/types';\nimport { ConfigProvider } from 'antd';\nimport React, { useState } from 'react';\nimport { ConfigContext } from 'src/config';\nimport { getLocale } from 'src/utils';\nimport { ServerAPIProvider, withServerAPI } from '../../Manifest';\nimport { ISelectLoaderProps, LoaderCommonSelect } from '../../Select';\nimport { LoaderFiles } from './files';\nimport styles from './style.module.scss';\n\nexport const LoaderAnalysisBase: React.FC<{\n cwd: string;\n}> = ({ cwd }) => {\n const [store, setStore] = useState({\n filename: '',\n loaders: [] as string[],\n layer: '',\n } as ISelectLoaderProps);\n\n return (\n <ConfigContext.Consumer>\n {(v) => {\n return (\n <ConfigProvider\n locale={getLocale(v.locale)}\n theme={{\n token: {\n padding: 16,\n fontSize: 14,\n },\n }}\n >\n <div className={styles.loaderAnalysis}>\n <ServerAPIProvider api={SDK.ServerAPI.API.GetLoaderNames}>\n {(loaderNames) => (\n <LoaderCommonSelect\n onChange={(e) => setStore(e)}\n loaderNames={loaderNames}\n />\n )}\n </ServerAPIProvider>\n <ServerAPIProvider api={SDK.ServerAPI.API.GetLoaderFileTree}>\n {(filetree) => (\n <LoaderFiles\n filename={store.filename}\n filetree={filetree}\n loaders={store.loaders}\n layer={store.layer}\n cwd={cwd}\n />\n )}\n </ServerAPIProvider>\n </div>\n </ConfigProvider>\n );\n }}\n </ConfigContext.Consumer>\n );\n};\n\nexport const LoaderAnalysis: React.FC = withServerAPI({\n api: SDK.ServerAPI.API.LoadDataByKey,\n body: { key: 'root' },\n responsePropName: 'cwd',\n Component: LoaderAnalysisBase,\n});\n"],"names":["LoaderAnalysisBase","cwd","store","setStore","useState","ConfigContext","v","ConfigProvider","getLocale","styles","ServerAPIProvider","SDK","loaderNames","LoaderCommonSelect","e","filetree","LoaderFiles","LoaderAnalysis","withServerAPI"],"mappings":";;;;;;;;;;AAUO,MAAMA,qBAER,CAAC,EAAEC,GAAG,EAAE;IACX,MAAM,CAACC,OAAOC,SAAS,GAAGC,SAAS;QACjC,UAAU;QACV,SAAS,EAAE;QACX,OAAO;IACT;IAEA,OAAO,WAAP,GACE,IAACC,cAAc,QAAQ;kBACpB,CAACC,IACO,WAAP,GACE,IAACC,gBAAcA;gBACb,QAAQC,UAAUF,EAAE,MAAM;gBAC1B,OAAO;oBACL,OAAO;wBACL,SAAS;wBACT,UAAU;oBACZ;gBACF;0BAEA,mBAAC;oBAAI,WAAWG,aAAAA,cAAqB;;sCACnC,IAACC,mBAAiBA;4BAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;sCACrD,CAACC,cAAAA,WAAAA,GACA,IAACC,oBAAkBA;oCACjB,UAAU,CAACC,IAAMX,SAASW;oCAC1B,aAAaF;;;sCAInB,IAACF,mBAAiBA;4BAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,iBAAiB;sCACxD,CAACI,WAAAA,WAAAA,GACA,IAACC,aAAWA;oCACV,UAAUd,MAAM,QAAQ;oCACxB,UAAUa;oCACV,SAASb,MAAM,OAAO;oCACtB,OAAOA,MAAM,KAAK;oCAClB,KAAKD;;;;;;;AAUzB;AAEO,MAAMgB,iBAA2BC,cAAc;IACpD,KAAKP,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa;IACpC,MAAM;QAAE,KAAK;IAAO;IACpB,kBAAkB;IAClB,WAAWX;AACb"}
@@ -5,5 +5,5 @@ interface LoaderExecutionsProps {
5
5
  data: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderFileDetails>;
6
6
  index?: number;
7
7
  }
8
- export declare const LoaderExecutions: ({ data, cwd, index, }: PropsWithChildren<LoaderExecutionsProps>) => JSX.Element;
8
+ export declare const LoaderExecutions: ({ data, cwd, index, }: PropsWithChildren<LoaderExecutionsProps>) => React.JSX.Element;
9
9
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"components/Loader/executions.mjs","sources":["../../../src/components/Loader/executions.tsx"],"sourcesContent":["import { ClockCircleTwoTone } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Col,\n Divider,\n Empty,\n List,\n Row,\n Space,\n Tabs,\n Tag,\n Timeline,\n Tooltip,\n Typography,\n} from 'antd';\nimport dayjs from 'dayjs';\nimport { PropsWithChildren, useCallback, useState } from 'react';\nimport InputIcon from 'src/common/svg/loader/input.svg';\nimport OutputIcon from 'src/common/svg/loader/output.svg';\nimport StepIcon from 'src/common/svg/loader/step.svg';\nimport { Size } from '../../constants';\nimport { beautifyPath, formatCosts, useTheme } from '../../utils';\nimport { CodeViewer, DiffViewer } from '../base';\nimport { Card } from '../Card';\nimport { CodeOpener } from '../Opener';\nimport { Title } from '../Title';\nimport { ServerAPIProvider } from '../Manifest';\nimport styles from './Analysis/style.module.scss';\n\ninterface LoaderExecutionsProps {\n cwd: string;\n data: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderFileDetails>;\n index?: number;\n}\n\nconst LoaderPropsItem = ({\n loader,\n resource,\n cwd,\n}: {\n loader: Omit<SDK.LoaderTransformData, 'input' | 'result'> & {\n costs: number;\n };\n resource: SDK.ResourceData;\n cwd: string;\n}): JSX.Element => {\n return (\n <Card\n title={'Loader Details'}\n style={{ border: 'none' }}\n extra={\n <Tag icon={<ClockCircleTwoTone />} color=\"default\">\n {dayjs(loader.startAt).format('YYYY-MM-DD HH:mm:ss')}\n </Tag>\n }\n >\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n {loader.isPitch ? <Typography.Text code>pitch</Typography.Text> : null}\n <List size=\"large\" bordered>\n <List.Item>\n <Typography.Text strong>{'File Path'}</Typography.Text>\n <div>{beautifyPath(resource.path, cwd)}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Resource Path'}</Typography.Text>\n <CodeOpener cwd={cwd} url={resource.path} loc=\"\" disabled />\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Resource Query'}</Typography.Text>\n <div>{resource.queryRaw || '-'}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Duration'}</Typography.Text>\n <div>{formatCosts(loader.costs)}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader'}</Typography.Text>\n <div>\n <Typography.Text code>{loader.loader}</Typography.Text>\n </div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader Index'}</Typography.Text>\n <div>{`${loader.loaderIndex}`}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader Path'}</Typography.Text>\n <CodeOpener cwd={cwd} url={loader.path} loc=\"\" disabled />\n </List.Item>\n <List.Item>\n <div style={{ width: 180 }}>\n <Typography.Text strong>{'Options'}</Typography.Text>\n </div>\n <Divider type=\"vertical\" />\n <Typography.Paragraph\n ellipsis={{\n rows: 2,\n expandable: true,\n symbol: 'more',\n }}\n copyable\n >\n {JSON.stringify(loader.options || '-')}\n </Typography.Paragraph>\n </List.Item>\n </List>\n </Space>\n </Card>\n );\n};\n\n// Component to render Loader Details content with lazy-loaded code\nconst LoaderDetailsContent = ({\n loader,\n resource,\n isLight,\n codeData,\n}: {\n loader: Omit<SDK.LoaderTransformData, 'input' | 'result'> & { costs: number };\n resource: SDK.ResourceData;\n isLight: boolean;\n codeData: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderFileInputAndOutput>;\n}): JSX.Element => {\n const hasError = loader.errors && loader.errors.length;\n const before = codeData?.input || '';\n const loaderResult = codeData?.output || '';\n\n return (\n <div style={{ height: '100%' }}>\n {hasError ? (\n <Col span={24} style={{ height: '53%', minHeight: 400 }}>\n <div\n style={{\n padding: Size.BasePadding,\n borderTop: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n borderBottom: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n }}\n >\n <Title\n text={`the error stack of [${loader.loader}] ${loader.isPitch ? 'pitch' : ''}`}\n />\n </div>\n <div style={{ height: '90%' }}>\n <CodeViewer code={loader.errors[0].message} lang=\"javascript\" />\n </div>\n </Col>\n ) : (\n <Col span={24} style={{ height: '53%', minHeight: 400 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: Size.BasePadding,\n borderBottom: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n }}\n >\n <Title\n text={\n <>\n {`the result of [${loader.loader}] ${loader.isPitch ? 'pitch' : ''}`}\n {!loader.isPitch && (\n <span style={{ fontWeight: 400 }}>\n (\n <InputIcon\n style={{\n verticalAlign: 'middle',\n margin: '0 2px',\n }}\n />\n Input ⟷\n <OutputIcon\n style={{\n verticalAlign: 'middle',\n position: 'relative',\n top: -2,\n }}\n />\n Output)\n </span>\n )}\n </>\n }\n />\n <div style={{ flex: 1 }} />\n </div>\n {loader.isPitch ? (\n loaderResult ? (\n <div style={{ height: '90%' }}>\n <CodeViewer\n isEmbed\n code={loaderResult}\n filePath={resource.path}\n />\n </div>\n ) : (\n <Empty\n description={\n 'No loader result. If you use the Brief Mode, there will not have loader results.'\n }\n />\n )\n ) : (\n <div style={{ minHeight: '700px' }}>\n <div style={{ height: '40rem', overflow: 'hidden' }}>\n {!loaderResult && !before ? (\n <Empty\n description={\n 'No loader result. If you use the Brief Mode, there will not have loader results.'\n }\n />\n ) : (\n <DiffViewer\n isEmbed\n original={before}\n modified={loaderResult || ''}\n originalFilePath={resource.path}\n modifiedFilePath={resource.path}\n />\n )}\n </div>\n </div>\n )}\n </Col>\n )}\n </div>\n );\n};\n\nexport const LoaderExecutions = ({\n data,\n cwd,\n index,\n}: PropsWithChildren<LoaderExecutionsProps>): JSX.Element => {\n const { loaders, resource } = data;\n const [currentIndex, setCurrentIndex] = useState(index || 0);\n const { theme } = useTheme();\n const isLight = theme === 'light';\n const loader = loaders[currentIndex];\n const leftSpan = 5;\n const [activeKey, setActiveKey] = useState('loaderDetails');\n const onChange = useCallback((key: string) => {\n setActiveKey(key);\n }, []);\n\n return (\n <Row className={styles.executions} style={{ height: '100%' }}>\n <Col\n span={leftSpan}\n style={{\n borderRight: isLight ? `1px solid #f0f0f0` : undefined,\n padding: Size.BasePadding,\n }}\n >\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n <Title text=\"Executions\" />\n <Timeline mode=\"left\" style={{ marginTop: Size.BasePadding }}>\n {loaders.map((e, i, arr) => {\n const { loader, isPitch } = e;\n const costs = formatCosts(e.costs);\n return (\n <Timeline.Item\n dot={\n isPitch ? (\n <Tag style={{ marginLeft: 1, fontWeight: 500 }}>\n pitch\n </Tag>\n ) : (\n <ClockCircleTwoTone />\n )\n }\n style={{ paddingBottom: 10, textAlign: 'center' }}\n key={i}\n >\n <Row align=\"middle\" justify=\"space-between\" gutter={[0, 10]}>\n <Col span={24} className={styles.timeline}>\n <Tooltip title={loader} trigger=\"hover\">\n <div\n className={`${styles.box} ${currentIndex === i ? styles.selected : ''}`}\n onClick={() => {\n setCurrentIndex(i);\n }}\n style={{ textAlign: 'left' }}\n >\n <div>\n <Typography.Text style={{ color: '#000' }}>\n {costs.match(/[0-9]*\\.?[0-9]+/g)?.[0]}\n </Typography.Text>\n {` `}\n <Typography.Text\n style={{ color: 'rgba(0,0,0,0.45)' }}\n >\n {costs.match(/[a-zA-Z]+/g)}\n </Typography.Text>\n </div>\n <Typography.Text\n style={{ color: 'rgba(0,0,0,0.65)' }}\n className={styles.loader}\n >\n {loader}\n </Typography.Text>\n </div>\n </Tooltip>\n </Col>\n </Row>\n {i === arr.length - 1 ? null : (\n <div style={{ paddingTop: 10 }}>\n <StepIcon />\n </div>\n )}\n </Timeline.Item>\n );\n })}\n </Timeline>\n </Space>\n </Col>\n <Col span={24 - leftSpan} style={{ height: '100%' }}>\n <Tabs\n type=\"card\"\n defaultActiveKey=\"loaderDetails\"\n activeKey={activeKey}\n items={[\n {\n label: 'Loader Props',\n key: 'loaderProps',\n children: (\n <LoaderPropsItem\n loader={loader}\n resource={resource}\n cwd={cwd}\n />\n ),\n },\n {\n label: 'Loader Details',\n key: 'loaderDetails',\n children:\n activeKey === 'loaderDetails' ? (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetLoaderFileInputAndOutput}\n body={{\n file: resource.path,\n loader: loader.loader,\n loaderIndex: loader.loaderIndex,\n }}\n showSkeleton={false}\n >\n {(codeData) => (\n <LoaderDetailsContent\n loader={loader}\n resource={resource}\n isLight={isLight}\n codeData={codeData}\n />\n )}\n </ServerAPIProvider>\n ) : null,\n },\n ]}\n onChange={onChange}\n />\n </Col>\n </Row>\n );\n};\n"],"names":["LoaderPropsItem","loader","resource","cwd","Card","Tag","ClockCircleTwoTone","dayjs","Space","Typography","List","beautifyPath","CodeOpener","formatCosts","Divider","JSON","LoaderDetailsContent","isLight","codeData","hasError","before","loaderResult","Col","Size","Title","CodeViewer","InputIcon","OutputIcon","Empty","DiffViewer","LoaderExecutions","data","index","loaders","currentIndex","setCurrentIndex","useState","theme","useTheme","leftSpan","activeKey","setActiveKey","onChange","useCallback","key","Row","styles","undefined","Timeline","e","i","arr","isPitch","costs","Tooltip","StepIcon","Tabs","ServerAPIProvider","SDK"],"mappings":"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"}
1
+ {"version":3,"file":"components/Loader/executions.mjs","sources":["../../../src/components/Loader/executions.tsx"],"sourcesContent":["import { ClockCircleTwoTone } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Col,\n Divider,\n Empty,\n List,\n Row,\n Space,\n Tabs,\n Tag,\n Timeline,\n Tooltip,\n Typography,\n} from 'antd';\nimport dayjs from 'dayjs';\nimport { PropsWithChildren, useCallback, useState } from 'react';\nimport InputIcon from 'src/common/svg/loader/input.svg';\nimport OutputIcon from 'src/common/svg/loader/output.svg';\nimport StepIcon from 'src/common/svg/loader/step.svg';\nimport { Size } from '../../constants';\nimport { beautifyPath, formatCosts, useTheme } from '../../utils';\nimport { CodeViewer, DiffViewer } from '../base';\nimport { Card } from '../Card';\nimport { CodeOpener } from '../Opener';\nimport { Title } from '../Title';\nimport { ServerAPIProvider } from '../Manifest';\nimport styles from './Analysis/style.module.scss';\n\ninterface LoaderExecutionsProps {\n cwd: string;\n data: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderFileDetails>;\n index?: number;\n}\n\nconst LoaderPropsItem = ({\n loader,\n resource,\n cwd,\n}: {\n loader: Omit<SDK.LoaderTransformData, 'input' | 'result'> & {\n costs: number;\n };\n resource: SDK.ResourceData;\n cwd: string;\n}): React.JSX.Element => {\n return (\n <Card\n title={'Loader Details'}\n style={{ border: 'none' }}\n extra={\n <Tag icon={<ClockCircleTwoTone />} color=\"default\">\n {dayjs(loader.startAt).format('YYYY-MM-DD HH:mm:ss')}\n </Tag>\n }\n >\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n {loader.isPitch ? <Typography.Text code>pitch</Typography.Text> : null}\n <List size=\"large\" bordered>\n <List.Item>\n <Typography.Text strong>{'File Path'}</Typography.Text>\n <div>{beautifyPath(resource.path, cwd)}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Resource Path'}</Typography.Text>\n <CodeOpener cwd={cwd} url={resource.path} loc=\"\" disabled />\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Resource Query'}</Typography.Text>\n <div>{resource.queryRaw || '-'}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Duration'}</Typography.Text>\n <div>{formatCosts(loader.costs)}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader'}</Typography.Text>\n <div>\n <Typography.Text code>{loader.loader}</Typography.Text>\n </div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader Index'}</Typography.Text>\n <div>{`${loader.loaderIndex}`}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader Path'}</Typography.Text>\n <CodeOpener cwd={cwd} url={loader.path} loc=\"\" disabled />\n </List.Item>\n <List.Item>\n <div style={{ width: 180 }}>\n <Typography.Text strong>{'Options'}</Typography.Text>\n </div>\n <Divider type=\"vertical\" />\n <Typography.Paragraph\n ellipsis={{\n rows: 2,\n expandable: true,\n symbol: 'more',\n }}\n copyable\n >\n {JSON.stringify(loader.options || '-')}\n </Typography.Paragraph>\n </List.Item>\n </List>\n </Space>\n </Card>\n );\n};\n\n// Component to render Loader Details content with lazy-loaded code\nconst LoaderDetailsContent = ({\n loader,\n resource,\n isLight,\n codeData,\n}: {\n loader: Omit<SDK.LoaderTransformData, 'input' | 'result'> & { costs: number };\n resource: SDK.ResourceData;\n isLight: boolean;\n codeData: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderFileInputAndOutput>;\n}): React.JSX.Element => {\n const hasError = loader.errors && loader.errors.length;\n const before = codeData?.input || '';\n const loaderResult = codeData?.output || '';\n\n return (\n <div style={{ height: '100%' }}>\n {hasError ? (\n <Col span={24} style={{ height: '53%', minHeight: 400 }}>\n <div\n style={{\n padding: Size.BasePadding,\n borderTop: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n borderBottom: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n }}\n >\n <Title\n text={`the error stack of [${loader.loader}] ${loader.isPitch ? 'pitch' : ''}`}\n />\n </div>\n <div style={{ height: '90%' }}>\n <CodeViewer code={loader.errors[0].message} lang=\"javascript\" />\n </div>\n </Col>\n ) : (\n <Col span={24} style={{ height: '53%', minHeight: 400 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: Size.BasePadding,\n borderBottom: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n }}\n >\n <Title\n text={\n <>\n {`the result of [${loader.loader}] ${loader.isPitch ? 'pitch' : ''}`}\n {!loader.isPitch && (\n <span style={{ fontWeight: 400 }}>\n (\n <InputIcon\n style={{\n verticalAlign: 'middle',\n margin: '0 2px',\n }}\n />\n Input ⟷\n <OutputIcon\n style={{\n verticalAlign: 'middle',\n position: 'relative',\n top: -2,\n }}\n />\n Output)\n </span>\n )}\n </>\n }\n />\n <div style={{ flex: 1 }} />\n </div>\n {loader.isPitch ? (\n loaderResult ? (\n <div style={{ height: '90%' }}>\n <CodeViewer\n isEmbed\n code={loaderResult}\n filePath={resource.path}\n />\n </div>\n ) : (\n <Empty\n description={\n 'No loader result. If you use the Brief Mode, there will not have loader results.'\n }\n />\n )\n ) : (\n <div style={{ minHeight: '700px' }}>\n <div style={{ height: '40rem', overflow: 'hidden' }}>\n {!loaderResult && !before ? (\n <Empty\n description={\n 'No loader result. If you use the Brief Mode, there will not have loader results.'\n }\n />\n ) : (\n <DiffViewer\n isEmbed\n original={before}\n modified={loaderResult || ''}\n originalFilePath={resource.path}\n modifiedFilePath={resource.path}\n />\n )}\n </div>\n </div>\n )}\n </Col>\n )}\n </div>\n );\n};\n\nexport const LoaderExecutions = ({\n data,\n cwd,\n index,\n}: PropsWithChildren<LoaderExecutionsProps>): React.JSX.Element => {\n const { loaders, resource } = data;\n const [currentIndex, setCurrentIndex] = useState(index || 0);\n const { theme } = useTheme();\n const isLight = theme === 'light';\n const loader = loaders[currentIndex];\n const leftSpan = 5;\n const [activeKey, setActiveKey] = useState('loaderDetails');\n const onChange = useCallback((key: string) => {\n setActiveKey(key);\n }, []);\n\n return (\n <Row className={styles.executions} style={{ height: '100%' }}>\n <Col\n span={leftSpan}\n style={{\n borderRight: isLight ? `1px solid #f0f0f0` : undefined,\n padding: Size.BasePadding,\n }}\n >\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n <Title text=\"Executions\" />\n <Timeline mode=\"left\" style={{ marginTop: Size.BasePadding }}>\n {loaders.map((e, i, arr) => {\n const { loader, isPitch } = e;\n const costs = formatCosts(e.costs);\n return (\n <Timeline.Item\n dot={\n isPitch ? (\n <Tag style={{ marginLeft: 1, fontWeight: 500 }}>\n pitch\n </Tag>\n ) : (\n <ClockCircleTwoTone />\n )\n }\n style={{ paddingBottom: 10, textAlign: 'center' }}\n key={i}\n >\n <Row align=\"middle\" justify=\"space-between\" gutter={[0, 10]}>\n <Col span={24} className={styles.timeline}>\n <Tooltip title={loader} trigger=\"hover\">\n <div\n className={`${styles.box} ${currentIndex === i ? styles.selected : ''}`}\n onClick={() => {\n setCurrentIndex(i);\n }}\n style={{ textAlign: 'left' }}\n >\n <div>\n <Typography.Text style={{ color: '#000' }}>\n {costs.match(/[0-9]*\\.?[0-9]+/g)?.[0]}\n </Typography.Text>\n {` `}\n <Typography.Text\n style={{ color: 'rgba(0,0,0,0.45)' }}\n >\n {costs.match(/[a-zA-Z]+/g)}\n </Typography.Text>\n </div>\n <Typography.Text\n style={{ color: 'rgba(0,0,0,0.65)' }}\n className={styles.loader}\n >\n {loader}\n </Typography.Text>\n </div>\n </Tooltip>\n </Col>\n </Row>\n {i === arr.length - 1 ? null : (\n <div style={{ paddingTop: 10 }}>\n <StepIcon />\n </div>\n )}\n </Timeline.Item>\n );\n })}\n </Timeline>\n </Space>\n </Col>\n <Col span={24 - leftSpan} style={{ height: '100%' }}>\n <Tabs\n type=\"card\"\n defaultActiveKey=\"loaderDetails\"\n activeKey={activeKey}\n items={[\n {\n label: 'Loader Props',\n key: 'loaderProps',\n children: (\n <LoaderPropsItem\n loader={loader}\n resource={resource}\n cwd={cwd}\n />\n ),\n },\n {\n label: 'Loader Details',\n key: 'loaderDetails',\n children:\n activeKey === 'loaderDetails' ? (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetLoaderFileInputAndOutput}\n body={{\n file: resource.path,\n loader: loader.loader,\n loaderIndex: loader.loaderIndex,\n }}\n showSkeleton={false}\n >\n {(codeData) => (\n <LoaderDetailsContent\n loader={loader}\n resource={resource}\n isLight={isLight}\n codeData={codeData}\n />\n )}\n </ServerAPIProvider>\n ) : null,\n },\n ]}\n onChange={onChange}\n />\n </Col>\n </Row>\n );\n};\n"],"names":["LoaderPropsItem","loader","resource","cwd","Card","Tag","ClockCircleTwoTone","dayjs","Space","Typography","List","beautifyPath","CodeOpener","formatCosts","Divider","JSON","LoaderDetailsContent","isLight","codeData","hasError","before","loaderResult","Col","Size","Title","CodeViewer","InputIcon","OutputIcon","Empty","DiffViewer","LoaderExecutions","data","index","loaders","currentIndex","setCurrentIndex","useState","theme","useTheme","leftSpan","activeKey","setActiveKey","onChange","useCallback","key","Row","styles","undefined","Timeline","e","i","arr","isPitch","costs","Tooltip","StepIcon","Tabs","ServerAPIProvider","SDK"],"mappings":"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"}
@@ -8,7 +8,7 @@ export type InferServerAPIBody<T> = SDK.ServerAPI.InferRequestBodyType<T> extend
8
8
  type ServerAPIProviderProps<T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends> = {
9
9
  manifestLoader?: () => Promise<Manifest.RsdoctorManifestWithShardingFiles>;
10
10
  api: T;
11
- children: (response: SDK.ServerAPI.InferResponseType<T>) => JSX.Element;
11
+ children: (response: SDK.ServerAPI.InferResponseType<T>) => React.JSX.Element;
12
12
  fallbackComponent?: React.FC;
13
13
  showSkeleton?: boolean;
14
14
  } & InferServerAPIBody<T>;
@@ -23,7 +23,7 @@ type ServerAPIProviderProps<T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExten
23
23
  * }}
24
24
  * </ServerAPIProvider>
25
25
  */
26
- export declare const ServerAPIProvider: <T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends>(props: ServerAPIProviderProps<T>) => JSX.Element | null;
26
+ export declare const ServerAPIProvider: <T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends>(props: ServerAPIProviderProps<T>) => React.JSX.Element | null;
27
27
  export declare function withServerAPI<T, P extends keyof T, A extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends>({ Component, api, responsePropName, body: bodyInRoot, fallbackComponent, showSkeleton, }: {
28
28
  Component: React.FC<T>;
29
29
  api: A;
@@ -1 +1 @@
1
- {"version":3,"file":"components/Manifest/api.mjs","sources":["../../../src/components/Manifest/api.tsx"],"sourcesContent":["import { Constants, Manifest, SDK } from '@rsdoctor/types';\nimport { Skeleton, Spin } from 'antd';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { isEqual } from 'es-toolkit/compat';\nimport { fetchManifest, useDataLoader } from '../../utils';\nimport { ComponentState } from '../../constants';\nimport { FailedStatus } from '../Status';\nimport { BaseDataLoader } from '../../utils/data/base';\nimport { Lodash } from '@rsdoctor/utils/common';\nimport { Client } from '@rsdoctor/types';\n\n/**\n * Checks if the current route is uploader route\n */\nfunction isUploaderRoute(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n return window.location.hash.includes(Client.RsdoctorClientRoutes.Uploader);\n}\n\nexport type InferServerAPIBody<T> =\n SDK.ServerAPI.InferRequestBodyType<T> extends void\n ? {\n // use `any` to avoid ts check when need not to define the body in this component.\n body?: any;\n }\n : {\n body: SDK.ServerAPI.InferRequestBodyType<T>;\n };\n\ntype ServerAPIProviderProps<\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n> = {\n manifestLoader?: () => Promise<Manifest.RsdoctorManifestWithShardingFiles>;\n api: T;\n children: (response: SDK.ServerAPI.InferResponseType<T>) => JSX.Element;\n fallbackComponent?: React.FC;\n showSkeleton?: boolean;\n} & InferServerAPIBody<T>;\n\n/**\n * this component will request server api to the sdk of Rsdoctor in local development.\n * otherwise it will fallback to load full manifest for the data.\n *\n * @example usage\n * <ServerAPIProvider {...props}>\n * {(response) => {\n * <Component {...}></Component>\n * }}\n * </ServerAPIProvider>\n */\nexport const ServerAPIProvider = <\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n>(\n props: ServerAPIProviderProps<T>,\n): JSX.Element | null => {\n const {\n manifestLoader = fetchManifest,\n api,\n children,\n // default value of \"body\" must be \"null\" to avoid the response type not match when the socket received message.\n body = null,\n showSkeleton = true,\n fallbackComponent,\n } = props;\n let promise: Promise<Manifest.RsdoctorManifestWithShardingFiles>;\n\n const [manifest, setManifest] =\n useState<Manifest.RsdoctorManifestWithShardingFiles>();\n const [state, setState] = useState(ComponentState.Pending);\n const [res, setRes] = useState({} as SDK.ServerAPI.InferResponseType<T>);\n\n const { loader } = useDataLoader(manifest);\n\n function init(loader: BaseDataLoader | void) {\n if (window[Constants.WINDOW_RSDOCTOR_TAG]) {\n executeLoader(loader);\n } else {\n promise = manifestLoader();\n ensureManifest(promise).then(() => {\n executeLoader(loader);\n });\n }\n }\n\n const update = useCallback(\n ({ req, res: response }: SDK.ServerAPI.SocketResponseType<T>) => {\n if (req.api === api) {\n // body is equal.\n // both two body are null or undefined.\n if (\n isEqual(req.body, body) ||\n (Lodash.isNil(req.body) && Lodash.isNil(body))\n ) {\n if (!isEqual(res, response)) {\n setRes(response);\n }\n }\n }\n // make sure update successful.\n setState(ComponentState.Success);\n },\n [res, api, body],\n );\n\n useEffect(() => {\n init(loader);\n }, [loader, api, body]);\n\n useEffect(() => {\n if (!loader) return;\n // add update event listener\n loader.onDataUpdate(api, update);\n return () => {\n // remove update event when the component unmount.\n loader.removeOnDataUpdate(api, update);\n };\n }, [loader, api, body]);\n\n function ensureManifest(\n pro: Promise<Manifest.RsdoctorManifestWithShardingFiles>,\n ) {\n return pro\n .then((manifest) => {\n setManifest(manifest);\n })\n .catch((err) => {\n // If route is uploader, set empty manifest and continue instead of failing\n if (isUploaderRoute()) {\n console.warn(\n '[ServerAPIProvider] Failed to load manifest for uploader route, continuing with empty manifest:',\n err,\n );\n setState(ComponentState.Success);\n return;\n }\n setState(ComponentState.Fail);\n throw err;\n });\n }\n\n function executeLoader(loader: BaseDataLoader | void) {\n if (!loader) {\n return;\n }\n\n const exts = Object.values(SDK.ServerAPI.APIExtends);\n\n // extends api will wait for update only.\n if (exts.includes(api as SDK.ServerAPI.APIExtends)) {\n // extends api need to handle \"undefined\" response inside component.\n setState(ComponentState.Success);\n return;\n }\n\n loader\n .loadAPI(api as SDK.ServerAPI.API, body)\n .then((e) => {\n // if (process.env.NODE_ENV === 'development') {\n // console.log('[ServerAPIProvider] props: ', e, api, loader);\n // }\n // maybe the data not prepared.\n if (Lodash.isNil(e)) {\n return;\n }\n setRes(e as SDK.ServerAPI.InferResponseType<T>);\n setState(ComponentState.Success);\n })\n .catch((err) => {\n console.error(err);\n setState(ComponentState.Fail);\n });\n }\n\n if (state === ComponentState.Pending) {\n return showSkeleton ? <Skeleton active /> : null;\n }\n\n if (state === ComponentState.Fail) {\n if (fallbackComponent)\n return fallbackComponent as unknown as React.ReactElement;\n\n return (\n <FailedStatus\n retry={() => {\n setState(ComponentState.Pending);\n promise = manifestLoader();\n init();\n }}\n />\n );\n }\n\n if (state === ComponentState.Updating) {\n return <Spin spinning>{children(res)}</Spin>;\n }\n\n return children(res);\n};\n\nexport function withServerAPI<\n T,\n P extends keyof T,\n A extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n>({\n Component,\n api,\n responsePropName,\n body: bodyInRoot,\n fallbackComponent,\n showSkeleton,\n}: {\n Component: React.FC<T>;\n api: A;\n responsePropName: P;\n fallbackComponent?: React.FC;\n showSkeleton?: boolean;\n} & Partial<Partial<InferServerAPIBody<A>>>): React.FC<\n Omit<T, P> & Partial<InferServerAPIBody<A>>\n> {\n return function _(props) {\n const { body = bodyInRoot, ...rest } = props;\n\n return (\n // @ts-ignore\n <ServerAPIProvider\n api={api}\n body={body}\n showSkeleton={showSkeleton}\n fallbackComponent={fallbackComponent}\n >\n {(res) => {\n const _props = {\n ...rest,\n [responsePropName]: res,\n } as T & JSX.IntrinsicAttributes;\n\n return <Component {..._props} />;\n }}\n </ServerAPIProvider>\n );\n };\n}\n"],"names":["isUploaderRoute","window","Client","ServerAPIProvider","props","manifestLoader","fetchManifest","api","children","body","showSkeleton","fallbackComponent","promise","manifest","setManifest","useState","state","setState","ComponentState","res","setRes","loader","useDataLoader","init","Constants","executeLoader","ensureManifest","update","useCallback","req","response","isEqual","Lodash","useEffect","pro","err","console","exts","Object","SDK","e","Skeleton","FailedStatus","Spin","withServerAPI","Component","responsePropName","bodyInRoot","rest","_props"],"mappings":"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"}
1
+ {"version":3,"file":"components/Manifest/api.mjs","sources":["../../../src/components/Manifest/api.tsx"],"sourcesContent":["import { Constants, Manifest, SDK } from '@rsdoctor/types';\nimport { Skeleton, Spin } from 'antd';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { isEqual } from 'es-toolkit/compat';\nimport { fetchManifest, useDataLoader } from '../../utils';\nimport { ComponentState } from '../../constants';\nimport { FailedStatus } from '../Status';\nimport { BaseDataLoader } from '../../utils/data/base';\nimport { Lodash } from '@rsdoctor/utils/common';\nimport { Client } from '@rsdoctor/types';\n\n/**\n * Checks if the current route is uploader route\n */\nfunction isUploaderRoute(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n return window.location.hash.includes(Client.RsdoctorClientRoutes.Uploader);\n}\n\nexport type InferServerAPIBody<T> =\n SDK.ServerAPI.InferRequestBodyType<T> extends void\n ? {\n // use `any` to avoid ts check when need not to define the body in this component.\n body?: any;\n }\n : {\n body: SDK.ServerAPI.InferRequestBodyType<T>;\n };\n\ntype ServerAPIProviderProps<\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n> = {\n manifestLoader?: () => Promise<Manifest.RsdoctorManifestWithShardingFiles>;\n api: T;\n children: (response: SDK.ServerAPI.InferResponseType<T>) => React.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): React.JSX.Element | null => {\n const {\n manifestLoader = fetchManifest,\n api,\n children,\n // default value of \"body\" must be \"null\" to avoid the response type not match when the socket received message.\n body = null,\n showSkeleton = true,\n fallbackComponent,\n } = props;\n let promise: Promise<Manifest.RsdoctorManifestWithShardingFiles>;\n\n const [manifest, setManifest] =\n useState<Manifest.RsdoctorManifestWithShardingFiles>();\n const [state, setState] = useState(ComponentState.Pending);\n const [res, setRes] = useState({} as SDK.ServerAPI.InferResponseType<T>);\n\n const { loader } = useDataLoader(manifest);\n\n function init(loader: BaseDataLoader | void) {\n if (window[Constants.WINDOW_RSDOCTOR_TAG]) {\n executeLoader(loader);\n } else {\n promise = manifestLoader();\n ensureManifest(promise).then(() => {\n executeLoader(loader);\n });\n }\n }\n\n const update = useCallback(\n ({ req, res: response }: SDK.ServerAPI.SocketResponseType<T>) => {\n if (req.api === api) {\n // body is equal.\n // both two body are null or undefined.\n if (\n isEqual(req.body, body) ||\n (Lodash.isNil(req.body) && Lodash.isNil(body))\n ) {\n if (!isEqual(res, response)) {\n setRes(response);\n }\n }\n }\n // make sure update successful.\n setState(ComponentState.Success);\n },\n [res, api, body],\n );\n\n useEffect(() => {\n init(loader);\n }, [loader, api, body]);\n\n useEffect(() => {\n if (!loader) return;\n // add update event listener\n loader.onDataUpdate(api, update);\n return () => {\n // remove update event when the component unmount.\n loader.removeOnDataUpdate(api, update);\n };\n }, [loader, api, body]);\n\n function ensureManifest(\n pro: Promise<Manifest.RsdoctorManifestWithShardingFiles>,\n ) {\n return pro\n .then((manifest) => {\n setManifest(manifest);\n })\n .catch((err) => {\n // If route is uploader, set empty manifest and continue instead of failing\n if (isUploaderRoute()) {\n console.warn(\n '[ServerAPIProvider] Failed to load manifest for uploader route, continuing with empty manifest:',\n err,\n );\n setState(ComponentState.Success);\n return;\n }\n setState(ComponentState.Fail);\n throw err;\n });\n }\n\n function executeLoader(loader: BaseDataLoader | void) {\n if (!loader) {\n return;\n }\n\n const exts = Object.values(SDK.ServerAPI.APIExtends);\n\n // extends api will wait for update only.\n if (exts.includes(api as SDK.ServerAPI.APIExtends)) {\n // extends api need to handle \"undefined\" response inside component.\n setState(ComponentState.Success);\n return;\n }\n\n loader\n .loadAPI(api as SDK.ServerAPI.API, body)\n .then((e) => {\n // if (process.env.NODE_ENV === 'development') {\n // console.log('[ServerAPIProvider] props: ', e, api, loader);\n // }\n // maybe the data not prepared.\n if (Lodash.isNil(e)) {\n return;\n }\n setRes(e as SDK.ServerAPI.InferResponseType<T>);\n setState(ComponentState.Success);\n })\n .catch((err) => {\n console.error(err);\n setState(ComponentState.Fail);\n });\n }\n\n if (state === ComponentState.Pending) {\n return showSkeleton ? <Skeleton active /> : null;\n }\n\n if (state === ComponentState.Fail) {\n if (fallbackComponent)\n return fallbackComponent as unknown as React.ReactElement;\n\n return (\n <FailedStatus\n retry={() => {\n setState(ComponentState.Pending);\n promise = manifestLoader();\n init();\n }}\n />\n );\n }\n\n if (state === ComponentState.Updating) {\n return <Spin spinning>{children(res)}</Spin>;\n }\n\n return children(res);\n};\n\nexport function withServerAPI<\n T,\n P extends keyof T,\n A extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n>({\n Component,\n api,\n responsePropName,\n body: bodyInRoot,\n fallbackComponent,\n showSkeleton,\n}: {\n Component: React.FC<T>;\n api: A;\n responsePropName: P;\n fallbackComponent?: React.FC;\n showSkeleton?: boolean;\n} & Partial<Partial<InferServerAPIBody<A>>>): React.FC<\n Omit<T, P> & Partial<InferServerAPIBody<A>>\n> {\n return function _(props) {\n const { body = bodyInRoot, ...rest } = props;\n\n return (\n // @ts-ignore\n <ServerAPIProvider\n api={api}\n body={body}\n showSkeleton={showSkeleton}\n fallbackComponent={fallbackComponent}\n >\n {(res) => {\n const _props = {\n ...rest,\n [responsePropName]: res,\n } as T & React.JSX.IntrinsicAttributes;\n\n return <Component {..._props} />;\n }}\n </ServerAPIProvider>\n );\n };\n}\n"],"names":["isUploaderRoute","window","Client","ServerAPIProvider","props","manifestLoader","fetchManifest","api","children","body","showSkeleton","fallbackComponent","promise","manifest","setManifest","useState","state","setState","ComponentState","res","setRes","loader","useDataLoader","init","Constants","executeLoader","ensureManifest","update","useCallback","req","response","isEqual","Lodash","useEffect","pro","err","console","exts","Object","SDK","e","Skeleton","FailedStatus","Spin","withServerAPI","Component","responsePropName","bodyInRoot","rest","_props"],"mappings":"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"}
@@ -16,5 +16,5 @@ interface CodeOpenerProps {
16
16
  disabled?: boolean;
17
17
  code?: boolean;
18
18
  }
19
- export declare const CodeOpener: ({ cwd, url, loc, windowId, label, disabled, code, }: PropsWithChildren<CodeOpenerProps>) => JSX.Element | null;
19
+ export declare const CodeOpener: ({ cwd, url, loc, windowId, label, disabled, code, }: PropsWithChildren<CodeOpenerProps>) => React.JSX.Element | null;
20
20
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"components/Opener/code.mjs","sources":["../../../src/components/Opener/code.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\nimport { Typography } from 'antd';\nimport path from 'path';\nimport { VSCode, openVSCode } from './ide';\nimport { getShortPath } from 'src/utils';\n\ninterface CodeOpenerProps {\n windowId?: number;\n /**\n * @example /foo/src/pages/home/index.ts + 100 modules\n * @example /foo/src/pages/b/index.ts\n */\n url: string;\n /**\n * @example 1:0-10\n * @example 1:1\n */\n loc?: string;\n cwd: string;\n label?: string;\n disabled?: boolean;\n code?: boolean;\n}\n\nfunction parseUrl(url: string) {\n const strs = url.split(' ');\n let res = '';\n if (strs.length === 1) {\n [res] = strs;\n } else {\n [res] = strs.filter((e) => path.isAbsolute(e) || e.startsWith('./'));\n }\n\n return res || url;\n}\n\nfunction parseLoc(loc?: string) {\n if (!loc) return { line: 1, column: 1 };\n\n const [line, col = ''] = loc.split(':');\n const [start = 1, end] = col.split('-');\n\n return {\n line,\n columnStart: start,\n columnEnd: end || start,\n };\n}\n\nconst defaultWindowId = +Date.now().toString().slice(-4) + 1000;\n\nexport const CodeOpener = ({\n cwd,\n url,\n loc,\n windowId = defaultWindowId,\n label,\n disabled,\n code = false,\n}: PropsWithChildren<CodeOpenerProps>): JSX.Element | null => {\n const file = path.resolve(cwd, parseUrl(url));\n\n const { line, columnStart } = parseLoc(loc);\n\n return (\n <span style={{ wordBreak: 'break-all' }}>\n <Typography.Text\n copyable={{\n text: file,\n }}\n >\n <Typography.Text\n code={code}\n onClick={() => {\n if (disabled) return;\n openVSCode({ file, line, column: columnStart, windowId });\n }}\n style={{ cursor: disabled ? 'revert' : 'pointer' }}\n >\n {label || getShortPath(url)}\n {loc ? `:${loc}` : ''}\n </Typography.Text>\n </Typography.Text>\n {process.env.NODE_ENV === 'development' ? (\n <VSCode\n file={file}\n line={line}\n column={columnStart}\n windowId={windowId}\n style={{ marginLeft: 3 }}\n />\n ) : (\n <div style={{ display: 'inline-block' }} />\n )}\n {/* TODO implement open cloud ide or codebase by git url + branch + relative filepath in production */}\n </span>\n );\n};\n"],"names":["parseUrl","url","strs","res","e","path","parseLoc","loc","line","col","start","end","defaultWindowId","Date","CodeOpener","cwd","windowId","label","disabled","code","file","columnStart","Typography","openVSCode","getShortPath","process","VSCode"],"mappings":";;;;;AAwBA,SAASA,SAASC,GAAW;IAC3B,MAAMC,OAAOD,IAAI,KAAK,CAAC;IACvB,IAAIE,MAAM;IACV,IAAID,AAAgB,MAAhBA,KAAK,MAAM,EACb,CAACC,IAAI,GAAGD;SAER,CAACC,IAAI,GAAGD,KAAK,MAAM,CAAC,CAACE,IAAMC,KAAK,UAAU,CAACD,MAAMA,EAAE,UAAU,CAAC;IAGhE,OAAOD,OAAOF;AAChB;AAEA,SAASK,SAASC,GAAY;IAC5B,IAAI,CAACA,KAAK,OAAO;QAAE,MAAM;QAAG,QAAQ;IAAE;IAEtC,MAAM,CAACC,MAAMC,MAAM,EAAE,CAAC,GAAGF,IAAI,KAAK,CAAC;IACnC,MAAM,CAACG,QAAQ,CAAC,EAAEC,IAAI,GAAGF,IAAI,KAAK,CAAC;IAEnC,OAAO;QACLD;QACA,aAAaE;QACb,WAAWC,OAAOD;IACpB;AACF;AAEA,MAAME,kBAAkB,CAACC,KAAK,GAAG,GAAG,QAAQ,GAAG,KAAK,CAAC,MAAM;AAEpD,MAAMC,aAAa,CAAC,EACzBC,GAAG,EACHd,GAAG,EACHM,GAAG,EACHS,WAAWJ,eAAe,EAC1BK,KAAK,EACLC,QAAQ,EACRC,OAAO,KAAK,EACuB;IACnC,MAAMC,OAAOf,KAAK,OAAO,CAACU,KAAKf,SAASC;IAExC,MAAM,EAAEO,IAAI,EAAEa,WAAW,EAAE,GAAGf,SAASC;IAEvC,OAAO,WAAP,GACE,KAAC;QAAK,OAAO;YAAE,WAAW;QAAY;;0BACpC,IAACe,WAAW,IAAI;gBACd,UAAU;oBACR,MAAMF;gBACR;0BAEA,mBAACE,WAAW,IAAI;oBACd,MAAMH;oBACN,SAAS;wBACP,IAAID,UAAU;wBACdK,WAAW;4BAAEH;4BAAMZ;4BAAM,QAAQa;4BAAaL;wBAAS;oBACzD;oBACA,OAAO;wBAAE,QAAQE,WAAW,WAAW;oBAAU;;wBAEhDD,SAASO,aAAavB;wBACtBM,MAAM,CAAC,CAAC,EAAEA,KAAK,GAAG;;;;YAGG,kBAAzBkB,QAAQ,GAAG,CAAC,QAAQ,GAAqB,WAAhB,GACxB,IAACC,QAAMA;gBACL,MAAMN;gBACN,MAAMZ;gBACN,QAAQa;gBACR,UAAUL;gBACV,OAAO;oBAAE,YAAY;gBAAE;+BAGzB,IAAC;gBAAI,OAAO;oBAAE,SAAS;gBAAe;;;;AAK9C"}
1
+ {"version":3,"file":"components/Opener/code.mjs","sources":["../../../src/components/Opener/code.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\nimport { Typography } from 'antd';\nimport path from 'path';\nimport { VSCode, openVSCode } from './ide';\nimport { getShortPath } from 'src/utils';\n\ninterface CodeOpenerProps {\n windowId?: number;\n /**\n * @example /foo/src/pages/home/index.ts + 100 modules\n * @example /foo/src/pages/b/index.ts\n */\n url: string;\n /**\n * @example 1:0-10\n * @example 1:1\n */\n loc?: string;\n cwd: string;\n label?: string;\n disabled?: boolean;\n code?: boolean;\n}\n\nfunction parseUrl(url: string) {\n const strs = url.split(' ');\n let res = '';\n if (strs.length === 1) {\n [res] = strs;\n } else {\n [res] = strs.filter((e) => path.isAbsolute(e) || e.startsWith('./'));\n }\n\n return res || url;\n}\n\nfunction parseLoc(loc?: string) {\n if (!loc) return { line: 1, column: 1 };\n\n const [line, col = ''] = loc.split(':');\n const [start = 1, end] = col.split('-');\n\n return {\n line,\n columnStart: start,\n columnEnd: end || start,\n };\n}\n\nconst defaultWindowId = +Date.now().toString().slice(-4) + 1000;\n\nexport const CodeOpener = ({\n cwd,\n url,\n loc,\n windowId = defaultWindowId,\n label,\n disabled,\n code = false,\n}: PropsWithChildren<CodeOpenerProps>): React.JSX.Element | null => {\n const file = path.resolve(cwd, parseUrl(url));\n\n const { line, columnStart } = parseLoc(loc);\n\n return (\n <span style={{ wordBreak: 'break-all' }}>\n <Typography.Text\n copyable={{\n text: file,\n }}\n >\n <Typography.Text\n code={code}\n onClick={() => {\n if (disabled) return;\n openVSCode({ file, line, column: columnStart, windowId });\n }}\n style={{ cursor: disabled ? 'revert' : 'pointer' }}\n >\n {label || getShortPath(url)}\n {loc ? `:${loc}` : ''}\n </Typography.Text>\n </Typography.Text>\n {process.env.NODE_ENV === 'development' ? (\n <VSCode\n file={file}\n line={line}\n column={columnStart}\n windowId={windowId}\n style={{ marginLeft: 3 }}\n />\n ) : (\n <div style={{ display: 'inline-block' }} />\n )}\n {/* TODO implement open cloud ide or codebase by git url + branch + relative filepath in production */}\n </span>\n );\n};\n"],"names":["parseUrl","url","strs","res","e","path","parseLoc","loc","line","col","start","end","defaultWindowId","Date","CodeOpener","cwd","windowId","label","disabled","code","file","columnStart","Typography","openVSCode","getShortPath","process","VSCode"],"mappings":";;;;;AAwBA,SAASA,SAASC,GAAW;IAC3B,MAAMC,OAAOD,IAAI,KAAK,CAAC;IACvB,IAAIE,MAAM;IACV,IAAID,AAAgB,MAAhBA,KAAK,MAAM,EACb,CAACC,IAAI,GAAGD;SAER,CAACC,IAAI,GAAGD,KAAK,MAAM,CAAC,CAACE,IAAMC,KAAK,UAAU,CAACD,MAAMA,EAAE,UAAU,CAAC;IAGhE,OAAOD,OAAOF;AAChB;AAEA,SAASK,SAASC,GAAY;IAC5B,IAAI,CAACA,KAAK,OAAO;QAAE,MAAM;QAAG,QAAQ;IAAE;IAEtC,MAAM,CAACC,MAAMC,MAAM,EAAE,CAAC,GAAGF,IAAI,KAAK,CAAC;IACnC,MAAM,CAACG,QAAQ,CAAC,EAAEC,IAAI,GAAGF,IAAI,KAAK,CAAC;IAEnC,OAAO;QACLD;QACA,aAAaE;QACb,WAAWC,OAAOD;IACpB;AACF;AAEA,MAAME,kBAAkB,CAACC,KAAK,GAAG,GAAG,QAAQ,GAAG,KAAK,CAAC,MAAM;AAEpD,MAAMC,aAAa,CAAC,EACzBC,GAAG,EACHd,GAAG,EACHM,GAAG,EACHS,WAAWJ,eAAe,EAC1BK,KAAK,EACLC,QAAQ,EACRC,OAAO,KAAK,EACuB;IACnC,MAAMC,OAAOf,KAAK,OAAO,CAACU,KAAKf,SAASC;IAExC,MAAM,EAAEO,IAAI,EAAEa,WAAW,EAAE,GAAGf,SAASC;IAEvC,OAAO,WAAP,GACE,KAAC;QAAK,OAAO;YAAE,WAAW;QAAY;;0BACpC,IAACe,WAAW,IAAI;gBACd,UAAU;oBACR,MAAMF;gBACR;0BAEA,mBAACE,WAAW,IAAI;oBACd,MAAMH;oBACN,SAAS;wBACP,IAAID,UAAU;wBACdK,WAAW;4BAAEH;4BAAMZ;4BAAM,QAAQa;4BAAaL;wBAAS;oBACzD;oBACA,OAAO;wBAAE,QAAQE,WAAW,WAAW;oBAAU;;wBAEhDD,SAASO,aAAavB;wBACtBM,MAAM,CAAC,CAAC,EAAEA,KAAK,GAAG;;;;YAGG,kBAAzBkB,QAAQ,GAAG,CAAC,QAAQ,GAAqB,WAAhB,GACxB,IAACC,QAAMA;gBACL,MAAMN;gBACN,MAAMZ;gBACN,QAAQa;gBACR,UAAUL;gBACV,OAAO;oBAAE,YAAY;gBAAE;+BAGzB,IAAC;gBAAI,OAAO;oBAAE,SAAS;gBAAe;;;;AAK9C"}
@@ -9,5 +9,5 @@ interface VSCodeProps {
9
9
  export declare function openVSCode({ file, line, column, windowId, }: VSCodeProps): void;
10
10
  export declare function openCursor({ file, line, column, }: Pick<VSCodeProps, 'file' | 'line' | 'column'>): void;
11
11
  export declare function openTrae({ file, line, column, }: Pick<VSCodeProps, 'file' | 'line' | 'column'>): void;
12
- export declare const VSCode: (props: VSCodeProps) => JSX.Element;
12
+ export declare const VSCode: (props: VSCodeProps) => React.JSX.Element;
13
13
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"components/Opener/ide.mjs","sources":["../../../src/components/Opener/ide.tsx"],"sourcesContent":["import { Lodash } from '@rsdoctor/utils/common';\nimport React from 'react';\nimport VSCodeIcon from '../../common/svg/vscode.svg';\n\ninterface VSCodeProps {\n file: string;\n line?: number | string;\n column?: number | string;\n windowId?: number;\n style?: React.CSSProperties;\n}\n\nconst OPEN_IN_EDITOR_PATH = '/__open-in-editor';\n\ntype EditorKind = 'code' | 'cursor' | 'trae';\n\nasync function openInEditor(\n file: string,\n line: number | string,\n column: number | string,\n editor: EditorKind,\n urlSchemeFallback: () => void,\n) {\n const fileSpec = `${file}:${line}:${column}`;\n try {\n const base =\n typeof window !== 'undefined' && window.location?.origin\n ? window.location.origin\n : '';\n const url = `${base}${OPEN_IN_EDITOR_PATH}?file=${encodeURIComponent(fileSpec)}&editor=${editor}`;\n const res = await fetch(url, { method: 'GET' });\n if (!res.ok) {\n urlSchemeFallback();\n }\n } catch {\n urlSchemeFallback();\n }\n}\n\nexport function openVSCode({\n file,\n line = 1,\n column = 1,\n windowId,\n}: VSCodeProps) {\n const query: Record<string, unknown> = { windowId };\n const queryString = Object.keys(query)\n .map((k) => {\n const v = query[k];\n if (Lodash.isNil(v) || v === '') return null;\n return `${k}=${v}`;\n })\n .filter(Boolean)\n .join('&');\n\n const fallback = () => {\n let url = `vscode://file/${file}:${line}:${column}`;\n if (queryString) url += `?${queryString}`;\n window.open(url);\n };\n\n openInEditor(file, line, column, 'code', fallback);\n}\n\nexport function openCursor({\n file,\n line = 1,\n column = 1,\n}: Pick<VSCodeProps, 'file' | 'line' | 'column'>) {\n const fallback = () => {\n window.open(`cursor://file/${file}:${line}:${column}`);\n };\n openInEditor(file, line, column, 'cursor', fallback);\n}\n\nexport function openTrae({\n file,\n line = 1,\n column = 1,\n}: Pick<VSCodeProps, 'file' | 'line' | 'column'>) {\n const fallback = () => {\n window.open(`trae://file/${file}:${line}:${column}`);\n };\n\n openInEditor(file, line, column, 'trae', fallback);\n}\n\nexport const VSCode = (props: VSCodeProps): JSX.Element => {\n return (\n <VSCodeIcon\n onClick={() => {\n openVSCode(props);\n }}\n style={{\n width: 14,\n cursor: 'pointer',\n verticalAlign: 'middle',\n display: 'inline',\n transform: 'translateY(-1.5px)',\n ...props.style,\n }}\n />\n );\n};\n"],"names":["OPEN_IN_EDITOR_PATH","openInEditor","file","line","column","editor","urlSchemeFallback","fileSpec","base","window","url","encodeURIComponent","res","fetch","openVSCode","windowId","query","queryString","Object","k","v","Lodash","Boolean","fallback","openCursor","openTrae","VSCode","props","VSCodeIcon"],"mappings":";;;;AAYA,MAAMA,sBAAsB;AAI5B,eAAeC,aACbC,IAAY,EACZC,IAAqB,EACrBC,MAAuB,EACvBC,MAAkB,EAClBC,iBAA6B;IAE7B,MAAMC,WAAW,GAAGL,KAAK,CAAC,EAAEC,KAAK,CAAC,EAAEC,QAAQ;IAC5C,IAAI;QACF,MAAMI,OACJ,AAAkB,MAAlB,OAAOC,UAA0BA,OAAO,QAAQ,EAAE,SAC9CA,OAAO,QAAQ,CAAC,MAAM,GACtB;QACN,MAAMC,MAAM,GAAGF,OAAOR,oBAAoB,MAAM,EAAEW,mBAAmBJ,UAAU,QAAQ,EAAEF,QAAQ;QACjG,MAAMO,MAAM,MAAMC,MAAMH,KAAK;YAAE,QAAQ;QAAM;QAC7C,IAAI,CAACE,IAAI,EAAE,EACTN;IAEJ,EAAE,OAAM;QACNA;IACF;AACF;AAEO,SAASQ,WAAW,EACzBZ,IAAI,EACJC,OAAO,CAAC,EACRC,SAAS,CAAC,EACVW,QAAQ,EACI;IACZ,MAAMC,QAAiC;QAAED;IAAS;IAClD,MAAME,cAAcC,OAAO,IAAI,CAACF,OAC7B,GAAG,CAAC,CAACG;QACJ,MAAMC,IAAIJ,KAAK,CAACG,EAAE;QAClB,IAAIE,OAAO,KAAK,CAACD,MAAMA,AAAM,OAANA,GAAU,OAAO;QACxC,OAAO,GAAGD,EAAE,CAAC,EAAEC,GAAG;IACpB,GACC,MAAM,CAACE,SACP,IAAI,CAAC;IAER,MAAMC,WAAW;QACf,IAAIb,MAAM,CAAC,cAAc,EAAER,KAAK,CAAC,EAAEC,KAAK,CAAC,EAAEC,QAAQ;QACnD,IAAIa,aAAaP,OAAO,CAAC,CAAC,EAAEO,aAAa;QACzCR,OAAO,IAAI,CAACC;IACd;IAEAT,aAAaC,MAAMC,MAAMC,QAAQ,QAAQmB;AAC3C;AAEO,SAASC,WAAW,EACzBtB,IAAI,EACJC,OAAO,CAAC,EACRC,SAAS,CAAC,EACoC;IAC9C,MAAMmB,WAAW;QACfd,OAAO,IAAI,CAAC,CAAC,cAAc,EAAEP,KAAK,CAAC,EAAEC,KAAK,CAAC,EAAEC,QAAQ;IACvD;IACAH,aAAaC,MAAMC,MAAMC,QAAQ,UAAUmB;AAC7C;AAEO,SAASE,SAAS,EACvBvB,IAAI,EACJC,OAAO,CAAC,EACRC,SAAS,CAAC,EACoC;IAC9C,MAAMmB,WAAW;QACfd,OAAO,IAAI,CAAC,CAAC,YAAY,EAAEP,KAAK,CAAC,EAAEC,KAAK,CAAC,EAAEC,QAAQ;IACrD;IAEAH,aAAaC,MAAMC,MAAMC,QAAQ,QAAQmB;AAC3C;AAEO,MAAMG,SAAS,CAACC,QACd,WAAP,GACE,IAACC,QAAUA;QACT,SAAS;YACPd,WAAWa;QACb;QACA,OAAO;YACL,OAAO;YACP,QAAQ;YACR,eAAe;YACf,SAAS;YACT,WAAW;YACX,GAAGA,MAAM,KAAK;QAChB"}
1
+ {"version":3,"file":"components/Opener/ide.mjs","sources":["../../../src/components/Opener/ide.tsx"],"sourcesContent":["import { Lodash } from '@rsdoctor/utils/common';\nimport React from 'react';\nimport VSCodeIcon from '../../common/svg/vscode.svg';\n\ninterface VSCodeProps {\n file: string;\n line?: number | string;\n column?: number | string;\n windowId?: number;\n style?: React.CSSProperties;\n}\n\nconst OPEN_IN_EDITOR_PATH = '/__open-in-editor';\n\ntype EditorKind = 'code' | 'cursor' | 'trae';\n\nasync function openInEditor(\n file: string,\n line: number | string,\n column: number | string,\n editor: EditorKind,\n urlSchemeFallback: () => void,\n) {\n const fileSpec = `${file}:${line}:${column}`;\n try {\n const base =\n typeof window !== 'undefined' && window.location?.origin\n ? window.location.origin\n : '';\n const url = `${base}${OPEN_IN_EDITOR_PATH}?file=${encodeURIComponent(fileSpec)}&editor=${editor}`;\n const res = await fetch(url, { method: 'GET' });\n if (!res.ok) {\n urlSchemeFallback();\n }\n } catch {\n urlSchemeFallback();\n }\n}\n\nexport function openVSCode({\n file,\n line = 1,\n column = 1,\n windowId,\n}: VSCodeProps) {\n const query: Record<string, unknown> = { windowId };\n const queryString = Object.keys(query)\n .map((k) => {\n const v = query[k];\n if (Lodash.isNil(v) || v === '') return null;\n return `${k}=${v}`;\n })\n .filter(Boolean)\n .join('&');\n\n const fallback = () => {\n let url = `vscode://file/${file}:${line}:${column}`;\n if (queryString) url += `?${queryString}`;\n window.open(url);\n };\n\n openInEditor(file, line, column, 'code', fallback);\n}\n\nexport function openCursor({\n file,\n line = 1,\n column = 1,\n}: Pick<VSCodeProps, 'file' | 'line' | 'column'>) {\n const fallback = () => {\n window.open(`cursor://file/${file}:${line}:${column}`);\n };\n openInEditor(file, line, column, 'cursor', fallback);\n}\n\nexport function openTrae({\n file,\n line = 1,\n column = 1,\n}: Pick<VSCodeProps, 'file' | 'line' | 'column'>) {\n const fallback = () => {\n window.open(`trae://file/${file}:${line}:${column}`);\n };\n\n openInEditor(file, line, column, 'trae', fallback);\n}\n\nexport const VSCode = (props: VSCodeProps): React.JSX.Element => {\n return (\n <VSCodeIcon\n onClick={() => {\n openVSCode(props);\n }}\n style={{\n width: 14,\n cursor: 'pointer',\n verticalAlign: 'middle',\n display: 'inline',\n transform: 'translateY(-1.5px)',\n ...props.style,\n }}\n />\n );\n};\n"],"names":["OPEN_IN_EDITOR_PATH","openInEditor","file","line","column","editor","urlSchemeFallback","fileSpec","base","window","url","encodeURIComponent","res","fetch","openVSCode","windowId","query","queryString","Object","k","v","Lodash","Boolean","fallback","openCursor","openTrae","VSCode","props","VSCodeIcon"],"mappings":";;;;AAYA,MAAMA,sBAAsB;AAI5B,eAAeC,aACbC,IAAY,EACZC,IAAqB,EACrBC,MAAuB,EACvBC,MAAkB,EAClBC,iBAA6B;IAE7B,MAAMC,WAAW,GAAGL,KAAK,CAAC,EAAEC,KAAK,CAAC,EAAEC,QAAQ;IAC5C,IAAI;QACF,MAAMI,OACJ,AAAkB,MAAlB,OAAOC,UAA0BA,OAAO,QAAQ,EAAE,SAC9CA,OAAO,QAAQ,CAAC,MAAM,GACtB;QACN,MAAMC,MAAM,GAAGF,OAAOR,oBAAoB,MAAM,EAAEW,mBAAmBJ,UAAU,QAAQ,EAAEF,QAAQ;QACjG,MAAMO,MAAM,MAAMC,MAAMH,KAAK;YAAE,QAAQ;QAAM;QAC7C,IAAI,CAACE,IAAI,EAAE,EACTN;IAEJ,EAAE,OAAM;QACNA;IACF;AACF;AAEO,SAASQ,WAAW,EACzBZ,IAAI,EACJC,OAAO,CAAC,EACRC,SAAS,CAAC,EACVW,QAAQ,EACI;IACZ,MAAMC,QAAiC;QAAED;IAAS;IAClD,MAAME,cAAcC,OAAO,IAAI,CAACF,OAC7B,GAAG,CAAC,CAACG;QACJ,MAAMC,IAAIJ,KAAK,CAACG,EAAE;QAClB,IAAIE,OAAO,KAAK,CAACD,MAAMA,AAAM,OAANA,GAAU,OAAO;QACxC,OAAO,GAAGD,EAAE,CAAC,EAAEC,GAAG;IACpB,GACC,MAAM,CAACE,SACP,IAAI,CAAC;IAER,MAAMC,WAAW;QACf,IAAIb,MAAM,CAAC,cAAc,EAAER,KAAK,CAAC,EAAEC,KAAK,CAAC,EAAEC,QAAQ;QACnD,IAAIa,aAAaP,OAAO,CAAC,CAAC,EAAEO,aAAa;QACzCR,OAAO,IAAI,CAACC;IACd;IAEAT,aAAaC,MAAMC,MAAMC,QAAQ,QAAQmB;AAC3C;AAEO,SAASC,WAAW,EACzBtB,IAAI,EACJC,OAAO,CAAC,EACRC,SAAS,CAAC,EACoC;IAC9C,MAAMmB,WAAW;QACfd,OAAO,IAAI,CAAC,CAAC,cAAc,EAAEP,KAAK,CAAC,EAAEC,KAAK,CAAC,EAAEC,QAAQ;IACvD;IACAH,aAAaC,MAAMC,MAAMC,QAAQ,UAAUmB;AAC7C;AAEO,SAASE,SAAS,EACvBvB,IAAI,EACJC,OAAO,CAAC,EACRC,SAAS,CAAC,EACoC;IAC9C,MAAMmB,WAAW;QACfd,OAAO,IAAI,CAAC,CAAC,YAAY,EAAEP,KAAK,CAAC,EAAEC,KAAK,CAAC,EAAEC,QAAQ;IACrD;IAEAH,aAAaC,MAAMC,MAAMC,QAAQ,QAAQmB;AAC3C;AAEO,MAAMG,SAAS,CAACC,QACd,WAAP,GACE,IAACC,QAAUA;QACT,SAAS;YACPd,WAAWa;QACb;QACA,OAAO;YACL,OAAO;YACP,QAAQ;YACR,eAAe;YACf,SAAS;YACT,WAAW;YACX,GAAGA,MAAM,KAAK;QAChB"}
@@ -4,7 +4,7 @@ import type { TreeDataNode } from 'antd';
4
4
  export declare const getFiles: (data: Client.RsdoctorClientAssetsSummary["all"]["total"]) => {
5
5
  treeData: TreeDataNode[];
6
6
  };
7
- export declare const getFilesWithDrawer: (data: Client.RsdoctorClientAssetsSummary["all"]["total"]) => JSX.Element;
7
+ export declare const getFilesWithDrawer: (data: Client.RsdoctorClientAssetsSummary["all"]["total"]) => React.JSX.Element;
8
8
  export declare const BundleOverall: React.FC<{
9
9
  errors: SDK.ErrorsData;
10
10
  cwd: string;
@@ -1 +1 @@
1
- {"version":3,"file":"components/Overall/bundle.mjs","sources":["../../../src/components/Overall/bundle.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Descriptions,\n DescriptionsProps,\n Button,\n Tree,\n Tag,\n Segmented,\n} from 'antd';\nimport { FolderOpenTwoTone, RightOutlined } from '@ant-design/icons';\nimport { useNavigate } from 'react-router-dom';\n\nimport { getFileCom } from '../FileTree';\nimport { formatSize, useI18n } from '../../utils';\nimport { TextDrawer } from '../TextDrawer';\nimport { Card } from '../Card';\nimport { ServerAPIProvider } from '../Manifest';\nimport listStyles from './list.module.scss';\nimport cardStyles from './card.module.scss';\nimport { DataSummary } from './DataSummary';\n\nimport { Client, SDK } from '@rsdoctor/types';\nimport type { TreeDataNode } from 'antd';\n\nimport styles from './bundle.module.scss';\n\ntype viewType = 'files' | 'size';\n\nconst { DirectoryTree } = Tree;\n\nexport const getFiles = (\n data: Client.RsdoctorClientAssetsSummary['all']['total'],\n) => {\n let files: Array<{\n fileName: string;\n defaultDir: string;\n size: number;\n initial: boolean;\n }> = [];\n if (data.files.length) {\n files = data.files.map((fileMessage) => {\n const filePath = fileMessage.path;\n const pathArray = filePath.split('/');\n const fileName = pathArray.pop()!;\n const defaultDir = pathArray.join('/') || 'output';\n\n return {\n fileName,\n defaultDir,\n size: fileMessage.size,\n initial: fileMessage.initial,\n };\n });\n }\n\n const treeData: TreeDataNode[] = [];\n files.forEach((file) => {\n const target = treeData.find((data) => data.title === file.defaultDir);\n const parent: TreeDataNode = target || {\n title: file.defaultDir,\n key: file.defaultDir,\n icon: <FolderOpenTwoTone />,\n children: [],\n };\n const icon = getFileCom(file.fileName);\n if (!target) {\n treeData.push(parent);\n }\n parent.children!.push({\n title: (\n <div className={styles.treeContainer}>\n <div className={styles.treeTitle}>{file.fileName}</div>\n <div className={styles.line} />\n <Tag className={styles.tag} color=\"green\">\n {formatSize(file.size)}\n </Tag>\n {file.initial ? (\n <Tag className={styles.tag} color=\"cyan\">\n initial\n </Tag>\n ) : null}\n </div>\n ),\n key: file.fileName,\n isLeaf: true,\n icon,\n });\n });\n\n return {\n treeData,\n };\n};\n\nexport const getFilesWithDrawer = (\n data: Client.RsdoctorClientAssetsSummary['all']['total'],\n): JSX.Element => {\n const { treeData } = getFiles(data);\n\n return (\n <>\n {data.files.length ? (\n <TextDrawer\n buttonProps={{\n size: 'small',\n }}\n buttonStyle={{\n fontSize: 'inherit',\n }}\n drawerProps={{\n title: 'Files',\n }}\n text={<span>{data.count}</span>}\n >\n <DirectoryTree\n defaultExpandAll\n selectable={false}\n treeData={treeData}\n rootStyle={{\n minHeight: '800px',\n border: '1px solid rgba(235, 237, 241)',\n }}\n />\n </TextDrawer>\n ) : (\n data.count\n )}\n </>\n );\n};\n\nconst BundleDescriptions = ({\n res,\n view,\n}: {\n res: Client.RsdoctorClientAssetsSummary;\n view: viewType;\n}) => {\n const fileItems: DescriptionsProps['items'] = [\n {\n key: 'js-files-count',\n label: 'JS files',\n children: (\n <span className={`${styles.description} ${styles.column}`}>\n {getFilesWithDrawer(res.js.total)}\n </span>\n ),\n },\n {\n key: 'css-files-count',\n label: 'CSS files',\n children: (\n <span className={`${styles.description} ${styles.column}`}>\n {getFilesWithDrawer(res.css.total)}\n </span>\n ),\n },\n {\n key: 'font-files-count',\n label: 'Font files',\n children: (\n <span className={`${styles.description} ${styles.column}`}>\n {getFilesWithDrawer(res.fonts.total)}\n </span>\n ),\n },\n {\n key: 'html-files-count',\n label: 'HTML files',\n children: (\n <span className={styles.description}>\n {getFilesWithDrawer(res.html.total)}\n </span>\n ),\n },\n {\n key: 'image-files-count',\n label: 'Image files',\n children: (\n <span className={styles.description}>\n {getFilesWithDrawer(res.imgs.total)}\n </span>\n ),\n },\n {\n key: 'media-files-count',\n label: 'Media files',\n children: (\n <span className={styles.description}>\n {getFilesWithDrawer(res.media.total)}\n </span>\n ),\n },\n ];\n\n const [jsSize, jsSizeUnit] = formatSize(res.js.total.size).split(' ');\n const [cssSize, cssSizeUnit] = formatSize(res.css.total.size).split(' ');\n const [fontSize, fontSizeUnit] = formatSize(res.fonts.total.size).split(' ');\n const [htmlSize, htmlSizeUnit] = formatSize(res.html.total.size).split(' ');\n const [imgSize, imgSizeUnit] = formatSize(res.imgs.total.size).split(' ');\n const [mediaSize, mediaSizeUnit] = formatSize(res.media.total.size).split(\n ' ',\n );\n\n const sizeItems: DescriptionsProps['items'] = [\n {\n key: 'js-files-size',\n label: <span className={styles.label}>JS size</span>,\n children: (\n <div className={styles.column}>\n <span className={styles.description}>{jsSize}</span>\n <span className={styles.unit}>{jsSizeUnit}</span>\n </div>\n ),\n },\n {\n key: 'css-files-size',\n label: <span className={styles.label}>CSS size</span>,\n children: (\n <div className={styles.column}>\n <span className={styles.description}>{cssSize}</span>\n <span className={styles.unit}>{cssSizeUnit}</span>\n </div>\n ),\n },\n {\n key: 'font-files-size',\n label: <span className={styles.label}>Font size</span>,\n children: (\n <div className={styles.column}>\n <span className={styles.description}>{fontSize}</span>\n <span className={styles.unit}>{fontSizeUnit}</span>\n </div>\n ),\n },\n {\n key: 'html-files-size',\n label: <span className={styles.label}>HTML size</span>,\n children: (\n <>\n <span className={styles.description}>{htmlSize}</span>\n <span className={styles.unit}>{htmlSizeUnit}</span>\n </>\n ),\n },\n {\n key: 'image-files-size',\n label: <span className={styles.label}>Image size</span>,\n children: (\n <>\n <span className={styles.description}>{imgSize}</span>\n <span className={styles.unit}>{imgSizeUnit}</span>\n </>\n ),\n },\n {\n key: 'media-files-size',\n label: <span className={styles.label}>Media size</span>,\n children: (\n <>\n <span className={styles.description}>{mediaSize}</span>\n <span className={styles.unit}>{mediaSizeUnit}</span>\n </>\n ),\n },\n ];\n\n return (\n <Descriptions\n layout={'vertical'}\n className={listStyles.bundleOverall}\n size=\"small\"\n column={3}\n colon={false}\n items={view === 'files' ? fileItems : sizeItems}\n />\n );\n};\n\nexport const BundleOverall: React.FC<{\n errors: SDK.ErrorsData;\n cwd: string;\n}> = (): JSX.Element | null => {\n const [view, setView] = useState<viewType>('size');\n const navigate = useNavigate();\n const { t } = useI18n();\n\n const handleViewChange = (value: viewType) => {\n setView(value);\n };\n\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetAssetsSummary}\n body={{ withFileContent: false }}\n >\n {(res) => {\n const totalSizeStr = formatSize(res.all.total.size);\n return (\n <Card className={cardStyles.card} style={{ height: '316px' }}>\n <div>\n <div className={styles.title}>\n <span>{t('Bundle Overall')}</span>\n <Button\n type=\"link\"\n style={{ padding: '0px' }}\n onClick={() => {\n navigate(Client.RsdoctorClientRoutes.BundleSize);\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <span style={{ marginRight: '8px', fontSize: '13px' }}>\n {t('ViewBundleSize')}\n </span>\n <RightOutlined style={{ fontSize: '10px' }} />\n </div>\n </Button>\n </div>\n <Segmented\n options={['Size', 'Files']}\n onChange={(val) =>\n handleViewChange(val.toLocaleLowerCase() as viewType)\n }\n size=\"small\"\n style={{ marginBottom: 8, fontSize: '14px' }}\n />\n <DataSummary\n theme={view === 'files' ? 'common' : 'warning'}\n number={view === 'files' ? res.all.total.count : totalSizeStr}\n description={`Total ${view}`}\n />\n <BundleDescriptions view={view} res={res} />\n </div>\n </Card>\n );\n }}\n </ServerAPIProvider>\n );\n};\n"],"names":["DirectoryTree","Tree","getFiles","data","files","fileMessage","filePath","pathArray","fileName","defaultDir","treeData","file","target","parent","FolderOpenTwoTone","icon","getFileCom","styles","Tag","formatSize","getFilesWithDrawer","TextDrawer","BundleDescriptions","res","view","fileItems","jsSize","jsSizeUnit","cssSize","cssSizeUnit","fontSize","fontSizeUnit","htmlSize","htmlSizeUnit","imgSize","imgSizeUnit","mediaSize","mediaSizeUnit","sizeItems","Descriptions","listStyles","BundleOverall","setView","useState","navigate","useNavigate","t","useI18n","handleViewChange","value","ServerAPIProvider","SDK","totalSizeStr","Card","cardStyles","Button","Client","RightOutlined","Segmented","val","DataSummary"],"mappings":"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"}
1
+ {"version":3,"file":"components/Overall/bundle.mjs","sources":["../../../src/components/Overall/bundle.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Descriptions,\n DescriptionsProps,\n Button,\n Tree,\n Tag,\n Segmented,\n} from 'antd';\nimport { FolderOpenTwoTone, RightOutlined } from '@ant-design/icons';\nimport { useNavigate } from 'react-router-dom';\n\nimport { getFileCom } from '../FileTree';\nimport { formatSize, useI18n } from '../../utils';\nimport { TextDrawer } from '../TextDrawer';\nimport { Card } from '../Card';\nimport { ServerAPIProvider } from '../Manifest';\nimport listStyles from './list.module.scss';\nimport cardStyles from './card.module.scss';\nimport { DataSummary } from './DataSummary';\n\nimport { Client, SDK } from '@rsdoctor/types';\nimport type { TreeDataNode } from 'antd';\n\nimport styles from './bundle.module.scss';\n\ntype viewType = 'files' | 'size';\n\nconst { DirectoryTree } = Tree;\n\nexport const getFiles = (\n data: Client.RsdoctorClientAssetsSummary['all']['total'],\n) => {\n let files: Array<{\n fileName: string;\n defaultDir: string;\n size: number;\n initial: boolean;\n }> = [];\n if (data.files.length) {\n files = data.files.map((fileMessage) => {\n const filePath = fileMessage.path;\n const pathArray = filePath.split('/');\n const fileName = pathArray.pop()!;\n const defaultDir = pathArray.join('/') || 'output';\n\n return {\n fileName,\n defaultDir,\n size: fileMessage.size,\n initial: fileMessage.initial,\n };\n });\n }\n\n const treeData: TreeDataNode[] = [];\n files.forEach((file) => {\n const target = treeData.find((data) => data.title === file.defaultDir);\n const parent: TreeDataNode = target || {\n title: file.defaultDir,\n key: file.defaultDir,\n icon: <FolderOpenTwoTone />,\n children: [],\n };\n const icon = getFileCom(file.fileName);\n if (!target) {\n treeData.push(parent);\n }\n parent.children!.push({\n title: (\n <div className={styles.treeContainer}>\n <div className={styles.treeTitle}>{file.fileName}</div>\n <div className={styles.line} />\n <Tag className={styles.tag} color=\"green\">\n {formatSize(file.size)}\n </Tag>\n {file.initial ? (\n <Tag className={styles.tag} color=\"cyan\">\n initial\n </Tag>\n ) : null}\n </div>\n ),\n key: file.fileName,\n isLeaf: true,\n icon,\n });\n });\n\n return {\n treeData,\n };\n};\n\nexport const getFilesWithDrawer = (\n data: Client.RsdoctorClientAssetsSummary['all']['total'],\n): React.JSX.Element => {\n const { treeData } = getFiles(data);\n\n return (\n <>\n {data.files.length ? (\n <TextDrawer\n buttonProps={{\n size: 'small',\n }}\n buttonStyle={{\n fontSize: 'inherit',\n }}\n drawerProps={{\n title: 'Files',\n }}\n text={<span>{data.count}</span>}\n >\n <DirectoryTree\n defaultExpandAll\n selectable={false}\n treeData={treeData}\n rootStyle={{\n minHeight: '800px',\n border: '1px solid rgba(235, 237, 241)',\n }}\n />\n </TextDrawer>\n ) : (\n data.count\n )}\n </>\n );\n};\n\nconst BundleDescriptions = ({\n res,\n view,\n}: {\n res: Client.RsdoctorClientAssetsSummary;\n view: viewType;\n}) => {\n const fileItems: DescriptionsProps['items'] = [\n {\n key: 'js-files-count',\n label: 'JS files',\n children: (\n <span className={`${styles.description} ${styles.column}`}>\n {getFilesWithDrawer(res.js.total)}\n </span>\n ),\n },\n {\n key: 'css-files-count',\n label: 'CSS files',\n children: (\n <span className={`${styles.description} ${styles.column}`}>\n {getFilesWithDrawer(res.css.total)}\n </span>\n ),\n },\n {\n key: 'font-files-count',\n label: 'Font files',\n children: (\n <span className={`${styles.description} ${styles.column}`}>\n {getFilesWithDrawer(res.fonts.total)}\n </span>\n ),\n },\n {\n key: 'html-files-count',\n label: 'HTML files',\n children: (\n <span className={styles.description}>\n {getFilesWithDrawer(res.html.total)}\n </span>\n ),\n },\n {\n key: 'image-files-count',\n label: 'Image files',\n children: (\n <span className={styles.description}>\n {getFilesWithDrawer(res.imgs.total)}\n </span>\n ),\n },\n {\n key: 'media-files-count',\n label: 'Media files',\n children: (\n <span className={styles.description}>\n {getFilesWithDrawer(res.media.total)}\n </span>\n ),\n },\n ];\n\n const [jsSize, jsSizeUnit] = formatSize(res.js.total.size).split(' ');\n const [cssSize, cssSizeUnit] = formatSize(res.css.total.size).split(' ');\n const [fontSize, fontSizeUnit] = formatSize(res.fonts.total.size).split(' ');\n const [htmlSize, htmlSizeUnit] = formatSize(res.html.total.size).split(' ');\n const [imgSize, imgSizeUnit] = formatSize(res.imgs.total.size).split(' ');\n const [mediaSize, mediaSizeUnit] = formatSize(res.media.total.size).split(\n ' ',\n );\n\n const sizeItems: DescriptionsProps['items'] = [\n {\n key: 'js-files-size',\n label: <span className={styles.label}>JS size</span>,\n children: (\n <div className={styles.column}>\n <span className={styles.description}>{jsSize}</span>\n <span className={styles.unit}>{jsSizeUnit}</span>\n </div>\n ),\n },\n {\n key: 'css-files-size',\n label: <span className={styles.label}>CSS size</span>,\n children: (\n <div className={styles.column}>\n <span className={styles.description}>{cssSize}</span>\n <span className={styles.unit}>{cssSizeUnit}</span>\n </div>\n ),\n },\n {\n key: 'font-files-size',\n label: <span className={styles.label}>Font size</span>,\n children: (\n <div className={styles.column}>\n <span className={styles.description}>{fontSize}</span>\n <span className={styles.unit}>{fontSizeUnit}</span>\n </div>\n ),\n },\n {\n key: 'html-files-size',\n label: <span className={styles.label}>HTML size</span>,\n children: (\n <>\n <span className={styles.description}>{htmlSize}</span>\n <span className={styles.unit}>{htmlSizeUnit}</span>\n </>\n ),\n },\n {\n key: 'image-files-size',\n label: <span className={styles.label}>Image size</span>,\n children: (\n <>\n <span className={styles.description}>{imgSize}</span>\n <span className={styles.unit}>{imgSizeUnit}</span>\n </>\n ),\n },\n {\n key: 'media-files-size',\n label: <span className={styles.label}>Media size</span>,\n children: (\n <>\n <span className={styles.description}>{mediaSize}</span>\n <span className={styles.unit}>{mediaSizeUnit}</span>\n </>\n ),\n },\n ];\n\n return (\n <Descriptions\n layout={'vertical'}\n className={listStyles.bundleOverall}\n size=\"small\"\n column={3}\n colon={false}\n items={view === 'files' ? fileItems : sizeItems}\n />\n );\n};\n\nexport const BundleOverall: React.FC<{\n errors: SDK.ErrorsData;\n cwd: string;\n}> = (): React.JSX.Element | null => {\n const [view, setView] = useState<viewType>('size');\n const navigate = useNavigate();\n const { t } = useI18n();\n\n const handleViewChange = (value: viewType) => {\n setView(value);\n };\n\n return (\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetAssetsSummary}\n body={{ withFileContent: false }}\n >\n {(res) => {\n const totalSizeStr = formatSize(res.all.total.size);\n return (\n <Card className={cardStyles.card} style={{ height: '316px' }}>\n <div>\n <div className={styles.title}>\n <span>{t('Bundle Overall')}</span>\n <Button\n type=\"link\"\n style={{ padding: '0px' }}\n onClick={() => {\n navigate(Client.RsdoctorClientRoutes.BundleSize);\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <span style={{ marginRight: '8px', fontSize: '13px' }}>\n {t('ViewBundleSize')}\n </span>\n <RightOutlined style={{ fontSize: '10px' }} />\n </div>\n </Button>\n </div>\n <Segmented\n options={['Size', 'Files']}\n onChange={(val) =>\n handleViewChange(val.toLocaleLowerCase() as viewType)\n }\n size=\"small\"\n style={{ marginBottom: 8, fontSize: '14px' }}\n />\n <DataSummary\n theme={view === 'files' ? 'common' : 'warning'}\n number={view === 'files' ? res.all.total.count : totalSizeStr}\n description={`Total ${view}`}\n />\n <BundleDescriptions view={view} res={res} />\n </div>\n </Card>\n );\n }}\n </ServerAPIProvider>\n );\n};\n"],"names":["DirectoryTree","Tree","getFiles","data","files","fileMessage","filePath","pathArray","fileName","defaultDir","treeData","file","target","parent","FolderOpenTwoTone","icon","getFileCom","styles","Tag","formatSize","getFilesWithDrawer","TextDrawer","BundleDescriptions","res","view","fileItems","jsSize","jsSizeUnit","cssSize","cssSizeUnit","fontSize","fontSizeUnit","htmlSize","htmlSizeUnit","imgSize","imgSizeUnit","mediaSize","mediaSizeUnit","sizeItems","Descriptions","listStyles","BundleOverall","setView","useState","navigate","useNavigate","t","useI18n","handleViewChange","value","ServerAPIProvider","SDK","totalSizeStr","Card","cardStyles","Button","Client","RightOutlined","Segmented","val","DataSummary"],"mappings":"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"}
@@ -8,5 +8,5 @@ export interface TextDrawerProps {
8
8
  drawerProps?: DrawerProps;
9
9
  containerProps?: HTMLAttributes<HTMLDivElement>;
10
10
  }
11
- export declare const TextDrawer: (props: PropsWithChildren<TextDrawerProps>) => JSX.Element;
11
+ export declare const TextDrawer: (props: PropsWithChildren<TextDrawerProps>) => React.JSX.Element;
12
12
  export * from './duplicate.js';
@@ -1 +1 @@
1
- {"version":3,"file":"components/TextDrawer/index.mjs","sources":["../../../src/components/TextDrawer/index.tsx"],"sourcesContent":["import { CodeOutlined } from '@ant-design/icons';\nimport { Button, Drawer, ButtonProps, DrawerProps } from 'antd';\nimport React, {\n CSSProperties,\n HTMLAttributes,\n PropsWithChildren,\n useState,\n} from 'react';\n\nexport interface TextDrawerProps {\n text?: string | React.ReactNode;\n button?: React.ReactNode;\n buttonProps?: ButtonProps;\n buttonStyle?: CSSProperties;\n drawerProps?: DrawerProps;\n containerProps?: HTMLAttributes<HTMLDivElement>;\n}\n\nexport const TextDrawer = (\n props: PropsWithChildren<TextDrawerProps>,\n): JSX.Element => {\n const [visible, setVisible] = useState(false);\n\n return (\n // avoid propagation event affect collapse component\n <div onClick={(e) => e.stopPropagation()} {...props.containerProps}>\n {props.button ? (\n <div onClick={() => setVisible(!visible)}>{props.button}</div>\n ) : props.text ? (\n <Button\n type={'link'}\n {...props.buttonProps}\n onClick={() => setVisible(!visible)}\n style={{ padding: 0, ...props.buttonStyle }}\n >\n {props.text}\n </Button>\n ) : (\n <CodeOutlined\n style={{ fontSize: 14, padding: 0 }}\n onClick={() => setVisible(!visible)}\n />\n )}\n <Drawer\n maskClosable\n zIndex={999}\n width={'60%'}\n {...props.drawerProps}\n open={visible}\n onClose={() => setVisible(false)}\n destroyOnClose\n >\n {props.children}\n </Drawer>\n </div>\n );\n};\n\nexport * from './duplicate';\n"],"names":["TextDrawer","props","visible","setVisible","useState","e","Button","CodeOutlined","Drawer"],"mappings":";;;;;AAkBO,MAAMA,aAAa,CACxBC;IAEA,MAAM,CAACC,SAASC,WAAW,GAAGC,SAAS;IAEvC,O,cAEE,KAAC;QAAI,SAAS,CAACC,IAAMA,EAAE,eAAe;QAAK,GAAGJ,MAAM,cAAc;;YAC/DA,MAAM,MAAM,GAAG,WAAH,GACX,IAAC;gBAAI,SAAS,IAAME,WAAW,CAACD;0BAAWD,MAAM,MAAM;iBACrDA,MAAM,IAAI,GAAG,WAAH,GACZ,IAACK,QAAMA;gBACL,MAAM;gBACL,GAAGL,MAAM,WAAW;gBACrB,SAAS,IAAME,WAAW,CAACD;gBAC3B,OAAO;oBAAE,SAAS;oBAAG,GAAGD,MAAM,WAAW;gBAAC;0BAEzCA,MAAM,IAAI;+BAGb,IAACM,cAAYA;gBACX,OAAO;oBAAE,UAAU;oBAAI,SAAS;gBAAE;gBAClC,SAAS,IAAMJ,WAAW,CAACD;;0BAG/B,IAACM,QAAMA;gBACL,cAAY;gBACZ,QAAQ;gBACR,OAAO;gBACN,GAAGP,MAAM,WAAW;gBACrB,MAAMC;gBACN,SAAS,IAAMC,WAAW;gBAC1B,gBAAc;0BAEbF,MAAM,QAAQ;;;;AAIvB"}
1
+ {"version":3,"file":"components/TextDrawer/index.mjs","sources":["../../../src/components/TextDrawer/index.tsx"],"sourcesContent":["import { CodeOutlined } from '@ant-design/icons';\nimport { Button, Drawer, ButtonProps, DrawerProps } from 'antd';\nimport React, {\n CSSProperties,\n HTMLAttributes,\n PropsWithChildren,\n useState,\n} from 'react';\n\nexport interface TextDrawerProps {\n text?: string | React.ReactNode;\n button?: React.ReactNode;\n buttonProps?: ButtonProps;\n buttonStyle?: CSSProperties;\n drawerProps?: DrawerProps;\n containerProps?: HTMLAttributes<HTMLDivElement>;\n}\n\nexport const TextDrawer = (\n props: PropsWithChildren<TextDrawerProps>,\n): React.JSX.Element => {\n const [visible, setVisible] = useState(false);\n\n return (\n // avoid propagation event affect collapse component\n <div onClick={(e) => e.stopPropagation()} {...props.containerProps}>\n {props.button ? (\n <div onClick={() => setVisible(!visible)}>{props.button}</div>\n ) : props.text ? (\n <Button\n type={'link'}\n {...props.buttonProps}\n onClick={() => setVisible(!visible)}\n style={{ padding: 0, ...props.buttonStyle }}\n >\n {props.text}\n </Button>\n ) : (\n <CodeOutlined\n style={{ fontSize: 14, padding: 0 }}\n onClick={() => setVisible(!visible)}\n />\n )}\n <Drawer\n maskClosable\n zIndex={999}\n width={'60%'}\n {...props.drawerProps}\n open={visible}\n onClose={() => setVisible(false)}\n destroyOnClose\n >\n {props.children}\n </Drawer>\n </div>\n );\n};\n\nexport * from './duplicate';\n"],"names":["TextDrawer","props","visible","setVisible","useState","e","Button","CodeOutlined","Drawer"],"mappings":";;;;;AAkBO,MAAMA,aAAa,CACxBC;IAEA,MAAM,CAACC,SAASC,WAAW,GAAGC,SAAS;IAEvC,O,cAEE,KAAC;QAAI,SAAS,CAACC,IAAMA,EAAE,eAAe;QAAK,GAAGJ,MAAM,cAAc;;YAC/DA,MAAM,MAAM,GAAG,WAAH,GACX,IAAC;gBAAI,SAAS,IAAME,WAAW,CAACD;0BAAWD,MAAM,MAAM;iBACrDA,MAAM,IAAI,GAAG,WAAH,GACZ,IAACK,QAAMA;gBACL,MAAM;gBACL,GAAGL,MAAM,WAAW;gBACrB,SAAS,IAAME,WAAW,CAACD;gBAC3B,OAAO;oBAAE,SAAS;oBAAG,GAAGD,MAAM,WAAW;gBAAC;0BAEzCA,MAAM,IAAI;+BAGb,IAACM,cAAYA;gBACX,OAAO;oBAAE,UAAU;oBAAI,SAAS;gBAAE;gBAClC,SAAS,IAAMJ,WAAW,CAACD;;0BAG/B,IAACM,QAAMA;gBACL,cAAY;gBACZ,QAAQ;gBACR,OAAO;gBACN,GAAGP,MAAM,WAAW;gBACrB,MAAMC;gBACN,SAAS,IAAMC,WAAW;gBAC1B,gBAAc;0BAEbF,MAAM,QAAQ;;;;AAIvB"}
@@ -7,8 +7,8 @@ import { Checkbox } from "antd";
7
7
  import index_module from "./index.module.mjs";
8
8
  import { Lodash } from "@rsdoctor/utils/common";
9
9
  function CodeViewer({ className, style, code = '', lang, filePath = '', defaultLine, ranges, isEmbed = false, headerVisible = true, isLightTheme = true, formatOnMount = false }) {
10
- const editor = useRef();
11
- const monaco = useRef();
10
+ const editor = useRef(void 0);
11
+ const monaco = useRef(void 0);
12
12
  const language = useMemo(()=>lang || getFilePathFormat(filePath) || 'plaintext', [
13
13
  lang,
14
14
  filePath
@@ -1 +1 @@
1
- {"version":3,"file":"components/base/CodeViewer/index.mjs","sources":["../../../../src/components/base/CodeViewer/index.tsx"],"sourcesContent":["import { Editor, Monaco, OnMount } from '@monaco-editor/react';\nimport clsx from 'clsx';\nimport { editor } from 'monaco-editor';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { CodeViewerProps } from './interface';\nimport {\n defineMonacoOptions,\n editorShowRange,\n getFileName,\n getFilePathFormat,\n} from './utils';\n\nimport { Checkbox } from 'antd';\nimport styles from './index.module.scss';\nimport { Lodash } from '@rsdoctor/utils/common';\n\nexport function CodeViewer({\n className,\n style,\n code = '',\n lang,\n filePath = '',\n defaultLine,\n ranges,\n isEmbed = false,\n headerVisible = true,\n isLightTheme = true,\n formatOnMount = false,\n}: CodeViewerProps) {\n const editor = useRef<editor.IStandaloneCodeEditor>();\n const monaco = useRef<Monaco>();\n const language = useMemo(\n () => lang || getFilePathFormat(filePath) || 'plaintext',\n [lang, filePath],\n );\n const [isWordWrap, setIsWordWrap] = useState(true);\n const options = useMemo(\n () => defineMonacoOptions({ wordWrap: isWordWrap ? 'on' : 'off' }),\n [isWordWrap],\n );\n const onEditorMount = useCallback<OnMount>(\n (editorInstance, monacoVal) => {\n editor.current = editorInstance;\n monaco.current = monacoVal;\n\n editorShowRange(editorInstance, monacoVal, ranges);\n if (Lodash.isNumber(defaultLine)) {\n setTimeout(() => {\n editorInstance.revealLine(defaultLine);\n });\n }\n\n if (formatOnMount) {\n // Use Monaco's built-in formatter to format the whole document\n setTimeout(() => {\n editorInstance.getAction('editor.action.formatDocument')?.run();\n }, 0);\n }\n },\n [ranges, defaultLine, formatOnMount],\n );\n\n const theme = isLightTheme ? 'vs-light' : 'vs-dark';\n\n useEffect(\n () => () => {\n editor.current?.setModel(null);\n },\n [],\n );\n\n return (\n <div\n className={clsx(\n 'monaco-component',\n 'code-viewer',\n styles['code-viewer'],\n isEmbed && styles['embed'],\n className,\n )}\n style={style}\n >\n {headerVisible && Boolean(filePath) && (\n <div className={styles['header']}>\n <div>{getFileName(filePath)}</div>\n <div style={{ flex: 1 }} />\n <div>\n <Checkbox\n className={styles['text']}\n title=\"side-by-side\"\n checked={isWordWrap}\n onChange={(evt) => {\n setIsWordWrap(evt.target.checked);\n }}\n >\n word-wrap\n </Checkbox>\n </div>\n </div>\n )}\n <div className={clsx(styles['content'], 'editor-wrap')}>\n <Editor\n theme={theme}\n language={language}\n value={code}\n options={options}\n onMount={onEditorMount}\n />\n </div>\n </div>\n );\n}\n\nexport type { CodeViewerProps } from './interface';\nexport { useCodeDrawer } from './useCodeDrawer';\nexport { defineMonacoOptions } from './utils';\n"],"names":["CodeViewer","className","style","code","lang","filePath","defaultLine","ranges","isEmbed","headerVisible","isLightTheme","formatOnMount","editor","useRef","monaco","language","useMemo","getFilePathFormat","isWordWrap","setIsWordWrap","useState","options","defineMonacoOptions","onEditorMount","useCallback","editorInstance","monacoVal","editorShowRange","Lodash","setTimeout","theme","useEffect","clsx","styles","Boolean","getFileName","Checkbox","evt","Editor"],"mappings":";;;;;;;;AAgBO,SAASA,WAAW,EACzBC,SAAS,EACTC,KAAK,EACLC,OAAO,EAAE,EACTC,IAAI,EACJC,WAAW,EAAE,EACbC,WAAW,EACXC,MAAM,EACNC,UAAU,KAAK,EACfC,gBAAgB,IAAI,EACpBC,eAAe,IAAI,EACnBC,gBAAgB,KAAK,EACL;IAChB,MAAMC,SAASC;IACf,MAAMC,SAASD;IACf,MAAME,WAAWC,QACf,IAAMZ,QAAQa,kBAAkBZ,aAAa,aAC7C;QAACD;QAAMC;KAAS;IAElB,MAAM,CAACa,YAAYC,cAAc,GAAGC,SAAS;IAC7C,MAAMC,UAAUL,QACd,IAAMM,oBAAoB;YAAE,UAAUJ,aAAa,OAAO;QAAM,IAChE;QAACA;KAAW;IAEd,MAAMK,gBAAgBC,YACpB,CAACC,gBAAgBC;QACfd,OAAO,OAAO,GAAGa;QACjBX,OAAO,OAAO,GAAGY;QAEjBC,gBAAgBF,gBAAgBC,WAAWnB;QAC3C,IAAIqB,OAAO,QAAQ,CAACtB,cAClBuB,WAAW;YACTJ,eAAe,UAAU,CAACnB;QAC5B;QAGF,IAAIK,eAEFkB,WAAW;YACTJ,eAAe,SAAS,CAAC,iCAAiC;QAC5D,GAAG;IAEP,GACA;QAAClB;QAAQD;QAAaK;KAAc;IAGtC,MAAMmB,QAAQpB,eAAe,aAAa;IAE1CqB,UACE,IAAM;YACJnB,OAAO,OAAO,EAAE,SAAS;QAC3B,GACA,EAAE;IAGJ,OAAO,WAAP,GACE,KAAC;QACC,WAAWoB,KACT,oBACA,eACAC,YAAAA,CAAAA,cAAqB,EACrBzB,WAAWyB,aAAAA,KAAe,EAC1BhC;QAEF,OAAOC;;YAENO,iBAAiByB,QAAQ7B,aAAa,WAAbA,GACxB,KAAC;gBAAI,WAAW4B,aAAAA,MAAgB;;kCAC9B,IAAC;kCAAKE,YAAY9B;;kCAClB,IAAC;wBAAI,OAAO;4BAAE,MAAM;wBAAE;;kCACtB,IAAC;kCACC,kBAAC+B,UAAQA;4BACP,WAAWH,aAAAA,IAAc;4BACzB,OAAM;4BACN,SAASf;4BACT,UAAU,CAACmB;gCACTlB,cAAckB,IAAI,MAAM,CAAC,OAAO;4BAClC;sCACD;;;;;0BAMP,IAAC;gBAAI,WAAWL,KAAKC,aAAAA,OAAiB,EAAE;0BACtC,kBAACK,QAAMA;oBACL,OAAOR;oBACP,UAAUf;oBACV,OAAOZ;oBACP,SAASkB;oBACT,SAASE;;;;;AAKnB"}
1
+ {"version":3,"file":"components/base/CodeViewer/index.mjs","sources":["../../../../src/components/base/CodeViewer/index.tsx"],"sourcesContent":["import { Editor, Monaco, OnMount } from '@monaco-editor/react';\nimport clsx from 'clsx';\nimport { editor } from 'monaco-editor';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { CodeViewerProps } from './interface';\nimport {\n defineMonacoOptions,\n editorShowRange,\n getFileName,\n getFilePathFormat,\n} from './utils';\n\nimport { Checkbox } from 'antd';\nimport styles from './index.module.scss';\nimport { Lodash } from '@rsdoctor/utils/common';\n\nexport function CodeViewer({\n className,\n style,\n code = '',\n lang,\n filePath = '',\n defaultLine,\n ranges,\n isEmbed = false,\n headerVisible = true,\n isLightTheme = true,\n formatOnMount = false,\n}: CodeViewerProps) {\n const editor = useRef<editor.IStandaloneCodeEditor>(undefined);\n const monaco = useRef<Monaco>(undefined);\n const language = useMemo(\n () => lang || getFilePathFormat(filePath) || 'plaintext',\n [lang, filePath],\n );\n const [isWordWrap, setIsWordWrap] = useState(true);\n const options = useMemo(\n () => defineMonacoOptions({ wordWrap: isWordWrap ? 'on' : 'off' }),\n [isWordWrap],\n );\n const onEditorMount = useCallback<OnMount>(\n (editorInstance, monacoVal) => {\n editor.current = editorInstance;\n monaco.current = monacoVal;\n\n editorShowRange(editorInstance, monacoVal, ranges);\n if (Lodash.isNumber(defaultLine)) {\n setTimeout(() => {\n editorInstance.revealLine(defaultLine);\n });\n }\n\n if (formatOnMount) {\n // Use Monaco's built-in formatter to format the whole document\n setTimeout(() => {\n editorInstance.getAction('editor.action.formatDocument')?.run();\n }, 0);\n }\n },\n [ranges, defaultLine, formatOnMount],\n );\n\n const theme = isLightTheme ? 'vs-light' : 'vs-dark';\n\n useEffect(\n () => () => {\n editor.current?.setModel(null);\n },\n [],\n );\n\n return (\n <div\n className={clsx(\n 'monaco-component',\n 'code-viewer',\n styles['code-viewer'],\n isEmbed && styles['embed'],\n className,\n )}\n style={style}\n >\n {headerVisible && Boolean(filePath) && (\n <div className={styles['header']}>\n <div>{getFileName(filePath)}</div>\n <div style={{ flex: 1 }} />\n <div>\n <Checkbox\n className={styles['text']}\n title=\"side-by-side\"\n checked={isWordWrap}\n onChange={(evt) => {\n setIsWordWrap(evt.target.checked);\n }}\n >\n word-wrap\n </Checkbox>\n </div>\n </div>\n )}\n <div className={clsx(styles['content'], 'editor-wrap')}>\n <Editor\n theme={theme}\n language={language}\n value={code}\n options={options}\n onMount={onEditorMount}\n />\n </div>\n </div>\n );\n}\n\nexport type { CodeViewerProps } from './interface';\nexport { useCodeDrawer } from './useCodeDrawer';\nexport { defineMonacoOptions } from './utils';\n"],"names":["CodeViewer","className","style","code","lang","filePath","defaultLine","ranges","isEmbed","headerVisible","isLightTheme","formatOnMount","editor","useRef","undefined","monaco","language","useMemo","getFilePathFormat","isWordWrap","setIsWordWrap","useState","options","defineMonacoOptions","onEditorMount","useCallback","editorInstance","monacoVal","editorShowRange","Lodash","setTimeout","theme","useEffect","clsx","styles","Boolean","getFileName","Checkbox","evt","Editor"],"mappings":";;;;;;;;AAgBO,SAASA,WAAW,EACzBC,SAAS,EACTC,KAAK,EACLC,OAAO,EAAE,EACTC,IAAI,EACJC,WAAW,EAAE,EACbC,WAAW,EACXC,MAAM,EACNC,UAAU,KAAK,EACfC,gBAAgB,IAAI,EACpBC,eAAe,IAAI,EACnBC,gBAAgB,KAAK,EACL;IAChB,MAAMC,SAASC,OAAqCC;IACpD,MAAMC,SAASF,OAAeC;IAC9B,MAAME,WAAWC,QACf,IAAMb,QAAQc,kBAAkBb,aAAa,aAC7C;QAACD;QAAMC;KAAS;IAElB,MAAM,CAACc,YAAYC,cAAc,GAAGC,SAAS;IAC7C,MAAMC,UAAUL,QACd,IAAMM,oBAAoB;YAAE,UAAUJ,aAAa,OAAO;QAAM,IAChE;QAACA;KAAW;IAEd,MAAMK,gBAAgBC,YACpB,CAACC,gBAAgBC;QACff,OAAO,OAAO,GAAGc;QACjBX,OAAO,OAAO,GAAGY;QAEjBC,gBAAgBF,gBAAgBC,WAAWpB;QAC3C,IAAIsB,OAAO,QAAQ,CAACvB,cAClBwB,WAAW;YACTJ,eAAe,UAAU,CAACpB;QAC5B;QAGF,IAAIK,eAEFmB,WAAW;YACTJ,eAAe,SAAS,CAAC,iCAAiC;QAC5D,GAAG;IAEP,GACA;QAACnB;QAAQD;QAAaK;KAAc;IAGtC,MAAMoB,QAAQrB,eAAe,aAAa;IAE1CsB,UACE,IAAM;YACJpB,OAAO,OAAO,EAAE,SAAS;QAC3B,GACA,EAAE;IAGJ,OAAO,WAAP,GACE,KAAC;QACC,WAAWqB,KACT,oBACA,eACAC,YAAAA,CAAAA,cAAqB,EACrB1B,WAAW0B,aAAAA,KAAe,EAC1BjC;QAEF,OAAOC;;YAENO,iBAAiB0B,QAAQ9B,aAAa,WAAbA,GACxB,KAAC;gBAAI,WAAW6B,aAAAA,MAAgB;;kCAC9B,IAAC;kCAAKE,YAAY/B;;kCAClB,IAAC;wBAAI,OAAO;4BAAE,MAAM;wBAAE;;kCACtB,IAAC;kCACC,kBAACgC,UAAQA;4BACP,WAAWH,aAAAA,IAAc;4BACzB,OAAM;4BACN,SAASf;4BACT,UAAU,CAACmB;gCACTlB,cAAckB,IAAI,MAAM,CAAC,OAAO;4BAClC;sCACD;;;;;0BAMP,IAAC;gBAAI,WAAWL,KAAKC,aAAAA,OAAiB,EAAE;0BACtC,kBAACK,QAAMA;oBACL,OAAOR;oBACP,UAAUf;oBACV,OAAOb;oBACP,SAASmB;oBACT,SAASE;;;;;AAKnB"}
@@ -8,7 +8,7 @@ import index_module from "./index.module.mjs";
8
8
  import { defineMonacoDiffOptions } from "./utils.mjs";
9
9
  function DiffViewer({ className, style, original = '', modified = '', originalFilePath = '', modifiedFilePath = '', originalLang, modifiedLang, isEmbed = false, isLightTheme = true, headerVisible = true }) {
10
10
  const [isSideBySide, setIsSideBySide] = useState(true);
11
- const editor = useRef();
11
+ const editor = useRef(void 0);
12
12
  const originalLanguage = useMemo(()=>originalLang || getFilePathFormat(originalFilePath) || 'plaintext', [
13
13
  originalLang,
14
14
  originalFilePath
@@ -1 +1 @@
1
- {"version":3,"file":"components/base/DiffViewer/index.mjs","sources":["../../../../src/components/base/DiffViewer/index.tsx"],"sourcesContent":["import { DiffEditor, MonacoDiffEditor } from '@monaco-editor/react';\nimport { Checkbox } from 'antd';\nimport clsx from 'clsx';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { getFileName, getFilePathFormat } from '../CodeViewer/utils';\nimport styles from './index.module.scss';\nimport { DiffViewerProps } from './interface';\nimport { defineMonacoDiffOptions } from './utils';\n\nexport function DiffViewer({\n className,\n style,\n original = '',\n modified = '',\n originalFilePath = '',\n modifiedFilePath = '',\n originalLang,\n modifiedLang,\n isEmbed = false,\n isLightTheme = true,\n headerVisible = true,\n}: DiffViewerProps) {\n const [isSideBySide, setIsSideBySide] = useState(true);\n const editor = useRef<MonacoDiffEditor>();\n const originalLanguage = useMemo(\n () => originalLang || getFilePathFormat(originalFilePath) || 'plaintext',\n [originalLang, originalFilePath],\n );\n const modifiedLanguage = useMemo(\n () => modifiedLang || getFilePathFormat(modifiedFilePath) || 'plaintext',\n [modifiedLang, modifiedFilePath],\n );\n const options = useMemo(\n () => defineMonacoDiffOptions({ renderSideBySide: isSideBySide }),\n [isSideBySide],\n );\n const onEditorMount = useCallback((editorInstance: MonacoDiffEditor) => {\n editor.current = editorInstance;\n }, []);\n const theme = isLightTheme ? 'vs-light' : 'vs-dark';\n\n useEffect(\n () => () => {\n editor.current?.setModel(null);\n },\n [],\n );\n\n return (\n <div\n className={clsx(\n 'monaco-component',\n 'diff-viewer',\n styles['diff-viewer'],\n isEmbed && styles['embed'],\n className,\n )}\n style={style}\n >\n {headerVisible && (\n <div className={styles['header']}>\n <div>{getFileName(originalFilePath)}</div>\n <div style={{ flex: 1 }} />\n <div>\n <Checkbox\n className={styles['text']}\n title=\"side-by-side\"\n checked={isSideBySide}\n onChange={(evt) => {\n setIsSideBySide(evt.target.checked);\n }}\n >\n side-by-side\n </Checkbox>\n </div>\n </div>\n )}\n <div className={clsx(styles['content'], 'editor-wrap')}>\n <DiffEditor\n theme={theme}\n originalLanguage={originalLanguage}\n modifiedLanguage={modifiedLanguage}\n original={original}\n modified={modified}\n width=\"100%\"\n options={options}\n onMount={onEditorMount}\n />\n </div>\n </div>\n );\n}\n\nexport type { DiffViewerProps } from './interface';\nexport { useDiffDrawer } from './useDiffDrawer';\nexport { defineMonacoDiffOptions } from './utils';\n"],"names":["DiffViewer","className","style","original","modified","originalFilePath","modifiedFilePath","originalLang","modifiedLang","isEmbed","isLightTheme","headerVisible","isSideBySide","setIsSideBySide","useState","editor","useRef","originalLanguage","useMemo","getFilePathFormat","modifiedLanguage","options","defineMonacoDiffOptions","onEditorMount","useCallback","editorInstance","theme","useEffect","clsx","styles","getFileName","Checkbox","evt","DiffEditor"],"mappings":";;;;;;;;AASO,SAASA,WAAW,EACzBC,SAAS,EACTC,KAAK,EACLC,WAAW,EAAE,EACbC,WAAW,EAAE,EACbC,mBAAmB,EAAE,EACrBC,mBAAmB,EAAE,EACrBC,YAAY,EACZC,YAAY,EACZC,UAAU,KAAK,EACfC,eAAe,IAAI,EACnBC,gBAAgB,IAAI,EACJ;IAChB,MAAM,CAACC,cAAcC,gBAAgB,GAAGC,SAAS;IACjD,MAAMC,SAASC;IACf,MAAMC,mBAAmBC,QACvB,IAAMX,gBAAgBY,kBAAkBd,qBAAqB,aAC7D;QAACE;QAAcF;KAAiB;IAElC,MAAMe,mBAAmBF,QACvB,IAAMV,gBAAgBW,kBAAkBb,qBAAqB,aAC7D;QAACE;QAAcF;KAAiB;IAElC,MAAMe,UAAUH,QACd,IAAMI,wBAAwB;YAAE,kBAAkBV;QAAa,IAC/D;QAACA;KAAa;IAEhB,MAAMW,gBAAgBC,YAAY,CAACC;QACjCV,OAAO,OAAO,GAAGU;IACnB,GAAG,EAAE;IACL,MAAMC,QAAQhB,eAAe,aAAa;IAE1CiB,UACE,IAAM;YACJZ,OAAO,OAAO,EAAE,SAAS;QAC3B,GACA,EAAE;IAGJ,OAAO,WAAP,GACE,KAAC;QACC,WAAWa,KACT,oBACA,eACAC,YAAAA,CAAAA,cAAqB,EACrBpB,WAAWoB,aAAAA,KAAe,EAC1B5B;QAEF,OAAOC;;YAENS,iBAAiB,WAAjBA,GACC,KAAC;gBAAI,WAAWkB,aAAAA,MAAgB;;kCAC9B,IAAC;kCAAKC,YAAYzB;;kCAClB,IAAC;wBAAI,OAAO;4BAAE,MAAM;wBAAE;;kCACtB,IAAC;kCACC,kBAAC0B,UAAQA;4BACP,WAAWF,aAAAA,IAAc;4BACzB,OAAM;4BACN,SAASjB;4BACT,UAAU,CAACoB;gCACTnB,gBAAgBmB,IAAI,MAAM,CAAC,OAAO;4BACpC;sCACD;;;;;0BAMP,IAAC;gBAAI,WAAWJ,KAAKC,aAAAA,OAAiB,EAAE;0BACtC,kBAACI,YAAUA;oBACT,OAAOP;oBACP,kBAAkBT;oBAClB,kBAAkBG;oBAClB,UAAUjB;oBACV,UAAUC;oBACV,OAAM;oBACN,SAASiB;oBACT,SAASE;;;;;AAKnB"}
1
+ {"version":3,"file":"components/base/DiffViewer/index.mjs","sources":["../../../../src/components/base/DiffViewer/index.tsx"],"sourcesContent":["import { DiffEditor, MonacoDiffEditor } from '@monaco-editor/react';\nimport { Checkbox } from 'antd';\nimport clsx from 'clsx';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { getFileName, getFilePathFormat } from '../CodeViewer/utils';\nimport styles from './index.module.scss';\nimport { DiffViewerProps } from './interface';\nimport { defineMonacoDiffOptions } from './utils';\n\nexport function DiffViewer({\n className,\n style,\n original = '',\n modified = '',\n originalFilePath = '',\n modifiedFilePath = '',\n originalLang,\n modifiedLang,\n isEmbed = false,\n isLightTheme = true,\n headerVisible = true,\n}: DiffViewerProps) {\n const [isSideBySide, setIsSideBySide] = useState(true);\n const editor = useRef<MonacoDiffEditor>(undefined);\n const originalLanguage = useMemo(\n () => originalLang || getFilePathFormat(originalFilePath) || 'plaintext',\n [originalLang, originalFilePath],\n );\n const modifiedLanguage = useMemo(\n () => modifiedLang || getFilePathFormat(modifiedFilePath) || 'plaintext',\n [modifiedLang, modifiedFilePath],\n );\n const options = useMemo(\n () => defineMonacoDiffOptions({ renderSideBySide: isSideBySide }),\n [isSideBySide],\n );\n const onEditorMount = useCallback((editorInstance: MonacoDiffEditor) => {\n editor.current = editorInstance;\n }, []);\n const theme = isLightTheme ? 'vs-light' : 'vs-dark';\n\n useEffect(\n () => () => {\n editor.current?.setModel(null);\n },\n [],\n );\n\n return (\n <div\n className={clsx(\n 'monaco-component',\n 'diff-viewer',\n styles['diff-viewer'],\n isEmbed && styles['embed'],\n className,\n )}\n style={style}\n >\n {headerVisible && (\n <div className={styles['header']}>\n <div>{getFileName(originalFilePath)}</div>\n <div style={{ flex: 1 }} />\n <div>\n <Checkbox\n className={styles['text']}\n title=\"side-by-side\"\n checked={isSideBySide}\n onChange={(evt) => {\n setIsSideBySide(evt.target.checked);\n }}\n >\n side-by-side\n </Checkbox>\n </div>\n </div>\n )}\n <div className={clsx(styles['content'], 'editor-wrap')}>\n <DiffEditor\n theme={theme}\n originalLanguage={originalLanguage}\n modifiedLanguage={modifiedLanguage}\n original={original}\n modified={modified}\n width=\"100%\"\n options={options}\n onMount={onEditorMount}\n />\n </div>\n </div>\n );\n}\n\nexport type { DiffViewerProps } from './interface';\nexport { useDiffDrawer } from './useDiffDrawer';\nexport { defineMonacoDiffOptions } from './utils';\n"],"names":["DiffViewer","className","style","original","modified","originalFilePath","modifiedFilePath","originalLang","modifiedLang","isEmbed","isLightTheme","headerVisible","isSideBySide","setIsSideBySide","useState","editor","useRef","undefined","originalLanguage","useMemo","getFilePathFormat","modifiedLanguage","options","defineMonacoDiffOptions","onEditorMount","useCallback","editorInstance","theme","useEffect","clsx","styles","getFileName","Checkbox","evt","DiffEditor"],"mappings":";;;;;;;;AASO,SAASA,WAAW,EACzBC,SAAS,EACTC,KAAK,EACLC,WAAW,EAAE,EACbC,WAAW,EAAE,EACbC,mBAAmB,EAAE,EACrBC,mBAAmB,EAAE,EACrBC,YAAY,EACZC,YAAY,EACZC,UAAU,KAAK,EACfC,eAAe,IAAI,EACnBC,gBAAgB,IAAI,EACJ;IAChB,MAAM,CAACC,cAAcC,gBAAgB,GAAGC,SAAS;IACjD,MAAMC,SAASC,OAAyBC;IACxC,MAAMC,mBAAmBC,QACvB,IAAMZ,gBAAgBa,kBAAkBf,qBAAqB,aAC7D;QAACE;QAAcF;KAAiB;IAElC,MAAMgB,mBAAmBF,QACvB,IAAMX,gBAAgBY,kBAAkBd,qBAAqB,aAC7D;QAACE;QAAcF;KAAiB;IAElC,MAAMgB,UAAUH,QACd,IAAMI,wBAAwB;YAAE,kBAAkBX;QAAa,IAC/D;QAACA;KAAa;IAEhB,MAAMY,gBAAgBC,YAAY,CAACC;QACjCX,OAAO,OAAO,GAAGW;IACnB,GAAG,EAAE;IACL,MAAMC,QAAQjB,eAAe,aAAa;IAE1CkB,UACE,IAAM;YACJb,OAAO,OAAO,EAAE,SAAS;QAC3B,GACA,EAAE;IAGJ,OAAO,WAAP,GACE,KAAC;QACC,WAAWc,KACT,oBACA,eACAC,YAAAA,CAAAA,cAAqB,EACrBrB,WAAWqB,aAAAA,KAAe,EAC1B7B;QAEF,OAAOC;;YAENS,iBAAiB,WAAjBA,GACC,KAAC;gBAAI,WAAWmB,aAAAA,MAAgB;;kCAC9B,IAAC;kCAAKC,YAAY1B;;kCAClB,IAAC;wBAAI,OAAO;4BAAE,MAAM;wBAAE;;kCACtB,IAAC;kCACC,kBAAC2B,UAAQA;4BACP,WAAWF,aAAAA,IAAc;4BACzB,OAAM;4BACN,SAASlB;4BACT,UAAU,CAACqB;gCACTpB,gBAAgBoB,IAAI,MAAM,CAAC,OAAO;4BACpC;sCACD;;;;;0BAMP,IAAC;gBAAI,WAAWJ,KAAKC,aAAAA,OAAiB,EAAE;0BACtC,kBAACI,YAAUA;oBACT,OAAOP;oBACP,kBAAkBT;oBAClB,kBAAkBG;oBAClB,UAAUlB;oBACV,UAAUC;oBACV,OAAM;oBACN,SAASkB;oBACT,SAASE;;;;;AAKnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"pages/ModuleAnalyze/chunks.mjs","sources":["../../../src/pages/ModuleAnalyze/chunks.tsx"],"sourcesContent":["import { SDK } from '@rsdoctor/types';\nimport { Empty, Table, Tag } from 'antd';\nimport { orderBy } from 'es-toolkit/compat';\nimport React, { useMemo } from 'react';\nimport { formatSize } from 'src/utils';\nimport './index.sass';\nimport { Lodash } from '@rsdoctor/utils/common';\n\ntype ChunksDataType = {\n key: string | number;\n name: JSX.Element;\n size: JSX.Element;\n entry: JSX.Element;\n assets: JSX.Element[];\n};\n\nconst columns = [\n {\n title: 'Chunk Name',\n dataIndex: 'name',\n key: 'name',\n },\n {\n title: 'size | 大小',\n dataIndex: 'size',\n key: 'size',\n },\n {\n title: 'assets | 资源',\n dataIndex: 'assets',\n key: 'assets',\n },\n {\n title: 'Entry or Not | 是否是入口',\n dataIndex: 'entry',\n key: 'entry',\n },\n];\n\nexport const ChunksTable: React.FC<{\n chunks: SDK.ChunkData[];\n}> = ({ chunks }) => {\n const chunksData = useMemo(() => {\n const _chunksData: (ChunksDataType | undefined)[] = chunks.map((chunk) => {\n if (!chunk) return undefined;\n return {\n key: chunk.id,\n name: <Tag>{chunk.name}</Tag>,\n size: <Tag>{formatSize(chunk.parsedSize)}</Tag>,\n entry: <Tag>{chunk.entry ? '是 | Yes' : '否 | No'}</Tag>,\n assets: chunk.assets.map((asset) => (\n <p key={asset}>\n <Tag key={asset}>{asset}</Tag>\n </p>\n )),\n };\n });\n return orderBy(Lodash.compact(_chunksData), ['size'], ['desc']);\n }, [chunks]);\n\n return (\n <>\n {chunksData?.length ? (\n <Table\n bordered\n pagination={false}\n dataSource={chunksData}\n columns={columns}\n />\n ) : (\n <Empty />\n )}\n </>\n );\n};\n"],"names":["columns","ChunksTable","chunks","chunksData","useMemo","_chunksData","chunk","Tag","formatSize","asset","orderBy","Lodash","Table","Empty"],"mappings":";;;;;;;AAgBA,MAAMA,UAAU;IACd;QACE,OAAO;QACP,WAAW;QACX,KAAK;IACP;IACA;QACE,OAAO;QACP,WAAW;QACX,KAAK;IACP;IACA;QACE,OAAO;QACP,WAAW;QACX,KAAK;IACP;IACA;QACE,OAAO;QACP,WAAW;QACX,KAAK;IACP;CACD;AAEM,MAAMC,cAER,CAAC,EAAEC,MAAM,EAAE;IACd,MAAMC,aAAaC,QAAQ;QACzB,MAAMC,cAA8CH,OAAO,GAAG,CAAC,CAACI;YAC9D,IAAI,CAACA,OAAO;YACZ,OAAO;gBACL,KAAKA,MAAM,EAAE;gBACb,MAAM,WAAN,GAAM,IAACC,KAAGA;8BAAED,MAAM,IAAI;;gBACtB,MAAM,WAAN,GAAM,IAACC,KAAGA;8BAAEC,WAAWF,MAAM,UAAU;;gBACvC,OAAO,WAAP,GAAO,IAACC,KAAGA;8BAAED,MAAM,KAAK,GAAG,YAAY;;gBACvC,QAAQA,MAAM,MAAM,CAAC,GAAG,CAAC,CAACG,QAAAA,WAAAA,GACxB,IAAC;kCACC,kBAACF,KAAGA;sCAAcE;2BAARA;uBADJA;YAIZ;QACF;QACA,OAAOC,QAAQC,OAAO,OAAO,CAACN,cAAc;YAAC;SAAO,EAAE;YAAC;SAAO;IAChE,GAAG;QAACH;KAAO;IAEX,OAAO,WAAP,GACE;kBACGC,YAAY,SAAS,WAAT,GACX,IAACS,OAAKA;YACJ,UAAQ;YACR,YAAY;YACZ,YAAYT;YACZ,SAASH;2BAGX,IAACa,OAAKA,CAAAA;;AAId"}
1
+ {"version":3,"file":"pages/ModuleAnalyze/chunks.mjs","sources":["../../../src/pages/ModuleAnalyze/chunks.tsx"],"sourcesContent":["import { SDK } from '@rsdoctor/types';\nimport { Empty, Table, Tag } from 'antd';\nimport { orderBy } from 'es-toolkit/compat';\nimport React, { useMemo } from 'react';\nimport { formatSize } from 'src/utils';\nimport './index.sass';\nimport { Lodash } from '@rsdoctor/utils/common';\n\ntype ChunksDataType = {\n key: string | number;\n name: React.JSX.Element;\n size: React.JSX.Element;\n entry: React.JSX.Element;\n assets: React.JSX.Element[];\n};\n\nconst columns = [\n {\n title: 'Chunk Name',\n dataIndex: 'name',\n key: 'name',\n },\n {\n title: 'size | 大小',\n dataIndex: 'size',\n key: 'size',\n },\n {\n title: 'assets | 资源',\n dataIndex: 'assets',\n key: 'assets',\n },\n {\n title: 'Entry or Not | 是否是入口',\n dataIndex: 'entry',\n key: 'entry',\n },\n];\n\nexport const ChunksTable: React.FC<{\n chunks: SDK.ChunkData[];\n}> = ({ chunks }) => {\n const chunksData = useMemo(() => {\n const _chunksData: (ChunksDataType | undefined)[] = chunks.map((chunk) => {\n if (!chunk) return undefined;\n return {\n key: chunk.id,\n name: <Tag>{chunk.name}</Tag>,\n size: <Tag>{formatSize(chunk.parsedSize)}</Tag>,\n entry: <Tag>{chunk.entry ? '是 | Yes' : '否 | No'}</Tag>,\n assets: chunk.assets.map((asset) => (\n <p key={asset}>\n <Tag key={asset}>{asset}</Tag>\n </p>\n )),\n };\n });\n return orderBy(Lodash.compact(_chunksData), ['size'], ['desc']);\n }, [chunks]);\n\n return (\n <>\n {chunksData?.length ? (\n <Table\n bordered\n pagination={false}\n dataSource={chunksData}\n columns={columns}\n />\n ) : (\n <Empty />\n )}\n </>\n );\n};\n"],"names":["columns","ChunksTable","chunks","chunksData","useMemo","_chunksData","chunk","Tag","formatSize","asset","orderBy","Lodash","Table","Empty"],"mappings":";;;;;;;AAgBA,MAAMA,UAAU;IACd;QACE,OAAO;QACP,WAAW;QACX,KAAK;IACP;IACA;QACE,OAAO;QACP,WAAW;QACX,KAAK;IACP;IACA;QACE,OAAO;QACP,WAAW;QACX,KAAK;IACP;IACA;QACE,OAAO;QACP,WAAW;QACX,KAAK;IACP;CACD;AAEM,MAAMC,cAER,CAAC,EAAEC,MAAM,EAAE;IACd,MAAMC,aAAaC,QAAQ;QACzB,MAAMC,cAA8CH,OAAO,GAAG,CAAC,CAACI;YAC9D,IAAI,CAACA,OAAO;YACZ,OAAO;gBACL,KAAKA,MAAM,EAAE;gBACb,MAAM,WAAN,GAAM,IAACC,KAAGA;8BAAED,MAAM,IAAI;;gBACtB,MAAM,WAAN,GAAM,IAACC,KAAGA;8BAAEC,WAAWF,MAAM,UAAU;;gBACvC,OAAO,WAAP,GAAO,IAACC,KAAGA;8BAAED,MAAM,KAAK,GAAG,YAAY;;gBACvC,QAAQA,MAAM,MAAM,CAAC,GAAG,CAAC,CAACG,QAAAA,WAAAA,GACxB,IAAC;kCACC,kBAACF,KAAGA;sCAAcE;2BAARA;uBADJA;YAIZ;QACF;QACA,OAAOC,QAAQC,OAAO,OAAO,CAACN,cAAc;YAAC;SAAO,EAAE;YAAC;SAAO;IAChE,GAAG;QAACH;KAAO;IAEX,OAAO,WAAP,GACE;kBACGC,YAAY,SAAS,WAAT,GACX,IAACS,OAAKA;YACJ,UAAQ;YACR,YAAY;YACZ,YAAYT;YACZ,SAASH;2BAGX,IAACa,OAAKA,CAAAA;;AAId"}
@@ -4,7 +4,7 @@ import { InferServerAPIBody } from '../../../../components/Manifest/api.js';
4
4
  export type BundleDiffServerAPIProviderComponentCommonProps<T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends> = {
5
5
  manifests?: Manifest.RsdoctorManifest[];
6
6
  api: T;
7
- children: (baseline: SDK.ServerAPI.InferResponseType<T>, current: SDK.ServerAPI.InferResponseType<T>) => JSX.Element;
7
+ children: (baseline: SDK.ServerAPI.InferResponseType<T>, current: SDK.ServerAPI.InferResponseType<T>) => React.JSX.Element;
8
8
  } & InferServerAPIBody<T>;
9
9
  export interface BundleDiffContainerProps {
10
10
  manifests: Manifest.RsdoctorManifest[];
@@ -1,3 +1,3 @@
1
1
  import { SDK } from '@rsdoctor/types';
2
2
  import { BundleDiffServerAPIProviderComponentCommonProps } from '../DiffContainer/types.js';
3
- export declare const DiffServerAPIProvider: <T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends>(props: BundleDiffServerAPIProviderComponentCommonProps<T>) => JSX.Element;
3
+ export declare const DiffServerAPIProvider: <T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends>(props: BundleDiffServerAPIProviderComponentCommonProps<T>) => React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"pages/Resources/BundleDiff/DiffServerAPIProvider/index.mjs","sources":["../../../../../src/pages/Resources/BundleDiff/DiffServerAPIProvider/index.tsx"],"sourcesContent":["import { Client, SDK, Constants } from '@rsdoctor/types';\nimport { ServerAPIProvider } from 'src/components/Manifest';\nimport { fetchManifest, useUrlQuery } from 'src/utils';\nimport { Algorithm } from '@rsdoctor/utils/common';\nimport { BundleDiffServerAPIProviderComponentCommonProps } from '../DiffContainer/types';\n\nexport const DiffServerAPIProvider = <\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n>(\n props: BundleDiffServerAPIProviderComponentCommonProps<T>,\n): JSX.Element => {\n const { api, body, children, manifests } = props;\n const query = useUrlQuery();\n\n const windowData = (window as any)[Constants.WINDOW_RSDOCTOR_TAG];\n if (windowData?.baseline && windowData?.current) {\n const baseline = JSON.parse(Algorithm.decompressText(windowData.baseline));\n const current = JSON.parse(Algorithm.decompressText(windowData.current));\n return <>{children(baseline, current)}</>;\n }\n\n if (manifests?.length) {\n return <>{children(manifests[0].data as any, manifests[1].data as any)}</>;\n }\n\n const [baselineFile, currentFile] =\n query[Client.RsdoctorClientUrlQuery.BundleDiffFiles]?.split(',') || [];\n\n return (\n <ServerAPIProvider\n api={api}\n body={body}\n manifestLoader={\n baselineFile ? () => fetchManifest(baselineFile) : undefined\n }\n >\n {(baseline) => {\n return (\n <ServerAPIProvider\n api={api}\n body={body}\n manifestLoader={\n currentFile ? () => fetchManifest(currentFile) : undefined\n }\n >\n {(current) => {\n return children(baseline, current);\n }}\n </ServerAPIProvider>\n );\n }}\n </ServerAPIProvider>\n );\n};\n"],"names":["DiffServerAPIProvider","props","api","body","children","manifests","query","useUrlQuery","windowData","window","Constants","baseline","JSON","Algorithm","current","baselineFile","currentFile","Client","ServerAPIProvider","fetchManifest","undefined"],"mappings":";;;;;AAMO,MAAMA,wBAAwB,CAGnCC;IAEA,MAAM,EAAEC,GAAG,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,SAAS,EAAE,GAAGJ;IAC3C,MAAMK,QAAQC;IAEd,MAAMC,aAAcC,MAAc,CAACC,UAAU,mBAAmB,CAAC;IACjE,IAAIF,YAAY,YAAYA,YAAY,SAAS;QAC/C,MAAMG,WAAWC,KAAK,KAAK,CAACC,UAAU,cAAc,CAACL,WAAW,QAAQ;QACxE,MAAMM,UAAUF,KAAK,KAAK,CAACC,UAAU,cAAc,CAACL,WAAW,OAAO;QACtE,OAAO,WAAP,GAAO;sBAAGJ,SAASO,UAAUG;;IAC/B;IAEA,IAAIT,WAAW,QACb,OAAO,WAAP,GAAO;kBAAGD,SAASC,SAAS,CAAC,EAAE,CAAC,IAAI,EAASA,SAAS,CAAC,EAAE,CAAC,IAAI;;IAGhE,MAAM,CAACU,cAAcC,YAAY,GAC/BV,KAAK,CAACW,OAAO,sBAAsB,CAAC,eAAe,CAAC,EAAE,MAAM,QAAQ,EAAE;IAExE,OAAO,WAAP,GACE,IAACC,mBAAiBA;QAChB,KAAKhB;QACL,MAAMC;QACN,gBACEY,eAAe,IAAMI,cAAcJ,gBAAgBK;kBAGpD,CAACT,WACO,WAAP,GACE,IAACO,mBAAiBA;gBAChB,KAAKhB;gBACL,MAAMC;gBACN,gBACEa,cAAc,IAAMG,cAAcH,eAAeI;0BAGlD,CAACN,UACOV,SAASO,UAAUG;;;AAOxC"}
1
+ {"version":3,"file":"pages/Resources/BundleDiff/DiffServerAPIProvider/index.mjs","sources":["../../../../../src/pages/Resources/BundleDiff/DiffServerAPIProvider/index.tsx"],"sourcesContent":["import { Client, SDK, Constants } from '@rsdoctor/types';\nimport { ServerAPIProvider } from 'src/components/Manifest';\nimport { fetchManifest, useUrlQuery } from 'src/utils';\nimport { Algorithm } from '@rsdoctor/utils/common';\nimport { BundleDiffServerAPIProviderComponentCommonProps } from '../DiffContainer/types';\n\nexport const DiffServerAPIProvider = <\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n>(\n props: BundleDiffServerAPIProviderComponentCommonProps<T>,\n): React.JSX.Element => {\n const { api, body, children, manifests } = props;\n const query = useUrlQuery();\n\n const windowData = (window as any)[Constants.WINDOW_RSDOCTOR_TAG];\n if (windowData?.baseline && windowData?.current) {\n const baseline = JSON.parse(Algorithm.decompressText(windowData.baseline));\n const current = JSON.parse(Algorithm.decompressText(windowData.current));\n return <>{children(baseline, current)}</>;\n }\n\n if (manifests?.length) {\n return <>{children(manifests[0].data as any, manifests[1].data as any)}</>;\n }\n\n const [baselineFile, currentFile] =\n query[Client.RsdoctorClientUrlQuery.BundleDiffFiles]?.split(',') || [];\n\n return (\n <ServerAPIProvider\n api={api}\n body={body}\n manifestLoader={\n baselineFile ? () => fetchManifest(baselineFile) : undefined\n }\n >\n {(baseline) => {\n return (\n <ServerAPIProvider\n api={api}\n body={body}\n manifestLoader={\n currentFile ? () => fetchManifest(currentFile) : undefined\n }\n >\n {(current) => {\n return children(baseline, current);\n }}\n </ServerAPIProvider>\n );\n }}\n </ServerAPIProvider>\n );\n};\n"],"names":["DiffServerAPIProvider","props","api","body","children","manifests","query","useUrlQuery","windowData","window","Constants","baseline","JSON","Algorithm","current","baselineFile","currentFile","Client","ServerAPIProvider","fetchManifest","undefined"],"mappings":";;;;;AAMO,MAAMA,wBAAwB,CAGnCC;IAEA,MAAM,EAAEC,GAAG,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,SAAS,EAAE,GAAGJ;IAC3C,MAAMK,QAAQC;IAEd,MAAMC,aAAcC,MAAc,CAACC,UAAU,mBAAmB,CAAC;IACjE,IAAIF,YAAY,YAAYA,YAAY,SAAS;QAC/C,MAAMG,WAAWC,KAAK,KAAK,CAACC,UAAU,cAAc,CAACL,WAAW,QAAQ;QACxE,MAAMM,UAAUF,KAAK,KAAK,CAACC,UAAU,cAAc,CAACL,WAAW,OAAO;QACtE,OAAO,WAAP,GAAO;sBAAGJ,SAASO,UAAUG;;IAC/B;IAEA,IAAIT,WAAW,QACb,OAAO,WAAP,GAAO;kBAAGD,SAASC,SAAS,CAAC,EAAE,CAAC,IAAI,EAASA,SAAS,CAAC,EAAE,CAAC,IAAI;;IAGhE,MAAM,CAACU,cAAcC,YAAY,GAC/BV,KAAK,CAACW,OAAO,sBAAsB,CAAC,eAAe,CAAC,EAAE,MAAM,QAAQ,EAAE;IAExE,OAAO,WAAP,GACE,IAACC,mBAAiBA;QAChB,KAAKhB;QACL,MAAMC;QACN,gBACEY,eAAe,IAAMI,cAAcJ,gBAAgBK;kBAGpD,CAACT,WACO,WAAP,GACE,IAACO,mBAAiBA;gBAChB,KAAKhB;gBACL,MAAMC;gBACN,gBACEa,cAAc,IAAMG,cAAcH,eAAeI;0BAGlD,CAACN,UACOV,SAASO,UAAUG;;;AAOxC"}
@@ -11,10 +11,10 @@ import { getHoverMessageInModule } from "./utils.mjs";
11
11
  const defaultEditOption = defineMonacoOptions();
12
12
  function CodeEditor(props) {
13
13
  const { module, moduleGraph, ranges, toLine, setEditorData, source } = props;
14
- const editorRef = useRef();
14
+ const editorRef = useRef(void 0);
15
15
  const oldRanges = useRef([]);
16
16
  const oldHovers = useRef([]);
17
- const oldToLine = useRef();
17
+ const oldToLine = useRef(void 0);
18
18
  const changeModule = useRef(false);
19
19
  const [content, setContent] = useState('');
20
20
  useEffect(()=>{
@@ -1 +1 @@
1
- {"version":3,"file":"pages/TreeShaking/editor.mjs","sources":["../../../src/pages/TreeShaking/editor.tsx"],"sourcesContent":["import { InfoCircleOutlined, LoadingOutlined } from '@ant-design/icons';\nimport Editor, { OnMount } from '@monaco-editor/react';\nimport { SDK } from '@rsdoctor/types';\nimport { Card, Space, Tooltip, Typography } from 'antd';\nimport type { editor, Range as RangeClass } from 'monaco-editor';\nimport path from 'path-browserify';\nimport { useEffect, useRef, useState } from 'react';\nimport {\n defineMonacoOptions,\n getFilePathFormat,\n getSelectionRange,\n} from 'src/components/base/CodeViewer/utils';\nimport { parseOpenTag } from './open-tag';\nimport { Range } from './range';\nimport { SetEditorStatus } from './types';\nimport { getHoverMessageInModule } from './utils';\n\nexport interface CodeEditorProps {\n module: SDK.ModuleInstance;\n moduleGraph: SDK.ModuleGraphInstance;\n ranges: SDK.SourceRange[];\n setEditorData: SetEditorStatus;\n source: SDK.ModuleSource;\n toLine?: number;\n}\n\nconst defaultEditOption = defineMonacoOptions();\n\nexport function CodeEditor(props: CodeEditorProps) {\n const { module, moduleGraph, ranges, toLine, setEditorData, source } = props;\n const editorRef = useRef<editor.IStandaloneCodeEditor>();\n const oldRanges = useRef<string[]>([]);\n const oldHovers = useRef<string[]>([]);\n const oldToLine = useRef<number>();\n const changeModule = useRef(false);\n const [content, setContent] = useState('');\n // const [isDynamic, setIsDynamic] = useState(false);\n // const [exports, setExports] = useState<SDK.ExportData[]>([]);\n\n useEffect(() => {\n const { isPreferSource } = module;\n changeModule.current = true;\n setContent(\n source.source || isPreferSource ? source.source : source.transformed,\n );\n setTimeout(() => {\n oldHovers.current =\n editorRef.current\n ?.getModel()\n ?.deltaDecorations(\n oldHovers.current,\n getHoverMessageInModule(module, moduleGraph),\n ) ?? [];\n }, 200);\n }, [module, source]);\n\n useEffect(() => {\n function setRangeAndLine() {\n const model = editorRef.current?.getModel();\n\n if (!model) {\n return;\n }\n\n oldRanges.current = model.deltaDecorations(\n oldRanges.current,\n ranges.map((arr) => {\n return {\n range: getSelectionRange(\n arr,\n Range as unknown as typeof RangeClass,\n ),\n options: {\n stickiness: 1,\n inlineClassName: 'tree-shaking-statement-side-effect',\n isWholeLine: false,\n showIfCollapsed: true,\n },\n } as unknown as editor.IModelDecoration;\n }),\n );\n\n if (\n editorRef.current &&\n typeof toLine === 'number' &&\n oldToLine.current !== toLine\n ) {\n oldToLine.current = toLine;\n editorRef.current.revealLine(toLine, 0);\n }\n }\n\n // 模块变更时,高亮和滚动需要等待 300ms,确保在文本变更之后\n if (changeModule) {\n setTimeout(setRangeAndLine, 300);\n } else {\n setRangeAndLine();\n }\n\n changeModule.current = false;\n }, [ranges, toLine]);\n\n useEffect(() => {\n const openEditor = (event: MouseEvent) => {\n const query = parseOpenTag(event.target as HTMLElement);\n\n if (query) {\n const module = moduleGraph.getModuleById(query.module);\n\n if (module) {\n setEditorData(module, [query.range], query.range.start.line);\n }\n }\n };\n\n document.body.addEventListener('click', openEditor);\n\n return () => {\n document.body.removeEventListener('click', openEditor);\n };\n }, []);\n\n if (!module) {\n return <div>请选择要查看的模块</div>;\n }\n\n const handleEditorDidMount: OnMount = (editor) => {\n editorRef.current = editor;\n };\n\n return (\n <Card\n title={\n <Tooltip title={module.path}>\n <Space>\n <Typography.Text>{path.basename(module.path)}</Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n }\n className=\"tree-shaking-editor\"\n >\n {/* TODO: change to CodeViewer */}\n <Editor\n theme=\"vs-dark\"\n language={getFilePathFormat(module.path)}\n value={content}\n loading={<LoadingOutlined style={{ fontSize: 30 }} />}\n options={defaultEditOption}\n onMount={handleEditorDidMount}\n />\n </Card>\n );\n}\n"],"names":["defaultEditOption","defineMonacoOptions","CodeEditor","props","module","moduleGraph","ranges","toLine","setEditorData","source","editorRef","useRef","oldRanges","oldHovers","oldToLine","changeModule","content","setContent","useState","useEffect","isPreferSource","setTimeout","getHoverMessageInModule","setRangeAndLine","model","arr","getSelectionRange","Range","openEditor","event","query","parseOpenTag","document","handleEditorDidMount","editor","Card","Tooltip","Space","Typography","path","InfoCircleOutlined","Editor","getFilePathFormat","LoadingOutlined"],"mappings":";;;;;;;;;;AA0BA,MAAMA,oBAAoBC;AAEnB,SAASC,WAAWC,KAAsB;IAC/C,MAAM,EAAEC,MAAM,EAAEC,WAAW,EAAEC,MAAM,EAAEC,MAAM,EAAEC,aAAa,EAAEC,MAAM,EAAE,GAAGN;IACvE,MAAMO,YAAYC;IAClB,MAAMC,YAAYD,OAAiB,EAAE;IACrC,MAAME,YAAYF,OAAiB,EAAE;IACrC,MAAMG,YAAYH;IAClB,MAAMI,eAAeJ,OAAO;IAC5B,MAAM,CAACK,SAASC,WAAW,GAAGC,SAAS;IAIvCC,UAAU;QACR,MAAM,EAAEC,cAAc,EAAE,GAAGhB;QAC3BW,aAAa,OAAO,GAAG;QACvBE,WACER,OAAO,MAAM,IAAIW,iBAAiBX,OAAO,MAAM,GAAGA,OAAO,WAAW;QAEtEY,WAAW;YACTR,UAAU,OAAO,GACfH,UAAU,OAAO,EACb,YACA,iBACAG,UAAU,OAAO,EACjBS,wBAAwBlB,QAAQC,iBAC7B,EAAE;QACb,GAAG;IACL,GAAG;QAACD;QAAQK;KAAO;IAEnBU,UAAU;QACR,SAASI;YACP,MAAMC,QAAQd,UAAU,OAAO,EAAE;YAEjC,IAAI,CAACc,OACH;YAGFZ,UAAU,OAAO,GAAGY,MAAM,gBAAgB,CACxCZ,UAAU,OAAO,EACjBN,OAAO,GAAG,CAAC,CAACmB,MACH;oBACL,OAAOC,kBACLD,KACAE;oBAEF,SAAS;wBACP,YAAY;wBACZ,iBAAiB;wBACjB,aAAa;wBACb,iBAAiB;oBACnB;gBACF;YAIJ,IACEjB,UAAU,OAAO,IACjB,AAAkB,YAAlB,OAAOH,UACPO,UAAU,OAAO,KAAKP,QACtB;gBACAO,UAAU,OAAO,GAAGP;gBACpBG,UAAU,OAAO,CAAC,UAAU,CAACH,QAAQ;YACvC;QACF;QAGA,IAAIQ,cACFM,WAAWE,iBAAiB;aAE5BA;QAGFR,aAAa,OAAO,GAAG;IACzB,GAAG;QAACT;QAAQC;KAAO;IAEnBY,UAAU;QACR,MAAMS,aAAa,CAACC;YAClB,MAAMC,QAAQC,aAAaF,MAAM,MAAM;YAEvC,IAAIC,OAAO;gBACT,MAAM1B,SAASC,YAAY,aAAa,CAACyB,MAAM,MAAM;gBAErD,IAAI1B,QACFI,cAAcJ,QAAQ;oBAAC0B,MAAM,KAAK;iBAAC,EAAEA,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI;YAE/D;QACF;QAEAE,SAAS,IAAI,CAAC,gBAAgB,CAAC,SAASJ;QAExC,OAAO;YACLI,SAAS,IAAI,CAAC,mBAAmB,CAAC,SAASJ;QAC7C;IACF,GAAG,EAAE;IAEL,IAAI,CAACxB,QACH,OAAO,WAAP,GAAO,IAAC;kBAAI;;IAGd,MAAM6B,uBAAgC,CAACC;QACrCxB,UAAU,OAAO,GAAGwB;IACtB;IAEA,OAAO,WAAP,GACE,IAACC,MAAIA;QACH,qBACE,IAACC,SAAOA;YAAC,OAAOhC,OAAO,IAAI;sBACzB,mBAACiC,OAAKA;;kCACJ,IAACC,WAAW,IAAI;kCAAEC,gBAAAA,QAAa,CAACnC,OAAO,IAAI;;kCAC3C,IAACoC,oBAAkBA,CAAAA;;;;QAIzB,WAAU;kBAGV,kBAACC,OAAMA;YACL,OAAM;YACN,UAAUC,kBAAkBtC,OAAO,IAAI;YACvC,OAAOY;YACP,uBAAS,IAAC2B,iBAAeA;gBAAC,OAAO;oBAAE,UAAU;gBAAG;;YAChD,SAAS3C;YACT,SAASiC;;;AAIjB"}
1
+ {"version":3,"file":"pages/TreeShaking/editor.mjs","sources":["../../../src/pages/TreeShaking/editor.tsx"],"sourcesContent":["import { InfoCircleOutlined, LoadingOutlined } from '@ant-design/icons';\nimport Editor, { OnMount } from '@monaco-editor/react';\nimport { SDK } from '@rsdoctor/types';\nimport { Card, Space, Tooltip, Typography } from 'antd';\nimport type { editor, Range as RangeClass } from 'monaco-editor';\nimport path from 'path-browserify';\nimport { useEffect, useRef, useState } from 'react';\nimport {\n defineMonacoOptions,\n getFilePathFormat,\n getSelectionRange,\n} from 'src/components/base/CodeViewer/utils';\nimport { parseOpenTag } from './open-tag';\nimport { Range } from './range';\nimport { SetEditorStatus } from './types';\nimport { getHoverMessageInModule } from './utils';\n\nexport interface CodeEditorProps {\n module: SDK.ModuleInstance;\n moduleGraph: SDK.ModuleGraphInstance;\n ranges: SDK.SourceRange[];\n setEditorData: SetEditorStatus;\n source: SDK.ModuleSource;\n toLine?: number;\n}\n\nconst defaultEditOption = defineMonacoOptions();\n\nexport function CodeEditor(props: CodeEditorProps) {\n const { module, moduleGraph, ranges, toLine, setEditorData, source } = props;\n const editorRef = useRef<editor.IStandaloneCodeEditor>(undefined);\n const oldRanges = useRef<string[]>([]);\n const oldHovers = useRef<string[]>([]);\n const oldToLine = useRef<number>(undefined);\n const changeModule = useRef(false);\n const [content, setContent] = useState('');\n // const [isDynamic, setIsDynamic] = useState(false);\n // const [exports, setExports] = useState<SDK.ExportData[]>([]);\n\n useEffect(() => {\n const { isPreferSource } = module;\n changeModule.current = true;\n setContent(\n source.source || isPreferSource ? source.source : source.transformed,\n );\n setTimeout(() => {\n oldHovers.current =\n editorRef.current\n ?.getModel()\n ?.deltaDecorations(\n oldHovers.current,\n getHoverMessageInModule(module, moduleGraph),\n ) ?? [];\n }, 200);\n }, [module, source]);\n\n useEffect(() => {\n function setRangeAndLine() {\n const model = editorRef.current?.getModel();\n\n if (!model) {\n return;\n }\n\n oldRanges.current = model.deltaDecorations(\n oldRanges.current,\n ranges.map((arr) => {\n return {\n range: getSelectionRange(\n arr,\n Range as unknown as typeof RangeClass,\n ),\n options: {\n stickiness: 1,\n inlineClassName: 'tree-shaking-statement-side-effect',\n isWholeLine: false,\n showIfCollapsed: true,\n },\n } as unknown as editor.IModelDecoration;\n }),\n );\n\n if (\n editorRef.current &&\n typeof toLine === 'number' &&\n oldToLine.current !== toLine\n ) {\n oldToLine.current = toLine;\n editorRef.current.revealLine(toLine, 0);\n }\n }\n\n // 模块变更时,高亮和滚动需要等待 300ms,确保在文本变更之后\n if (changeModule) {\n setTimeout(setRangeAndLine, 300);\n } else {\n setRangeAndLine();\n }\n\n changeModule.current = false;\n }, [ranges, toLine]);\n\n useEffect(() => {\n const openEditor = (event: MouseEvent) => {\n const query = parseOpenTag(event.target as HTMLElement);\n\n if (query) {\n const module = moduleGraph.getModuleById(query.module);\n\n if (module) {\n setEditorData(module, [query.range], query.range.start.line);\n }\n }\n };\n\n document.body.addEventListener('click', openEditor);\n\n return () => {\n document.body.removeEventListener('click', openEditor);\n };\n }, []);\n\n if (!module) {\n return <div>请选择要查看的模块</div>;\n }\n\n const handleEditorDidMount: OnMount = (editor) => {\n editorRef.current = editor;\n };\n\n return (\n <Card\n title={\n <Tooltip title={module.path}>\n <Space>\n <Typography.Text>{path.basename(module.path)}</Typography.Text>\n <InfoCircleOutlined />\n </Space>\n </Tooltip>\n }\n className=\"tree-shaking-editor\"\n >\n {/* TODO: change to CodeViewer */}\n <Editor\n theme=\"vs-dark\"\n language={getFilePathFormat(module.path)}\n value={content}\n loading={<LoadingOutlined style={{ fontSize: 30 }} />}\n options={defaultEditOption}\n onMount={handleEditorDidMount}\n />\n </Card>\n );\n}\n"],"names":["defaultEditOption","defineMonacoOptions","CodeEditor","props","module","moduleGraph","ranges","toLine","setEditorData","source","editorRef","useRef","undefined","oldRanges","oldHovers","oldToLine","changeModule","content","setContent","useState","useEffect","isPreferSource","setTimeout","getHoverMessageInModule","setRangeAndLine","model","arr","getSelectionRange","Range","openEditor","event","query","parseOpenTag","document","handleEditorDidMount","editor","Card","Tooltip","Space","Typography","path","InfoCircleOutlined","Editor","getFilePathFormat","LoadingOutlined"],"mappings":";;;;;;;;;;AA0BA,MAAMA,oBAAoBC;AAEnB,SAASC,WAAWC,KAAsB;IAC/C,MAAM,EAAEC,MAAM,EAAEC,WAAW,EAAEC,MAAM,EAAEC,MAAM,EAAEC,aAAa,EAAEC,MAAM,EAAE,GAAGN;IACvE,MAAMO,YAAYC,OAAqCC;IACvD,MAAMC,YAAYF,OAAiB,EAAE;IACrC,MAAMG,YAAYH,OAAiB,EAAE;IACrC,MAAMI,YAAYJ,OAAeC;IACjC,MAAMI,eAAeL,OAAO;IAC5B,MAAM,CAACM,SAASC,WAAW,GAAGC,SAAS;IAIvCC,UAAU;QACR,MAAM,EAAEC,cAAc,EAAE,GAAGjB;QAC3BY,aAAa,OAAO,GAAG;QACvBE,WACET,OAAO,MAAM,IAAIY,iBAAiBZ,OAAO,MAAM,GAAGA,OAAO,WAAW;QAEtEa,WAAW;YACTR,UAAU,OAAO,GACfJ,UAAU,OAAO,EACb,YACA,iBACAI,UAAU,OAAO,EACjBS,wBAAwBnB,QAAQC,iBAC7B,EAAE;QACb,GAAG;IACL,GAAG;QAACD;QAAQK;KAAO;IAEnBW,UAAU;QACR,SAASI;YACP,MAAMC,QAAQf,UAAU,OAAO,EAAE;YAEjC,IAAI,CAACe,OACH;YAGFZ,UAAU,OAAO,GAAGY,MAAM,gBAAgB,CACxCZ,UAAU,OAAO,EACjBP,OAAO,GAAG,CAAC,CAACoB,MACH;oBACL,OAAOC,kBACLD,KACAE;oBAEF,SAAS;wBACP,YAAY;wBACZ,iBAAiB;wBACjB,aAAa;wBACb,iBAAiB;oBACnB;gBACF;YAIJ,IACElB,UAAU,OAAO,IACjB,AAAkB,YAAlB,OAAOH,UACPQ,UAAU,OAAO,KAAKR,QACtB;gBACAQ,UAAU,OAAO,GAAGR;gBACpBG,UAAU,OAAO,CAAC,UAAU,CAACH,QAAQ;YACvC;QACF;QAGA,IAAIS,cACFM,WAAWE,iBAAiB;aAE5BA;QAGFR,aAAa,OAAO,GAAG;IACzB,GAAG;QAACV;QAAQC;KAAO;IAEnBa,UAAU;QACR,MAAMS,aAAa,CAACC;YAClB,MAAMC,QAAQC,aAAaF,MAAM,MAAM;YAEvC,IAAIC,OAAO;gBACT,MAAM3B,SAASC,YAAY,aAAa,CAAC0B,MAAM,MAAM;gBAErD,IAAI3B,QACFI,cAAcJ,QAAQ;oBAAC2B,MAAM,KAAK;iBAAC,EAAEA,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI;YAE/D;QACF;QAEAE,SAAS,IAAI,CAAC,gBAAgB,CAAC,SAASJ;QAExC,OAAO;YACLI,SAAS,IAAI,CAAC,mBAAmB,CAAC,SAASJ;QAC7C;IACF,GAAG,EAAE;IAEL,IAAI,CAACzB,QACH,OAAO,WAAP,GAAO,IAAC;kBAAI;;IAGd,MAAM8B,uBAAgC,CAACC;QACrCzB,UAAU,OAAO,GAAGyB;IACtB;IAEA,OAAO,WAAP,GACE,IAACC,MAAIA;QACH,qBACE,IAACC,SAAOA;YAAC,OAAOjC,OAAO,IAAI;sBACzB,mBAACkC,OAAKA;;kCACJ,IAACC,WAAW,IAAI;kCAAEC,gBAAAA,QAAa,CAACpC,OAAO,IAAI;;kCAC3C,IAACqC,oBAAkBA,CAAAA;;;;QAIzB,WAAU;kBAGV,kBAACC,OAAMA;YACL,OAAM;YACN,UAAUC,kBAAkBvC,OAAO,IAAI;YACvC,OAAOa;YACP,uBAAS,IAAC2B,iBAAeA;gBAAC,OAAO;oBAAE,UAAU;gBAAG;;YAChD,SAAS5C;YACT,SAASkC;;;AAIjB"}
@@ -11,13 +11,13 @@ export type DataNode = FieldDataNode<{
11
11
  };
12
12
  export declare const rootDirname: (file: string, sep?: string) => string | null;
13
13
  export declare function mapFileKey(arr: DataNode[], depth?: number, filter?: (node: DataNode) => boolean): DataNode['key'][];
14
- export declare function flattenDirectory(n: DataNode, parent: DataNode, sep: string | undefined, inlinedResourcePathKey: keyof DataNode, dirTitle?: (_dir: DataNode, defaultTitle: string) => JSX.Element | string): void;
14
+ export declare function flattenDirectory(n: DataNode, parent: DataNode, sep: string | undefined, inlinedResourcePathKey: keyof DataNode, dirTitle?: (_dir: DataNode, defaultTitle: string) => React.JSX.Element | string): void;
15
15
  export declare function createFileStructures({ files, inlinedResourcePathKey, fileTitle, dirTitle, page, }: {
16
16
  files: string[];
17
17
  cwd?: string;
18
18
  inlinedResourcePathKey?: keyof DataNode;
19
- dirTitle?(dir: DataNode, defaultTitle: string): JSX.Element | string;
20
- fileTitle?(file: string, basename: string): JSX.Element | string;
19
+ dirTitle?(dir: DataNode, defaultTitle: string): React.JSX.Element | string;
20
+ fileTitle?(file: string, basename: string): React.JSX.Element | string;
21
21
  page?: 'bundle' | 'other';
22
22
  }): DataNode[];
23
23
  export declare function beautifyPath(path: string, cwd: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"utils/file.mjs","sources":["../../src/utils/file.tsx"],"sourcesContent":["import { get } from 'es-toolkit/compat';\nimport { Common, SDK } from '@rsdoctor/types';\nimport { message, Space, TreeNodeProps, UploadFile } from 'antd';\nimport { FieldDataNode } from 'rc-tree';\nimport {\n FolderOpenTwoTone,\n FolderTwoTone,\n FileOutlined,\n RightOutlined,\n} from '@ant-design/icons';\nimport { getFileCom } from 'src/components/FileTree';\n\nexport type DataNode = FieldDataNode<{\n key: string | number;\n title?: React.ReactNode | ((data: DataNode) => React.ReactNode);\n}> & { __BASENAME__?: any; __RESOURCEPATH__?: any; children?: DataNode[] };\n\nexport const rootDirname = (file: string, sep = '/'): string | null => {\n const idx = file?.indexOf(sep);\n if (idx === -1) {\n return null;\n }\n if (idx === 0) {\n return sep + (rootDirname(file?.slice(1), sep) || '');\n }\n return file?.slice(0, idx);\n};\n\nexport function mapFileKey(\n arr: DataNode[],\n depth = 2,\n filter: (node: DataNode) => boolean = () => true,\n): DataNode['key'][] {\n let d = 0;\n const res: DataNode['key'][] = [];\n let parent: DataNode[] = arr;\n while (d < depth) {\n parent.filter(filter).forEach((e) => {\n if (!e.isLeaf) {\n res.push(e.key);\n }\n });\n parent = parent.reduce<DataNode[]>(\n (t, e) => t.concat(e.children || []),\n [],\n );\n if (!parent.length) break;\n d++;\n }\n return res;\n}\n\nconst basenameKey = '__BASENAME__';\n\nexport function flattenDirectory(\n n: DataNode,\n parent: DataNode,\n sep = '/',\n inlinedResourcePathKey: keyof DataNode,\n dirTitle = (_dir: DataNode, defaultTitle: string): JSX.Element | string =>\n defaultTitle,\n) {\n if (n.isLeaf) return;\n if (parent.children && parent.children.length === 1) {\n const defaultTitle = [parent[basenameKey], n[basenameKey]].join(sep);\n parent[inlinedResourcePathKey] = n[inlinedResourcePathKey];\n parent[basenameKey] = defaultTitle;\n parent.key = [parent.key, n.key].join('-');\n parent.children = n.children;\n parent.title = dirTitle(parent, defaultTitle);\n\n if (n.children) {\n n.children.forEach((c) => {\n flattenDirectory(c, parent, sep, inlinedResourcePathKey, dirTitle);\n });\n }\n } else {\n // parent has more than 1 child.\n n.title = dirTitle(n, n[basenameKey]);\n\n if (n.children) {\n n.children.forEach((c) => {\n flattenDirectory(c, n, sep, inlinedResourcePathKey, dirTitle);\n });\n }\n }\n}\n\nexport function createFileStructures({\n files,\n inlinedResourcePathKey = '__RESOURCEPATH__',\n fileTitle = (_file: string, basename: string) => basename,\n dirTitle = (_dir: DataNode, defaultTitle: string) => defaultTitle,\n page = 'other',\n}: {\n files: string[];\n cwd?: string;\n inlinedResourcePathKey?: keyof DataNode;\n dirTitle?(dir: DataNode, defaultTitle: string): JSX.Element | string;\n fileTitle?(file: string, basename: string): JSX.Element | string;\n page?: 'bundle' | 'other';\n}): DataNode[] {\n // Normalize all paths to use forward slash as internal separator for consistency\n // This ensures Windows paths (using backslash) are properly converted to forward slashes\n const normalizedFiles = files.map((file) => {\n // Always convert backslashes to forward slashes for internal processing\n return file.replace(/\\\\/g, '/');\n });\n\n // Use forward slash as the internal separator for consistency\n const internalSep = '/';\n const sepRegexp = new RegExp(internalSep);\n\n const res = normalizedFiles.reduce<DataNode>(\n (t, file) => {\n let dir = rootDirname(file, internalSep);\n let basename = dir ? file?.slice(dir.length + 1) : file;\n let parent: DataNode = t;\n\n while (dir) {\n // find the match directory.\n let exist = parent.children!.find((e) => e.title === dir) as DataNode;\n if (!exist) {\n const p = [parent[inlinedResourcePathKey], dir]\n .filter(Boolean)\n .join(internalSep);\n exist = {\n title: dir,\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps, false)\n : null,\n // key: [parent.key, parent.children!.length].join('-'),\n key: p,\n children: [],\n [inlinedResourcePathKey]: p,\n [basenameKey]: dir,\n };\n parent.children!.push(exist);\n }\n\n parent = exist;\n dir = rootDirname(basename, internalSep);\n basename = dir\n ? basename.slice(dir.length).replace(sepRegexp, '')\n : basename;\n }\n\n // uniq\n if (parent.children!.some((e) => get(e, inlinedResourcePathKey) === file))\n return t;\n\n parent.children!.push({\n title() {\n return fileTitle(file, basename);\n },\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps)\n : null,\n key: file,\n isLeaf: true,\n [inlinedResourcePathKey]: file,\n [basenameKey]: basename,\n });\n\n return t;\n },\n { key: '0', children: [] },\n ).children!;\n\n res.forEach((e) => {\n if (e.children) {\n e.children.forEach((item) =>\n flattenDirectory(\n item,\n e,\n internalSep,\n inlinedResourcePathKey,\n dirTitle,\n ),\n );\n }\n });\n\n return res;\n}\n\nexport function beautifyPath(path: string, cwd: string) {\n if (path.startsWith(cwd)) {\n return path.replace(cwd, '.');\n }\n\n return path;\n}\n\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: UploadFile,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: Blob,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: unknown,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const { result } = reader;\n try {\n const json = JSON.parse(result!.toString());\n resolve(json);\n } catch (err) {\n message.error('json parse error');\n reject(err);\n }\n };\n reader.onerror = () => {\n const msg = 'upload json file error, please try again.';\n message.error(msg);\n reject(new Error(msg));\n };\n reader.readAsText(((file as UploadFile).originFileObj || file) as Blob);\n });\n}\n\n/**\n * beautify module path, will replace cwd & last 'node_modules'\n */\nexport function beautifyModulePath(modulePath: string, cwd: string) {\n const res = beautifyPath(modulePath, cwd);\n\n const str = '/node_modules/';\n\n const idx = res.lastIndexOf(str);\n\n if (idx > -1) {\n return {\n alias: res.slice(idx + str.length),\n inNodeModules: true,\n };\n }\n\n return {\n alias: res,\n inNodeModules: false,\n };\n}\n\nexport function getFileIcon(props: TreeNodeProps, addRowIcon = true) {\n const { data } = props;\n const expanded = props.expanded;\n if (data?.children) {\n return (\n <Space>\n {addRowIcon ? (\n <RightOutlined\n className={`file-tree-switcher-arrow ${expanded ? 'file-tree-switcher-arrow-expand' : ''}`}\n />\n ) : (\n <></>\n )}\n {expanded ? <FolderOpenTwoTone /> : <FolderTwoTone />}\n </Space>\n );\n }\n if (props.eventKey && typeof props.eventKey === 'string') {\n return getFileCom(props.eventKey);\n }\n return <FileOutlined />;\n}\n\ntype TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n id?: string | number;\n // Internal helper, not exported\n _map?: Map<string, TreeNode>;\n};\n\nexport function buildTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const root: TreeNode = { name: rootName, children: [], _map: new Map() };\n\n for (const mod of modules) {\n const parts = mod.path.split(/[\\\\/]/).filter(Boolean);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (i === parts.length - 1) {\n // File node\n if (!current.children) current.children = [];\n current.children.push({\n name: part,\n path: mod.path,\n sourceSize: mod.size?.sourceSize ?? 0,\n bundledSize: mod.size?.parsedSize ?? 0,\n gzipSize: mod.size?.gzipSize ?? 0,\n id: mod.id,\n });\n } else {\n // Directory node\n if (!current._map) current._map = new Map();\n let child = current._map.get(part);\n if (!child) {\n child = { name: part, children: [], _map: new Map() };\n current.children!.push(child);\n current._map.set(part, child);\n }\n current = child;\n }\n }\n }\n\n // Clean up _map property\n function clean(node: TreeNode) {\n delete node._map;\n if (node.children) node.children.forEach(clean);\n }\n clean(root);\n\n return root;\n}\n\nfunction flattenSingleChildDirs(node: TreeNode): TreeNode {\n // Return directly if leaf node\n if (!node.children || node.children.length === 0) return node;\n\n let current = node;\n // As long as children has only one child and it's not a leaf, merge\n while (\n current.children &&\n current.children.length === 1 &&\n !current.children[0].sourceSize // Not a leaf\n ) {\n current = {\n name: current.name + '/' + current.children[0].name,\n children: current.children[0].children,\n };\n }\n\n // Recursively process all child nodes\n if (current.children) {\n current.children = current.children.map(flattenSingleChildDirs);\n }\n return current;\n}\n\nfunction sumDirValue(node: TreeNode): {\n sourceSize: number;\n bundledSize: number;\n gzipSize: number;\n} {\n if (!node.children || node.children.length === 0) {\n // Leaf node, just return value\n return {\n sourceSize: node.sourceSize ?? 0,\n bundledSize: node.bundledSize ?? 0,\n gzipSize: node.gzipSize ?? 0,\n };\n }\n // Recursively sum all child nodes\n let sourceSum = 0;\n let bundledSum = 0;\n let gzipSum = 0;\n for (const child of node.children) {\n const { sourceSize, bundledSize, gzipSize } = sumDirValue(child);\n sourceSum += sourceSize;\n bundledSum += bundledSize;\n gzipSum += gzipSize;\n }\n node.sourceSize = sourceSum;\n node.bundledSize = bundledSum;\n node.gzipSize = gzipSum;\n return { sourceSize: sourceSum, bundledSize: bundledSum, gzipSize: gzipSum };\n}\n\nexport function flattenTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const rawTree = buildTreemapData(modules, rootName);\n const flattenedTree = flattenSingleChildDirs(rawTree);\n sumDirValue(flattenedTree); // Recursive sum\n return flattenedTree;\n}\n"],"names":["rootDirname","file","sep","idx","mapFileKey","arr","depth","filter","d","res","parent","e","t","basenameKey","flattenDirectory","n","inlinedResourcePathKey","dirTitle","_dir","defaultTitle","c","createFileStructures","files","fileTitle","_file","basename","page","normalizedFiles","internalSep","sepRegexp","RegExp","dir","exist","p","Boolean","props","getFileIcon","get","item","beautifyPath","path","cwd","readJSONByFileReader","Promise","resolve","reject","reader","FileReader","result","json","JSON","err","message","msg","Error","beautifyModulePath","modulePath","str","addRowIcon","data","expanded","Space","RightOutlined","FolderOpenTwoTone","FolderTwoTone","getFileCom","FileOutlined","buildTreemapData","modules","rootName","root","Map","mod","parts","current","i","part","child","clean","node","flattenSingleChildDirs","sumDirValue","sourceSum","bundledSum","gzipSum","sourceSize","bundledSize","gzipSize","flattenTreemapData","rawTree","flattenedTree"],"mappings":"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"}
1
+ {"version":3,"file":"utils/file.mjs","sources":["../../src/utils/file.tsx"],"sourcesContent":["import { get } from 'es-toolkit/compat';\nimport { Common, SDK } from '@rsdoctor/types';\nimport { message, Space, TreeNodeProps, UploadFile } from 'antd';\nimport { FieldDataNode } from 'rc-tree';\nimport {\n FolderOpenTwoTone,\n FolderTwoTone,\n FileOutlined,\n RightOutlined,\n} from '@ant-design/icons';\nimport { getFileCom } from 'src/components/FileTree';\n\nexport type DataNode = FieldDataNode<{\n key: string | number;\n title?: React.ReactNode | ((data: DataNode) => React.ReactNode);\n}> & { __BASENAME__?: any; __RESOURCEPATH__?: any; children?: DataNode[] };\n\nexport const rootDirname = (file: string, sep = '/'): string | null => {\n const idx = file?.indexOf(sep);\n if (idx === -1) {\n return null;\n }\n if (idx === 0) {\n return sep + (rootDirname(file?.slice(1), sep) || '');\n }\n return file?.slice(0, idx);\n};\n\nexport function mapFileKey(\n arr: DataNode[],\n depth = 2,\n filter: (node: DataNode) => boolean = () => true,\n): DataNode['key'][] {\n let d = 0;\n const res: DataNode['key'][] = [];\n let parent: DataNode[] = arr;\n while (d < depth) {\n parent.filter(filter).forEach((e) => {\n if (!e.isLeaf) {\n res.push(e.key);\n }\n });\n parent = parent.reduce<DataNode[]>(\n (t, e) => t.concat(e.children || []),\n [],\n );\n if (!parent.length) break;\n d++;\n }\n return res;\n}\n\nconst basenameKey = '__BASENAME__';\n\nexport function flattenDirectory(\n n: DataNode,\n parent: DataNode,\n sep = '/',\n inlinedResourcePathKey: keyof DataNode,\n dirTitle = (\n _dir: DataNode,\n defaultTitle: string,\n ): React.JSX.Element | string => defaultTitle,\n) {\n if (n.isLeaf) return;\n if (parent.children && parent.children.length === 1) {\n const defaultTitle = [parent[basenameKey], n[basenameKey]].join(sep);\n parent[inlinedResourcePathKey] = n[inlinedResourcePathKey];\n parent[basenameKey] = defaultTitle;\n parent.key = [parent.key, n.key].join('-');\n parent.children = n.children;\n parent.title = dirTitle(parent, defaultTitle);\n\n if (n.children) {\n n.children.forEach((c) => {\n flattenDirectory(c, parent, sep, inlinedResourcePathKey, dirTitle);\n });\n }\n } else {\n // parent has more than 1 child.\n n.title = dirTitle(n, n[basenameKey]);\n\n if (n.children) {\n n.children.forEach((c) => {\n flattenDirectory(c, n, sep, inlinedResourcePathKey, dirTitle);\n });\n }\n }\n}\n\nexport function createFileStructures({\n files,\n inlinedResourcePathKey = '__RESOURCEPATH__',\n fileTitle = (_file: string, basename: string) => basename,\n dirTitle = (_dir: DataNode, defaultTitle: string) => defaultTitle,\n page = 'other',\n}: {\n files: string[];\n cwd?: string;\n inlinedResourcePathKey?: keyof DataNode;\n dirTitle?(dir: DataNode, defaultTitle: string): React.JSX.Element | string;\n fileTitle?(file: string, basename: string): React.JSX.Element | string;\n page?: 'bundle' | 'other';\n}): DataNode[] {\n // Normalize all paths to use forward slash as internal separator for consistency\n // This ensures Windows paths (using backslash) are properly converted to forward slashes\n const normalizedFiles = files.map((file) => {\n // Always convert backslashes to forward slashes for internal processing\n return file.replace(/\\\\/g, '/');\n });\n\n // Use forward slash as the internal separator for consistency\n const internalSep = '/';\n const sepRegexp = new RegExp(internalSep);\n\n const res = normalizedFiles.reduce<DataNode>(\n (t, file) => {\n let dir = rootDirname(file, internalSep);\n let basename = dir ? file?.slice(dir.length + 1) : file;\n let parent: DataNode = t;\n\n while (dir) {\n // find the match directory.\n let exist = parent.children!.find((e) => e.title === dir) as DataNode;\n if (!exist) {\n const p = [parent[inlinedResourcePathKey], dir]\n .filter(Boolean)\n .join(internalSep);\n exist = {\n title: dir,\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps, false)\n : null,\n // key: [parent.key, parent.children!.length].join('-'),\n key: p,\n children: [],\n [inlinedResourcePathKey]: p,\n [basenameKey]: dir,\n };\n parent.children!.push(exist);\n }\n\n parent = exist;\n dir = rootDirname(basename, internalSep);\n basename = dir\n ? basename.slice(dir.length).replace(sepRegexp, '')\n : basename;\n }\n\n // uniq\n if (parent.children!.some((e) => get(e, inlinedResourcePathKey) === file))\n return t;\n\n parent.children!.push({\n title() {\n return fileTitle(file, basename);\n },\n icon:\n page === 'bundle'\n ? (props) => getFileIcon(props as TreeNodeProps)\n : null,\n key: file,\n isLeaf: true,\n [inlinedResourcePathKey]: file,\n [basenameKey]: basename,\n });\n\n return t;\n },\n { key: '0', children: [] },\n ).children!;\n\n res.forEach((e) => {\n if (e.children) {\n e.children.forEach((item) =>\n flattenDirectory(\n item,\n e,\n internalSep,\n inlinedResourcePathKey,\n dirTitle,\n ),\n );\n }\n });\n\n return res;\n}\n\nexport function beautifyPath(path: string, cwd: string) {\n if (path.startsWith(cwd)) {\n return path.replace(cwd, '.');\n }\n\n return path;\n}\n\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: UploadFile,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: Blob,\n): Promise<T>;\nexport function readJSONByFileReader<T extends Common.PlainObject>(\n file: unknown,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const { result } = reader;\n try {\n const json = JSON.parse(result!.toString());\n resolve(json);\n } catch (err) {\n message.error('json parse error');\n reject(err);\n }\n };\n reader.onerror = () => {\n const msg = 'upload json file error, please try again.';\n message.error(msg);\n reject(new Error(msg));\n };\n reader.readAsText(((file as UploadFile).originFileObj || file) as Blob);\n });\n}\n\n/**\n * beautify module path, will replace cwd & last 'node_modules'\n */\nexport function beautifyModulePath(modulePath: string, cwd: string) {\n const res = beautifyPath(modulePath, cwd);\n\n const str = '/node_modules/';\n\n const idx = res.lastIndexOf(str);\n\n if (idx > -1) {\n return {\n alias: res.slice(idx + str.length),\n inNodeModules: true,\n };\n }\n\n return {\n alias: res,\n inNodeModules: false,\n };\n}\n\nexport function getFileIcon(props: TreeNodeProps, addRowIcon = true) {\n const { data } = props;\n const expanded = props.expanded;\n if (data?.children) {\n return (\n <Space>\n {addRowIcon ? (\n <RightOutlined\n className={`file-tree-switcher-arrow ${expanded ? 'file-tree-switcher-arrow-expand' : ''}`}\n />\n ) : (\n <></>\n )}\n {expanded ? <FolderOpenTwoTone /> : <FolderTwoTone />}\n </Space>\n );\n }\n if (props.eventKey && typeof props.eventKey === 'string') {\n return getFileCom(props.eventKey);\n }\n return <FileOutlined />;\n}\n\ntype TreeNode = {\n name: string;\n value?: number;\n children?: TreeNode[];\n path?: string;\n sourceSize?: number;\n bundledSize?: number;\n gzipSize?: number;\n id?: string | number;\n // Internal helper, not exported\n _map?: Map<string, TreeNode>;\n};\n\nexport function buildTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const root: TreeNode = { name: rootName, children: [], _map: new Map() };\n\n for (const mod of modules) {\n const parts = mod.path.split(/[\\\\/]/).filter(Boolean);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (i === parts.length - 1) {\n // File node\n if (!current.children) current.children = [];\n current.children.push({\n name: part,\n path: mod.path,\n sourceSize: mod.size?.sourceSize ?? 0,\n bundledSize: mod.size?.parsedSize ?? 0,\n gzipSize: mod.size?.gzipSize ?? 0,\n id: mod.id,\n });\n } else {\n // Directory node\n if (!current._map) current._map = new Map();\n let child = current._map.get(part);\n if (!child) {\n child = { name: part, children: [], _map: new Map() };\n current.children!.push(child);\n current._map.set(part, child);\n }\n current = child;\n }\n }\n }\n\n // Clean up _map property\n function clean(node: TreeNode) {\n delete node._map;\n if (node.children) node.children.forEach(clean);\n }\n clean(root);\n\n return root;\n}\n\nfunction flattenSingleChildDirs(node: TreeNode): TreeNode {\n // Return directly if leaf node\n if (!node.children || node.children.length === 0) return node;\n\n let current = node;\n // As long as children has only one child and it's not a leaf, merge\n while (\n current.children &&\n current.children.length === 1 &&\n !current.children[0].sourceSize // Not a leaf\n ) {\n current = {\n name: current.name + '/' + current.children[0].name,\n children: current.children[0].children,\n };\n }\n\n // Recursively process all child nodes\n if (current.children) {\n current.children = current.children.map(flattenSingleChildDirs);\n }\n return current;\n}\n\nfunction sumDirValue(node: TreeNode): {\n sourceSize: number;\n bundledSize: number;\n gzipSize: number;\n} {\n if (!node.children || node.children.length === 0) {\n // Leaf node, just return value\n return {\n sourceSize: node.sourceSize ?? 0,\n bundledSize: node.bundledSize ?? 0,\n gzipSize: node.gzipSize ?? 0,\n };\n }\n // Recursively sum all child nodes\n let sourceSum = 0;\n let bundledSum = 0;\n let gzipSum = 0;\n for (const child of node.children) {\n const { sourceSize, bundledSize, gzipSize } = sumDirValue(child);\n sourceSum += sourceSize;\n bundledSum += bundledSize;\n gzipSum += gzipSize;\n }\n node.sourceSize = sourceSum;\n node.bundledSize = bundledSum;\n node.gzipSize = gzipSum;\n return { sourceSize: sourceSum, bundledSize: bundledSum, gzipSize: gzipSum };\n}\n\nexport function flattenTreemapData(\n modules: SDK.ModuleData[],\n rootName = 'dist',\n): TreeNode {\n const rawTree = buildTreemapData(modules, rootName);\n const flattenedTree = flattenSingleChildDirs(rawTree);\n sumDirValue(flattenedTree); // Recursive sum\n return flattenedTree;\n}\n"],"names":["rootDirname","file","sep","idx","mapFileKey","arr","depth","filter","d","res","parent","e","t","basenameKey","flattenDirectory","n","inlinedResourcePathKey","dirTitle","_dir","defaultTitle","c","createFileStructures","files","fileTitle","_file","basename","page","normalizedFiles","internalSep","sepRegexp","RegExp","dir","exist","p","Boolean","props","getFileIcon","get","item","beautifyPath","path","cwd","readJSONByFileReader","Promise","resolve","reject","reader","FileReader","result","json","JSON","err","message","msg","Error","beautifyModulePath","modulePath","str","addRowIcon","data","expanded","Space","RightOutlined","FolderOpenTwoTone","FolderTwoTone","getFileCom","FileOutlined","buildTreemapData","modules","rootName","root","Map","mod","parts","current","i","part","child","clean","node","flattenSingleChildDirs","sumDirValue","sourceSum","bundledSum","gzipSum","sourceSize","bundledSize","gzipSize","flattenTreemapData","rawTree","flattenedTree"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsdoctor/components",
3
- "version": "1.5.11",
3
+ "version": "1.5.12",
4
4
  "license": "MIT",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": {
@@ -42,17 +42,17 @@
42
42
  "@rsbuild/plugin-react": "2.0.0",
43
43
  "@rsbuild/plugin-sass": "^1.5.2",
44
44
  "@rsbuild/plugin-svgr": "2.0.2",
45
- "@types/node": "^22.8.1",
45
+ "@types/node": "^24.12.3",
46
46
  "@types/path-browserify": "1.0.3",
47
- "@types/react": "^18.3.28",
47
+ "@types/react": "^19.2.14",
48
48
  "@types/react-highlight-words": "^0.20.1",
49
49
  "@types/url-parse": "1.4.11",
50
- "react": "18.3.1",
50
+ "react": "19.2.6",
51
51
  "react-router-dom": "6.30.3",
52
- "typescript": "^5.9.2"
52
+ "typescript": "^6.0.3"
53
53
  },
54
54
  "dependencies": {
55
- "@ant-design/icons": "5.6.1",
55
+ "@ant-design/icons": "6.2.3",
56
56
  "@monaco-editor/react": "4.7.0",
57
57
  "ansi-to-react": "6.2.6",
58
58
  "antd": "5.19.1",
@@ -73,13 +73,13 @@
73
73
  "react-markdown": "^9.1.0",
74
74
  "socket.io-client": "4.8.1",
75
75
  "url-parse": "1.5.10",
76
- "@rsdoctor/utils": "1.5.11",
77
- "@rsdoctor/types": "1.5.11",
78
- "@rsdoctor/graph": "1.5.11"
76
+ "@rsdoctor/graph": "1.5.12",
77
+ "@rsdoctor/types": "1.5.12",
78
+ "@rsdoctor/utils": "1.5.12"
79
79
  },
80
80
  "peerDependencies": {
81
- "react": ">=18.3.1",
82
- "react-dom": ">=18.3.1"
81
+ "react": ">=19",
82
+ "react-dom": ">=19"
83
83
  },
84
84
  "publishConfig": {
85
85
  "access": "public",