import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const ENV_PATH = path.resolve(__dirname, "..", ".env"); let cargado = false; /** * Lee `platform/.env` y lo vuelca en `process.env` sin pisar lo que ya viniera * del entorno — un valor exportado en la terminal gana al archivo, que es lo * que se espera al apuntar a otra subcuenta sin editar nada. * * Sin dependencia externa a propósito: son quince líneas y el archivo lleva * el token del CRM, así que conviene que se vea exactamente qué lo lee. */ export function loadEnv(): void { if (cargado) return; cargado = true; if (!fs.existsSync(ENV_PATH)) return; for (const raw of fs.readFileSync(ENV_PATH, "utf8").split(/\r?\n/)) { const line = raw.trim(); if (!line || line.startsWith("#")) continue; const eq = line.indexOf("="); if (eq < 1) continue; const key = line.slice(0, eq).trim(); let value = line.slice(eq + 1).trim(); if ( (value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'")) ) { value = value.slice(1, -1); } if (process.env[key] === undefined) process.env[key] = value; } } /** Lee una variable obligatoria, con un mensaje que dice qué falta y dónde ponerlo. */ export function requireEnv(key: string): string { loadEnv(); const v = process.env[key]; if (!v) { throw new Error( `Falta ${key}. Defínelo en platform/.env (ver platform/.env.example) o expórtalo en el entorno.` ); } return v; }