import fs from 'fs'; import path from 'path'; import { execFileSync } from 'child_process'; function parseDotenv(contents: string) { contents .split('\n') .map((line) => line.trim()) .filter((line) => line && !line.startsWith('#')) .forEach((line) => { const idx = line.indexOf('='); if (idx === -1) return; const key = line.slice(0, idx).trim(); let value = line.slice(idx + 1).trim(); if (!key || key in process.env) return; if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) { value = value.slice(1, -1); } process.env[key] = value; }); } export function loadLocalSecrets() { const root = process.cwd(); const plainPath = path.join(root, 'creds', 'secrets.env'); const encPath = path.join(root, 'creds', 'secrets.enc.env'); if (fs.existsSync(plainPath)) { try { parseDotenv(fs.readFileSync(plainPath, 'utf8')); return; } catch { // ignore and try encrypted } } if (fs.existsSync(encPath) && !process.env.SKIP_SOPS_AUTOLOAD) { try { const output = execFileSync('sops', ['-d', encPath], { encoding: 'utf8' }); parseDotenv(output); } catch { // silent fail if sops/key not available } } }