ttty
v1.7.0
Published
A dead simple lightweight TypeScript terminal "emulator" that mimics terminal behaviour in the browser.
Downloads
221
Readme
ttty
A dead simple lightweight TypeScript terminal "emulator" that mimics terminal behaviour in browser.
Features:
- Tiny, dependency-free and built with modern JS
- Easy-to-add custom commands
- Events
- Command history
- Command arguments with validation
- "Foreground processes" imitation
Usage
With module bundler
Add the latest release with:
npm install ttty
or
yarn add ttty
Initialize the terminal in a particular DOM element with:
import { initTerminal } from 'ttty'
// ...
const terminal = initTerminal({ /* settings */ })
In a browser directly
<!-- As a global JS file -->
<script src="https://unpkg.com/ttty/dist/ttty.iife.js"></script>
ttty.initTerminal({ /* settings */ })
Initialize with parameters:
const settings = {
host: document.querySelector("#terminal"),
prompt: "user@ttty:~$ ",
commands: {
echo: {
name: "echo",
description: "a test command with one echo arg",
argDescriptions: ["a string to be echoed in console"],
func: ({ print }, argument) => { print(argument) }
},
test: {
name: "test",
description: "a test command with no args",
func: ({ print }) => { print("foo") }
},
multiply: {
name: "multiply",
description: "Multiply two numbers",
argDescriptions: ["number one", "number two"],
func: ({ print }, one, two) => { print(Number(one) * Number(two)) }
}
}
}
initTerminal(settings)
Working with the terminal
help
- Display a list of all commands with descriptions
command
- Execute a command. Will display "Usage: command [parameter 1 description] [parameter 2 description], etc.", when it requires arguments but is called without them.
API
initTerminal
| Method | Description | Parameters |
| ------------- | ------------- | ------------- |
| init(settings)
| Initialize a terminal in a given DOM element | settings
object. |
terminal
An object that's being passed to every command function & returned by initTerminal
| Method | Description | Parameters |
|----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|
| print(text, isCommand, scrollIntoView)
| Prints a given text in the terminal (accepts raw HTML) | text
- String, isCommand
- Boolean, optional, defaults to false. Count given string as a command (displays prompt & syntax highlight) |
| run(text)
| Emulates a command execution in a terminal (acts the same way as a user would have typed and pressed Enter) | text
- String |
| start()
| Starts a "foreground process": user input is blocked and command prompt never appears. | |
| stop()
| Stops "foreground process". | |
| type(text, speed, isCommand) => Promise<boolean>
| Prints a text with "typing" effect. Hides and blocks user input while typing. Resolves to either true
or false
depending on process interruption by the user. | text
- String, text to be printed. speed
- integer, miliseconds. The higher the number, the slower. isCommand
- Boolean, optional, defaults to false. Count given string as a command (displays prompt & syntax highlight) |
| setPrompt()
| Set terminal prompt | newPrompt
- String |
settings object
| Parameter | Description | Default |
| ------------- | ------------- | ------------- |
| host
: DOM element | A DOM element to initialize terminal in. | |
| welcomeMessage
: string | A welcome message that is being printed on initialization | |
| enableHelp
: boolean | Toggle default help
command that lists all the available commands and their descriptions. | true |
| prompt
: string | Terminal prompt | '$: ' |
| historyLength
: number | A maximum amount of commands that can be stored in the terminal history | 50 |
| history
: string[] | A default value for terminal history (can be used to preserve history across sessions) | [] |
| commands
: object | commands
object | |
commands object
| Parameter | Description |
| ------------- | ------------- |
| name
: string | Command name. |
| description
: string | Command description, used for the default help
command (when enabled). |
| argDescriptions
: string array | Array of strings that describe command line arguments in order of appearance. |
| func
: function(terminal, ...arguments) | Function. Accepts an array of parameters in order of appearance (i.e. function(terminal, one, two)
will correspond to two arguments passed as command one two
) |
Events
| Event | Description
| ------------- | ------------- |
| onInit
| Terminal initialization |
| onCommand
| Existing command executed |
| onCommand404
| Non-existing command executed |
| onProcessStart
| Process started |
| onProcessStop
| Process stopped |
| onProcessInterrupt
| Process interrupted with a keyboard |
Events are being dispatched by the DOM element passed on init, for example:
const term = document.getElementById('terminal');
term.addEventListener('onCommand', e => console.log("known command executed!"));
Custom styling
You can customize the look defining custom CSS variables. If you have multiple instances, you can even have each instance in its' own style!
| Variable | Description
| ------------- | ------------- |
| --terminal-bg-color
| Background color |
| --terminal-fg-color
| Text color |
| --terminal-font
| Terminal font-family |
| --terminal-accent-color
| Accent color |
| --terminal-error-color
| Error color |
Browser compatibility
ttty is built and distributed with ES6 in mind (including the minified package). You can always transpile & bundle it targeting your browser set of choice.
Browsers that do not support CSS variables (IE < 11) might not be able to make use of custom themes. In order to use ttty with older browsers please rebuild this with custom properties removed.