@sprucelabs/spruce-skill-utils
Version:
Loosely coupled classes and functions to make skill development faster! 🏎
81 lines (80 loc) • 2.21 kB
JavaScript
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');
}
}