{"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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"}