react-terminal-viewer-cicd 2.1.1 → 3.0.0-beta.10
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/README.md +11 -11
- package/dist/esm/Addon/EventEmiter.d.ts +1 -1
- package/dist/esm/Addon/HighlightAddon.d.ts +1 -1
- package/dist/esm/Addon/SearchAddon.d.ts +1 -1
- package/dist/esm/Addon/WorkerLog/LogParser.d.ts +22 -0
- package/dist/esm/Addon/WorkerLog/LogParser.js +136 -0
- package/dist/esm/Addon/WorkerLog/LogWorker.js +1 -1
- package/dist/esm/Addon/WorkerLog/Logs.d.ts +29 -5
- package/dist/esm/Addon/WorkerLog/Logs.js +121 -15
- package/dist/esm/Addon/WorkerLog/Searcher.d.ts +9 -7
- package/dist/esm/Addon/WorkerLog/Searcher.js +20 -8
- package/dist/esm/Addon/WorkerLog/log.worker.js +29 -3
- package/dist/esm/Addon/useAddon.d.ts +5 -5
- package/dist/esm/Addon/useAddon.js +1 -1
- package/dist/esm/Hooks/useDebounceInput.js +1 -1
- package/dist/esm/Hooks/useLocalStore.js +1 -1
- package/dist/esm/Hooks/useRemote.d.ts +1 -1
- package/dist/esm/Hooks/useRemote.js +3 -2
- package/dist/esm/TerminalViewer/index.d.ts +4 -4
- package/dist/esm/TerminalViewer/index.js +4 -4
- package/dist/esm/TerminalViewerBody/index.d.ts +8 -8
- package/dist/esm/TerminalViewerBody/index.js +7 -7
- package/dist/esm/TerminalViewerVirtualDom/ChevronRight.d.ts +21 -0
- package/dist/esm/TerminalViewerVirtualDom/ChevronRight.js +35 -0
- package/dist/esm/TerminalViewerVirtualDom/HumenTime.d.ts +14 -0
- package/dist/esm/TerminalViewerVirtualDom/HumenTime.js +111 -0
- package/dist/esm/TerminalViewerVirtualDom/LogParser.d.ts +22 -0
- package/dist/esm/TerminalViewerVirtualDom/LogParser.js +107 -0
- package/dist/esm/TerminalViewerVirtualDom/index.d.ts +11 -9
- package/dist/esm/TerminalViewerVirtualDom/index.js +261 -137
- package/dist/esm/TerminalViewerVirtualDom/index.less +51 -6
- package/dist/esm/TerminalViewerVirtualDom/useStreamStepWorkerLogs.d.ts +21 -0
- package/dist/esm/TerminalViewerVirtualDom/useStreamStepWorkerLogs.js +257 -0
- package/dist/esm/TerminalViewerVirtualDom/virtualized.less +68 -0
- package/dist/esm/TerminalViewerVirtualDom/watting.svg +1 -0
- package/dist/esm/__mocks__/react-virtualized.js +14 -0
- package/dist/esm/__mocks__/styleMock.js +1 -0
- package/dist/esm/index.d.ts +4 -5
- package/dist/esm/index.js +4 -5
- package/dist/esm/mock/index.d.ts +5 -0
- package/dist/esm/mock/index.js +111 -1
- package/dist/esm/types.d.ts +19 -4
- package/dist/worker/.dumi/tmp/core/defineApp.d.ts +22 -0
- package/dist/worker/.dumi/tmp/core/exportStaticRuntimePlugin.d.ts +1 -0
- package/dist/worker/.dumi/tmp/core/helmet.d.ts +3 -0
- package/dist/worker/.dumi/tmp/core/helmetContext.d.ts +1 -0
- package/dist/worker/.dumi/tmp/core/history.d.ts +5 -0
- package/dist/worker/.dumi/tmp/core/historyIntelli.d.ts +50 -0
- package/dist/worker/.dumi/tmp/core/plugin.d.ts +8 -0
- package/dist/worker/.dumi/tmp/core/pluginConfig.d.ts +341 -0
- package/dist/worker/.dumi/tmp/core/route.d.ts +83 -0
- package/dist/worker/.dumi/tmp/core/terminal.d.ts +14 -0
- package/dist/worker/.dumi/tmp/dumi/exports.d.ts +3 -0
- package/dist/worker/.dumi/tmp/dumi/locales/config.d.ts +106 -0
- package/dist/worker/.dumi/tmp/dumi/locales/runtime.d.ts +2 -0
- package/dist/worker/.dumi/tmp/dumi/meta/atoms.d.ts +1 -0
- package/dist/worker/.dumi/tmp/dumi/meta/exports.d.ts +31 -0
- package/dist/worker/.dumi/tmp/dumi/meta/index.d.ts +39 -0
- package/dist/worker/.dumi/tmp/dumi/meta/runtime.d.ts +3 -0
- package/dist/worker/.dumi/tmp/dumi/meta/tabs.d.ts +1 -0
- package/dist/worker/.dumi/tmp/dumi/theme/ContextWrapper.d.ts +2 -0
- package/dist/worker/.dumi/tmp/exports.d.ts +10 -0
- package/dist/worker/.dumi/tmp/plugin-html2sketch/index.d.ts +1 -0
- package/dist/worker/.dumi/tmp/testBrowser.d.ts +8 -0
- package/dist/worker/.dumirc.d.ts +2 -0
- package/dist/worker/Addon/EventEmiter.d.ts +1 -1
- package/dist/worker/Addon/HighlightAddon.d.ts +1 -1
- package/dist/worker/Addon/SearchAddon.d.ts +1 -1
- package/dist/worker/Addon/useAddon.d.ts +4 -4
- package/dist/worker/TerminalViewer/index.d.ts +1 -1
- package/dist/worker/TerminalViewerBody/index.d.ts +5 -5
- package/dist/worker/index.d.ts +1 -1
- package/dist/worker/log.worker.dev.js +3291 -0
- package/dist/worker/log.worker.dev.js.map +1 -0
- package/dist/worker/log.worker.js +1 -1
- package/dist/worker/log.worker.js.map +1 -1
- package/dist/worker/mock/index.d.ts +3 -0
- package/dist/worker/src/Addon/EventEmiter.d.ts +18 -0
- package/dist/worker/src/Addon/HighlightAddon.d.ts +26 -0
- package/dist/worker/src/Addon/LineNumberAddon.d.ts +39 -0
- package/dist/worker/src/Addon/SearchAddon.d.ts +140 -0
- package/dist/worker/src/Addon/WorkerLog/GlobalContext.d.ts +10 -0
- package/dist/worker/src/Addon/WorkerLog/LimitMap.d.ts +14 -0
- package/dist/worker/src/Addon/WorkerLog/LogParser.d.ts +22 -0
- package/dist/worker/src/Addon/WorkerLog/LogWorker.d.ts +2 -0
- package/dist/worker/src/Addon/WorkerLog/Logs.d.ts +45 -0
- package/dist/worker/src/Addon/WorkerLog/Mark.d.ts +36 -0
- package/dist/worker/src/Addon/WorkerLog/Searcher.d.ts +18 -0
- package/dist/worker/src/Addon/WorkerLog/WebWokerServer.d.ts +10 -0
- package/dist/worker/src/Addon/WorkerLog/WebWorkerClient.d.ts +13 -0
- package/dist/worker/src/Addon/WorkerLog/log.worker.d.ts +1 -0
- package/dist/worker/src/Addon/WorkerLog/types.d.ts +18 -0
- package/dist/worker/src/Addon/useAddon.d.ts +9 -0
- package/dist/worker/src/Hooks/useBatchProcess.d.ts +2 -0
- package/dist/worker/src/Hooks/useCache.d.ts +31 -0
- package/dist/worker/src/Hooks/useDebounceInput.d.ts +3 -0
- package/dist/worker/src/Hooks/useLocalStore.d.ts +2 -0
- package/dist/worker/src/Hooks/useRemote.d.ts +30 -0
- package/dist/worker/src/Hooks/useRemote.test.d.ts +1 -0
- package/dist/worker/src/Hooks/useThrottle.d.ts +2 -0
- package/dist/worker/src/Hooks/useWorkerLogs.d.ts +9 -0
- package/dist/worker/src/TerminalViewer/index.d.ts +185 -0
- package/dist/worker/src/TerminalViewer/index.test.d.ts +1 -0
- package/dist/worker/src/TerminalViewerBody/index.d.ts +87 -0
- package/dist/worker/src/TerminalViewerBody/index.test.d.ts +1 -0
- package/dist/worker/src/TerminalViewerHeader/index.d.ts +88 -0
- package/dist/worker/src/TerminalViewerToolBar/index.d.ts +46 -0
- package/dist/worker/src/TerminalViewerVirtualDom/ChevronRight.d.ts +21 -0
- package/dist/worker/src/TerminalViewerVirtualDom/HumenTime.d.ts +14 -0
- package/dist/worker/src/TerminalViewerVirtualDom/LogParser.d.ts +22 -0
- package/dist/worker/src/TerminalViewerVirtualDom/ReactVirtualized.d.ts +71 -0
- package/dist/worker/src/TerminalViewerVirtualDom/ReactVirtuoso.d.ts +67 -0
- package/dist/worker/src/TerminalViewerVirtualDom/StatusIcon.d.ts +4 -0
- package/dist/worker/src/TerminalViewerVirtualDom/index.d.ts +73 -0
- package/dist/worker/src/TerminalViewerVirtualDom/parsePipelineLogs.d.ts +21 -0
- package/dist/worker/src/TerminalViewerVirtualDom/useStreamStepWorkerLogs.d.ts +21 -0
- package/dist/worker/src/index.d.ts +8 -0
- package/dist/worker/src/mock/index.d.ts +17 -0
- package/dist/worker/src/types.d.ts +45 -0
- package/dist/worker/types.d.ts +4 -4
- package/package.json +109 -98
package/README.md
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
<h1 align="center">
|
|
2
|
-
|
|
2
|
+
gitee-terminal-viewer
|
|
3
3
|
</h1>
|
|
4
4
|
|
|
5
5
|
<p align="center">基于 xterm.js 内核的 React 日志组件</p>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<a href="https://gitee.com/oschina/
|
|
9
|
-
<a href="https://www.npmjs.com/package/
|
|
10
|
-
<img src="https://img.shields.io/npm/v/
|
|
11
|
-
data-canonical-src="https://img.shields.io/npm/v/
|
|
8
|
+
<a href="https://gitee.com/oschina/gitee-terminal-viewer/gitee_go/pipelines"><img src="https://img.shields.io/badge/codecov-20%25-green" data-canonical-src="https://img.shields.io/badge/codecov-20%25-green"/></a>
|
|
9
|
+
<a href="https://www.npmjs.com/package/gitee-terminal-viewer">
|
|
10
|
+
<img src="https://img.shields.io/npm/v/gitee-terminal-viewer/latest"
|
|
11
|
+
data-canonical-src="https://img.shields.io/npm/v/gitee-terminal-viewer/latest"/>
|
|
12
12
|
</a>
|
|
13
|
-
<img src="https://img.shields.io/npm/l/
|
|
13
|
+
<img src="https://img.shields.io/npm/l/gitee-terminal-viewer" data-canonical-src="https://img.shields.io/npm/l/gitee-terminal-viewer"/>
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
|
-

|
|
17
17
|
|
|
18
18
|
## 功能
|
|
19
19
|
|
|
@@ -41,20 +41,20 @@
|
|
|
41
41
|
使用 npm 或 yarn 把这个 package 安装到你的项目依赖中:
|
|
42
42
|
|
|
43
43
|
```
|
|
44
|
-
npm install
|
|
44
|
+
npm install gitee-terminal-viewer
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
或
|
|
48
48
|
|
|
49
49
|
```
|
|
50
|
-
yarn add
|
|
50
|
+
yarn add gitee-terminal-viewer
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
## 使用
|
|
54
54
|
|
|
55
55
|
```tsx
|
|
56
56
|
import React, { useRef } from 'react';
|
|
57
|
-
import TerminalViewer from '
|
|
57
|
+
import TerminalViewer from 'gitee-terminal-viewer';
|
|
58
58
|
export default () => {
|
|
59
59
|
const ref = useRef();
|
|
60
60
|
const data = 'echo success';
|
|
@@ -104,7 +104,7 @@ webpack 配置:
|
|
|
104
104
|
new CopyPlugin({
|
|
105
105
|
patterns: [
|
|
106
106
|
{
|
|
107
|
-
from: path.resolve(__dirname, 'node_modules/
|
|
107
|
+
from: path.resolve(__dirname, 'node_modules/gitee-terminal-viewer/dist/worker'),
|
|
108
108
|
to: path.resolve(__dirname, 'dist/scripts/worker'),
|
|
109
109
|
filter: (file) => file.includes('worker'),
|
|
110
110
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 从 https://github.com/xtermjs/xterm.js/blob/master/addons/xterm-addon-search/src/SearchAddon.ts 复制以解决部分问题
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { ITerminalAddon, Terminal } from '@xterm/xterm';
|
|
5
5
|
export interface ISearchOptions {
|
|
6
6
|
regex?: boolean;
|
|
7
7
|
wholeWord?: boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface FlatLine {
|
|
2
|
+
type: 'start' | 'end' | 'log';
|
|
3
|
+
text: string;
|
|
4
|
+
}
|
|
5
|
+
export interface Stage {
|
|
6
|
+
stepId: string;
|
|
7
|
+
status: string;
|
|
8
|
+
startTime: string;
|
|
9
|
+
name: string;
|
|
10
|
+
startIndex: number;
|
|
11
|
+
endIndex?: number;
|
|
12
|
+
endStatus?: string;
|
|
13
|
+
endTime?: string;
|
|
14
|
+
logs: FlatLine[];
|
|
15
|
+
}
|
|
16
|
+
declare class LogParser {
|
|
17
|
+
stages: Stage[];
|
|
18
|
+
currentStage: Stage | null;
|
|
19
|
+
flatLines: FlatLine[];
|
|
20
|
+
parse(logs: string[]): void;
|
|
21
|
+
}
|
|
22
|
+
export default LogParser;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
3
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
5
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
6
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
7
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
8
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
9
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
10
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
11
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
12
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
13
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
14
|
+
/* eslint-disable no-continue */
|
|
15
|
+
/* eslint-disable no-plusplus */
|
|
16
|
+
// 阶段结构
|
|
17
|
+
var LogParser = /*#__PURE__*/function () {
|
|
18
|
+
function LogParser() {
|
|
19
|
+
_classCallCheck(this, LogParser);
|
|
20
|
+
_defineProperty(this, "stages", []);
|
|
21
|
+
// 所有阶段数据
|
|
22
|
+
_defineProperty(this, "currentStage", null);
|
|
23
|
+
// 当前正在解析入的阶段
|
|
24
|
+
_defineProperty(this, "flatLines", []);
|
|
25
|
+
}
|
|
26
|
+
_createClass(LogParser, [{
|
|
27
|
+
key: "parse",
|
|
28
|
+
value:
|
|
29
|
+
// 扁平化行数组(最终给 Virtuoso)
|
|
30
|
+
|
|
31
|
+
function parse(logs) {
|
|
32
|
+
if (!logs || !Array.isArray(logs)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 重置状态
|
|
37
|
+
this.stages = [];
|
|
38
|
+
this.currentStage = null;
|
|
39
|
+
this.flatLines = [];
|
|
40
|
+
|
|
41
|
+
// flatLines 中的实际索引(不包含 START/END 行)
|
|
42
|
+
var flatLineIndex = 0;
|
|
43
|
+
for (var i = 0; i < logs.length; i++) {
|
|
44
|
+
var line = logs[i];
|
|
45
|
+
// START_stepId_status_startTime_stepName
|
|
46
|
+
if (line.startsWith('START_')) {
|
|
47
|
+
// 如果需要解析 stepId 等,可以在这里 split 一次
|
|
48
|
+
var _line$split = line.split('_'),
|
|
49
|
+
_line$split2 = _slicedToArray(_line$split, 5),
|
|
50
|
+
stepId = _line$split2[1],
|
|
51
|
+
status = _line$split2[2],
|
|
52
|
+
startTime = _line$split2[3],
|
|
53
|
+
name = _line$split2[4];
|
|
54
|
+
this.currentStage = {
|
|
55
|
+
stepId: stepId,
|
|
56
|
+
status: status,
|
|
57
|
+
startTime: startTime,
|
|
58
|
+
name: name,
|
|
59
|
+
// startIndex 记录在 flatLines 中的位置(不包含 START 行本身)
|
|
60
|
+
startIndex: flatLineIndex,
|
|
61
|
+
endIndex: undefined,
|
|
62
|
+
logs: []
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// 不将 START 行加入到 flatLines 中
|
|
66
|
+
// 但保留在 stage.logs 中用于其他用途
|
|
67
|
+
this.currentStage.logs.push({
|
|
68
|
+
type: 'start',
|
|
69
|
+
text: line
|
|
70
|
+
});
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// END_stepId_status_endTime_stepName
|
|
75
|
+
if (line.startsWith('END_')) {
|
|
76
|
+
var _line$split3 = line.split('_'),
|
|
77
|
+
_line$split4 = _slicedToArray(_line$split3, 4),
|
|
78
|
+
endStatus = _line$split4[2],
|
|
79
|
+
endTime = _line$split4[3];
|
|
80
|
+
if (this.currentStage) {
|
|
81
|
+
// 不将 END 行加入到 flatLines 中
|
|
82
|
+
// 但保留在 stage.logs 中用于其他用途
|
|
83
|
+
this.currentStage.logs.push({
|
|
84
|
+
type: 'end',
|
|
85
|
+
text: line
|
|
86
|
+
});
|
|
87
|
+
this.currentStage.endTime = endTime;
|
|
88
|
+
this.currentStage.endStatus = endStatus;
|
|
89
|
+
// endIndex 记录在 flatLines 中的位置(不包含 END 行本身)
|
|
90
|
+
// 如果当前阶段有日志行,endIndex 是最后一个日志行的索引(flatLineIndex - 1)
|
|
91
|
+
// 如果当前阶段没有日志行,endIndex 等于 startIndex - 1(表示阶段开始前的位置)
|
|
92
|
+
// 但如果 startIndex 为 0,则 endIndex 也为 0
|
|
93
|
+
if (flatLineIndex > this.currentStage.startIndex) {
|
|
94
|
+
// 阶段有日志行
|
|
95
|
+
this.currentStage.endIndex = flatLineIndex - 1;
|
|
96
|
+
} else {
|
|
97
|
+
// 阶段没有日志行
|
|
98
|
+
this.currentStage.endIndex = this.currentStage.startIndex > 0 ? this.currentStage.startIndex - 1 : this.currentStage.startIndex;
|
|
99
|
+
}
|
|
100
|
+
this.stages.push(this.currentStage);
|
|
101
|
+
this.currentStage = null;
|
|
102
|
+
}
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// 普通日志行
|
|
107
|
+
this.flatLines.push({
|
|
108
|
+
type: 'log',
|
|
109
|
+
text: line
|
|
110
|
+
});
|
|
111
|
+
flatLineIndex++;
|
|
112
|
+
// 普通日志行
|
|
113
|
+
if (this.currentStage) {
|
|
114
|
+
this.currentStage.logs.push({
|
|
115
|
+
type: 'log',
|
|
116
|
+
text: line
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (this.currentStage) {
|
|
121
|
+
// 处理未结束的阶段
|
|
122
|
+
if (flatLineIndex > this.currentStage.startIndex) {
|
|
123
|
+
// 阶段有日志行
|
|
124
|
+
this.currentStage.endIndex = flatLineIndex - 1;
|
|
125
|
+
} else {
|
|
126
|
+
// 阶段没有日志行
|
|
127
|
+
this.currentStage.endIndex = this.currentStage.startIndex > 0 ? this.currentStage.startIndex - 1 : this.currentStage.startIndex;
|
|
128
|
+
}
|
|
129
|
+
this.stages.push(this.currentStage);
|
|
130
|
+
this.currentStage = null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}]);
|
|
134
|
+
return LogParser;
|
|
135
|
+
}();
|
|
136
|
+
export default LogParser;
|
|
@@ -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 = "
|
|
4
|
+
var version = "3.0.0-beta.10" || '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'
|
|
@@ -1,20 +1,44 @@
|
|
|
1
1
|
import type { ISearchOptions } from '../SearchAddon';
|
|
2
|
+
import { type FlatLine, type Stage } from './LogParser';
|
|
2
3
|
export default class Logs {
|
|
3
4
|
private id;
|
|
4
5
|
private string;
|
|
5
6
|
private searcher;
|
|
6
|
-
private
|
|
7
|
+
private parser;
|
|
8
|
+
private parserMap;
|
|
9
|
+
private ansiUp;
|
|
7
10
|
constructor({ id, string }: {
|
|
8
11
|
id: string;
|
|
9
12
|
string: string;
|
|
10
13
|
});
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
/**
|
|
15
|
+
* 更新字符串并重新解析
|
|
16
|
+
*/
|
|
17
|
+
updateString(newString: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* 解析原始字符串,识别 START/END 标记,构建 stages 和 flatLines
|
|
20
|
+
*/
|
|
21
|
+
private parse;
|
|
22
|
+
/**
|
|
23
|
+
* 获取 HTML 转换后的数组数据(基于 parse 的结果,不包含 START/END 行)
|
|
24
|
+
*/
|
|
25
|
+
getArrayData(): string[];
|
|
26
|
+
/**
|
|
27
|
+
* 获取解析后的 stages
|
|
28
|
+
*/
|
|
29
|
+
getStages(): Stage[];
|
|
30
|
+
/**
|
|
31
|
+
* 获取解析后的 flatLines(已进行 HTML 转换)
|
|
32
|
+
*/
|
|
33
|
+
getFlatLines(): FlatLine[];
|
|
34
|
+
/**
|
|
35
|
+
* 搜索功能,基于 flatLines 进行搜索
|
|
36
|
+
*/
|
|
13
37
|
mark(keyword: string, hlIndex?: number, options?: ISearchOptions | undefined): {
|
|
14
38
|
count: number;
|
|
15
39
|
map: {
|
|
16
|
-
[key: string]: string
|
|
17
|
-
[key: number]: string
|
|
40
|
+
[key: string]: string | Record<string, string>;
|
|
41
|
+
[key: number]: string | Record<string, string>;
|
|
18
42
|
};
|
|
19
43
|
markedKey: number;
|
|
20
44
|
};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
2
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
1
3
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
4
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
3
5
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
@@ -5,10 +7,9 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
|
|
|
5
7
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
8
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
7
9
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
8
|
-
/* eslint-disable no-plusplus */
|
|
9
|
-
// eslint-disable-next-line import/no-named-default
|
|
10
10
|
import { default as AnsiUp } from 'ansi_up';
|
|
11
11
|
import LimitMap from "./LimitMap";
|
|
12
|
+
import LogParser from "./LogParser";
|
|
12
13
|
import Searcher from "./Searcher";
|
|
13
14
|
var Logs = /*#__PURE__*/function () {
|
|
14
15
|
function Logs(_ref) {
|
|
@@ -18,32 +19,136 @@ var Logs = /*#__PURE__*/function () {
|
|
|
18
19
|
_defineProperty(this, "id", void 0);
|
|
19
20
|
_defineProperty(this, "string", void 0);
|
|
20
21
|
_defineProperty(this, "searcher", void 0);
|
|
21
|
-
_defineProperty(this, "
|
|
22
|
+
_defineProperty(this, "parser", void 0);
|
|
23
|
+
_defineProperty(this, "parserMap", void 0);
|
|
24
|
+
_defineProperty(this, "ansiUp", void 0);
|
|
22
25
|
this.id = id;
|
|
23
26
|
this.string = string;
|
|
24
|
-
this.searcher = new Searcher(
|
|
25
|
-
|
|
27
|
+
this.searcher = new Searcher({
|
|
28
|
+
calculateSearchText: function calculateSearchText(line) {
|
|
29
|
+
// 处理 FlatLine 对象,提取 text 字段
|
|
30
|
+
if (line && _typeof(line) === 'object' && 'text' in line) {
|
|
31
|
+
return line.text || '';
|
|
32
|
+
}
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
this.parserMap = new LimitMap({
|
|
26
37
|
limit: 1
|
|
27
38
|
});
|
|
39
|
+
this.parser = new LogParser();
|
|
40
|
+
this.ansiUp = new AnsiUp();
|
|
41
|
+
// 初始化时进行解析
|
|
42
|
+
this.parse();
|
|
28
43
|
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 更新字符串并重新解析
|
|
47
|
+
*/
|
|
29
48
|
_createClass(Logs, [{
|
|
30
|
-
key: "
|
|
31
|
-
value: function
|
|
49
|
+
key: "updateString",
|
|
50
|
+
value: function updateString(newString) {
|
|
51
|
+
if (this.string !== newString) {
|
|
52
|
+
this.string = newString;
|
|
53
|
+
// 清除缓存,强制重新解析
|
|
54
|
+
this.parserMap.delete(this.id);
|
|
55
|
+
this.parse();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 解析原始字符串,识别 START/END 标记,构建 stages 和 flatLines
|
|
61
|
+
*/
|
|
62
|
+
}, {
|
|
63
|
+
key: "parse",
|
|
64
|
+
value: function parse() {
|
|
65
|
+
var _this = this;
|
|
32
66
|
if (this.string.length === 0) {
|
|
33
|
-
return
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// 如果已经解析过且缓存存在,直接使用缓存的解析结果
|
|
71
|
+
if (this.parserMap.has(this.id)) {
|
|
72
|
+
var cachedParser = this.parserMap.get(this.id);
|
|
73
|
+
if (cachedParser) {
|
|
74
|
+
this.parser = cachedParser;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
34
77
|
}
|
|
35
|
-
|
|
36
|
-
|
|
78
|
+
|
|
79
|
+
// 创建新的解析器实例
|
|
80
|
+
var newParser = new LogParser();
|
|
81
|
+
|
|
82
|
+
// 分割原始字符串为行数组(不进行 HTML 转换)
|
|
83
|
+
var rawLines = this.string.split('\r\n');
|
|
84
|
+
|
|
85
|
+
// 解析日志结构
|
|
86
|
+
newParser.parse(rawLines);
|
|
87
|
+
|
|
88
|
+
// 对 flatLines 中的 text 进行 HTML 转换(用于展示)
|
|
89
|
+
newParser.flatLines = newParser.flatLines.map(function (line) {
|
|
90
|
+
// 只对普通日志行进行 HTML 转换,START/END 行已经在 flatLines 中被移除了
|
|
91
|
+
if (line.type === 'log') {
|
|
92
|
+
return _objectSpread(_objectSpread({}, line), {}, {
|
|
93
|
+
text: _this.ansiUp.ansi_to_html(line.text)
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return line;
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// 对 stages 中的 logs 也进行 HTML 转换(用于其他用途)
|
|
100
|
+
newParser.stages = newParser.stages.map(function (stage) {
|
|
101
|
+
return _objectSpread(_objectSpread({}, stage), {}, {
|
|
102
|
+
logs: stage.logs.map(function (log) {
|
|
103
|
+
if (log.type === 'log') {
|
|
104
|
+
return _objectSpread(_objectSpread({}, log), {}, {
|
|
105
|
+
text: _this.ansiUp.ansi_to_html(log.text)
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return log;
|
|
109
|
+
})
|
|
110
|
+
});
|
|
37
111
|
});
|
|
112
|
+
|
|
113
|
+
// 保存解析结果
|
|
114
|
+
this.parser = newParser;
|
|
115
|
+
// 缓存解析结果
|
|
116
|
+
this.parserMap.set(this.id, this.parser);
|
|
38
117
|
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 获取 HTML 转换后的数组数据(基于 parse 的结果,不包含 START/END 行)
|
|
121
|
+
*/
|
|
39
122
|
}, {
|
|
40
123
|
key: "getArrayData",
|
|
41
124
|
value: function getArrayData() {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
125
|
+
// 直接使用 parse 的结果,提取 flatLines 中的 text(已进行 HTML 转换)
|
|
126
|
+
return this.parser.flatLines.map(function (line) {
|
|
127
|
+
return line.text;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 获取解析后的 stages
|
|
133
|
+
*/
|
|
134
|
+
}, {
|
|
135
|
+
key: "getStages",
|
|
136
|
+
value: function getStages() {
|
|
137
|
+
return this.parser.stages;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* 获取解析后的 flatLines(已进行 HTML 转换)
|
|
142
|
+
*/
|
|
143
|
+
}, {
|
|
144
|
+
key: "getFlatLines",
|
|
145
|
+
value: function getFlatLines() {
|
|
146
|
+
return this.parser.flatLines;
|
|
46
147
|
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 搜索功能,基于 flatLines 进行搜索
|
|
151
|
+
*/
|
|
47
152
|
}, {
|
|
48
153
|
key: "mark",
|
|
49
154
|
value: function mark(keyword) {
|
|
@@ -52,7 +157,8 @@ var Logs = /*#__PURE__*/function () {
|
|
|
52
157
|
if (!keyword) {
|
|
53
158
|
return this.searcher.search(keyword, []);
|
|
54
159
|
}
|
|
55
|
-
|
|
160
|
+
// 基于 flatLines 进行搜索(不包含 START/END 行)
|
|
161
|
+
return this.searcher.search(keyword, this.parser.flatLines, hlIndex, options);
|
|
56
162
|
}
|
|
57
163
|
}]);
|
|
58
164
|
return Logs;
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { ISearchOptions } from '../SearchAddon';
|
|
2
|
+
export interface IOptions {
|
|
3
|
+
markClassName?: string;
|
|
4
|
+
markedClassName?: string;
|
|
5
|
+
calculateSearchText?: (line: Record<string, string>) => string;
|
|
6
|
+
}
|
|
2
7
|
export default class Searcher {
|
|
3
8
|
private options;
|
|
4
|
-
constructor(options?:
|
|
5
|
-
|
|
6
|
-
markedClassName: string;
|
|
7
|
-
});
|
|
8
|
-
search(keyword: string, logs: Array<string>, hlIndex?: number, options?: ISearchOptions | undefined): {
|
|
9
|
+
constructor(options?: IOptions);
|
|
10
|
+
search(keyword: string, logs: Array<string | Record<string, string>>, hlIndex?: number, options?: ISearchOptions | undefined): {
|
|
9
11
|
count: number;
|
|
10
12
|
map: {
|
|
11
|
-
[key: string]: string
|
|
12
|
-
[key: number]: string
|
|
13
|
+
[key: string]: string | Record<string, string>;
|
|
14
|
+
[key: number]: string | Record<string, string>;
|
|
13
15
|
};
|
|
14
16
|
markedKey: number;
|
|
15
17
|
};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
2
4
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
3
5
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
4
6
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
@@ -10,14 +12,13 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
|
|
|
10
12
|
import Mark from "./Mark";
|
|
11
13
|
var MAX_COUNT = 1000;
|
|
12
14
|
var Searcher = /*#__PURE__*/function () {
|
|
13
|
-
function Searcher() {
|
|
14
|
-
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
|
15
|
-
markClassName: 'terminal-viewer-hl-mark',
|
|
16
|
-
markedClassName: 'terminal-viewer-hl-mark terminal-viewer-hl-marked'
|
|
17
|
-
};
|
|
15
|
+
function Searcher(options) {
|
|
18
16
|
_classCallCheck(this, Searcher);
|
|
19
17
|
_defineProperty(this, "options", void 0);
|
|
20
|
-
this.options =
|
|
18
|
+
this.options = _objectSpread({
|
|
19
|
+
markClassName: 'terminal-viewer-hl-mark',
|
|
20
|
+
markedClassName: 'terminal-viewer-hl-mark terminal-viewer-hl-marked'
|
|
21
|
+
}, options || {});
|
|
21
22
|
}
|
|
22
23
|
_createClass(Searcher, [{
|
|
23
24
|
key: "search",
|
|
@@ -34,7 +35,8 @@ var Searcher = /*#__PURE__*/function () {
|
|
|
34
35
|
}
|
|
35
36
|
var _this$options = this.options,
|
|
36
37
|
markClassName = _this$options.markClassName,
|
|
37
|
-
markedClassName = _this$options.markedClassName
|
|
38
|
+
markedClassName = _this$options.markedClassName,
|
|
39
|
+
calculateSearchText = _this$options.calculateSearchText;
|
|
38
40
|
var style = {
|
|
39
41
|
color: options === null || options === void 0 || (_options$decorations = options.decorations) === null || _options$decorations === void 0 ? void 0 : _options$decorations.matchForegroundColor,
|
|
40
42
|
background: options === null || options === void 0 || (_options$decorations2 = options.decorations) === null || _options$decorations2 === void 0 ? void 0 : _options$decorations2.matchBackground,
|
|
@@ -51,7 +53,17 @@ var Searcher = /*#__PURE__*/function () {
|
|
|
51
53
|
if (count >= MAX_COUNT) {
|
|
52
54
|
break;
|
|
53
55
|
}
|
|
54
|
-
var
|
|
56
|
+
var _line = logs[i];
|
|
57
|
+
var text = '';
|
|
58
|
+
// 对象,用 calculateSearchText 取值
|
|
59
|
+
if (_typeof(_line) === 'object') {
|
|
60
|
+
text = (calculateSearchText === null || calculateSearchText === void 0 ? void 0 : calculateSearchText(_line)) || '';
|
|
61
|
+
}
|
|
62
|
+
// string,直接使用
|
|
63
|
+
if (typeof _line === 'string') {
|
|
64
|
+
text = _line;
|
|
65
|
+
}
|
|
66
|
+
// 执行匹配查询逻辑
|
|
55
67
|
if (!text.toLowerCase().includes(keyword.toLowerCase())) {
|
|
56
68
|
// eslint-disable-next-line no-continue
|
|
57
69
|
continue;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-restricted-globals */
|
|
2
|
-
import WebWorkerServer from "./WebWokerServer";
|
|
3
2
|
import LimitMap from "./LimitMap";
|
|
4
3
|
import Logs from "./Logs";
|
|
4
|
+
import WebWorkerServer from "./WebWokerServer";
|
|
5
5
|
var server = new WebWorkerServer(self);
|
|
6
6
|
var logsInstanceMap = new LimitMap({
|
|
7
7
|
limit: 8
|
|
@@ -14,11 +14,20 @@ server.on('highlight-log', function (ctx, _ref) {
|
|
|
14
14
|
id: id,
|
|
15
15
|
string: string
|
|
16
16
|
}));
|
|
17
|
+
} else {
|
|
18
|
+
// 如果实例已存在,检查 string 是否变化,如果变化了需要更新并重新解析
|
|
19
|
+
var existingInstance = logsInstanceMap.get(id);
|
|
20
|
+
existingInstance.updateString(string);
|
|
17
21
|
}
|
|
18
22
|
var instance = logsInstanceMap.get(id);
|
|
23
|
+
var logs = (instance === null || instance === void 0 ? void 0 : instance.getArrayData()) || [];
|
|
24
|
+
var stages = (instance === null || instance === void 0 ? void 0 : instance.getStages()) || [];
|
|
25
|
+
var flatLines = (instance === null || instance === void 0 ? void 0 : instance.getFlatLines()) || [];
|
|
19
26
|
ctx.send('highlight-log-success', {
|
|
20
27
|
id: id,
|
|
21
|
-
logs:
|
|
28
|
+
logs: logs,
|
|
29
|
+
stages: stages,
|
|
30
|
+
flatLines: flatLines
|
|
22
31
|
});
|
|
23
32
|
});
|
|
24
33
|
server.on('search-log', function (ctx, _ref2) {
|
|
@@ -42,18 +51,35 @@ server.on('search-log', function (ctx, _ref2) {
|
|
|
42
51
|
});
|
|
43
52
|
return;
|
|
44
53
|
}
|
|
54
|
+
// 确保有 Logs 实例
|
|
45
55
|
if (!logsInstanceMap.has(id)) {
|
|
46
56
|
logsInstanceMap.set(id, new Logs({
|
|
47
57
|
id: id,
|
|
48
58
|
string: string
|
|
49
59
|
}));
|
|
60
|
+
} else {
|
|
61
|
+
// 如果实例已存在,检查 string 是否变化,如果变化了需要更新并重新解析
|
|
62
|
+
var existingInstance = logsInstanceMap.get(id);
|
|
63
|
+
existingInstance.updateString(string);
|
|
50
64
|
}
|
|
51
65
|
var instance = logsInstanceMap.get(id);
|
|
52
66
|
if (instance) {
|
|
67
|
+
// 使用 Logs 实例的 mark 方法进行搜索(基于 flatLines)
|
|
68
|
+
var result = instance.mark(keyword, hlIndex, options);
|
|
53
69
|
ctx.send('search-log-success', {
|
|
54
70
|
id: id,
|
|
55
71
|
searchId: searchId,
|
|
56
|
-
searcherResult:
|
|
72
|
+
searcherResult: result || {
|
|
73
|
+
map: {},
|
|
74
|
+
count: 0,
|
|
75
|
+
markedKey: 0
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
} else {
|
|
79
|
+
ctx.send('search-log-success', {
|
|
80
|
+
id: id,
|
|
81
|
+
searchId: searchId,
|
|
82
|
+
searcherResult: {
|
|
57
83
|
map: {},
|
|
58
84
|
count: 0,
|
|
59
85
|
markedKey: 0
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FitAddon } from 'xterm
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { SearchAddon } from './SearchAddon';
|
|
1
|
+
import { CanvasAddon } from '@xterm/addon-canvas';
|
|
2
|
+
import { FitAddon } from '@xterm/addon-fit';
|
|
3
|
+
import { WebLinksAddon } from '@xterm/addon-web-links';
|
|
4
|
+
import { Terminal } from '@xterm/xterm';
|
|
6
5
|
import { HighlightAddon } from './HighlightAddon';
|
|
6
|
+
import { SearchAddon } from './SearchAddon';
|
|
7
7
|
export type AddonType = FitAddon | WebLinksAddon | SearchAddon | HighlightAddon | CanvasAddon;
|
|
8
8
|
declare const useAddon: (terminal: Terminal | undefined, Addon: new () => AddonType, loadable: boolean, callback?: ((term: Terminal, instance: AddonType) => void) | undefined) => AddonType | undefined;
|
|
9
9
|
export default useAddon;
|
|
@@ -4,7 +4,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
|
|
|
4
4
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
5
5
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
6
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
7
|
-
import { useEffect,
|
|
7
|
+
import { useEffect, useRef, useState } from 'react';
|
|
8
8
|
var useAddon = function useAddon(terminal, Addon, loadable, callback) {
|
|
9
9
|
var _useState = useState(),
|
|
10
10
|
_useState2 = _slicedToArray(_useState, 2),
|