import { existsSync, readFileSync } from "node:fs"; import { rootPath } from "./config"; export function canonicalComposeEnvFile(): string { return rootPath(".state", "docker-compose.env"); } function unquoteEnvValue(value: string): string { const trimmed = value.trim(); if (trimmed.length < 2) return trimmed; const first = trimmed[0]; const last = trimmed[trimmed.length - 1]; if ((first !== "\"" && first !== "'") || last !== first) return trimmed; return trimmed.slice(1, -1); } export function readEnvFileValues(path: string): Map { const values = new Map(); if (!existsSync(path)) return values; for (const line of readFileSync(path, "utf8").split(/\r?\n/u)) { if (line.trim().length === 0 || line.trimStart().startsWith("#")) continue; const index = line.indexOf("="); if (index <= 0) continue; const key = line.slice(0, index).trim(); if (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(key)) continue; values.set(key, unquoteEnvValue(line.slice(index + 1))); } return values; } export function composeRuntimeEnvValue(key: string, env: NodeJS.ProcessEnv = process.env): string | null { const fromProcess = env[key]?.trim(); if (fromProcess !== undefined && fromProcess.length > 0) return fromProcess; const fromFile = readEnvFileValues(canonicalComposeEnvFile()).get(key)?.trim(); return fromFile === undefined || fromFile.length === 0 ? null : fromFile; }