@battlefieldduck/xterm-svelte 0.0.5

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 TatLead
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # xterm-svelte
2
+
3
+ [![Node.js Build](https://github.com/BattlefieldDuck/xterm-svelte/actions/workflows/node-build.yml/badge.svg)](https://github.com/BattlefieldDuck/xterm-svelte/actions/workflows/node-build.yml)
4
+
5
+
6
+ xterm-svelte is a wrapper for the [xterm.js](https://github.com/xtermjs/xterm.js) library, designed to work seamlessly with SvelteKit. This library allows you to embed a fully functional terminal in your SvelteKit application.
7
+
8
+ Live Demo: https://xterm-svelte.pages.dev
9
+
10
+ ## Features
11
+
12
+ - Full integration with SvelteKit.
13
+ - Xterm addons is managed in xterm-svelte
14
+ - Continuous package updates: xterm-svelte is regularly updated to ensure compatibility with the latest versions of SvelteKit and Xterm.js.
15
+
16
+ ## Installation
17
+
18
+ To install Xterm-Svelte, run the following command in your project directory:
19
+
20
+ ```bash
21
+ npm install @battlefieldduck/xterm-svelte
22
+ ```
23
+
24
+ ## Usage
25
+
26
+ Here's a basic example of how to use xterm-svelte in your SvelteKit application:
27
+
28
+ ```svelte
29
+ <script lang="ts">
30
+ import { Xterm } from '@battlefieldduck/xterm-svelte';
31
+ import type { ITerminalOptions, ITerminalInitOnlyOptions, Terminal } from '@battlefieldduck/xterm-svelte';
32
+
33
+ let options: ITerminalOptions & ITerminalInitOnlyOptions = {};
34
+
35
+ async function onLoad(event: CustomEvent<{ terminal: Terminal }>) {
36
+ console.log('Child component has loaded');
37
+ const terminal = event.detail.terminal;
38
+
39
+ // FitAddon Usage
40
+ const { FitAddon } = await XtermAddon.FitAddon();
41
+ const fitAddon = new FitAddon();
42
+ terminal.loadAddon(fitAddon);
43
+ fitAddon.fit();
44
+
45
+ terminal.write('Hello World');
46
+ }
47
+
48
+ function onData(event: CustomEvent<string>) {
49
+ const data = event.detail;
50
+ console.log('onData()', data);
51
+ }
52
+
53
+ function onKey(event: CustomEvent<{ key: string; domEvent: KeyboardEvent }>) {
54
+ const data = event.detail;
55
+ console.log('onKey()', data);
56
+ }
57
+ </script>
58
+
59
+ <Xterm {options} on:load={onLoad} on:data={onData} on:key={onKey} />
60
+ ```
61
+
62
+ ## Contributing
63
+ Contributions are welcome! Please feel free to submit pull requests or open issues.
64
+
65
+ ![https://github.com/BattlefieldDuck/xterm-svelte/graphs/contributors](https://contrib.rocks/image?repo=BattlefieldDuck/xterm-svelte)
66
+
67
+ ## License
68
+ xterm-svelte is licensed under the MIT License. See the `LICENSE` file for more details.
69
+
70
+ ## Stargazers over time
71
+ [![Stargazers over time](https://starchart.cc/BattlefieldDuck/xterm-svelte.svg?variant=adaptive)](https://starchart.cc/BattlefieldDuck/xterm-svelte)
@@ -0,0 +1,27 @@
1
+ <script>import "@xterm/xterm/css/xterm.css";
2
+ import { onMount, createEventDispatcher } from "svelte";
3
+ let parent;
4
+ let props = { ...$$restProps };
5
+ export let options = void 0;
6
+ const dispatch = createEventDispatcher();
7
+ onMount(async () => {
8
+ const { Terminal } = await import("@xterm/xterm");
9
+ const terminal = new Terminal(options);
10
+ terminal.onBell(() => dispatch("bell"));
11
+ terminal.onBinary((data) => dispatch("binary", data));
12
+ terminal.onCursorMove(() => dispatch("cursormove"));
13
+ terminal.onData((data) => dispatch("data", data));
14
+ terminal.onKey((data) => dispatch("key", data));
15
+ terminal.onLineFeed(() => dispatch("linefeed"));
16
+ terminal.onRender((data) => dispatch("render", data));
17
+ terminal.onWriteParsed(() => dispatch("writeparsed"));
18
+ terminal.onResize((data) => dispatch("resize", data));
19
+ terminal.onScroll((data) => dispatch("scroll", data));
20
+ terminal.onSelectionChange(() => dispatch("selectionchange"));
21
+ terminal.onTitleChange((data) => dispatch("titlechange", data));
22
+ terminal.open(parent);
23
+ dispatch("load", { terminal });
24
+ });
25
+ </script>
26
+
27
+ <div bind:this={parent} class={props.class} style={props.style}></div>
@@ -0,0 +1,45 @@
1
+ /// <reference types="@xterm/xterm" />
2
+ import { SvelteComponent } from "svelte";
3
+ import '@xterm/xterm/css/xterm.css';
4
+ import type { ITerminalOptions, ITerminalInitOnlyOptions } from './index.js';
5
+ declare const __propDef: {
6
+ props: {
7
+ [x: string]: any;
8
+ options?: (ITerminalOptions & ITerminalInitOnlyOptions) | undefined;
9
+ };
10
+ events: {
11
+ load: CustomEvent<{
12
+ terminal: import("@xterm/xterm").Terminal;
13
+ }>;
14
+ bell: CustomEvent<void>;
15
+ binary: CustomEvent<string>;
16
+ cursormove: CustomEvent<void>;
17
+ data: CustomEvent<string>;
18
+ key: CustomEvent<{
19
+ key: string;
20
+ domEvent: KeyboardEvent;
21
+ }>;
22
+ linefeed: CustomEvent<void>;
23
+ render: CustomEvent<{
24
+ start: number;
25
+ end: number;
26
+ }>;
27
+ writeparsed: CustomEvent<void>;
28
+ resize: CustomEvent<{
29
+ cols: number;
30
+ rows: number;
31
+ }>;
32
+ scroll: CustomEvent<number>;
33
+ selectionchange: CustomEvent<void>;
34
+ titlechange: CustomEvent<string>;
35
+ } & {
36
+ [evt: string]: CustomEvent<any>;
37
+ };
38
+ slots: {};
39
+ };
40
+ export type XtermProps = typeof __propDef.props;
41
+ export type XtermEvents = typeof __propDef.events;
42
+ export type XtermSlots = typeof __propDef.slots;
43
+ export default class Xterm extends SvelteComponent<XtermProps, XtermEvents, XtermSlots> {
44
+ }
45
+ export {};
@@ -0,0 +1,100 @@
1
+ /**
2
+ * The `XtermAddon` class provides static methods to dynamically import various addons for the xterm.js library.
3
+ */
4
+ export declare class XtermAddon {
5
+ /**
6
+ * Dynamically imports the 'attach' addon from `@xterm/addon-attach`.
7
+ * @returns A promise that resolves to the 'attach' addon module.
8
+ */
9
+ static AttachAddon: () => Promise<{
10
+ default: typeof import("@xterm/addon-attach");
11
+ AttachAddon: typeof import("@xterm/addon-attach").AttachAddon;
12
+ }>;
13
+ /**
14
+ * Dynamically imports the 'canvas' addon from `@xterm/addon-canvas`.
15
+ * For more details, visit: https://github.com/xtermjs/xterm.js/tree/master/addons/addon-canvas
16
+ * @returns A promise that resolves to the 'canvas' addon module.
17
+ */
18
+ static CanvasAddon: () => Promise<{
19
+ default: typeof import("@xterm/addon-canvas");
20
+ CanvasAddon: typeof import("@xterm/addon-canvas").CanvasAddon;
21
+ }>;
22
+ /**
23
+ * Dynamically imports the 'clipboard' addon from `@xterm/addon-clipboard`.
24
+ * @returns A promise that resolves to the 'clipboard' addon module.
25
+ */
26
+ static ClipboardAddon: () => Promise<{
27
+ default: typeof import("@xterm/addon-clipboard");
28
+ ClipboardAddon: typeof import("@xterm/addon-clipboard").ClipboardAddon;
29
+ ClipboardSelectionType: typeof import("@xterm/addon-clipboard").ClipboardSelectionType;
30
+ Base64: typeof import("@xterm/addon-clipboard").Base64;
31
+ BrowserClipboardProvider: typeof import("@xterm/addon-clipboard").BrowserClipboardProvider;
32
+ }>;
33
+ /**
34
+ * Dynamically imports the 'fit' addon from `@xterm/addon-fit`.
35
+ * @returns A promise that resolves to the 'fit' addon module.
36
+ */
37
+ static FitAddon: () => Promise<{
38
+ default: typeof import("@xterm/addon-fit");
39
+ FitAddon: typeof import("@xterm/addon-fit").FitAddon;
40
+ }>;
41
+ /**
42
+ * Dynamically imports the 'image' addon from `@xterm/addon-image`.
43
+ * @returns A promise that resolves to the 'image' addon module.
44
+ */
45
+ static ImageAddon: () => Promise<{
46
+ default: typeof import("@xterm/addon-image");
47
+ ImageAddon: typeof import("@xterm/addon-image").ImageAddon;
48
+ }>;
49
+ /**
50
+ * Dynamically imports the 'ligatures' addon from `@xterm/addon-ligatures`.
51
+ *
52
+ * This addon is designed to be used in environments with access to Node.js APIs (such as Electron).
53
+ *
54
+ * @returns A promise that resolves to the 'ligatures' addon module.
55
+ */
56
+ static LigaturesAddon: () => Promise<{
57
+ default: typeof import("@xterm/addon-ligatures");
58
+ LigaturesAddon: typeof import("@xterm/addon-ligatures").LigaturesAddon;
59
+ }>;
60
+ /**
61
+ * Dynamically imports the 'search' addon from `@xterm/addon-search`.
62
+ * @returns A promise that resolves to the 'search' addon module.
63
+ */
64
+ static SearchAddon: () => Promise<{
65
+ default: typeof import("@xterm/addon-search");
66
+ SearchAddon: typeof import("@xterm/addon-search").SearchAddon;
67
+ }>;
68
+ /**
69
+ * Dynamically imports the 'serialize' addon from `@xterm/addon-serialize`.
70
+ * @returns A promise that resolves to the 'serialize' addon module.
71
+ */
72
+ static SerializeAddon: () => Promise<{
73
+ default: typeof import("@xterm/addon-serialize");
74
+ SerializeAddon: typeof import("@xterm/addon-serialize").SerializeAddon;
75
+ }>;
76
+ /**
77
+ * Dynamically imports the 'unicode11' addon from `@xterm/addon-unicode11`.
78
+ * @returns A promise that resolves to the 'unicode11' addon module.
79
+ */
80
+ static Unicode11Addon: () => Promise<{
81
+ default: typeof import("@xterm/addon-unicode11");
82
+ Unicode11Addon: typeof import("@xterm/addon-unicode11").Unicode11Addon;
83
+ }>;
84
+ /**
85
+ * Dynamically imports the 'web-links' addon from `@xterm/addon-web-links`.
86
+ * @returns A promise that resolves to the 'web-links' addon module.
87
+ */
88
+ static WebLinksAddon: () => Promise<{
89
+ default: typeof import("@xterm/addon-web-links");
90
+ WebLinksAddon: typeof import("@xterm/addon-web-links").WebLinksAddon;
91
+ }>;
92
+ /**
93
+ * Dynamically imports the 'webgl' addon from `@xterm/addon-webgl`.
94
+ * @returns A promise that resolves to the 'webgl' addon module.
95
+ */
96
+ static WebglAddon: () => Promise<{
97
+ default: typeof import("@xterm/addon-webgl");
98
+ WebglAddon: typeof import("@xterm/addon-webgl").WebglAddon;
99
+ }>;
100
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The `XtermAddon` class provides static methods to dynamically import various addons for the xterm.js library.
3
+ */
4
+ export class XtermAddon {
5
+ /**
6
+ * Dynamically imports the 'attach' addon from `@xterm/addon-attach`.
7
+ * @returns A promise that resolves to the 'attach' addon module.
8
+ */
9
+ static AttachAddon = async () => await import('@xterm/addon-attach');
10
+ /**
11
+ * Dynamically imports the 'canvas' addon from `@xterm/addon-canvas`.
12
+ * For more details, visit: https://github.com/xtermjs/xterm.js/tree/master/addons/addon-canvas
13
+ * @returns A promise that resolves to the 'canvas' addon module.
14
+ */
15
+ static CanvasAddon = async () => await import('@xterm/addon-canvas');
16
+ /**
17
+ * Dynamically imports the 'clipboard' addon from `@xterm/addon-clipboard`.
18
+ * @returns A promise that resolves to the 'clipboard' addon module.
19
+ */
20
+ static ClipboardAddon = async () => await import('@xterm/addon-clipboard');
21
+ /**
22
+ * Dynamically imports the 'fit' addon from `@xterm/addon-fit`.
23
+ * @returns A promise that resolves to the 'fit' addon module.
24
+ */
25
+ static FitAddon = async () => await import('@xterm/addon-fit');
26
+ /**
27
+ * Dynamically imports the 'image' addon from `@xterm/addon-image`.
28
+ * @returns A promise that resolves to the 'image' addon module.
29
+ */
30
+ static ImageAddon = async () => await import('@xterm/addon-image');
31
+ /**
32
+ * Dynamically imports the 'ligatures' addon from `@xterm/addon-ligatures`.
33
+ *
34
+ * This addon is designed to be used in environments with access to Node.js APIs (such as Electron).
35
+ *
36
+ * @returns A promise that resolves to the 'ligatures' addon module.
37
+ */
38
+ static LigaturesAddon = async () => {
39
+ if (typeof process === 'undefined' || process.versions == null || process.versions.node == null) {
40
+ // This is not a Node.js environment
41
+ throw new Error('This module can only be imported in a Node.js environment');
42
+ }
43
+ return await import('@xterm/addon-ligatures');
44
+ };
45
+ /**
46
+ * Dynamically imports the 'search' addon from `@xterm/addon-search`.
47
+ * @returns A promise that resolves to the 'search' addon module.
48
+ */
49
+ static SearchAddon = async () => await import('@xterm/addon-search');
50
+ /**
51
+ * Dynamically imports the 'serialize' addon from `@xterm/addon-serialize`.
52
+ * @returns A promise that resolves to the 'serialize' addon module.
53
+ */
54
+ static SerializeAddon = async () => await import('@xterm/addon-serialize');
55
+ // This addon is not yet published to npm
56
+ // https://github.com/xtermjs/xterm.js/tree/master/addons/addon-unicode-graphemes
57
+ // static UnicodeGraphemesAddon = async () => await import('@xterm/addon-unicode-graphemes');
58
+ /**
59
+ * Dynamically imports the 'unicode11' addon from `@xterm/addon-unicode11`.
60
+ * @returns A promise that resolves to the 'unicode11' addon module.
61
+ */
62
+ static Unicode11Addon = async () => await import('@xterm/addon-unicode11');
63
+ /**
64
+ * Dynamically imports the 'web-links' addon from `@xterm/addon-web-links`.
65
+ * @returns A promise that resolves to the 'web-links' addon module.
66
+ */
67
+ static WebLinksAddon = async () => await import('@xterm/addon-web-links');
68
+ /**
69
+ * Dynamically imports the 'webgl' addon from `@xterm/addon-webgl`.
70
+ * @returns A promise that resolves to the 'webgl' addon module.
71
+ */
72
+ static WebglAddon = async () => await import('@xterm/addon-webgl');
73
+ }
@@ -0,0 +1,99 @@
1
+ import type { Terminal } from "@xterm/xterm";
2
+ export interface XtermEvent {
3
+ /**
4
+ * Adds an event listener for when the terminal is loaded.
5
+ * @returns an `IDisposable` to stop listening.
6
+ */
7
+ load: {
8
+ terminal: Terminal;
9
+ };
10
+ /**
11
+ * Adds an event listener for when the bell is triggered.
12
+ * @returns an `IDisposable` to stop listening.
13
+ */
14
+ bell: void;
15
+ /**
16
+ * Adds an event listener for when a binary event fires. This is used to
17
+ * enable non UTF-8 conformant binary messages to be sent to the backend.
18
+ * Currently this is only used for a certain type of mouse reports that
19
+ * happen to be not UTF-8 compatible.
20
+ * The event value is a JS string, pass it to the underlying pty as
21
+ * binary data, e.g. `pty.write(Buffer.from(data, 'binary'))`.
22
+ * @returns an `IDisposable` to stop listening.
23
+ */
24
+ binary: string;
25
+ /**
26
+ * Adds an event listener for the cursor moves.
27
+ * @returns an `IDisposable` to stop listening.
28
+ */
29
+ cursormove: void;
30
+ /**
31
+ * Adds an event listener for when a data event fires. This happens for
32
+ * example when the user types or pastes into the terminal. The event value
33
+ * is whatever `string` results, in a typical setup, this should be passed
34
+ * on to the backing pty.
35
+ * @returns an `IDisposable` to stop listening.
36
+ */
37
+ data: string;
38
+ /**
39
+ * Adds an event listener for when a key is pressed. The event value
40
+ * contains the string that will be sent in the data event as well as the
41
+ * DOM event that triggered it.
42
+ * @returns an `IDisposable` to stop listening.
43
+ */
44
+ key: {
45
+ key: string;
46
+ domEvent: KeyboardEvent;
47
+ };
48
+ /**
49
+ * Adds an event listener for when a line feed is added.
50
+ * @returns an `IDisposable` to stop listening.
51
+ */
52
+ linefeed: void;
53
+ /**
54
+ * Adds an event listener for when rows are rendered. The event value
55
+ * contains the start row and end rows of the rendered area (ranges from `0`
56
+ * to `Terminal.rows - 1`).
57
+ * @returns an `IDisposable` to stop listening.
58
+ */
59
+ render: {
60
+ start: number;
61
+ end: number;
62
+ };
63
+ /**
64
+ * Adds an event listener for when data has been parsed by the terminal,
65
+ * after {@link write} is called. This event is useful to listen for any
66
+ * changes in the buffer.
67
+ *
68
+ * This fires at most once per frame, after data parsing completes. Note
69
+ * that this can fire when there are still writes pending if there is a lot
70
+ * of data.
71
+ */
72
+ writeparsed: void;
73
+ /**
74
+ * Adds an event listener for when the terminal is resized. The event value
75
+ * contains the new size.
76
+ * @returns an `IDisposable` to stop listening.
77
+ */
78
+ resize: {
79
+ cols: number;
80
+ rows: number;
81
+ };
82
+ /**
83
+ * Adds an event listener for when a scroll occurs. The event value is the
84
+ * new position of the viewport.
85
+ * @returns an `IDisposable` to stop listening.
86
+ */
87
+ scroll: number;
88
+ /**
89
+ * Adds an event listener for when a selection change occurs.
90
+ * @returns an `IDisposable` to stop listening.
91
+ */
92
+ selectionchange: void;
93
+ /**
94
+ * Adds an event listener for when an OSC 0 or OSC 2 title change occurs.
95
+ * The event value is the new title.
96
+ * @returns an `IDisposable` to stop listening.
97
+ */
98
+ titlechange: string;
99
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ /// <reference types="@xterm/xterm" />
2
+ import Xterm from './Xterm.svelte';
3
+ import { XtermAddon } from './XtermAddon.js';
4
+ import type { XtermEvent } from './XtermEvent.js';
5
+ export { Xterm, XtermAddon };
6
+ export type * from '@xterm/xterm';
7
+ export type { XtermEvent };
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import Xterm from './Xterm.svelte';
2
+ import { XtermAddon } from './XtermAddon.js';
3
+ export { Xterm, XtermAddon };
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@battlefieldduck/xterm-svelte",
3
+ "version": "0.0.5",
4
+ "scripts": {
5
+ "dev": "vite dev",
6
+ "build": "vite build && npm run package",
7
+ "preview": "vite preview",
8
+ "package": "svelte-kit sync && svelte-package && publint",
9
+ "prepublishOnly": "npm run package",
10
+ "test": "npm run test:integration && npm run test:unit",
11
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
12
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
13
+ "lint": "prettier --check . && eslint .",
14
+ "format": "prettier --write .",
15
+ "test:integration": "playwright test",
16
+ "test:unit": "vitest"
17
+ },
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "svelte": "./dist/index.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "!dist/**/*.test.*",
27
+ "!dist/**/*.spec.*"
28
+ ],
29
+ "peerDependencies": {
30
+ "svelte": "^4.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "@playwright/test": "^1.28.1",
34
+ "@sveltejs/adapter-auto": "^3.0.0",
35
+ "@sveltejs/kit": "^2.5.7",
36
+ "@sveltejs/package": "^2.0.0",
37
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
38
+ "@types/eslint": "^8.56.0",
39
+ "@typescript-eslint/eslint-plugin": "^7.7.1",
40
+ "@typescript-eslint/parser": "^7.7.1",
41
+ "eslint": "^8.56.0",
42
+ "eslint-config-prettier": "^9.1.0",
43
+ "eslint-plugin-svelte": "^2.38.0",
44
+ "prettier": "^3.1.1",
45
+ "prettier-plugin-svelte": "^3.1.2",
46
+ "publint": "^0.2.7",
47
+ "svelte": "^4.2.7",
48
+ "svelte-check": "^3.7.0",
49
+ "tslib": "^2.4.1",
50
+ "typescript": "^5.0.0",
51
+ "vite": "^5.2.10",
52
+ "vitest": "^1.5.2"
53
+ },
54
+ "svelte": "./dist/index.js",
55
+ "types": "./dist/index.d.ts",
56
+ "type": "module",
57
+ "dependencies": {
58
+ "@xterm/addon-attach": "^0.11.0",
59
+ "@xterm/addon-canvas": "^0.7.0",
60
+ "@xterm/addon-clipboard": "^0.1.0",
61
+ "@xterm/addon-fit": "^0.10.0",
62
+ "@xterm/addon-image": "^0.8.0",
63
+ "@xterm/addon-ligatures": "^0.9.0",
64
+ "@xterm/addon-search": "^0.15.0",
65
+ "@xterm/addon-serialize": "^0.13.0",
66
+ "@xterm/addon-unicode11": "^0.8.0",
67
+ "@xterm/addon-web-links": "^0.11.0",
68
+ "@xterm/addon-webgl": "^0.18.0",
69
+ "@xterm/xterm": "^5.5.0"
70
+ }
71
+ }