Files
clawdbot/src/infra/env-file.ts
2026-01-09 09:59:58 +01:00

56 lines
1.4 KiB
TypeScript

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 };
}