@rsdoctor/components 1.3.7 → 1.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/imgs/connection-point.mjs.map +1 -1
- package/dist/common/imgs/webpack.mjs.map +1 -1
- package/dist/common/svg/bundle-size.mjs.map +1 -1
- package/dist/common/svg/error.mjs.map +1 -1
- package/dist/common/svg/file-css.mjs.map +1 -1
- package/dist/common/svg/file-html.mjs.map +1 -1
- package/dist/common/svg/file-image.mjs.map +1 -1
- package/dist/common/svg/file-js.mjs.map +1 -1
- package/dist/common/svg/file-unknown.mjs.map +1 -1
- package/dist/common/svg/file.mjs.map +1 -1
- package/dist/common/svg/files/css.mjs.map +1 -1
- package/dist/common/svg/files/html.mjs.map +1 -1
- package/dist/common/svg/files/image.mjs.map +1 -1
- package/dist/common/svg/files/js.mjs.map +1 -1
- package/dist/common/svg/files/unkown-file.mjs.map +1 -1
- package/dist/common/svg/loader/input.mjs.map +1 -1
- package/dist/common/svg/loader/output.mjs.map +1 -1
- package/dist/common/svg/loader/step.mjs.map +1 -1
- package/dist/common/svg/navbar/bundle-size-active.mjs.map +1 -1
- package/dist/common/svg/navbar/bundle-size-inactive.mjs.map +1 -1
- package/dist/common/svg/navbar/compile-analysis-active.mjs.map +1 -1
- package/dist/common/svg/navbar/compile-analysis-inactive.mjs.map +1 -1
- package/dist/common/svg/navbar/overall-active.mjs.map +1 -1
- package/dist/common/svg/navbar/overall-inactive.mjs.map +1 -1
- package/dist/common/svg/output.mjs.map +1 -1
- package/dist/common/svg/source-size.mjs.map +1 -1
- package/dist/common/svg/source.mjs.map +1 -1
- package/dist/common/svg/total-size.mjs.map +1 -1
- package/dist/common/svg/version.mjs.map +1 -1
- package/dist/components/Alert/change.d.ts +1 -1
- package/dist/components/Alert/change.mjs.map +1 -1
- package/dist/components/Alert/ecma-version-check.d.ts +1 -1
- package/dist/components/Alert/ecma-version-check.mjs.map +1 -1
- package/dist/components/Alert/ecma-version-check.module.mjs.map +1 -1
- package/dist/components/Alert/file-relation.d.ts +1 -1
- package/dist/components/Alert/file-relation.mjs.map +1 -1
- package/dist/components/Alert/package-relation.d.ts +1 -1
- package/dist/components/Alert/package-relation.mjs.map +1 -1
- package/dist/components/Alert/package-relation.module.mjs.map +1 -1
- package/dist/components/Alert/view.d.ts +1 -1
- package/dist/components/Alert/view.mjs.map +1 -1
- package/dist/components/Alerts/bundle-alert.d.ts +2 -2
- package/dist/components/Alerts/bundle-alert.mjs.map +1 -1
- package/dist/components/Alerts/bundle-alert.module.mjs.map +1 -1
- package/dist/components/Alerts/bundle.mjs.map +1 -1
- package/dist/components/Alerts/collapse-cross-chunks.d.ts +1 -1
- package/dist/components/Alerts/collapse-cross-chunks.mjs.map +1 -1
- package/dist/components/Alerts/collapse.d.ts +1 -1
- package/dist/components/Alerts/collapse.mjs.map +1 -1
- package/dist/components/Alerts/collapse.module.mjs.map +1 -1
- package/dist/components/Alerts/compile.mjs.map +1 -1
- package/dist/components/Alerts/index.d.ts +3 -3
- package/dist/components/Alerts/list.mjs.map +1 -1
- package/dist/components/Alerts/list.module.mjs.map +1 -1
- package/dist/components/Alerts/overlay.mjs.map +1 -1
- package/dist/components/Alerts/overlay.module.mjs.map +1 -1
- package/dist/components/Badge/index.mjs.map +1 -1
- package/dist/components/Card/diff.d.ts +1 -1
- package/dist/components/Card/diff.mjs.map +1 -1
- package/dist/components/Card/index.d.ts +1 -1
- package/dist/components/Card/index.mjs.map +1 -1
- package/dist/components/Card/size.mjs.map +1 -1
- package/dist/components/Card/size.module.mjs.map +1 -1
- package/dist/components/Card/statistic.mjs.map +1 -1
- package/dist/components/Charts/TimelineCharts/index.d.ts +2 -2
- package/dist/components/Charts/TimelineCharts/index.mjs.map +1 -1
- package/dist/components/Charts/TreeMap.mjs.map +1 -1
- package/dist/components/Charts/bootstrap.d.ts +1 -1
- package/dist/components/Charts/bootstrap.mjs.map +1 -1
- package/dist/components/Charts/common.d.ts +2 -2
- package/dist/components/Charts/common.mjs.map +1 -1
- package/dist/components/Charts/constants.mjs.map +1 -1
- package/dist/components/Charts/done.d.ts +1 -1
- package/dist/components/Charts/done.mjs.map +1 -1
- package/dist/components/Charts/index.mjs.map +1 -1
- package/dist/components/Charts/loader.d.ts +1 -1
- package/dist/components/Charts/loader.mjs.map +1 -1
- package/dist/components/Charts/minify.d.ts +1 -1
- package/dist/components/Charts/minify.mjs.map +1 -1
- package/dist/components/Charts/treemap.module.mjs.map +1 -1
- package/dist/components/Charts/types.mjs.map +1 -1
- package/dist/components/Charts/utils.d.ts +1 -1
- package/dist/components/Charts/utils.mjs.map +1 -1
- package/dist/components/Configuration/builder.mjs.map +1 -1
- package/dist/components/Configuration/builder.module.mjs.map +1 -1
- package/dist/components/Configuration/index.d.ts +1 -1
- package/dist/components/FileTree/css.mjs.map +1 -1
- package/dist/components/FileTree/html.mjs.map +1 -1
- package/dist/components/FileTree/image.mjs.map +1 -1
- package/dist/components/FileTree/index.mjs.map +1 -1
- package/dist/components/FileTree/js.mjs.map +1 -1
- package/dist/components/FileTree/unkown-file.mjs.map +1 -1
- package/dist/components/Form/keyword.mjs.map +1 -1
- package/dist/components/Keyword/index.mjs.map +1 -1
- package/dist/components/Keyword/style.module.mjs.map +1 -1
- package/dist/components/Layout/builder-select.mjs.map +1 -1
- package/dist/components/Layout/bundle-size-icon.mjs.map +1 -1
- package/dist/components/Layout/compile-icon.mjs.map +1 -1
- package/dist/components/Layout/constants.mjs.map +1 -1
- package/dist/components/Layout/header.mjs.map +1 -1
- package/dist/components/Layout/index.mjs.map +1 -1
- package/dist/components/Layout/menus.mjs.map +1 -1
- package/dist/components/Layout/overall-icon.mjs.map +1 -1
- package/dist/components/Layout/progress.mjs.map +1 -1
- package/dist/components/Loader/Analysis/files.mjs.map +1 -1
- package/dist/components/Loader/Analysis/index.mjs.map +1 -1
- package/dist/components/Loader/Analysis/input.mjs.map +1 -1
- package/dist/components/Loader/Analysis/output.mjs.map +1 -1
- package/dist/components/Loader/Analysis/style.module.mjs.map +1 -1
- package/dist/components/Loader/executions.mjs.map +1 -1
- package/dist/components/Loader/step.mjs.map +1 -1
- package/dist/components/Manifest/api.mjs.map +1 -1
- package/dist/components/Manifest/data.mjs.map +1 -1
- package/dist/components/Manifest/index.d.ts +2 -2
- package/dist/components/Opener/code.mjs.map +1 -1
- package/dist/components/Opener/index.d.ts +2 -2
- package/dist/components/Opener/vscode.mjs.map +1 -1
- package/dist/components/Overall/DataSummary.mjs.map +1 -1
- package/dist/components/Overall/DataSummary.module.mjs.map +1 -1
- package/dist/components/Overall/bundle.mjs.map +1 -1
- package/dist/components/Overall/bundle.module.mjs.map +1 -1
- package/dist/components/Overall/card.module.mjs.map +1 -1
- package/dist/components/Overall/compile.mjs.map +1 -1
- package/dist/components/Overall/compile.module.mjs.map +1 -1
- package/dist/components/Overall/help-center.mjs.map +1 -1
- package/dist/components/Overall/help-center.module.mjs.map +1 -1
- package/dist/components/Overall/index.d.ts +3 -3
- package/dist/components/Overall/list.module.mjs.map +1 -1
- package/dist/components/Overall/overview.mjs.map +1 -1
- package/dist/components/Overall/overview.module.mjs.map +1 -1
- package/dist/components/Overall/project.mjs.map +1 -1
- package/dist/components/Overall/project.module.mjs.map +1 -1
- package/dist/components/Plugins/webpack.mjs.map +1 -1
- package/dist/components/Resolver/analysis.mjs.map +1 -1
- package/dist/components/Select/index.mjs.map +1 -1
- package/dist/components/Status/failed.mjs.map +1 -1
- package/dist/components/Status/index.d.ts +1 -1
- package/dist/components/TextDrawer/duplicate.d.ts +2 -2
- package/dist/components/TextDrawer/duplicate.mjs.map +1 -1
- package/dist/components/TextDrawer/index.d.ts +1 -1
- package/dist/components/TextDrawer/index.mjs.map +1 -1
- package/dist/components/Title/index.mjs.map +1 -1
- package/dist/components/base/CodeViewer/index.d.ts +4 -4
- package/dist/components/base/CodeViewer/index.mjs.map +1 -1
- package/dist/components/base/CodeViewer/index.module.mjs.map +1 -1
- package/dist/components/base/CodeViewer/useCodeDrawer.d.ts +1 -1
- package/dist/components/base/CodeViewer/useCodeDrawer.mjs.map +1 -1
- package/dist/components/base/CodeViewer/utils.mjs.map +1 -1
- package/dist/components/base/DiffViewer/index.d.ts +4 -4
- package/dist/components/base/DiffViewer/index.mjs.map +1 -1
- package/dist/components/base/DiffViewer/index.module.mjs.map +1 -1
- package/dist/components/base/DiffViewer/useDiffDrawer.d.ts +1 -1
- package/dist/components/base/DiffViewer/useDiffDrawer.mjs.map +1 -1
- package/dist/components/base/DiffViewer/utils.mjs.map +1 -1
- package/dist/components/base/index.d.ts +2 -2
- package/dist/components/index.d.ts +10 -10
- package/dist/config.d.ts +1 -1
- package/dist/config.mjs.map +1 -1
- package/dist/constants.mjs.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/pages/BundleSize/components/asset.d.ts +1 -1
- package/dist/pages/BundleSize/components/asset.mjs.map +1 -1
- package/dist/pages/BundleSize/components/card.module.mjs.map +1 -1
- package/dist/pages/BundleSize/components/cards.mjs.map +1 -1
- package/dist/pages/BundleSize/components/index.mjs.map +1 -1
- package/dist/pages/BundleSize/components/index.module.mjs.map +1 -1
- package/dist/pages/BundleSize/components/search-modal.mjs.map +1 -1
- package/dist/pages/BundleSize/config.mjs.map +1 -1
- package/dist/pages/BundleSize/constants.mjs.map +1 -1
- package/dist/pages/BundleSize/index.d.ts +1 -1
- package/dist/pages/BundleSize/index.mjs.map +1 -1
- package/dist/pages/ModuleAnalyze/chunks.mjs.map +1 -1
- package/dist/pages/ModuleAnalyze/components/fileTreeCom.d.ts +1 -1
- package/dist/pages/ModuleAnalyze/components/fileTreeCom.mjs.map +1 -1
- package/dist/pages/ModuleAnalyze/constants.mjs.map +1 -1
- package/dist/pages/ModuleAnalyze/dependency.mjs.map +1 -1
- package/dist/pages/ModuleAnalyze/fileTree.mjs.map +1 -1
- package/dist/pages/ModuleAnalyze/index.mjs.map +1 -1
- package/dist/pages/ModuleAnalyze/utils/hooks.mjs.map +1 -1
- package/dist/pages/ModuleAnalyze/utils/index.mjs.map +1 -1
- package/dist/pages/ModuleResolve/constants.mjs.map +1 -1
- package/dist/pages/ModuleResolve/index.d.ts +1 -1
- package/dist/pages/ModuleResolve/index.mjs.map +1 -1
- package/dist/pages/Overall/constants.mjs.map +1 -1
- package/dist/pages/Overall/index.d.ts +1 -1
- package/dist/pages/Overall/index.mjs.map +1 -1
- package/dist/pages/Overall/index.module.mjs.map +1 -1
- package/dist/pages/Overall/responsiveLayout.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/assets.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/cards.d.ts +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/cards.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/changes.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/constants.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/index.d.ts +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/index.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/modules.d.ts +2 -2
- package/dist/pages/Resources/BundleDiff/DiffContainer/modules.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/overview.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/packages.d.ts +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/packages.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/row.d.ts +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/row.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffContainer/types.d.ts +2 -2
- package/dist/pages/Resources/BundleDiff/DiffContainer/utils.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/DiffServerAPIProvider/index.d.ts +1 -1
- package/dist/pages/Resources/BundleDiff/DiffServerAPIProvider/index.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/constants.mjs.map +1 -1
- package/dist/pages/Resources/BundleDiff/index.d.ts +2 -2
- package/dist/pages/Resources/BundleDiff/index.mjs.map +1 -1
- package/dist/pages/Resources/RuleIndex/constants.mjs.map +1 -1
- package/dist/pages/Resources/RuleIndex/index.d.ts +1 -1
- package/dist/pages/Resources/RuleIndex/index.mjs.map +1 -1
- package/dist/pages/TreeShaking/constants.mjs.map +1 -1
- package/dist/pages/TreeShaking/editor.d.ts +1 -1
- package/dist/pages/TreeShaking/editor.mjs.map +1 -1
- package/dist/pages/TreeShaking/index.d.ts +1 -1
- package/dist/pages/TreeShaking/index.mjs.map +1 -1
- package/dist/pages/TreeShaking/open-tag.mjs.map +1 -1
- package/dist/pages/TreeShaking/range.mjs.map +1 -1
- package/dist/pages/TreeShaking/space.mjs.map +1 -1
- package/dist/pages/TreeShaking/table.d.ts +1 -1
- package/dist/pages/TreeShaking/table.mjs.map +1 -1
- package/dist/pages/TreeShaking/utils.d.ts +1 -1
- package/dist/pages/TreeShaking/utils.mjs.map +1 -1
- package/dist/pages/Uploader/constants.mjs.map +1 -1
- package/dist/pages/Uploader/index.d.ts +1 -1
- package/dist/pages/Uploader/index.mjs.map +1 -1
- package/dist/pages/Uploader/utils.mjs.map +1 -1
- package/dist/pages/WebpackLoaders/Analysis/constants.mjs.map +1 -1
- package/dist/pages/WebpackLoaders/Analysis/index.d.ts +1 -1
- package/dist/pages/WebpackLoaders/Analysis/index.mjs.map +1 -1
- package/dist/pages/WebpackLoaders/Overall/constants.mjs.map +1 -1
- package/dist/pages/WebpackLoaders/Overall/index.d.ts +1 -1
- package/dist/pages/WebpackLoaders/Overall/index.mjs.map +1 -1
- package/dist/pages/WebpackLoaders/constants.mjs.map +1 -1
- package/dist/pages/WebpackPlugins/constants.mjs.map +1 -1
- package/dist/pages/WebpackPlugins/index.d.ts +1 -1
- package/dist/pages/WebpackPlugins/index.mjs.map +1 -1
- package/dist/pages/index.d.ts +11 -11
- package/dist/utils/data/base.mjs.map +1 -1
- package/dist/utils/data/brief.d.ts +1 -1
- package/dist/utils/data/brief.mjs.map +1 -1
- package/dist/utils/data/index.d.ts +1 -1
- package/dist/utils/data/index.mjs.map +1 -1
- package/dist/utils/data/local.d.ts +1 -1
- package/dist/utils/data/local.mjs.map +1 -1
- package/dist/utils/data/remote.d.ts +1 -1
- package/dist/utils/data/remote.mjs.map +1 -1
- package/dist/utils/file.mjs.map +1 -1
- package/dist/utils/hooks.d.ts +1 -1
- package/dist/utils/hooks.mjs +4 -3
- package/dist/utils/hooks.mjs.map +1 -1
- package/dist/utils/i18n/cn.d.ts +1 -1
- package/dist/utils/i18n/cn.mjs.map +1 -1
- package/dist/utils/i18n/en.mjs +3 -3
- package/dist/utils/i18n/en.mjs.map +1 -1
- package/dist/utils/i18n/index.mjs.map +1 -1
- package/dist/utils/index.d.ts +16 -16
- package/dist/utils/loader.mjs.map +1 -1
- package/dist/utils/locale.d.ts +1 -1
- package/dist/utils/locale.mjs.map +1 -1
- package/dist/utils/manifest.d.ts +4 -4
- package/dist/utils/manifest.mjs.map +1 -1
- package/dist/utils/request.mjs.map +1 -1
- package/dist/utils/routes.mjs.map +1 -1
- package/dist/utils/size.mjs.map +1 -1
- package/dist/utils/socket.mjs.map +1 -1
- package/dist/utils/stats.mjs.map +1 -1
- package/dist/utils/storage.d.ts +2 -2
- package/dist/utils/storage.mjs.map +1 -1
- package/dist/utils/string.mjs.map +1 -1
- package/dist/utils/time.mjs.map +1 -1
- package/dist/utils/url.mjs.map +1 -1
- package/dist/utils/worker/index.d.ts +4 -4
- package/dist/utils/worker/master.d.ts +2 -2
- package/dist/utils/worker/master.mjs.map +1 -1
- package/dist/utils/worker/utils.d.ts +1 -1
- package/dist/utils/worker/utils.mjs.map +1 -1
- package/dist/utils/worker/worker.d.ts +1 -1
- package/dist/utils/worker/worker.mjs.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/TreeShaking/table.mjs","sources":["webpack://@rsdoctor/components/./src/pages/TreeShaking/table.tsx"],"sourcesContent":["import { SDK } from '@rsdoctor/types';\nimport {\n Space,\n Table,\n Typography,\n Divider,\n Tooltip,\n Button,\n Input,\n InputRef,\n} from 'antd';\nimport { SearchOutlined } from '@ant-design/icons';\nimport type { ColumnType, FilterConfirmProps } from 'antd/es/table/interface';\nimport React, { useMemo, useState, useRef } from 'react';\nimport Highlighter from 'react-highlight-words';\nimport { Card } from '../../components/Card';\nimport type { TableKind, SetEditorStatus } from './types';\nimport { ellipsisPath } from './utils';\nimport { isDef } from '../../utils';\n\nconst tableHeight = 600;\n\ninterface TableProps {\n module: SDK.ModuleInstance;\n moduleGraph: SDK.ModuleGraphInstance;\n setEditorData: SetEditorStatus;\n kind: TableKind;\n}\n\nfunction getDeclarationElement(\n val: SDK.StatementInstance | undefined,\n setEditorData: SetEditorStatus,\n) {\n if (!val) {\n return <div>Can not find declaration.</div>;\n }\n\n const { module } = val;\n const range = module.isPreferSource\n ? val.position.source!\n : val.position.transformed;\n\n return (\n <Tooltip title={`${module.path}, line ${range.start.line}`}>\n <Button\n type=\"link\"\n onClick={() => setEditorData(module, [range], range.start.line)}\n >\n Move To\n </Button>\n </Tooltip>\n );\n}\n\nfunction useSearchCell<Data>(dataIndex: string): ColumnType<Data> {\n const [searchText, setSearchText] = useState('');\n const [searchedColumn, setSearchedColumn] = useState('');\n const searchInput = useRef<InputRef>(null);\n\n const handleSearch = (\n selectedKeys: string[],\n confirm: (param?: FilterConfirmProps) => void,\n dataIndex: string,\n ) => {\n confirm();\n setSearchText(selectedKeys[0]);\n setSearchedColumn(dataIndex);\n };\n\n const handleReset = (clearFilters: () => void) => {\n clearFilters();\n setSearchText('');\n };\n\n return {\n filterDropdown: ({\n setSelectedKeys,\n selectedKeys,\n confirm,\n clearFilters,\n close,\n }) => (\n <div style={{ padding: 8 }} onKeyDown={(e) => e.stopPropagation()}>\n <Input\n ref={searchInput}\n placeholder={`Search ${dataIndex}`}\n value={selectedKeys[0]}\n onChange={(e) =>\n setSelectedKeys(e.target.value ? [e.target.value] : [])\n }\n onPressEnter={() =>\n handleSearch(selectedKeys as string[], confirm, dataIndex)\n }\n style={{ marginBottom: 8, display: 'block' }}\n />\n <Space>\n <Button\n type=\"primary\"\n onClick={() =>\n handleSearch(selectedKeys as string[], confirm, dataIndex)\n }\n icon={<SearchOutlined />}\n size=\"small\"\n style={{ width: 90 }}\n >\n Search\n </Button>\n <Button\n onClick={() => clearFilters && handleReset(clearFilters)}\n size=\"small\"\n style={{ width: 90 }}\n >\n Reset\n </Button>\n <Button type=\"link\" size=\"small\" onClick={close}>\n close\n </Button>\n </Space>\n </div>\n ),\n filterIcon: (filtered: boolean) => (\n <SearchOutlined style={{ color: filtered ? '#1890ff' : undefined }} />\n ),\n onFilter: (value, record): boolean => {\n // @ts-ignore\n return record[dataIndex]\n .toString()\n .toLowerCase()\n .includes((value as string).toLowerCase());\n },\n render: (text: string) => {\n return searchedColumn === dataIndex ? (\n <Highlighter\n highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }}\n searchWords={[searchText]}\n autoEscape\n textToHighlight={text ? text.toString() : ''}\n />\n ) : (\n text\n );\n },\n };\n}\n\nexport const SideEffectTable: React.FC<TableProps> = ({\n module,\n moduleGraph,\n setEditorData,\n}) => {\n interface SideEffectDataRowData {\n key: number;\n name: string;\n identifier: SDK.SourceRange;\n declaration?: SDK.StatementInstance;\n children?: SideEffectDataRowData[];\n }\n\n const sideEffects = useMemo(\n () => moduleGraph.getModuleGraphModule(module)!.getSideEffects(),\n [module],\n );\n const dataSource = sideEffects\n .map(({ variable, name, identifier }, i): SideEffectDataRowData => {\n return {\n key: i,\n name,\n identifier: module.isPreferSource\n ? identifier.position.source!\n : identifier.position.transformed,\n declaration: variable?.identifier,\n };\n })\n .sort((pre, next) => {\n // 名称相同则看行数\n if (pre.name === next.name) {\n return pre.identifier.start.line! > next.identifier.start.line!\n ? 1\n : -1;\n }\n\n // 名称不同则比较名称\n return pre.name > next.name ? 1 : -1;\n })\n .reduce((ans, item) => {\n const lastItem = ans[ans.length - 1];\n\n if (!lastItem || lastItem.name !== item.name) {\n ans.push(item);\n return ans;\n }\n\n if (!lastItem.children) {\n lastItem.children = [];\n }\n\n lastItem.children.push(item);\n return ans;\n }, [] as SideEffectDataRowData[]);\n\n const columns: ColumnType<any>[] = [\n {\n title: 'Name',\n dataIndex: 'name',\n key: 'name',\n align: 'center',\n ...useSearchCell<SDK.ExportData>('name'),\n },\n {\n title: 'SideEffect',\n dataIndex: 'identifier',\n key: 'identifier',\n align: 'center',\n render: (val: SDK.SourceRange) => {\n return (\n <Tooltip title={`Current File line ${val.start.line}`}>\n <Button\n type=\"link\"\n onClick={() => setEditorData(module, [val], val.start.line)}\n >\n Move To\n </Button>\n </Tooltip>\n );\n },\n },\n {\n title: 'Declaration',\n dataIndex: 'declaration',\n key: 'declaration',\n align: 'center',\n render: (val: SDK.StatementInstance) => {\n return getDeclarationElement(val, setEditorData);\n },\n },\n ];\n\n const titleInfo = (\n <React.Fragment>\n <Space style={{ fontWeight: 400 }}>\n Import\n <Typography.Text strong>{dataSource.length}</Typography.Text>\n variables\n <Divider type=\"vertical\" />\n <Typography.Text strong>{sideEffects.length}</Typography.Text>\n sideEffects\n </Space>\n </React.Fragment>\n );\n\n return (\n <Card\n style={{ marginBottom: 10 }}\n title={titleInfo}\n className=\"tree-shaking-export-table\"\n >\n <Table\n size=\"small\"\n dataSource={dataSource}\n columns={columns}\n pagination={false}\n scroll={{ y: tableHeight }}\n />\n </Card>\n );\n};\n\nexport const ExportTable: React.FC<TableProps> = ({\n module,\n moduleGraph,\n setEditorData,\n}) => {\n const exportsData = useMemo(\n () => moduleGraph.getModuleGraphModule(module)!.getExports(),\n [module],\n );\n const allUnUsedExports = exportsData.filter(\n (item) => item.getSideEffects().length === 0,\n );\n const titleInfo = (\n <React.Fragment>\n <Space style={{ fontWeight: 400 }}>\n Export\n <Typography.Text strong>{exportsData.length}</Typography.Text>\n </Space>\n {exportsData.length > 0 ? (\n <>\n <Divider type=\"vertical\" />\n <Typography.Text style={{ fontWeight: 400 }} code>\n <Typography.Text>Unused</Typography.Text>\n <Divider type=\"vertical\" />\n <Typography.Text strong>{allUnUsedExports.length}</Typography.Text>\n </Typography.Text>\n <Divider type=\"vertical\" />\n <Typography.Text style={{ fontWeight: 400 }} code>\n <Typography.Text>Used</Typography.Text>\n <Divider type=\"vertical\" />\n <Typography.Text strong>\n {exportsData.length - allUnUsedExports.length}\n </Typography.Text>\n </Typography.Text>\n </>\n ) : (\n ''\n )}\n </React.Fragment>\n );\n\n interface RowData {\n key: number;\n name: string;\n declaration?: SDK.StatementInstance;\n used: {\n module: SDK.ModuleInstance;\n range: SDK.SourceRange;\n }[];\n }\n\n const dataSource: RowData[] = exportsData.map((item, i) => {\n const { variable } = item;\n\n return {\n key: i,\n name: item.name,\n declaration: variable?.identifier,\n used: item\n .getSideEffects()\n .map(({ module, identifier }) => {\n const range = module?.isPreferSource\n ? identifier.position.source\n : identifier.position.transformed;\n\n if (!module || !range) {\n return;\n }\n\n return {\n module,\n range,\n };\n })\n .filter(isDef),\n };\n });\n\n const columns: ColumnType<any>[] = [\n {\n title: 'Name',\n dataIndex: 'name',\n key: 'name',\n align: 'center',\n ...useSearchCell<SDK.ExportInstance>('name'),\n },\n {\n title: 'Declaration',\n dataIndex: 'declaration',\n key: 'declaration',\n align: 'center',\n render: (val?: SDK.StatementInstance) => {\n return getDeclarationElement(val, setEditorData);\n },\n },\n {\n title: 'Info',\n dataIndex: 'used',\n key: 'used',\n align: 'center',\n sorter: (a: RowData, b: RowData) => a.used.length - b.used.length,\n sortDirections: ['descend', 'ascend'],\n render: (val: RowData['used']) => <span>Used {val.length} times</span>,\n },\n ];\n\n const expandElement = (data: any) => {\n return (\n <div className=\"tree-shaking-side-effect-list\">\n <Typography.Text>List of SideEffect:</Typography.Text>\n {data.used.map(({ module, range }: any) => (\n <Tooltip key={module.id} title={`${module.path}:${range.start.line}`}>\n <Button\n className=\"tree-shaking-side-effect-list-item\"\n type=\"link\"\n onClick={() => {\n setEditorData(module, [range], range.start.line);\n }}\n >\n {`${ellipsisPath(module.path)}:${range.start.line}`}\n </Button>\n </Tooltip>\n ))}\n </div>\n );\n };\n\n return (\n <Card title={titleInfo} className=\"tree-shaking-export-table\">\n <Table\n size=\"small\"\n dataSource={dataSource}\n columns={columns}\n pagination={false}\n scroll={{ y: tableHeight }}\n expandable={{\n expandedRowRender: expandElement,\n rowExpandable: (val: any) => val.used.length > 0,\n }}\n />\n </Card>\n );\n};\n\nexport const TreeShakingTable: React.FC<TableProps> = (props) => {\n return props.kind === 'side-effect' ? (\n <SideEffectTable {...props} />\n ) : (\n <ExportTable {...props} />\n );\n};\n"],"names":["tableHeight","getDeclarationElement","val","setEditorData","module","range","Tooltip","Button","useSearchCell","dataIndex","searchText","setSearchText","useState","searchedColumn","setSearchedColumn","searchInput","useRef","handleSearch","selectedKeys","confirm","handleReset","clearFilters","setSelectedKeys","close","e","Input","Space","SearchOutlined","filtered","undefined","value","record","text","Highlighter","SideEffectTable","moduleGraph","sideEffects","useMemo","dataSource","variable","name","identifier","i","pre","next","ans","item","lastItem","columns","titleInfo","React","Typography","Divider","Card","Table","ExportTable","exportsData","allUnUsedExports","isDef","a","b","expandElement","data","ellipsisPath","TreeShakingTable","props"],"mappings":";;;;;;;;AAoBA,MAAMA,cAAc;AASpB,SAASC,sBACPC,GAAsC,EACtCC,aAA8B;IAE9B,IAAI,CAACD,KACH,OAAO,WAAP,GAAO,IAAC;kBAAI;;IAGd,MAAM,EAAEE,MAAM,EAAE,GAAGF;IACnB,MAAMG,QAAQD,OAAO,cAAc,GAC/BF,IAAI,QAAQ,CAAC,MAAM,GACnBA,IAAI,QAAQ,CAAC,WAAW;IAE5B,OAAO,WAAP,GACE,IAACI,SAAOA;QAAC,OAAO,GAAGF,OAAO,IAAI,CAAC,OAAO,EAAEC,MAAM,KAAK,CAAC,IAAI,EAAE;kBACxD,kBAACE,QAAMA;YACL,MAAK;YACL,SAAS,IAAMJ,cAAcC,QAAQ;oBAACC;iBAAM,EAAEA,MAAM,KAAK,CAAC,IAAI;sBAC/D;;;AAKP;AAEA,SAASG,cAAoBC,SAAiB;IAC5C,MAAM,CAACC,YAAYC,cAAc,GAAGC,SAAS;IAC7C,MAAM,CAACC,gBAAgBC,kBAAkB,GAAGF,SAAS;IACrD,MAAMG,cAAcC,OAAiB;IAErC,MAAMC,eAAe,CACnBC,cACAC,SACAV;QAEAU;QACAR,cAAcO,YAAY,CAAC,EAAE;QAC7BJ,kBAAkBL;IACpB;IAEA,MAAMW,cAAc,CAACC;QACnBA;QACAV,cAAc;IAChB;IAEA,OAAO;QACL,gBAAgB,CAAC,EACfW,eAAe,EACfJ,YAAY,EACZC,OAAO,EACPE,YAAY,EACZE,KAAK,EACN,iBACC,KAAC;gBAAI,OAAO;oBAAE,SAAS;gBAAE;gBAAG,WAAW,CAACC,IAAMA,EAAE,eAAe;;kCAC7D,IAACC,OAAKA;wBACJ,KAAKV;wBACL,aAAa,CAAC,OAAO,EAAEN,WAAW;wBAClC,OAAOS,YAAY,CAAC,EAAE;wBACtB,UAAU,CAACM,IACTF,gBAAgBE,EAAE,MAAM,CAAC,KAAK,GAAG;gCAACA,EAAE,MAAM,CAAC,KAAK;6BAAC,GAAG,EAAE;wBAExD,cAAc,IACZP,aAAaC,cAA0BC,SAASV;wBAElD,OAAO;4BAAE,cAAc;4BAAG,SAAS;wBAAQ;;kCAE7C,KAACiB,OAAKA;;0CACJ,IAACnB,QAAMA;gCACL,MAAK;gCACL,SAAS,IACPU,aAAaC,cAA0BC,SAASV;gCAElD,oBAAM,IAACkB,gBAAcA,CAAAA;gCACrB,MAAK;gCACL,OAAO;oCAAE,OAAO;gCAAG;0CACpB;;0CAGD,IAACpB,QAAMA;gCACL,SAAS,IAAMc,gBAAgBD,YAAYC;gCAC3C,MAAK;gCACL,OAAO;oCAAE,OAAO;gCAAG;0CACpB;;0CAGD,IAACd,QAAMA;gCAAC,MAAK;gCAAO,MAAK;gCAAQ,SAASgB;0CAAO;;;;;;QAMvD,YAAY,CAACK,WAAAA,WAAAA,GACX,IAACD,gBAAcA;gBAAC,OAAO;oBAAE,OAAOC,WAAW,YAAYC;gBAAU;;QAEnE,UAAU,CAACC,OAAOC,SAETA,MAAM,CAACtB,UAAU,CACrB,QAAQ,GACR,WAAW,GACX,QAAQ,CAAEqB,MAAiB,WAAW;QAE3C,QAAQ,CAACE,OACAnB,mBAAmBJ,YAAY,WAAZA,GACxB,IAACwB,uBAAWA;gBACV,gBAAgB;oBAAE,iBAAiB;oBAAW,SAAS;gBAAE;gBACzD,aAAa;oBAACvB;iBAAW;gBACzB,YAAU;gBACV,iBAAiBsB,OAAOA,KAAK,QAAQ,KAAK;iBAG5CA;IAGN;AACF;AAEO,MAAME,kBAAwC,CAAC,EACpD9B,MAAM,EACN+B,WAAW,EACXhC,aAAa,EACd;IASC,MAAMiC,cAAcC,QAClB,IAAMF,YAAY,oBAAoB,CAAC/B,QAAS,cAAc,IAC9D;QAACA;KAAO;IAEV,MAAMkC,aAAaF,YAChB,GAAG,CAAC,CAAC,EAAEG,QAAQ,EAAEC,IAAI,EAAEC,UAAU,EAAE,EAAEC,IAC7B;YACL,KAAKA;YACLF;YACA,YAAYpC,OAAO,cAAc,GAC7BqC,WAAW,QAAQ,CAAC,MAAM,GAC1BA,WAAW,QAAQ,CAAC,WAAW;YACnC,aAAaF,UAAU;QACzB,IAED,IAAI,CAAC,CAACI,KAAKC;QAEV,IAAID,IAAI,IAAI,KAAKC,KAAK,IAAI,EACxB,OAAOD,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,GAAIC,KAAK,UAAU,CAAC,KAAK,CAAC,IAAI,GAC1D,IACA;QAIN,OAAOD,IAAI,IAAI,GAAGC,KAAK,IAAI,GAAG,IAAI;IACpC,GACC,MAAM,CAAC,CAACC,KAAKC;QACZ,MAAMC,WAAWF,GAAG,CAACA,IAAI,MAAM,GAAG,EAAE;QAEpC,IAAI,CAACE,YAAYA,SAAS,IAAI,KAAKD,KAAK,IAAI,EAAE;YAC5CD,IAAI,IAAI,CAACC;YACT,OAAOD;QACT;QAEA,IAAI,CAACE,SAAS,QAAQ,EACpBA,SAAS,QAAQ,GAAG,EAAE;QAGxBA,SAAS,QAAQ,CAAC,IAAI,CAACD;QACvB,OAAOD;IACT,GAAG,EAAE;IAEP,MAAMG,UAA6B;QACjC;YACE,OAAO;YACP,WAAW;YACX,KAAK;YACL,OAAO;YACP,GAAGxC,cAA8B,OAAO;QAC1C;QACA;YACE,OAAO;YACP,WAAW;YACX,KAAK;YACL,OAAO;YACP,QAAQ,CAACN,MACA,WAAP,GACE,IAACI,SAAOA;oBAAC,OAAO,CAAC,kBAAkB,EAAEJ,IAAI,KAAK,CAAC,IAAI,EAAE;8BACnD,kBAACK,QAAMA;wBACL,MAAK;wBACL,SAAS,IAAMJ,cAAcC,QAAQ;gCAACF;6BAAI,EAAEA,IAAI,KAAK,CAAC,IAAI;kCAC3D;;;QAMT;QACA;YACE,OAAO;YACP,WAAW;YACX,KAAK;YACL,OAAO;YACP,QAAQ,CAACA,MACAD,sBAAsBC,KAAKC;QAEtC;KACD;IAED,MAAM8C,YAAY,WAAZA,GACJ,IAACC,MAAAA,QAAc;kBACb,mBAACxB,OAAKA;YAAC,OAAO;gBAAE,YAAY;YAAI;;gBAAG;8BAEjC,IAACyB,WAAW,IAAI;oBAAC,QAAM;8BAAEb,WAAW,MAAM;;gBAAmB;8BAE7D,IAACc,SAAOA;oBAAC,MAAK;;8BACd,IAACD,WAAW,IAAI;oBAAC,QAAM;8BAAEf,YAAY,MAAM;;gBAAmB;;;;IAMpE,OAAO,WAAP,GACE,IAACiB,MAAIA;QACH,OAAO;YAAE,cAAc;QAAG;QAC1B,OAAOJ;QACP,WAAU;kBAEV,kBAACK,OAAKA;YACJ,MAAK;YACL,YAAYhB;YACZ,SAASU;YACT,YAAY;YACZ,QAAQ;gBAAE,GAAGhD;YAAY;;;AAIjC;AAEO,MAAMuD,cAAoC,CAAC,EAChDnD,MAAM,EACN+B,WAAW,EACXhC,aAAa,EACd;IACC,MAAMqD,cAAcnB,QAClB,IAAMF,YAAY,oBAAoB,CAAC/B,QAAS,UAAU,IAC1D;QAACA;KAAO;IAEV,MAAMqD,mBAAmBD,YAAY,MAAM,CACzC,CAACV,OAASA,AAAiC,MAAjCA,KAAK,cAAc,GAAG,MAAM;IAExC,MAAMG,YAAY,WAAZA,GACJ,KAACC,MAAAA,QAAc;;0BACb,KAACxB,OAAKA;gBAAC,OAAO;oBAAE,YAAY;gBAAI;;oBAAG;kCAEjC,IAACyB,WAAW,IAAI;wBAAC,QAAM;kCAAEK,YAAY,MAAM;;;;YAE5CA,YAAY,MAAM,GAAG,IAAI,WAAJ,GACpB;;kCACE,IAACJ,SAAOA;wBAAC,MAAK;;kCACd,KAACD,WAAW,IAAI;wBAAC,OAAO;4BAAE,YAAY;wBAAI;wBAAG,MAAI;;0CAC/C,IAACA,WAAW,IAAI;0CAAC;;0CACjB,IAACC,SAAOA;gCAAC,MAAK;;0CACd,IAACD,WAAW,IAAI;gCAAC,QAAM;0CAAEM,iBAAiB,MAAM;;;;kCAElD,IAACL,SAAOA;wBAAC,MAAK;;kCACd,KAACD,WAAW,IAAI;wBAAC,OAAO;4BAAE,YAAY;wBAAI;wBAAG,MAAI;;0CAC/C,IAACA,WAAW,IAAI;0CAAC;;0CACjB,IAACC,SAAOA;gCAAC,MAAK;;0CACd,IAACD,WAAW,IAAI;gCAAC,QAAM;0CACpBK,YAAY,MAAM,GAAGC,iBAAiB,MAAM;;;;;iBAKnD;;;IAeN,MAAMnB,aAAwBkB,YAAY,GAAG,CAAC,CAACV,MAAMJ;QACnD,MAAM,EAAEH,QAAQ,EAAE,GAAGO;QAErB,OAAO;YACL,KAAKJ;YACL,MAAMI,KAAK,IAAI;YACf,aAAaP,UAAU;YACvB,MAAMO,KACH,cAAc,GACd,GAAG,CAAC,CAAC,EAAE1C,MAAM,EAAEqC,UAAU,EAAE;gBAC1B,MAAMpC,QAAQD,QAAQ,iBAClBqC,WAAW,QAAQ,CAAC,MAAM,GAC1BA,WAAW,QAAQ,CAAC,WAAW;gBAEnC,IAAI,CAACrC,UAAU,CAACC,OACd;gBAGF,OAAO;oBACLD;oBACAC;gBACF;YACF,GACC,MAAM,CAACqD;QACZ;IACF;IAEA,MAAMV,UAA6B;QACjC;YACE,OAAO;YACP,WAAW;YACX,KAAK;YACL,OAAO;YACP,GAAGxC,cAAkC,OAAO;QAC9C;QACA;YACE,OAAO;YACP,WAAW;YACX,KAAK;YACL,OAAO;YACP,QAAQ,CAACN,MACAD,sBAAsBC,KAAKC;QAEtC;QACA;YACE,OAAO;YACP,WAAW;YACX,KAAK;YACL,OAAO;YACP,QAAQ,CAACwD,GAAYC,IAAeD,EAAE,IAAI,CAAC,MAAM,GAAGC,EAAE,IAAI,CAAC,MAAM;YACjE,gBAAgB;gBAAC;gBAAW;aAAS;YACrC,QAAQ,CAAC1D,MAAAA,WAAAA,GAAyB,KAAC;;wBAAK;wBAAMA,IAAI,MAAM;wBAAC;;;QAC3D;KACD;IAED,MAAM2D,gBAAgB,CAACC,OACd,WAAP,GACE,KAAC;YAAI,WAAU;;8BACb,IAACX,WAAW,IAAI;8BAAC;;gBAChBW,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE1D,MAAM,EAAEC,KAAK,EAAO,iBACpC,IAACC,SAAOA;wBAAiB,OAAO,GAAGF,OAAO,IAAI,CAAC,CAAC,EAAEC,MAAM,KAAK,CAAC,IAAI,EAAE;kCAClE,kBAACE,QAAMA;4BACL,WAAU;4BACV,MAAK;4BACL,SAAS;gCACPJ,cAAcC,QAAQ;oCAACC;iCAAM,EAAEA,MAAM,KAAK,CAAC,IAAI;4BACjD;sCAEC,GAAG0D,aAAa3D,OAAO,IAAI,EAAE,CAAC,EAAEC,MAAM,KAAK,CAAC,IAAI,EAAE;;uBARzCD,OAAO,EAAE;;;IAgB/B,OAAO,WAAP,GACE,IAACiD,MAAIA;QAAC,OAAOJ;QAAW,WAAU;kBAChC,kBAACK,OAAKA;YACJ,MAAK;YACL,YAAYhB;YACZ,SAASU;YACT,YAAY;YACZ,QAAQ;gBAAE,GAAGhD;YAAY;YACzB,YAAY;gBACV,mBAAmB6D;gBACnB,eAAe,CAAC3D,MAAaA,IAAI,IAAI,CAAC,MAAM,GAAG;YACjD;;;AAIR;AAEO,MAAM8D,mBAAyC,CAACC,QAC9CA,AAAe,kBAAfA,MAAM,IAAI,GAAqB,WAAhB,GACpB,IAAC/B,iBAAAA;QAAiB,GAAG+B,KAAK;uBAE1B,IAACV,aAAAA;QAAa,GAAGU,KAAK"}
|
|
1
|
+
{"version":3,"file":"pages/TreeShaking/table.mjs","sources":["../../../src/pages/TreeShaking/table.tsx"],"sourcesContent":["import { SDK } from '@rsdoctor/types';\nimport {\n Space,\n Table,\n Typography,\n Divider,\n Tooltip,\n Button,\n Input,\n InputRef,\n} from 'antd';\nimport { SearchOutlined } from '@ant-design/icons';\nimport type { ColumnType, FilterConfirmProps } from 'antd/es/table/interface';\nimport React, { useMemo, useState, useRef } from 'react';\nimport Highlighter from 'react-highlight-words';\nimport { Card } from '../../components/Card';\nimport type { TableKind, SetEditorStatus } from './types';\nimport { ellipsisPath } from './utils';\nimport { isDef } from '../../utils';\n\nconst tableHeight = 600;\n\ninterface TableProps {\n module: SDK.ModuleInstance;\n moduleGraph: SDK.ModuleGraphInstance;\n setEditorData: SetEditorStatus;\n kind: TableKind;\n}\n\nfunction getDeclarationElement(\n val: SDK.StatementInstance | undefined,\n setEditorData: SetEditorStatus,\n) {\n if (!val) {\n return <div>Can not find declaration.</div>;\n }\n\n const { module } = val;\n const range = module.isPreferSource\n ? val.position.source!\n : val.position.transformed;\n\n return (\n <Tooltip title={`${module.path}, line ${range.start.line}`}>\n <Button\n type=\"link\"\n onClick={() => setEditorData(module, [range], range.start.line)}\n >\n Move To\n </Button>\n </Tooltip>\n );\n}\n\nfunction useSearchCell<Data>(dataIndex: string): ColumnType<Data> {\n const [searchText, setSearchText] = useState('');\n const [searchedColumn, setSearchedColumn] = useState('');\n const searchInput = useRef<InputRef>(null);\n\n const handleSearch = (\n selectedKeys: string[],\n confirm: (param?: FilterConfirmProps) => void,\n dataIndex: string,\n ) => {\n confirm();\n setSearchText(selectedKeys[0]);\n setSearchedColumn(dataIndex);\n };\n\n const handleReset = (clearFilters: () => void) => {\n clearFilters();\n setSearchText('');\n };\n\n return {\n filterDropdown: ({\n setSelectedKeys,\n selectedKeys,\n confirm,\n clearFilters,\n close,\n }) => (\n <div style={{ padding: 8 }} onKeyDown={(e) => e.stopPropagation()}>\n <Input\n ref={searchInput}\n placeholder={`Search ${dataIndex}`}\n value={selectedKeys[0]}\n onChange={(e) =>\n setSelectedKeys(e.target.value ? [e.target.value] : [])\n }\n onPressEnter={() =>\n handleSearch(selectedKeys as string[], confirm, dataIndex)\n }\n style={{ marginBottom: 8, display: 'block' }}\n />\n <Space>\n <Button\n type=\"primary\"\n onClick={() =>\n handleSearch(selectedKeys as string[], confirm, dataIndex)\n }\n icon={<SearchOutlined />}\n size=\"small\"\n style={{ width: 90 }}\n >\n Search\n </Button>\n <Button\n onClick={() => clearFilters && handleReset(clearFilters)}\n size=\"small\"\n style={{ width: 90 }}\n >\n Reset\n </Button>\n <Button type=\"link\" size=\"small\" onClick={close}>\n close\n </Button>\n </Space>\n </div>\n ),\n filterIcon: (filtered: boolean) => (\n <SearchOutlined style={{ color: filtered ? '#1890ff' : undefined }} />\n ),\n onFilter: (value, record): boolean => {\n // @ts-ignore\n return record[dataIndex]\n .toString()\n .toLowerCase()\n .includes((value as string).toLowerCase());\n },\n render: (text: string) => {\n return searchedColumn === dataIndex ? (\n <Highlighter\n highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }}\n searchWords={[searchText]}\n autoEscape\n textToHighlight={text ? text.toString() : ''}\n />\n ) : (\n text\n );\n },\n };\n}\n\nexport const SideEffectTable: React.FC<TableProps> = ({\n module,\n moduleGraph,\n setEditorData,\n}) => {\n interface SideEffectDataRowData {\n key: number;\n name: string;\n identifier: SDK.SourceRange;\n declaration?: SDK.StatementInstance;\n children?: SideEffectDataRowData[];\n }\n\n const sideEffects = useMemo(\n () => moduleGraph.getModuleGraphModule(module)!.getSideEffects(),\n [module],\n );\n const dataSource = sideEffects\n .map(({ variable, name, identifier }, i): SideEffectDataRowData => {\n return {\n key: i,\n name,\n identifier: module.isPreferSource\n ? identifier.position.source!\n : identifier.position.transformed,\n declaration: variable?.identifier,\n };\n })\n .sort((pre, next) => {\n // 名称相同则看行数\n if (pre.name === next.name) {\n return pre.identifier.start.line! > next.identifier.start.line!\n ? 1\n : -1;\n }\n\n // 名称不同则比较名称\n return pre.name > next.name ? 1 : -1;\n })\n .reduce((ans, item) => {\n const lastItem = ans[ans.length - 1];\n\n if (!lastItem || lastItem.name !== item.name) {\n ans.push(item);\n return ans;\n }\n\n if (!lastItem.children) {\n lastItem.children = [];\n }\n\n lastItem.children.push(item);\n return ans;\n }, [] as SideEffectDataRowData[]);\n\n const columns: ColumnType<any>[] = [\n {\n title: 'Name',\n dataIndex: 'name',\n key: 'name',\n align: 'center',\n ...useSearchCell<SDK.ExportData>('name'),\n },\n {\n title: 'SideEffect',\n dataIndex: 'identifier',\n key: 'identifier',\n align: 'center',\n render: (val: SDK.SourceRange) => {\n return (\n <Tooltip title={`Current File line ${val.start.line}`}>\n <Button\n type=\"link\"\n onClick={() => setEditorData(module, [val], val.start.line)}\n >\n Move To\n </Button>\n </Tooltip>\n );\n },\n },\n {\n title: 'Declaration',\n dataIndex: 'declaration',\n key: 'declaration',\n align: 'center',\n render: (val: SDK.StatementInstance) => {\n return getDeclarationElement(val, setEditorData);\n },\n },\n ];\n\n const titleInfo = (\n <React.Fragment>\n <Space style={{ fontWeight: 400 }}>\n Import\n <Typography.Text strong>{dataSource.length}</Typography.Text>\n variables\n <Divider type=\"vertical\" />\n <Typography.Text strong>{sideEffects.length}</Typography.Text>\n sideEffects\n </Space>\n </React.Fragment>\n );\n\n return (\n <Card\n style={{ marginBottom: 10 }}\n title={titleInfo}\n className=\"tree-shaking-export-table\"\n >\n <Table\n size=\"small\"\n dataSource={dataSource}\n columns={columns}\n pagination={false}\n scroll={{ y: tableHeight }}\n />\n </Card>\n );\n};\n\nexport const ExportTable: React.FC<TableProps> = ({\n module,\n moduleGraph,\n setEditorData,\n}) => {\n const exportsData = useMemo(\n () => moduleGraph.getModuleGraphModule(module)!.getExports(),\n [module],\n );\n const allUnUsedExports = exportsData.filter(\n (item) => item.getSideEffects().length === 0,\n );\n const titleInfo = (\n <React.Fragment>\n <Space style={{ fontWeight: 400 }}>\n Export\n <Typography.Text strong>{exportsData.length}</Typography.Text>\n </Space>\n {exportsData.length > 0 ? (\n <>\n <Divider type=\"vertical\" />\n <Typography.Text style={{ fontWeight: 400 }} code>\n <Typography.Text>Unused</Typography.Text>\n <Divider type=\"vertical\" />\n <Typography.Text strong>{allUnUsedExports.length}</Typography.Text>\n </Typography.Text>\n <Divider type=\"vertical\" />\n <Typography.Text style={{ fontWeight: 400 }} code>\n <Typography.Text>Used</Typography.Text>\n <Divider type=\"vertical\" />\n <Typography.Text strong>\n {exportsData.length - allUnUsedExports.length}\n </Typography.Text>\n </Typography.Text>\n </>\n ) : (\n ''\n )}\n </React.Fragment>\n );\n\n interface RowData {\n key: number;\n name: string;\n declaration?: SDK.StatementInstance;\n used: {\n module: SDK.ModuleInstance;\n range: SDK.SourceRange;\n }[];\n }\n\n const dataSource: RowData[] = exportsData.map((item, i) => {\n const { variable } = item;\n\n return {\n key: i,\n name: item.name,\n declaration: variable?.identifier,\n used: item\n .getSideEffects()\n .map(({ module, identifier }) => {\n const range = module?.isPreferSource\n ? identifier.position.source\n : identifier.position.transformed;\n\n if (!module || !range) {\n return;\n }\n\n return {\n module,\n range,\n };\n })\n .filter(isDef),\n };\n });\n\n const columns: ColumnType<any>[] = [\n {\n title: 'Name',\n dataIndex: 'name',\n key: 'name',\n align: 'center',\n ...useSearchCell<SDK.ExportInstance>('name'),\n },\n {\n title: 'Declaration',\n dataIndex: 'declaration',\n key: 'declaration',\n align: 'center',\n render: (val?: SDK.StatementInstance) => {\n return getDeclarationElement(val, setEditorData);\n },\n },\n {\n title: 'Info',\n dataIndex: 'used',\n key: 'used',\n align: 'center',\n sorter: (a: RowData, b: RowData) => a.used.length - b.used.length,\n sortDirections: ['descend', 'ascend'],\n render: (val: RowData['used']) => <span>Used {val.length} times</span>,\n },\n ];\n\n const expandElement = (data: any) => {\n return (\n <div className=\"tree-shaking-side-effect-list\">\n <Typography.Text>List of SideEffect:</Typography.Text>\n {data.used.map(({ module, range }: any) => (\n <Tooltip key={module.id} title={`${module.path}:${range.start.line}`}>\n <Button\n className=\"tree-shaking-side-effect-list-item\"\n type=\"link\"\n onClick={() => {\n setEditorData(module, [range], range.start.line);\n }}\n >\n {`${ellipsisPath(module.path)}:${range.start.line}`}\n </Button>\n </Tooltip>\n ))}\n </div>\n );\n };\n\n return (\n <Card title={titleInfo} className=\"tree-shaking-export-table\">\n <Table\n size=\"small\"\n dataSource={dataSource}\n columns={columns}\n pagination={false}\n scroll={{ y: tableHeight }}\n expandable={{\n expandedRowRender: expandElement,\n rowExpandable: (val: any) => val.used.length > 0,\n }}\n />\n </Card>\n );\n};\n\nexport const TreeShakingTable: React.FC<TableProps> = (props) => {\n return props.kind === 'side-effect' ? (\n <SideEffectTable {...props} />\n ) : (\n <ExportTable {...props} />\n );\n};\n"],"names":["tableHeight","getDeclarationElement","val","setEditorData","module","range","Tooltip","Button","useSearchCell","dataIndex","searchText","setSearchText","useState","searchedColumn","setSearchedColumn","searchInput","useRef","handleSearch","selectedKeys","confirm","handleReset","clearFilters","setSelectedKeys","close","e","Input","Space","SearchOutlined","filtered","undefined","value","record","text","Highlighter","SideEffectTable","moduleGraph","sideEffects","useMemo","dataSource","variable","name","identifier","i","pre","next","ans","item","lastItem","columns","titleInfo","React","Typography","Divider","Card","Table","ExportTable","exportsData","allUnUsedExports","isDef","a","b","expandElement","data","ellipsisPath","TreeShakingTable","props"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SDK } from '@rsdoctor/types';
|
|
2
2
|
import type { editor } from 'monaco-editor';
|
|
3
|
-
export declare function useFileStructures(modules: SDK.ModuleInstance[], moduleGraph: SDK.ModuleGraphInstance, searchInput: string, selectedModule: SDK.ModuleInstance, onItemClick: (file: string) => void, cwd: string): import("
|
|
3
|
+
export declare function useFileStructures(modules: SDK.ModuleInstance[], moduleGraph: SDK.ModuleGraphInstance, searchInput: string, selectedModule: SDK.ModuleInstance, onItemClick: (file: string) => void, cwd: string): import("../../index.js").DataNode[];
|
|
4
4
|
export declare function getTreeFilesDefaultExpandedKeys(files: any[]): (string | number)[];
|
|
5
5
|
export declare function ellipsisPath(full: string): string;
|
|
6
6
|
export declare function getModulePositionString(statement: SDK.StatementInstance, module: SDK.ModuleInstance): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/TreeShaking/utils.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/TreeShaking/utils.mjs","sources":["../../../src/pages/TreeShaking/utils.tsx"],"sourcesContent":["import { Module } from '@rsdoctor/graph';\nimport { SDK } from '@rsdoctor/types';\nimport { Space, Tag } from 'antd';\nimport { escape, get } from 'es-toolkit/compat';\nimport type { editor, Range as RangeClass } from 'monaco-editor';\nimport path from 'path-browserify';\nimport { useMemo } from 'react';\nimport { getSelectionRange } from 'src/components/base/CodeViewer/utils';\nimport { Keyword } from '../../components/Keyword';\nimport { createFileStructures, mapFileKey } from '../../utils';\nimport { getOpenTagText } from './open-tag';\nimport { Range } from './range';\n\nexport function useFileStructures(\n modules: SDK.ModuleInstance[],\n moduleGraph: SDK.ModuleGraphInstance,\n searchInput: string,\n selectedModule: SDK.ModuleInstance,\n onItemClick: (file: string) => void,\n cwd: string,\n) {\n const files = useMemo(\n () =>\n createFileStructures({\n files: modules.map((item) => item.path),\n cwd,\n fileTitle(file, basename) {\n const module = moduleGraph\n .getModules()\n .find(\n (item) => item.path === file && item.kind === Module.kind.Normal,\n )!;\n const mgm = moduleGraph.getModuleGraphModule(module)!;\n const infos = mgm.getExports();\n const unused = infos.filter(\n (info) => info.getSideEffects().length === 0,\n );\n return (\n <Space style={{ wordBreak: 'break-all' }}>\n <Keyword\n text={basename}\n keyword={file}\n onClick={() => onItemClick(file)}\n />\n {mgm.dynamic ? <Tag color=\"cyan\">dynamic</Tag> : ''}\n {unused.length > 0 ? (\n <Tag color=\"green\">{unused.length} Unused</Tag>\n ) : (\n ''\n )}\n </Space>\n );\n },\n }),\n [searchInput, selectedModule],\n );\n\n return files;\n}\n\nexport function getTreeFilesDefaultExpandedKeys(files: any[]) {\n return mapFileKey(files, 3, (node) => {\n const resourcePath: string = get(node, '__RESOURCEPATH__')!;\n const isNodeModules = resourcePath.indexOf('/node_modules/') > -1;\n return !isNodeModules;\n });\n}\n\nexport function ellipsisPath(full: string) {\n let result = '';\n let current = full;\n\n for (let i = 0; i < 3; i++) {\n result = result\n ? `${path.basename(current)}/${result}`\n : path.basename(current);\n current = path.dirname(current);\n }\n\n return `...${result}`;\n}\n\nexport function getModulePositionString(\n statement: SDK.StatementInstance,\n module: SDK.ModuleInstance,\n) {\n const maxLen = 30;\n const { path, isPreferSource } = module;\n const start = isPreferSource\n ? statement.position.source!.start\n : statement.position.transformed.start;\n const suffix = `:${start.line ?? 1}:${start.column ?? 0}`;\n\n return path.length <= maxLen\n ? `${path}${suffix}`\n : `...${path.substring(path.length - 30)}${suffix}`;\n}\n\nexport function getHoverMessageInModule(\n module: SDK.ModuleInstance,\n moduleGraph: SDK.ModuleGraphInstance,\n) {\n const mgm = moduleGraph.getModuleGraphModule(module);\n /** 当前模块导出变量 */\n const exportLocals = mgm.getOwnExports();\n /** 当前模块声明变量 */\n const variables = exportLocals\n .map((item) => item.variable)\n .filter((item): item is SDK.VariableInstance => Boolean(item));\n\n if (exportLocals.length === 0 && variables.length === 0) {\n return [];\n }\n\n function getVariableMessage(data: SDK.VariableInstance) {\n const exportData = data.getExportInfo();\n\n if (!exportData) {\n return 'Can not find SideEffect info.';\n }\n\n const sideEffects = exportData.getSideEffects();\n\n if (sideEffects.length === 0) {\n return 'Have no sideEffect.';\n }\n\n /*\n * monaco hover html 代码允许的元素和标签\n * @link https://github.com/microsoft/vscode/blob/6d2920473c6f13759c978dd89104c4270a83422d/src/vs/base/browser/markdownRenderer.ts#L296-L317\n */\n\n let content = `Used **${sideEffects.length}** times:\\n\\n<div data-code=\"tree-shaking-hover\">\\n<li>`;\n\n for (const sideEffect of sideEffects) {\n if (!sideEffect) {\n continue;\n }\n\n const { identifier, module } = sideEffect;\n\n if (!module) {\n continue;\n }\n\n const { id, isPreferSource } = module;\n const lineCode = identifier.getLineCode();\n\n content += `\\n<ol>\n ${getOpenTagText(\n id,\n isPreferSource\n ? identifier.position.source!\n : identifier.position.transformed,\n getModulePositionString(identifier, module),\n )}\n ${lineCode ? `<pre>${escape(lineCode)}</pre>` : ''}\n </ol>`;\n }\n\n content += '\\n</li></div>';\n\n return content;\n }\n\n const { isPreferSource } = module;\n\n const declarationHovers = variables\n .map((item) => {\n const position = isPreferSource\n ? item.identifier.position.source\n : item.identifier.position.transformed;\n const range =\n position &&\n getSelectionRange(position, Range as unknown as typeof RangeClass);\n\n if (!position || !range) {\n return;\n }\n\n return {\n range,\n options: {\n stickiness: 1,\n inlineClassName: 'tree-shaking-statement-declaration-identifier',\n isWholeLine: false,\n showIfCollapsed: true,\n hoverMessage: {\n supportHtml: true,\n supportThemeIcons: true,\n isTrusted: true,\n value: getVariableMessage(item),\n },\n },\n } as unknown as editor.IModelDecoration;\n })\n .filter((item): item is editor.IModelDecoration => Boolean(item));\n\n /**\n * 导出部分的信息,需要先过滤声明和导出位置重叠的部分\n * export { foo };\n * export { foo } from 'foo';\n * export * as name from 'foo';\n * export * from 'foo';\n * 最后一种需要合并位置\n */\n\n return declarationHovers;\n}\n"],"names":["useFileStructures","modules","moduleGraph","searchInput","selectedModule","onItemClick","cwd","files","useMemo","createFileStructures","item","file","basename","module","Module","mgm","infos","unused","info","Space","Keyword","Tag","getTreeFilesDefaultExpandedKeys","mapFileKey","node","resourcePath","get","isNodeModules","ellipsisPath","full","result","current","i","path","getModulePositionString","statement","maxLen","isPreferSource","start","suffix","getHoverMessageInModule","exportLocals","variables","Boolean","getVariableMessage","data","exportData","sideEffects","content","sideEffect","identifier","id","lineCode","getOpenTagText","escape","declarationHovers","position","range","getSelectionRange","Range"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/Uploader/constants.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/Uploader/constants.mjs","sources":["../../../src/pages/Uploader/constants.ts"],"sourcesContent":["import { Client } from '@rsdoctor/types';\n\nexport const name = 'Upload and Analysis';\n\nexport const route = Client.RsdoctorClientRoutes.Uploader;\n"],"names":["name","route","Client"],"mappings":";AAEO,MAAMA,iBAAO;AAEb,MAAMC,QAAQC,OAAO,oBAAoB,CAAC,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/Uploader/index.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/Uploader/index.mjs","sources":["../../../src/pages/Uploader/index.tsx"],"sourcesContent":["import { InboxOutlined } from '@ant-design/icons';\nimport { Common } from '@rsdoctor/types';\nimport { message, Spin, Upload, UploadFile } from 'antd';\nimport React, { useState } from 'react';\nimport { readJSONByFileReader } from '../../utils';\nimport { isRspackStats } from '../../utils/stats';\nimport { handleRspackStats, handleRsdoctorManifest } from './utils';\n\nconst Component: React.FC = () => {\n const [loading, setLoading] = useState(false);\n\n // Main file upload processing function\n const handleFileUpload = async (file: UploadFile) => {\n if (!file) return;\n\n setLoading(true);\n\n try {\n const json = await readJSONByFileReader<Common.PlainObject>(file);\n\n if (!json || typeof json !== 'object') {\n throw new Error('Invalid JSON format');\n }\n\n if (isRspackStats(json)) {\n await handleRspackStats(json);\n } else {\n handleRsdoctorManifest(json);\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n message.error(`Upload failed: ${errorMessage}`);\n console.error('Upload error:', err);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Spin spinning={loading} tip=\"uploading...\">\n <Upload.Dragger\n multiple={false}\n showUploadList={false}\n accept=\".json\"\n onChange={({ file }) => {\n handleFileUpload(file);\n }}\n style={{ width: '100%' }}\n beforeUpload={() => false}\n >\n <p className=\"ant-upload-drag-icon\">\n <InboxOutlined />\n </p>\n <p className=\"ant-upload-text\">\n Click or drag JSON file to this area to upload and analyze your\n stats.json or rsdoctor's rsdoctor-data.json.\n </p>\n <p className=\"ant-upload-hint\">\n The rsdoctor's rsdoctor-data.json is in brief mode, and use the file\n type: ['json'].\n <a\n href=\"https://rsdoctor.rs/zh/config/options/output#mode-brief\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Check the details.\n </a>\n </p>\n <p className=\"ant-upload-hint\">\n By default, Rsdoctor will emit the rsdoctor-data.json to the output\n folder.\n </p>\n </Upload.Dragger>\n </Spin>\n );\n};\n\nexport const Page = Component;\nexport * from './constants';\n"],"names":["Component","loading","setLoading","useState","handleFileUpload","file","json","readJSONByFileReader","Error","isRspackStats","handleRspackStats","handleRsdoctorManifest","err","errorMessage","message","console","Spin","Upload","InboxOutlined","Page"],"mappings":";;;;;;;;AAQA,MAAMA,YAAsB;IAC1B,MAAM,CAACC,SAASC,WAAW,GAAGC,SAAS;IAGvC,MAAMC,mBAAmB,OAAOC;QAC9B,IAAI,CAACA,MAAM;QAEXH,WAAW;QAEX,IAAI;YACF,MAAMI,OAAO,MAAMC,qBAAyCF;YAE5D,IAAI,CAACC,QAAQ,AAAgB,YAAhB,OAAOA,MAClB,MAAM,IAAIE,MAAM;YAGlB,IAAIC,cAAcH,OAChB,MAAMI,kBAAkBJ;iBAExBK,uBAAuBL;QAE3B,EAAE,OAAOM,KAAK;YACZ,MAAMC,eAAeD,eAAeJ,QAAQI,IAAI,OAAO,GAAG;YAC1DE,QAAQ,KAAK,CAAC,CAAC,eAAe,EAAED,cAAc;YAC9CE,QAAQ,KAAK,CAAC,iBAAiBH;QACjC,SAAU;YACRV,WAAW;QACb;IACF;IAEA,OAAO,WAAP,GACE,IAACc,MAAIA;QAAC,UAAUf;QAAS,KAAI;kBAC3B,mBAACgB,OAAO,OAAO;YACb,UAAU;YACV,gBAAgB;YAChB,QAAO;YACP,UAAU,CAAC,EAAEZ,IAAI,EAAE;gBACjBD,iBAAiBC;YACnB;YACA,OAAO;gBAAE,OAAO;YAAO;YACvB,cAAc,IAAM;;8BAEpB,IAAC;oBAAE,WAAU;8BACX,kBAACa,eAAaA,CAAAA;;8BAEhB,IAAC;oBAAE,WAAU;8BAAkB;;8BAI/B,KAAC;oBAAE,WAAU;;wBAAkB;sCAG7B,IAAC;4BACC,MAAK;4BACL,QAAO;4BACP,KAAI;sCACL;;;;8BAIH,IAAC;oBAAE,WAAU;8BAAkB;;;;;AAOvC;AAEO,MAAMC,OAAOnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/Uploader/utils.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/Uploader/utils.mjs","sources":["../../../src/pages/Uploader/utils.ts"],"sourcesContent":["import { Client, Common, Constants, Manifest } from '@rsdoctor/types';\nimport { message } from 'antd';\nimport { loadRspackStats } from '../../utils/stats';\n\n// Default enabled routes\nconst defaultEnableRoutes = [\n Manifest.RsdoctorManifestClientRoutes.Overall,\n Manifest.RsdoctorManifestClientRoutes.BundleSize,\n];\n\n// Build redirect URL\nconst buildRedirectUrl = (enableRoutes: string[]) => {\n const baseUrl = `//${location.host}${location.pathname}#/overall`;\n const queryParams =\n enableRoutes && enableRoutes.length > 0\n ? `?${Client.RsdoctorClientUrlQuery.EnableRoutes}=${encodeURIComponent(JSON.stringify(enableRoutes))}`\n : '';\n return `${baseUrl}${queryParams}`;\n};\n\n// Set window data and redirect\nconst setWindowDataAndRedirect = (data: any, enableRoutes: string[]) => {\n window[Constants.WINDOW_RSDOCTOR_TAG] = data;\n window[Constants.WINDOW_RSDOCTOR_TAG].enableRoutes = enableRoutes;\n\n const redirectUrl = buildRedirectUrl(enableRoutes);\n location.href = redirectUrl;\n\n message.success('JSON data loaded successfully!');\n};\n\n// Handle Rspack Stats data\nexport const handleRspackStats = async (json: Common.PlainObject) => {\n try {\n const manifestJson = await loadRspackStats([json]);\n if (manifestJson && manifestJson[0]) {\n setWindowDataAndRedirect(manifestJson[0].data, defaultEnableRoutes);\n } else {\n throw new Error('Invalid manifest data');\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n message.error(`Failed to load Rspack stats: ${errorMessage}`);\n throw err;\n }\n};\n\n// Handle Rsdoctor Manifest data\nexport const handleRsdoctorManifest = (json: Common.PlainObject) => {\n try {\n const enableRoutes = json.clientRoutes || defaultEnableRoutes;\n setWindowDataAndRedirect(json.data, enableRoutes);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n message.error(`Failed to load manifest data: ${errorMessage}`);\n console.error('Failed to load manifest data:', err);\n }\n};\n"],"names":["defaultEnableRoutes","Manifest","buildRedirectUrl","enableRoutes","baseUrl","location","queryParams","Client","encodeURIComponent","JSON","setWindowDataAndRedirect","data","window","Constants","redirectUrl","message","handleRspackStats","json","manifestJson","loadRspackStats","Error","err","errorMessage","handleRsdoctorManifest","console"],"mappings":";;;AAKA,MAAMA,sBAAsB;IAC1BC,SAAS,4BAA4B,CAAC,OAAO;IAC7CA,SAAS,4BAA4B,CAAC,UAAU;CACjD;AAGD,MAAMC,mBAAmB,CAACC;IACxB,MAAMC,UAAU,CAAC,EAAE,EAAEC,SAAS,IAAI,GAAGA,SAAS,QAAQ,CAAC,SAAS,CAAC;IACjE,MAAMC,cACJH,gBAAgBA,aAAa,MAAM,GAAG,IAClC,CAAC,CAAC,EAAEI,OAAO,sBAAsB,CAAC,YAAY,CAAC,CAAC,EAAEC,mBAAmBC,KAAK,SAAS,CAACN,gBAAgB,GACpG;IACN,OAAO,GAAGC,UAAUE,aAAa;AACnC;AAGA,MAAMI,2BAA2B,CAACC,MAAWR;IAC3CS,MAAM,CAACC,UAAU,mBAAmB,CAAC,GAAGF;IACxCC,MAAM,CAACC,UAAU,mBAAmB,CAAC,CAAC,YAAY,GAAGV;IAErD,MAAMW,cAAcZ,iBAAiBC;IACrCE,SAAS,IAAI,GAAGS;IAEhBC,QAAQ,OAAO,CAAC;AAClB;AAGO,MAAMC,oBAAoB,OAAOC;IACtC,IAAI;QACF,MAAMC,eAAe,MAAMC,gBAAgB;YAACF;SAAK;QACjD,IAAIC,gBAAgBA,YAAY,CAAC,EAAE,EACjCR,yBAAyBQ,YAAY,CAAC,EAAE,CAAC,IAAI,EAAElB;aAE/C,MAAM,IAAIoB,MAAM;IAEpB,EAAE,OAAOC,KAAK;QACZ,MAAMC,eAAeD,eAAeD,QAAQC,IAAI,OAAO,GAAG;QAC1DN,QAAQ,KAAK,CAAC,CAAC,6BAA6B,EAAEO,cAAc;QAC5D,MAAMD;IACR;AACF;AAGO,MAAME,yBAAyB,CAACN;IACrC,IAAI;QACF,MAAMd,eAAec,KAAK,YAAY,IAAIjB;QAC1CU,yBAAyBO,KAAK,IAAI,EAAEd;IACtC,EAAE,OAAOkB,KAAK;QACZ,MAAMC,eAAeD,eAAeD,QAAQC,IAAI,OAAO,GAAG;QAC1DN,QAAQ,KAAK,CAAC,CAAC,8BAA8B,EAAEO,cAAc;QAC7DE,QAAQ,KAAK,CAAC,iCAAiCH;IACjD;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/WebpackLoaders/Analysis/constants.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/WebpackLoaders/Analysis/constants.mjs","sources":["../../../../src/pages/WebpackLoaders/Analysis/constants.ts"],"sourcesContent":["import { Client } from '@rsdoctor/types';\n\nexport const name = 'Loaders Analysis';\n\nexport const route = Client.RsdoctorClientRoutes.WebpackLoaderAnalysis;\n"],"names":["name","route","Client"],"mappings":";AAEO,MAAMA,iBAAO;AAEb,MAAMC,QAAQC,OAAO,oBAAoB,CAAC,qBAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/WebpackLoaders/Analysis/index.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/WebpackLoaders/Analysis/index.mjs","sources":["../../../../src/pages/WebpackLoaders/Analysis/index.tsx"],"sourcesContent":["import React from 'react';\nimport { LoaderAnalysis } from '../../../components/Loader/Analysis';\nimport { WebpackConfigurationViewer } from '../../../components/Configuration';\nimport { Card } from '../../../components/Card';\nimport { Popover, Space, Tag, theme, Typography } from 'antd';\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\nimport { t } from 'i18next';\nconst { useToken } = theme;\n\nexport const Page: React.FC = () => {\n const { token } = useToken();\n\n return (\n <Card\n title={\n <Space align=\"baseline\">\n <Typography.Title level={5} style={{ margin: 0 }}>\n Loader Analysis\n </Typography.Title>\n <Popover\n content={\n <div>\n {t('AsyncLoaderInfo')}\n <a\n href=\"https://rsdoctor.rs/guide/more/faq#cssextractrspackplugin-%E7%9A%84-loader-%E8%80%97%E6%97%B6%E8%BF%87%E9%95%BF%E9%97%AE%E9%A2%98\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {t('Details')}\n </a>\n </div>\n }\n title=\"Info\"\n >\n <Tag icon={<ExclamationCircleOutlined />} color=\"warning\">\n Info\n </Tag>\n </Popover>\n </Space>\n }\n extra={<WebpackConfigurationViewer defaultKeys={['module', 'resolve']} />}\n bodyStyle={{ paddingTop: token.padding, height: 800 }}\n >\n <LoaderAnalysis />\n </Card>\n );\n};\n\nexport * from './constants';\n"],"names":["useToken","theme","Page","token","Card","Space","Typography","Popover","t","Tag","ExclamationCircleOutlined","WebpackConfigurationViewer","LoaderAnalysis"],"mappings":";;;;;;;;;AAOA,MAAM,EAAEA,QAAQ,EAAE,GAAGC;AAEd,MAAMC,OAAiB;IAC5B,MAAM,EAAEC,KAAK,EAAE,GAAGH;IAElB,OAAO,WAAP,GACE,IAACI,MAAIA;QACH,qBACE,KAACC,OAAKA;YAAC,OAAM;;8BACX,IAACC,WAAW,KAAK;oBAAC,OAAO;oBAAG,OAAO;wBAAE,QAAQ;oBAAE;8BAAG;;8BAGlD,IAACC,SAAOA;oBACN,uBACE,KAAC;;4BACEC,EAAE;0CACH,IAAC;gCACC,MAAK;gCACL,QAAO;gCACP,KAAI;0CAEHA,EAAE;;;;oBAIT,OAAM;8BAEN,kBAACC,KAAGA;wBAAC,oBAAM,IAACC,2BAAyBA,CAAAA;wBAAK,OAAM;kCAAU;;;;;QAMhE,qBAAO,IAACC,4BAA0BA;YAAC,aAAa;gBAAC;gBAAU;aAAU;;QACrE,WAAW;YAAE,YAAYR,MAAM,OAAO;YAAE,QAAQ;QAAI;kBAEpD,kBAACS,gBAAcA,CAAAA;;AAGrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/WebpackLoaders/Overall/constants.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/WebpackLoaders/Overall/constants.mjs","sources":["../../../../src/pages/WebpackLoaders/Overall/constants.ts"],"sourcesContent":["import { Client } from '@rsdoctor/types';\n\nexport const name = 'Loaders Timeline';\n\nexport const route = Client.RsdoctorClientRoutes.WebpackLoaderOverall;\n"],"names":["name","route","Client"],"mappings":";AAEO,MAAMA,iBAAO;AAEb,MAAMC,QAAQC,OAAO,oBAAoB,CAAC,oBAAoB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/WebpackLoaders/Overall/index.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/WebpackLoaders/Overall/index.mjs","sources":["../../../../src/pages/WebpackLoaders/Overall/index.tsx"],"sourcesContent":["import React from 'react';\nimport { WebpackConfigurationViewer } from '../../../components/Configuration';\nimport { Card } from '../../../components/Card';\nimport { LoaderChart } from 'src/components/Charts';\nimport { Popover, Space, Tag, Typography } from 'antd/lib';\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\n\nexport const Page: React.FC = () => {\n const { t } = useTranslation();\n return (\n <Card\n title={\n <Space align=\"baseline\">\n <Typography.Title level={5} style={{ margin: 0 }}>\n Loader Timeline\n </Typography.Title>\n <Popover\n content={\n <div>\n {t('AsyncLoaderInfo')}\n <a\n href=\"https://rsdoctor.rs/guide/more/faq#cssextractrspackplugin-%E7%9A%84-loader-%E8%80%97%E6%97%B6%E8%BF%87%E9%95%BF%E9%97%AE%E9%A2%98\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {t('Details')}\n </a>\n </div>\n }\n title=\"Info\"\n >\n <Tag icon={<ExclamationCircleOutlined />} color=\"warning\">\n Info\n </Tag>\n </Popover>\n </Space>\n }\n extra={<WebpackConfigurationViewer defaultKeys={['module']} />}\n >\n <LoaderChart />\n </Card>\n );\n};\n\nexport * from './constants';\n"],"names":["Page","t","useTranslation","Card","Space","Typography","Popover","Tag","ExclamationCircleOutlined","WebpackConfigurationViewer","LoaderChart"],"mappings":";;;;;;;;;AAQO,MAAMA,OAAiB;IAC5B,MAAM,EAAEC,CAAC,EAAE,GAAGC;IACd,OAAO,WAAP,GACE,IAACC,MAAIA;QACH,qBACE,KAACC,OAAKA;YAAC,OAAM;;8BACX,IAACC,WAAW,KAAK;oBAAC,OAAO;oBAAG,OAAO;wBAAE,QAAQ;oBAAE;8BAAG;;8BAGlD,IAACC,SAAOA;oBACN,uBACE,KAAC;;4BACEL,EAAE;0CACH,IAAC;gCACC,MAAK;gCACL,QAAO;gCACP,KAAI;0CAEHA,EAAE;;;;oBAIT,OAAM;8BAEN,kBAACM,KAAGA;wBAAC,oBAAM,IAACC,2BAAyBA,CAAAA;wBAAK,OAAM;kCAAU;;;;;QAMhE,qBAAO,IAACC,4BAA0BA;YAAC,aAAa;gBAAC;aAAS;;kBAE1D,kBAACC,aAAWA,CAAAA;;AAGlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/WebpackLoaders/constants.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/WebpackLoaders/constants.mjs","sources":["../../../src/pages/WebpackLoaders/constants.ts"],"sourcesContent":["export const name = 'Loaders';\n\nexport const route = '/webpack/loaders';\n"],"names":["name","route"],"mappings":"AAAO,MAAMA,iBAAO;AAEb,MAAMC,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/WebpackPlugins/constants.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/WebpackPlugins/constants.mjs","sources":["../../../src/pages/WebpackPlugins/constants.ts"],"sourcesContent":["import { Client } from '@rsdoctor/types';\n\nexport const name = 'Plugins Analysis';\n\nexport const route = Client.RsdoctorClientRoutes.WebpackPlugins;\n"],"names":["name","route","Client"],"mappings":";AAEO,MAAMA,iBAAO;AAEb,MAAMC,QAAQC,OAAO,oBAAoB,CAAC,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages/WebpackPlugins/index.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"pages/WebpackPlugins/index.mjs","sources":["../../../src/pages/WebpackPlugins/index.tsx"],"sourcesContent":["import { ApiOutlined, PartitionOutlined } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport { Button, Card, Input, Select, Space, Typography } from 'antd';\nimport React, { useState } from 'react';\nimport { WebpackConfigurationViewer } from '../../components/Configuration';\nimport { ServerAPIProvider } from '../../components/Manifest';\nimport { WebpackPluginsDataTable } from '../../components/Plugins/webpack';\nimport { Size } from '../../constants';\nimport './index.scss';\n\nexport const Page: React.FC = () => {\n const [selectedTapNames, setSelectedTapNames] = useState([]);\n const [selectedHooks, setSelectedHooks] = useState([]);\n\n return (\n <div>\n <Card\n title=\"Plugins Overall\"\n bodyStyle={{ paddingTop: Size.BasePadding / 3 }}\n extra={<WebpackConfigurationViewer defaultKeys={['plugins']} />}\n >\n <Space\n direction=\"vertical\"\n style={{ width: '100%', padding: '0 30px' }}\n >\n <ServerAPIProvider api={SDK.ServerAPI.API.GetPluginSummary}>\n {({ hooks, tapNames }) => (\n <Space style={{ marginBottom: Size.BasePadding / 2 }}>\n <Input.Group compact>\n <Button>\n <ApiOutlined />\n <Typography.Text>Plugin Tap Names</Typography.Text>\n </Button>\n <Select\n mode=\"multiple\"\n allowClear\n className=\"plugin-select\"\n style={{ width: 300 }}\n popupMatchSelectWidth\n onChange={(e) => {\n setSelectedTapNames(e);\n }}\n >\n {tapNames.map((e) => {\n return (\n <Select.Option key={e} label={e} value={e}>\n {e}\n </Select.Option>\n );\n })}\n </Select>\n </Input.Group>\n <Input.Group compact>\n <Button>\n <PartitionOutlined />\n <Typography.Text>Hooks</Typography.Text>\n </Button>\n <Select\n mode=\"multiple\"\n allowClear\n className=\"plugin-select\"\n style={{ width: 300 }}\n popupMatchSelectWidth\n onChange={(e) => {\n setSelectedHooks(e);\n }}\n >\n {hooks.map((e) => {\n return (\n <Select.Option key={e} label={e} value={e}>\n {e}\n </Select.Option>\n );\n })}\n </Select>\n </Input.Group>\n </Space>\n )}\n </ServerAPIProvider>\n <ServerAPIProvider\n api={SDK.ServerAPI.API.GetPluginData}\n body={{ hooks: selectedHooks, tapNames: selectedTapNames }}\n >\n {(res) => <WebpackPluginsDataTable dataSource={res} />}\n </ServerAPIProvider>\n </Space>\n </Card>\n </div>\n );\n};\n\nexport * from './constants';\n"],"names":["Page","selectedTapNames","setSelectedTapNames","useState","selectedHooks","setSelectedHooks","Card","Size","WebpackConfigurationViewer","Space","ServerAPIProvider","SDK","hooks","tapNames","Input","Button","ApiOutlined","Typography","Select","e","PartitionOutlined","res","WebpackPluginsDataTable"],"mappings":";;;;;;;;;;;AAUO,MAAMA,OAAiB;IAC5B,MAAM,CAACC,kBAAkBC,oBAAoB,GAAGC,SAAS,EAAE;IAC3D,MAAM,CAACC,eAAeC,iBAAiB,GAAGF,SAAS,EAAE;IAErD,OAAO,WAAP,GACE,IAAC;kBACC,kBAACG,MAAIA;YACH,OAAM;YACN,WAAW;gBAAE,YAAYC,KAAK,WAAW,GAAG;YAAE;YAC9C,qBAAO,IAACC,4BAA0BA;gBAAC,aAAa;oBAAC;iBAAU;;sBAE3D,mBAACC,OAAKA;gBACJ,WAAU;gBACV,OAAO;oBAAE,OAAO;oBAAQ,SAAS;gBAAS;;kCAE1C,IAACC,mBAAiBA;wBAAC,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,gBAAgB;kCACvD,CAAC,EAAEC,KAAK,EAAEC,QAAQ,EAAE,iBACnB,KAACJ,OAAKA;gCAAC,OAAO;oCAAE,cAAcF,KAAK,WAAW,GAAG;gCAAE;;kDACjD,KAACO,MAAM,KAAK;wCAAC,SAAO;;0DAClB,KAACC,QAAMA;;kEACL,IAACC,aAAWA,CAAAA;kEACZ,IAACC,WAAW,IAAI;kEAAC;;;;0DAEnB,IAACC,QAAMA;gDACL,MAAK;gDACL,YAAU;gDACV,WAAU;gDACV,OAAO;oDAAE,OAAO;gDAAI;gDACpB,uBAAqB;gDACrB,UAAU,CAACC;oDACTjB,oBAAoBiB;gDACtB;0DAECN,SAAS,GAAG,CAAC,CAACM,IACN,WAAP,GACE,IAACD,OAAO,MAAM;wDAAS,OAAOC;wDAAG,OAAOA;kEACrCA;uDADiBA;;;;kDAO5B,KAACL,MAAM,KAAK;wCAAC,SAAO;;0DAClB,KAACC,QAAMA;;kEACL,IAACK,mBAAiBA,CAAAA;kEAClB,IAACH,WAAW,IAAI;kEAAC;;;;0DAEnB,IAACC,QAAMA;gDACL,MAAK;gDACL,YAAU;gDACV,WAAU;gDACV,OAAO;oDAAE,OAAO;gDAAI;gDACpB,uBAAqB;gDACrB,UAAU,CAACC;oDACTd,iBAAiBc;gDACnB;0DAECP,MAAM,GAAG,CAAC,CAACO,IACH,WAAP,GACE,IAACD,OAAO,MAAM;wDAAS,OAAOC;wDAAG,OAAOA;kEACrCA;uDADiBA;;;;;;;kCAUlC,IAACT,mBAAiBA;wBAChB,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa;wBACpC,MAAM;4BAAE,OAAOP;4BAAe,UAAUH;wBAAiB;kCAExD,CAACoB,MAAAA,WAAAA,GAAQ,IAACC,yBAAuBA;gCAAC,YAAYD;;;;;;;AAM3D"}
|
package/dist/pages/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export * as Overall from './Overall';
|
|
2
|
-
export * as BundleSize from './BundleSize';
|
|
3
|
-
export * as ModuleAnalyze from './ModuleAnalyze';
|
|
4
|
-
export * as LoaderTimeline from './WebpackLoaders/Overall';
|
|
5
|
-
export * as LoaderFiles from './WebpackLoaders/Analysis';
|
|
6
|
-
export * as PluginsAnalyze from './WebpackPlugins';
|
|
7
|
-
export * as ModuleResolve from './ModuleResolve';
|
|
8
|
-
export * as RuleIndex from './Resources/RuleIndex';
|
|
9
|
-
export * as TreeShaking from './TreeShaking';
|
|
10
|
-
export * as BundleDiff from './Resources/BundleDiff';
|
|
11
|
-
export * as Uploader from './Uploader';
|
|
1
|
+
export * as Overall from './Overall/index.js';
|
|
2
|
+
export * as BundleSize from './BundleSize/index.js';
|
|
3
|
+
export * as ModuleAnalyze from './ModuleAnalyze/index.js';
|
|
4
|
+
export * as LoaderTimeline from './WebpackLoaders/Overall/index.js';
|
|
5
|
+
export * as LoaderFiles from './WebpackLoaders/Analysis/index.js';
|
|
6
|
+
export * as PluginsAnalyze from './WebpackPlugins/index.js';
|
|
7
|
+
export * as ModuleResolve from './ModuleResolve/index.js';
|
|
8
|
+
export * as RuleIndex from './Resources/RuleIndex/index.js';
|
|
9
|
+
export * as TreeShaking from './TreeShaking/index.js';
|
|
10
|
+
export * as BundleDiff from './Resources/BundleDiff/index.js';
|
|
11
|
+
export * as Uploader from './Uploader/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils/data/base.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"utils/data/base.mjs","sources":["../../../src/utils/data/base.ts"],"sourcesContent":["import { Common, Manifest, SDK } from '@rsdoctor/types';\nimport { Data } from '@rsdoctor/utils/common';\n\nexport abstract class BaseDataLoader implements Manifest.ManifestDataLoader {\n protected pool = new Map<string, Promise<unknown>>();\n\n protected loader: Data.APIDataLoader;\n\n protected disposed = false;\n\n protected shardingDataMap = new Map<\n keyof Manifest.RsdoctorManifestData | string,\n Promise<Manifest.RsdoctorManifestData[keyof Manifest.RsdoctorManifestData]>\n >();\n\n constructor(protected manifest: Manifest.RsdoctorManifestWithShardingFiles) {\n this.loader = new Data.APIDataLoader(this);\n console.log('[DataLoader] isLocal: ', this.isLocal());\n }\n\n protected get<T extends keyof Manifest.RsdoctorManifestWithShardingFiles>(\n key: T,\n ): void | Manifest.RsdoctorManifestWithShardingFiles[T] {\n if (!this.manifest) return;\n return this.manifest[key];\n }\n\n protected getData<T extends keyof Manifest.RsdoctorManifestData>(\n key: T,\n scope: 'data' | 'cloudData' = 'data',\n ): void | Manifest.RsdoctorManifestWithShardingFiles['data'][T] {\n const data = this.get(scope);\n if (!data) return;\n return data[key];\n }\n\n protected getKeys(key: string) {\n return key.split('.');\n }\n\n protected joinKeys(keys: string[]) {\n return keys.join('.');\n }\n\n public dispose() {\n this.disposed = true;\n }\n\n public limit<T>(\n key: string,\n fn: Common.Function<unknown[], Promise<T>>,\n ): Promise<T> {\n if (this.pool.has(key)) {\n return this.pool.get(key) as Promise<T>;\n }\n const res = fn().finally(() => this.pool.delete(key));\n this.pool.set(key, res);\n return res;\n }\n\n public log(...args: unknown[]) {\n console.log(`[${this.constructor.name}]`, ...args);\n }\n\n public async loadManifest() {\n return this.manifest;\n }\n\n abstract loadData<T extends string, P>(key: T): Promise<void | P>;\n\n abstract loadData<T extends Manifest.RsdoctorManifestMappingKeys>(\n key: T,\n ): Promise<void | Manifest.InferManifestDataValue<T>>;\n\n abstract isLocal(): boolean;\n\n abstract loadAPI<\n T extends SDK.ServerAPI.API,\n B extends\n SDK.ServerAPI.InferRequestBodyType<T> = SDK.ServerAPI.InferRequestBodyType<T>,\n R extends\n SDK.ServerAPI.InferResponseType<T> = SDK.ServerAPI.InferResponseType<T>,\n >(...args: B extends void ? [api: T] : [api: T, body: B]): Promise<R>;\n\n public abstract onDataUpdate<\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n >(api: T, fn: (response: SDK.ServerAPI.SocketResponseType<T>) => void): void;\n\n public abstract removeOnDataUpdate<\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n >(api: T, fn: (response: SDK.ServerAPI.SocketResponseType<T>) => void): void;\n}\n"],"names":["BaseDataLoader","key","scope","data","keys","fn","res","args","console","manifest","Map","Data"],"mappings":";;;;;;;;;;;AAGO,MAAeA;IAiBV,IACRC,GAAM,EACgD;QACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;QACpB,OAAO,IAAI,CAAC,QAAQ,CAACA,IAAI;IAC3B;IAEU,QACRA,GAAM,EACNC,QAA8B,MAAM,EAC0B;QAC9D,MAAMC,OAAO,IAAI,CAAC,GAAG,CAACD;QACtB,IAAI,CAACC,MAAM;QACX,OAAOA,IAAI,CAACF,IAAI;IAClB;IAEU,QAAQA,GAAW,EAAE;QAC7B,OAAOA,IAAI,KAAK,CAAC;IACnB;IAEU,SAASG,IAAc,EAAE;QACjC,OAAOA,KAAK,IAAI,CAAC;IACnB;IAEO,UAAU;QACf,IAAI,CAAC,QAAQ,GAAG;IAClB;IAEO,MACLH,GAAW,EACXI,EAA0C,EAC9B;QACZ,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAACJ,MAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAACA;QAEvB,MAAMK,MAAMD,KAAK,OAAO,CAAC,IAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAACJ;QAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAACA,KAAKK;QACnB,OAAOA;IACT;IAEO,IAAI,GAAGC,IAAe,EAAE;QAC7BC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAKD;IAC/C;IAEA,MAAa,eAAe;QAC1B,OAAO,IAAI,CAAC,QAAQ;IACtB;IAnDA,YAAsBE,QAAoD,CAAE;;QAX5E,uBAAU,QAAV;QAEA,uBAAU,UAAV;QAEA,uBAAU,YAAV;QAEA,uBAAU,mBAAV;aAKsBA,QAAQ,GAARA;aAXZ,IAAI,GAAG,IAAIC;aAIX,QAAQ,GAAG;aAEX,eAAe,GAAG,IAAIA;QAM9B,IAAI,CAAC,MAAM,GAAG,IAAIC,KAAK,aAAa,CAAC,IAAI;QACzCH,QAAQ,GAAG,CAAC,0BAA0B,IAAI,CAAC,OAAO;IACpD;AAyEF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Manifest, SDK } from '@rsdoctor/types';
|
|
2
|
-
import { BaseDataLoader } from './base';
|
|
2
|
+
import { BaseDataLoader } from './base.js';
|
|
3
3
|
export declare class BriefDataLoader extends BaseDataLoader {
|
|
4
4
|
isLocal(): boolean;
|
|
5
5
|
loadData<T extends Manifest.RsdoctorManifestMappingKeys>(key: T): Promise<Manifest.InferManifestDataValue<T>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils/data/brief.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"utils/data/brief.mjs","sources":["../../../src/utils/data/brief.ts"],"sourcesContent":["import { Manifest, SDK } from '@rsdoctor/types';\nimport { Algorithm } from '@rsdoctor/utils/common';\nimport { BaseDataLoader } from './base';\nimport { Constants } from '@rsdoctor/types';\n\nexport class BriefDataLoader extends BaseDataLoader {\n public isLocal() {\n return false;\n }\n\n public async loadData<T extends Manifest.RsdoctorManifestMappingKeys>(\n key: T,\n ): Promise<Manifest.InferManifestDataValue<T>>;\n\n public async loadData(key: string): Promise<unknown> {\n console.log(`[loadData]-[key]: ${key}`);\n const [scope] = this.getKeys(key);\n\n console.log(`[loadData]-[scope]: ${scope}`);\n const data = this.getData(scope);\n\n if (!data) return;\n\n let res = data;\n\n // only cache by the root key in data\n if (!this.shardingDataMap.has(scope)) {\n const scopeData = this.parseData(res);\n\n this.shardingDataMap.set(scope, Promise.resolve(scopeData));\n }\n\n res = await this.shardingDataMap.get(scope);\n return res;\n }\n\n public getData(scope: keyof Manifest.RsdoctorManifestData) {\n console.log(`[getData]-[scope]: ${scope}`);\n return window[Constants.WINDOW_RSDOCTOR_TAG][scope];\n }\n\n private parseData(data: unknown): unknown {\n if (typeof data === 'object' && data !== null) {\n return data;\n }\n\n if (typeof data !== 'string') {\n return data;\n }\n\n try {\n return JSON.parse(Algorithm.decompressText(data));\n } catch {\n return data;\n }\n }\n\n public async loadAPI<\n T extends SDK.ServerAPI.API,\n B extends\n SDK.ServerAPI.InferRequestBodyType<T> = SDK.ServerAPI.InferRequestBodyType<T>,\n R extends\n SDK.ServerAPI.InferResponseType<T> = SDK.ServerAPI.InferResponseType<T>,\n >(...args: B extends void ? [api: T] : [api: T, body: B]): Promise<R> {\n return this.loader.loadAPI(...args) as R;\n }\n\n public dispose() {\n super.dispose();\n }\n\n public onDataUpdate() {}\n\n public removeOnDataUpdate() {}\n}\n"],"names":["BriefDataLoader","BaseDataLoader","key","console","scope","data","res","scopeData","Promise","window","Constants","JSON","Algorithm","args"],"mappings":";;;AAKO,MAAMA,wBAAwBC;IAC5B,UAAU;QACf,OAAO;IACT;IAMA,MAAa,SAASC,GAAW,EAAoB;QACnDC,QAAQ,GAAG,CAAC,CAAC,kBAAkB,EAAED,KAAK;QACtC,MAAM,CAACE,MAAM,GAAG,IAAI,CAAC,OAAO,CAACF;QAE7BC,QAAQ,GAAG,CAAC,CAAC,oBAAoB,EAAEC,OAAO;QAC1C,MAAMC,OAAO,IAAI,CAAC,OAAO,CAACD;QAE1B,IAAI,CAACC,MAAM;QAEX,IAAIC,MAAMD;QAGV,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAACD,QAAQ;YACpC,MAAMG,YAAY,IAAI,CAAC,SAAS,CAACD;YAEjC,IAAI,CAAC,eAAe,CAAC,GAAG,CAACF,OAAOI,QAAQ,OAAO,CAACD;QAClD;QAEAD,MAAM,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAACF;QACrC,OAAOE;IACT;IAEO,QAAQF,KAA0C,EAAE;QACzDD,QAAQ,GAAG,CAAC,CAAC,mBAAmB,EAAEC,OAAO;QACzC,OAAOK,MAAM,CAACC,UAAU,mBAAmB,CAAC,CAACN,MAAM;IACrD;IAEQ,UAAUC,IAAa,EAAW;QACxC,IAAI,AAAgB,YAAhB,OAAOA,QAAqBA,AAAS,SAATA,MAC9B,OAAOA;QAGT,IAAI,AAAgB,YAAhB,OAAOA,MACT,OAAOA;QAGT,IAAI;YACF,OAAOM,KAAK,KAAK,CAACC,UAAU,cAAc,CAACP;QAC7C,EAAE,OAAM;YACN,OAAOA;QACT;IACF;IAEA,MAAa,QAMX,GAAGQ,IAAmD,EAAc;QACpE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,IAAIA;IAChC;IAEO,UAAU;QACf,KAAK,CAAC;IACR;IAEO,eAAe,CAAC;IAEhB,qBAAqB,CAAC;AAC/B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Manifest } from '@rsdoctor/types';
|
|
2
|
-
import { BaseDataLoader } from './base';
|
|
2
|
+
import { BaseDataLoader } from './base.js';
|
|
3
3
|
export declare function useDataLoader(manifest: Manifest.RsdoctorManifestWithShardingFiles | void): {
|
|
4
4
|
loader: void | BaseDataLoader;
|
|
5
5
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils/data/index.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"utils/data/index.mjs","sources":["../../../src/utils/data/index.ts"],"sourcesContent":["import { Constants, Manifest } from '@rsdoctor/types';\nimport { useEffect, useState } from 'react';\nimport { LocalServerDataLoader } from './local';\nimport { RemoteDataLoader } from './remote';\nimport { BaseDataLoader } from './base';\nimport { getAPILoaderModeFromStorage } from '../storage';\nimport { APILoaderMode4Dev } from '../../constants';\nimport { BriefDataLoader } from './brief';\n\nconst loaderTask = new WeakMap<\n Manifest.RsdoctorManifestWithShardingFiles,\n Promise<BaseDataLoader>\n>();\n\nasync function createDataLoader(\n manifest: Manifest.RsdoctorManifestWithShardingFiles,\n) {\n try {\n if (process.env.NODE_ENV === 'development') {\n const mode = getAPILoaderModeFromStorage();\n console.log(`[development]-${mode}`);\n if (mode === APILoaderMode4Dev.Local)\n return new LocalServerDataLoader(manifest);\n if (mode === APILoaderMode4Dev.Remote)\n return new RemoteDataLoader(manifest);\n }\n\n // local server exists\n if (manifest.__LOCAL__SERVER__) {\n console.log(`[LocalServerDataLoader]`);\n return new LocalServerDataLoader(manifest);\n }\n } catch (error) {\n console.log('[DataLoader] fallback to RemoteDataLoader');\n }\n\n return new RemoteDataLoader(manifest);\n}\n\nexport function useDataLoader(\n manifest: Manifest.RsdoctorManifestWithShardingFiles | void,\n) {\n const [loader, setLoader] = useState<BaseDataLoader | void>(undefined);\n\n useEffect(() => {\n if (window[Constants.WINDOW_RSDOCTOR_TAG]) {\n console.log('[brief mode]');\n const loader = new BriefDataLoader({ data: [] } as any);\n setLoader(loader);\n }\n }, []);\n\n useEffect(() => {\n if (!manifest) return;\n\n if (!loaderTask.has(manifest)) {\n const promise = createDataLoader(manifest);\n loaderTask.set(manifest, promise);\n }\n\n const task = loaderTask.get(manifest)!;\n task.then((loader) => {\n setLoader(loader);\n });\n }, [manifest]);\n\n return {\n loader,\n };\n}\n"],"names":["loaderTask","WeakMap","createDataLoader","manifest","process","mode","getAPILoaderModeFromStorage","console","APILoaderMode4Dev","LocalServerDataLoader","RemoteDataLoader","error","useDataLoader","loader","setLoader","useState","undefined","useEffect","window","Constants","BriefDataLoader","promise","task"],"mappings":";;;;;;;AASA,MAAMA,aAAa,IAAIC;AAKvB,eAAeC,iBACbC,QAAoD;IAEpD,IAAI;QACF,IAAIC,AAAyB,kBAAzBA,QAAQ,GAAG,CAAC,QAAQ,EAAoB;YAC1C,MAAMC,OAAOC;YACbC,QAAQ,GAAG,CAAC,CAAC,cAAc,EAAEF,MAAM;YACnC,IAAIA,SAASG,kBAAkB,KAAK,EAClC,OAAO,IAAIC,sBAAsBN;YACnC,IAAIE,SAASG,kBAAkB,MAAM,EACnC,OAAO,IAAIE,iBAAiBP;QAChC;QAGA,IAAIA,SAAS,iBAAiB,EAAE;YAC9BI,QAAQ,GAAG,CAAC;YACZ,OAAO,IAAIE,sBAAsBN;QACnC;IACF,EAAE,OAAOQ,OAAO;QACdJ,QAAQ,GAAG,CAAC;IACd;IAEA,OAAO,IAAIG,iBAAiBP;AAC9B;AAEO,SAASS,cACdT,QAA2D;IAE3D,MAAM,CAACU,QAAQC,UAAU,GAAGC,SAAgCC;IAE5DC,UAAU;QACR,IAAIC,MAAM,CAACC,UAAU,mBAAmB,CAAC,EAAE;YACzCZ,QAAQ,GAAG,CAAC;YACZ,MAAMM,SAAS,IAAIO,gBAAgB;gBAAE,MAAM,EAAE;YAAC;YAC9CN,UAAUD;QACZ;IACF,GAAG,EAAE;IAELI,UAAU;QACR,IAAI,CAACd,UAAU;QAEf,IAAI,CAACH,WAAW,GAAG,CAACG,WAAW;YAC7B,MAAMkB,UAAUnB,iBAAiBC;YACjCH,WAAW,GAAG,CAACG,UAAUkB;QAC3B;QAEA,MAAMC,OAAOtB,WAAW,GAAG,CAACG;QAC5BmB,KAAK,IAAI,CAAC,CAACT;YACTC,UAAUD;QACZ;IACF,GAAG;QAACV;KAAS;IAEb,OAAO;QACLU;IACF;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Common, Manifest, SDK } from '@rsdoctor/types';
|
|
2
|
-
import { BaseDataLoader } from './base';
|
|
2
|
+
import { BaseDataLoader } from './base.js';
|
|
3
3
|
export declare class LocalServerDataLoader extends BaseDataLoader {
|
|
4
4
|
protected events: Map<SDK.ServerAPI.API | SDK.ServerAPI.APIExtends, Set<Common.Function>>;
|
|
5
5
|
isLocal(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils/data/local.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"utils/data/local.mjs","sources":["../../../src/utils/data/local.ts"],"sourcesContent":["import { Manifest as ManifestShared } from '@rsdoctor/utils/common';\nimport { Common, Manifest, SDK } from '@rsdoctor/types';\nimport { get } from 'es-toolkit/compat';\nimport { BaseDataLoader } from './base';\nimport { getSocket } from '../socket';\n\nexport class LocalServerDataLoader extends BaseDataLoader {\n protected events: Map<\n SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n Set<Common.Function>\n > = new Map();\n\n public isLocal() {\n return true;\n }\n\n public async loadData<T extends keyof Manifest.RsdoctorManifestData>(\n key: T,\n ): Promise<void | Manifest.RsdoctorManifestData[T]>;\n\n public async loadData(key: string): Promise<unknown> {\n return this.limit(key, async () => {\n const [scope, ...rest] = this.getKeys(key);\n const data = this.getData(scope as keyof Manifest.RsdoctorManifestData);\n\n if (!data) return;\n\n let res: unknown = data;\n\n // sharding files\n if (ManifestShared.isShardingData(res)) {\n if (!this.shardingDataMap.has(key)) {\n const task = new Promise((resolve) => {\n getSocket().emit(\n SDK.ServerAPI.API.LoadDataByKey,\n { key },\n (\n res: SDK.ServerAPI.SocketResponseType<SDK.ServerAPI.API.LoadDataByKey>,\n ) => {\n resolve(res.res);\n },\n );\n });\n // const task = postServerAPI(SDK.ServerAPI.API.LoadDataByKey, { key }).catch((err) => {\n // this.log(`loadData error: `, res, key);\n // throw err;\n // });\n // save with every key\n this.shardingDataMap.set(key, task);\n }\n\n res = await this.shardingDataMap.get(key);\n this.shardingDataMap.delete(key);\n return res;\n }\n\n return rest.length > 0 ? get(res, this.joinKeys(rest)) : res;\n });\n }\n\n public async loadAPI<\n T extends SDK.ServerAPI.API,\n B extends\n SDK.ServerAPI.InferRequestBodyType<T> = SDK.ServerAPI.InferRequestBodyType<T>,\n R extends\n SDK.ServerAPI.InferResponseType<T> = SDK.ServerAPI.InferResponseType<T>,\n >(...args: B extends void ? [api: T] : [api: T, body: B]): Promise<R> {\n const [api, body] = args;\n // request limitation key\n const key = body ? `${api}_${JSON.stringify(body)}` : `${api}`;\n const socketPort = this.get('__SOCKET__PORT__') ?? '';\n\n return this.limit(key, async () => {\n return new Promise((resolve) => {\n getSocket(socketPort).emit(\n api,\n body,\n (res: SDK.ServerAPI.SocketResponseType<T>) => {\n resolve(res.res as R);\n },\n );\n });\n // const res = await postServerAPI(...args).catch((err) => {\n // this.log(`loadAPI error: `, key);\n // throw err;\n // });\n\n // return res as R;\n });\n }\n\n public dispose() {\n super.dispose();\n this.events.forEach((evs, api) => {\n evs.forEach((ev) => {\n this.removeOnDataUpdate(api, ev);\n });\n evs.clear();\n });\n this.events.clear();\n }\n\n /**\n * add event listener when received data from server.\n */\n public onDataUpdate<T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends>(\n api: T,\n fn: (response: SDK.ServerAPI.SocketResponseType<T>) => void,\n ) {\n if (!this.events.has(api)) {\n this.events.set(api, new Set());\n }\n\n if (this.events.get(api)!.has(fn)) {\n return;\n }\n\n this.events.get(api)!.add(fn);\n getSocket().on(api as string, fn);\n }\n\n public removeOnDataUpdate<\n T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n >(api: T, fn: (response: SDK.ServerAPI.SocketResponseType<T>) => void) {\n getSocket().off(api as string, fn);\n this.events.get(api)!.delete(fn);\n }\n}\n"],"names":["LocalServerDataLoader","BaseDataLoader","key","scope","rest","data","res","ManifestShared","task","Promise","resolve","getSocket","SDK","get","args","api","body","JSON","socketPort","evs","ev","fn","Set","Map"],"mappings":";;;;;;;;;;;;;;;AAMO,MAAMA,8BAA8BC;IAMlC,UAAU;QACf,OAAO;IACT;IAMA,MAAa,SAASC,GAAW,EAAoB;QACnD,OAAO,IAAI,CAAC,KAAK,CAACA,KAAK;YACrB,MAAM,CAACC,OAAO,GAAGC,KAAK,GAAG,IAAI,CAAC,OAAO,CAACF;YACtC,MAAMG,OAAO,IAAI,CAAC,OAAO,CAACF;YAE1B,IAAI,CAACE,MAAM;YAEX,IAAIC,MAAeD;YAGnB,IAAIE,SAAAA,cAA6B,CAACD,MAAM;gBACtC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAACJ,MAAM;oBAClC,MAAMM,OAAO,IAAIC,QAAQ,CAACC;wBACxBC,YAAY,IAAI,CACdC,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa,EAC/B;4BAAEV;wBAAI,GACN,CACEI;4BAEAI,QAAQJ,IAAI,GAAG;wBACjB;oBAEJ;oBAMA,IAAI,CAAC,eAAe,CAAC,GAAG,CAACJ,KAAKM;gBAChC;gBAEAF,MAAM,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAACJ;gBACrC,IAAI,CAAC,eAAe,CAAC,MAAM,CAACA;gBAC5B,OAAOI;YACT;YAEA,OAAOF,KAAK,MAAM,GAAG,IAAIS,IAAIP,KAAK,IAAI,CAAC,QAAQ,CAACF,SAASE;QAC3D;IACF;IAEA,MAAa,QAMX,GAAGQ,IAAmD,EAAc;QACpE,MAAM,CAACC,KAAKC,KAAK,GAAGF;QAEpB,MAAMZ,MAAMc,OAAO,GAAGD,IAAI,CAAC,EAAEE,KAAK,SAAS,CAACD,OAAO,GAAG,GAAGD,KAAK;QAC9D,MAAMG,aAAa,IAAI,CAAC,GAAG,CAAC,uBAAuB;QAEnD,OAAO,IAAI,CAAC,KAAK,CAAChB,KAAK,UACd,IAAIO,QAAQ,CAACC;gBAClBC,UAAUO,YAAY,IAAI,CACxBH,KACAC,MACA,CAACV;oBACCI,QAAQJ,IAAI,GAAG;gBACjB;YAEJ;IAQJ;IAEO,UAAU;QACf,KAAK,CAAC;QACN,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAACa,KAAKJ;YACxBI,IAAI,OAAO,CAAC,CAACC;gBACX,IAAI,CAAC,kBAAkB,CAACL,KAAKK;YAC/B;YACAD,IAAI,KAAK;QACX;QACA,IAAI,CAAC,MAAM,CAAC,KAAK;IACnB;IAKO,aACLJ,GAAM,EACNM,EAA2D,EAC3D;QACA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAACN,MACnB,IAAI,CAAC,MAAM,CAAC,GAAG,CAACA,KAAK,IAAIO;QAG3B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAACP,KAAM,GAAG,CAACM,KAC5B;QAGF,IAAI,CAAC,MAAM,CAAC,GAAG,CAACN,KAAM,GAAG,CAACM;QAC1BV,YAAY,EAAE,CAACI,KAAeM;IAChC;IAEO,mBAELN,GAAM,EAAEM,EAA2D,EAAE;QACrEV,YAAY,GAAG,CAACI,KAAeM;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAACN,KAAM,MAAM,CAACM;IAC/B;;QAxHK,gBACL,uBAAU,UAGN,IAAIE;;AAqHV"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Manifest, SDK } from '@rsdoctor/types';
|
|
2
|
-
import { BaseDataLoader } from './base';
|
|
2
|
+
import { BaseDataLoader } from './base.js';
|
|
3
3
|
export declare class RemoteDataLoader extends BaseDataLoader {
|
|
4
4
|
isLocal(): boolean;
|
|
5
5
|
loadData<T extends Manifest.RsdoctorManifestMappingKeys>(key: T): Promise<Manifest.InferManifestDataValue<T>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils/data/remote.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"utils/data/remote.mjs","sources":["../../../src/utils/data/remote.ts"],"sourcesContent":["import { Manifest, SDK } from '@rsdoctor/types';\nimport { Manifest as ManifestShared } from '@rsdoctor/utils/common';\nimport { get } from 'es-toolkit/compat';\nimport { BaseDataLoader } from './base';\nimport { fetchShardingFile } from '../request';\n\nexport class RemoteDataLoader extends BaseDataLoader {\n public isLocal() {\n return false;\n }\n\n public async loadData<T extends Manifest.RsdoctorManifestMappingKeys>(\n key: T,\n ): Promise<Manifest.InferManifestDataValue<T>>;\n\n public async loadData(key: string): Promise<unknown> {\n return this.limit(key, async () => {\n const [scope, ...rest] = this.getKeys(key);\n const data = this.getData(\n scope as keyof Manifest.RsdoctorManifestData,\n 'cloudData',\n );\n\n if (!data) return;\n\n let res = data;\n\n // sharding files\n if (ManifestShared.isShardingData(res)) {\n // only cache by the root key in data\n if (!this.shardingDataMap.has(scope)) {\n const task = ManifestShared.fetchShardingData(\n res,\n fetchShardingFile,\n ).catch((err) => {\n this.log(`loadData error: `, res, key);\n throw err;\n });\n this.shardingDataMap.set(scope, task);\n }\n\n res = await this.shardingDataMap.get(scope);\n }\n\n return rest.length > 0 ? get(res, this.joinKeys(rest)) : res;\n });\n }\n\n public async loadAPI<\n T extends SDK.ServerAPI.API,\n B extends\n SDK.ServerAPI.InferRequestBodyType<T> = SDK.ServerAPI.InferRequestBodyType<T>,\n R extends\n SDK.ServerAPI.InferResponseType<T> = SDK.ServerAPI.InferResponseType<T>,\n >(...args: B extends void ? [api: T] : [api: T, body: B]): Promise<R> {\n const [api, body] = args;\n // request limitation key\n const key = body ? `${api}_${JSON.stringify(body)}` : `${api}`;\n\n return this.limit(key, async () => {\n return this.loader.loadAPI(...args) as R;\n });\n }\n\n public dispose() {\n super.dispose();\n }\n\n public onDataUpdate() {}\n\n public removeOnDataUpdate() {}\n}\n"],"names":["RemoteDataLoader","BaseDataLoader","key","scope","rest","data","res","ManifestShared","task","fetchShardingFile","err","get","args","api","body","JSON"],"mappings":";;;;AAMO,MAAMA,yBAAyBC;IAC7B,UAAU;QACf,OAAO;IACT;IAMA,MAAa,SAASC,GAAW,EAAoB;QACnD,OAAO,IAAI,CAAC,KAAK,CAACA,KAAK;YACrB,MAAM,CAACC,OAAO,GAAGC,KAAK,GAAG,IAAI,CAAC,OAAO,CAACF;YACtC,MAAMG,OAAO,IAAI,CAAC,OAAO,CACvBF,OACA;YAGF,IAAI,CAACE,MAAM;YAEX,IAAIC,MAAMD;YAGV,IAAIE,SAAAA,cAA6B,CAACD,MAAM;gBAEtC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAACH,QAAQ;oBACpC,MAAMK,OAAOD,SAAAA,iBAAgC,CAC3CD,KACAG,mBACA,KAAK,CAAC,CAACC;wBACP,IAAI,CAAC,GAAG,CAAC,oBAAoBJ,KAAKJ;wBAClC,MAAMQ;oBACR;oBACA,IAAI,CAAC,eAAe,CAAC,GAAG,CAACP,OAAOK;gBAClC;gBAEAF,MAAM,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAACH;YACvC;YAEA,OAAOC,KAAK,MAAM,GAAG,IAAIO,IAAIL,KAAK,IAAI,CAAC,QAAQ,CAACF,SAASE;QAC3D;IACF;IAEA,MAAa,QAMX,GAAGM,IAAmD,EAAc;QACpE,MAAM,CAACC,KAAKC,KAAK,GAAGF;QAEpB,MAAMV,MAAMY,OAAO,GAAGD,IAAI,CAAC,EAAEE,KAAK,SAAS,CAACD,OAAO,GAAG,GAAGD,KAAK;QAE9D,OAAO,IAAI,CAAC,KAAK,CAACX,KAAK,UACd,IAAI,CAAC,MAAM,CAAC,OAAO,IAAIU;IAElC;IAEO,UAAU;QACf,KAAK,CAAC;IACR;IAEO,eAAe,CAAC;IAEhB,qBAAqB,CAAC;AAC/B"}
|