managedenv
Version:
Manage your environment variables with ease
64 lines (63 loc) • 2.18 kB
JavaScript
export class EnvManager {
definitions = [];
/**
* Adds a new variable definition.
*
* @param def The variable definition to add.
* @returns The updated EnvManager instance.
*/
add(def) {
this.definitions.push(def);
return this;
}
/**
* Retrieves the value of a CLI flag.
*
* @param flag The CLI flag to check (e.g., "--token").
* @returns The value of the flag or undefined if not set.
*/
getFlagValue(flag) {
const idx = process.argv.indexOf(flag);
if (idx !== -1 && process.argv[idx + 1]) {
return process.argv[idx + 1];
}
return undefined;
}
/**
* Loads the environment variables based on the defined variable definitions.
*
* @returns An object containing the loaded variables grouped by project.
* @throws Error if a required variable is missing and quitOnMissing is true.
*/
load() {
const result = {};
for (const def of this.definitions) {
const { name, project = "env", required = false, default: defVal, type = (v => v), flag, quitOnMissing, } = def;
if (!result[project])
result[project] = {};
// First try CLI flag, then fallback to env var
const raw = (flag && this.getFlagValue(flag)) || process.env[name];
if (raw === undefined || raw === "") {
if (defVal !== undefined) {
result[project][name] = defVal;
}
else if (required) {
const msg = `Missing required variable/flag: ${name}${flag ? ` (flag: ${flag})` : ""}`;
if (quitOnMissing !== false)
throw new Error(msg);
else
console.warn(msg);
}
}
else {
try {
result[project][name] = type(raw);
}
catch (e) {
throw new Error(`Failed to parse variable "${name}": ${e.message}`);
}
}
}
return result;
}
}