react-terminal-viewer-cicd 3.0.0-beta.27 → 3.0.0-beta.29

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.
@@ -1,7 +1,7 @@
1
1
  function LogWorker() {
2
2
  var workerPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '/worker';
3
3
  var worker = null;
4
- var version = "3.0.0-beta.27" || '0.0.0';
4
+ var version = "3.0.0-beta.29" || '0.0.0';
5
5
  var path = workerPath.includes('http') ? "".concat(workerPath, "/log.worker.js") : "".concat(window.location.origin).concat(workerPath, "/log.worker.js");
6
6
  var blob = new Blob(["importScripts(\"".concat(path, "?v=").concat(version, "\")")], {
7
7
  type: 'application/javascript'
@@ -199,5 +199,5 @@ export interface TerminalViewerProps {
199
199
  */
200
200
  disableStickyHeader?: boolean;
201
201
  }
202
- declare const TerminalViewer: React.ForwardRefExoticComponent<Omit<TerminalViewerProps, "ref"> & React.RefAttributes<TerminalRef<Terminal | VirtualDomTerminal> | undefined>>;
202
+ declare const TerminalViewer: React.ForwardRefExoticComponent<Omit<TerminalViewerProps, "ref"> & React.RefAttributes<TerminalRef<VirtualDomTerminal | Terminal> | undefined>>;
203
203
  export default TerminalViewer;
@@ -83,5 +83,5 @@ export interface TerminalViewerBodyProps {
83
83
  */
84
84
  onLoading?: (loading: boolean) => void;
85
85
  }
86
- declare const TerminalViewerBody: React.ForwardRefExoticComponent<TerminalViewerBodyProps & React.RefAttributes<TerminalRef<Terminal | import("../types").VirtualDomTerminal> | undefined>>;
86
+ declare const TerminalViewerBody: React.ForwardRefExoticComponent<TerminalViewerBodyProps & React.RefAttributes<TerminalRef<import("../types").VirtualDomTerminal | Terminal> | undefined>>;
87
87
  export default TerminalViewerBody;
@@ -98,5 +98,5 @@ export interface TerminalViewerHeaderProps<T extends Terminal | VirtualDomTermin
98
98
  */
99
99
  collapseAction?: (terminal: T, allCollapsed: boolean) => React.ReactNode;
100
100
  }
101
- declare const TerminalViewerHeader: <T extends Terminal | VirtualDomTerminal = Terminal | VirtualDomTerminal>({ placeholder, defaultValue, clearable, refreshable, loading, activeTitleIndex, titles, searchResult, inputAddonBefore, inputAddonAfter, icons, onTitleChange, onSearchPrev, onSearchNext, onSearchChange, onSearchClear, onRefresh, terminalRef, allCollapsed, collapseAction, }: TerminalViewerHeaderProps<T>) => React.JSX.Element;
101
+ declare const TerminalViewerHeader: <T extends VirtualDomTerminal | Terminal = VirtualDomTerminal | Terminal>({ placeholder, defaultValue, clearable, refreshable, loading, activeTitleIndex, titles, searchResult, inputAddonBefore, inputAddonAfter, icons, onTitleChange, onSearchPrev, onSearchNext, onSearchChange, onSearchClear, onRefresh, terminalRef, allCollapsed, collapseAction, }: TerminalViewerHeaderProps<T>) => React.JSX.Element;
102
102
  export default TerminalViewerHeader;
@@ -20,16 +20,19 @@ var ChevronRight = function ChevronRight(_ref) {
20
20
  width: size,
21
21
  height: size,
22
22
  viewBox: "0 0 16 16",
23
+ overflow: "visible",
23
24
  style: _objectSpread({
24
25
  transform: "rotate(".concat(collapsed ? 0 : 90, "deg)"),
25
26
  transition: 'transform 0.3s',
26
27
  display: 'inline-block'
27
28
  }, style)
28
- }, /*#__PURE__*/React.createElement("g", {
29
- fill: "none"
30
29
  }, /*#__PURE__*/React.createElement("path", {
31
- d: "M6.4603 12.4595L5.54106 11.5402L9.08144 7.99985L5.54106 4.45947L6.4603 3.54023L10.9199 7.99985L6.4603 12.4595Z",
32
- fill: "currentColor"
33
- })));
30
+ d: "M 5.5 2.5 L 10.5 8 L 5.5 13.5",
31
+ fill: "none",
32
+ stroke: "currentColor",
33
+ strokeWidth: 1.25,
34
+ strokeLinecap: "round",
35
+ strokeLinejoin: "round"
36
+ }));
34
37
  };
35
38
  export default ChevronRight;
@@ -84,5 +84,5 @@ export interface TerminalViewerVirtualDomProps {
84
84
  * 最后一个分组折叠时,在折叠之前,添加底部空间
85
85
  * 最后一个分组展开时,在展开之前,删除底部空间
86
86
  */
87
- declare const ReactVirtuoso: React.ForwardRefExoticComponent<TerminalViewerVirtualDomProps & React.RefAttributes<TerminalRef<import("src").Terminal | VirtualDomTerminal> | undefined>>;
87
+ declare const ReactVirtuoso: React.ForwardRefExoticComponent<TerminalViewerVirtualDomProps & React.RefAttributes<TerminalRef<VirtualDomTerminal | import("src").Terminal> | undefined>>;
88
88
  export default ReactVirtuoso;
@@ -28,17 +28,35 @@ var getRowClassNames = function getRowClassNames(type) {
28
28
  }
29
29
  return 'terminal-viewer-virtuoso-list-row';
30
30
  };
31
-
31
+ var LoadingDots = function LoadingDots() {
32
+ return /*#__PURE__*/React.createElement("span", {
33
+ className: "terminal-viewer-loading-dots",
34
+ "aria-hidden": true
35
+ }, /*#__PURE__*/React.createElement("span", {
36
+ className: "terminal-viewer-loading-dot"
37
+ }, "."), /*#__PURE__*/React.createElement("span", {
38
+ className: "terminal-viewer-loading-dot"
39
+ }, "."), /*#__PURE__*/React.createElement("span", {
40
+ className: "terminal-viewer-loading-dot"
41
+ }, "."));
42
+ };
32
43
  // 在组件中添加自定义的 Footer 组件
33
44
  var VirtuosoComponents = {
34
45
  Footer: function Footer() {
35
46
  return /*#__PURE__*/React.createElement("div", {
36
47
  style: {
37
- height: '50vh',
38
- minHeight: '600px'
48
+ height: '25vh',
49
+ minHeight: '300px'
39
50
  }
40
51
  });
41
52
  },
53
+ FooterWithLoading: function FooterWithLoading() {
54
+ return /*#__PURE__*/React.createElement("div", {
55
+ className: "terminal-viewer-virtuoso-list-footer"
56
+ }, /*#__PURE__*/React.createElement("div", {
57
+ className: "terminal-viewer-virtuoso-list-footer-loading"
58
+ }, /*#__PURE__*/React.createElement(LoadingDots, null)));
59
+ },
42
60
  EmptyFooter: function EmptyFooter() {
43
61
  return /*#__PURE__*/React.createElement("div", {
44
62
  style: {
@@ -232,12 +250,16 @@ var ReactVirtuoso = /*#__PURE__*/forwardRef(function (_ref, ref) {
232
250
  });
233
251
  }, 0);
234
252
  }, [parserRef, stageStatsRef, toggleStage]);
253
+ var isLastStageRunningRef = useRef(true);
235
254
  var groupContent = useCallback(function (groupIndex) {
236
- var _parserRef$current2, _extraOptionsRef$curr3, _extraOptionsRef$curr4, _extraOptionsRef$curr5;
255
+ var _parserRef$current2, _parserRef$current3, _extraOptionsRef$curr3, _extraOptionsRef$curr4, _extraOptionsRef$curr5;
237
256
  var stage = (_parserRef$current2 = parserRef.current) === null || _parserRef$current2 === void 0 ? void 0 : _parserRef$current2.stages[groupIndex];
238
257
  var collapsed = stageStatsRef.current[groupIndex].collapse;
239
258
  var status = (stage === null || stage === void 0 ? void 0 : stage.endStatus) || (stage === null || stage === void 0 ? void 0 : stage.status) || '';
240
-
259
+ // 记录最后一个阶段是否为 running 状态
260
+ if (groupIndex === Number((_parserRef$current3 = parserRef.current) === null || _parserRef$current3 === void 0 ? void 0 : _parserRef$current3.stages.length) - 1) {
261
+ isLastStageRunningRef.current = status === 'running';
262
+ }
241
263
  // 返回一个高度为 0.1px 的隐藏元素,没有高度会报错
242
264
  if (!(stage !== null && stage !== void 0 && stage.name)) {
243
265
  return /*#__PURE__*/React.createElement("div", {
@@ -417,6 +439,19 @@ var ReactVirtuoso = /*#__PURE__*/forwardRef(function (_ref, ref) {
417
439
  onAddonReady(undefined, searcherRef.current);
418
440
  }
419
441
  }, [searcherRef, onAddonReady]);
442
+ var footerComponent = VirtuosoComponents.EmptyFooter;
443
+ // if (isAllCollapsed) {
444
+ // footerComponent = VirtuosoComponents.EmptyFooter;
445
+ // }
446
+ // if (!isAllCollapsed && lastCollapseRef.current) {
447
+ // footerComponent = VirtuosoComponents.Footer;
448
+ // }
449
+ // if (!isAllCollapsed && !lastCollapseRef.current && isLastStageRunningRef.current) {
450
+ // footerComponent = VirtuosoComponents.FooterWithLoading;
451
+ // }
452
+ if (isLastStageRunningRef.current) {
453
+ footerComponent = VirtuosoComponents.FooterWithLoading;
454
+ }
420
455
  return /*#__PURE__*/React.createElement("div", {
421
456
  className: ['terminal-viewer-body', className].filter(Boolean).join(' '),
422
457
  ref: domRef
@@ -438,7 +473,7 @@ var ReactVirtuoso = /*#__PURE__*/forwardRef(function (_ref, ref) {
438
473
  // 当最后一个分组折叠时,添加底部空间,避免没有滚动距离,导致抖动
439
474
  // 展开时,不要底部空间,避免滚动问题
440
475
  // 当全部折叠时,渲染 EmptyFooter
441
- Footer: !isAllCollapsed && lastCollapseRef.current ? VirtuosoComponents.Footer : VirtuosoComponents.EmptyFooter
476
+ Footer: footerComponent
442
477
  },
443
478
  followOutput: !hasUserCollapseRef.current && autoScroll && !isScrollTopRef.current && searcherResult.count <= 0 && typeof scrollToRow === 'undefined' ? 'auto' : false
444
479
  }), (logs === null || logs === void 0 ? void 0 : logs.length) === 0 && (empty || /*#__PURE__*/React.createElement("div", {
@@ -27,9 +27,88 @@
27
27
  }
28
28
  }
29
29
 
30
+ // LoadingDots:从 1 个「.」到 3 个「.」依次出现,循环时回到 1 个
31
+ @keyframes terminal-viewer-loading-dot-2 {
32
+ 0%,
33
+ 28% {
34
+ opacity: 0.2;
35
+ }
36
+ 33%,
37
+ 100% {
38
+ opacity: 1;
39
+ }
40
+ }
41
+
42
+ @keyframes terminal-viewer-loading-dot-3 {
43
+ 0%,
44
+ 61% {
45
+ opacity: 0.2;
46
+ }
47
+ 66%,
48
+ 100% {
49
+ opacity: 1;
50
+ }
51
+ }
52
+
53
+ .terminal-viewer-loading-dots {
54
+ display: inline-flex;
55
+ align-items: baseline;
56
+ height: 1em;
57
+ color: #fff;
58
+ font-weight: 600;
59
+ line-height: 1;
60
+ vertical-align: middle;
61
+ }
62
+
63
+ .terminal-viewer-loading-dot {
64
+ display: inline-block;
65
+ width: 0.8em;
66
+ text-align: center;
67
+ transform-origin: center bottom;
68
+ scale: 1.5;
69
+ }
70
+
71
+ .terminal-viewer-loading-dot:nth-child(1) {
72
+ opacity: 1;
73
+ }
74
+
75
+ .terminal-viewer-loading-dot:nth-child(2) {
76
+ opacity: 0;
77
+ animation: terminal-viewer-loading-dot-2 1.4s ease-in-out infinite;
78
+ }
79
+
80
+ .terminal-viewer-loading-dot:nth-child(3) {
81
+ opacity: 0;
82
+ animation: terminal-viewer-loading-dot-3 1.4s ease-in-out infinite;
83
+ }
84
+
85
+ .terminal-viewer-virtuoso-list-footer {
86
+ display: flex;
87
+ flex-direction: column;
88
+ }
89
+
90
+ .terminal-viewer-virtuoso-list-footer-loading {
91
+ padding-left: 0;
92
+ background: #262626;
93
+ transform: translateY(-22px);
94
+ }
95
+
96
+ @keyframes terminal-viewer-loading-blink {
97
+ 0% {
98
+ opacity: 0.2;
99
+ }
100
+ 50% {
101
+ opacity: 1;
102
+ }
103
+ 100% {
104
+ opacity: 0.2;
105
+ }
106
+ }
107
+
30
108
  .terminal-viewer-line-number,
31
109
  .terminal-viewer-text-placeholder {
32
- margin-right: 16px;
110
+ margin-right: 8px;
111
+ padding-right: 8px;
33
112
  color: #959da5bf;
34
113
  font-size: 12px;
35
114
  font-family: Roboto Mono, Andale Mono, Consolas, Courier New, monospace;
@@ -98,22 +98,12 @@ var STEPS = [{
98
98
  id: 'build',
99
99
  name: '构建项目',
100
100
  startAt: 0,
101
- endAt: 199
101
+ endAt: 49
102
102
  }, {
103
103
  id: 'test',
104
104
  name: '运行测试',
105
- startAt: 200,
106
- endAt: 499
107
- }, {
108
- id: 'deploy',
109
- name: '部署应用',
110
- startAt: 500,
111
- endAt: 799
112
- }, {
113
- id: 'verify',
114
- name: '验证部署',
115
- startAt: 800,
116
- endAt: 999
105
+ startAt: 50,
106
+ endAt: 99
117
107
  }];
118
108
 
119
109
  // 获取当前行应该属于哪个步骤
@@ -143,6 +133,12 @@ function generateStepStart(step) {
143
133
  return "START_".concat(step.id, "_running_").concat(timestamp, "_").concat(step.name, "\r\n");
144
134
  }
145
135
 
136
+ // 生成 running 状态日志(每次追加 2 行)
137
+ function generateRunningLogs(step, lineNum) {
138
+ var timeLabel = new Date().toLocaleString();
139
+ return "[".concat(step.name, "] [").concat(timeLabel, "] [running] \u9636\u6BB5\u6267\u884C\u4E2D...\r\n") + "[".concat(step.name, "] [").concat(timeLabel, "] [running] \u5F53\u524D\u5904\u7406\u884C ").concat(lineNum, "\r\n");
140
+ }
141
+
146
142
  // 生成步骤结束标记
147
143
  function generateStepEnd(step) {
148
144
  var success = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
@@ -152,7 +148,7 @@ function generateStepEnd(step) {
152
148
  }
153
149
  export function remoteFetchStreamStep() {
154
150
  var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
155
- var loopStep = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;
151
+ var loopStep = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
156
152
  var start = Number(key);
157
153
  return new Promise(function (resolve) {
158
154
  setTimeout(function () {
@@ -163,6 +159,7 @@ export function remoteFetchStreamStep() {
163
159
  var _step = getCurrentStep(i);
164
160
  if (_step) {
165
161
  result += generateStepStart(_step);
162
+ result += generateRunningLogs(_step, i);
166
163
  return 0; // continue
167
164
  }
168
165
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-terminal-viewer-cicd",
3
- "version": "3.0.0-beta.27",
3
+ "version": "3.0.0-beta.29",
4
4
  "author": "https://gitee.com/gitee-frontend",
5
5
  "license": "MIT",
6
6
  "keywords": [