Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add execPath option #377

Merged
merged 4 commits into from Oct 15, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions index.d.ts
Expand Up @@ -38,6 +38,17 @@ declare namespace execa {
*/
readonly localDir?: string;

/**
Path to the Node.js executable to use in child processes.

sindresorhus marked this conversation as resolved.
Show resolved Hide resolved
This can be either an absolute path or a path relative to the `cwd` option.

Requires `preferLocal` to be `true`.
sindresorhus marked this conversation as resolved.
Show resolved Hide resolved

@default process.execPath
*/
readonly execPath?: string;

/**
Buffer the output from the spawned process. When set to `false`, you must read the output of `stdout` and `stderr` (or `all` if the `all` option is `true`). Otherwise the returned promise will not be resolved/rejected.

Expand Down
5 changes: 3 additions & 2 deletions index.js
Expand Up @@ -14,11 +14,11 @@ const {joinCommand, parseCommand} = require('./lib/command.js');

const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100;

const getEnv = ({env: envOption, extendEnv, preferLocal, localDir}) => {
const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => {
const env = extendEnv ? {...process.env, ...envOption} : envOption;

if (preferLocal) {
return npmRunPath.env({env, cwd: localDir});
return npmRunPath.env({env, cwd: localDir, execPath});
}

return env;
Expand All @@ -37,6 +37,7 @@ const handleArgs = (file, args, options = {}) => {
extendEnv: true,
preferLocal: false,
localDir: options.cwd || process.cwd(),
execPath: process.execPath,
encoding: 'utf8',
reject: true,
cleanup: true,
Expand Down
1 change: 1 addition & 0 deletions index.test-d.ts
Expand Up @@ -72,6 +72,7 @@ try {
execa('unicorns', {cleanup: false});
execa('unicorns', {preferLocal: false});
execa('unicorns', {localDir: '.'});
execa('unicorns', {execPath: '/path'});
execa('unicorns', {buffer: false});
execa('unicorns', {input: ''});
execa('unicorns', {input: Buffer.from('')});
Expand Down
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -52,6 +52,7 @@
"@types/node": "^12.0.7",
"ava": "^2.1.0",
"coveralls": "^3.0.4",
"get-node": "^5.0.0",
"is-running": "^2.1.0",
"nyc": "^14.1.1",
"p-event": "^4.1.0",
Expand Down
11 changes: 11 additions & 0 deletions readme.md
Expand Up @@ -308,6 +308,17 @@ Default: `process.cwd()`

Preferred path to find locally installed binaries in (use with `preferLocal`).

#### execPath

Type: `string`<br>
Default: `process.execPath` (current Node.js executable)

Path to the Node.js executable to use in child processes.

This can be either an absolute path or a path relative to the [`cwd` option](#cwd).

Requires [`preferLocal`](#preferlocal) to be `true`.

#### buffer

Type: `boolean`<br>
Expand Down
7 changes: 7 additions & 0 deletions test/test.js
@@ -1,6 +1,7 @@
import path from 'path';
import test from 'ava';
import isRunning from 'is-running';
import getNode from 'get-node';
import execa from '..';

process.env.PATH = path.join(__dirname, 'fixtures') + path.delimiter + process.env.PATH;
Expand Down Expand Up @@ -92,6 +93,12 @@ test('localDir option', async t => {
t.true(envPaths.some(envPath => envPath.endsWith('.bin')));
});

test('execPath option', async t => {
const {path: execPath} = await getNode('6.0.0');
const {stdout} = await execa('node', ['-p', 'process.env.Path || process.env.PATH'], {preferLocal: true, execPath});
t.true(stdout.includes('6.0.0'));
});

test('stdin errors are handled', async t => {
const child = execa('noop');
child.stdin.emit('error', new Error('test'));
Expand Down