spawn-stack
Version:
Spawn a new process using `stack` command with the given arguments
78 lines (54 loc) • 3.5 kB
Markdown
# spawn-stack
[](https://www.npmjs.com/package/spawn-stack)
[](https://travis-ci.org/shinnn/spawn-stack)
[](https://ci.appveyor.com/project/ShinnosukeWatanabe/spawn-stack/branch/master)
[](https://coveralls.io/github/shinnn/spawn-stack?branch=master)
[Spawn](https://en.wikipedia.org/wiki/Spawn_(computing)) a new process using [`stack`](https://docs.haskellstack.org/en/stable/README/) command with the given arguments
```javascript
const spawnStack = require('spawn-stack');
spawnStack(['--version']).then(result => {
result.output; //=> 'Version 1.7.1 x86_64 ...'
});
```
## Installation
Make sure [`stack`](https://github.com/commercialhaskell/stack) command is [installed](https://docs.haskellstack.org/en/stable/README/#how-to-install) in your `$PATH`, then [install](https://docs.npmjs.com/cli/install) `spawn-stack` via [npm](https://docs.npmjs.com/getting-started/what-is-npm) CLI.
```
npm install spawn-stack
```
## API
```javascript
const spawnStack = require('spawn-stack');
```
### spawnStack(*args* [, *options*])
*args*: `Array<string>` (command line arguments passed to `stack` command)
*options*: `Object` (`execa` options, with [`preferLocal`](https://github.com/sindresorhus/execa#preferlocal) defaulting to `false`)
Return: [`ChildProcess`](https://nodejs.org/api/child_process.html#child_process_class_childprocess)
It returns the same value as [`execa`](https://github.com/sindresorhus/execa#execafile-arguments-options)'s:
> a `child_process` instance, which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties.
On POSIX, [`--allow-different-user`](https://github.com/commercialhaskell/stack/blob/v1.5.1/doc/yaml_configuration.md#allow-different-user) flag will be automatically enabled to prevent file permission problems, unless `--no-allow-different-user` flag is explicitly provided.
```javascript
process.platform !== 'win32'; //=> true
spawnStack(['--numeric-version']).then(result => {
result.cmd; // 'stack --allow-different-user --numeric-version'
});
spawnStack(['--no-allow-different-user', '--numeric-version']).then(result => {
result.cmd; // 'stack --no-allow-different-user --numeric-version'
});
```
The return value also has [`Symbol.observable`](https://tc39.github.io/proposal-observable/#observable-prototype-@@observable) method that returns a [zen-observable](https://github.com/zenparsing/zen-observable) instance passing each line of `stderr` to its [`Subscription`](https://tc39.github.io/proposal-observable/#subscription-objects). That means you can convert the return value into an [`Observable`](https://github.com/tc39/proposal-observable#observable) by using [`Observable.from`](https://github.com/tc39/proposal-observable#observablefrom).
```javascript
const Observable = require('zen-observable');
const spawnStack = require('spawn-stack');
const cp = spawnStack(['setup', '8.2.1']);
Observable.from(cp).subscribe({
next(line) {
console.log(line);
// stack will use a sandboxed GHC it installed ...
},
complete() {
console.log('Done.')
}
});
```
## License
[ISC License](./LICENSE) © 2017 - 2018 Shinnosuke Watanabe