Spaces:
Running
Running
File size: 2,411 Bytes
9e27976 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
import { execSync } from "node:child_process"
import process from "node:process"
type ShellName = "bash" | "zsh" | "fish" | "powershell" | "cmd" | "sh"
type EnvVars = Record<string, string | undefined>
function getShell(): ShellName {
const { platform, ppid, env } = process
if (platform === "win32") {
try {
const command = `wmic process get ParentProcessId,Name | findstr "${ppid}"`
const parentProcess = execSync(command, { stdio: "pipe" }).toString()
if (parentProcess.toLowerCase().includes("powershell.exe")) {
return "powershell"
}
} catch {
return "cmd"
}
return "cmd"
} else {
const shellPath = env.SHELL
if (shellPath) {
if (shellPath.endsWith("zsh")) return "zsh"
if (shellPath.endsWith("fish")) return "fish"
if (shellPath.endsWith("bash")) return "bash"
}
return "sh"
}
}
/**
* Generates a copy-pasteable script to set multiple environment variables
* and run a subsequent command.
* @param {EnvVars} envVars - An object of environment variables to set.
* @param {string} commandToRun - The command to run after setting the variables.
* @returns {string} The formatted script string.
*/
export function generateEnvScript(
envVars: EnvVars,
commandToRun: string = "",
): string {
const shell = getShell()
const filteredEnvVars = Object.entries(envVars).filter(
([, value]) => value !== undefined,
) as Array<[string, string]>
let commandBlock: string
switch (shell) {
case "powershell": {
commandBlock = filteredEnvVars
.map(([key, value]) => `$env:${key} = ${value}`)
.join("; ")
break
}
case "cmd": {
commandBlock = filteredEnvVars
.map(([key, value]) => `set ${key}=${value}`)
.join(" & ")
break
}
case "fish": {
commandBlock = filteredEnvVars
.map(([key, value]) => `set -gx ${key} ${value}`)
.join("; ")
break
}
default: {
// bash, zsh, sh
const assignments = filteredEnvVars
.map(([key, value]) => `${key}=${value}`)
.join(" ")
commandBlock = filteredEnvVars.length > 0 ? `export ${assignments}` : ""
break
}
}
if (commandBlock && commandToRun) {
const separator = shell === "cmd" ? " & " : " && "
return `${commandBlock}${separator}${commandToRun}`
}
return commandBlock || commandToRun
}
|