{"version":3,"file":"components/Resolver/analysis.mjs","sources":["../../../src/components/Resolver/analysis.tsx"],"sourcesContent":["/* rslint-disable react/no-unescaped-entities */\nimport { CloseCircleOutlined, FileSearchOutlined } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport { Resolver } from '@rsdoctor/utils/common';\nimport { Card, Col, Row, Space, Table, Tabs, Typography } from 'antd';\nimport { get } from 'es-toolkit/compat';\nimport React, { useMemo, useState } from 'react';\nimport { Size } from '../../constants';\nimport { createFileStructures, formatCosts, mapFileKey } from '../../utils';\nimport { FileTree } from '../FileTree';\nimport { KeywordInput } from '../Form/keyword';\nimport { ServerAPIProvider, withServerAPI } from '../Manifest';\nimport { DiffViewer } from '../base';\n\nconst height = 735;\n\nconst ResolverDetailsPanel: React.FC<\n  SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetResolverFileDetails>\n> = ({ filepath, before, after, resolvers }) => {\n  return (\n    <Col flex={1}>\n      <Tabs\n        defaultActiveKey=\"diff\"\n        items={[\n          {\n            key: 'diff',\n            label: 'Resolve Diff Viewer',\n            children: (\n              <Card styles={{ body: { padding: 0, overflow: 'hidden' } }}>\n                <DiffViewer\n                  style={{\n                    height: height + 50,\n                  }}\n                  isEmbed\n                  originalFilePath={filepath}\n                  modifiedFilePath={filepath}\n                  original={before}\n                  modified={after}\n                />\n              </Card>\n            ),\n          },\n          {\n            key: 'details',\n            label: 'Resolve Details',\n            children: (\n              <Card>\n                <Table\n                  style={{\n                    width: '100%',\n                    height,\n                    overflowY: 'scroll',\n                    wordBreak: 'break-all',\n                  }}\n                  size=\"small\"\n                  pagination={false}\n                  bordered\n                  rowKey={(e) => e.request}\n                  columns={[\n                    {\n                      title: 'Source Code',\n                      width: 200,\n                      render: (_v, r) => (\n                        <Typography.Text copyable>\n                          <Typography.Text code strong>\n                            {r.request}\n                          </Typography.Text>\n                        </Typography.Text>\n                      ),\n                    },\n                    {\n                      title: 'Duration',\n                      width: 80,\n                      render: (_v, r) => (\n                        <Typography.Text strong>\n                          {formatCosts(r.costs)}\n                        </Typography.Text>\n                      ),\n                      sorter: (a, b) => a.costs - b.costs,\n                      sortDirections: ['descend', 'ascend'],\n                    },\n                    {\n                      title: 'Resolve Result',\n                      render: (_v, r) => {\n                        if (Resolver.isResolveSuccessData(r))\n                          return (\n                            <Typography.Text copyable>\n                              {r.result}\n                            </Typography.Text>\n                          );\n                        return (\n                          <CloseCircleOutlined style={{ color: '#f50' }} />\n                        );\n                      },\n                    },\n                  ]}\n                  dataSource={resolvers}\n                />\n              </Card>\n            ),\n          },\n        ]}\n      />\n    </Col>\n  );\n};\n\nexport const ResolverFiles: React.FC<{\n  filename: string;\n  cwd: string;\n  resolver: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetResolverFileTree>;\n}> = (props) => {\n  const { resolver, cwd } = props;\n\n  const [filepath, setFilepath] = useState('');\n\n  const inlinedResourcePathKey = '__RESOURCEPATH__';\n  const n = '/node_modules/';\n\n  const paths = useMemo(() => {\n    return resolver.map((e) => e.issuerPath).filter(Boolean);\n  }, [resolver]);\n\n  const filterPaths = useMemo(() => {\n    return paths.filter((e) =>\n      props.filename ? e.indexOf(props.filename) > -1 : true,\n    );\n  }, [props.filename, paths]);\n\n  const allNodeModules =\n    filterPaths.length && filterPaths.every((e) => e.indexOf(n) > -1);\n\n  const files = useMemo(() => {\n    return createFileStructures({\n      files: filterPaths.length ? filterPaths : paths,\n      cwd,\n      fileTitle(file, basename) {\n        return <div onClick={() => setFilepath(file)}>{basename}</div>;\n      },\n    });\n  }, [props.filename]);\n\n  return (\n    <Row justify=\"start\" align=\"top\" wrap={false} gutter={Size.BasePadding}>\n      <Col span={7}>\n        <Card title=\"Files\">\n          <FileTree\n            style={{ width: '100%', height, overflow: 'scroll' }}\n            treeData={files}\n            defaultExpandedKeys={mapFileKey(\n              files,\n              allNodeModules ? 1 : 4,\n              allNodeModules\n                ? undefined\n                : (node) => {\n                    const resourcePath: string = get(\n                      node,\n                      inlinedResourcePathKey,\n                    )!;\n                    const isNodeModules = resourcePath.indexOf(n) > -1;\n\n                    if (\n                      filterPaths.length &&\n                      filterPaths.every((e) => e.indexOf(n) > -1)\n                    ) {\n                      return true;\n                    }\n\n                    return !isNodeModules;\n                  },\n            )}\n            key={`tree_${props.filename}`}\n          />\n        </Card>\n      </Col>\n      {filepath && (\n        <ServerAPIProvider\n          api={SDK.ServerAPI.API.GetResolverFileDetails}\n          body={{ filepath }}\n        >\n          {(resolvers) => <ResolverDetailsPanel {...resolvers} />}\n        </ServerAPIProvider>\n      )}\n    </Row>\n  );\n};\n\nexport const ResolverAnalysisBase: React.FC<{\n  project: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetProjectInfo>;\n}> = ({ project }) => {\n  const { root: cwd } = project;\n  const [filename, setFilename] = useState('');\n\n  return (\n    <div style={{ width: '100%' }}>\n      <Space\n        style={{ marginTop: Size.BasePadding, marginBottom: Size.BasePadding }}\n      >\n        <KeywordInput\n          icon={<FileSearchOutlined />}\n          label=\"Filename\"\n          placeholder=\"search filename by keyword\"\n          onChange={(e) => setFilename(e)}\n        />\n      </Space>\n      <ServerAPIProvider api={SDK.ServerAPI.API.GetResolverFileTree}>\n        {(resolver) => (\n          <ResolverFiles filename={filename} resolver={resolver} cwd={cwd} />\n        )}\n      </ServerAPIProvider>\n    </div>\n  );\n};\n\nexport const ResolverAnalysis = withServerAPI({\n  api: SDK.ServerAPI.API.GetProjectInfo,\n  responsePropName: 'project',\n  Component: ResolverAnalysisBase,\n});\n"],"names":["height","ResolverDetailsPanel","filepath","before","after","resolvers","Col","Tabs","Card","DiffViewer","Table","e","_v","r","Typography","formatCosts","a","b","Resolver","CloseCircleOutlined","ResolverFiles","props","resolver","cwd","setFilepath","useState","inlinedResourcePathKey","n","paths","useMemo","Boolean","filterPaths","allNodeModules","files","createFileStructures","file","basename","Row","Size","FileTree","mapFileKey","undefined","node","resourcePath","get","isNodeModules","ServerAPIProvider","SDK","ResolverAnalysisBase","project","filename","setFilename","Space","KeywordInput","FileSearchOutlined","ResolverAnalysis","withServerAPI"],"mappings":"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"}