# atlas-interactive-shell

> Runs a shell command interactively, abstracts useful callbacks as opposed to manually listening for events.

Latest version **1.0.2** (published 2018-06-28) · Apache-2.0 license · 0 weekly downloads

## Install

```sh
npm install atlas-interactive-shell
pnpm add atlas-interactive-shell
yarn add atlas-interactive-shell
bun add atlas-interactive-shell
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.2 |
| Published | 2018-06-28 |
| First published | 2018-06-25 |
| Weekly downloads | 0 |
| License | Apache-2.0 |
| TypeScript types | none |
| Module format | CommonJS |
| Node | ^10.1.0 |
| Dependencies | 0 |
| Unpacked size | 14 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | atlassubbed |
| Maintainers | atlassubbed |
| Keywords | atlassubbed, shell, spawn, exec, utils, utility, command |

## Links

- npm: https://www.npmjs.com/package/atlas-interactive-shell
- Repository: https://github.com/atlassubbed/atlas-interactive-shell
- Homepage: https://github.com/atlassubbed/atlas-interactive-shell#readme
- Issues: https://github.com/atlassubbed/atlas-interactive-shell/issues
- npm.io page: https://npm.io/package/atlas-interactive-shell

## Alternatives

- [@salesforce/cli](https://npm.io/package/@salesforce/cli.md) — 389.7K weekly downloads
- [@mintlify/cli](https://npm.io/package/@mintlify/cli.md) — 208.9K weekly downloads
- [@grafana/e2e-selectors](https://npm.io/package/@grafana/e2e-selectors.md) — 128.7K weekly downloads
- [mintlify](https://npm.io/package/mintlify.md) — 112.0K weekly downloads
- [@intlayer/cli](https://npm.io/package/@intlayer/cli.md) — 22.8K weekly downloads

## Recent versions

- 1.0.2 (latest) — 2018-06-28
- 1.0.1 — 2018-06-28
- 1.0.0 — 2018-06-25

## README

# atlas-interactive-shell

Runs a shell command interactively, abstracts useful callbacks as opposed to manually listening for events.

[![Travis](https://img.shields.io/travis/atlassubbed/atlas-interactive-shell.svg)](https://travis-ci.org/atlassubbed/atlas-interactive-shell)

---

## install

```
npm install --save atlas-interactive-shell
```

## why

Sometimes you need to run a command and programmatically interact with the standard input when prompted with a message. The implementation looks something like this:

```javascript
const { spawn } = require("child_process");
const child = spawn(cmd);
const onDone = (err, code) => {
  // only run this once
}
child.stdout.on("data", data => {
  // maybe write to stdin
})
child.stderr.on("data", data => {
  // maybe write to stdin or kill
})
child.on("exit", code => {
  // call onDone if we haven't already
})
child.on("close", code => {
  // call onDone if we haven't already
})
child.on("error", err => {
  // call onDone with error if we haven't already
})
```

I would rather keep a clean house and not litter my codebase with this event and stream stuff. So, I tried to come up with a decent API to abstract it away.

## examples

#### passing command and opts

The first argument is a command, the second argument is spawn opts and is entirely optional.

```javascript
const Shell = require("atlas-interactive-shell");
const cmd = "ls && mkdir -p new-dir/new-sub-dir && ls new-dir";
const opts = {cwd: __dirname, ...otherSpawnOpts};
const shell = new Shell(cmd, opts);
```

#### onDone callback

This is called only once, whether the command exits normally or with an error:

```javascript
...
shell.onDone((err, code) => {
  if (!err) console.log(code)
})
```

#### onData callback

Captures stderr and stdout, allowing you to reply with an error or a message, respectively:

```javascript
...
shell.onData((stderr, stdout, reply) => {
  if (stderr) 
    return reply(new Error("oops!")); // triggers onDone with our err
  if (stdout === "enter username:")
    return reply("atlassubbed\n");
})
```

#### logging

The spawned command will not log anything unless you call the `log` method, in which case all stderr and stdout will be piped to the parent process:

```javascript
...
shell.log()
```

#### chaining everything

All of the methods can be chained, since they just return the instance:

```javascript
...
shell.log().onDone(err => console.error(err)).onData(stderr => {
  stderr && console.log(stderr)
})
```

## caveats

Don't pass unsanitized user input into this function.

---
_Source: https://npm.io/package/atlas-interactive-shell · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
