diff --git a/apps/1test/package.json b/apps/1test/package.json index acbc0e471f..138fe3a1c2 100644 --- a/apps/1test/package.json +++ b/apps/1test/package.json @@ -24,6 +24,8 @@ "@electron-forge/maker-squirrel": "^6.1.1", "@electron-forge/maker-zip": "^6.1.1", "@electron-forge/plugin-webpack": "^6.1.1", + "@types/react": "^18.2.8", + "@types/react-dom": "^18.2.4", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", "@vercel/webpack-asset-relocator-loader": "1.7.3", @@ -41,6 +43,12 @@ "dependencies": { "chokidar": "^3.5.3", "electron-squirrel-startup": "^1.0.0", - "fix-path": "^4.0.0" + "fix-path": "^4.0.0", + "node-pty": "0.10.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "xterm": "^5.1.0", + "xterm-addon-fit": "^0.7.0", + "xterm-for-react": "^1.0.4" } } diff --git a/apps/1test/src/app.tsx b/apps/1test/src/app.tsx new file mode 100644 index 0000000000..1ac31ebff3 --- /dev/null +++ b/apps/1test/src/app.tsx @@ -0,0 +1,8 @@ +import * as ReactDOM from 'react-dom'; +import { RemixUiXterminals } from './remix/ui/remix-ui-xterminals'; +import { xterm } from './renderer'; + +import { createRoot } from 'react-dom/client'; +const container = document.getElementById('app'); +const root = createRoot(container); // createRoot(container!) if you use TypeScript +root.render() \ No newline at end of file diff --git a/apps/1test/src/electron/engine.ts b/apps/1test/src/electron/engine.ts index d71e22511f..9a27037d47 100644 --- a/apps/1test/src/electron/engine.ts +++ b/apps/1test/src/electron/engine.ts @@ -3,14 +3,17 @@ import { ipcMain } from 'electron'; import { FSPlugin } from './fsPlugin'; import { GitPlugin } from './gitPlugin'; import { app } from 'electron'; +import { XtermPlugin } from './xtermPlugin'; const engine = new Engine() const appManager = new PluginManager() const fsPlugin = new FSPlugin() const gitPlugin = new GitPlugin() +const xtermPlugin = new XtermPlugin() engine.register(appManager) engine.register(fsPlugin) engine.register(gitPlugin) +engine.register(xtermPlugin) ipcMain.handle('manager:activatePlugin', async (event, arg) => { console.log('manager:activatePlugin', arg) diff --git a/apps/1test/src/electron/xtermPlugin.ts b/apps/1test/src/electron/xtermPlugin.ts new file mode 100644 index 0000000000..20f735b61a --- /dev/null +++ b/apps/1test/src/electron/xtermPlugin.ts @@ -0,0 +1,73 @@ +import { Plugin } from "@remixproject/engine"; +import { PluginClient } from "@remixproject/plugin"; +import { Profile } from "@remixproject/plugin-utils"; +import { spawn } from "child_process"; +import { createElectronClient } from "./lib/electronPluginClient"; + +import os from 'os'; +import * as pty from "node-pty" + +const profile: Profile = { + name: 'xterm', + displayName: 'xterm', + description: 'xterm plugin', +} + +export class XtermPlugin extends Plugin { + client: PluginClient + constructor() { + super(profile) + } + + onActivation(): void { + this.client = new XtermPluginClient() + } + +} + +class XtermPluginClient extends PluginClient { + terminals: pty.IPty[] = [] + constructor() { + super() + this.methods = ['keystroke', 'createTerminal', 'close'] + createElectronClient(this, profile) + this.onload(() => { + console.log('XtermPluginClient onload') + }) + } + + async keystroke(key: string, pid: number): Promise { + console.log('keystroke', key) + this.terminals[pid].write(key) + } + + async createTerminal(path?: string): Promise{ + const shell = os.platform() === 'win32' ? 'powershell.exe' : 'bash'; + + const ptyProcess = pty.spawn(shell, [], { + name: 'xterm-color', + cols: 80, + rows: 30, + cwd: path || process.cwd() , + env: process.env + }); + + ptyProcess.onData((data: string) => { + this.sendData(data, ptyProcess.pid); + }) + this.terminals[ptyProcess.pid] = ptyProcess + console.log('create terminal', ptyProcess.pid) + return ptyProcess.pid + } + + async close(pid: number): Promise{ + this.terminals[pid].kill() + delete this.terminals[pid] + this.emit('close', pid) + } + + async sendData(data: string, pid: number){ + this.emit('data', data, pid) + } + +} \ No newline at end of file diff --git a/apps/1test/src/index.html b/apps/1test/src/index.html index a37c733059..e62f79d97f 100644 --- a/apps/1test/src/index.html +++ b/apps/1test/src/index.html @@ -1,7 +1,11 @@ + + Hello Terminal! + +
- + \ No newline at end of file diff --git a/apps/1test/src/index.ts b/apps/1test/src/index.ts index b9e66dbf95..73bb8edb47 100644 --- a/apps/1test/src/index.ts +++ b/apps/1test/src/index.ts @@ -18,7 +18,7 @@ const createWindow = (): void => { // Create the browser window. mainWindow = new BrowserWindow({ height: 800, - width: 600, + width: 1024, webPreferences: { preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY }, @@ -27,9 +27,9 @@ const createWindow = (): void => { // and load the index.html of the app. mainWindow.loadURL(MAIN_WINDOW_WEBPACK_ENTRY); - //mainWindow.maximize(); + mainWindow.maximize(); // Open the DevTools. - mainWindow.webContents.openDevTools(); + //mainWindow.webContents.openDevTools(); require('./electron/engine') }; diff --git a/apps/1test/src/preload.ts b/apps/1test/src/preload.ts index 6ca1555b34..f216faaf5e 100644 --- a/apps/1test/src/preload.ts +++ b/apps/1test/src/preload.ts @@ -6,7 +6,7 @@ console.log('preload.ts') /* preload script needs statically defined API for each plugin */ -const exposedPLugins = ['fs', 'git'] +const exposedPLugins = ['fs', 'git', 'xterm'] contextBridge.exposeInMainWorld('electronAPI', { activatePlugin: (name: string) => { diff --git a/apps/1test/src/remix/lib/electronPlugin.ts b/apps/1test/src/remix/lib/electronPlugin.ts index 0aa82a364f..1286a4c2af 100644 --- a/apps/1test/src/remix/lib/electronPlugin.ts +++ b/apps/1test/src/remix/lib/electronPlugin.ts @@ -24,6 +24,8 @@ export abstract class ElectronPlugin extends Plugin { } }) + if(!this.api) throw new Error(`ElectronPluginConnector requires window.api.plugins.${profile.name} to be defined in preload.ts`) + this.api.on((event: any, message: any) => { this.getMessage(message) }) diff --git a/apps/1test/src/remix/ui/remix-ui-xterm.tsx b/apps/1test/src/remix/ui/remix-ui-xterm.tsx new file mode 100644 index 0000000000..8003f790b2 --- /dev/null +++ b/apps/1test/src/remix/ui/remix-ui-xterm.tsx @@ -0,0 +1,49 @@ +import React, { useState, useEffect, forwardRef } from 'react' // eslint-disable-line +import { ElectronPlugin } from '../lib/electronPlugin' +import { XTerm } from 'xterm-for-react' + + +export interface RemixUiXtermProps { + plugin: ElectronPlugin + pid: number + send: (data: string, pid: number) => void + data: string + timeStamp: number + setTerminalRef: (pid: number, ref: any) => void +} + +const RemixUiXterm = (props: RemixUiXtermProps) => { + const { plugin, pid, send, data, timeStamp } = props + const xtermRef = React.useRef(null) + + useEffect(() => { + console.log('remix-ui-xterm', pid) + }, [timeStamp]) + + useEffect(() => { + console.log('remix-ui-xterm ref', xtermRef.current) + props.setTerminalRef(pid, xtermRef.current) + }, [xtermRef.current]) + + const onKey = (event: { key: string; domEvent: KeyboardEvent }) => { + send(event.key, pid) + } + + const onData = (data: string) => { + console.log('onData', data) + } + + const closeTerminal = () => { + plugin.call('xterm', 'close', pid) + } + + return ( + <> + + + + ) + +} + +export default RemixUiXterm \ No newline at end of file diff --git a/apps/1test/src/remix/ui/remix-ui-xterminals.tsx b/apps/1test/src/remix/ui/remix-ui-xterminals.tsx new file mode 100644 index 0000000000..a2406bebf0 --- /dev/null +++ b/apps/1test/src/remix/ui/remix-ui-xterminals.tsx @@ -0,0 +1,95 @@ +import React, { useState, useEffect } from 'react' // eslint-disable-line +import { ElectronPlugin } from '../lib/electronPlugin' +import RemixUiXterm from './remix-ui-xterm' + +export interface RemixUiXterminalsProps { + plugin: ElectronPlugin +} + +export interface xtermState { + pid: number + data: string + timeStamp: number + ref: any +} + +export const RemixUiXterminals = (props: RemixUiXterminalsProps) => { + const [terminals, setTerminals] = useState([]) // eslint-disable-line + const { plugin } = props + + useEffect(() => { + plugin.on('xterm', 'loaded', async () => { + console.log('xterms loaded') + + }) + plugin.on('xterm', 'data', async (data: string, pid: number) => { + console.log('xterm data', data, pid) + + writeToTerminal(data, pid) + }) + + plugin.on('xterm', 'close', async (pid: number) => { + console.log('xterm close', pid) + setTerminals(prevState => { + return prevState.filter(xtermState => xtermState.pid !== pid) + }) + }) + }, []) + + const writeToTerminal = (data: string, pid: number) => { + setTerminals(prevState => { + const terminal = prevState.find(xtermState => xtermState.pid === pid) + if (terminal.ref && terminal.ref.terminal) { + terminal.ref.terminal.write(data) + } + return [...prevState] + }) + } + + + useEffect(() => { + console.log('terminals', terminals) + }, [terminals]) + + const send = (data: string, pid: number) => { + console.log('send', data) + plugin.call('xterm', 'keystroke', data, pid) + } + + const createTerminal = async () => { + const pid = await plugin.call('xterm', 'createTerminal') + console.log('pid', pid) + + setTerminals(prevState => { + return [...prevState, { + pid: pid, + data: '', + timeStamp: Date.now(), + ref: null + }] + }) + } + + const setTerminalRef = (pid: number, ref: any) => { + setTerminals(prevState => { + prevState.find(xtermState => xtermState.pid === pid).ref = ref + return [...prevState] + }) + } + + + return (<> + + + {terminals.map((xtermState) => { + return ( +
{xtermState.pid} + +
+ ) + })} + ) +} + diff --git a/apps/1test/src/remix/xtermPlugin.ts b/apps/1test/src/remix/xtermPlugin.ts new file mode 100644 index 0000000000..e1bb464fe4 --- /dev/null +++ b/apps/1test/src/remix/xtermPlugin.ts @@ -0,0 +1,13 @@ +import { ElectronPlugin } from './lib/electronPlugin'; + +export class xtermPlugin extends ElectronPlugin { + + constructor(){ + super({ + displayName: 'xterm', + name: 'xterm', + description: 'xterm', + }) + } + +} \ No newline at end of file diff --git a/apps/1test/src/renderer.ts b/apps/1test/src/renderer.ts index 614a568af6..86061f9d98 100644 --- a/apps/1test/src/renderer.ts +++ b/apps/1test/src/renderer.ts @@ -2,10 +2,17 @@ import { Engine, PluginManager } from '@remixproject/engine'; import { fsPlugin } from './remix/fsPlugin'; import { gitPlugin } from './remix/gitPlugin'; - +import { Terminal } from 'xterm'; +import 'xterm/css/xterm.css'; +import { FitAddon } from 'xterm-addon-fit'; +import { xtermPlugin } from './remix/xtermPlugin'; class MyAppManager extends PluginManager { onActivation(): void { + this.on('fs', 'loaded', async () => { + console.log('fs loaded') + }) + /* this.on('fs', 'loaded', async () => { const files = await this.call('fs', 'readdir', './') console.log('files', files) @@ -28,8 +35,34 @@ class MyAppManager extends PluginManager { }) this.on('git', 'loaded', async () => { - const log = await this.call('git', 'log', '/Volumes/bunsen/code/rmproject2/remix-project/') - console.log('log', log) + //const log = await this.call('git', 'log', '/Volumes/bunsen/code/rmproject2/remix-project/') + //console.log('log', log) + }) + */ + this.on('xterm', 'loaded', async () => { + console.log('xterm loaded') + /* + const term = new Terminal(); + const fitAddon = new FitAddon(); + term.loadAddon(fitAddon); + term.open(document.getElementById('terminal')); + fitAddon.fit(); + + + const pid = await this.call('xterm', 'createTerminal') + console.log('pid', pid) + this.on('xterm', 'data', (data: string, pid: number) => { + console.log('data', data) + term.write(data) + } + ) + + term.onData((data) => { + console.log('term.onData', data) + this.call('xterm', 'keystroke', data, pid) + } + ); + */ }) } } @@ -39,11 +72,14 @@ const engine = new Engine() const appManager = new MyAppManager() const fs = new fsPlugin() const git = new gitPlugin() +export const xterm = new xtermPlugin() engine.register(appManager) engine.register(fs) engine.register(git) +engine.register(xterm) appManager.activatePlugin('fs') appManager.activatePlugin('git') +appManager.activatePlugin('xterm') setTimeout(async () => { @@ -51,3 +87,7 @@ setTimeout(async () => { console.log('files', files) }, 1000) + + +import './app' + diff --git a/apps/1test/tsconfig.json b/apps/1test/tsconfig.json index 92db0d6da1..de9d4e5a4f 100644 --- a/apps/1test/tsconfig.json +++ b/apps/1test/tsconfig.json @@ -3,6 +3,7 @@ "target": "ES6", "allowJs": true, "module": "commonjs", + "jsx": "react-jsx", "skipLibCheck": true, "esModuleInterop": true, "noImplicitAny": true, diff --git a/apps/1test/yarn.lock b/apps/1test/yarn.lock index 22b67f8b30..b68096ced1 100644 --- a/apps/1test/yarn.lock +++ b/apps/1test/yarn.lock @@ -355,9 +355,9 @@ integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== "@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -397,7 +397,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/source-map@^0.3.2": +"@jridgewell/source-map@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== @@ -684,6 +684,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + "@types/qs@*": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" @@ -694,6 +699,22 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== +"@types/react-dom@^18.2.4": + version "18.2.4" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.4.tgz#13f25bfbf4e404d26f62ac6e406591451acba9e0" + integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.2.8": + version "18.2.8" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.8.tgz#a77dcffe4e9af148ca4aa8000c51a1e8ed99e2c8" + integrity sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" @@ -706,6 +727,11 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + "@types/semver@^7.3.12": version "7.5.0" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" @@ -1005,7 +1031,7 @@ acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: +acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -1774,6 +1800,11 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2057,9 +2088,9 @@ electron-squirrel-startup@^1.0.0: debug "^2.2.0" electron-to-chromium@^1.4.411: - version "1.4.414" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.414.tgz#f9eedb6fb01b50439d8228d8ee3a6fa5e0108437" - integrity sha512-RRuCvP6ekngVh2SAJaOKT/hxqc9JAsK+Pe0hP5tGQIfonU2Zy9gMGdJ+mBdyl/vNucMG6gkXYtuM4H/1giws5w== + version "1.4.417" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.417.tgz#a0c7eb992e68287fa50c8da5a5238b01f20b9a82" + integrity sha512-8rY8HdCxuSVY8wku3i/eDac4g1b4cSbruzocenrqBlzqruAZYHjQCHIjC66dLR9DXhEHTojsC4EjhZ8KmzwXqA== electron-winstaller@^5.0.0: version "5.1.0" @@ -2714,9 +2745,9 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: minipass "^3.0.0" fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + version "1.0.4" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" + integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== fs.realpath@^1.0.0: version "1.0.0" @@ -3525,7 +3556,7 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -3746,6 +3777,13 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -4010,6 +4048,11 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" +nan@^2.14.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" @@ -4049,9 +4092,9 @@ no-case@^3.0.4: tslib "^2.0.3" node-abi@^3.0.0: - version "3.40.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.40.0.tgz#51d8ed44534f70ff1357dfbc3a89717b1ceac1b4" - integrity sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA== + version "3.43.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.43.0.tgz#468dc09af3c262ef2fb3a0d2ff34cf8fba61952a" + integrity sha512-QB0MMv+tn9Ur2DtJrc8y09n0n6sw88CyDniWSX2cHW10goQXYPK9ZpFJOktDS4ron501edPX6h9i7Pg+RnH5nQ== dependencies: semver "^7.3.5" @@ -4102,6 +4145,13 @@ node-loader@^2.0.0: dependencies: loader-utils "^2.0.0" +node-pty@0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.10.1.tgz#cd05d03a2710315ec40221232ec04186f6ac2c6d" + integrity sha512-JTdtUS0Im/yRsWJSx7yiW9rtpfmxqxolrtnyKwPLI+6XqTAPW/O2MjS8FYL4I5TsMbH2lVgDb2VMjp+9LoQGNg== + dependencies: + nan "^2.14.0" + node-releases@^2.0.12: version "2.0.12" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" @@ -4165,6 +4215,11 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" @@ -4573,6 +4628,15 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -4640,6 +4704,26 @@ rcedit@^3.0.1: dependencies: cross-spawn-windows-exe "^1.1.0" +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -4871,6 +4955,13 @@ safe-regex-test@^1.0.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + schema-utils@^3.1.1, schema-utils@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" @@ -5375,12 +5466,12 @@ terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.10.0, terser@^5.16.8: - version "5.17.6" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.6.tgz#d810e75e1bb3350c799cd90ebefe19c9412c12de" - integrity sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ== + version "5.17.7" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.7.tgz#2a8b134826fe179b711969fd9d9a0c2479b2a8c3" + integrity sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -5730,9 +5821,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.69.1: - version "5.84.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.84.1.tgz#d4493acdeca46b26ffc99d86d784cabfeb925a15" - integrity sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg== + version "5.85.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.85.0.tgz#c14a6a3a91f84d67c450225661fda8da36bc7f49" + integrity sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -5883,16 +5974,34 @@ xterm-addon-fit@^0.5.0: resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz#2d51b983b786a97dcd6cde805e700c7f913bc596" integrity sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ== +xterm-addon-fit@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz#b8ade6d96e63b47443862088f6670b49fb752c6a" + integrity sha512-tQgHGoHqRTgeROPnvmtEJywLKoC/V9eNs4bLLz7iyJr1aW/QFzRwfd3MGiJ6odJd9xEfxcW36/xRU47JkD5NKQ== + xterm-addon-search@^0.8.0: version "0.8.2" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.8.2.tgz#be7aa74d5ff12c901707c6ff674229f214318032" integrity sha512-I1863mjn8P6uVrqm/X+btalVsqjAKLhnhpbP7SavAOpEkI1jJhbHU2UTp7NjeRtcKTks6UWk/ycgds5snDSejg== -xterm@^4.9.0: +xterm-for-react@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/xterm-for-react/-/xterm-for-react-1.0.4.tgz#6b35b9b037a0f9d979e7b57bb1d7c6ab7565b380" + integrity sha512-DCkLR9ZXeW907YyyaCTk/3Ol34VRHfCnf3MAPOkj3dUNA85sDqHvTXN8efw4g7bx7gWdJQRsEpGt2tJOXKG3EQ== + dependencies: + prop-types "^15.7.2" + xterm "^4.5.0" + +xterm@^4.5.0, xterm@^4.9.0: version "4.19.0" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0.tgz#c0f9d09cd61de1d658f43ca75f992197add9ef6d" integrity sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ== +xterm@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.1.0.tgz#3e160d60e6801c864b55adf19171c49d2ff2b4fc" + integrity sha512-LovENH4WDzpwynj+OTkLyZgJPeDom9Gra4DMlGAgz6pZhIDCQ+YuO7yfwanY+gVbn/mmZIStNOnVRU/ikQuAEQ== + y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"