UNPKG

@sprucelabs/spruce-skill-utils

Version:

Loosely coupled classes and functions to make skill development faster! 🏎

81 lines (80 loc) 2.21 kB
import diskUtil from '../utilities/disk.utility.js'; const dotenv = require('dotenv'); export default class EnvService { constructor(cwd) { this.cwd = cwd; } set(key, value) { const env = this.parseEnv(); env[key] = value; //@ts-ignore process.env[key] = value; this.writeConfig(env); } writeConfig(env) { const path = this.getEnvPath(); const lines = []; for (const key in env) { let valueLiteral = this.generateValueLiteral(env[key]); lines.push(`${key}=${valueLiteral}`); } diskUtil.writeFile(path, lines.join('\n')); } get(key) { if (process.env[key]) { return this.coerceType(process.env[key]); } const env = this.parseEnv(); const value = env[key]; return this.coerceType(value); } coerceType(value) { //@ts-ignore const numValue = parseInt(value, 10); //@ts-ignore if (/^-?\d+$/.test(value) && !isNaN(numValue)) { return numValue; } else if (value === 'true') { return true; } else if (value === 'false') { return false; } return value; } unset(key) { const env = this.parseEnv(); delete env[key]; this.writeConfig(env); delete process.env[key]; } parseEnv() { const path = this.getEnvPath(); if (!diskUtil.doesFileExist(path)) { return {}; } const contents = diskUtil.readFile(path); const config = dotenv.parse(contents); return config; } generateValueLiteral(value) { let valueLiteral = ''; if (typeof value === 'string') { valueLiteral = `"${this.escape(value)}"`; } else if (typeof value === 'boolean') { valueLiteral = value ? 'true' : 'false'; } else { valueLiteral = `${value}`; } return valueLiteral; } escape(value) { return value.replace(/\n/g, '\\n'); } getEnvPath() { return diskUtil.resolvePath(this.cwd, '.env'); } }