diff --git a/src/node_task_runner.cc b/src/node_task_runner.cc index 22c02e83e12e..1abf259bde80 100644 --- a/src/node_task_runner.cc +++ b/src/node_task_runner.cc @@ -93,6 +93,8 @@ void ProcessRunner::SetEnvironmentVariables() { int env_count; CHECK_EQ(0, uv_os_environ(&env_items, &env_count)); + bool has_path_env_var = false; + // Iterate over environment variables once to store them in the current // ProcessRunner instance. for (int i = 0; i < env_count; i++) { @@ -110,12 +112,17 @@ void ProcessRunner::SetEnvironmentVariables() { if (StringEqualNoCase(name.c_str(), "path")) { // Add path env variable to the beginning of the PATH + has_path_env_var = true; value = path_env_var_ + value; } env_vars_.push_back(name + "=" + value); } uv_os_free_environ(env_items, env_count); + if (!has_path_env_var) { + env_vars_.push_back("PATH=" + path_env_var_); + } + // Add NODE_RUN_SCRIPT_NAME environment variable to the environment // to indicate which script is being run. env_vars_.push_back("NODE_RUN_SCRIPT_NAME=" + script_name_); diff --git a/test/parallel/test-node-run.js b/test/parallel/test-node-run.js index e24117f6b165..6509b4dd0302 100644 --- a/test/parallel/test-node-run.js +++ b/test/parallel/test-node-run.js @@ -45,6 +45,21 @@ describe('node --run [command]', () => { assert.strictEqual(child.code, 0); }); + it('creates PATH when it is missing from the environment', async () => { + const env = Object.fromEntries( + Object.entries(process.env) + .filter(([key]) => key.toLowerCase() !== 'path'), + ); + const child = await common.spawnPromisified( + process.execPath, + [ '--run', `ada${envSuffix}`], + { cwd: fixtures.path('run-script'), env }, + ); + assert.match(child.stdout, /06062023/); + assert.strictEqual(child.stderr, ''); + assert.strictEqual(child.code, 0); + }); + it('chdirs into package directory', async () => { const child = await common.spawnPromisified( process.execPath,