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.
- package/dist/esm/Addon/WorkerLog/LogWorker.js +1 -1
- package/dist/esm/TerminalViewer/index.d.ts +1 -1
- package/dist/esm/TerminalViewerBody/index.d.ts +1 -1
- package/dist/esm/TerminalViewerHeader/index.d.ts +1 -1
- package/dist/esm/TerminalViewerVirtualDom/ChevronRight.js +8 -5
- package/dist/esm/TerminalViewerVirtualDom/index.d.ts +1 -1
- package/dist/esm/TerminalViewerVirtualDom/index.js +41 -6
- package/dist/esm/TerminalViewerVirtualDom/index.less +80 -1
- package/dist/esm/mock/index.js +11 -14
- package/package.json +1 -1
|
@@ -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.
|
|
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<
|
|
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<
|
|
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
|
|
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: "
|
|
32
|
-
fill: "
|
|
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
|
|
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: '
|
|
38
|
-
minHeight: '
|
|
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:
|
|
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:
|
|
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;
|
package/dist/esm/mock/index.js
CHANGED
|
@@ -98,22 +98,12 @@ var STEPS = [{
|
|
|
98
98
|
id: 'build',
|
|
99
99
|
name: '构建项目',
|
|
100
100
|
startAt: 0,
|
|
101
|
-
endAt:
|
|
101
|
+
endAt: 49
|
|
102
102
|
}, {
|
|
103
103
|
id: 'test',
|
|
104
104
|
name: '运行测试',
|
|
105
|
-
startAt:
|
|
106
|
-
endAt:
|
|
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] :
|
|
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
|
}
|