@expo/env 2.0.11 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type EnvOutput } from './parse';
1
2
  /** Determine if the `.env` files are enabled or not, through `EXPO_NO_DOTENV` */
2
3
  export declare function isEnabled(): boolean;
3
4
  /** All conventional modes that should not cause warnings */
@@ -22,9 +23,9 @@ export declare function getEnvFiles({ mode, silent, }?: {
22
23
  */
23
24
  export declare function parseEnvFiles(envFiles: string[], { systemEnv, }?: {
24
25
  /** The system environment to use when expanding environment variables, defaults to `process.env` */
25
- systemEnv?: NodeJS.ProcessEnv;
26
+ systemEnv?: EnvOutput;
26
27
  }): {
27
- env: Record<string, string>;
28
+ env: EnvOutput;
28
29
  files: string[];
29
30
  };
30
31
  /**
@@ -43,7 +44,7 @@ export declare function loadEnvFiles(envFiles: string[], { force, silent, system
43
44
  loaded: any;
44
45
  } | {
45
46
  loaded: string[];
46
- env: Record<string, string>;
47
+ env: EnvOutput;
47
48
  files: string[];
48
49
  result: "loaded";
49
50
  };
@@ -52,7 +53,7 @@ export declare function loadEnvFiles(envFiles: string[], { force, silent, system
52
53
  * This does not check for collisions of existing system environment variables, or mutates the system environment variables.
53
54
  */
54
55
  export declare function parseProjectEnv(projectRoot: string, options?: Parameters<typeof getEnvFiles>[0] & Parameters<typeof parseEnvFiles>[1]): {
55
- env: Record<string, string>;
56
+ env: EnvOutput;
56
57
  files: string[];
57
58
  };
58
59
  /**
@@ -66,7 +67,7 @@ export declare function loadProjectEnv(projectRoot: string, options?: Parameters
66
67
  loaded: any;
67
68
  } | {
68
69
  loaded: string[];
69
- env: Record<string, string>;
70
+ env: EnvOutput;
70
71
  files: string[];
71
72
  result: "loaded";
72
73
  };
@@ -76,7 +77,7 @@ export declare function logLoadedEnv(envInfo: ReturnType<typeof loadEnvFiles>, o
76
77
  loaded: any;
77
78
  } | {
78
79
  loaded: string[];
79
- env: Record<string, string>;
80
+ env: EnvOutput;
80
81
  files: string[];
81
82
  result: "loaded";
82
83
  };
@@ -90,7 +91,7 @@ export declare function get(projectRoot: string, { force, silent, }?: {
90
91
  force?: boolean;
91
92
  silent?: boolean;
92
93
  }): {
93
- env: Record<string, string>;
94
+ env: EnvOutput;
94
95
  files: string[];
95
96
  };
96
97
  /**
@@ -112,3 +113,7 @@ export declare function load(projectRoot: string, options?: {
112
113
  export declare function getFiles(mode: string | undefined, { silent }?: {
113
114
  silent?: boolean;
114
115
  }): string[];
116
+ /**
117
+ * Parses the contents of a single `.env` file, optionally expanding it immediately.
118
+ */
119
+ export declare function parseEnv(contents: string, sourceEnv?: EnvOutput): EnvOutput;
package/build/index.js CHANGED
@@ -12,6 +12,7 @@ exports.load = load;
12
12
  exports.loadEnvFiles = loadEnvFiles;
13
13
  exports.loadProjectEnv = loadProjectEnv;
14
14
  exports.logLoadedEnv = logLoadedEnv;
15
+ exports.parseEnv = parseEnv;
15
16
  exports.parseEnvFiles = parseEnvFiles;
16
17
  exports.parseProjectEnv = parseProjectEnv;
17
18
  function _chalk() {
@@ -21,20 +22,6 @@ function _chalk() {
21
22
  };
22
23
  return data;
23
24
  }
24
- function dotenv() {
25
- const data = _interopRequireWildcard(require("dotenv"));
26
- dotenv = function () {
27
- return data;
28
- };
29
- return data;
30
- }
31
- function _dotenvExpand() {
32
- const data = require("dotenv-expand");
33
- _dotenvExpand = function () {
34
- return data;
35
- };
36
- return data;
37
- }
38
25
  function _getenv() {
39
26
  const data = require("getenv");
40
27
  _getenv = function () {
@@ -63,8 +50,13 @@ function _nodePath() {
63
50
  };
64
51
  return data;
65
52
  }
66
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
67
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
53
+ function _parse() {
54
+ const data = require("./parse");
55
+ _parse = function () {
56
+ return data;
57
+ };
58
+ return data;
59
+ }
68
60
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
69
61
  const debug = require('debug')('expo:env');
70
62
 
@@ -140,12 +132,7 @@ function parseEnvFiles(envFiles, {
140
132
  [...envFiles].reverse().forEach(envFile => {
141
133
  try {
142
134
  const envFileContent = _nodeFs().default.readFileSync(envFile, 'utf8');
143
- const envFileParsed = dotenv().parse(envFileContent);
144
-
145
- // If there are parsing issues, mark the file as not-parsed
146
- if (!envFileParsed) {
147
- return debug(`Failed to load environment variables from: ${envFile}%s`);
148
- }
135
+ const envFileParsed = (0, _parse().parse)(envFileContent);
149
136
  loadedEnvFiles.push(envFile);
150
137
  debug(`Loaded environment variables from: ${envFile}`);
151
138
  for (const key of Object.keys(envFileParsed)) {
@@ -168,7 +155,7 @@ function parseEnvFiles(envFiles, {
168
155
  }
169
156
  });
170
157
  return {
171
- env: expandEnvFromSystem(loadedEnvVars, systemEnv),
158
+ env: (0, _parse().expand)(loadedEnvVars, systemEnv),
172
159
  files: loadedEnvFiles.reverse()
173
160
  };
174
161
  }
@@ -212,35 +199,6 @@ function loadEnvFiles(envFiles, {
212
199
  };
213
200
  }
214
201
 
215
- /**
216
- * Expand the parsed environment variables using the existing system environment variables.
217
- * This does not mutate the existing system environment variables, and only returns the expanded variables.
218
- */
219
- function expandEnvFromSystem(parsedEnv, systemEnv = process.env) {
220
- const expandedEnv = {};
221
-
222
- // Pass a clone of the system environment variables to avoid mutating the original environment.
223
- // When the expansion is done, we only store the environment variables that were initially parsed from `parsedEnv`.
224
- const allExpandedEnv = (0, _dotenvExpand().expand)({
225
- parsed: parsedEnv,
226
- processEnv: {
227
- ...systemEnv
228
- }
229
- });
230
- if (allExpandedEnv.error) {
231
- _nodeConsole().default.error(`Failed to expand environment variables, using non-expanded environment variables: ${allExpandedEnv.error}`);
232
- return parsedEnv;
233
- }
234
-
235
- // Only store the values that were initially parsed, from `parsedEnv`.
236
- for (const key of Object.keys(parsedEnv)) {
237
- if (allExpandedEnv.parsed?.[key]) {
238
- expandedEnv[key] = allExpandedEnv.parsed[key];
239
- }
240
- }
241
- return expandedEnv;
242
- }
243
-
244
202
  /**
245
203
  * Parse all environment variables using the detected list of `.env*` files from a project.
246
204
  * This does not check for collisions of existing system environment variables, or mutates the system environment variables.
@@ -353,4 +311,16 @@ function getFiles(mode, {
353
311
  silent
354
312
  });
355
313
  }
314
+
315
+ /**
316
+ * Parses the contents of a single `.env` file, optionally expanding it immediately.
317
+ */
318
+ function parseEnv(contents, sourceEnv) {
319
+ try {
320
+ const env = (0, _parse().parse)(contents);
321
+ return (0, _parse().expand)(env, sourceEnv || {});
322
+ } catch {
323
+ return {};
324
+ }
325
+ }
356
326
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_chalk","data","_interopRequireDefault","require","dotenv","_interopRequireWildcard","_dotenvExpand","_getenv","_nodeConsole","_nodeFs","_nodePath","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","debug","isEnabled","boolish","KNOWN_MODES","exports","LOADED_ENV_NAME","getEnvFiles","mode","process","env","NODE_ENV","silent","logError","console","error","logWarning","warn","includes","filter","Boolean","parseEnvFiles","envFiles","systemEnv","files","loadedEnvVars","loadedEnvFiles","reverse","forEach","envFile","envFileContent","fs","readFileSync","envFileParsed","parse","push","key","keys","code","expandEnvFromSystem","loadEnvFiles","force","result","loaded","JSON","parsed","loadedEnvKeys","stringify","parsedEnv","expandedEnv","allExpandedEnv","dotenvExpand","processEnv","parseProjectEnv","projectRoot","options","map","path","join","loadProjectEnv","logLoadedEnv","envInfo","length","log","chalk","gray","file","basename","memo","load","getFiles"],"sources":["../src/index.ts"],"sourcesContent":["import chalk from 'chalk';\nimport * as dotenv from 'dotenv';\nimport { expand as dotenvExpand } from 'dotenv-expand';\nimport { boolish } from 'getenv';\nimport console from 'node:console';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst debug = require('debug')('expo:env') as typeof console.log;\n\n/** Determine if the `.env` files are enabled or not, through `EXPO_NO_DOTENV` */\nexport function isEnabled() {\n return !boolish('EXPO_NO_DOTENV', false);\n}\n\n/** All conventional modes that should not cause warnings */\nexport const KNOWN_MODES = ['development', 'test', 'production'];\n\n/** The environment variable name to use when marking the environment as loaded */\nexport const LOADED_ENV_NAME = '__EXPO_ENV_LOADED';\n\n/**\n * Get a list of all `.env*` files based on the `NODE_ENV` mode.\n * This returns a list of files, in order of highest priority to lowest priority.\n *\n * @see https://github.com/bkeepers/dotenv/tree/v3.1.4#customizing-rails\n */\nexport function getEnvFiles({\n mode = process.env.NODE_ENV,\n silent,\n}: {\n /** The mode to use when creating the list of `.env*` files, defaults to `NODE_ENV` */\n mode?: string;\n /** If possible misconfiguration warnings should be logged, or only logged as debug log */\n silent?: boolean;\n} = {}) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return [];\n }\n\n const logError = silent ? debug : console.error;\n const logWarning = silent ? debug : console.warn;\n\n if (!mode) {\n logError(\n `The NODE_ENV environment variable is required but was not specified. Ensure the project is bundled with Expo CLI or NODE_ENV is set. Using only .env.local and .env`\n );\n return ['.env.local', '.env'];\n }\n\n if (!KNOWN_MODES.includes(mode)) {\n logWarning(\n `NODE_ENV=\"${mode}\" is non-conventional and might cause development code to run in production. Use \"development\", \"test\", or \"production\" instead. Continuing with non-conventional mode`\n );\n }\n\n // see: https://github.com/bkeepers/dotenv/tree/v3.1.4#customizing-rails\n return [\n `.env.${mode}.local`,\n // Don't include `.env.local` for `test` environment\n // since normally you expect tests to produce the same\n // results for everyone\n mode !== 'test' && `.env.local`,\n `.env.${mode}`,\n `.env`,\n ].filter(Boolean) as string[];\n}\n\n/**\n * Parse all environment variables using the list of `.env*` files, in order of higest priority to lowest priority.\n * This does not check for collisions of existing system environment variables, or mutates the system environment variables.\n */\nexport function parseEnvFiles(\n envFiles: string[],\n {\n systemEnv = process.env,\n }: {\n /** The system environment to use when expanding environment variables, defaults to `process.env` */\n systemEnv?: NodeJS.ProcessEnv;\n } = {}\n) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return { env: {}, files: [] };\n }\n\n // Load environment variables from .env* files. Suppress warnings using silent\n // if this file is missing. Dotenv will only parse the environment variables,\n // `@expo/env` will set the resulting variables to the current process.\n // Variable expansion is supported in .env files, and executed as final step.\n // https://github.com/motdotla/dotenv\n // https://github.com/motdotla/dotenv-expand\n const loadedEnvVars: dotenv.DotenvParseOutput = {};\n const loadedEnvFiles: string[] = [];\n\n // Iterate over each dotenv file in lowest prio to highest prio order.\n // This step won't write to the process.env, but will overwrite the parsed envs.\n [...envFiles].reverse().forEach((envFile) => {\n try {\n const envFileContent = fs.readFileSync(envFile, 'utf8');\n const envFileParsed = dotenv.parse(envFileContent);\n\n // If there are parsing issues, mark the file as not-parsed\n if (!envFileParsed) {\n return debug(`Failed to load environment variables from: ${envFile}%s`);\n }\n\n loadedEnvFiles.push(envFile);\n debug(`Loaded environment variables from: ${envFile}`);\n\n for (const key of Object.keys(envFileParsed)) {\n if (typeof loadedEnvVars[key] !== 'undefined') {\n debug(`\"${key}\" is already defined and overwritten by: ${envFile}`);\n }\n\n loadedEnvVars[key] = envFileParsed[key];\n }\n } catch (error: any) {\n if ('code' in error && error.code === 'ENOENT') {\n return debug(`${envFile} does not exist, skipping this env file`);\n }\n if ('code' in error && error.code === 'EISDIR') {\n return debug(`${envFile} is a directory, skipping this env file`);\n }\n if ('code' in error && error.code === 'EACCES') {\n return debug(`No permission to read ${envFile}, skipping this env file`);\n }\n\n throw error;\n }\n });\n\n return {\n env: expandEnvFromSystem(loadedEnvVars, systemEnv),\n files: loadedEnvFiles.reverse(),\n };\n}\n\n/**\n * Parse all environment variables using the list of `.env*` files, and mutate the system environment with these variables.\n * This won't override existing environment variables defined in the system environment.\n * Once the mutations are done, this will also set a propert `__EXPO_ENV=true` on the system env to avoid multiple mutations.\n * This check can be disabled through `{ force: true }`.\n */\nexport function loadEnvFiles(\n envFiles: string[],\n {\n force,\n silent = false,\n systemEnv = process.env,\n }: Parameters<typeof parseEnvFiles>[1] & {\n /** If the environment variables should be applied to the system environment, regardless of previous mutations */\n force?: boolean;\n /** If possible misconfiguration warnings should be logged, or only logged as debug log */\n silent?: boolean;\n } = {}\n) {\n if (!force && systemEnv[LOADED_ENV_NAME]) {\n return { result: 'skipped' as const, loaded: JSON.parse(systemEnv[LOADED_ENV_NAME]) };\n }\n\n const parsed = parseEnvFiles(envFiles, { systemEnv });\n const loadedEnvKeys: string[] = [];\n\n for (const key in parsed.env) {\n if (typeof systemEnv[key] !== 'undefined') {\n debug(`\"${key}\" is already defined and IS NOT overwritten`);\n } else {\n systemEnv[key] = parsed.env[key];\n loadedEnvKeys.push(key);\n }\n }\n\n // Mark the environment as loaded\n systemEnv[LOADED_ENV_NAME] = JSON.stringify(loadedEnvKeys);\n\n return { result: 'loaded' as const, ...parsed, loaded: loadedEnvKeys };\n}\n\n/**\n * Expand the parsed environment variables using the existing system environment variables.\n * This does not mutate the existing system environment variables, and only returns the expanded variables.\n */\nfunction expandEnvFromSystem(\n parsedEnv: Record<string, string>,\n systemEnv: NodeJS.ProcessEnv = process.env\n) {\n const expandedEnv: Record<string, string> = {};\n\n // Pass a clone of the system environment variables to avoid mutating the original environment.\n // When the expansion is done, we only store the environment variables that were initially parsed from `parsedEnv`.\n const allExpandedEnv = dotenvExpand({\n parsed: parsedEnv,\n processEnv: { ...systemEnv } as Record<string, string>,\n });\n\n if (allExpandedEnv.error) {\n console.error(\n `Failed to expand environment variables, using non-expanded environment variables: ${allExpandedEnv.error}`\n );\n return parsedEnv;\n }\n\n // Only store the values that were initially parsed, from `parsedEnv`.\n for (const key of Object.keys(parsedEnv)) {\n if (allExpandedEnv.parsed?.[key]) {\n expandedEnv[key] = allExpandedEnv.parsed[key];\n }\n }\n\n return expandedEnv;\n}\n\n/**\n * Parse all environment variables using the detected list of `.env*` files from a project.\n * This does not check for collisions of existing system environment variables, or mutates the system environment variables.\n */\nexport function parseProjectEnv(\n projectRoot: string,\n options?: Parameters<typeof getEnvFiles>[0] & Parameters<typeof parseEnvFiles>[1]\n) {\n return parseEnvFiles(\n getEnvFiles(options).map((envFile) => path.join(projectRoot, envFile)),\n options\n );\n}\n\n/**\n * Parse all environment variables using the detected list of `.env*` files from a project.\n * This won't override existing environment variables defined in the system environment.\n * Once the mutations are done, this will also set a propert `__EXPO_ENV=true` on the system env to avoid multiple mutations.\n * This check can be disabled through `{ force: true }`.\n */\nexport function loadProjectEnv(\n projectRoot: string,\n options?: Parameters<typeof getEnvFiles>[0] & Parameters<typeof loadEnvFiles>[1]\n) {\n return loadEnvFiles(\n getEnvFiles(options).map((envFile) => path.join(projectRoot, envFile)),\n options\n );\n}\n\n/** Log the loaded environment info from the loaded results */\nexport function logLoadedEnv(\n envInfo: ReturnType<typeof loadEnvFiles>,\n options: Parameters<typeof loadEnvFiles>[1] = {}\n) {\n // Skip when running in force mode, or no environment variables are loaded\n if (options.force || options.silent || !envInfo.loaded.length) return envInfo;\n\n // Log the loaded environment files, when not skipped\n if (envInfo.result === 'loaded') {\n console.log(\n chalk.gray('env: load', envInfo.files.map((file) => path.basename(file)).join(' '))\n );\n }\n\n // Log the loaded environment variables\n console.log(chalk.gray('env: export', envInfo.loaded.join(' ')));\n\n return envInfo;\n}\n\n// Legacy API - for backwards compatibility\n\nlet memo: ReturnType<typeof parseEnvFiles> | null = null;\n\n/**\n * Get the environment variables without mutating the environment.\n * This returns memoized values unless the `force` property is provided.\n *\n * @deprecated use {@link parseProjectEnv} instead\n */\nexport function get(\n projectRoot: string,\n {\n force,\n silent,\n }: {\n force?: boolean;\n silent?: boolean;\n } = {}\n) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return { env: {}, files: [] };\n }\n if (force || !memo) {\n memo = parseProjectEnv(projectRoot, { silent });\n }\n return memo;\n}\n\n/**\n * Load environment variables from .env files and mutate the current `process.env` with the results.\n *\n * @deprecated use {@link loadProjectEnv} instead\n */\nexport function load(\n projectRoot: string,\n options: {\n force?: boolean;\n silent?: boolean;\n } = {}\n) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return process.env;\n }\n\n const envInfo = get(projectRoot, options);\n const loadedEnvKeys: string[] = [];\n\n for (const key in envInfo.env) {\n if (typeof process.env[key] !== 'undefined') {\n debug(`\"${key}\" is already defined and IS NOT overwritten`);\n } else {\n // Avoid creating a new object, mutate it instead as this causes problems in Bun\n process.env[key] = envInfo.env[key];\n loadedEnvKeys.push(key);\n }\n }\n\n // Port the result of `get` to the newer result object\n logLoadedEnv({ ...envInfo, result: 'loaded', loaded: loadedEnvKeys }, options);\n\n return process.env;\n}\n\n/**\n * Get a list of all `.env*` files based on the `NODE_ENV` mode.\n * This returns a list of files, in order of highest priority to lowest priority.\n *\n * @deprecated use {@link getEnvFiles} instead\n * @see https://github.com/bkeepers/dotenv/tree/v3.1.4#customizing-rails\n */\nexport function getFiles(mode: string | undefined, { silent = false }: { silent?: boolean } = {}) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return [];\n }\n\n return getEnvFiles({ mode, silent });\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_chalk","data","_interopRequireDefault","require","_getenv","_nodeConsole","_nodeFs","_nodePath","_parse","e","__esModule","default","debug","isEnabled","boolish","KNOWN_MODES","exports","LOADED_ENV_NAME","getEnvFiles","mode","process","env","NODE_ENV","silent","logError","console","error","logWarning","warn","includes","filter","Boolean","parseEnvFiles","envFiles","systemEnv","files","loadedEnvVars","loadedEnvFiles","reverse","forEach","envFile","envFileContent","fs","readFileSync","envFileParsed","parse","push","key","Object","keys","code","expand","loadEnvFiles","force","result","loaded","JSON","parsed","loadedEnvKeys","stringify","parseProjectEnv","projectRoot","options","map","path","join","loadProjectEnv","logLoadedEnv","envInfo","length","log","chalk","gray","file","basename","memo","get","load","getFiles","parseEnv","contents","sourceEnv"],"sources":["../src/index.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { boolish } from 'getenv';\nimport console from 'node:console';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { parse, expand, type EnvOutput } from './parse';\n\nconst debug = require('debug')('expo:env') as typeof console.log;\n\n/** Determine if the `.env` files are enabled or not, through `EXPO_NO_DOTENV` */\nexport function isEnabled() {\n return !boolish('EXPO_NO_DOTENV', false);\n}\n\n/** All conventional modes that should not cause warnings */\nexport const KNOWN_MODES = ['development', 'test', 'production'];\n\n/** The environment variable name to use when marking the environment as loaded */\nexport const LOADED_ENV_NAME = '__EXPO_ENV_LOADED';\n\n/**\n * Get a list of all `.env*` files based on the `NODE_ENV` mode.\n * This returns a list of files, in order of highest priority to lowest priority.\n *\n * @see https://github.com/bkeepers/dotenv/tree/v3.1.4#customizing-rails\n */\nexport function getEnvFiles({\n mode = process.env.NODE_ENV,\n silent,\n}: {\n /** The mode to use when creating the list of `.env*` files, defaults to `NODE_ENV` */\n mode?: string;\n /** If possible misconfiguration warnings should be logged, or only logged as debug log */\n silent?: boolean;\n} = {}) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return [];\n }\n\n const logError = silent ? debug : console.error;\n const logWarning = silent ? debug : console.warn;\n\n if (!mode) {\n logError(\n `The NODE_ENV environment variable is required but was not specified. Ensure the project is bundled with Expo CLI or NODE_ENV is set. Using only .env.local and .env`\n );\n return ['.env.local', '.env'];\n }\n\n if (!KNOWN_MODES.includes(mode)) {\n logWarning(\n `NODE_ENV=\"${mode}\" is non-conventional and might cause development code to run in production. Use \"development\", \"test\", or \"production\" instead. Continuing with non-conventional mode`\n );\n }\n\n // see: https://github.com/bkeepers/dotenv/tree/v3.1.4#customizing-rails\n return [\n `.env.${mode}.local`,\n // Don't include `.env.local` for `test` environment\n // since normally you expect tests to produce the same\n // results for everyone\n mode !== 'test' && `.env.local`,\n `.env.${mode}`,\n `.env`,\n ].filter(Boolean) as string[];\n}\n\n/**\n * Parse all environment variables using the list of `.env*` files, in order of higest priority to lowest priority.\n * This does not check for collisions of existing system environment variables, or mutates the system environment variables.\n */\nexport function parseEnvFiles(\n envFiles: string[],\n {\n systemEnv = process.env,\n }: {\n /** The system environment to use when expanding environment variables, defaults to `process.env` */\n systemEnv?: EnvOutput;\n } = {}\n) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return { env: {}, files: [] };\n }\n\n // Load environment variables from .env* files. Suppress warnings using silent\n // if this file is missing. Dotenv will only parse the environment variables,\n // `@expo/env` will set the resulting variables to the current process.\n // Variable expansion is supported in .env files, and executed as final step.\n // https://github.com/motdotla/dotenv\n // https://github.com/motdotla/dotenv-expand\n const loadedEnvVars: EnvOutput = {};\n const loadedEnvFiles: string[] = [];\n\n // Iterate over each dotenv file in lowest prio to highest prio order.\n // This step won't write to the process.env, but will overwrite the parsed envs.\n [...envFiles].reverse().forEach((envFile) => {\n try {\n const envFileContent = fs.readFileSync(envFile, 'utf8');\n const envFileParsed = parse(envFileContent);\n\n loadedEnvFiles.push(envFile);\n debug(`Loaded environment variables from: ${envFile}`);\n\n for (const key of Object.keys(envFileParsed)) {\n if (typeof loadedEnvVars[key] !== 'undefined') {\n debug(`\"${key}\" is already defined and overwritten by: ${envFile}`);\n }\n\n loadedEnvVars[key] = envFileParsed[key];\n }\n } catch (error: any) {\n if ('code' in error && error.code === 'ENOENT') {\n return debug(`${envFile} does not exist, skipping this env file`);\n }\n if ('code' in error && error.code === 'EISDIR') {\n return debug(`${envFile} is a directory, skipping this env file`);\n }\n if ('code' in error && error.code === 'EACCES') {\n return debug(`No permission to read ${envFile}, skipping this env file`);\n }\n\n throw error;\n }\n });\n\n return {\n env: expand(loadedEnvVars, systemEnv),\n files: loadedEnvFiles.reverse(),\n };\n}\n\n/**\n * Parse all environment variables using the list of `.env*` files, and mutate the system environment with these variables.\n * This won't override existing environment variables defined in the system environment.\n * Once the mutations are done, this will also set a propert `__EXPO_ENV=true` on the system env to avoid multiple mutations.\n * This check can be disabled through `{ force: true }`.\n */\nexport function loadEnvFiles(\n envFiles: string[],\n {\n force,\n silent = false,\n systemEnv = process.env,\n }: Parameters<typeof parseEnvFiles>[1] & {\n /** If the environment variables should be applied to the system environment, regardless of previous mutations */\n force?: boolean;\n /** If possible misconfiguration warnings should be logged, or only logged as debug log */\n silent?: boolean;\n } = {}\n) {\n if (!force && systemEnv[LOADED_ENV_NAME]) {\n return { result: 'skipped' as const, loaded: JSON.parse(systemEnv[LOADED_ENV_NAME]) };\n }\n\n const parsed = parseEnvFiles(envFiles, { systemEnv });\n const loadedEnvKeys: string[] = [];\n\n for (const key in parsed.env) {\n if (typeof systemEnv[key] !== 'undefined') {\n debug(`\"${key}\" is already defined and IS NOT overwritten`);\n } else {\n systemEnv[key] = parsed.env[key];\n loadedEnvKeys.push(key);\n }\n }\n\n // Mark the environment as loaded\n systemEnv[LOADED_ENV_NAME] = JSON.stringify(loadedEnvKeys);\n\n return { result: 'loaded' as const, ...parsed, loaded: loadedEnvKeys };\n}\n\n/**\n * Parse all environment variables using the detected list of `.env*` files from a project.\n * This does not check for collisions of existing system environment variables, or mutates the system environment variables.\n */\nexport function parseProjectEnv(\n projectRoot: string,\n options?: Parameters<typeof getEnvFiles>[0] & Parameters<typeof parseEnvFiles>[1]\n) {\n return parseEnvFiles(\n getEnvFiles(options).map((envFile) => path.join(projectRoot, envFile)),\n options\n );\n}\n\n/**\n * Parse all environment variables using the detected list of `.env*` files from a project.\n * This won't override existing environment variables defined in the system environment.\n * Once the mutations are done, this will also set a propert `__EXPO_ENV=true` on the system env to avoid multiple mutations.\n * This check can be disabled through `{ force: true }`.\n */\nexport function loadProjectEnv(\n projectRoot: string,\n options?: Parameters<typeof getEnvFiles>[0] & Parameters<typeof loadEnvFiles>[1]\n) {\n return loadEnvFiles(\n getEnvFiles(options).map((envFile) => path.join(projectRoot, envFile)),\n options\n );\n}\n\n/** Log the loaded environment info from the loaded results */\nexport function logLoadedEnv(\n envInfo: ReturnType<typeof loadEnvFiles>,\n options: Parameters<typeof loadEnvFiles>[1] = {}\n) {\n // Skip when running in force mode, or no environment variables are loaded\n if (options.force || options.silent || !envInfo.loaded.length) return envInfo;\n\n // Log the loaded environment files, when not skipped\n if (envInfo.result === 'loaded') {\n console.log(\n chalk.gray('env: load', envInfo.files.map((file) => path.basename(file)).join(' '))\n );\n }\n\n // Log the loaded environment variables\n console.log(chalk.gray('env: export', envInfo.loaded.join(' ')));\n\n return envInfo;\n}\n\n// Legacy API - for backwards compatibility\n\nlet memo: ReturnType<typeof parseEnvFiles> | null = null;\n\n/**\n * Get the environment variables without mutating the environment.\n * This returns memoized values unless the `force` property is provided.\n *\n * @deprecated use {@link parseProjectEnv} instead\n */\nexport function get(\n projectRoot: string,\n {\n force,\n silent,\n }: {\n force?: boolean;\n silent?: boolean;\n } = {}\n) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return { env: {}, files: [] };\n }\n if (force || !memo) {\n memo = parseProjectEnv(projectRoot, { silent });\n }\n return memo;\n}\n\n/**\n * Load environment variables from .env files and mutate the current `process.env` with the results.\n *\n * @deprecated use {@link loadProjectEnv} instead\n */\nexport function load(\n projectRoot: string,\n options: {\n force?: boolean;\n silent?: boolean;\n } = {}\n) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return process.env;\n }\n\n const envInfo = get(projectRoot, options);\n const loadedEnvKeys: string[] = [];\n\n for (const key in envInfo.env) {\n if (typeof process.env[key] !== 'undefined') {\n debug(`\"${key}\" is already defined and IS NOT overwritten`);\n } else {\n // Avoid creating a new object, mutate it instead as this causes problems in Bun\n process.env[key] = envInfo.env[key];\n loadedEnvKeys.push(key);\n }\n }\n\n // Port the result of `get` to the newer result object\n logLoadedEnv({ ...envInfo, result: 'loaded', loaded: loadedEnvKeys }, options);\n\n return process.env;\n}\n\n/**\n * Get a list of all `.env*` files based on the `NODE_ENV` mode.\n * This returns a list of files, in order of highest priority to lowest priority.\n *\n * @deprecated use {@link getEnvFiles} instead\n * @see https://github.com/bkeepers/dotenv/tree/v3.1.4#customizing-rails\n */\nexport function getFiles(mode: string | undefined, { silent = false }: { silent?: boolean } = {}) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return [];\n }\n\n return getEnvFiles({ mode, silent });\n}\n\n/**\n * Parses the contents of a single `.env` file, optionally expanding it immediately.\n */\nexport function parseEnv(contents: string, sourceEnv?: EnvOutput): EnvOutput {\n try {\n const env = parse(contents);\n return expand(env, sourceEnv || {});\n } catch {\n return {};\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,QAAA;EAAA,MAAAH,IAAA,GAAAE,OAAA;EAAAC,OAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAI,aAAA;EAAA,MAAAJ,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAE,YAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAK,QAAA;EAAA,MAAAL,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAG,OAAA,YAAAA,CAAA;IAAA,OAAAL,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAM,UAAA;EAAA,MAAAN,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAI,SAAA,YAAAA,CAAA;IAAA,OAAAN,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAO,OAAA;EAAA,MAAAP,IAAA,GAAAE,OAAA;EAAAK,MAAA,YAAAA,CAAA;IAAA,OAAAP,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAwD,SAAAC,uBAAAO,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAExD,MAAMG,KAAK,GAAGT,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,CAAuB;;AAEhE;AACO,SAASU,SAASA,CAAA,EAAG;EAC1B,OAAO,CAAC,IAAAC,iBAAO,EAAC,gBAAgB,EAAE,KAAK,CAAC;AAC1C;;AAEA;AACO,MAAMC,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,CAAC;;AAEhE;AACO,MAAME,eAAe,GAAAD,OAAA,CAAAC,eAAA,GAAG,mBAAmB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,WAAWA,CAAC;EAC1BC,IAAI,GAAGC,OAAO,CAACC,GAAG,CAACC,QAAQ;EAC3BC;AAMF,CAAC,GAAG,CAAC,CAAC,EAAE;EACN,IAAI,CAACV,SAAS,CAAC,CAAC,EAAE;IAChBD,KAAK,CAAC,uDAAuD,CAAC;IAC9D,OAAO,EAAE;EACX;EAEA,MAAMY,QAAQ,GAAGD,MAAM,GAAGX,KAAK,GAAGa,sBAAO,CAACC,KAAK;EAC/C,MAAMC,UAAU,GAAGJ,MAAM,GAAGX,KAAK,GAAGa,sBAAO,CAACG,IAAI;EAEhD,IAAI,CAACT,IAAI,EAAE;IACTK,QAAQ,CACN,qKACF,CAAC;IACD,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;EAC/B;EAEA,IAAI,CAACT,WAAW,CAACc,QAAQ,CAACV,IAAI,CAAC,EAAE;IAC/BQ,UAAU,CACR,aAAaR,IAAI,wKACnB,CAAC;EACH;;EAEA;EACA,OAAO,CACL,QAAQA,IAAI,QAAQ;EACpB;EACA;EACA;EACAA,IAAI,KAAK,MAAM,IAAI,YAAY,EAC/B,QAAQA,IAAI,EAAE,EACd,MAAM,CACP,CAACW,MAAM,CAACC,OAAO,CAAC;AACnB;;AAEA;AACA;AACA;AACA;AACO,SAASC,aAAaA,CAC3BC,QAAkB,EAClB;EACEC,SAAS,GAAGd,OAAO,CAACC;AAItB,CAAC,GAAG,CAAC,CAAC,EACN;EACA,IAAI,CAACR,SAAS,CAAC,CAAC,EAAE;IAChBD,KAAK,CAAC,uDAAuD,CAAC;IAC9D,OAAO;MAAES,GAAG,EAAE,CAAC,CAAC;MAAEc,KAAK,EAAE;IAAG,CAAC;EAC/B;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA,MAAMC,aAAwB,GAAG,CAAC,CAAC;EACnC,MAAMC,cAAwB,GAAG,EAAE;;EAEnC;EACA;EACA,CAAC,GAAGJ,QAAQ,CAAC,CAACK,OAAO,CAAC,CAAC,CAACC,OAAO,CAAEC,OAAO,IAAK;IAC3C,IAAI;MACF,MAAMC,cAAc,GAAGC,iBAAE,CAACC,YAAY,CAACH,OAAO,EAAE,MAAM,CAAC;MACvD,MAAMI,aAAa,GAAG,IAAAC,cAAK,EAACJ,cAAc,CAAC;MAE3CJ,cAAc,CAACS,IAAI,CAACN,OAAO,CAAC;MAC5B5B,KAAK,CAAC,sCAAsC4B,OAAO,EAAE,CAAC;MAEtD,KAAK,MAAMO,GAAG,IAAIC,MAAM,CAACC,IAAI,CAACL,aAAa,CAAC,EAAE;QAC5C,IAAI,OAAOR,aAAa,CAACW,GAAG,CAAC,KAAK,WAAW,EAAE;UAC7CnC,KAAK,CAAC,IAAImC,GAAG,4CAA4CP,OAAO,EAAE,CAAC;QACrE;QAEAJ,aAAa,CAACW,GAAG,CAAC,GAAGH,aAAa,CAACG,GAAG,CAAC;MACzC;IACF,CAAC,CAAC,OAAOrB,KAAU,EAAE;MACnB,IAAI,MAAM,IAAIA,KAAK,IAAIA,KAAK,CAACwB,IAAI,KAAK,QAAQ,EAAE;QAC9C,OAAOtC,KAAK,CAAC,GAAG4B,OAAO,yCAAyC,CAAC;MACnE;MACA,IAAI,MAAM,IAAId,KAAK,IAAIA,KAAK,CAACwB,IAAI,KAAK,QAAQ,EAAE;QAC9C,OAAOtC,KAAK,CAAC,GAAG4B,OAAO,yCAAyC,CAAC;MACnE;MACA,IAAI,MAAM,IAAId,KAAK,IAAIA,KAAK,CAACwB,IAAI,KAAK,QAAQ,EAAE;QAC9C,OAAOtC,KAAK,CAAC,yBAAyB4B,OAAO,0BAA0B,CAAC;MAC1E;MAEA,MAAMd,KAAK;IACb;EACF,CAAC,CAAC;EAEF,OAAO;IACLL,GAAG,EAAE,IAAA8B,eAAM,EAACf,aAAa,EAAEF,SAAS,CAAC;IACrCC,KAAK,EAAEE,cAAc,CAACC,OAAO,CAAC;EAChC,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASc,YAAYA,CAC1BnB,QAAkB,EAClB;EACEoB,KAAK;EACL9B,MAAM,GAAG,KAAK;EACdW,SAAS,GAAGd,OAAO,CAACC;AAMtB,CAAC,GAAG,CAAC,CAAC,EACN;EACA,IAAI,CAACgC,KAAK,IAAInB,SAAS,CAACjB,eAAe,CAAC,EAAE;IACxC,OAAO;MAAEqC,MAAM,EAAE,SAAkB;MAAEC,MAAM,EAAEC,IAAI,CAACX,KAAK,CAACX,SAAS,CAACjB,eAAe,CAAC;IAAE,CAAC;EACvF;EAEA,MAAMwC,MAAM,GAAGzB,aAAa,CAACC,QAAQ,EAAE;IAAEC;EAAU,CAAC,CAAC;EACrD,MAAMwB,aAAuB,GAAG,EAAE;EAElC,KAAK,MAAMX,GAAG,IAAIU,MAAM,CAACpC,GAAG,EAAE;IAC5B,IAAI,OAAOa,SAAS,CAACa,GAAG,CAAC,KAAK,WAAW,EAAE;MACzCnC,KAAK,CAAC,IAAImC,GAAG,6CAA6C,CAAC;IAC7D,CAAC,MAAM;MACLb,SAAS,CAACa,GAAG,CAAC,GAAGU,MAAM,CAACpC,GAAG,CAAC0B,GAAG,CAAC;MAChCW,aAAa,CAACZ,IAAI,CAACC,GAAG,CAAC;IACzB;EACF;;EAEA;EACAb,SAAS,CAACjB,eAAe,CAAC,GAAGuC,IAAI,CAACG,SAAS,CAACD,aAAa,CAAC;EAE1D,OAAO;IAAEJ,MAAM,EAAE,QAAiB;IAAE,GAAGG,MAAM;IAAEF,MAAM,EAAEG;EAAc,CAAC;AACxE;;AAEA;AACA;AACA;AACA;AACO,SAASE,eAAeA,CAC7BC,WAAmB,EACnBC,OAAiF,EACjF;EACA,OAAO9B,aAAa,CAClBd,WAAW,CAAC4C,OAAO,CAAC,CAACC,GAAG,CAAEvB,OAAO,IAAKwB,mBAAI,CAACC,IAAI,CAACJ,WAAW,EAAErB,OAAO,CAAC,CAAC,EACtEsB,OACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASI,cAAcA,CAC5BL,WAAmB,EACnBC,OAAgF,EAChF;EACA,OAAOV,YAAY,CACjBlC,WAAW,CAAC4C,OAAO,CAAC,CAACC,GAAG,CAAEvB,OAAO,IAAKwB,mBAAI,CAACC,IAAI,CAACJ,WAAW,EAAErB,OAAO,CAAC,CAAC,EACtEsB,OACF,CAAC;AACH;;AAEA;AACO,SAASK,YAAYA,CAC1BC,OAAwC,EACxCN,OAA2C,GAAG,CAAC,CAAC,EAChD;EACA;EACA,IAAIA,OAAO,CAACT,KAAK,IAAIS,OAAO,CAACvC,MAAM,IAAI,CAAC6C,OAAO,CAACb,MAAM,CAACc,MAAM,EAAE,OAAOD,OAAO;;EAE7E;EACA,IAAIA,OAAO,CAACd,MAAM,KAAK,QAAQ,EAAE;IAC/B7B,sBAAO,CAAC6C,GAAG,CACTC,gBAAK,CAACC,IAAI,CAAC,WAAW,EAAEJ,OAAO,CAACjC,KAAK,CAAC4B,GAAG,CAAEU,IAAI,IAAKT,mBAAI,CAACU,QAAQ,CAACD,IAAI,CAAC,CAAC,CAACR,IAAI,CAAC,GAAG,CAAC,CACpF,CAAC;EACH;;EAEA;EACAxC,sBAAO,CAAC6C,GAAG,CAACC,gBAAK,CAACC,IAAI,CAAC,aAAa,EAAEJ,OAAO,CAACb,MAAM,CAACU,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;EAEhE,OAAOG,OAAO;AAChB;;AAEA;;AAEA,IAAIO,IAA6C,GAAG,IAAI;;AAExD;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,GAAGA,CACjBf,WAAmB,EACnB;EACER,KAAK;EACL9B;AAIF,CAAC,GAAG,CAAC,CAAC,EACN;EACA,IAAI,CAACV,SAAS,CAAC,CAAC,EAAE;IAChBD,KAAK,CAAC,uDAAuD,CAAC;IAC9D,OAAO;MAAES,GAAG,EAAE,CAAC,CAAC;MAAEc,KAAK,EAAE;IAAG,CAAC;EAC/B;EACA,IAAIkB,KAAK,IAAI,CAACsB,IAAI,EAAE;IAClBA,IAAI,GAAGf,eAAe,CAACC,WAAW,EAAE;MAAEtC;IAAO,CAAC,CAAC;EACjD;EACA,OAAOoD,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASE,IAAIA,CAClBhB,WAAmB,EACnBC,OAGC,GAAG,CAAC,CAAC,EACN;EACA,IAAI,CAACjD,SAAS,CAAC,CAAC,EAAE;IAChBD,KAAK,CAAC,uDAAuD,CAAC;IAC9D,OAAOQ,OAAO,CAACC,GAAG;EACpB;EAEA,MAAM+C,OAAO,GAAGQ,GAAG,CAACf,WAAW,EAAEC,OAAO,CAAC;EACzC,MAAMJ,aAAuB,GAAG,EAAE;EAElC,KAAK,MAAMX,GAAG,IAAIqB,OAAO,CAAC/C,GAAG,EAAE;IAC7B,IAAI,OAAOD,OAAO,CAACC,GAAG,CAAC0B,GAAG,CAAC,KAAK,WAAW,EAAE;MAC3CnC,KAAK,CAAC,IAAImC,GAAG,6CAA6C,CAAC;IAC7D,CAAC,MAAM;MACL;MACA3B,OAAO,CAACC,GAAG,CAAC0B,GAAG,CAAC,GAAGqB,OAAO,CAAC/C,GAAG,CAAC0B,GAAG,CAAC;MACnCW,aAAa,CAACZ,IAAI,CAACC,GAAG,CAAC;IACzB;EACF;;EAEA;EACAoB,YAAY,CAAC;IAAE,GAAGC,OAAO;IAAEd,MAAM,EAAE,QAAQ;IAAEC,MAAM,EAAEG;EAAc,CAAC,EAAEI,OAAO,CAAC;EAE9E,OAAO1C,OAAO,CAACC,GAAG;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASyD,QAAQA,CAAC3D,IAAwB,EAAE;EAAEI,MAAM,GAAG;AAA4B,CAAC,GAAG,CAAC,CAAC,EAAE;EAChG,IAAI,CAACV,SAAS,CAAC,CAAC,EAAE;IAChBD,KAAK,CAAC,uDAAuD,CAAC;IAC9D,OAAO,EAAE;EACX;EAEA,OAAOM,WAAW,CAAC;IAAEC,IAAI;IAAEI;EAAO,CAAC,CAAC;AACtC;;AAEA;AACA;AACA;AACO,SAASwD,QAAQA,CAACC,QAAgB,EAAEC,SAAqB,EAAa;EAC3E,IAAI;IACF,MAAM5D,GAAG,GAAG,IAAAwB,cAAK,EAACmC,QAAQ,CAAC;IAC3B,OAAO,IAAA7B,eAAM,EAAC9B,GAAG,EAAE4D,SAAS,IAAI,CAAC,CAAC,CAAC;EACrC,CAAC,CAAC,MAAM;IACN,OAAO,CAAC,CAAC;EACX;AACF","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ export interface EnvOutput {
2
+ [name: string]: string | undefined;
3
+ }
4
+ export declare function parse<T extends EnvOutput = EnvOutput>(contents: string): T;
5
+ export declare function expand(inputEnv: EnvOutput, sourceEnv: EnvOutput): EnvOutput;
package/build/parse.js ADDED
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.expand = expand;
7
+ exports.parse = parse;
8
+ function _nodeUtil() {
9
+ const data = require("node:util");
10
+ _nodeUtil = function () {
11
+ return data;
12
+ };
13
+ return data;
14
+ }
15
+ function parse(contents) {
16
+ const parsed = (0, _nodeUtil().parseEnv)(contents);
17
+ const env = {};
18
+ // NOTE(@kitten): In Node <=20.20 some keys are not properly trimmed
19
+ for (const key in parsed) env[key.trim()] = parsed[key];
20
+ return env;
21
+ }
22
+
23
+ // See: dotenv-expand@11.0.7
24
+ // https://github.com/motdotla/dotenv-expand/blob/v11.0.7/lib/main.js
25
+ // Copyright (c) 2016, Scott Motte
26
+
27
+ /*
28
+ * (\\)? # is it escaped with a backslash?
29
+ * (\$) # literal $
30
+ * (?!\() # shouldnt be followed by parenthesis
31
+ * (\{?) # first brace wrap opening
32
+ * ([\w.]+) # key
33
+ * (?::-((?:\$\{(?:\$\{(?:\$\{[^}]*\}|[^}])*}|[^}])*}|[^}])+))? # optional default nested 3 times
34
+ * (\}?) # last brace warp closing
35
+ */
36
+ const DOTENV_SUBSTITUTION_REGEX = /(\\)?(\$)(?!\()(\{?)([\w.]+)(?::?-((?:\$\{(?:\$\{(?:\$\{[^}]*\}|[^}])*}|[^}])*}|[^}])+))?(\}?)/gi;
37
+ function interpolate(value, sourceKey, sourceEnv, inputEnv) {
38
+ return value.replace(DOTENV_SUBSTITUTION_REGEX, (match, escaped, _dollarSign, _openBrace, key, defaultValue, _closeBrace) => {
39
+ if (escaped === '\\') {
40
+ return match.slice(1);
41
+ } else if (sourceEnv[key]) {
42
+ return sourceEnv[key] === inputEnv[key] ? sourceEnv[key] : interpolate(sourceEnv[key], key, sourceEnv, inputEnv);
43
+ } else if (inputEnv[key] && key !== sourceKey) {
44
+ return interpolate(inputEnv[key], key, sourceEnv, inputEnv);
45
+ } else if (defaultValue) {
46
+ return defaultValue.startsWith('$') ? interpolate(defaultValue, key, sourceEnv, inputEnv) : defaultValue;
47
+ } else {
48
+ return '';
49
+ }
50
+ });
51
+ }
52
+ function expand(inputEnv, sourceEnv) {
53
+ const outputEnv = {
54
+ ...inputEnv
55
+ };
56
+ for (const key in outputEnv) {
57
+ let value = outputEnv[key];
58
+ if (Object.prototype.hasOwnProperty.call(sourceEnv, key)) {
59
+ value = value != null && sourceEnv[key] === value ? interpolate(value, key, sourceEnv, outputEnv) : sourceEnv[key];
60
+ } else if (value != null) {
61
+ value = interpolate(value, key, sourceEnv, outputEnv);
62
+ }
63
+ if (value != null) {
64
+ outputEnv[key] = value.replace(/\\\$/g, '$');
65
+ }
66
+ }
67
+ return outputEnv;
68
+ }
69
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","names":["_nodeUtil","data","require","parse","contents","parsed","parseEnv","env","key","trim","DOTENV_SUBSTITUTION_REGEX","interpolate","value","sourceKey","sourceEnv","inputEnv","replace","match","escaped","_dollarSign","_openBrace","defaultValue","_closeBrace","slice","startsWith","expand","outputEnv","Object","prototype","hasOwnProperty","call"],"sources":["../src/parse.ts"],"sourcesContent":["import { parseEnv } from 'node:util';\n\nexport interface EnvOutput {\n [name: string]: string | undefined;\n}\n\nexport function parse<T extends EnvOutput = EnvOutput>(contents: string): T {\n const parsed = parseEnv(contents) as EnvOutput;\n const env: EnvOutput = {};\n // NOTE(@kitten): In Node <=20.20 some keys are not properly trimmed\n for (const key in parsed) env[key.trim()] = parsed[key];\n return env as T;\n}\n\n// See: dotenv-expand@11.0.7\n// https://github.com/motdotla/dotenv-expand/blob/v11.0.7/lib/main.js\n// Copyright (c) 2016, Scott Motte\n\n/*\n * (\\\\)? # is it escaped with a backslash?\n * (\\$) # literal $\n * (?!\\() # shouldnt be followed by parenthesis\n * (\\{?) # first brace wrap opening\n * ([\\w.]+) # key\n * (?::-((?:\\$\\{(?:\\$\\{(?:\\$\\{[^}]*\\}|[^}])*}|[^}])*}|[^}])+))? # optional default nested 3 times\n * (\\}?) # last brace warp closing\n */\nconst DOTENV_SUBSTITUTION_REGEX =\n /(\\\\)?(\\$)(?!\\()(\\{?)([\\w.]+)(?::?-((?:\\$\\{(?:\\$\\{(?:\\$\\{[^}]*\\}|[^}])*}|[^}])*}|[^}])+))?(\\}?)/gi;\n\nfunction interpolate(\n value: string,\n sourceKey: string,\n sourceEnv: EnvOutput,\n inputEnv: EnvOutput\n): string {\n return value.replace(\n DOTENV_SUBSTITUTION_REGEX,\n (match, escaped, _dollarSign, _openBrace, key, defaultValue, _closeBrace) => {\n if (escaped === '\\\\') {\n return match.slice(1);\n } else if (sourceEnv[key]) {\n return sourceEnv[key] === inputEnv[key]\n ? sourceEnv[key]\n : interpolate(sourceEnv[key], key, sourceEnv, inputEnv);\n } else if (inputEnv[key] && key !== sourceKey) {\n return interpolate(inputEnv[key], key, sourceEnv, inputEnv);\n } else if (defaultValue) {\n return defaultValue.startsWith('$')\n ? interpolate(defaultValue, key, sourceEnv, inputEnv)\n : defaultValue;\n } else {\n return '';\n }\n }\n );\n}\n\nexport function expand(inputEnv: EnvOutput, sourceEnv: EnvOutput): EnvOutput {\n const outputEnv = { ...inputEnv };\n for (const key in outputEnv) {\n let value = outputEnv[key];\n if (Object.prototype.hasOwnProperty.call(sourceEnv, key)) {\n value =\n value != null && sourceEnv[key] === value\n ? interpolate(value, key, sourceEnv, outputEnv)\n : sourceEnv[key];\n } else if (value != null) {\n value = interpolate(value, key, sourceEnv, outputEnv);\n }\n if (value != null) {\n outputEnv[key] = value.replace(/\\\\\\$/g, '$');\n }\n }\n return outputEnv;\n}\n"],"mappings":";;;;;;;AAAA,SAAAA,UAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,SAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAMO,SAASE,KAAKA,CAAkCC,QAAgB,EAAK;EAC1E,MAAMC,MAAM,GAAG,IAAAC,oBAAQ,EAACF,QAAQ,CAAc;EAC9C,MAAMG,GAAc,GAAG,CAAC,CAAC;EACzB;EACA,KAAK,MAAMC,GAAG,IAAIH,MAAM,EAAEE,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,CAAC,CAAC,GAAGJ,MAAM,CAACG,GAAG,CAAC;EACvD,OAAOD,GAAG;AACZ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMG,yBAAyB,GAC7B,kGAAkG;AAEpG,SAASC,WAAWA,CAClBC,KAAa,EACbC,SAAiB,EACjBC,SAAoB,EACpBC,QAAmB,EACX;EACR,OAAOH,KAAK,CAACI,OAAO,CAClBN,yBAAyB,EACzB,CAACO,KAAK,EAAEC,OAAO,EAAEC,WAAW,EAAEC,UAAU,EAAEZ,GAAG,EAAEa,YAAY,EAAEC,WAAW,KAAK;IAC3E,IAAIJ,OAAO,KAAK,IAAI,EAAE;MACpB,OAAOD,KAAK,CAACM,KAAK,CAAC,CAAC,CAAC;IACvB,CAAC,MAAM,IAAIT,SAAS,CAACN,GAAG,CAAC,EAAE;MACzB,OAAOM,SAAS,CAACN,GAAG,CAAC,KAAKO,QAAQ,CAACP,GAAG,CAAC,GACnCM,SAAS,CAACN,GAAG,CAAC,GACdG,WAAW,CAACG,SAAS,CAACN,GAAG,CAAC,EAAEA,GAAG,EAAEM,SAAS,EAAEC,QAAQ,CAAC;IAC3D,CAAC,MAAM,IAAIA,QAAQ,CAACP,GAAG,CAAC,IAAIA,GAAG,KAAKK,SAAS,EAAE;MAC7C,OAAOF,WAAW,CAACI,QAAQ,CAACP,GAAG,CAAC,EAAEA,GAAG,EAAEM,SAAS,EAAEC,QAAQ,CAAC;IAC7D,CAAC,MAAM,IAAIM,YAAY,EAAE;MACvB,OAAOA,YAAY,CAACG,UAAU,CAAC,GAAG,CAAC,GAC/Bb,WAAW,CAACU,YAAY,EAAEb,GAAG,EAAEM,SAAS,EAAEC,QAAQ,CAAC,GACnDM,YAAY;IAClB,CAAC,MAAM;MACL,OAAO,EAAE;IACX;EACF,CACF,CAAC;AACH;AAEO,SAASI,MAAMA,CAACV,QAAmB,EAAED,SAAoB,EAAa;EAC3E,MAAMY,SAAS,GAAG;IAAE,GAAGX;EAAS,CAAC;EACjC,KAAK,MAAMP,GAAG,IAAIkB,SAAS,EAAE;IAC3B,IAAId,KAAK,GAAGc,SAAS,CAAClB,GAAG,CAAC;IAC1B,IAAImB,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAAChB,SAAS,EAAEN,GAAG,CAAC,EAAE;MACxDI,KAAK,GACHA,KAAK,IAAI,IAAI,IAAIE,SAAS,CAACN,GAAG,CAAC,KAAKI,KAAK,GACrCD,WAAW,CAACC,KAAK,EAAEJ,GAAG,EAAEM,SAAS,EAAEY,SAAS,CAAC,GAC7CZ,SAAS,CAACN,GAAG,CAAC;IACtB,CAAC,MAAM,IAAII,KAAK,IAAI,IAAI,EAAE;MACxBA,KAAK,GAAGD,WAAW,CAACC,KAAK,EAAEJ,GAAG,EAAEM,SAAS,EAAEY,SAAS,CAAC;IACvD;IACA,IAAId,KAAK,IAAI,IAAI,EAAE;MACjBc,SAAS,CAAClB,GAAG,CAAC,GAAGI,KAAK,CAACI,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;IAC9C;EACF;EACA,OAAOU,SAAS;AAClB","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/env",
3
- "version": "2.0.11",
3
+ "version": "2.1.0",
4
4
  "description": "hydrate environment variables from .env files into process.env",
5
5
  "main": "build/index.js",
6
6
  "scripts": {
@@ -29,10 +29,11 @@
29
29
  "dependencies": {
30
30
  "chalk": "^4.0.0",
31
31
  "debug": "^4.3.4",
32
- "dotenv": "~16.4.5",
33
- "dotenv-expand": "~11.0.6",
34
32
  "getenv": "^2.0.0"
35
33
  },
34
+ "engines": {
35
+ "node": ">=20.12.0"
36
+ },
36
37
  "devDependencies": {
37
38
  "@babel/core": "^7.15.5",
38
39
  "@types/getenv": "^1.0.0",
@@ -41,5 +42,5 @@
41
42
  "publishConfig": {
42
43
  "access": "public"
43
44
  },
44
- "gitHead": "7d7f6762fc6907c27a329953c682134a84410dea"
45
+ "gitHead": "cd3638bb85f9560392acfd5160a266cf97880b3b"
45
46
  }