75 lines
1.7 KiB
TypeScript
75 lines
1.7 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 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;
|
|
}
|
|
}
|
|
},
|
|
};
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|