74 lines
2.0 KiB
JavaScript
74 lines
2.0 KiB
JavaScript
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
import { dirname, resolve } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
export function resolveWorkspaceRoot() {
|
|
return resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
}
|
|
|
|
export function resolveRealWorkspaceRoot() {
|
|
return realpathSync(resolveWorkspaceRoot());
|
|
}
|
|
|
|
export function resolveWorkspaceEnvPath(options = {}) {
|
|
const { workspaceRoot = resolveWorkspaceRoot() } = options;
|
|
return resolve(workspaceRoot, ".env");
|
|
}
|
|
|
|
export function resolveWorkspaceEnvPaths(options = {}) {
|
|
const { workspaceRoot = resolveWorkspaceRoot(), nodeEnv = process.env.NODE_ENV } = options;
|
|
const candidates = [".env"];
|
|
|
|
if (nodeEnv) {
|
|
candidates.push(`.env.${nodeEnv}`);
|
|
}
|
|
|
|
candidates.push(".env.local");
|
|
|
|
if (nodeEnv) {
|
|
candidates.push(`.env.${nodeEnv}.local`);
|
|
}
|
|
|
|
return [...new Set(candidates.map((candidate) => resolve(workspaceRoot, candidate)))];
|
|
}
|
|
|
|
export function loadWorkspaceEnv(options = {}) {
|
|
const envPaths = resolveWorkspaceEnvPaths(options);
|
|
const originalKeys = new Set(Object.keys(process.env));
|
|
const loadedPaths = [];
|
|
|
|
for (const envPath of envPaths) {
|
|
if (!existsSync(envPath)) {
|
|
continue;
|
|
}
|
|
|
|
const contents = readFileSync(envPath, "utf8");
|
|
for (const rawLine of contents.split(/\r?\n/u)) {
|
|
const line = rawLine.trim();
|
|
if (!line || line.startsWith("#")) {
|
|
continue;
|
|
}
|
|
|
|
const separatorIndex = line.indexOf("=");
|
|
if (separatorIndex <= 0) {
|
|
continue;
|
|
}
|
|
|
|
const key = line.slice(0, separatorIndex).trim();
|
|
const rawValue = line.slice(separatorIndex + 1).trim();
|
|
const quoted =
|
|
(rawValue.startsWith("\"") && rawValue.endsWith("\""))
|
|
|| (rawValue.startsWith("'") && rawValue.endsWith("'"));
|
|
const value = quoted ? rawValue.slice(1, -1) : rawValue;
|
|
|
|
if (!originalKeys.has(key)) {
|
|
process.env[key] = value;
|
|
}
|
|
}
|
|
|
|
loadedPaths.push(envPath);
|
|
}
|
|
|
|
return loadedPaths;
|
|
}
|