1+ import type { DotenvConfigOptions } from "dotenv"
12import { config } from "dotenv"
23import { join } from "path"
34import type { LoadedEnv } from "./loaded_env.ts"
45
5- /** Loads environment variables from the `.env` files. `NODE_ENV` has to be
6- * set in the environment and will not be picked up from the filesystem.
6+ /** Loads environment variables from the `.env` files. `NODE_ENV` has to be set
7+ * in the environment and will not be picked up from the filesystem.
78 *
89 * If `NODE_ENV` is not set, it defaults to `development`.
910 *
@@ -13,19 +14,21 @@ import type { LoadedEnv } from "./loaded_env.ts"
1314 * 2. `.env.${NODE_ENV}`
1415 * 3. `.env.local`
1516 * 4. `.env`
17+ *
18+ * @param options Additional options to be passed to `dotenv.config` where
19+ * `path` is where to find `.env` files.
1620 */
17- export function loadEnv ( ) : LoadedEnv {
18- const cwd = process . cwd ( )
21+ export function loadEnv ( options ?: LoadEnvOptions ) : LoadedEnv {
1922 const NODE_ENV = process . env [ "NODE_ENV" ] ?. trim ( ) || "development"
2023
21- const { parsed , error } = config ( {
22- path : [
23- join ( cwd , `.env.${ NODE_ENV } .local` ) ,
24- join ( cwd , ` .env.${ NODE_ENV } ` ) ,
25- join ( cwd , ".env.local" ) ,
26- join ( cwd , ".env" ) ,
27- ] ,
28- } )
24+ const paths = [
25+ `.env. ${ NODE_ENV } .local` ,
26+ `.env.${ NODE_ENV } ` ,
27+ " .env.local" ,
28+ ".env" ,
29+ ] . map ( file => prepend ( file , options ?. path ) )
30+
31+ const { parsed , error } = config ( { ... options , path : paths } )
2932
3033 if ( ! parsed )
3134 throw new Error ( "Environment variables could not be loaded." , {
@@ -36,3 +39,12 @@ export function loadEnv(): LoadedEnv {
3639 process . env = merged
3740 return merged
3841}
42+
43+ function prepend ( file : string , path : string | undefined ) : string {
44+ return path ? join ( path , file ) : file
45+ }
46+
47+ export interface LoadEnvOptions extends Omit < DotenvConfigOptions , "path" > {
48+ /** Where to find `.env` files. */
49+ readonly path ?: string | undefined
50+ }
0 commit comments