2026-02-15 21:31:23 +00:00
|
|
|
export function captureEnv(keys: string[]) {
|
|
|
|
|
const snapshot = new Map<string, string | undefined>();
|
|
|
|
|
for (const key of keys) {
|
|
|
|
|
snapshot.set(key, process.env[key]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
restore() {
|
|
|
|
|
for (const [key, value] of snapshot) {
|
|
|
|
|
if (value === undefined) {
|
|
|
|
|
delete process.env[key];
|
|
|
|
|
} else {
|
|
|
|
|
process.env[key] = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
}
|
2026-02-15 23:12:57 +00:00
|
|
|
|
2026-02-22 07:38:24 +00:00
|
|
|
function applyEnvValues(env: Record<string, string | undefined>): void {
|
|
|
|
|
for (const [key, value] of Object.entries(env)) {
|
|
|
|
|
if (value === undefined) {
|
|
|
|
|
delete process.env[key];
|
|
|
|
|
} else {
|
|
|
|
|
process.env[key] = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-15 23:14:38 +00:00
|
|
|
export function captureFullEnv() {
|
|
|
|
|
const snapshot: Record<string, string | undefined> = { ...process.env };
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
restore() {
|
|
|
|
|
for (const key of Object.keys(process.env)) {
|
|
|
|
|
if (!(key in snapshot)) {
|
|
|
|
|
delete process.env[key];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (const [key, value] of Object.entries(snapshot)) {
|
|
|
|
|
if (value === undefined) {
|
|
|
|
|
delete process.env[key];
|
|
|
|
|
} else {
|
|
|
|
|
process.env[key] = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-15 23:12:57 +00:00
|
|
|
export function withEnv<T>(env: Record<string, string | undefined>, fn: () => T): T {
|
|
|
|
|
const snapshot = captureEnv(Object.keys(env));
|
|
|
|
|
try {
|
2026-02-22 07:38:24 +00:00
|
|
|
applyEnvValues(env);
|
2026-02-15 23:12:57 +00:00
|
|
|
return fn();
|
|
|
|
|
} finally {
|
|
|
|
|
snapshot.restore();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function withEnvAsync<T>(
|
|
|
|
|
env: Record<string, string | undefined>,
|
|
|
|
|
fn: () => Promise<T>,
|
|
|
|
|
): Promise<T> {
|
|
|
|
|
const snapshot = captureEnv(Object.keys(env));
|
|
|
|
|
try {
|
2026-02-22 07:38:24 +00:00
|
|
|
applyEnvValues(env);
|
2026-02-15 23:12:57 +00:00
|
|
|
return await fn();
|
|
|
|
|
} finally {
|
|
|
|
|
snapshot.restore();
|
|
|
|
|
}
|
|
|
|
|
}
|