Baseline commit of the existing Maquina Comercial Pessoal project
Tracks the app that was already in place (capture, treatment, outreach, WhatsApp integration, server, frontend, tests, docs) so future feature work can branch and use isolated worktrees.
This commit is contained in:
+61
@@ -0,0 +1,61 @@
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user