{"version":3,"file":"components/Loader/Analysis/files.mjs","sources":["../../../../src/components/Loader/Analysis/files.tsx"],"sourcesContent":["import { CloseCircleOutlined } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n  Card,\n  Col,\n  Divider,\n  Drawer,\n  List,\n  Popover,\n  Row,\n  Space,\n  Table,\n  Tag,\n  Tooltip,\n  Typography,\n} from 'antd';\nimport { get } from 'es-toolkit/compat';\nimport React, { useMemo, useState } from 'react';\nimport { drawerWidth, Size } from '../../../constants';\nimport {\n  createFileStructures,\n  DataNode,\n  filterLoader,\n  formatCosts,\n  mapFileKey,\n} from '../../../utils';\nimport { FileTree } from '../../FileTree';\nimport { Keyword } from '../../Keyword';\nimport { ServerAPIProvider } from '../../Manifest';\nimport { LoaderExecutions } from '../executions';\nimport styles from './style.module.scss';\n\nconst ADDITION_LOADER_NUMBER = 3;\n\nexport const LoaderFiles: React.FC<{\n  filetree: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderFileTree>;\n  cwd: string;\n  loaders: string[];\n  filename: string;\n  layer?: string;\n}> = (props) => {\n  const { cwd, filetree } = props;\n  const [drawerVisible, setDrawerVisible] = useState(false);\n  const [resourcePath, setResourcePath] = useState('');\n  const [loaderIndex, setLoaderIndex] = useState(0);\n  const [selectedNode, setSelectedNode] = useState<DataNode | null>(null);\n\n  const maxHeight = 800;\n\n  const filteredFiles = useMemo(\n    () =>\n      filetree.filter((e) =>\n        e.loaders.some((l) =>\n          filterLoader(\n            e.path,\n            l.loader,\n            props.filename,\n            props.loaders,\n            e.layer,\n            props?.layer,\n          ),\n        ),\n      ),\n    [props.filename, props.loaders, props.layer],\n  );\n\n  const inlinedResourcePathKey = '__RESOURCEPATH__';\n\n  const files = useMemo(() => {\n    return createFileStructures({\n      files: filteredFiles.map((e) => e.path),\n      cwd,\n      fileTitle(file, basename) {\n        const { loaders, layer } = filetree.find((e) => e.path === file)!;\n\n        const additionalLoaders: (Pick<\n          SDK.LoaderTransformData,\n          'path' | 'loader' | 'errors'\n        > & { costs: number })[] = [];\n\n        loaders.forEach(\n          (l, i) => i > ADDITION_LOADER_NUMBER && additionalLoaders.push(l),\n        );\n\n        return (\n          <div\n            style={{\n              wordBreak: 'break-all',\n              display: 'flex',\n              cursor: 'pointer',\n            }}\n            onClick={() => {\n              setLoaderIndex(0);\n              setResourcePath(file);\n              setDrawerVisible(true);\n            }}\n          >\n            <div className={styles.box}>\n              <div className={styles.keywords}>\n                <Keyword text={basename.replace(/\\[.*?\\]/g, '')} keyword={''} />\n              </div>\n            </div>\n            <div className={styles.dividerDiv} style={{ flex: 1 }}>\n              <Divider className={styles.divider} dashed />\n            </div>\n\n            {layer && (\n              <Tag color=\"cyan\" bordered={false}>\n                {layer}\n              </Tag>\n            )}\n            <Space>\n              {loaders.slice(0, ADDITION_LOADER_NUMBER).map((e, i) => {\n                const isError = e.errors && e.errors.length;\n                const key = `${file}_${e.loader}_${i}`;\n                if (i <= ADDITION_LOADER_NUMBER) {\n                  return (\n                    <Tooltip title={e.path} key={key}>\n                      <Tag\n                        onClick={(ev) => {\n                          ev.stopPropagation();\n                          setResourcePath(file);\n                          setLoaderIndex(i);\n                          setDrawerVisible(true);\n                        }}\n                        className={styles.textBox}\n                        style={{ color: isError ? '#f50' : 'inherit' }}\n                      >\n                        <Typography.Text className={styles.text} ellipsis>\n                          {e.loader.match(/([^/]+-loader)/g)?.[0] || e.loader}\n                        </Typography.Text>\n                        <Divider type=\"vertical\" />\n                        {isError ? (\n                          <CloseCircleOutlined />\n                        ) : (\n                          <Typography.Text className={styles.text}>\n                            {formatCosts(e.costs)}\n                          </Typography.Text>\n                        )}\n                      </Tag>\n                    </Tooltip>\n                  );\n                }\n              })}\n              {additionalLoaders?.length > 0 && (\n                <Popover\n                  content={\n                    <List\n                      dataSource={additionalLoaders}\n                      renderItem={(e, i) => {\n                        const isError = e.errors && e.errors.length;\n                        const key = `${file}_${e.loader}_${i + ADDITION_LOADER_NUMBER}`;\n\n                        return (\n                          <List.Item>\n                            <Tooltip title={e.path} key={key}>\n                              <div style={{ paddingBottom: 5 }}>\n                                <Tag\n                                  onClick={(ev) => {\n                                    ev.stopPropagation();\n                                    setResourcePath(file);\n                                    setLoaderIndex(i);\n                                    setDrawerVisible(true);\n                                  }}\n                                  className={styles.textBox}\n                                  style={{\n                                    color: isError ? '#f50' : 'inherit',\n                                  }}\n                                >\n                                  <Typography.Text\n                                    className={styles.text}\n                                    ellipsis\n                                  >\n                                    {e.loader.match(/([^/]+-loader)/g)?.[0] ||\n                                      e.loader}\n                                  </Typography.Text>\n                                  <Divider type=\"vertical\" />\n                                  <Typography.Text className={styles.text}>\n                                    {formatCosts(e.costs)}\n                                  </Typography.Text>\n                                </Tag>\n                              </div>\n                            </Tooltip>\n                          </List.Item>\n                        );\n                      }}\n                    />\n                  }\n                >\n                  <Tag className={styles.textBox}>\n                    <Typography.Text>···</Typography.Text>\n                  </Tag>\n                </Popover>\n              )}\n            </Space>\n          </div>\n        );\n      },\n      dirTitle(_dir, defaultTitle) {\n        return (\n          <div style={{ display: 'flex', cursor: 'pointer' }}>\n            <Keyword text={defaultTitle} keyword={''} />\n          </div>\n        );\n      },\n    });\n  }, [filteredFiles]);\n\n  return (\n    <Row style={{ width: '100%', marginLeft: 0 }} gutter={Size.BasePadding}>\n      <Col span={24}>\n        <Card\n          title={\n            <Space>\n              <Typography.Text strong>Files</Typography.Text>\n              <Typography.Text\n                type=\"secondary\"\n                style={{\n                  fontSize: 12,\n                  fontWeight: 400,\n                }}\n              >\n                Total Files: {filteredFiles.length}\n              </Typography.Text>\n            </Space>\n          }\n          bodyStyle={{\n            overflow: 'auto',\n            maxHeight,\n            minHeight: '40rem',\n            padding: 14,\n          }}\n        >\n          <FileTree\n            defaultExpandedKeys={mapFileKey(\n              files,\n              filteredFiles.length >= 100 ? 3 : 4,\n              (node) => {\n                const resourcePath: string = get(node, inlinedResourcePathKey)!;\n                const isNodeModules =\n                  resourcePath.indexOf('/node_modules/') > -1;\n\n                return !isNodeModules;\n              },\n            )}\n            treeData={files}\n            key={`${props.loaders.join('|')}_${props.filename}`}\n            onSelect={(_e, info) => {\n              if (!info.node.isLeaf) {\n                setSelectedNode(info.node);\n              }\n            }}\n            selectedKeys={selectedNode ? [selectedNode.key] : undefined}\n            expandAction=\"click\"\n          />\n          <Drawer\n            open={drawerVisible}\n            onClose={() => setDrawerVisible(false)}\n            maskClosable\n            width={drawerWidth}\n            zIndex={999}\n            bodyStyle={{ padding: 0 }}\n          >\n            {drawerVisible ? (\n              <ServerAPIProvider\n                api={SDK.ServerAPI.API.GetLoaderFileDetails}\n                body={{ path: resourcePath }}\n              >\n                {(data) => (\n                  <LoaderExecutions data={data} cwd={cwd} index={loaderIndex} />\n                )}\n              </ServerAPIProvider>\n            ) : null}\n          </Drawer>\n        </Card>\n      </Col>\n\n      <Drawer\n        open={!!selectedNode}\n        onClose={() => setSelectedNode(null)}\n        maskClosable\n        width={drawerWidth}\n        zIndex={999}\n        bodyStyle={{ padding: 0 }}\n      >\n        {selectedNode && (\n          <Row>\n            <Col span={24}>\n              <Card\n                title={\n                  <Tooltip\n                    title={React.cloneElement(\n                      selectedNode.title as React.ReactElement<{\n                        style?: React.CSSProperties;\n                      }>,\n                      { style: { color: '#fff' } },\n                    )}\n                  >\n                    <Typography.Text>\n                      {`Statistics of`}\n                      {selectedNode.title as React.ReactNode}\n                    </Typography.Text>\n                  </Tooltip>\n                }\n              >\n                <ServerAPIProvider\n                  api={SDK.ServerAPI.API.GetLoaderFolderStatistics}\n                  body={{ folder: selectedNode[inlinedResourcePathKey] }}\n                >\n                  {(tableData) => (\n                    <Table\n                      style={{\n                        width: '100%',\n                        maxHeight,\n                        height: '40rem',\n                        overflowY: 'scroll',\n                        wordBreak: 'break-all',\n                      }}\n                      pagination={false}\n                      bordered\n                      rowKey={(e) => e.loader}\n                      columns={[\n                        {\n                          title: 'Loader Name',\n                          dataIndex: 'loader',\n                        },\n                        {\n                          title: 'Files',\n                          dataIndex: 'files',\n                        },\n                        {\n                          title: 'Total Duration',\n                          dataIndex: 'costs',\n                          render: (v) => (\n                            <Typography.Text strong>\n                              {formatCosts(v)}\n                            </Typography.Text>\n                          ),\n                          sorter: (a, b) => a.costs - b.costs,\n                          defaultSortOrder: 'descend',\n                          sortDirections: ['descend', 'ascend'],\n                        },\n                      ]}\n                      dataSource={tableData!}\n                    />\n                  )}\n                </ServerAPIProvider>\n              </Card>\n            </Col>\n          </Row>\n        )}\n      </Drawer>\n    </Row>\n  );\n};\n"],"names":["ADDITION_LOADER_NUMBER","LoaderFiles","props","cwd","filetree","drawerVisible","setDrawerVisible","useState","resourcePath","setResourcePath","loaderIndex","setLoaderIndex","selectedNode","setSelectedNode","maxHeight","filteredFiles","useMemo","e","l","filterLoader","inlinedResourcePathKey","files","createFileStructures","file","basename","loaders","layer","additionalLoaders","i","styles","Keyword","Divider","Tag","Space","isError","key","Tooltip","ev","Typography","CloseCircleOutlined","formatCosts","Popover","List","_dir","defaultTitle","Row","Size","Col","Card","FileTree","mapFileKey","node","get","isNodeModules","_e","info","undefined","Drawer","drawerWidth","ServerAPIProvider","SDK","data","LoaderExecutions","React","tableData","Table","v","a","b"],"mappings":"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"}