| 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; |
| } |
| } |
| }, |
| }; |
| } |
|
|
| 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; |
| } |
| } |
| } |
|
|
| 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 { |
| applyEnvValues(env); |
| 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 { |
| applyEnvValues(env); |
| return await fn(); |
| } finally { |
| snapshot.restore(); |
| } |
| } |
|
|