81 |
82 |
83 |
493 |
494 |
596 |
--------------------------------------------------------------------------------
/docs/css/app.85170694.css:
--------------------------------------------------------------------------------
1 | .vue-command--invert .vue-command__reverse-i-search .vue-command__reverse-i-search__input,.vue-command .vue-command__reverse-i-search .vue-command__reverse-i-search__input{caret-color:transparent;padding:0;width:0}.vue-command--invert .vue-command__multiline-query,.vue-command--invert .vue-command__multiline-query--invert,.vue-command--invert .vue-command__query,.vue-command--invert .vue-command__query--invert,.vue-command .vue-command__multiline-query,.vue-command .vue-command__multiline-query--invert,.vue-command .vue-command__query,.vue-command .vue-command__query--invert{display:flex}.vue-command--invert .vue-command__multiline-query--invert input,.vue-command--invert .vue-command__multiline-query input,.vue-command--invert .vue-command__query--invert input,.vue-command--invert .vue-command__query input,.vue-command .vue-command__multiline-query--invert input,.vue-command .vue-command__multiline-query input,.vue-command .vue-command__query--invert input,.vue-command .vue-command__query input{font:1rem Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace}.vue-command--invert .vue-command__multiline-query--invert .vue-command__multiline-query,.vue-command--invert .vue-command__multiline-query--invert .vue-command__multiline-query--invert,.vue-command--invert .vue-command__multiline-query--invert .vue-command__query__input,.vue-command--invert .vue-command__multiline-query--invert .vue-command__query__input--invert,.vue-command--invert .vue-command__multiline-query--invert .vue-command__reverse-i-search__input,.vue-command--invert .vue-command__multiline-query--invert .vue-command__reverse-i-search__input--invert,.vue-command--invert .vue-command__multiline-query .vue-command__multiline-query,.vue-command--invert .vue-command__multiline-query .vue-command__multiline-query--invert,.vue-command--invert .vue-command__multiline-query .vue-command__query__input,.vue-command--invert .vue-command__multiline-query .vue-command__query__input--invert,.vue-command--invert .vue-command__multiline-query .vue-command__reverse-i-search__input,.vue-command--invert .vue-command__multiline-query .vue-command__reverse-i-search__input--invert,.vue-command--invert .vue-command__query--invert .vue-command__multiline-query,.vue-command--invert .vue-command__query--invert .vue-command__multiline-query--invert,.vue-command--invert .vue-command__query--invert .vue-command__query__input,.vue-command--invert .vue-command__query--invert .vue-command__query__input--invert,.vue-command--invert .vue-command__query--invert .vue-command__reverse-i-search__input,.vue-command--invert .vue-command__query--invert .vue-command__reverse-i-search__input--invert,.vue-command--invert .vue-command__query .vue-command__multiline-query,.vue-command--invert .vue-command__query .vue-command__multiline-query--invert,.vue-command--invert .vue-command__query .vue-command__query__input,.vue-command--invert .vue-command__query .vue-command__query__input--invert,.vue-command--invert .vue-command__query .vue-command__reverse-i-search__input,.vue-command--invert .vue-command__query .vue-command__reverse-i-search__input--invert,.vue-command .vue-command__multiline-query--invert .vue-command__multiline-query,.vue-command .vue-command__multiline-query--invert .vue-command__multiline-query--invert,.vue-command .vue-command__multiline-query--invert .vue-command__query__input,.vue-command .vue-command__multiline-query--invert .vue-command__query__input--invert,.vue-command .vue-command__multiline-query--invert .vue-command__reverse-i-search__input,.vue-command .vue-command__multiline-query--invert .vue-command__reverse-i-search__input--invert,.vue-command .vue-command__multiline-query .vue-command__multiline-query,.vue-command .vue-command__multiline-query .vue-command__multiline-query--invert,.vue-command .vue-command__multiline-query .vue-command__query__input,.vue-command .vue-command__multiline-query .vue-command__query__input--invert,.vue-command .vue-command__multiline-query .vue-command__reverse-i-search__input,.vue-command .vue-command__multiline-query .vue-command__reverse-i-search__input--invert,.vue-command .vue-command__query--invert .vue-command__multiline-query,.vue-command .vue-command__query--invert .vue-command__multiline-query--invert,.vue-command .vue-command__query--invert .vue-command__query__input,.vue-command .vue-command__query--invert .vue-command__query__input--invert,.vue-command .vue-command__query--invert .vue-command__reverse-i-search__input,.vue-command .vue-command__query--invert .vue-command__reverse-i-search__input--invert,.vue-command .vue-command__query .vue-command__multiline-query,.vue-command .vue-command__query .vue-command__multiline-query--invert,.vue-command .vue-command__query .vue-command__query__input,.vue-command .vue-command__query .vue-command__query__input--invert,.vue-command .vue-command__query .vue-command__reverse-i-search__input,.vue-command .vue-command__query .vue-command__reverse-i-search__input--invert{border:none;outline:none}.vue-command--invert .vue-command__multiline-query--invert .vue-command__multiline-query,.vue-command--invert .vue-command__multiline-query--invert .vue-command__multiline-query--invert,.vue-command--invert .vue-command__multiline-query--invert .vue-command__query__input,.vue-command--invert .vue-command__multiline-query--invert .vue-command__query__input--invert,.vue-command--invert .vue-command__multiline-query .vue-command__multiline-query,.vue-command--invert .vue-command__multiline-query .vue-command__multiline-query--invert,.vue-command--invert .vue-command__multiline-query .vue-command__query__input,.vue-command--invert .vue-command__multiline-query .vue-command__query__input--invert,.vue-command--invert .vue-command__query--invert .vue-command__multiline-query,.vue-command--invert .vue-command__query--invert .vue-command__multiline-query--invert,.vue-command--invert .vue-command__query--invert .vue-command__query__input,.vue-command--invert .vue-command__query--invert .vue-command__query__input--invert,.vue-command--invert .vue-command__query .vue-command__multiline-query,.vue-command--invert .vue-command__query .vue-command__multiline-query--invert,.vue-command--invert .vue-command__query .vue-command__query__input,.vue-command--invert .vue-command__query .vue-command__query__input--invert,.vue-command .vue-command__multiline-query--invert .vue-command__multiline-query,.vue-command .vue-command__multiline-query--invert .vue-command__multiline-query--invert,.vue-command .vue-command__multiline-query--invert .vue-command__query__input,.vue-command .vue-command__multiline-query--invert .vue-command__query__input--invert,.vue-command .vue-command__multiline-query .vue-command__multiline-query,.vue-command .vue-command__multiline-query .vue-command__multiline-query--invert,.vue-command .vue-command__multiline-query .vue-command__query__input,.vue-command .vue-command__multiline-query .vue-command__query__input--invert,.vue-command .vue-command__query--invert .vue-command__multiline-query,.vue-command .vue-command__query--invert .vue-command__multiline-query--invert,.vue-command .vue-command__query--invert .vue-command__query__input,.vue-command .vue-command__query--invert .vue-command__query__input--invert,.vue-command .vue-command__query .vue-command__multiline-query,.vue-command .vue-command__query .vue-command__multiline-query--invert,.vue-command .vue-command__query .vue-command__query__input,.vue-command .vue-command__query .vue-command__query__input--invert{width:100%}.vue-command--invert .vue-command__multiline-query--invert .vue-command__multiline-query__prompt,.vue-command--invert .vue-command__multiline-query--invert .vue-command__query__prompt,.vue-command--invert .vue-command__multiline-query--invert .vue-command__query__prompt--invert,.vue-command--invert .vue-command__multiline-query .vue-command__multiline-query__prompt,.vue-command--invert .vue-command__multiline-query .vue-command__query__prompt,.vue-command--invert .vue-command__multiline-query .vue-command__query__prompt--invert,.vue-command--invert .vue-command__query--invert .vue-command__multiline-query__prompt,.vue-command--invert .vue-command__query--invert .vue-command__query__prompt,.vue-command--invert .vue-command__query--invert .vue-command__query__prompt--invert,.vue-command--invert .vue-command__query .vue-command__multiline-query__prompt,.vue-command--invert .vue-command__query .vue-command__query__prompt,.vue-command--invert .vue-command__query .vue-command__query__prompt--invert,.vue-command .vue-command__multiline-query--invert .vue-command__multiline-query__prompt,.vue-command .vue-command__multiline-query--invert .vue-command__query__prompt,.vue-command .vue-command__multiline-query--invert .vue-command__query__prompt--invert,.vue-command .vue-command__multiline-query .vue-command__multiline-query__prompt,.vue-command .vue-command__multiline-query .vue-command__query__prompt,.vue-command .vue-command__multiline-query .vue-command__query__prompt--invert,.vue-command .vue-command__query--invert .vue-command__multiline-query__prompt,.vue-command .vue-command__query--invert .vue-command__query__prompt,.vue-command .vue-command__query--invert .vue-command__query__prompt--invert,.vue-command .vue-command__query .vue-command__multiline-query__prompt,.vue-command .vue-command__query .vue-command__query__prompt,.vue-command .vue-command__query .vue-command__query__prompt--invert{margin-right:.25rem}.vue-command--invert .vue-command__multiline-query,.vue-command--invert .vue-command__multiline-query--invert,.vue-command .vue-command__multiline-query,.vue-command .vue-command__multiline-query--invert{display:flex}.vue-command--invert .vue-command__multiline-query--invert input::-moz-placeholder,.vue-command--invert .vue-command__multiline-query input::-moz-placeholder,.vue-command .vue-command__multiline-query--invert input::-moz-placeholder,.vue-command .vue-command__multiline-query input::-moz-placeholder{font:1rem Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace}.vue-command--invert .vue-command__multiline-query--invert input,.vue-command--invert .vue-command__multiline-query--invert input::placeholder,.vue-command--invert .vue-command__multiline-query input,.vue-command--invert .vue-command__multiline-query input::placeholder,.vue-command .vue-command__multiline-query--invert input,.vue-command .vue-command__multiline-query--invert input::placeholder,.vue-command .vue-command__multiline-query input,.vue-command .vue-command__multiline-query input::placeholder{font:1rem Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace}.vue-command--invert .vue-command__multiline-query--invert .vue-command__multiline-query__input,.vue-command--invert .vue-command__multiline-query--invert .vue-command__multiline-query__input--invert,.vue-command--invert .vue-command__multiline-query .vue-command__multiline-query__input,.vue-command--invert .vue-command__multiline-query .vue-command__multiline-query__input--invert,.vue-command .vue-command__multiline-query--invert .vue-command__multiline-query__input,.vue-command .vue-command__multiline-query--invert .vue-command__multiline-query__input--invert,.vue-command .vue-command__multiline-query .vue-command__multiline-query__input,.vue-command .vue-command__multiline-query .vue-command__multiline-query__input--invert{border:none;outline:none;flex:1;width:100%}.vue-command .vue-command__multiline-query .vue-command__multiline-query__input::-moz-placeholder,.vue-command .vue-command__multiline-query .vue-command__query__input::-moz-placeholder,.vue-command .vue-command__query .vue-command__multiline-query__input::-moz-placeholder,.vue-command .vue-command__query .vue-command__query__input::-moz-placeholder{color:hsla(0,0%,100%,.5)}.vue-command .vue-command__multiline-query .vue-command__multiline-query__input::placeholder,.vue-command .vue-command__multiline-query .vue-command__query__input::placeholder,.vue-command .vue-command__query .vue-command__multiline-query__input::placeholder,.vue-command .vue-command__query .vue-command__query__input::placeholder{color:hsla(0,0%,100%,.5)}.vue-command--invert .vue-command__multiline-query .vue-command__multiline-query__input::-moz-placeholder,.vue-command--invert .vue-command__multiline-query .vue-command__query__input--invert::-moz-placeholder,.vue-command--invert .vue-command__query--invert .vue-command__multiline-query__input::-moz-placeholder,.vue-command--invert .vue-command__query--invert .vue-command__query__input--invert::-moz-placeholder{color:rgba(0,0,0,.5)}.vue-command--invert .vue-command__multiline-query .vue-command__multiline-query__input::placeholder,.vue-command--invert .vue-command__multiline-query .vue-command__query__input--invert::placeholder,.vue-command--invert .vue-command__query--invert .vue-command__multiline-query__input::placeholder,.vue-command--invert .vue-command__query--invert .vue-command__query__input--invert::placeholder{color:rgba(0,0,0,.5)}.vue-command,.vue-command--invert{font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;overflow-x:hidden;overflow-y:hidden}.vue-command--invert .vue-command__bar--invert:after,.vue-command--invert .vue-command__bar--invert:before,.vue-command--invert .vue-command__bar:after,.vue-command--invert .vue-command__bar:before,.vue-command .vue-command__bar--invert:after,.vue-command .vue-command__bar--invert:before,.vue-command .vue-command__bar:after,.vue-command .vue-command__bar:before{display:table}.vue-command--invert .vue-command__bar--invert:after,.vue-command--invert .vue-command__bar:after,.vue-command .vue-command__bar--invert:after,.vue-command .vue-command__bar:after{clear:both}.vue-command--invert .vue-command__bar,.vue-command--invert .vue-command__bar--invert,.vue-command .vue-command__bar,.vue-command .vue-command__bar--invert{display:flex;font-family:-apple-system,BlinkMacSystemFont,sans-serif;justify-content:space-between;padding-bottom:10px;padding-left:10px;padding-right:10px;padding-top:10px;position:inherit}.vue-command--invert .vue-command__bar__button,.vue-command--invert .vue-command__bar__button--invert,.vue-command .vue-command__bar__button,.vue-command .vue-command__bar__button--invert{display:inline-block;border-radius:100%}.vue-command--invert .vue-command__bar__button--invert:before,.vue-command--invert .vue-command__bar__button:before,.vue-command .vue-command__bar__button--invert:before,.vue-command .vue-command__bar__button:before{content:" ";display:block;height:12px;width:12px}.vue-command--invert .vue-command__bar__button--invert:not(:last-child),.vue-command--invert .vue-command__bar__button:not(:last-child),.vue-command .vue-command__bar__button--invert:not(:last-child),.vue-command .vue-command__bar__button:not(:last-child){margin-right:8px}.vue-command--invert .vue-command__history,.vue-command--invert .vue-command__history--invert,.vue-command .vue-command__history,.vue-command .vue-command__history--invert{display:block;height:100%;line-height:1.33;margin:0;overflow:auto;padding:12px 12px 12px 12px;white-space:pre-line;word-break:break-all}.vue-command--invert .vue-command__history--invert ul,.vue-command--invert .vue-command__history ul,.vue-command .vue-command__history--invert ul,.vue-command .vue-command__history ul{list-style-type:none;margin:0;padding:0}.vue-command--invert .vue-command__history--invert input,.vue-command--invert .vue-command__history--invert textarea,.vue-command--invert .vue-command__history input,.vue-command--invert .vue-command__history textarea,.vue-command .vue-command__history--invert input,.vue-command .vue-command__history--invert textarea,.vue-command .vue-command__history input,.vue-command .vue-command__history textarea{background:none;border:none;flex:1;font-size:1rem;outline:none;overflow:hidden;resize:none;width:100%}.vue-command--invert .vue-command__history__entry--fullscreen,.vue-command .vue-command__history__entry--fullscreen{height:100%}.vue-command .vue-command__bar{color:#f1f1f1;background-color:#111316}.vue-command .vue-command__bar__title{color:#f1f1f1}.vue-command .vue-command__bar__button--close{background-color:#ff5f58}.vue-command .vue-command__bar__button--minimize{background-color:#ffbd2e}.vue-command .vue-command__bar__button--fullscreen{background-color:#29ca41}.vue-command .vue-command__history{background-color:#111316;color:#f1f1f1}.vue-command .vue-command__history input,.vue-command .vue-command__history textarea{background:none;color:#fff}.vue-command .vue-command__history input::-moz-placeholder,.vue-command .vue-command__history textarea::-moz-placeholder{color:hsla(0,0%,100%,.5)}.vue-command .vue-command__history input::placeholder,.vue-command .vue-command__history textarea::placeholder{color:hsla(0,0%,100%,.5)}.vue-command--invert .vue-command__bar--invert{background-color:#eeece9}.vue-command--invert .vue-command__bar__title--invert{color:#0e0e0e}.vue-command--invert .vue-command__bar__button--close--invert{background-color:#00a0a7}.vue-command--invert .vue-command__bar__button--minimize--invert{background-color:#0042d1}.vue-command--invert .vue-command__bar__button--fullscreen--invert{background-color:#d635be}.vue-command--invert .vue-command__history--invert{background-color:#eeece9;color:#0e0e0e}.vue-command--invert .vue-command__history--invert input,.vue-command--invert .vue-command__history--invert textarea{background:none;color:#000}.vue-command--invert .vue-command__history--invert input::-moz-placeholder,.vue-command--invert .vue-command__history--invert textarea::-moz-placeholder{color:rgba(0,0,0,.5)}.vue-command--invert .vue-command__history--invert input::placeholder,.vue-command--invert .vue-command__history--invert textarea::placeholder{color:rgba(0,0,0,.5)}div[data-v-d2d1666e],textarea[data-v-d2d1666e]{height:100%}@media(min-width:1200px){.container{max-width:720px}}.vue-command,.vue-command--invert{width:100%}.vue-command--invert ::-webkit-scrollbar,.vue-command ::-webkit-scrollbar{width:6px}.vue-command--invert .vue-command__bar,.vue-command--invert .vue-command__bar--invert,.vue-command .vue-command__bar,.vue-command .vue-command__bar--invert{border-top-right-radius:6px;border-top-left-radius:6px}.vue-command--invert .vue-command__history,.vue-command--invert .vue-command__history--invert,.vue-command .vue-command__history,.vue-command .vue-command__history--invert{height:350px;border-bottom-right-radius:6px;border-bottom-left-radius:6px}.vue-command ::-webkit-scrollbar-track{background:#252525}.vue-command ::-webkit-scrollbar-thumb{background:#f1f1f1}.vue-command ::-webkit-scrollbar-thumb:hover{background:#333}.vue-command--invert ::-webkit-scrollbar-track{background:#dadada}.vue-command--invert ::-webkit-scrollbar-thumb{background:#0e0e0e}.vue-command--invert ::-webkit-scrollbar-thumb:hover{background:#ccc}
2 | /*# sourceMappingURL=app.85170694.css.map */
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vue-command
2 |
3 | A fully working, most feature-rich Vue.js terminal emulator. See the
4 | [demo](https://ndabap.github.io/vue-command/) and check the demo
5 | [source code](https://github.com/ndabAP/vue-command/blob/master/src/hosted/App.vue).
6 | In contrast to other terminal emulators, commands are not just
7 | mappings to strings but are native components with injectable
8 | environment variables.
9 |
10 | ## Features
11 |
12 | - Simple, yet extensible API
13 | - Supports asynchronous commands
14 | - Supports fullscreen mode
15 | - Customize the terminal with slots
16 | - Provide your own parser (falls back to simple one)
17 | - Multiline support (with \\)
18 | - Autocompletion resolver (with ↹)
19 | - Browse history (with ↑/↓)
20 | - Search history (with Ctrl + r)
21 | - Provide your own event resolver to support additional keyboard events
22 |
23 | ## Installation
24 |
25 | ```bash
26 | $ npm install vue-command --save
27 | ```
28 |
29 | ## Usage
30 |
31 | Let's start with a dead simple example. We want to send "Hello world" to
32 | `stdout` when entering `hello-world`.
33 |
34 | ```vue
35 |
36 |
37 |
38 |
39 |
55 | ```
56 |
57 | Now a more complex one. Let's assume we want to build the nano editor available
58 | in many shells.
59 |
60 | We inject `terminal` to make sure the editor is only visible when the terminal
61 | is in fullscreen mode and also a function called `exit` to tell the terminal
62 | that the command has been finished when the user enters
63 | Ctrl + x. Furthermore, we use `setFullscreen` to
64 | switch the terminal into fullscreen mode.
65 |
66 | ```vue
67 |
68 |
69 |
72 |
73 |
74 |
75 |
88 |
89 |
95 | ```
96 |
97 | Now the command has to return the component.
98 |
99 | ```vue
100 |
101 |
102 |
103 |
104 |
121 | ```
122 |
123 | ## Properties
124 |
125 | Some properties can be mutated by the terminal. Therefore, adding the `v-model`
126 | directive is required.
127 |
128 | | Property | Description | Type | Default value | Required | Two-way binding |
129 | | -------------------- | ------------------------------------------- | ---------- | ------------------------- | -------- | --------------- |
130 | | `commands` | See [Commands](#commands) | `Object` | `{}` | No | No |
131 | | `cursor-position` | Cursor position | `Number` | `0` | No | Yes |
132 | | `dispatched-queries` | Non-empty dispatched queries | `Set` | `new Set()` | No | Yes |
133 | | `event-resolver` | See [Event resolver](#event-resolver) | `Function` | `newDefaultEventResolver` | No | No |
134 | | `font` | Terminal font | `String` | `''` | No | No |
135 | | `help-text` | Command help | `String` | `''` | No | Yes |
136 | | `help-timeout` | Command help timeout | `Number` | `3000` | No | No |
137 | | `hide-bar` | Hides the bar | `Boolean` | `false` | No | No |
138 | | `hide-buttons` | Hides the buttons | `Boolean` | `false` | No | No |
139 | | `hide-prompt` | Hides the prompt | `Boolean` | `false` | No | No |
140 | | `hide-title` | Hides the title | `Boolean` | `false` | No | No |
141 | | `history` | Terminal history | `Array` | `[]` | No | Yes |
142 | | `history-position` | Points to the latest dispatched query entry | `Number` | `0` | No | Yes |
143 | | `interpreter` | See [Interpreter](#interpreter) | `Function` | `null` | No | No |
144 | | `invert` | Inverts the terminals colors | `Boolean` | `false` | No | No |
145 | | `is-fullscreen` | Terminal fullscreen mode | `Boolean` | `false` | No | Yes |
146 | | `options-resolver` | See [Options resolver](#options-resolver) | `Function` | `null` | No | No |
147 | | `parser` | Query parser | `Function` | `defaultParser` | No | No |
148 | | `prompt` | Terminal prompt | `String` | `~$` | No | No |
149 | | `show-help` | Show query help | `Boolean` | `false` | No | No |
150 | | `title` | Terminal title | `String` | `~$` | No | No |
151 | | `query` | Terminal query | `String` | `''` | No | Yes |
152 |
153 | ### Commands
154 |
155 | `commands` must be an object containing key-value pairs where key is the command
156 | and the value is a function that will be called with the parsed arguments. The
157 | function can return a `Promise` and must return or resolve a Vue.js component.
158 | To return strings or a new query, use one of the convenient helper methods.
159 |
160 | Any component that is not the query component can inject the context. The
161 | context includes the parsed and raw query as fields.
162 |
163 | ### Event resolver
164 |
165 | It's possible to provide an array property `eventResolver` which is called when
166 | the terminal is mounted. Each event resolver will be called with the terminals
167 | references and exposed values.
168 |
169 | The libraries `defaultHistoryEventResolver` makes usage of that and allows to
170 | cycle through commands with ↑/↓.
171 |
172 | ### Options resolver
173 |
174 | The terminal provides a built-in autocompletion for the given commands. As soon
175 | as the query has been autocompleted by the terminal, it's calling the options
176 | resolver provided as property. The resolver is called with the program, parsed
177 | query and a setter to update the query.
178 |
179 | ### Interpreter
180 |
181 | An interpreter allows to execute arbitrary code after the query has been
182 | dispatched and to not rely on missing functionality which includes pipes,
183 | streams or running multiple commands in parallel.
184 |
185 | The interpreter is a property function that is called with the unparsed query
186 | right after the query component calls `dispatch` and terminates it at the same
187 | time. After the call, you must use the [properties](#properties) and
188 | [exposed functions](#exposed) to reach the desired behaviour.
189 |
190 | ## Slots
191 |
192 | ### Bar
193 |
194 | You can replace the whole terminal bar with the named slot `bar`. This will
195 | replace the whole element, including the action buttons and its assigned CSS
196 | classes. Example:
197 |
198 | ```vue
199 |
200 |
201 | ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
202 |
203 |
204 | ```
205 |
206 | ### Buttons
207 |
208 | Inside the bar, you can customize the buttons. If you use this slot,
209 | `hideButtons` property has no effect. Example:
210 |
211 | ```vue
212 |
213 |
214 | × _ □
215 |
216 |
217 | ```
218 |
219 | ### Title
220 |
221 | Inside the bar, you can customize the title. If you use this slot, `hideTitle`
222 | and `title` property have no effect. Example:
223 |
224 | ```vue
225 |
226 |
227 | bash - 720x350
228 |
229 |
230 | ```
231 |
232 | ### Prompt
233 |
234 | You can overwrite the prompt with the prompt slot. If you use this slot,
235 | `hidePrompt` and `prompt` property have no effect. Example:
236 |
237 | ```vue
238 |
239 |
240 | ~$
241 |
242 |
243 | ```
244 |
245 | ## Library
246 |
247 | Library provides helper methods to render terminal related content.
248 |
249 | | Function | Parameters | Description |
250 | | ----------------------------- | ------------------------------------------------------------------ | ------------------------------------- |
251 | | `createCommandNotFound` | `command, text = 'command not found', name = 'VueCommandNotFound'` | Creates a command not found component |
252 | | `createStderr` | `formatterOrText, name = 'VueCommandStderr'` | Creates a "stderr" component |
253 | | `createStdout` | `formatterOrText, name = 'VueCommandStdout'` | Creates a "stdout" component |
254 | | `createQuery` | | Creates a query component |
255 | | `defaultHistoryEventResolver` | `refs, eventProvider` | The default history event resolver |
256 | | `defaultParser` | `query` | The default parser |
257 | | `defaultSignalEventResolver` | `refs, eventProvider` | The default signal event resolver |
258 | | `jsonFormatter` | `value` | See [Formatters](#formatters) |
259 | | `listFormatter` | `...lis` | See [Formatters](#formatters) |
260 | | `newDefaultEventResolver` | | Returns a new default event resolver |
261 | | `newDefaultHistory` | | Returns a new default history |
262 | | `tableFormatter` | `rows` | See [Formatters](#formatters) |
263 | | `textFormatter` | `text, innerHtml = false` | See [Formatters](#formatters) |
264 |
265 | Helper methods can be imported by name:
266 |
267 | ```js
268 | import { createStdout, createQuery } from 'vue-command'
269 | ```
270 |
271 | ### Formatters
272 |
273 | The first argument of `createStdout` can be either a primitive
274 | (`Boolean`, `Number` or `String`) or a formatter. A formatter formats the
275 | content as a list or table or something else.
276 |
277 | | Function | Parameters |
278 | | ---------------- | ------------------------- |
279 | | `jsonFormatter` | `value` |
280 | | `listFormatter` | `...lis` |
281 | | `tableFormatter` | `rows` |
282 | | `textFormatter` | `text, innerHtml = false` |
283 |
284 | Formatters can be imported by name:
285 |
286 | ```js
287 | import { listFormatter } from 'vue-command'
288 | ```
289 |
290 | ## Provided
291 |
292 | | Identifier | Type | Parameters |
293 | | -------------------- | ---------- | -------------------------------- |
294 | | `addDispatchedQuery` | `Function` | `dispatchedQuery` |
295 | | `appendToHistory` | `Function` | `...components` |
296 | | `dispatch` | `Function` | `query` |
297 | | `decrementHistory` | `Function` | |
298 | | `exit` | `Function` | |
299 | | `context` | `Object` | |
300 | | `helpText` | `String` | |
301 | | `helpTimeout` | `Number` | |
302 | | `hidePrompt` | `Boolean` | |
303 | | `incrementHistory` | `Function` | |
304 | | `optionsResolver` | `Function` | `program, parsedQuery, setQuery` |
305 | | `parser` | `Function` | `query` |
306 | | `programs` | `Array` | |
307 | | `sendSignal` | `Function` | `signal` |
308 | | `setCursorPosition` | `Function` | `cursorPosition` |
309 | | `setFullscreen` | `Function` | `isFullscreen` |
310 | | `setHistoryPosition` | `Function` | `historyPosition` |
311 | | `setQuery` | `Function` | `query` |
312 | | `showHelp` | `Boolean` | |
313 | | `signals` | `Object` | |
314 | | `slots` | `Object` | |
315 | | `terminal` | `Object` | |
316 |
317 | Provider can be injected into your component by name:
318 |
319 | ```js
320 | inject: ['exit', 'terminal']
321 | ```
322 |
323 | ## Exposed
324 |
325 | | Identifier | Type | Parameters |
326 | | -------------------- | ---------- | ----------------- |
327 | | `addDispatchedQuery` | `Function` | `dispatchedQuery` |
328 | | `appendToHistory` | `Function` | `...components` |
329 | | `decrementHistory` | `Function` | |
330 | | `dispatch` | `Function` | `query` |
331 | | `exit` | `Function` | |
332 | | `incrementHistory` | `Function` | |
333 | | `programs` | `Array` | |
334 | | `sendSignal` | `Function` | `signal` |
335 | | `setCursorPosition` | `Function` | `cursorPosition` |
336 | | `setFullscreen` | `Function` | `isFullscreen` |
337 | | `setHistoryPosition` | `Function` | `historyPosition` |
338 | | `setQuery` | `Function` | `query` |
339 | | `signals` | `Object` | |
340 | | `terminal` | `Object` | |
341 |
342 | ## Events
343 |
344 | | Name | Description |
345 | | ------------------- | ---------------------------------- |
346 | | `closeClicked` | Emitted on button close click |
347 | | `minimizeClicked` | Emitted on button minimize click |
348 | | `fullscreenClicked` | Emitted on button fullscreen click |
349 |
350 | ## Signals
351 |
352 | You can send and receive signals like `SIGINT`, `SIGTERM` or `SIGKILL`. `SIGINT`
353 | is the only implemented signal for now. When the user presses
354 | Ctrl + c, you can listen to this event by providing a
355 | signal name and a callback:
356 |
357 | ```js
358 | const signals = inject('signals')
359 | const sigint = () => {
360 | // Tear down component
361 | };
362 | signals.on('SIGINT', sigint)
363 | ```
364 |
365 | To unsubscribe from the signal, pass the same signal name and callback you used
366 | to subscribe to the signal.
367 |
368 | ```js
369 | signals.off('SIGINT', sigint)
370 | ```
371 |
372 | The libraries query component makes usage of that and allows to cancel a query
373 | with `SIGINT` and appending `^C` to the query.
374 |
375 | ## Nice-to-haves
376 |
377 | These features didn't make it into the last release. If you would like to
378 | contribute please consult `CONTRIBUTING.md`.
379 |
380 | - Draggable terminal
381 | - More events (like query dispatched)
382 | - More key combinations
383 |
384 | ## Browser support
385 |
386 | This library uses the `ResizeObserver` to track if the terminal needs to scroll
387 | to the bottom. You may need a pollyfill to support your target browser.
388 |
389 | ## Projects using vue-command
390 |
391 | - [escrcpy](https://github.com/viarotel-org/escrcpy) - Display and control your Android device graphically with scrcpy (6k stars)
392 | - [linkandroid](https://github.com/modstart-lib/linkandroid) - Link Android and PC easily (1k stars)
393 | - [curvy-idle-game](https://github.com/n4n0GH/curvy-idle-game) - Short idle game
394 | where you get to pat her
395 | - [docker-management-dashboard](https://github.com/zero4994/docker-management-dashboard) - A management dashboard for your local docker containers
396 | - [saber-theme-klieh](https://github.com/krmax44/saber-theme-klieh) - A Saber
397 | theme mimicking a terminal
398 | - [ts-git](https://github.com/nfriend/ts-git) - A naïve implementation of git,
399 | written in TypeScript
400 | - [Venom](https://github.com/J0LGER/Venom) - Venom is a Command and Control framework
401 |
402 | ## Chuck Norris API
403 |
404 | The Chuck Norris jokes are comming from [this](https://api.chucknorris.io/) API.
405 | This library has no relation to Chuck Norris or the services provided by the
406 | API.
407 |
408 | ## Author
409 |
410 | [Julian Claus](https://www.julian-claus.de) and contributors. Special thanks to
411 | [krmax44](https://github.com/krmax44) for the amazing work!
412 |
413 | I apologize to some contributors that are not in the Git history anymore since I
414 | had to delete the repository because of problems with
415 | [semantic-release](https://github.com/semantic-release/semantic-release).
416 |
417 | ## License
418 |
419 | MIT
420 |
--------------------------------------------------------------------------------
/src/components/VueCommand.vue:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
13 |
18 |
19 |
22 |
30 |
38 |
46 |
47 |
48 |
49 |
52 | {{ title }}
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
71 |
84 |
85 |
92 |
93 |
94 |
95 |
96 |
97 |
586 |
587 |
763 |
--------------------------------------------------------------------------------
/docs/js/app.6128f5a3.js:
--------------------------------------------------------------------------------
1 | (function(e){function t(t){for(var r,i,l=t[0],s=t[1],u=t[2],b=0,j=[];bu.cursorPosition=e),"dispatched-queries":u.dispatchedQueries,"onUpdate:dispatchedQueries":t[1]||(t[1]=e=>u.dispatchedQueries=e),"is-fullscreen":u.isFullscreen,"onUpdate:isFullscreen":t[2]||(t[2]=e=>u.isFullscreen=e),history:u.history,"onUpdate:history":t[3]||(t[3]=e=>u.history=e),"history-position":u.historyPosition,"onUpdate:historyPosition":t[4]||(t[4]=e=>u.historyPosition=e),query:u.query,"onUpdate:query":t[5]||(t[5]=e=>u.query=e),commands:u.commands,font:u.font,"help-text":u.helpText,"help-timeout":u.helpTimeout,"hide-bar":u.hideBar,"hide-buttons":u.hideButtons,"hide-prompt":u.hidePrompt,"hide-title":u.hideTitle,invert:u.invert,prompt:u.prompt,"options-resolver":u.optionsResolver,"show-help":u.showHelp,title:u.title},null,8,["cursor-position","dispatched-queries","is-fullscreen","history","history-position","query","commands","font","help-text","help-timeout","hide-bar","hide-buttons","hide-prompt","hide-title","invert","prompt","options-resolver","show-help","title"])]),Object(r["g"])("div",l,[Object(r["g"])("table",s,[t[26]||(t[26]=Object(r["g"])("thead",null,[Object(r["g"])("tr",null,[Object(r["g"])("th",{scope:"col"}," Property "),Object(r["g"])("th",{scope:"col"}," Value ")])],-1)),Object(r["g"])("tbody",null,[Object(r["g"])("tr",null,[t[10]||(t[10]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"cursor-position")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.cursorPosition),1)])])]),Object(r["g"])("tr",null,[t[11]||(t[11]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"dispatched-queries")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.dispatchedQueries),1)])])]),Object(r["g"])("tr",null,[t[12]||(t[12]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"help-text")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.helpText),1)])])]),Object(r["g"])("tr",null,[t[13]||(t[13]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"help-timeout")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.helpTimeout),1)])])]),Object(r["g"])("tr",null,[t[14]||(t[14]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"hide-bar")])],-1)),Object(r["g"])("td",null,[Object(r["I"])(Object(r["g"])("input",{"onUpdate:modelValue":t[6]||(t[6]=e=>u.hideBar=e),class:"form-check-input",type:"checkbox",value:""},null,512),[[r["E"],u.hideBar]])])]),Object(r["g"])("tr",null,[t[15]||(t[15]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"hide-buttons")])],-1)),Object(r["g"])("td",null,[Object(r["I"])(Object(r["g"])("input",{"onUpdate:modelValue":t[7]||(t[7]=e=>u.hideButtons=e),class:"form-check-input",type:"checkbox",value:""},null,512),[[r["E"],u.hideButtons]])])]),Object(r["g"])("tr",null,[t[16]||(t[16]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"hide-prompt")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.hidePrompt),1)])])]),Object(r["g"])("tr",null,[t[17]||(t[17]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"hide-title")])],-1)),Object(r["g"])("td",null,[Object(r["I"])(Object(r["g"])("input",{"onUpdate:modelValue":t[8]||(t[8]=e=>u.hideTitle=e),class:"form-check-input",type:"checkbox",value:""},null,512),[[r["E"],u.hideTitle]])])]),Object(r["g"])("tr",null,[t[18]||(t[18]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"help-timeout")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.helpTimeout),1)])])]),Object(r["g"])("tr",null,[t[19]||(t[19]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"history")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.history),1)])])]),Object(r["g"])("tr",null,[t[20]||(t[20]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"history-position")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.historyPosition),1)])])]),Object(r["g"])("tr",null,[t[21]||(t[21]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"invert")])],-1)),Object(r["g"])("td",null,[Object(r["I"])(Object(r["g"])("input",{"onUpdate:modelValue":t[9]||(t[9]=e=>u.invert=e),class:"form-check-input",type:"checkbox",value:""},null,512),[[r["E"],u.invert]])])]),Object(r["g"])("tr",null,[t[22]||(t[22]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"is-fullscreen")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.isFullscreen),1)])])]),Object(r["g"])("tr",null,[t[23]||(t[23]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"prompt")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.prompt),1)])])]),Object(r["g"])("tr",null,[t[24]||(t[24]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"query")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.query),1)])])]),Object(r["g"])("tr",null,[t[25]||(t[25]=Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,"title")])],-1)),Object(r["g"])("td",null,[Object(r["g"])("pre",null,[Object(r["g"])("code",null,Object(r["B"])(u.title),1)])])])])])])])])])}c("33d1"),c("14d9"),c("1e70"),c("79a4"),c("c1a1"),c("8b00"),c("a4e7"),c("1e5a"),c("72c3"),c("ea98"),c("5b81");var a=c("2ef0");const b=Symbol("publish"),j=()=>{const e={};return{[b](t){const c=Object(a["get"])(e,t);if(!Object(a["isUndefined"])(c))for(const e of c)e()},on(t,c){Object(a["isUndefined"])(Object(a["get"])(e,t))&&Object(a["set"])(e,t,[]),e[t].push(c)},off(t,c){const r=Object(a["get"])(e,t);if(!Object(a["isUndefined"])(r))for(const[n,o]of Object(a["entries"])(r))if(Object(a["eq"])(c,o))return void e[t].splice(n,1)}}},O=(...e)=>{for(const t of e)if(!t)return!1;return!0},d=(...e)=>{for(const t of e)if(t)return!0;return!1},p=(e,t)=>e^t,h={class:"vue-command__query"},m=["disabled","placeholder","onKeydown","onKeyup"],f=["disabled","value","onClick","onKeyup"],v={key:0,class:"vue-command__reverse-i-search"},y={class:"vue-command__reverse-i-search-status"},g=["disabled","onKeydown","onKeyup"];var _={__name:"VueCommandQuery",setup(e,{expose:t}){const c=Object(r["m"])("appendToHistory"),n=Object(r["m"])("dispatch"),o=Object(r["m"])("hidePrompt"),i=Object(r["m"])("helpText"),l=Object(r["m"])("helpTimeout"),s=Object(r["m"])("optionsResolver"),u=Object(r["m"])("parser"),b=Object(r["m"])("programs"),j=Object(r["m"])("setCursorPosition"),_=Object(r["m"])("setQuery"),w=Object(r["m"])("showHelp"),q=Object(r["m"])("signals"),k=Object(r["m"])("slots"),x=Object(r["m"])("terminal"),P=Object(r["w"])(!1),C=Object(r["w"])(!1),S=Object(r["w"])(null),Q=Object(r["w"])(""),H=Object(r["w"])(""),K=Object(r["w"])(null),E=Object(r["w"])("reverse-i-search"),R=Object(r["w"])(null),$=x.value.prompt,z=Object(r["b"])(()=>o?Object(r["l"])(r["a"]):Object(a["isUndefined"])(k.prompt)?Object(r["l"])(r["a"],Object(r["l"])("span",{class:"vue-command__query__prompt"},$)):Object(r["l"])(r["a"],k.prompt())),J=Object(r["b"])(()=>Object(a["isEmpty"])(x.value.font)?{}:{font:"1rem "+x.value.font}),U=Object(r["v"])({query:""}),V=Object(r["v"])([]),N=Object(r["b"])(()=>e=>p(!C.value,O(C.value,Object(a["lt"])(e,Object(a["size"])(V)-1)))),A=Object(r["b"])(()=>e=>d(P.value,O(!Object(a["isEmpty"])(V),!Object(a["eq"])(e,Object(a["size"])(V)-1)))),G=Object(r["b"])(()=>d(P.value,!Object(a["isEmpty"])(V))),L=Object(r["b"])(()=>{if(Object(a["isEmpty"])(V))return U.query;const e=Object(a["last"])(V);return e}),D=Object(r["b"])(()=>d(!C.value,O(C.value,!Object(a["isEmpty"])(V)))),M=async()=>{const e=U.query;if(Object(a["isEmpty"])(e))return;const t=F(e),n=Object(a["head"])(t),o=[];for(const c of b.value)c.startsWith(n)&&o.push(c);switch(Object(a["size"])(o)){case 0:break;case 1:{const t=Object(a["head"])(o);if(O(Object(a["lt"])(Object(a["size"])(t),Object(a["size"])(Object(a["trimStart"])(e))),Object(a["isFunction"])(s),Object(a["isFunction"])(u)))return void s(t,u(e),_);Object(a["gt"])(Object(a["size"])(t),Object(a["size"])(Object(a["trimStart"])(e)))&&_(t);break}default:P.value=!0,c(T(I(...o))),await Object(r["o"])(),_(U.query)}},W=()=>{},X=()=>{if(C.value)return void K.value.focus();if(Object(a["isEmpty"])(V))return void R.value.focus();const e=Object(a["last"])(S.value);e.focus()},Y=async()=>{C.value=!1,await Object(r["o"])(),X()},Z=()=>{K.value.style.width=parseInt(H.value.length)+"ch"},ee=e=>{Object(a["set"])(V,Object(a["size"])(V)-1,e)},te=async()=>{C.value=!0,await Object(r["o"])(),K.value.focus()},ce=()=>{if(Object(a["isEmpty"])(V)&&(U.query=U.query+"^C"),!Object(a["isEmpty"])(V)){const e=Object(a["last"])(V);ee(e+"^C")}P.value=!0,c(B())},re=async()=>{if(O(Object(a["eq"])(L.value.at(-1),"\\"),!Object(a["eq"])(L.value.slice(-2),"\\\\"))){V.push(""),await Object(r["o"])();const e=Object(a["last"])(S.value);return void e.focus()}P.value=!0,C.value=!1;const e=U.query.concat(Object(a["join"])(V,"")).replaceAll(/(?{q.off("SIGINT",ce),oe(),ue(),se(),Q.value="",ie(),ne(),le()}),oe=Object(r["H"])(()=>U.query,async()=>{await Object(r["o"])(),j(R.value.selectionStart)}),ie=Object(r["H"])(V,async()=>{await Object(r["o"])();const e=Object(a["last"])(S.value);j(e.selectionStart)}),le=Object(r["H"])(H,()=>{for(const e of x.value.dispatchedQueries)if(e.startsWith(H.value))return Object(a["isEmpty"])(V)&&_(e),Object(a["isEmpty"])(V)||ee(e),void(E.value="reverse-i-search");E.value="failed reverse-i-search"}),se=Object(r["H"])(()=>x.value.cursorPosition,async e=>{await Object(r["o"])(),R.value.setSelectionRange(e,e)}),ue=Object(r["H"])(()=>x.value.query,async e=>{await Object(r["o"])(),U.query=e});return Object(r["s"])(()=>{if(q.on("SIGINT",ce),_(""),j(0),R.value.focus(),w){const e=setTimeout(()=>{P.value||(Q.value=i)},l),t=Object(r["H"])(P,()=>{clearTimeout(e),t()})}}),Object(r["r"])(()=>{q.off("SIGINT",ce)}),t({focus:X}),(e,t)=>(Object(r["t"])(),Object(r["f"])("div",null,[Object(r["I"])(Object(r["g"])("div",h,[Object(r["i"])(Object(r["C"])(z)),Object(r["I"])(Object(r["g"])("input",{ref_key:"queryRef",ref:R,"onUpdate:modelValue":t[0]||(t[0]=e=>U.query=e),class:"vue-command__query__input",disabled:G.value,placeholder:Q.value,style:Object(r["q"])(J.value),autocapitalize:"none",autocorrect:"off",type:"text",onClick:t[1]||(t[1]=t=>Object(r["C"])(j)(e.$refs.queryRef.selectionStart)),onKeydown:[Object(r["J"])(Object(r["K"])(M,["exact","prevent"]),["tab"]),t[2]||(t[2]=Object(r["J"])(Object(r["K"])(e=>te(),["ctrl","exact","prevent"]),["r"]))],onKeyup:[t[3]||(t[3]=Object(r["J"])(Object(r["K"])(t=>Object(r["C"])(j)(e.$refs.queryRef.selectionStart),["exact"]),["arrow-left"])),t[4]||(t[4]=Object(r["J"])(Object(r["K"])(t=>Object(r["C"])(j)(e.$refs.queryRef.selectionStart),["exact"]),["arrow-right"])),t[5]||(t[5]=Object(r["J"])(Object(r["K"])(t=>Object(r["C"])(j)(e.$refs.queryRef.selectionStart),["exact"]),["end"])),Object(r["J"])(Object(r["K"])(re,["exact"]),["enter"])]},null,44,m),[[r["F"],U.query]])],512),[[r["G"],D.value]]),(Object(r["t"])(!0),Object(r["f"])(r["a"],null,Object(r["x"])(V,(c,n)=>Object(r["I"])((Object(r["t"])(),Object(r["f"])("div",{key:n,class:"vue-command__multiline-query"},[t[14]||(t[14]=Object(r["g"])("span",{class:"vue-command__multiline-query__prompt"},">",-1)),Object(r["g"])("input",{ref_for:!0,ref_key:"multilineQueryRefs",ref:S,class:"vue-command__multiline-query__input",disabled:A.value(n),style:Object(r["q"])(J.value),value:c,autocapitalize:"none",autocorrect:"off",type:"text",onClick:t=>Object(r["C"])(j)(e.$refs.multilineQueryRefs[n].selectionStart),onInput:t[6]||(t[6]=e=>ee(e.target.value)),onKeydown:t[7]||(t[7]=Object(r["J"])(Object(r["K"])(e=>te(),["ctrl","exact","prevent"]),["r"])),onKeyup:[Object(r["J"])(Object(r["K"])(t=>Object(r["C"])(j)(e.$refs.multilineQueryRefs[n].selectionStart),["exact"]),["arrow-left"]),Object(r["J"])(Object(r["K"])(t=>Object(r["C"])(j)(e.$refs.multilineQueryRefs[n].selectionStart),["exact"]),["arrow-right"]),Object(r["J"])(Object(r["K"])(t=>Object(r["C"])(j)(e.$refs.multilineQueryRefs[n].selectionStart),["exact"]),["end"]),Object(r["J"])(Object(r["K"])(re,["exact"]),["enter"])]},null,44,f)])),[[r["G"],N.value(n)]])),128)),C.value?(Object(r["t"])(),Object(r["f"])("div",v,[Object(r["g"])("span",y,"("+Object(r["B"])(E.value)+")`",1),Object(r["I"])(Object(r["g"])("input",{ref_key:"reverseISearchRef",ref:K,"onUpdate:modelValue":t[8]||(t[8]=e=>H.value=e),class:"vue-command__reverse-i-search__input",disabled:P.value,style:Object(r["q"])(J.value),autocapitalize:"none",autocorrect:"off",type:"text",onClick:t[9]||(t[9]=t=>Object(r["C"])(j)(e.$refs.queryRef.selectionStart)),onInput:Z,onKeydown:[Object(r["J"])(Object(r["K"])(W,["ctrl","exact","prevent"]),["r"]),t[10]||(t[10]=Object(r["J"])(Object(r["K"])(e=>Y(),["exact"]),["esc"]))],onKeyup:[t[11]||(t[11]=Object(r["J"])(Object(r["K"])(t=>Object(r["C"])(j)(e.$refs.queryRef.selectionStart),["exact"]),["arrow-left"])),t[12]||(t[12]=Object(r["J"])(Object(r["K"])(t=>Object(r["C"])(j)(e.$refs.queryRef.selectionStart),["exact"]),["arrow-right"])),t[13]||(t[13]=Object(r["J"])(Object(r["K"])(t=>Object(r["C"])(j)(e.$refs.queryRef.selectionStart),["exact"]),["end"])),Object(r["J"])(Object(r["K"])(re,["exact"]),["enter"])]},null,44,g),[[r["F"],H.value]]),Object(r["h"])("': "+Object(r["B"])(L.value),1)])):Object(r["e"])("",!0)]))}};c("bb75");const w=_;var q=w;const k="ArrowUp",x="ArrowDown",P="c",C=(e,t="command not found",c="VueCommandNotFound")=>{const r=`${e}: ${t}`;return T(r,c)},S=(e,t="VueCommandStderr")=>T(e,t),T=(e,t="VueCommandStdout")=>Object(r["n"])(Object(r["j"])({name:t,setup(){const e=Object(r["m"])("exit");Object(r["s"])(e)},render(){return Object(a["isFunction"])(e)?e():Object(r["l"])("div",e)}})),B=()=>Object(r["n"])(q),F=e=>e.split(/[ ]+/),Q=(e,{decrementHistory:t,incrementHistory:c})=>{const r=e.vueCommandRef,n=e=>{switch(e.key){case k:case x:switch(e.preventDefault(),e.key){case k:t();break;case x:c();break}}};r.addEventListener("keydown",n)},H=(e,{sendSignal:t})=>{const c=e=>{switch(e.ctrlKey){case!0:switch(e.key){case P:e.preventDefault(),t("SIGINT")}break;case!1:break}};window.addEventListener("keydown",c)},I=(...e)=>()=>{const t=[];return Object(a["forEach"])(e,e=>{t.push(Object(r["l"])("li",e))}),Object(r["l"])("ul",t)},K=()=>[B()],E=()=>[Q,H],R=e=>()=>{const t=[];return Object(a["forEach"])(e,e=>{const c=[];Object(a["forEach"])(e,e=>{c.push(Object(r["l"])("td",e))}),t.push(Object(r["l"])("tr",c))}),Object(r["l"])("table",t)};var $={__name:"VueCommand",props:{commands:{default:()=>({}),required:!1,type:Object},cursorPosition:{default:0,required:!1,type:Number},dispatchedQueries:{default:new Set,required:!1,type:Set},eventResolver:{default:()=>E(),required:!1,type:Array},font:{default:"",required:!1,type:String},helpText:{default:null,required:!1,type:String},helpTimeout:{default:3e3,required:!1,type:Number},hideBar:{default:!1,required:!1,type:Boolean},hideButtons:{default:!1,required:!1,type:Boolean},hidePrompt:{default:!1,required:!1,type:Boolean},hideTitle:{default:!1,required:!1,type:Boolean},history:{default:()=>K(),required:!1,type:Array},historyPosition:{default:0,required:!1,type:Number},invert:{default:!1,required:!1,type:Boolean},interpreter:{default:null,required:!1,type:Function},isFullscreen:{default:!1,required:!1,type:Boolean},optionsResolver:{default:null,required:!1,type:Function},parser:{default:e=>F(e),required:!1,type:Function},prompt:{default:"~$",required:!1,type:String},showHelp:{default:!1,required:!1,type:Boolean},title:{default:"~$",required:!1,type:String},query:{default:"",required:!1,type:String}},emits:["closeClicked","minimizeClicked","fullscreenClicked","update:cursorPosition","update:dispatchedQueries","update:history","update:historyPosition","update:isFullscreen","update:query"],setup(e,{expose:t,emit:c}){const n=Object(r["D"])(),o=e,i=c,l=Object(r["w"])(null),s=Object(r["w"])(null),u=Object(r["w"])(null),p=Object(r["v"])({cursorPosition:o.cursorPosition,dispatchedQueries:o.dispatchedQueries,history:o.history,historyPosition:o.historyPosition,isFullscreen:o.isFullscreen,prompt:o.prompt,query:o.query}),h=Object(r["v"])(j()),m=Object(r["b"])(()=>({cursorPosition:p.cursorPosition,dispatchedQueries:p.dispatchedQueries,font:o.font,history:p.history,historyPosition:p.historyPosition,invert:o.invert,isFullscreen:p.isFullscreen,prompt:p.prompt,query:p.query})),f=Object(r["b"])(()=>Object(a["keys"])(o.commands)),v=Object(r["b"])(()=>e=>O(p.isFullscreen,Object(a["eq"])(e,Object(a["size"])(p.history)-1))),y=Object(r["b"])(()=>e=>d(!p.isFullscreen,O(p.isFullscreen,Object(a["eq"])(e,Object(a["size"])(p.history)-1)))),g=e=>{p.dispatchedQueries.delete(e),p.dispatchedQueries.add(e),i("update:dispatchedQueries",p.dispatchedQueries)},_=()=>{if(p.isFullscreen)return;const e=Object(a["last"])(p.history);if(!Object(a["eq"])(Object(a["get"])(e,"__name"),"VueCommandQuery"))return;const t=Object(a["last"])(l.value);t.focus()},w=(...e)=>{p.history.push(...e),i("update:history",p.history)},q=async e=>{if(Object(a["isFunction"])(o.interpreter))return void o.interpreter(e);if(Object(a["isEmpty"])(e))return void w(B());g(e);const t=o.parser(e),c=Object(a["head"])(F(e)),n=Object(a["get"])(o.commands,c);if(!Object(a["isFunction"])(n))return void w(C(c));const i=await Promise.resolve(n(t));if(Object(a["eq"])(Object(a["get"])(i,"__name"),"VueCommandQuery"))return void k();const l=Object(r["j"])({name:"VueCommandOut",provide(){return{context:{rawQuery:e,parsedQuery:t}}},render:()=>Object(r["l"])(i)});w(Object(r["n"])(l))},k=()=>{w(B()),T(0),Q(!1),H(p.dispatchedQueries.size),I("")},x=()=>{if(Object(a["eq"])(p.historyPosition,0))return;H(p.historyPosition-1);const e=Object(a["nth"])([...p.dispatchedQueries],p.historyPosition);I(e)},P=()=>{if(!Object(a["lt"])(p.historyPosition,p.dispatchedQueries.size))return;H(p.historyPosition+1);const e=Object(a["nth"])([...p.dispatchedQueries],p.historyPosition);I(e)},S=e=>{h[b](e)},T=e=>{p.cursorPosition=e,i("update:cursorPosition",e)},Q=e=>{p.isFullscreen=e,i("update:isFullscreen",e)},H=e=>{p.historyPosition=e,i("update:historyPosition",e)},I=e=>{p.query=e,i("update:query",e)};return Object(r["H"])(()=>o.cursorPosition,e=>{p.cursorPosition=e}),Object(r["H"])(()=>o.dispatchedQueries,e=>{p.dispatchedQueries=e}),Object(r["H"])(()=>o.history,e=>{p.history=e}),Object(r["H"])(()=>o.historyPosition,e=>{p.historyPosition=e}),Object(r["H"])(()=>o.isFullscreen,e=>{p.isFullscreen=e}),Object(r["H"])(()=>o.prompt,e=>{p.prompt=e}),Object(r["H"])(()=>o.query,e=>{p.query=e}),Object(r["s"])(()=>{const e=Object(r["k"])();for(const c of o.eventResolver)c(e.refs,e.exposed);const t=new ResizeObserver(()=>{s.value.scrollTop=s.value.scrollHeight});for(const c of s.value.children)t.observe(c);Object(r["H"])(p.history,async()=>{await Object(r["o"])(),t.disconnect();for(const e of s.value.children)t.observe(e)})}),Object(r["u"])("addDispatchedQuery",g),Object(r["u"])("appendToHistory",w),Object(r["u"])("dispatch",q),Object(r["u"])("decrementHistory",x),Object(r["u"])("exit",k),Object(r["u"])("helpText",o.helpText),Object(r["u"])("helpTimeout",o.helpTimeout),Object(r["u"])("hidePrompt",o.hidePrompt),Object(r["u"])("incrementHistory",P),Object(r["u"])("optionsResolver",o.optionsResolver),Object(r["u"])("parser",o.parser),Object(r["u"])("programs",f),Object(r["u"])("sendSignal",S),Object(r["u"])("setCursorPosition",T),Object(r["u"])("setFullscreen",Q),Object(r["u"])("setHistoryPosition",H),Object(r["u"])("setQuery",I),Object(r["u"])("showHelp",o.showHelp),Object(r["u"])("signals",h),Object(r["u"])("slots",n),Object(r["u"])("terminal",m),t({addDispatchedQuery:g,appendToHistory:w,decrementHistory:x,dispatch:q,exit:k,incrementHistory:P,programs:f,sendSignal:S,setCursorPosition:T,setFullscreen:Q,setHistoryPosition:H,setQuery:I,signals:h,terminal:m}),(t,c)=>(Object(r["t"])(),Object(r["f"])("div",{ref_key:"vueCommandRef",ref:u,class:Object(r["p"])({"vue-command":!e.invert,"vue-command--invert":e.invert}),style:Object(r["q"])(e.font?{"font-family":e.font}:{})},[e.hideBar?Object(r["e"])("",!0):Object(r["y"])(t.$slots,"bar",{key:0},()=>[Object(r["g"])("div",{class:Object(r["p"])({"vue-command__bar":!e.invert,"vue-command__bar--invert":e.invert})},[Object(r["g"])("div",null,[e.hideButtons?Object(r["e"])("",!0):Object(r["y"])(t.$slots,"buttons",{key:0},()=>[Object(r["g"])("span",{class:Object(r["p"])({"vue-command__bar__button":!e.invert,"vue-command__bar__button--invert":e.invert,"vue-command__bar__button--fullscreen":!e.invert,"vue-command__bar__button--fullscreen--invert":e.invert}),onClick:c[0]||(c[0]=e=>i("closeClicked"))},null,2),Object(r["g"])("span",{class:Object(r["p"])({"vue-command__bar__button":!e.invert,"vue-command__bar__button--invert":e.invert,"vue-command__bar__button--minimize":!e.invert,"vue-command__bar__button--minimize--invert":e.invert}),onClick:c[1]||(c[1]=e=>i("minimizeClicked"))},null,2),Object(r["g"])("span",{class:Object(r["p"])({"vue-command__bar__button":!e.invert,"vue-command__bar__button--invert":e.invert,"vue-command__bar__button--close":!e.invert,"vue-command__bar__button--close--invert":e.invert}),onClick:c[2]||(c[2]=e=>i("fullscreenClicked"))},null,2)])]),Object(r["g"])("div",null,[e.hideTitle?Object(r["e"])("",!0):Object(r["y"])(t.$slots,"title",{key:0},()=>[Object(r["g"])("span",{class:Object(r["p"])({"vue-command__bar__title":!e.invert,"vue-command__bar__title--invert":e.invert})},Object(r["B"])(e.title),3)])]),c[3]||(c[3]=Object(r["g"])("div",null,"",-1))],2)]),Object(r["g"])("div",{ref_key:"vueCommandHistoryRef",ref:s,class:Object(r["p"])({"vue-command__history":!e.invert,"vue-command__history--invert":e.invert}),onClick:_},[(Object(r["t"])(!0),Object(r["f"])(r["a"],null,Object(r["x"])(p.history,(t,c)=>Object(r["I"])((Object(r["t"])(),Object(r["f"])("div",{key:c,class:Object(r["p"])({"vue-command__history__entry":!e.invert,"vue-command__history__entry--invert":e.invert,"vue-command__history__entry--fullscreen":v.value(c),"vue-command__history__entry--fullscreen--invert":Object(r["C"])(O)(e.invert,v.value(c))})},[(Object(r["t"])(),Object(r["d"])(Object(r["A"])(t),{ref_for:!0,ref_key:"vueCommandHistoryEntryComponentRefs",ref:l,class:Object(r["p"])({"vue-command__history__entry__component":!e.invert,"vue-command__history__entry__component--invert":e.invert})},null,8,["class"]))],2)),[[r["G"],y.value(c)]])),128))],2)],6))}};c("b5c6");const z=$;var J=z;const U={key:0},V={key:1},N={key:2};function A(e,t,c,n,o,i){return Object(r["t"])(),Object(r["f"])("div",null,[e.isLoading||e.isError?Object(r["e"])("",!0):(Object(r["t"])(),Object(r["f"])("span",U,Object(r["B"])(e.joke),1)),e.isLoading&&!e.isError?(Object(r["t"])(),Object(r["f"])("span",V,Object(r["B"])(e.loadingText),1)):Object(r["e"])("",!0),e.isError?(Object(r["t"])(),Object(r["f"])("span",N,"There was an error getting the joke")):Object(r["e"])("",!0)])}const G="https://api.chucknorris.io/jokes/random";var L={inject:["exit","signals"],data:()=>({isError:!1,isLoading:!0,joke:"",loadingText:"Loading ..."}),async mounted(){const e=new AbortController,t=()=>{e.abort(),this.signals.off("SIGINT")};this.signals.on("SIGINT",t);try{const c=await fetch(G,{signal:e.signal});if(this.signals.off("SIGINT",t),!c.ok)return this.isLoading=!1,this.isError=!0,void this.exit();const{value:r}=await c.json();this.joke=r,this.isLoading=!1}catch(c){"AbortError"===c.name?this.loadingText=this.loadingText+"^C":(this.isError=!0,this.isLoading=!1)}finally{this.signals.off("SIGINT",t),this.exit()}}},D=c("6b0d"),M=c.n(D);const W=M()(L,[["render",A]]);var X=W;function Y(e,t,c,n,o,i){return Object(r["I"])((Object(r["t"])(),Object(r["f"])("div",null,[Object(r["g"])("textarea",{ref:"nano",onKeyup:t[0]||(t[0]=Object(r["J"])(Object(r["K"])((...e)=>i.exit&&i.exit(...e),["ctrl","exact"]),["x"]))},"This is a nano text editor emulator! Press Ctrl + x to leave.",544)],512)),[[r["G"],i.terminal.isFullscreen]])}var Z={inject:["exit","setFullscreen","terminal"],created(){this.setFullscreen(!0)},mounted(){this.$refs.nano.focus()}};c("7787");const ee=M()(Z,[["render",Y],["__scopeId","data-v-d2d1666e"]]);var te=ee;const ce="neil@moon~$";var re={components:{VueCommand:J},setup(){const e=Object(r["w"])(0),t=Object(r["w"])(new Set),c=Object(r["w"])(""),n=Object(r["w"])("Type in help"),o=Object(r["w"])(3500),i=Object(r["w"])(!1),l=Object(r["w"])(!1),s=Object(r["w"])(!1),u=Object(r["w"])(!1),a=Object(r["w"])(K()),b=Object(r["w"])(0),j=Object(r["w"])(!1),O=Object(r["w"])(!1),d=Object(r["w"])(ce),p=Object(r["w"])(""),h=Object(r["w"])(!0),m=Object(r["w"])("bash - 720x350"),f=(e,t,c)=>{const r=t[t.length-1];switch(e){case"cd":switch(t.length){case 0:break;case 1:c("cd home");break;default:"home".startsWith(r)&&"home"!==r&&c("cd home");break}break}},v={cd:e=>{if(e.length<2||"."===e[e.length-1])return B();const t=e[e.length-1];return"home"===t&&(d.value=ce+"/home"),"../"!==t&&".."!==t||d.value!==ce+"/home"||(d.value=""+ce),"home"!==t&&"../"!==t&&".."!==t?S(`bash: cd: ${t}: No such file or directory`):B()},clear:()=>(a.value.splice(0,a.value.length),B()),"hello-world":()=>T("Hello world"),history:()=>{const e=[];for(const[c,r]of[...t.value].entries())e.push([c,r]);return T(R(e))},nano:()=>te,norris:()=>X,"set-font":e=>{if(e.length<2)return S("Missing font");const t=e.at(1);return t?(c.value=t.replace(/['"]+/g,""),B()):S("Missing font")},help:()=>{const e=Object.keys(v);return T(I(...e))}};return{commands:v,cursorPosition:e,dispatchedQueries:t,helpText:n,helpTimeout:o,hideBar:i,hideButtons:l,hidePrompt:s,hideTitle:u,history:a,historyPosition:b,invert:j,isFullscreen:O,prompt:d,query:p,showHelp:h,title:m,font:c,optionsResolver:f}}};c("c6fa");const ne=M()(re,[["render",u]]);var oe=ne,ie=c("9483");Object(ie["a"])("service-worker.js",{ready(){console.log("App is being served from cache by a service worker.\nFor more details, visit https://goo.gl/AFskqB")},registered(){console.log("Service worker has been registered.")},cached(){console.log("Content has been cached for offline use.")},updatefound(){console.log("New content is downloading.")},updated(){console.log("New content is available; please refresh.")},offline(){console.log("No internet connection found. App is running in offline mode.")},error(e){console.error("Error during service worker registration:",e)}});const le=Object(r["c"])(oe);le.config.unwrapInjectedRef=!0,le.mount("#app")},"714a":function(e,t,c){},7787:function(e,t,c){"use strict";c("8689")},8689:function(e,t,c){},b5c6:function(e,t,c){"use strict";c("714a")},bb75:function(e,t,c){"use strict";c("d0f3")},c6fa:function(e,t,c){"use strict";c("3091")},d0f3:function(e,t,c){}});
2 | //# sourceMappingURL=app.6128f5a3.js.map
--------------------------------------------------------------------------------