ExecaTerminal.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import type { RooTerminalCallbacks, RooTerminalProcessResultPromise } from "./types"
  2. import { BaseTerminal } from "./BaseTerminal"
  3. import { ExecaTerminalProcess } from "./ExecaTerminalProcess"
  4. import { mergePromise } from "./mergePromise"
  5. export class ExecaTerminal extends BaseTerminal {
  6. constructor(id: number, cwd: string) {
  7. super("execa", id, cwd)
  8. }
  9. /**
  10. * Unlike the VSCode terminal, this is never closed.
  11. */
  12. public override isClosed(): boolean {
  13. return false
  14. }
  15. public override runCommand(command: string, callbacks: RooTerminalCallbacks): RooTerminalProcessResultPromise {
  16. const process = new ExecaTerminalProcess(this)
  17. process.command = command
  18. this.process = process
  19. process.on("line", (line) => callbacks.onLine(line, process))
  20. process.once("completed", (output) => callbacks.onCompleted(output, process))
  21. process.once("shell_execution_complete", (details) => callbacks.onShellExecutionComplete(details, process))
  22. const promise = new Promise<void>((resolve, reject) => {
  23. process.once("continue", () => resolve())
  24. process.once("error", (error) => reject(error))
  25. process.run(command)
  26. })
  27. return mergePromise(process, promise)
  28. }
  29. }