import fs from "node:fs"; import path from "node:path"; import { resolveConfigDir } from "../utils.js"; function escapeRegExp(value: string): string { return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } export function upsertSharedEnvVar(params: { key: string; value: string; env?: NodeJS.ProcessEnv; }): { path: string; updated: boolean; created: boolean } { const env = params.env ?? process.env; const dir = resolveConfigDir(env); const filepath = path.join(dir, ".env"); const key = params.key.trim(); const value = params.value; let raw = ""; if (fs.existsSync(filepath)) { raw = fs.readFileSync(filepath, "utf8"); } const lines = raw.length ? raw.split(/\r?\n/) : []; const matcher = new RegExp(`^(\\s*(?:export\\s+)?)${escapeRegExp(key)}\\s*=`); let updated = false; let replaced = false; const nextLines = lines.map((line) => { const match = line.match(matcher); if (!match) return line; replaced = true; const prefix = match[1] ?? ""; const next = `${prefix}${key}=${value}`; if (next !== line) updated = true; return next; }); if (!replaced) { nextLines.push(`${key}=${value}`); updated = true; } if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true, mode: 0o700 }); } const output = `${nextLines.join("\n")}\n`; fs.writeFileSync(filepath, output, "utf8"); fs.chmodSync(filepath, 0o600); return { path: filepath, updated, created: !raw }; }