Files
atom/src/update-process-env.js

82 lines
1.8 KiB
JavaScript

/** @babel */
import fs from 'fs'
import {spawnSync} from 'child_process'
const ENVIRONMENT_VARIABLES_TO_PRESERVE = new Set([
'NODE_ENV',
'NODE_PATH',
'ATOM_HOME',
'ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT'
])
const PLATFORMS_KNOWN_TO_WORK = new Set([
'darwin',
'linux'
])
function updateProcessEnv (launchEnv) {
let envToAssign
if (launchEnv && shouldGetEnvFromShell(launchEnv)) {
envToAssign = getEnvFromShell(launchEnv)
} else if (launchEnv && launchEnv.PWD) {
envToAssign = launchEnv
}
if (envToAssign) {
for (let key in process.env) {
if (!ENVIRONMENT_VARIABLES_TO_PRESERVE.has(key)) {
delete process.env[key]
}
}
for (let key in envToAssign) {
if (!ENVIRONMENT_VARIABLES_TO_PRESERVE.has(key) || (!process.env[key] && envToAssign[key])) {
process.env[key] = envToAssign[key]
}
}
if (envToAssign.ATOM_HOME && fs.existsSync(envToAssign.ATOM_HOME)) {
process.env.ATOM_HOME = envToAssign.ATOM_HOME
}
}
}
function shouldGetEnvFromShell (env) {
if (!PLATFORMS_KNOWN_TO_WORK.has(process.platform)) {
return false
}
if (!env || !env.SHELL || env.SHELL.trim() === '') {
return false
}
if (env.ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT || process.env.ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT) {
return false
}
return true
}
function getEnvFromShell (env) {
if (!shouldGetEnvFromShell(env)) {
return
}
let {stdout} = spawnSync(env.SHELL, ['-ilc', 'command env'], {encoding: 'utf8'})
if (stdout) {
let result = {}
for (let line of stdout.split('\n')) {
if (line.includes('=')) {
let components = line.split('=')
let key = components.shift()
let value = components.join('=')
result[key] = value
}
}
return result
}
}
export default { updateProcessEnv, shouldGetEnvFromShell }