UNPKG

react-terminal-viewer

Version:

<h1 align="center"> react-terminal-viewer </h1>

294 lines (293 loc) 15.4 kB
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } 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; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } 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."); } 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); } 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; } function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } import React, { forwardRef, useCallback, useState, useImperativeHandle, useRef, useEffect, useMemo } from 'react'; import { createPortal } from 'react-dom'; import useDebounceInput from "../Hooks/useDebounceInput"; import TerminalViewerHeader from "../TerminalViewerHeader"; import TerminalViewerBody from "../TerminalViewerBody"; import TerminalViewerVirtualDom from "../TerminalViewerVirtualDom"; import TerminalViewerToolBar from "../TerminalViewerToolBar"; import globalContext from "../Addon/WorkerLog/GlobalContext"; import "./index.less"; import { jsx as _jsx } from "react/jsx-runtime"; import { jsxs as _jsxs } from "react/jsx-runtime"; var defaultSearchOptions = { regex: false, wholeWord: false, caseSensitive: false, incremental: false, decorations: { matchForegroundColor: '#000000', matchBackground: '#ffff54', matchBorder: 'none', matchOverviewRuler: 'none', activeMatchBackground: '#ff9540', activeMatchBorder: 'none', activeMatchColorOverviewRuler: 'none' } }; // eslint-disable-next-line react/display-name var TerminalViewer = /*#__PURE__*/forwardRef(function (_ref, ref) { var fit = _ref.fit, autoScroll = _ref.autoScroll, scrollToRow = _ref.scrollToRow, refreshable = _ref.refreshable, searchPlaceholder = _ref.searchPlaceholder, header = _ref.header, inputAddonBefore = _ref.inputAddonBefore, inputAddonAfter = _ref.inputAddonAfter, empty = _ref.empty, icons = _ref.icons, toolbar = _ref.toolbar, showFullScreen = _ref.showFullScreen, className = _ref.className, style = _ref.style, defaultFullScreen = _ref.defaultFullScreen, defaultData = _ref.defaultData, defaultTabIndex = _ref.defaultTabIndex, activeTabIndexProp = _ref.activeTabIndex, logAfter = _ref.logAfter, tabs = _ref.tabs, webLinksSupport = _ref.webLinksSupport, canvasSupport = _ref.canvasSupport, virtualDomSupport = _ref.virtualDomSupport, workerPath = _ref.workerPath, remoteOptions = _ref.remoteOptions, cacheOptions = _ref.cacheOptions, searchOptions = _ref.searchOptions, highlightOptions = _ref.highlightOptions, terminalOptions = _ref.terminalOptions, extraOptions = _ref.extraOptions, getContainer = _ref.getContainer, onTitleChange = _ref.onTitleChange, onLoading = _ref.onLoading, onRefresh = _ref.onRefresh; var localSearchOptions = searchOptions !== null && searchOptions !== void 0 ? searchOptions : {}; var instanceRef = useRef(); var searchValueRef = useRef(''); var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), loading = _useState2[0], setLoading = _useState2[1]; var _useState3 = useState(defaultFullScreen), _useState4 = _slicedToArray(_useState3, 2), fullScreen = _useState4[0], setFullScreen = _useState4[1]; var _useState5 = useState(activeTabIndexProp || defaultTabIndex || 0), _useState6 = _slicedToArray(_useState5, 2), activeTabIndex = _useState6[0], setActiveTabIndex = _useState6[1]; var _useState7 = useState({ resultIndex: -1, resultCount: 0 }), _useState8 = _slicedToArray(_useState7, 2), searchResult = _useState8[0], setSearchResult = _useState8[1]; var searchOptionsRef = useRef(_objectSpread(_objectSpread({}, defaultSearchOptions), localSearchOptions)); useEffect(function () { searchOptionsRef.current = _objectSpread(_objectSpread({}, defaultSearchOptions), localSearchOptions); }); var cln = ['terminal-viewer', fullScreen && 'terminal-viewer--fullscreen', className].filter(Boolean).join(' '); var ViewerBody = virtualDomSupport ? TerminalViewerVirtualDom : TerminalViewerBody; var titles = useMemo(function () { if (!Array.isArray(tabs)) { return []; } return tabs.map(function (tab, index) { return tab.title || index; }); }, [tabs]); var getQueryElement = useCallback(function (query) { if (typeof query === 'string') { return document.querySelector(query); } if (typeof query === 'function') { return query(); } return query; }, []); var mountElement = fullScreen ? document.body : getQueryElement(getContainer); var handleLoading = useCallback(function (bool) { setLoading(bool); if (typeof onLoading === 'function') { onLoading(bool); } }, [onLoading]); var handleTitleChange = useCallback(function (index) { setActiveTabIndex(index); setSearchResult({ resultIndex: -1, resultCount: 0 }); if (typeof onTitleChange === 'function') { onTitleChange(index); } }, [onTitleChange]); var handleSearchChange = useDebounceInput(function (value) { var _instanceRef$current, _instanceRef$current$; searchValueRef.current = value; if ((_instanceRef$current = instanceRef.current) !== null && _instanceRef$current !== void 0 && (_instanceRef$current$ = _instanceRef$current.addons) !== null && _instanceRef$current$ !== void 0 && _instanceRef$current$.search) { var _instanceRef$current$2; (_instanceRef$current$2 = instanceRef.current.addons.search()) === null || _instanceRef$current$2 === void 0 ? void 0 : _instanceRef$current$2.findNext(value, searchOptionsRef.current); } }); var handleSearchClear = useCallback(function () { var _instanceRef$current2, _instanceRef$current3; if ((_instanceRef$current2 = instanceRef.current) !== null && _instanceRef$current2 !== void 0 && (_instanceRef$current3 = _instanceRef$current2.addons) !== null && _instanceRef$current3 !== void 0 && _instanceRef$current3.search) { var _instanceRef$current$3; (_instanceRef$current$3 = instanceRef.current.addons.search()) === null || _instanceRef$current$3 === void 0 ? void 0 : _instanceRef$current$3.findNext('', searchOptionsRef.current); } }, []); var handleSearchPrev = useCallback(function (value) { var _instanceRef$current4, _instanceRef$current5; if ((_instanceRef$current4 = instanceRef.current) !== null && _instanceRef$current4 !== void 0 && (_instanceRef$current5 = _instanceRef$current4.addons) !== null && _instanceRef$current5 !== void 0 && _instanceRef$current5.search) { var _instanceRef$current6, _instanceRef$current7; (_instanceRef$current6 = instanceRef.current) === null || _instanceRef$current6 === void 0 ? void 0 : (_instanceRef$current7 = _instanceRef$current6.addons.search()) === null || _instanceRef$current7 === void 0 ? void 0 : _instanceRef$current7.findPrevious(value, searchOptionsRef.current); } }, []); var handleSearchNext = useCallback(function (value) { var _instanceRef$current8, _instanceRef$current9; if ((_instanceRef$current8 = instanceRef.current) !== null && _instanceRef$current8 !== void 0 && (_instanceRef$current9 = _instanceRef$current8.addons) !== null && _instanceRef$current9 !== void 0 && _instanceRef$current9.search) { var _instanceRef$current$4; (_instanceRef$current$4 = instanceRef.current.addons.search()) === null || _instanceRef$current$4 === void 0 ? void 0 : _instanceRef$current$4.findNext(value, searchOptionsRef.current); } }, []); var handleAddonReady = useCallback(function (terminal, addon) { var searchAddon = addon; // 注意需配置 decorations 才会触发 if (searchAddon !== null && searchAddon !== void 0 && searchAddon.onDidChangeResults) { searchAddon.onDidChangeResults(function (e) { setSearchResult(e || { resultIndex: -1, resultCount: 0 }); }); } }, []); var handleScrollTop = useCallback(function () { var _instanceRef$current10; if ((_instanceRef$current10 = instanceRef.current) !== null && _instanceRef$current10 !== void 0 && _instanceRef$current10.terminal) { var _instanceRef$current$5; (_instanceRef$current$5 = instanceRef.current.terminal()) === null || _instanceRef$current$5 === void 0 ? void 0 : _instanceRef$current$5.scrollToTop(); } }, []); var handleScrollBottom = useCallback(function () { var _instanceRef$current11; if ((_instanceRef$current11 = instanceRef.current) !== null && _instanceRef$current11 !== void 0 && _instanceRef$current11.terminal) { var _instanceRef$current$6; (_instanceRef$current$6 = instanceRef.current.terminal()) === null || _instanceRef$current$6 === void 0 ? void 0 : _instanceRef$current$6.scrollToBottom(); } }, []); var handleFullScreen = useCallback(function () { setFullScreen(function (p) { return !p; }); }, []); var handleRefresh = useCallback(function () { var _instanceRef$current12; if (typeof onRefresh === 'function') { onRefresh(); } (_instanceRef$current12 = instanceRef.current) === null || _instanceRef$current12 === void 0 ? void 0 : _instanceRef$current12.refresh(); }, [onRefresh]); useEffect(function () { setActiveTabIndex(activeTabIndexProp || 0); }, [activeTabIndexProp]); useImperativeHandle(ref, function () { return instanceRef.current; }); if (virtualDomSupport) { globalContext.setWorkerPath(workerPath || "" || '/worker'); } useEffect(function () { var worker = globalContext.getWorker(); return function () { worker === null || worker === void 0 ? void 0 : worker.terminate(); globalContext.setWorker(undefined); }; }, [virtualDomSupport]); var render = /*#__PURE__*/_jsxs("div", { className: cln, style: style, children: [header || /*#__PURE__*/_jsx(TerminalViewerHeader, { defaultValue: searchValueRef.current, refreshable: refreshable, icons: icons, loading: loading, activeTitleIndex: activeTabIndex, titles: titles, placeholder: searchPlaceholder, searchResult: searchResult, inputAddonBefore: inputAddonBefore, inputAddonAfter: inputAddonAfter, onSearchChange: handleSearchChange, onSearchClear: handleSearchClear, onSearchPrev: handleSearchPrev, onSearchNext: handleSearchNext, onTitleChange: handleTitleChange, onRefresh: handleRefresh }), Array.isArray(tabs) && tabs.map(function (tab, index) { if (activeTabIndex === index) { return /*#__PURE__*/_jsx(ViewerBody, { fit: fit, empty: empty, autoScroll: autoScroll, scrollToRow: scrollToRow, logAfter: logAfter, webLinksSupport: webLinksSupport, canvasSupport: canvasSupport, ref: instanceRef, defaultData: tab.defaultData, cacheOptions: tab.cacheOptions || cacheOptions, remoteOptions: tab.remoteOptions, highlightOptions: highlightOptions, terminalOptions: terminalOptions, extraOptions: extraOptions, onAddonReady: handleAddonReady, onLoading: handleLoading }, tab.key || index); } return null; }).filter(Boolean), !Array.isArray(tabs) && /*#__PURE__*/_jsx(ViewerBody, { fit: fit, empty: empty, autoScroll: autoScroll, scrollToRow: scrollToRow, logAfter: logAfter, webLinksSupport: webLinksSupport, canvasSupport: canvasSupport, ref: instanceRef, defaultData: defaultData, remoteOptions: remoteOptions, cacheOptions: cacheOptions, highlightOptions: highlightOptions, terminalOptions: terminalOptions, extraOptions: extraOptions, onAddonReady: handleAddonReady, onLoading: handleLoading }), toolbar || /*#__PURE__*/_jsx(TerminalViewerToolBar, { icons: icons, fullScreen: fullScreen, showFullScreen: showFullScreen, onScrollTop: handleScrollTop, onScrollBottom: handleScrollBottom, onFullScreen: handleFullScreen })] }); if (mountElement) { return /*#__PURE__*/createPortal(render, mountElement); } return render; }); export default TerminalViewer;