@rsdoctor/components 1.1.0-alpha.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/components/Alert/change.d.ts +0 -5
  2. package/dist/components/Alert/change.js +63 -14
  3. package/dist/components/Alert/change.js.map +1 -1
  4. package/dist/components/Alert/view.js +6 -6
  5. package/dist/components/Alert/view.js.map +1 -1
  6. package/dist/components/Loader/executions.js +1 -2
  7. package/dist/components/Loader/executions.js.map +1 -1
  8. package/dist/components/Resolver/analysis.js +1 -1
  9. package/dist/components/Resolver/analysis.js.map +1 -1
  10. package/dist/components/base/CodeViewer/index.d.ts +3 -0
  11. package/dist/components/base/CodeViewer/index.js +5 -1
  12. package/dist/components/base/CodeViewer/index.js.map +1 -1
  13. package/dist/components/base/CodeViewer/utils.d.ts +2 -0
  14. package/dist/components/base/CodeViewer/utils.js +12 -2
  15. package/dist/components/base/CodeViewer/utils.js.map +1 -1
  16. package/dist/components/base/DiffViewer/index.d.ts +3 -0
  17. package/dist/components/base/DiffViewer/index.js +12 -2
  18. package/dist/components/base/DiffViewer/index.js.map +1 -1
  19. package/dist/components/base/index.d.ts +5 -0
  20. package/dist/components/base/index.js +4 -0
  21. package/dist/components/base/index.js.map +1 -0
  22. package/dist/components/index.d.ts +4 -5
  23. package/dist/components/index.js +4 -5
  24. package/dist/components/index.js.map +1 -1
  25. package/dist/pages/BundleSize/components/asset.js +1 -1
  26. package/dist/pages/BundleSize/components/asset.js.map +1 -1
  27. package/dist/pages/Resources/BundleDiff/DiffContainer/changes.js +15 -15
  28. package/dist/pages/Resources/BundleDiff/DiffContainer/changes.js.map +1 -1
  29. package/dist/pages/TreeShaking/editor.js +12 -8
  30. package/dist/pages/TreeShaking/editor.js.map +1 -1
  31. package/dist/pages/TreeShaking/utils.d.ts +1 -1
  32. package/dist/pages/TreeShaking/utils.js +8 -11
  33. package/dist/pages/TreeShaking/utils.js.map +1 -1
  34. package/dist/utils/index.d.ts +1 -2
  35. package/dist/utils/index.js +1 -2
  36. package/dist/utils/index.js.map +1 -1
  37. package/package.json +5 -5
  38. package/dist/components/BundleDiff/DiffContainer/assets.d.ts +0 -7
  39. package/dist/components/BundleDiff/DiffContainer/assets.js +0 -509
  40. package/dist/components/BundleDiff/DiffContainer/assets.js.map +0 -1
  41. package/dist/components/BundleDiff/DiffContainer/cards.d.ts +0 -3
  42. package/dist/components/BundleDiff/DiffContainer/cards.js +0 -158
  43. package/dist/components/BundleDiff/DiffContainer/cards.js.map +0 -1
  44. package/dist/components/BundleDiff/DiffContainer/changes.d.ts +0 -15
  45. package/dist/components/BundleDiff/DiffContainer/changes.js +0 -71
  46. package/dist/components/BundleDiff/DiffContainer/changes.js.map +0 -1
  47. package/dist/components/BundleDiff/DiffContainer/constants.d.ts +0 -11
  48. package/dist/components/BundleDiff/DiffContainer/constants.js +0 -19
  49. package/dist/components/BundleDiff/DiffContainer/constants.js.map +0 -1
  50. package/dist/components/BundleDiff/DiffContainer/diff.d.ts +0 -23
  51. package/dist/components/BundleDiff/DiffContainer/diff.js +0 -116
  52. package/dist/components/BundleDiff/DiffContainer/diff.js.map +0 -1
  53. package/dist/components/BundleDiff/DiffContainer/index.d.ts +0 -3
  54. package/dist/components/BundleDiff/DiffContainer/index.js +0 -182
  55. package/dist/components/BundleDiff/DiffContainer/index.js.map +0 -1
  56. package/dist/components/BundleDiff/DiffContainer/modules.d.ts +0 -8
  57. package/dist/components/BundleDiff/DiffContainer/modules.js +0 -304
  58. package/dist/components/BundleDiff/DiffContainer/modules.js.map +0 -1
  59. package/dist/components/BundleDiff/DiffContainer/overview.d.ts +0 -5
  60. package/dist/components/BundleDiff/DiffContainer/overview.js +0 -180
  61. package/dist/components/BundleDiff/DiffContainer/overview.js.map +0 -1
  62. package/dist/components/BundleDiff/DiffContainer/packages.d.ts +0 -19
  63. package/dist/components/BundleDiff/DiffContainer/packages.js +0 -332
  64. package/dist/components/BundleDiff/DiffContainer/packages.js.map +0 -1
  65. package/dist/components/BundleDiff/DiffContainer/row.d.ts +0 -9
  66. package/dist/components/BundleDiff/DiffContainer/row.js +0 -371
  67. package/dist/components/BundleDiff/DiffContainer/row.js.map +0 -1
  68. package/dist/components/BundleDiff/DiffContainer/types.d.ts +0 -44
  69. package/dist/components/BundleDiff/DiffContainer/types.js +0 -0
  70. package/dist/components/BundleDiff/DiffContainer/utils.d.ts +0 -2
  71. package/dist/components/BundleDiff/DiffContainer/utils.js +0 -26
  72. package/dist/components/BundleDiff/DiffContainer/utils.js.map +0 -1
  73. package/dist/components/BundleDiff/DiffServerAPIProvider/index.d.ts +0 -3
  74. package/dist/components/BundleDiff/DiffServerAPIProvider/index.js +0 -39
  75. package/dist/components/BundleDiff/DiffServerAPIProvider/index.js.map +0 -1
  76. package/dist/components/BundleDiff/constants.d.ts +0 -11
  77. package/dist/components/BundleDiff/constants.js +0 -21
  78. package/dist/components/BundleDiff/constants.js.map +0 -1
  79. package/dist/components/BundleDiff/index.d.ts +0 -1
  80. package/dist/components/BundleDiff/index.js +0 -3
  81. package/dist/components/BundleDiff/index.js.map +0 -1
  82. package/dist/components/CodeViewer/config.d.ts +0 -3
  83. package/dist/components/CodeViewer/config.js +0 -20
  84. package/dist/components/CodeViewer/config.js.map +0 -1
  85. package/dist/components/CodeViewer/diff.d.ts +0 -12
  86. package/dist/components/CodeViewer/diff.js +0 -56
  87. package/dist/components/CodeViewer/diff.js.map +0 -1
  88. package/dist/components/CodeViewer/highlight.d.ts +0 -11
  89. package/dist/components/CodeViewer/highlight.js +0 -94
  90. package/dist/components/CodeViewer/highlight.js.map +0 -1
  91. package/dist/components/CodeViewer/index.d.ts +0 -4
  92. package/dist/components/CodeViewer/index.js +0 -6
  93. package/dist/components/CodeViewer/index.js.map +0 -1
  94. package/dist/components/CodeViewer/viewer.d.ts +0 -16
  95. package/dist/components/CodeViewer/viewer.js +0 -63
  96. package/dist/components/CodeViewer/viewer.js.map +0 -1
  97. package/dist/pages/BundleSize/components/editor.d.ts +0 -5
  98. package/dist/pages/BundleSize/components/editor.js +0 -40
  99. package/dist/pages/BundleSize/components/editor.js.map +0 -1
  100. package/dist/utils/monaco.d.ts +0 -12
  101. package/dist/utils/monaco.js +0 -78
  102. package/dist/utils/monaco.js.map +0 -1
@@ -1,8 +1,3 @@
1
1
  import React from 'react';
2
2
  import { CodeChangeAlertProps } from './types';
3
- interface FixedProps {
4
- setIsFixed(val: boolean): void;
5
- }
6
- export declare const CodeChangeDrawerContent: React.FC<CodeChangeAlertProps & FixedProps>;
7
3
  export declare const CodeChangeAlert: React.FC<CodeChangeAlertProps>;
8
- export {};
@@ -1,15 +1,28 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useState } from "react";
3
- import axios from "axios";
4
- import { Space, Alert, Button, Typography, Divider, Popconfirm, Row, Col } from "antd";
5
- import { InfoCircleOutlined, CheckOutlined } from "@ant-design/icons";
2
+ import { CheckOutlined, InfoCircleOutlined } from "@ant-design/icons";
6
3
  import { SDK } from "@rsdoctor/types";
4
+ import {
5
+ Alert,
6
+ Button,
7
+ Col,
8
+ Divider,
9
+ Popconfirm,
10
+ Row,
11
+ Space,
12
+ Typography
13
+ } from "antd";
14
+ import axios from "axios";
15
+ import { useState } from "react";
7
16
  import { useRuleIndexNavigate } from "../../utils";
17
+ import { DiffViewer } from "../base";
18
+ import { CodeOpener } from "../Opener";
8
19
  import { TextDrawer } from "../TextDrawer";
9
20
  import { Title } from "../Title";
10
- import { CodeOpener } from "../Opener";
11
- import { DiffViewer } from "../CodeViewer";
12
- const CodeChangeDrawerContent = ({ data, setIsFixed, cwd }) => {
21
+ const CodeChangeDrawerContent = ({
22
+ data,
23
+ setIsFixed,
24
+ cwd
25
+ }) => {
13
26
  const { file, id } = data;
14
27
  const { path, line, isFixed, actual, expected } = file;
15
28
  const applyFix = () => {
@@ -28,7 +41,16 @@ const CodeChangeDrawerContent = ({ data, setIsFixed, cwd }) => {
28
41
  zIndex: 99999,
29
42
  disabled: isFixed,
30
43
  placement: "bottom",
31
- children: /* @__PURE__ */ jsx(Button, { type: "primary", size: "small", icon: isFixed ? /* @__PURE__ */ jsx(CheckOutlined, {}) : void 0, disabled: isFixed, children: isFixed ? "Fix Applied" : "Apply Fix" })
44
+ children: /* @__PURE__ */ jsx(
45
+ Button,
46
+ {
47
+ type: "primary",
48
+ size: "small",
49
+ icon: isFixed ? /* @__PURE__ */ jsx(CheckOutlined, {}) : void 0,
50
+ disabled: isFixed,
51
+ children: isFixed ? "Fix Applied" : "Apply Fix"
52
+ }
53
+ )
32
54
  }
33
55
  );
34
56
  };
@@ -42,10 +64,22 @@ const CodeChangeDrawerContent = ({ data, setIsFixed, cwd }) => {
42
64
  /* @__PURE__ */ jsx(Col, { span: 12, children: /* @__PURE__ */ jsx(Typography.Text, { strong: true, children: "Before" }) }),
43
65
  /* @__PURE__ */ jsx(Col, { span: 12, children: /* @__PURE__ */ jsx(Typography.Text, { strong: true, children: "After" }) })
44
66
  ] }),
45
- /* @__PURE__ */ jsx(DiffViewer, { className: "full-space", filepath: path, before: actual, after: expected })
67
+ /* @__PURE__ */ jsx(
68
+ DiffViewer,
69
+ {
70
+ className: "full-space",
71
+ originalFilePath: path,
72
+ modifiedFilePath: path,
73
+ original: actual,
74
+ modified: expected
75
+ }
76
+ )
46
77
  ] });
47
78
  };
48
- const CodeChangeAlert = ({ data, cwd }) => {
79
+ const CodeChangeAlert = ({
80
+ data,
81
+ cwd
82
+ }) => {
49
83
  const { title, description = "", level, code, file } = data;
50
84
  const [isFixed, setIsFixed] = useState(file.isFixed ?? false);
51
85
  const navigate = useRuleIndexNavigate(code, data.link);
@@ -67,7 +101,16 @@ const CodeChangeAlert = ({ data, cwd }) => {
67
101
  {
68
102
  showIcon: true,
69
103
  message: /* @__PURE__ */ jsxs(Space, { children: [
70
- /* @__PURE__ */ jsx(Typography.Text, { code: true, strong: true, onClick: navigate, style: { cursor: "pointer" }, children: /* @__PURE__ */ jsx("a", { children: code }) }),
104
+ /* @__PURE__ */ jsx(
105
+ Typography.Text,
106
+ {
107
+ code: true,
108
+ strong: true,
109
+ onClick: navigate,
110
+ style: { cursor: "pointer" },
111
+ children: /* @__PURE__ */ jsx("a", { children: code })
112
+ }
113
+ ),
71
114
  /* @__PURE__ */ jsx(Typography.Text, { strong: true, children: title })
72
115
  ] }),
73
116
  description: Description,
@@ -78,7 +121,14 @@ const CodeChangeAlert = ({ data, cwd }) => {
78
121
  {
79
122
  text: isFixed ? "Fixed | Show Fix History" : "Show Fix Suggestion",
80
123
  buttonProps: { size: "small" },
81
- children: /* @__PURE__ */ jsx(CodeChangeDrawerContent, { data, setIsFixed: fixFile, cwd })
124
+ children: /* @__PURE__ */ jsx(
125
+ CodeChangeDrawerContent,
126
+ {
127
+ data,
128
+ setIsFixed: fixFile,
129
+ cwd
130
+ }
131
+ )
82
132
  }
83
133
  ),
84
134
  /* @__PURE__ */ jsx(Divider, { type: "vertical" }),
@@ -88,8 +138,7 @@ const CodeChangeAlert = ({ data, cwd }) => {
88
138
  );
89
139
  };
90
140
  export {
91
- CodeChangeAlert,
92
- CodeChangeDrawerContent
141
+ CodeChangeAlert
93
142
  };
94
143
 
95
144
  //# sourceMappingURL=change.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../src/components/Alert/change.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport axios from 'axios';\nimport { Space, Alert, Button, Typography, Divider, Popconfirm, Row, Col } from 'antd';\nimport { InfoCircleOutlined, CheckOutlined } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport { useRuleIndexNavigate } from '../../utils';\nimport { TextDrawer } from '../TextDrawer';\nimport { Title } from '../Title';\nimport { CodeOpener } from '../Opener';\nimport { DiffViewer } from '../CodeViewer';\nimport { CodeChangeAlertProps } from './types';\n\ninterface FixedProps {\n setIsFixed(val: boolean): void;\n}\n\nexport const CodeChangeDrawerContent: React.FC<CodeChangeAlertProps & FixedProps> = ({ data, setIsFixed, cwd }) => {\n const { file, id } = data;\n const { path, line, isFixed, actual, expected } = file;\n // const [isFixed, setIsFixed] = useState(file.isFixed ?? false);\n const applyFix = () => {\n axios.post(SDK.ServerAPI.API.ApplyErrorFix, { id }).then(() => {\n setIsFixed(true);\n });\n };\n\n const FixButton = () => {\n return (\n <Popconfirm\n title={`Did you confirm to apply the change i the area below ?`}\n onConfirm={applyFix}\n okText=\"Yes\"\n cancelText=\"Cancel\"\n zIndex={99999}\n disabled={isFixed}\n placement=\"bottom\"\n >\n <Button type=\"primary\" size=\"small\" icon={isFixed ? <CheckOutlined /> : undefined} disabled={isFixed}>\n {isFixed ? 'Fix Applied' : 'Apply Fix'}\n </Button>\n </Popconfirm>\n );\n };\n\n return (\n <Space direction=\"vertical\" className=\"alert-space\">\n <div>\n <Title text={isFixed ? 'Fix History' : 'Suggest Fix'} />\n <span className=\"code-change-tag-list\">\n <FixButton />\n </span>\n </div>\n <CodeOpener cwd={cwd} url={path} loc={String(line)} code disabled />\n <Row>\n <Col span={12}>\n <Typography.Text strong>Before</Typography.Text>\n </Col>\n <Col span={12}>\n <Typography.Text strong>After</Typography.Text>\n </Col>\n </Row>\n <DiffViewer className=\"full-space\" filepath={path} before={actual} after={expected} />\n </Space>\n );\n};\n\nexport const CodeChangeAlert: React.FC<CodeChangeAlertProps> = ({ data, cwd }) => {\n const { title, description = '', level, code, file } = data;\n const [isFixed, setIsFixed] = useState(file.isFixed ?? false);\n const navigate = useRuleIndexNavigate(code, data.link);\n const fixFile = (val: boolean) => {\n setIsFixed(val);\n file.isFixed = val;\n };\n const Description = (\n <Space direction=\"vertical\">\n <Typography.Text>{description}</Typography.Text>\n <Space>\n <Typography.Text>File:</Typography.Text>\n <Typography.Text strong code>\n {file.path}\n </Typography.Text>\n <Typography.Text>in line</Typography.Text>\n <Typography.Text strong code>\n {file.line}\n </Typography.Text>\n </Space>\n </Space>\n );\n\n return (\n <Alert\n showIcon\n message={\n <Space>\n <Typography.Text code strong onClick={navigate} style={{ cursor: 'pointer' }}>\n <a>{code}</a>\n </Typography.Text>\n <Typography.Text strong>{title}</Typography.Text>\n </Space>\n }\n description={Description}\n type={isFixed ? 'success' : level === 'warn' ? 'info' : level}\n action={\n <Space>\n <TextDrawer\n text={isFixed ? 'Fixed | Show Fix History' : 'Show Fix Suggestion'}\n buttonProps={{ size: 'small' }}\n >\n <CodeChangeDrawerContent data={data} setIsFixed={fixFile} cwd={cwd} />\n </TextDrawer>\n <Divider type=\"vertical\" />\n <Button type=\"link\" onClick={navigate} size=\"small\">\n <InfoCircleOutlined />\n </Button>\n </Space>\n }\n />\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../src/components/Alert/change.tsx"],"sourcesContent":["import { CheckOutlined, InfoCircleOutlined } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Alert,\n Button,\n Col,\n Divider,\n Popconfirm,\n Row,\n Space,\n Typography,\n} from 'antd';\nimport axios from 'axios';\nimport React, { useState } from 'react';\nimport { useRuleIndexNavigate } from '../../utils';\nimport { DiffViewer } from '../base';\nimport { CodeOpener } from '../Opener';\nimport { TextDrawer } from '../TextDrawer';\nimport { Title } from '../Title';\nimport { CodeChangeAlertProps } from './types';\n\ninterface FixedProps {\n setIsFixed(val: boolean): void;\n}\n\nconst CodeChangeDrawerContent: React.FC<CodeChangeAlertProps & FixedProps> = ({\n data,\n setIsFixed,\n cwd,\n}) => {\n const { file, id } = data;\n const { path, line, isFixed, actual, expected } = file;\n // const [isFixed, setIsFixed] = useState(file.isFixed ?? false);\n const applyFix = () => {\n axios.post(SDK.ServerAPI.API.ApplyErrorFix, { id }).then(() => {\n setIsFixed(true);\n });\n };\n\n const FixButton = () => {\n return (\n <Popconfirm\n title={`Did you confirm to apply the change i the area below ?`}\n onConfirm={applyFix}\n okText=\"Yes\"\n cancelText=\"Cancel\"\n zIndex={99999}\n disabled={isFixed}\n placement=\"bottom\"\n >\n <Button\n type=\"primary\"\n size=\"small\"\n icon={isFixed ? <CheckOutlined /> : undefined}\n disabled={isFixed}\n >\n {isFixed ? 'Fix Applied' : 'Apply Fix'}\n </Button>\n </Popconfirm>\n );\n };\n\n return (\n <Space direction=\"vertical\" className=\"alert-space\">\n <div>\n <Title text={isFixed ? 'Fix History' : 'Suggest Fix'} />\n <span className=\"code-change-tag-list\">\n <FixButton />\n </span>\n </div>\n <CodeOpener cwd={cwd} url={path} loc={String(line)} code disabled />\n <Row>\n <Col span={12}>\n <Typography.Text strong>Before</Typography.Text>\n </Col>\n <Col span={12}>\n <Typography.Text strong>After</Typography.Text>\n </Col>\n </Row>\n <DiffViewer\n className=\"full-space\"\n originalFilePath={path}\n modifiedFilePath={path}\n original={actual}\n modified={expected}\n />\n </Space>\n );\n};\n\n///REVIEW - It's still useful? can't find usage\nexport const CodeChangeAlert: React.FC<CodeChangeAlertProps> = ({\n data,\n cwd,\n}) => {\n const { title, description = '', level, code, file } = data;\n const [isFixed, setIsFixed] = useState(file.isFixed ?? false);\n const navigate = useRuleIndexNavigate(code, data.link);\n const fixFile = (val: boolean) => {\n setIsFixed(val);\n file.isFixed = val;\n };\n const Description = (\n <Space direction=\"vertical\">\n <Typography.Text>{description}</Typography.Text>\n <Space>\n <Typography.Text>File:</Typography.Text>\n <Typography.Text strong code>\n {file.path}\n </Typography.Text>\n <Typography.Text>in line</Typography.Text>\n <Typography.Text strong code>\n {file.line}\n </Typography.Text>\n </Space>\n </Space>\n );\n\n return (\n <Alert\n showIcon\n message={\n <Space>\n <Typography.Text\n code\n strong\n onClick={navigate}\n style={{ cursor: 'pointer' }}\n >\n <a>{code}</a>\n </Typography.Text>\n <Typography.Text strong>{title}</Typography.Text>\n </Space>\n }\n description={Description}\n type={isFixed ? 'success' : level === 'warn' ? 'info' : level}\n action={\n <Space>\n <TextDrawer\n text={isFixed ? 'Fixed | Show Fix History' : 'Show Fix Suggestion'}\n buttonProps={{ size: 'small' }}\n >\n <CodeChangeDrawerContent\n data={data}\n setIsFixed={fixFile}\n cwd={cwd}\n />\n </TextDrawer>\n <Divider type=\"vertical\" />\n <Button type=\"link\" onClick={navigate} size=\"small\">\n <InfoCircleOutlined />\n </Button>\n </Space>\n }\n />\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
@@ -1,12 +1,12 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
- import { Lodash } from "@rsdoctor/utils/common";
3
- import { Space, Alert, Button, Typography, Divider } from "antd";
4
2
  import { InfoCircleOutlined } from "@ant-design/icons";
3
+ import { Alert, Button, Divider, Space, Typography } from "antd";
4
+ import { Lodash } from "@rsdoctor/utils/common";
5
5
  import { useRuleIndexNavigate } from "../../utils";
6
+ import { CodeViewer } from "../base";
7
+ import { CodeOpener } from "../Opener";
6
8
  import { TextDrawer } from "../TextDrawer";
7
9
  import { Title } from "../Title";
8
- import { CodeOpener } from "../Opener";
9
- import { CodeViewer } from "../CodeViewer";
10
10
  const CodeViewDrawerContent = ({
11
11
  data,
12
12
  cwd
@@ -29,8 +29,8 @@ const CodeViewDrawerContent = ({
29
29
  /* @__PURE__ */ jsx(
30
30
  CodeViewer,
31
31
  {
32
- path: file.path,
33
- content: file.content,
32
+ filePath: file.path,
33
+ code: file.content,
34
34
  ranges,
35
35
  defaultLine: line
36
36
  }
@@ -1 +1 @@
1
- {"version":3,"mappings":"AAoBI,SAiCM,UAhCJ,KADF;AAnBJ,SAAS,cAAc;AACvB,SAAS,OAAO,OAAO,QAAQ,YAAY,eAAe;AAC1D,SAAS,0BAA0B;AACnC,SAAS,4BAA4B;AACrC,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAGpB,MAAM,wBAAsD,CAAC;AAAA,EAClE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,EAAE,MAAM,OAAO,IAAI;AACzB,QAAM,OAAO,SAAS,CAAC,EAAE,MAAM;AAE/B,SACE,qBAAC,SAAM,WAAU,YAAW,WAAU,eACpC;AAAA,wBAAC,SAAM,MAAK,eAAc;AAAA,IAC1B;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,KAAK;AAAA,QACL,KAAK,OAAO,SAAS,IAAI,IAAI,OAAO,IAAI,IAAI;AAAA,QAC5C,MAAI;AAAA,QACJ,UAAQ;AAAA;AAAA,IACV;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,SAAS,KAAK;AAAA,QACd;AAAA,QACA,aAAa;AAAA;AAAA,IACf;AAAA,KACF;AAEJ;AAEO,MAAM,gBAA8C,CAAC,EAAE,MAAM,IAAI,MAAM;AAC5E,QAAM,EAAE,OAAO,cAAc,IAAI,OAAO,MAAM,KAAK,IAAI;AACvD,QAAM,WAAW,qBAAqB,MAAM,KAAK,IAAI;AACrD,QAAM,YAAY,KAAK,SAAS,CAAC,EAAE,MAAM;AAEzC,QAAM,cACJ,qBAAC,SAAM,WAAU,YACf;AAAA,wBAAC,WAAW,MAAX,EAAiB,uBAAY;AAAA,IAC9B,qBAAC,SACC;AAAA,0BAAC,WAAW,MAAX,EAAgB,mBAAK;AAAA,MACtB,oBAAC,WAAW,MAAX,EAAgB,QAAM,MAAC,MAAI,MACzB,eAAK,MACR;AAAA,MACC,OAAO,SAAS,SAAS,IACxB,iCACE;AAAA,4BAAC,WAAW,MAAX,EAAgB,qBAAO;AAAA,QACxB,oBAAC,WAAW,MAAX,EAAgB,QAAM,MAAC,MAAI,MACzB,qBACH;AAAA,SACF,IAEA;AAAA,OAEJ;AAAA,KACF;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAQ;AAAA,MACR,SACE,qBAAC,SACC;AAAA;AAAA,UAAC,WAAW;AAAA,UAAX;AAAA,YACC,MAAI;AAAA,YACJ,QAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO,EAAE,QAAQ,UAAU;AAAA,YAE3B,8BAAC,OAAG,gBAAK;AAAA;AAAA,QACX;AAAA,QACA,oBAAC,WAAW,MAAX,EAAgB,QAAM,MAAE,iBAAM;AAAA,SACjC;AAAA,MAEF,aAAa;AAAA,MACb,MAAM,UAAU,SAAS,SAAS;AAAA,MAClC,QACE,qBAAC,SACC;AAAA,4BAAC,cAAW,MAAM,oBAAoB,aAAa,EAAE,MAAM,QAAQ,GACjE,8BAAC,yBAAsB,MAAY,KAAU,GAC/C;AAAA,QACA,iCACE;AAAA,8BAAC,WAAQ,MAAK,YAAW;AAAA,UACzB;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,MAAK;AAAA,cACL,MAAM,oBAAC,sBAAmB;AAAA;AAAA,UAC5B;AAAA,WACF;AAAA,SACF;AAAA;AAAA,EAEJ;AAEJ","names":[],"ignoreList":[],"sources":["../../../src/components/Alert/view.tsx"],"sourcesContent":["import React from 'react';\nimport { Lodash } from '@rsdoctor/utils/common';\nimport { Space, Alert, Button, Typography, Divider } from 'antd';\nimport { InfoCircleOutlined } from '@ant-design/icons';\nimport { useRuleIndexNavigate } from '../../utils';\nimport { TextDrawer } from '../TextDrawer';\nimport { Title } from '../Title';\nimport { CodeOpener } from '../Opener';\nimport { CodeViewer } from '../CodeViewer';\nimport { CodeViewAlertProps } from './types';\n\nexport const CodeViewDrawerContent: React.FC<CodeViewAlertProps> = ({\n data,\n cwd,\n}) => {\n const { file } = data;\n const { path, ranges } = file;\n const line = ranges?.[0].start.line;\n\n return (\n <Space direction=\"vertical\" className=\"alert-space\">\n <Title text=\"Code Viewer\" />\n <CodeOpener\n cwd={cwd}\n url={path}\n loc={Lodash.isNumber(line) ? String(line) : undefined}\n code\n disabled\n />\n <CodeViewer\n path={file.path}\n content={file.content}\n ranges={ranges}\n defaultLine={line}\n />\n </Space>\n );\n};\n\nexport const CodeViewAlert: React.FC<CodeViewAlertProps> = ({ data, cwd }) => {\n const { title, description = '', level, code, file } = data;\n const navigate = useRuleIndexNavigate(code, data.link);\n const startLine = file.ranges?.[0].start.line;\n\n const Description = (\n <Space direction=\"vertical\">\n <Typography.Text>{description}</Typography.Text>\n <Space>\n <Typography.Text>File:</Typography.Text>\n <Typography.Text strong code>\n {file.path}\n </Typography.Text>\n {Lodash.isNumber(startLine) ? (\n <>\n <Typography.Text>in line</Typography.Text>\n <Typography.Text strong code>\n {startLine}\n </Typography.Text>\n </>\n ) : (\n ''\n )}\n </Space>\n </Space>\n );\n\n return (\n <Alert\n showIcon\n message={\n <Space>\n <Typography.Text\n code\n strong\n onClick={navigate}\n style={{ cursor: 'pointer' }}\n >\n <a>{code}</a>\n </Typography.Text>\n <Typography.Text strong>{title}</Typography.Text>\n </Space>\n }\n description={Description}\n type={level === 'warn' ? 'info' : level}\n action={\n <Space>\n <TextDrawer text={'Show Source Code'} buttonProps={{ size: 'small' }}>\n <CodeViewDrawerContent data={data} cwd={cwd} />\n </TextDrawer>\n <>\n <Divider type=\"vertical\" />\n <Button\n type=\"link\"\n onClick={navigate}\n size=\"small\"\n icon={<InfoCircleOutlined />}\n />\n </>\n </Space>\n }\n />\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
1
+ {"version":3,"mappings":"AAoBI,SAkCM,UAjCJ,KADF;AApBJ,SAAS,0BAA0B;AACnC,SAAS,OAAO,QAAQ,SAAS,OAAO,kBAAkB;AAE1D,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AAGf,MAAM,wBAAsD,CAAC;AAAA,EAClE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,EAAE,MAAM,OAAO,IAAI;AACzB,QAAM,OAAO,SAAS,CAAC,EAAE,MAAM;AAE/B,SACE,qBAAC,SAAM,WAAU,YAAW,WAAU,eACpC;AAAA,wBAAC,SAAM,MAAK,eAAc;AAAA,IAC1B;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,KAAK;AAAA,QACL,KAAK,OAAO,SAAS,IAAI,IAAI,OAAO,IAAI,IAAI;AAAA,QAC5C,MAAI;AAAA,QACJ,UAAQ;AAAA;AAAA,IACV;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,QACX;AAAA,QACA,aAAa;AAAA;AAAA,IACf;AAAA,KACF;AAEJ;AAGO,MAAM,gBAA8C,CAAC,EAAE,MAAM,IAAI,MAAM;AAC5E,QAAM,EAAE,OAAO,cAAc,IAAI,OAAO,MAAM,KAAK,IAAI;AACvD,QAAM,WAAW,qBAAqB,MAAM,KAAK,IAAI;AACrD,QAAM,YAAY,KAAK,SAAS,CAAC,EAAE,MAAM;AAEzC,QAAM,cACJ,qBAAC,SAAM,WAAU,YACf;AAAA,wBAAC,WAAW,MAAX,EAAiB,uBAAY;AAAA,IAC9B,qBAAC,SACC;AAAA,0BAAC,WAAW,MAAX,EAAgB,mBAAK;AAAA,MACtB,oBAAC,WAAW,MAAX,EAAgB,QAAM,MAAC,MAAI,MACzB,eAAK,MACR;AAAA,MACC,OAAO,SAAS,SAAS,IACxB,iCACE;AAAA,4BAAC,WAAW,MAAX,EAAgB,qBAAO;AAAA,QACxB,oBAAC,WAAW,MAAX,EAAgB,QAAM,MAAC,MAAI,MACzB,qBACH;AAAA,SACF,IAEA;AAAA,OAEJ;AAAA,KACF;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAQ;AAAA,MACR,SACE,qBAAC,SACC;AAAA;AAAA,UAAC,WAAW;AAAA,UAAX;AAAA,YACC,MAAI;AAAA,YACJ,QAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO,EAAE,QAAQ,UAAU;AAAA,YAE3B,8BAAC,OAAG,gBAAK;AAAA;AAAA,QACX;AAAA,QACA,oBAAC,WAAW,MAAX,EAAgB,QAAM,MAAE,iBAAM;AAAA,SACjC;AAAA,MAEF,aAAa;AAAA,MACb,MAAM,UAAU,SAAS,SAAS;AAAA,MAClC,QACE,qBAAC,SACC;AAAA,4BAAC,cAAW,MAAM,oBAAoB,aAAa,EAAE,MAAM,QAAQ,GACjE,8BAAC,yBAAsB,MAAY,KAAU,GAC/C;AAAA,QACA,iCACE;AAAA,8BAAC,WAAQ,MAAK,YAAW;AAAA,UACzB;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,MAAK;AAAA,cACL,MAAM,oBAAC,sBAAmB;AAAA;AAAA,UAC5B;AAAA,WACF;AAAA,SACF;AAAA;AAAA,EAEJ;AAEJ","names":[],"ignoreList":[],"sources":["../../../src/components/Alert/view.tsx"],"sourcesContent":["import { InfoCircleOutlined } from '@ant-design/icons';\nimport { Alert, Button, Divider, Space, Typography } from 'antd';\nimport React from 'react';\nimport { Lodash } from '@rsdoctor/utils/common';\nimport { useRuleIndexNavigate } from '../../utils';\nimport { CodeViewer } from '../base';\nimport { CodeOpener } from '../Opener';\nimport { TextDrawer } from '../TextDrawer';\nimport { Title } from '../Title';\nimport { CodeViewAlertProps } from './types';\n\nexport const CodeViewDrawerContent: React.FC<CodeViewAlertProps> = ({\n data,\n cwd,\n}) => {\n const { file } = data;\n const { path, ranges } = file;\n const line = ranges?.[0].start.line;\n\n return (\n <Space direction=\"vertical\" className=\"alert-space\">\n <Title text=\"Code Viewer\" />\n <CodeOpener\n cwd={cwd}\n url={path}\n loc={Lodash.isNumber(line) ? String(line) : undefined}\n code\n disabled\n />\n <CodeViewer\n filePath={file.path}\n code={file.content}\n ranges={ranges}\n defaultLine={line}\n />\n </Space>\n );\n};\n\n///REVIEW - It's still useful? can't find usage\nexport const CodeViewAlert: React.FC<CodeViewAlertProps> = ({ data, cwd }) => {\n const { title, description = '', level, code, file } = data;\n const navigate = useRuleIndexNavigate(code, data.link);\n const startLine = file.ranges?.[0].start.line;\n\n const Description = (\n <Space direction=\"vertical\">\n <Typography.Text>{description}</Typography.Text>\n <Space>\n <Typography.Text>File:</Typography.Text>\n <Typography.Text strong code>\n {file.path}\n </Typography.Text>\n {Lodash.isNumber(startLine) ? (\n <>\n <Typography.Text>in line</Typography.Text>\n <Typography.Text strong code>\n {startLine}\n </Typography.Text>\n </>\n ) : (\n ''\n )}\n </Space>\n </Space>\n );\n\n return (\n <Alert\n showIcon\n message={\n <Space>\n <Typography.Text\n code\n strong\n onClick={navigate}\n style={{ cursor: 'pointer' }}\n >\n <a>{code}</a>\n </Typography.Text>\n <Typography.Text strong>{title}</Typography.Text>\n </Space>\n }\n description={Description}\n type={level === 'warn' ? 'info' : level}\n action={\n <Space>\n <TextDrawer text={'Show Source Code'} buttonProps={{ size: 'small' }}>\n <CodeViewDrawerContent data={data} cwd={cwd} />\n </TextDrawer>\n <>\n <Divider type=\"vertical\" />\n <Button\n type=\"link\"\n onClick={navigate}\n size=\"small\"\n icon={<InfoCircleOutlined />}\n />\n </>\n </Space>\n }\n />\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
@@ -20,8 +20,7 @@ import OutputIcon from "../../common/svg/loader/output.js";
20
20
  import StepIcon from "../../common/svg/loader/step.js";
21
21
  import { Size } from "../../constants";
22
22
  import { beautifyPath, formatCosts, useTheme } from "../../utils";
23
- import { CodeViewer } from "../base/CodeViewer";
24
- import { DiffViewer } from "../base/DiffViewer";
23
+ import { CodeViewer, DiffViewer } from "../base";
25
24
  import { Card } from "../Card";
26
25
  import { CodeOpener } from "../Opener";
27
26
  import { Title } from "../Title";
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["loader"],"ignoreList":[],"sources":["../../../src/components/Loader/executions.tsx"],"sourcesContent":["import { ClockCircleTwoTone } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Col,\n Divider,\n Empty,\n List,\n Row,\n Space,\n Tabs,\n Tag,\n Timeline,\n Tooltip,\n Typography,\n} from 'antd';\nimport dayjs from 'dayjs';\nimport { PropsWithChildren, useCallback, useState } from 'react';\nimport InputIcon from '../../common/svg/loader/input.js';\nimport OutputIcon from '../../common/svg/loader/output.js';\nimport StepIcon from '../../common/svg/loader/step.js';\nimport { Size } from '../../constants';\nimport { beautifyPath, formatCosts, useTheme } from '../../utils';\nimport { CodeViewer } from '../base/CodeViewer';\nimport { DiffViewer } from '../base/DiffViewer';\nimport { Card } from '../Card';\nimport { CodeOpener } from '../Opener';\nimport { Title } from '../Title';\nimport styles from './Analysis/style.module';\n\ninterface LoaderExecutionsProps {\n cwd: string;\n data: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderFileDetails>;\n index?: number;\n}\n\nconst LoaderPropsItem = ({\n loader,\n resource,\n cwd,\n}: {\n loader: SDK.LoaderTransformData & {\n costs: number;\n };\n resource: SDK.ResourceData;\n cwd: string;\n}): JSX.Element => {\n return (\n <Card\n title={'Loader Details'}\n style={{ border: 'none' }}\n extra={\n <Tag icon={<ClockCircleTwoTone />} color=\"default\">\n {dayjs(loader.startAt).format('YYYY-MM-DD HH:mm:ss')}\n </Tag>\n }\n >\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n {loader.isPitch ? <Typography.Text code>pitch</Typography.Text> : null}\n <List size=\"large\" bordered>\n <List.Item>\n <Typography.Text strong>{'File Path'}</Typography.Text>\n <div>{beautifyPath(resource.path, cwd)}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Resource Path'}</Typography.Text>\n <CodeOpener cwd={cwd} url={resource.path} loc=\"\" disabled />\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Resource Query'}</Typography.Text>\n <div>{resource.queryRaw || '-'}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Duration'}</Typography.Text>\n <div>{formatCosts(loader.costs)}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader'}</Typography.Text>\n <div>\n <Typography.Text code>{loader.loader}</Typography.Text>\n </div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader Index'}</Typography.Text>\n <div>{`${loader.loaderIndex}`}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader Path'}</Typography.Text>\n <CodeOpener cwd={cwd} url={loader.path} loc=\"\" disabled />\n </List.Item>\n <List.Item>\n <div style={{ width: 180 }}>\n <Typography.Text strong>{'Options'}</Typography.Text>\n </div>\n <Divider type=\"vertical\" />\n <Typography.Paragraph\n ellipsis={{\n rows: 2,\n expandable: true,\n symbol: 'more',\n }}\n copyable\n >\n {JSON.stringify(loader.options || '-')}\n </Typography.Paragraph>\n </List.Item>\n </List>\n </Space>\n </Card>\n );\n};\n\nexport const LoaderExecutions = ({\n data,\n cwd,\n index,\n}: PropsWithChildren<LoaderExecutionsProps>): JSX.Element => {\n const { loaders, resource } = data;\n const [currentIndex, setCurrentIndex] = useState(index || 0);\n const { theme } = useTheme();\n const isLight = theme === 'light';\n const loader = loaders[currentIndex];\n const before = loader.input || '';\n const leftSpan = 5;\n const hasError = loader.errors && loader.errors.length;\n const [activeKey, setActiveKey] = useState('loaderDetails');\n const onChange = useCallback((key: string) => {\n setActiveKey(key);\n }, []);\n\n return (\n <Row className={styles.executions} style={{ height: '100%' }}>\n <Col\n span={leftSpan}\n style={{\n borderRight: isLight ? `1px solid #f0f0f0` : undefined,\n padding: Size.BasePadding,\n }}\n >\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n <Title text=\"Executions\" />\n <Timeline mode=\"left\" style={{ marginTop: Size.BasePadding }}>\n {loaders.map((e, i, arr) => {\n const { loader, isPitch } = e;\n const costs = formatCosts(e.costs);\n return (\n <Timeline.Item\n dot={\n isPitch ? (\n <Tag style={{ marginLeft: 1, fontWeight: 500 }}>\n pitch\n </Tag>\n ) : (\n <ClockCircleTwoTone />\n )\n }\n style={{ paddingBottom: 10, textAlign: 'center' }}\n key={i}\n >\n <Row align=\"middle\" justify=\"space-between\" gutter={[0, 10]}>\n <Col span={24} className={styles.timeline}>\n <Tooltip title={loader} trigger=\"hover\">\n <div\n className={`${styles.box} ${currentIndex === i ? styles.selected : ''}`}\n onClick={() => {\n setCurrentIndex(i);\n }}\n style={{ textAlign: 'left' }}\n >\n <div>\n <Typography.Text style={{ color: '#000' }}>\n {costs.match(/[0-9]+/g)}\n </Typography.Text>{' '}\n <Typography.Text\n style={{ color: 'rgba(0,0,0,0.45)' }}\n >\n {costs.match(/[a-zA-Z]+/g)}\n </Typography.Text>\n </div>\n <Typography.Text\n style={{ color: 'rgba(0,0,0,0.65)' }}\n className={styles.loader}\n >\n {loader}\n </Typography.Text>\n </div>\n </Tooltip>\n </Col>\n </Row>\n {i === arr.length - 1 ? null : (\n <div style={{ paddingTop: 10 }}>\n <StepIcon />\n </div>\n )}\n </Timeline.Item>\n );\n })}\n </Timeline>\n </Space>\n </Col>\n <Col span={24 - leftSpan} style={{ height: '100%' }}>\n <Tabs\n type=\"card\"\n defaultActiveKey=\"loaderDetails\"\n activeKey={activeKey}\n items={[\n {\n label: 'Loader Props',\n key: 'loaderProps',\n children: (\n <LoaderPropsItem\n loader={loader}\n resource={resource}\n cwd={cwd}\n />\n ),\n },\n {\n label: 'Loader Details',\n key: 'loaderDetails',\n children: (\n <div style={{ height: '100%' }}>\n {hasError ? (\n <Col span={24} style={{ height: '53%', minHeight: 400 }}>\n <div\n style={{\n padding: Size.BasePadding,\n borderTop: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n borderBottom: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n }}\n >\n <Title\n text={`the error stack of [${loader.loader}] ${loader.isPitch ? 'pitch' : ''}`}\n />\n </div>\n <div style={{ height: '90%' }}>\n <CodeViewer\n code={loader.errors[0].message}\n lang=\"javascript\"\n />\n </div>\n </Col>\n ) : (\n <Col span={24} style={{ height: '53%', minHeight: 400 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: Size.BasePadding,\n borderBottom: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n }}\n >\n <Title\n text={\n <>\n {`the result of [${loader.loader}] ${loader.isPitch ? 'pitch' : ''}`}\n {!loader.isPitch && (\n <span style={{ fontWeight: 400 }}>\n (\n <InputIcon\n style={{\n verticalAlign: 'middle',\n margin: '0 2px',\n }}\n />\n Input ⟷\n <OutputIcon\n style={{\n verticalAlign: 'middle',\n position: 'relative',\n top: -2,\n }}\n />\n Output)\n </span>\n )}\n </>\n }\n />\n <div style={{ flex: 1 }} />\n </div>\n {loader.isPitch ? (\n loader.result ? (\n <div style={{ height: '90%' }}>\n <CodeViewer\n isEmbed\n code={loader.result}\n filePath={resource.path}\n />\n </div>\n ) : (\n <Empty\n description={\n 'No loader result. If you use the Brief Mode, there will not have loader results.'\n }\n />\n )\n ) : (\n <div style={{ minHeight: '700px' }}>\n <div style={{ height: '40rem', overflow: 'hidden' }}>\n {!loader.result && !before ? (\n <Empty\n description={\n 'No loader result. If you use the Brief Mode, there will not have loader results.'\n }\n />\n ) : (\n <DiffViewer\n isEmbed\n original={before}\n modified={loader.result || ''}\n originalFilePath={resource.path}\n modifiedFilePath={resource.path}\n />\n )}\n </div>\n </div>\n )}\n </Col>\n )}\n </div>\n ),\n },\n ]}\n onChange={onChange}\n />\n </Col>\n </Row>\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
1
+ {"version":3,"mappings":"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","names":["loader"],"ignoreList":[],"sources":["../../../src/components/Loader/executions.tsx"],"sourcesContent":["import { ClockCircleTwoTone } from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport {\n Col,\n Divider,\n Empty,\n List,\n Row,\n Space,\n Tabs,\n Tag,\n Timeline,\n Tooltip,\n Typography,\n} from 'antd';\nimport dayjs from 'dayjs';\nimport { PropsWithChildren, useCallback, useState } from 'react';\nimport InputIcon from '../../common/svg/loader/input.js';\nimport OutputIcon from '../../common/svg/loader/output.js';\nimport StepIcon from '../../common/svg/loader/step.js';\nimport { Size } from '../../constants';\nimport { beautifyPath, formatCosts, useTheme } from '../../utils';\nimport { CodeViewer, DiffViewer } from '../base';\nimport { Card } from '../Card';\nimport { CodeOpener } from '../Opener';\nimport { Title } from '../Title';\nimport styles from './Analysis/style.module';\n\ninterface LoaderExecutionsProps {\n cwd: string;\n data: SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetLoaderFileDetails>;\n index?: number;\n}\n\nconst LoaderPropsItem = ({\n loader,\n resource,\n cwd,\n}: {\n loader: SDK.LoaderTransformData & {\n costs: number;\n };\n resource: SDK.ResourceData;\n cwd: string;\n}): JSX.Element => {\n return (\n <Card\n title={'Loader Details'}\n style={{ border: 'none' }}\n extra={\n <Tag icon={<ClockCircleTwoTone />} color=\"default\">\n {dayjs(loader.startAt).format('YYYY-MM-DD HH:mm:ss')}\n </Tag>\n }\n >\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n {loader.isPitch ? <Typography.Text code>pitch</Typography.Text> : null}\n <List size=\"large\" bordered>\n <List.Item>\n <Typography.Text strong>{'File Path'}</Typography.Text>\n <div>{beautifyPath(resource.path, cwd)}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Resource Path'}</Typography.Text>\n <CodeOpener cwd={cwd} url={resource.path} loc=\"\" disabled />\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Resource Query'}</Typography.Text>\n <div>{resource.queryRaw || '-'}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Duration'}</Typography.Text>\n <div>{formatCosts(loader.costs)}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader'}</Typography.Text>\n <div>\n <Typography.Text code>{loader.loader}</Typography.Text>\n </div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader Index'}</Typography.Text>\n <div>{`${loader.loaderIndex}`}</div>\n </List.Item>\n <List.Item>\n <Typography.Text strong>{'Loader Path'}</Typography.Text>\n <CodeOpener cwd={cwd} url={loader.path} loc=\"\" disabled />\n </List.Item>\n <List.Item>\n <div style={{ width: 180 }}>\n <Typography.Text strong>{'Options'}</Typography.Text>\n </div>\n <Divider type=\"vertical\" />\n <Typography.Paragraph\n ellipsis={{\n rows: 2,\n expandable: true,\n symbol: 'more',\n }}\n copyable\n >\n {JSON.stringify(loader.options || '-')}\n </Typography.Paragraph>\n </List.Item>\n </List>\n </Space>\n </Card>\n );\n};\n\nexport const LoaderExecutions = ({\n data,\n cwd,\n index,\n}: PropsWithChildren<LoaderExecutionsProps>): JSX.Element => {\n const { loaders, resource } = data;\n const [currentIndex, setCurrentIndex] = useState(index || 0);\n const { theme } = useTheme();\n const isLight = theme === 'light';\n const loader = loaders[currentIndex];\n const before = loader.input || '';\n const leftSpan = 5;\n const hasError = loader.errors && loader.errors.length;\n const [activeKey, setActiveKey] = useState('loaderDetails');\n const onChange = useCallback((key: string) => {\n setActiveKey(key);\n }, []);\n\n return (\n <Row className={styles.executions} style={{ height: '100%' }}>\n <Col\n span={leftSpan}\n style={{\n borderRight: isLight ? `1px solid #f0f0f0` : undefined,\n padding: Size.BasePadding,\n }}\n >\n <Space direction=\"vertical\" style={{ width: '100%' }}>\n <Title text=\"Executions\" />\n <Timeline mode=\"left\" style={{ marginTop: Size.BasePadding }}>\n {loaders.map((e, i, arr) => {\n const { loader, isPitch } = e;\n const costs = formatCosts(e.costs);\n return (\n <Timeline.Item\n dot={\n isPitch ? (\n <Tag style={{ marginLeft: 1, fontWeight: 500 }}>\n pitch\n </Tag>\n ) : (\n <ClockCircleTwoTone />\n )\n }\n style={{ paddingBottom: 10, textAlign: 'center' }}\n key={i}\n >\n <Row align=\"middle\" justify=\"space-between\" gutter={[0, 10]}>\n <Col span={24} className={styles.timeline}>\n <Tooltip title={loader} trigger=\"hover\">\n <div\n className={`${styles.box} ${currentIndex === i ? styles.selected : ''}`}\n onClick={() => {\n setCurrentIndex(i);\n }}\n style={{ textAlign: 'left' }}\n >\n <div>\n <Typography.Text style={{ color: '#000' }}>\n {costs.match(/[0-9]+/g)}\n </Typography.Text>{' '}\n <Typography.Text\n style={{ color: 'rgba(0,0,0,0.45)' }}\n >\n {costs.match(/[a-zA-Z]+/g)}\n </Typography.Text>\n </div>\n <Typography.Text\n style={{ color: 'rgba(0,0,0,0.65)' }}\n className={styles.loader}\n >\n {loader}\n </Typography.Text>\n </div>\n </Tooltip>\n </Col>\n </Row>\n {i === arr.length - 1 ? null : (\n <div style={{ paddingTop: 10 }}>\n <StepIcon />\n </div>\n )}\n </Timeline.Item>\n );\n })}\n </Timeline>\n </Space>\n </Col>\n <Col span={24 - leftSpan} style={{ height: '100%' }}>\n <Tabs\n type=\"card\"\n defaultActiveKey=\"loaderDetails\"\n activeKey={activeKey}\n items={[\n {\n label: 'Loader Props',\n key: 'loaderProps',\n children: (\n <LoaderPropsItem\n loader={loader}\n resource={resource}\n cwd={cwd}\n />\n ),\n },\n {\n label: 'Loader Details',\n key: 'loaderDetails',\n children: (\n <div style={{ height: '100%' }}>\n {hasError ? (\n <Col span={24} style={{ height: '53%', minHeight: 400 }}>\n <div\n style={{\n padding: Size.BasePadding,\n borderTop: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n borderBottom: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n }}\n >\n <Title\n text={`the error stack of [${loader.loader}] ${loader.isPitch ? 'pitch' : ''}`}\n />\n </div>\n <div style={{ height: '90%' }}>\n <CodeViewer\n code={loader.errors[0].message}\n lang=\"javascript\"\n />\n </div>\n </Col>\n ) : (\n <Col span={24} style={{ height: '53%', minHeight: 400 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: Size.BasePadding,\n borderBottom: `1px solid ${isLight ? '#f0f0f0' : 'rgba(253, 253, 253, 0.12)'}`,\n }}\n >\n <Title\n text={\n <>\n {`the result of [${loader.loader}] ${loader.isPitch ? 'pitch' : ''}`}\n {!loader.isPitch && (\n <span style={{ fontWeight: 400 }}>\n (\n <InputIcon\n style={{\n verticalAlign: 'middle',\n margin: '0 2px',\n }}\n />\n Input ⟷\n <OutputIcon\n style={{\n verticalAlign: 'middle',\n position: 'relative',\n top: -2,\n }}\n />\n Output)\n </span>\n )}\n </>\n }\n />\n <div style={{ flex: 1 }} />\n </div>\n {loader.isPitch ? (\n loader.result ? (\n <div style={{ height: '90%' }}>\n <CodeViewer\n isEmbed\n code={loader.result}\n filePath={resource.path}\n />\n </div>\n ) : (\n <Empty\n description={\n 'No loader result. If you use the Brief Mode, there will not have loader results.'\n }\n />\n )\n ) : (\n <div style={{ minHeight: '700px' }}>\n <div style={{ height: '40rem', overflow: 'hidden' }}>\n {!loader.result && !before ? (\n <Empty\n description={\n 'No loader result. If you use the Brief Mode, there will not have loader results.'\n }\n />\n ) : (\n <DiffViewer\n isEmbed\n original={before}\n modified={loader.result || ''}\n originalFilePath={resource.path}\n modifiedFilePath={resource.path}\n />\n )}\n </div>\n </div>\n )}\n </Col>\n )}\n </div>\n ),\n },\n ]}\n onChange={onChange}\n />\n </Col>\n </Row>\n );\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
@@ -15,7 +15,7 @@ import { createFileStructures, formatCosts, mapFileKey } from "../../utils";
15
15
  import { FileTree } from "../FileTree";
16
16
  import { KeywordInput } from "../Form/keyword";
17
17
  import { ServerAPIProvider, withServerAPI } from "../Manifest";
18
- import { DiffViewer } from "../base/DiffViewer";
18
+ import { DiffViewer } from "../base";
19
19
  const height = 735;
20
20
  const ResolverDetailsPanel = ({ filepath, before, after, resolvers }) => {
21
21
  const [collapsed, setCollapsed] = useState(false);
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../src/components/Resolver/analysis.tsx"],"sourcesContent":["/* eslint-disable react/no-unescaped-entities */\nimport {\n CloseCircleOutlined,\n FileSearchOutlined,\n MenuFoldOutlined,\n MenuUnfoldOutlined,\n} from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport { Resolver } from '@rsdoctor/utils/common';\nimport { Button, Card, Col, Row, Space, Table, Typography } from 'antd';\nimport { get, map } from 'lodash-es';\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/DiffViewer';\n\nconst height = 735;\n\nconst ResolverDetailsPanel: React.FC<\n SDK.ServerAPI.InferResponseType<SDK.ServerAPI.API.GetResolverFileDetails>\n> = ({ filepath, before, after, resolvers }) => {\n const [collapsed, setCollapsed] = useState(false);\n\n return (\n <React.Fragment>\n <Col flex={1}>\n <Card\n title=\"Resolve Diff Viewer\"\n styles={{ body: { padding: 0, overflow: 'hidden' } }}\n >\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 </Col>\n <Col span={collapsed ? 2 : 7}>\n <Card\n title={collapsed ? '...' : 'Resolve Details'}\n extra={\n <Button\n onClick={() => setCollapsed(!collapsed)}\n size=\"small\"\n icon={collapsed ? <MenuFoldOutlined /> : <MenuUnfoldOutlined />}\n ></Button>\n }\n style={collapsed ? { width: 80 } : undefined}\n >\n {collapsed ? null : (\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>{r.result}</Typography.Text>\n );\n return <CloseCircleOutlined style={{ color: '#f50' }} />;\n },\n },\n ]}\n dataSource={resolvers}\n />\n )}\n </Card>\n </Col>\n </React.Fragment>\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 map(resolver, (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//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
1
+ {"version":3,"mappings":"AA2BI,SAMM,KANN;AA1BJ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,WAAW;AACpB,SAAS,gBAAgB;AACzB,SAAS,QAAQ,MAAM,KAAK,KAAK,OAAO,OAAO,kBAAkB;AACjE,SAAS,KAAK,WAAW;AACzB,OAAO,SAAS,SAAS,gBAAgB;AACzC,SAAS,YAAY;AACrB,SAAS,sBAAsB,aAAa,kBAAkB;AAC9D,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB,qBAAqB;AACjD,SAAS,kBAAkB;AAE3B,MAAM,SAAS;AAEf,MAAM,uBAEF,CAAC,EAAE,UAAU,QAAQ,OAAO,UAAU,MAAM;AAC9C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,SACE,qBAAC,MAAM,UAAN,EACC;AAAA,wBAAC,OAAI,MAAM,GACT;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,SAAS,EAAE;AAAA,QAEnD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,QAAQ,SAAS;AAAA,YACnB;AAAA,YACA,SAAO;AAAA,YACP,kBAAkB;AAAA,YAClB,kBAAkB;AAAA,YAClB,UAAU;AAAA,YACV,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF,GACF;AAAA,IACA,oBAAC,OAAI,MAAM,YAAY,IAAI,GACzB;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,YAAY,QAAQ;AAAA,QAC3B,OACE;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,aAAa,CAAC,SAAS;AAAA,YACtC,MAAK;AAAA,YACL,MAAM,YAAY,oBAAC,oBAAiB,IAAK,oBAAC,sBAAmB;AAAA;AAAA,QAC9D;AAAA,QAEH,OAAO,YAAY,EAAE,OAAO,GAAG,IAAI;AAAA,QAElC,sBAAY,OACX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO;AAAA,cACP;AAAA,cACA,WAAW;AAAA,cACX,WAAW;AAAA,YACb;AAAA,YACA,MAAK;AAAA,YACL,YAAY;AAAA,YACZ,UAAQ;AAAA,YACR,QAAQ,CAAC,MAAM,EAAE;AAAA,YACjB,SAAS;AAAA,cACP;AAAA,gBACE,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,QAAQ,CAAC,IAAI,MACX,oBAAC,WAAW,MAAX,EAAgB,UAAQ,MACvB,8BAAC,WAAW,MAAX,EAAgB,MAAI,MAAC,QAAM,MACzB,YAAE,SACL,GACF;AAAA,cAEJ;AAAA,cACA;AAAA,gBACE,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,QAAQ,CAAC,IAAI,MACX,oBAAC,WAAW,MAAX,EAAgB,QAAM,MACpB,sBAAY,EAAE,KAAK,GACtB;AAAA,gBAEF,QAAQ,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE;AAAA,gBAC9B,gBAAgB,CAAC,WAAW,QAAQ;AAAA,cACtC;AAAA,cACA;AAAA,gBACE,OAAO;AAAA,gBACP,QAAQ,CAAC,IAAI,MAAM;AACjB,sBAAI,SAAS,qBAAqB,CAAC;AACjC,2BACE,oBAAC,WAAW,MAAX,EAAgB,UAAQ,MAAE,YAAE,QAAO;AAExC,yBAAO,oBAAC,uBAAoB,OAAO,EAAE,OAAO,OAAO,GAAG;AAAA,gBACxD;AAAA,cACF;AAAA,YACF;AAAA,YACA,YAAY;AAAA;AAAA,QACd;AAAA;AAAA,IAEJ,GACF;AAAA,KACF;AAEJ;AAEO,MAAM,gBAIR,CAAC,UAAU;AACd,QAAM,EAAE,UAAU,IAAI,IAAI;AAE1B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAE3C,QAAM,yBAAyB;AAC/B,QAAM,IAAI;AAEV,QAAM,QAAQ,QAAQ,MAAM;AAC1B,WAAO,IAAI,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,OAAO;AAAA,EAC1D,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,cAAc,QAAQ,MAAM;AAChC,WAAO,MAAM;AAAA,MAAO,CAAC,MACnB,MAAM,WAAW,EAAE,QAAQ,MAAM,QAAQ,IAAI,KAAK;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,KAAK,CAAC;AAE1B,QAAM,iBACJ,YAAY,UAAU,YAAY,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE;AAElE,QAAM,QAAQ,QAAQ,MAAM;AAC1B,WAAO,qBAAqB;AAAA,MAC1B,OAAO,YAAY,SAAS,cAAc;AAAA,MAC1C;AAAA,MACA,UAAU,MAAM,UAAU;AACxB,eAAO,oBAAC,SAAI,SAAS,MAAM,YAAY,IAAI,GAAI,oBAAS;AAAA,MAC1D;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,SACE,qBAAC,OAAI,SAAQ,SAAQ,OAAM,OAAM,MAAM,OAAO,QAAQ,KAAK,aACzD;AAAA,wBAAC,OAAI,MAAM,GACT,8BAAC,QAAK,OAAM,SACV;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,SAAS;AAAA,QACnD,UAAU;AAAA,QACV,qBAAqB;AAAA,UACnB;AAAA,UACA,iBAAiB,IAAI;AAAA,UACrB,iBACI,SACA,CAAC,SAAS;AACR,kBAAM,eAAuB;AAAA,cAC3B;AAAA,cACA;AAAA,YACF;AACA,kBAAM,gBAAgB,aAAa,QAAQ,CAAC,IAAI;AAEhD,gBACE,YAAY,UACZ,YAAY,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,GAC1C;AACA,qBAAO;AAAA,YACT;AAEA,mBAAO,CAAC;AAAA,UACV;AAAA,QACN;AAAA;AAAA,MACK,QAAQ,MAAM,QAAQ;AAAA,IAC7B,GACF,GACF;AAAA,IACC,YACC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,IAAI,UAAU,IAAI;AAAA,QACvB,MAAM,EAAE,SAAS;AAAA,QAEhB,WAAC,cAAc,oBAAC,wBAAsB,GAAG,WAAW;AAAA;AAAA,IACvD;AAAA,KAEJ;AAEJ;AAEO,MAAM,uBAER,CAAC,EAAE,QAAQ,MAAM;AACpB,QAAM,EAAE,MAAM,IAAI,IAAI;AACtB,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAE3C,SACE,qBAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GAC1B;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,WAAW,KAAK,aAAa,cAAc,KAAK,YAAY;AAAA,QAErE;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,oBAAC,sBAAmB;AAAA,YAC1B,OAAM;AAAA,YACN,aAAY;AAAA,YACZ,UAAU,CAAC,MAAM,YAAY,CAAC;AAAA;AAAA,QAChC;AAAA;AAAA,IACF;AAAA,IACA,oBAAC,qBAAkB,KAAK,IAAI,UAAU,IAAI,qBACvC,WAAC,aACA,oBAAC,iBAAc,UAAoB,UAAoB,KAAU,GAErE;AAAA,KACF;AAEJ;AAEO,MAAM,mBAAmB,cAAc;AAAA,EAC5C,KAAK,IAAI,UAAU,IAAI;AAAA,EACvB,kBAAkB;AAAA,EAClB,WAAW;AACb,CAAC","names":[],"ignoreList":[],"sources":["../../../src/components/Resolver/analysis.tsx"],"sourcesContent":["/* eslint-disable react/no-unescaped-entities */\nimport {\n CloseCircleOutlined,\n FileSearchOutlined,\n MenuFoldOutlined,\n MenuUnfoldOutlined,\n} from '@ant-design/icons';\nimport { SDK } from '@rsdoctor/types';\nimport { Resolver } from '@rsdoctor/utils/common';\nimport { Button, Card, Col, Row, Space, Table, Typography } from 'antd';\nimport { get, map } from 'lodash-es';\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 const [collapsed, setCollapsed] = useState(false);\n\n return (\n <React.Fragment>\n <Col flex={1}>\n <Card\n title=\"Resolve Diff Viewer\"\n styles={{ body: { padding: 0, overflow: 'hidden' } }}\n >\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 </Col>\n <Col span={collapsed ? 2 : 7}>\n <Card\n title={collapsed ? '...' : 'Resolve Details'}\n extra={\n <Button\n onClick={() => setCollapsed(!collapsed)}\n size=\"small\"\n icon={collapsed ? <MenuFoldOutlined /> : <MenuUnfoldOutlined />}\n ></Button>\n }\n style={collapsed ? { width: 80 } : undefined}\n >\n {collapsed ? null : (\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>{r.result}</Typography.Text>\n );\n return <CloseCircleOutlined style={{ color: '#f50' }} />;\n },\n },\n ]}\n dataSource={resolvers}\n />\n )}\n </Card>\n </Col>\n </React.Fragment>\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 map(resolver, (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//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
@@ -1,2 +1,5 @@
1
1
  import { CodeViewerProps } from './interface';
2
2
  export declare function CodeViewer({ className, style, code, lang, filePath, defaultLine, ranges, isEmbed, headerVisible, isLightTheme, }: CodeViewerProps): import("react/jsx-runtime").JSX.Element;
3
+ export type { CodeViewerProps } from './interface';
4
+ export { useCodeDrawer } from './useCodeDrawer';
5
+ export { defineMonacoOptions } from './utils';
@@ -93,8 +93,12 @@ function CodeViewer({
93
93
  }
94
94
  );
95
95
  }
96
+ import { useCodeDrawer } from "./useCodeDrawer";
97
+ import { defineMonacoOptions as defineMonacoOptions2 } from "./utils";
96
98
  export {
97
- CodeViewer
99
+ CodeViewer,
100
+ defineMonacoOptions2 as defineMonacoOptions,
101
+ useCodeDrawer
98
102
  };
99
103
 
100
104
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"AAwEQ,SACE,KADF;AAxER,SAAS,cAA+B;AACxC,OAAO,UAAU;AACjB,SAAS,gBAAgB;AAEzB,SAAS,aAAa,WAAW,SAAS,QAAQ,gBAAgB;AAElE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,gBAAgB;AACzB,OAAO,YAAY;AAEZ,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,eAAe;AACjB,GAAoB;AAClB,QAAMA,UAAS,OAAqC;AACpD,QAAM,SAAS,OAAe;AAC9B,QAAM,WAAW;AAAA,IACf,MAAM,QAAQ,kBAAkB,QAAQ,KAAK;AAAA,IAC7C,CAAC,MAAM,QAAQ;AAAA,EACjB;AACA,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,IAAI;AACjD,QAAM,UAAU;AAAA,IACd,MAAM,oBAAoB,EAAE,UAAU,aAAa,OAAO,MAAM,CAAC;AAAA,IACjE,CAAC,UAAU;AAAA,EACb;AACA,QAAM,gBAAgB,YAAqB,CAAC,gBAAgB,cAAc;AACxE,IAAAA,QAAO,UAAU;AACjB,WAAO,UAAU;AAEjB,oBAAgB,gBAAgB,WAAW,MAAM;AACjD,QAAI,SAAS,WAAW,GAAG;AACzB,iBAAW,MAAM;AACf,uBAAe,WAAW,WAAW;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,eAAe,aAAa;AAE1C;AAAA,IACE,MAAM,MAAM;AACV,MAAAA,QAAO,SAAS,SAAS,IAAI;AAAA,IAC/B;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,OAAO,aAAa;AAAA,QACpB,WAAW,OAAO,OAAO;AAAA,QACzB;AAAA,MACF;AAAA,MACA;AAAA,MAEC;AAAA,yBAAiB,QAAQ,QAAQ,KAChC,qBAAC,SAAI,WAAW,OAAO,QAAQ,GAC7B;AAAA,8BAAC,SAAK,sBAAY,QAAQ,GAAE;AAAA,UAC5B,oBAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GAAG;AAAA,UACzB,oBAAC,SACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,OAAO,MAAM;AAAA,cACxB,OAAM;AAAA,cACN,SAAS;AAAA,cACT,UAAU,CAAC,QAAQ;AACjB,8BAAc,IAAI,OAAO,OAAO;AAAA,cAClC;AAAA,cACD;AAAA;AAAA,UAED,GACF;AAAA,WACF;AAAA,QAEF,oBAAC,SAAI,WAAW,KAAK,OAAO,SAAS,GAAG,aAAa,GACnD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,SAAS;AAAA;AAAA,QACX,GACF;AAAA;AAAA;AAAA,EACF;AAEJ","names":["editor"],"ignoreList":[],"sources":["../../../../src/components/base/CodeViewer/index.tsx"],"sourcesContent":["import { Editor, Monaco, OnMount } from '@monaco-editor/react';\nimport clsx from 'clsx';\nimport { isNumber } from 'lodash-es';\nimport { editor } from 'monaco-editor';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { CodeViewerProps } from './interface';\nimport {\n defineMonacoOptions,\n editorShowRange,\n getFileName,\n getFilePathFormat,\n} from './utils';\n\nimport { Checkbox } from 'antd';\nimport styles from './index.module';\n\nexport function CodeViewer({\n className,\n style,\n code = '',\n lang,\n filePath = '',\n defaultLine,\n ranges,\n isEmbed = false,\n headerVisible = true,\n isLightTheme = true,\n}: CodeViewerProps) {\n const editor = useRef<editor.IStandaloneCodeEditor>();\n const monaco = useRef<Monaco>();\n const language = useMemo(\n () => lang || getFilePathFormat(filePath) || 'plaintext',\n [lang, filePath],\n );\n const [isWordWrap, setIsWordWrap] = useState(true);\n const options = useMemo(\n () => defineMonacoOptions({ wordWrap: isWordWrap ? 'on' : 'off' }),\n [isWordWrap],\n );\n const onEditorMount = useCallback<OnMount>((editorInstance, monacoVal) => {\n editor.current = editorInstance;\n monaco.current = monacoVal;\n\n editorShowRange(editorInstance, monacoVal, ranges);\n if (isNumber(defaultLine)) {\n setTimeout(() => {\n editorInstance.revealLine(defaultLine);\n });\n }\n }, []);\n\n const theme = isLightTheme ? 'vs-light' : 'vs-dark';\n\n useEffect(\n () => () => {\n editor.current?.setModel(null);\n },\n [],\n );\n\n return (\n <div\n className={clsx(\n 'monaco-component',\n 'code-viewer',\n styles['code-viewer'],\n isEmbed && styles['embed'],\n className,\n )}\n style={style}\n >\n {headerVisible && Boolean(filePath) && (\n <div className={styles['header']}>\n <div>{getFileName(filePath)}</div>\n <div style={{ flex: 1 }} />\n <div>\n <Checkbox\n className={styles['text']}\n title=\"side-by-side\"\n checked={isWordWrap}\n onChange={(evt) => {\n setIsWordWrap(evt.target.checked);\n }}\n >\n word-wrap\n </Checkbox>\n </div>\n </div>\n )}\n <div className={clsx(styles['content'], 'editor-wrap')}>\n <Editor\n theme={theme}\n language={language}\n value={code}\n options={options}\n onMount={onEditorMount}\n />\n </div>\n </div>\n );\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
1
+ {"version":3,"mappings":"AAwEQ,SACE,KADF;AAxER,SAAS,cAA+B;AACxC,OAAO,UAAU;AACjB,SAAS,gBAAgB;AAEzB,SAAS,aAAa,WAAW,SAAS,QAAQ,gBAAgB;AAElE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,gBAAgB;AACzB,OAAO,YAAY;AAEZ,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,eAAe;AACjB,GAAoB;AAClB,QAAMA,UAAS,OAAqC;AACpD,QAAM,SAAS,OAAe;AAC9B,QAAM,WAAW;AAAA,IACf,MAAM,QAAQ,kBAAkB,QAAQ,KAAK;AAAA,IAC7C,CAAC,MAAM,QAAQ;AAAA,EACjB;AACA,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,IAAI;AACjD,QAAM,UAAU;AAAA,IACd,MAAM,oBAAoB,EAAE,UAAU,aAAa,OAAO,MAAM,CAAC;AAAA,IACjE,CAAC,UAAU;AAAA,EACb;AACA,QAAM,gBAAgB,YAAqB,CAAC,gBAAgB,cAAc;AACxE,IAAAA,QAAO,UAAU;AACjB,WAAO,UAAU;AAEjB,oBAAgB,gBAAgB,WAAW,MAAM;AACjD,QAAI,SAAS,WAAW,GAAG;AACzB,iBAAW,MAAM;AACf,uBAAe,WAAW,WAAW;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,eAAe,aAAa;AAE1C;AAAA,IACE,MAAM,MAAM;AACV,MAAAA,QAAO,SAAS,SAAS,IAAI;AAAA,IAC/B;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,OAAO,aAAa;AAAA,QACpB,WAAW,OAAO,OAAO;AAAA,QACzB;AAAA,MACF;AAAA,MACA;AAAA,MAEC;AAAA,yBAAiB,QAAQ,QAAQ,KAChC,qBAAC,SAAI,WAAW,OAAO,QAAQ,GAC7B;AAAA,8BAAC,SAAK,sBAAY,QAAQ,GAAE;AAAA,UAC5B,oBAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GAAG;AAAA,UACzB,oBAAC,SACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,OAAO,MAAM;AAAA,cACxB,OAAM;AAAA,cACN,SAAS;AAAA,cACT,UAAU,CAAC,QAAQ;AACjB,8BAAc,IAAI,OAAO,OAAO;AAAA,cAClC;AAAA,cACD;AAAA;AAAA,UAED,GACF;AAAA,WACF;AAAA,QAEF,oBAAC,SAAI,WAAW,KAAK,OAAO,SAAS,GAAG,aAAa,GACnD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,SAAS;AAAA;AAAA,QACX,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAGA,SAAS,qBAAqB;AAC9B,SAAS,uBAAAC,4BAA2B","names":["editor","defineMonacoOptions"],"ignoreList":[],"sources":["../../../../src/components/base/CodeViewer/index.tsx"],"sourcesContent":["import { Editor, Monaco, OnMount } from '@monaco-editor/react';\nimport clsx from 'clsx';\nimport { isNumber } from 'lodash-es';\nimport { editor } from 'monaco-editor';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { CodeViewerProps } from './interface';\nimport {\n defineMonacoOptions,\n editorShowRange,\n getFileName,\n getFilePathFormat,\n} from './utils';\n\nimport { Checkbox } from 'antd';\nimport styles from './index.module';\n\nexport function CodeViewer({\n className,\n style,\n code = '',\n lang,\n filePath = '',\n defaultLine,\n ranges,\n isEmbed = false,\n headerVisible = true,\n isLightTheme = true,\n}: CodeViewerProps) {\n const editor = useRef<editor.IStandaloneCodeEditor>();\n const monaco = useRef<Monaco>();\n const language = useMemo(\n () => lang || getFilePathFormat(filePath) || 'plaintext',\n [lang, filePath],\n );\n const [isWordWrap, setIsWordWrap] = useState(true);\n const options = useMemo(\n () => defineMonacoOptions({ wordWrap: isWordWrap ? 'on' : 'off' }),\n [isWordWrap],\n );\n const onEditorMount = useCallback<OnMount>((editorInstance, monacoVal) => {\n editor.current = editorInstance;\n monaco.current = monacoVal;\n\n editorShowRange(editorInstance, monacoVal, ranges);\n if (isNumber(defaultLine)) {\n setTimeout(() => {\n editorInstance.revealLine(defaultLine);\n });\n }\n }, []);\n\n const theme = isLightTheme ? 'vs-light' : 'vs-dark';\n\n useEffect(\n () => () => {\n editor.current?.setModel(null);\n },\n [],\n );\n\n return (\n <div\n className={clsx(\n 'monaco-component',\n 'code-viewer',\n styles['code-viewer'],\n isEmbed && styles['embed'],\n className,\n )}\n style={style}\n >\n {headerVisible && Boolean(filePath) && (\n <div className={styles['header']}>\n <div>{getFileName(filePath)}</div>\n <div style={{ flex: 1 }} />\n <div>\n <Checkbox\n className={styles['text']}\n title=\"side-by-side\"\n checked={isWordWrap}\n onChange={(evt) => {\n setIsWordWrap(evt.target.checked);\n }}\n >\n word-wrap\n </Checkbox>\n </div>\n </div>\n )}\n <div className={clsx(styles['content'], 'editor-wrap')}>\n <Editor\n theme={theme}\n language={language}\n value={code}\n options={options}\n onMount={onEditorMount}\n />\n </div>\n </div>\n );\n}\n\nexport type { CodeViewerProps } from './interface';\nexport { useCodeDrawer } from './useCodeDrawer';\nexport { defineMonacoOptions } from './utils';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
@@ -1,5 +1,6 @@
1
1
  import { Monaco } from '@monaco-editor/react';
2
2
  import { SDK } from '@rsdoctor/types';
3
+ import type { Range as RangeClass } from 'monaco-editor';
3
4
  import { editor } from 'monaco-editor';
4
5
  export declare function getFilePathFormat(filePath: string): string;
5
6
  /**
@@ -13,4 +14,5 @@ export declare const DefaultEditorConfig: editor.IStandaloneEditorConstructionOp
13
14
  */
14
15
  export declare function defineMonacoOptions(options?: editor.IStandaloneEditorConstructionOptions): editor.IStandaloneEditorConstructionOptions;
15
16
  export declare function getFileName(filePath: string): string;
17
+ export declare function getSelectionRange(source: SDK.SourceRange, Range: typeof RangeClass): RangeClass;
16
18
  export declare function editorShowRange(editor: editor.IStandaloneCodeEditor, monaco: Monaco, ranges?: SDK.SourceRange[]): void;
@@ -1,5 +1,4 @@
1
1
  import { extname } from "path";
2
- import { getSelectionRange } from "../../../utils/monaco";
3
2
  function getDataProtocolFormat(content) {
4
3
  if (!content) {
5
4
  return "";
@@ -150,6 +149,16 @@ function getFileName(filePath) {
150
149
  }
151
150
  return filePath.split("/").at(-1) || "";
152
151
  }
152
+ function getSelectionRange(source, Range) {
153
+ const { start, end } = source;
154
+ const { line = 1, column = 0 } = start;
155
+ return new Range(
156
+ line,
157
+ column + 1,
158
+ end?.line ?? line,
159
+ (end?.column ?? 9999) + 1
160
+ );
161
+ }
153
162
  function editorShowRange(editor2, monaco, ranges) {
154
163
  if (!ranges || ranges.length === 0)
155
164
  return;
@@ -169,7 +178,8 @@ export {
169
178
  defineMonacoOptions,
170
179
  editorShowRange,
171
180
  getFileName,
172
- getFilePathFormat
181
+ getFilePathFormat,
182
+ getSelectionRange
173
183
  };
174
184
 
175
185
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["editor"],"ignoreList":[],"sources":["../../../../src/components/base/CodeViewer/utils.ts"],"sourcesContent":["import { Monaco } from '@monaco-editor/react';\nimport { SDK } from '@rsdoctor/types';\nimport { editor } from 'monaco-editor';\nimport { extname } from 'path';\nimport { getSelectionRange } from '../../../utils/monaco';\n\n/**\n * 判断 data 协议文件格式 `data:[<mediatype>][;base64],<data>`\n * 完整协议: https://www.rfc-editor.org/rfc/rfc2397.html\n * @param {string} content 文件内容\n * @returns {string} 文件格式类型\n */\nfunction getDataProtocolFormat(content: string): string {\n // 如果内容为空返回空\n if (!content) {\n return '';\n }\n\n try {\n const prefix = 'data:';\n // 检查是否以 data: 开头\n if (!content.startsWith(prefix)) {\n return '';\n }\n\n const { mimeType } = parseDataUrl(content);\n\n // 根据 MIME 类型返回对应的格式\n switch (mimeType) {\n case 'text/javascript':\n return 'javascript';\n case 'text/html':\n return 'html';\n case 'text/css':\n return 'css';\n case 'text/plain':\n return 'text';\n case 'application/json':\n return 'json';\n // 可以根据需要添加更多类型\n default:\n return '';\n }\n } catch (error) {\n console.error('解析 data 协议文件格式失败:', error);\n return '';\n }\n}\n\n/**\n * 解析 Data URL 并提取 MIME 类型\n * @param {string} dataUrl - 要解析的 Data URL 字符串\n * @returns {Object} 包含解析结果的对象\n */\nfunction parseDataUrl(dataUrl: string) {\n // 检查是否是 Data URL\n if (!dataUrl.startsWith('data:')) {\n throw new Error('输入不是有效的 Data URL');\n }\n\n // 提取内容部分 (去掉 \"data:\" 前缀)\n const content = dataUrl.substring(5);\n\n // 查找分隔数据和元数据的逗号\n const commaIndex = content.indexOf(',');\n\n if (commaIndex === -1) {\n throw new Error('无效的 Data URL 格式: 缺少数据分隔符');\n }\n\n // 提取元数据部分\n const metadataPart = content.substring(0, commaIndex);\n\n // 提取数据部分\n const dataPart = content.substring(commaIndex + 1);\n\n // 解析元数据\n let mimeType = '';\n let charset = '';\n let isBase64 = false;\n\n // 分割元数据部分\n const metadataSegments = metadataPart.split(';');\n\n // 第一部分通常是 MIME 类型\n if (metadataSegments.length > 0) {\n mimeType = metadataSegments[0] || 'text/plain'; // 默认为 text/plain\n }\n\n // 检查其他元数据参数\n for (let i = 1; i < metadataSegments.length; i++) {\n const segment = metadataSegments[i];\n\n if (segment === 'base64') {\n isBase64 = true;\n } else if (segment.startsWith('charset=')) {\n charset = segment.substring(8);\n }\n }\n\n // 返回解析结果\n return {\n mimeType,\n charset,\n isBase64,\n data: dataPart,\n };\n}\n\nexport function getFilePathFormat(filePath: string): string {\n if (!filePath) return '';\n\n const i = getDataProtocolFormat(filePath);\n\n if (i) {\n return i;\n }\n\n try {\n const ext = extname(filePath).slice(1);\n switch (ext) {\n case 'js':\n case 'cjs':\n case 'mjs':\n case 'jsx':\n return 'javascript';\n case 'ts':\n case 'tsx':\n return 'typescript';\n case 'md':\n return 'markdown';\n default:\n return ext;\n }\n } catch (e) {\n return '';\n }\n}\n\n/**\n * 默认编辑器样式, 适合预览代码\n */\nexport const DefaultEditorConfig: editor.IStandaloneEditorConstructionOptions =\n {\n // 设置编辑器为只读模式\n readOnly: true,\n // 设置 DOM 元素为只读模式\n domReadOnly: true,\n // 设置字体大小为 14px\n fontSize: 14,\n // 设置制表符宽度为 2 个空格\n tabSize: 2,\n // 设置行高为 24px\n lineHeight: 24,\n // 关闭验证装饰器的渲染(如错误、警告标记等)\n renderValidationDecorations: 'off',\n // 在概览标尺中隐藏光标\n hideCursorInOverviewRuler: true,\n // 启用平滑滚动\n smoothScrolling: true,\n // 设置文本换行方式\n wordWrap: 'on',\n // 启用颜色装饰器(如显示颜色预览)\n colorDecorators: true,\n // 禁用代码镜头功能(如显示引用次数等)\n codeLens: false,\n // 设置光标宽度为 0(隐藏光标)\n cursorWidth: 0,\n // 禁用右侧的小地图预览\n minimap: {\n enabled: false,\n },\n\n /** 禁用编辑器内置的右键菜单 */\n contextmenu: false,\n /** 禁用定义跳转功能 */\n gotoLocation: {\n multiple: 'goto',\n multipleDefinitions: 'goto',\n multipleTypeDefinitions: 'goto',\n multipleDeclarations: 'goto',\n multipleImplementations: 'goto',\n multipleReferences: 'goto',\n },\n /** 禁用悬停提示功能 */\n hover: { enabled: false },\n // 禁用链接功能 - 会禁用 Command/Ctrl + 点击\n links: false,\n };\n\n/**\n * get monaco options, it'll combine default config\n * @param options\n * @returns target options\n */\nexport function defineMonacoOptions(\n options?: editor.IStandaloneEditorConstructionOptions,\n): editor.IStandaloneEditorConstructionOptions {\n return {\n ...structuredClone(DefaultEditorConfig),\n ...options,\n };\n}\n\nexport function getFileName(filePath: string): string {\n // 如果内容为空返回空\n if (!filePath) {\n return '';\n }\n\n const prefix = 'data:';\n // 检查是否以 data: 开头\n if (filePath.startsWith(prefix)) {\n return 'data';\n }\n\n return filePath.split('/').at(-1) || '';\n}\n\nexport function editorShowRange(\n editor: editor.IStandaloneCodeEditor,\n monaco: Monaco,\n ranges?: SDK.SourceRange[],\n) {\n if (!ranges || ranges.length === 0) return;\n\n const decorations = ranges.map((range) => ({\n range: getSelectionRange(range, monaco.Range),\n options: {\n inlineClassName: 'file-inline-decoration',\n },\n }));\n editor.deltaDecorations([], decorations);\n\n setTimeout(() => {\n editor.revealLine(decorations[0].range.startLineNumber);\n });\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
1
+ {"version":3,"mappings":"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","names":["editor"],"ignoreList":[],"sources":["../../../../src/components/base/CodeViewer/utils.ts"],"sourcesContent":["import { Monaco } from '@monaco-editor/react';\nimport { SDK } from '@rsdoctor/types';\nimport type { Range as RangeClass } from 'monaco-editor';\nimport { editor } from 'monaco-editor';\nimport { extname } from 'path';\n\n/**\n * 判断 data 协议文件格式 `data:[<mediatype>][;base64],<data>`\n * 完整协议: https://www.rfc-editor.org/rfc/rfc2397.html\n * @param {string} content 文件内容\n * @returns {string} 文件格式类型\n */\nfunction getDataProtocolFormat(content: string): string {\n // 如果内容为空返回空\n if (!content) {\n return '';\n }\n\n try {\n const prefix = 'data:';\n // 检查是否以 data: 开头\n if (!content.startsWith(prefix)) {\n return '';\n }\n\n const { mimeType } = parseDataUrl(content);\n\n // 根据 MIME 类型返回对应的格式\n switch (mimeType) {\n case 'text/javascript':\n return 'javascript';\n case 'text/html':\n return 'html';\n case 'text/css':\n return 'css';\n case 'text/plain':\n return 'text';\n case 'application/json':\n return 'json';\n // 可以根据需要添加更多类型\n default:\n return '';\n }\n } catch (error) {\n console.error('解析 data 协议文件格式失败:', error);\n return '';\n }\n}\n\n/**\n * 解析 Data URL 并提取 MIME 类型\n * @param {string} dataUrl - 要解析的 Data URL 字符串\n * @returns {Object} 包含解析结果的对象\n */\nfunction parseDataUrl(dataUrl: string) {\n // 检查是否是 Data URL\n if (!dataUrl.startsWith('data:')) {\n throw new Error('输入不是有效的 Data URL');\n }\n\n // 提取内容部分 (去掉 \"data:\" 前缀)\n const content = dataUrl.substring(5);\n\n // 查找分隔数据和元数据的逗号\n const commaIndex = content.indexOf(',');\n\n if (commaIndex === -1) {\n throw new Error('无效的 Data URL 格式: 缺少数据分隔符');\n }\n\n // 提取元数据部分\n const metadataPart = content.substring(0, commaIndex);\n\n // 提取数据部分\n const dataPart = content.substring(commaIndex + 1);\n\n // 解析元数据\n let mimeType = '';\n let charset = '';\n let isBase64 = false;\n\n // 分割元数据部分\n const metadataSegments = metadataPart.split(';');\n\n // 第一部分通常是 MIME 类型\n if (metadataSegments.length > 0) {\n mimeType = metadataSegments[0] || 'text/plain'; // 默认为 text/plain\n }\n\n // 检查其他元数据参数\n for (let i = 1; i < metadataSegments.length; i++) {\n const segment = metadataSegments[i];\n\n if (segment === 'base64') {\n isBase64 = true;\n } else if (segment.startsWith('charset=')) {\n charset = segment.substring(8);\n }\n }\n\n // 返回解析结果\n return {\n mimeType,\n charset,\n isBase64,\n data: dataPart,\n };\n}\n\nexport function getFilePathFormat(filePath: string): string {\n if (!filePath) return '';\n\n const i = getDataProtocolFormat(filePath);\n\n if (i) {\n return i;\n }\n\n try {\n const ext = extname(filePath).slice(1);\n switch (ext) {\n case 'js':\n case 'cjs':\n case 'mjs':\n case 'jsx':\n return 'javascript';\n case 'ts':\n case 'tsx':\n return 'typescript';\n case 'md':\n return 'markdown';\n default:\n return ext;\n }\n } catch (e) {\n return '';\n }\n}\n\n/**\n * 默认编辑器样式, 适合预览代码\n */\nexport const DefaultEditorConfig: editor.IStandaloneEditorConstructionOptions =\n {\n // 设置编辑器为只读模式\n readOnly: true,\n // 设置 DOM 元素为只读模式\n domReadOnly: true,\n // 设置字体大小为 14px\n fontSize: 14,\n // 设置制表符宽度为 2 个空格\n tabSize: 2,\n // 设置行高为 24px\n lineHeight: 24,\n // 关闭验证装饰器的渲染(如错误、警告标记等)\n renderValidationDecorations: 'off',\n // 在概览标尺中隐藏光标\n hideCursorInOverviewRuler: true,\n // 启用平滑滚动\n smoothScrolling: true,\n // 设置文本换行方式\n wordWrap: 'on',\n // 启用颜色装饰器(如显示颜色预览)\n colorDecorators: true,\n // 禁用代码镜头功能(如显示引用次数等)\n codeLens: false,\n // 设置光标宽度为 0(隐藏光标)\n cursorWidth: 0,\n // 禁用右侧的小地图预览\n minimap: {\n enabled: false,\n },\n\n /** 禁用编辑器内置的右键菜单 */\n contextmenu: false,\n /** 禁用定义跳转功能 */\n gotoLocation: {\n multiple: 'goto',\n multipleDefinitions: 'goto',\n multipleTypeDefinitions: 'goto',\n multipleDeclarations: 'goto',\n multipleImplementations: 'goto',\n multipleReferences: 'goto',\n },\n /** 禁用悬停提示功能 */\n hover: { enabled: false },\n // 禁用链接功能 - 会禁用 Command/Ctrl + 点击\n links: false,\n };\n\n/**\n * get monaco options, it'll combine default config\n * @param options\n * @returns target options\n */\nexport function defineMonacoOptions(\n options?: editor.IStandaloneEditorConstructionOptions,\n): editor.IStandaloneEditorConstructionOptions {\n return {\n ...structuredClone(DefaultEditorConfig),\n ...options,\n };\n}\n\nexport function getFileName(filePath: string): string {\n // 如果内容为空返回空\n if (!filePath) {\n return '';\n }\n\n const prefix = 'data:';\n // 检查是否以 data: 开头\n if (filePath.startsWith(prefix)) {\n return 'data';\n }\n\n return filePath.split('/').at(-1) || '';\n}\n\nexport function getSelectionRange(\n source: SDK.SourceRange,\n Range: typeof RangeClass,\n) {\n const { start, end } = source;\n const { line = 1, column = 0 } = start;\n return new Range(\n line,\n column + 1,\n end?.line ?? line,\n (end?.column ?? 9999) + 1,\n );\n}\n\nexport function editorShowRange(\n editor: editor.IStandaloneCodeEditor,\n monaco: Monaco,\n ranges?: SDK.SourceRange[],\n) {\n if (!ranges || ranges.length === 0) return;\n\n const decorations = ranges.map((range) => ({\n range: getSelectionRange(range, monaco.Range),\n options: {\n inlineClassName: 'file-inline-decoration',\n },\n }));\n editor.deltaDecorations([], decorations);\n\n setTimeout(() => {\n editor.revealLine(decorations[0].range.startLineNumber);\n });\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6W119"]}
@@ -1,2 +1,5 @@
1
1
  import { DiffViewerProps } from './interface';
2
2
  export declare function DiffViewer({ className, style, original, modified, originalFilePath, modifiedFilePath, originalLang, modifiedLang, isEmbed, isLightTheme, headerVisible, }: DiffViewerProps): import("react/jsx-runtime").JSX.Element;
3
+ export type { DiffViewerProps } from './interface';
4
+ export { useDiffDrawer } from './useDiffDrawer';
5
+ export { defineMonacoDiffOptions } from './utils';
@@ -2,7 +2,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { DiffEditor } from "@monaco-editor/react";
3
3
  import { Checkbox } from "antd";
4
4
  import clsx from "clsx";
5
- import { useCallback, useMemo, useRef, useState } from "react";
5
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
6
6
  import { getFileName, getFilePathFormat } from "../CodeViewer/utils";
7
7
  import styles from "./index.module";
8
8
  import { defineMonacoDiffOptions } from "./utils";
@@ -37,6 +37,12 @@ function DiffViewer({
37
37
  editor.current = editorInstance;
38
38
  }, []);
39
39
  const theme = isLightTheme ? "vs-light" : "vs-dark";
40
+ useEffect(
41
+ () => () => {
42
+ editor.current?.setModel(null);
43
+ },
44
+ []
45
+ );
40
46
  return /* @__PURE__ */ jsxs(
41
47
  "div",
42
48
  {
@@ -82,8 +88,12 @@ function DiffViewer({
82
88
  }
83
89
  );
84
90
  }
91
+ import { useDiffDrawer } from "./useDiffDrawer";
92
+ import { defineMonacoDiffOptions as defineMonacoDiffOptions2 } from "./utils";
85
93
  export {
86
- DiffViewer
94
+ DiffViewer,
95
+ defineMonacoDiffOptions2 as defineMonacoDiffOptions,
96
+ useDiffDrawer
87
97
  };
88
98
 
89
99
  //# sourceMappingURL=index.js.map