import fs from 'node:fs/promises'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; // Raiz do projeto resolvida a partir deste arquivo (src/env.mjs -> pasta acima), // para funcionar igual quando o servidor e iniciado pelo launcher (cwd diferente). export const projectRoot = path.dirname(fileURLToPath(new URL('.', import.meta.url))); export const paths = { root: projectRoot, data: path.join(projectRoot, 'data'), db: process.env.APP_DB_PATH || path.join(projectRoot, 'data', 'maquina-pessoal.db'), whatsappAuth: process.env.APP_WHATSAPP_AUTH_DIR || path.join(projectRoot, 'data', 'runtime', 'whatsapp-auth'), exports: path.join(projectRoot, 'data', 'exports'), seeds: path.join(projectRoot, 'data', 'seeds'), cnpjDir: process.env.CNPJ_BASE_DIR || path.join(projectRoot, 'prospeccao', 'cnpj'), rfbRaw: path.join(projectRoot, 'prospeccao', 'cnpj', 'rfb-raw'), config: path.join(projectRoot, 'prospeccao', 'config.json'), public: path.join(projectRoot, 'public') }; export let APP_PORT = envNumber('APP_PORT', 3910); export let APP_HOST = envString('APP_HOST', '127.0.0.1'); function refreshEnvDerivedValues() { paths.db = process.env.APP_DB_PATH || path.join(projectRoot, 'data', 'maquina-pessoal.db'); paths.whatsappAuth = process.env.APP_WHATSAPP_AUTH_DIR || path.join(projectRoot, 'data', 'runtime', 'whatsapp-auth'); paths.cnpjDir = process.env.CNPJ_BASE_DIR || path.join(projectRoot, 'prospeccao', 'cnpj'); paths.rfbRaw = path.join(paths.cnpjDir, 'rfb-raw'); APP_PORT = envNumber('APP_PORT', 3910); APP_HOST = envString('APP_HOST', '127.0.0.1'); } export async function loadDotEnv(rootDir = projectRoot) { try { const content = await fs.readFile(path.join(rootDir, '.env'), 'utf8'); for (const line of content.split(/\r?\n/)) { const trimmed = line.trim(); if (!trimmed || trimmed.startsWith('#')) continue; const separator = trimmed.indexOf('='); if (separator === -1) continue; const key = trimmed.slice(0, separator).trim(); const value = trimmed.slice(separator + 1).trim(); if (!process.env[key]) process.env[key] = value; } refreshEnvDerivedValues(); } catch (error) { if (error.code !== 'ENOENT') throw error; } } export function envNumber(name, fallback) { const value = Number(process.env[name]); return Number.isFinite(value) && value > 0 ? value : fallback; } export function envString(name, fallback) { return process.env[name] || fallback; } export function telegramConfig() { return { enabled: process.env.TELEGRAM_ALERTS_ENABLED === 'true', botToken: process.env.TELEGRAM_BOT_TOKEN || '', chatId: process.env.TELEGRAM_CHAT_ID || '' }; }