diff --git a/src/env.ts b/src/env.ts index fada504..583b9ca 100644 --- a/src/env.ts +++ b/src/env.ts @@ -1,41 +1,59 @@ -const _envShim = Object.create(null); - export type EnvObject = Record; -const _getEnv = (useShim?: boolean) => - globalThis.process?.env || - import.meta.env || - globalThis.Deno?.env.toObject() || - globalThis.__env__ || - (useShim ? _envShim : globalThis); +const _envShim = Object.create(null) as EnvObject; export const env = new Proxy(_envShim, { get(_, prop) { - const env = _getEnv(); - return env[prop as any] ?? _envShim[prop]; + return getEnvValue(prop as string); }, has(_, prop) { - const env = _getEnv(); - return prop in env || prop in _envShim; + return getEnvValue(prop as string) !== undefined; }, set(_, prop, value) { - const env = _getEnv(true); - env[prop as any] = value; - return true; + return Reflect.set(getEnvObj(), prop as string, `${value}`); }, deleteProperty(_, prop) { - if (!prop) { - return false; - } - const env = _getEnv(true); - delete env[prop as any]; - return true; + return Reflect.deleteProperty(getEnvObj(), prop as string); }, ownKeys() { - const env = _getEnv(true); - return Object.keys(env); + return Reflect.ownKeys(getEnvObj()); + }, + defineProperty(_, prop, descriptor) { + const value = descriptor.get?.() ?? descriptor.value; + return Reflect.set(getEnvObj(), prop as string, `${value}`); }, }); +function getEnvObj(fallbackToGlobal?: boolean): EnvObject { + if (globalThis.__env__) { + return globalThis.__env__; + } + if (globalThis.process?.env) { + return globalThis.process.env; + } + if (import.meta.env) { + return import.meta.env; + } + return fallbackToGlobal ? (globalThis as unknown as EnvObject) : _envShim; +} + +function getEnvValue(key: string): string | undefined { + if (globalThis.__env__ && key in globalThis.__env__) { + return globalThis.__env__[key]; + } + if (globalThis.process?.env && key in globalThis.process.env) { + return globalThis.process.env[key]; + } + if (import.meta?.env && key in import.meta.env) { + return import.meta.env[key]; + } + if (globalThis.Deno?.env) { + return (globalThis.Deno.env as any).get(key); + } + if (key in _envShim) { + return _envShim[key]; + } +} + export const nodeENV = (typeof process !== "undefined" && process.env && process.env.NODE_ENV) || "";