54 lines
1.2 KiB
TypeScript
54 lines
1.2 KiB
TypeScript
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;
|
|
}
|
|
}
|
|
},
|
|
};
|
|
}
|
|
|
|
export function withEnv<T>(env: Record<string, string | undefined>, fn: () => T): T {
|
|
const snapshot = captureEnv(Object.keys(env));
|
|
try {
|
|
for (const [key, value] of Object.entries(env)) {
|
|
if (value === undefined) {
|
|
delete process.env[key];
|
|
} else {
|
|
process.env[key] = value;
|
|
}
|
|
}
|
|
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 {
|
|
for (const [key, value] of Object.entries(env)) {
|
|
if (value === undefined) {
|
|
delete process.env[key];
|
|
} else {
|
|
process.env[key] = value;
|
|
}
|
|
}
|
|
return await fn();
|
|
} finally {
|
|
snapshot.restore();
|
|
}
|
|
}
|