@expo/env 2.4.0 → 2.4.1

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.
@@ -1,8 +1,6 @@
1
1
  "use strict";
2
2
 
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
3
+ exports.__esModule = true;
6
4
  exports.isIgnoredEnvKey = isIgnoredEnvKey;
7
5
  exports.isLocalEnvKey = isLocalEnvKey;
8
6
  exports.isUnsafeAllowedEnvKey = isUnsafeAllowedEnvKey;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["_nodeOs","data","_interopRequireDefault","require","e","__esModule","default","platform","os","safeKeys","Set","process","env","EXPO_UNSAFE_DOTENV_KEYS","split","filter","x","isUnsafeAllowedEnvKey","name","has","isIgnoredEnvKey","startsWith","isLocalEnvKey"],"sources":["../src/constants.ts"],"sourcesContent":["import os from 'node:os';\n\nconst platform = os.platform();\n\n// WARN(@kitten): We don't read this dynamically to ignore later modifications to this env var\nconst safeKeys = new Set(process.env.EXPO_UNSAFE_DOTENV_KEYS?.split(',').filter((x) => !!x));\n\nexport function isUnsafeAllowedEnvKey(name: string): boolean {\n return safeKeys.has(name);\n}\n\nexport function isIgnoredEnvKey(name: string) {\n if (platform === 'darwin' && name.startsWith('DYLD_')) {\n return true;\n } else if (platform === 'linux' && name.startsWith('LD_')) {\n return true;\n } else if (safeKeys.has(name)) {\n return false;\n }\n\n // NOTE(@kitten): Per-developer tool roots (ANDROID_HOME, JDK_HOME, DEVELOPER_DIR,\n // npm/pnpm/yarn/bun paths, etc) are not blocked here — see `isLocalEnvKey`, which\n // restricts them to `.local` env files (gitignored by convention) so committed\n // `.env*` files cannot redirect them.\n switch (name) {\n // NOTE: Expo internal env vars\n case '__EXPO_ENV_LOADED':\n case 'EXPO_NO_DOTENV':\n case 'EXPO_UNSAFE_DOTENV_KEYS':\n return true;\n\n // Linux dynamic-loader, can cause inconsistent calls\n case 'LD_PRELOAD':\n case 'LD_LIBRARY_PATH':\n case 'LD_AUDIT':\n return true;\n\n // macOS dynamic-loader, can cause inconsistent calls\n case 'DYLD_INSERT_LIBRARIES':\n case 'DYLD_LIBRARY_PATH':\n case 'DYLD_FRAMEWORK_PATH':\n case 'DYLD_FALLBACK_LIBRARY_PATH':\n case 'DYLD_FALLBACK_FRAMEWORK_PATH':\n return true;\n\n // OpenSSL\n case 'SSLKEYLOGFILE':\n return true;\n\n // Changes Node behaviour and shouldn't be set in dotenv\n case 'NODE_PATH':\n case 'NODE_OPTIONS':\n case 'NODE_EXTRA_CA_CERTS':\n case 'NODE_TLS_REJECT_UNAUTHORIZED':\n case 'NODE_COMPILE_CACHE':\n case 'NPM_CONFIG_NODE_OPTIONS':\n case 'NODE_REPL_EXTERNAL_MODULE':\n return true;\n\n // Changes Bun behaviour and shouldn't be set in dotenv\n case 'BUN_RUNTIME_TRANSPILER_CACHE_PATH':\n return true;\n\n // Shell startup hooks\n case 'BASH_ENV':\n case 'ENV':\n case 'ZDOTDIR':\n case 'IFS':\n case 'CDPATH':\n case 'PROMPT_COMMAND':\n case 'SHELLOPTS':\n case 'BASHOPTS':\n return true;\n\n // Special git/ssh/gpg args\n case 'GIT_SSH':\n case 'GIT_SSH_COMMAND':\n case 'GPG_TTY':\n case 'SSH_ASKPASS':\n case 'GIT_ASKPASS':\n case 'GIT_EXEC_PATH':\n return true;\n\n // Perl libs\n case 'PERL5OPT':\n case 'PERL5LIB':\n case 'PERLLIB':\n return true;\n\n // Python modules\n case 'PYTHONSTARTUP':\n case 'PYTHONPATH':\n case 'PYTHONHOME':\n case 'PYTHONINSPECT':\n case 'PYTHONUSERBASE':\n case 'PYTHONEXECUTABLE':\n case 'PYTHONSAFEPATH':\n case 'PYTJONNOUSERSITE':\n return true;\n\n // Ruby libs\n case 'RUBYOPT':\n case 'RUBYLIB':\n case 'BUNDLE_GEMFILE':\n case 'RUBYSHELL':\n case 'RUBYPATH':\n case 'GEM_HOME':\n case 'GEM_PATH':\n case 'BUNDLE_PATH':\n return true;\n\n // Java vars\n case '_JAVA_OPTIONS':\n case 'JAVA_TOOL_OPTIONS':\n case 'JDK_JAVA_OPTIONS':\n case 'CLASSPATH':\n return true;\n\n // User env vars\n case 'HOME':\n case 'USERPROFILE':\n case 'HOMEDRIVE':\n case 'HOMEPATH':\n case 'TMPDIR':\n case 'TMP':\n case 'TEMP':\n case 'USER':\n case 'SHELL':\n case 'PATH':\n case 'PATHEXT':\n case 'LANG':\n case 'PWD':\n case 'OLDPWD':\n case 'TERMINFO':\n return true;\n\n // Windows-owned\n case 'SYSTEMROOT':\n case 'SystemRoot':\n return true;\n\n // User tools\n case 'EDITOR':\n case 'VISUAL':\n case 'PAGER':\n case 'MANPAGER':\n return true;\n\n // XDG dirs\n case 'XDG_RUNTIME_DIR':\n case 'XDG_STATE_HOME':\n case 'XDG_DATA_HOME':\n case 'XDG_CONFIG_DIRS':\n case 'XDG_CACHE_HOME':\n case 'XDG_CONFIG_HOME':\n case 'XDG_BIN_HOME':\n return true;\n\n // direnv\n case 'DIRENV_DIR':\n case 'DIRENV_FILE':\n case 'DIRENV_WATCHES':\n case 'DIRENV_DIFF':\n return true;\n\n // Package-manager registry/install roots. No legitimate per-project `.env`\n // use case — the established mechanism for each is a dedicated config file\n // (`.npmrc`, `.yarnrc.yml`, `.bunfig.toml`) — and a malicious value is a\n // supply-chain RCE the moment the CLI shells out to npm/yarn/pnpm/bun.\n case 'NPM_CONFIG_REGISTRY':\n case 'NPM_CONFIG_PREFIX':\n case 'NPM_CONFIG_USERCONFIG':\n case 'NPM_CONFIG_GLOBALCONFIG':\n case 'NPM_CONFIG_CACHE':\n case 'YARN_REGISTRY':\n case 'YARN_CACHE_FOLDER':\n case 'YARN_GLOBAL_FOLDER':\n case 'PNPM_HOME':\n case 'BUN_INSTALL':\n case 'BUN_INSTALL_BIN':\n case 'COCOAPODS_HOME':\n case 'CMAKE_HOME':\n return true;\n\n default:\n return false;\n }\n}\n\n/**\n * Whether a dotenv key represents per-developer/per-machine configuration that\n * should only be loaded from `.local` env files (e.g. `.env.local`,\n * `.env.development.local`). Committed `.env*` files cannot set these — that\n * prevents a malicious project from redirecting developer-tool roots (e.g.\n * `ANDROID_HOME`) via a supply-chain attack, while still letting developers\n * pin them in their gitignored `.local` overrides.\n *\n * Honors `EXPO_UNSAFE_DOTENV_KEYS`: opt-in keys are allowed in any env file.\n */\nexport function isLocalEnvKey(name: string): boolean {\n if (safeKeys.has(name)) return false;\n switch (name) {\n // Android tooling\n case 'ANDROID_HOME':\n case 'ANDROID_SDK_ROOT':\n case 'ANDROID_NDK_HOME':\n case 'ANDROID_NDK_ROOT':\n case 'ANDROID_AVD_HOME':\n case 'ANDROID_EMULATOR_HOME':\n case 'GRADLE_HOME':\n case 'GRADLE_USER_HOME':\n case 'KOTLIN_HOME':\n return true;\n\n // JVM tooling\n case 'JAVA_HOME':\n case 'JDK_HOME':\n case 'JRE_HOME':\n return true;\n\n // Apple tooling\n case 'DEVELOPER_DIR':\n case 'XCODE_DEVELOPER_DIR_PATH':\n return true;\n\n // CocoaPods / Fastlane (secrets and non-exec config)\n case 'COCOAPODS_DISABLE_STATS':\n case 'FASTLANE_USER':\n case 'FASTLANE_PASSWORD':\n case 'FASTLANE_SESSION':\n case 'FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD':\n return true;\n\n // Android NDK (per-project NDK version pinning is common)\n case 'NDK_HOME':\n case 'NDK_ROOT':\n return true;\n\n // Per-developer preferences and per-machine setup\n case 'BROWSER':\n case 'BROWSER_ARGS':\n case 'HTTP_PROXY':\n case 'http_proxy':\n case 'HTTPS_PROXY':\n case 'https_proxy':\n case 'ALL_PROXY':\n case 'all_proxy':\n case 'NO_PROXY':\n case 'no_proxy':\n case 'FTP_PROXY':\n case 'ftp_proxy':\n case 'SSL_CRT_FILE':\n case 'SSL_KEY_FILE':\n case 'REACT_NATIVE_PACKAGER_HOSTNAME':\n return true;\n // NOTE(@kitten): Used to override where hermesc is found, not safe to read from .env\n case 'REACT_NATIVE_OVERRIDE_HERMES_DIR':\n return true;\n\n default:\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"constants.js","names":["_nodeOs","data","_interopRequireDefault","require","e","__esModule","default","platform","os","safeKeys","Set","process","env","EXPO_UNSAFE_DOTENV_KEYS","split","filter","x","isUnsafeAllowedEnvKey","name","has","isIgnoredEnvKey","startsWith","isLocalEnvKey"],"sources":["../src/constants.ts"],"sourcesContent":["import os from 'node:os';\n\nconst platform = os.platform();\n\n// WARN(@kitten): We don't read this dynamically to ignore later modifications to this env var\nconst safeKeys = new Set(process.env.EXPO_UNSAFE_DOTENV_KEYS?.split(',').filter((x) => !!x));\n\nexport function isUnsafeAllowedEnvKey(name: string): boolean {\n return safeKeys.has(name);\n}\n\nexport function isIgnoredEnvKey(name: string) {\n if (platform === 'darwin' && name.startsWith('DYLD_')) {\n return true;\n } else if (platform === 'linux' && name.startsWith('LD_')) {\n return true;\n } else if (safeKeys.has(name)) {\n return false;\n }\n\n // NOTE(@kitten): Per-developer tool roots (ANDROID_HOME, JDK_HOME, DEVELOPER_DIR,\n // npm/pnpm/yarn/bun paths, etc) are not blocked here — see `isLocalEnvKey`, which\n // restricts them to `.local` env files (gitignored by convention) so committed\n // `.env*` files cannot redirect them.\n switch (name) {\n // NOTE: Expo internal env vars\n case '__EXPO_ENV_LOADED':\n case 'EXPO_NO_DOTENV':\n case 'EXPO_UNSAFE_DOTENV_KEYS':\n return true;\n\n // Linux dynamic-loader, can cause inconsistent calls\n case 'LD_PRELOAD':\n case 'LD_LIBRARY_PATH':\n case 'LD_AUDIT':\n return true;\n\n // macOS dynamic-loader, can cause inconsistent calls\n case 'DYLD_INSERT_LIBRARIES':\n case 'DYLD_LIBRARY_PATH':\n case 'DYLD_FRAMEWORK_PATH':\n case 'DYLD_FALLBACK_LIBRARY_PATH':\n case 'DYLD_FALLBACK_FRAMEWORK_PATH':\n return true;\n\n // OpenSSL\n case 'SSLKEYLOGFILE':\n return true;\n\n // Changes Node behaviour and shouldn't be set in dotenv\n case 'NODE_PATH':\n case 'NODE_OPTIONS':\n case 'NODE_EXTRA_CA_CERTS':\n case 'NODE_TLS_REJECT_UNAUTHORIZED':\n case 'NODE_COMPILE_CACHE':\n case 'NPM_CONFIG_NODE_OPTIONS':\n case 'NODE_REPL_EXTERNAL_MODULE':\n return true;\n\n // Changes Bun behaviour and shouldn't be set in dotenv\n case 'BUN_RUNTIME_TRANSPILER_CACHE_PATH':\n return true;\n\n // Shell startup hooks\n case 'BASH_ENV':\n case 'ENV':\n case 'ZDOTDIR':\n case 'IFS':\n case 'CDPATH':\n case 'PROMPT_COMMAND':\n case 'SHELLOPTS':\n case 'BASHOPTS':\n return true;\n\n // Special git/ssh/gpg args\n case 'GIT_SSH':\n case 'GIT_SSH_COMMAND':\n case 'GPG_TTY':\n case 'SSH_ASKPASS':\n case 'GIT_ASKPASS':\n case 'GIT_EXEC_PATH':\n return true;\n\n // Perl libs\n case 'PERL5OPT':\n case 'PERL5LIB':\n case 'PERLLIB':\n return true;\n\n // Python modules\n case 'PYTHONSTARTUP':\n case 'PYTHONPATH':\n case 'PYTHONHOME':\n case 'PYTHONINSPECT':\n case 'PYTHONUSERBASE':\n case 'PYTHONEXECUTABLE':\n case 'PYTHONSAFEPATH':\n case 'PYTJONNOUSERSITE':\n return true;\n\n // Ruby libs\n case 'RUBYOPT':\n case 'RUBYLIB':\n case 'BUNDLE_GEMFILE':\n case 'RUBYSHELL':\n case 'RUBYPATH':\n case 'GEM_HOME':\n case 'GEM_PATH':\n case 'BUNDLE_PATH':\n return true;\n\n // Java vars\n case '_JAVA_OPTIONS':\n case 'JAVA_TOOL_OPTIONS':\n case 'JDK_JAVA_OPTIONS':\n case 'CLASSPATH':\n return true;\n\n // User env vars\n case 'HOME':\n case 'USERPROFILE':\n case 'HOMEDRIVE':\n case 'HOMEPATH':\n case 'TMPDIR':\n case 'TMP':\n case 'TEMP':\n case 'USER':\n case 'SHELL':\n case 'PATH':\n case 'PATHEXT':\n case 'LANG':\n case 'PWD':\n case 'OLDPWD':\n case 'TERMINFO':\n return true;\n\n // Windows-owned\n case 'SYSTEMROOT':\n case 'SystemRoot':\n return true;\n\n // User tools\n case 'EDITOR':\n case 'VISUAL':\n case 'PAGER':\n case 'MANPAGER':\n return true;\n\n // XDG dirs\n case 'XDG_RUNTIME_DIR':\n case 'XDG_STATE_HOME':\n case 'XDG_DATA_HOME':\n case 'XDG_CONFIG_DIRS':\n case 'XDG_CACHE_HOME':\n case 'XDG_CONFIG_HOME':\n case 'XDG_BIN_HOME':\n return true;\n\n // direnv\n case 'DIRENV_DIR':\n case 'DIRENV_FILE':\n case 'DIRENV_WATCHES':\n case 'DIRENV_DIFF':\n return true;\n\n // Package-manager registry/install roots. No legitimate per-project `.env`\n // use case — the established mechanism for each is a dedicated config file\n // (`.npmrc`, `.yarnrc.yml`, `.bunfig.toml`) — and a malicious value is a\n // supply-chain RCE the moment the CLI shells out to npm/yarn/pnpm/bun.\n case 'NPM_CONFIG_REGISTRY':\n case 'NPM_CONFIG_PREFIX':\n case 'NPM_CONFIG_USERCONFIG':\n case 'NPM_CONFIG_GLOBALCONFIG':\n case 'NPM_CONFIG_CACHE':\n case 'YARN_REGISTRY':\n case 'YARN_CACHE_FOLDER':\n case 'YARN_GLOBAL_FOLDER':\n case 'PNPM_HOME':\n case 'BUN_INSTALL':\n case 'BUN_INSTALL_BIN':\n case 'COCOAPODS_HOME':\n case 'CMAKE_HOME':\n return true;\n\n default:\n return false;\n }\n}\n\n/**\n * Whether a dotenv key represents per-developer/per-machine configuration that\n * should only be loaded from `.local` env files (e.g. `.env.local`,\n * `.env.development.local`). Committed `.env*` files cannot set these — that\n * prevents a malicious project from redirecting developer-tool roots (e.g.\n * `ANDROID_HOME`) via a supply-chain attack, while still letting developers\n * pin them in their gitignored `.local` overrides.\n *\n * Honors `EXPO_UNSAFE_DOTENV_KEYS`: opt-in keys are allowed in any env file.\n */\nexport function isLocalEnvKey(name: string): boolean {\n if (safeKeys.has(name)) return false;\n switch (name) {\n // Android tooling\n case 'ANDROID_HOME':\n case 'ANDROID_SDK_ROOT':\n case 'ANDROID_NDK_HOME':\n case 'ANDROID_NDK_ROOT':\n case 'ANDROID_AVD_HOME':\n case 'ANDROID_EMULATOR_HOME':\n case 'GRADLE_HOME':\n case 'GRADLE_USER_HOME':\n case 'KOTLIN_HOME':\n return true;\n\n // JVM tooling\n case 'JAVA_HOME':\n case 'JDK_HOME':\n case 'JRE_HOME':\n return true;\n\n // Apple tooling\n case 'DEVELOPER_DIR':\n case 'XCODE_DEVELOPER_DIR_PATH':\n return true;\n\n // CocoaPods / Fastlane (secrets and non-exec config)\n case 'COCOAPODS_DISABLE_STATS':\n case 'FASTLANE_USER':\n case 'FASTLANE_PASSWORD':\n case 'FASTLANE_SESSION':\n case 'FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD':\n return true;\n\n // Android NDK (per-project NDK version pinning is common)\n case 'NDK_HOME':\n case 'NDK_ROOT':\n return true;\n\n // Per-developer preferences and per-machine setup\n case 'BROWSER':\n case 'BROWSER_ARGS':\n case 'HTTP_PROXY':\n case 'http_proxy':\n case 'HTTPS_PROXY':\n case 'https_proxy':\n case 'ALL_PROXY':\n case 'all_proxy':\n case 'NO_PROXY':\n case 'no_proxy':\n case 'FTP_PROXY':\n case 'ftp_proxy':\n case 'SSL_CRT_FILE':\n case 'SSL_KEY_FILE':\n case 'REACT_NATIVE_PACKAGER_HOSTNAME':\n return true;\n // NOTE(@kitten): Used to override where hermesc is found, not safe to read from .env\n case 'REACT_NATIVE_OVERRIDE_HERMES_DIR':\n return true;\n\n default:\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/build/index.js CHANGED
@@ -1,8 +1,6 @@
1
1
  "use strict";
2
2
 
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
3
+ exports.__esModule = true;
6
4
  exports.LOADED_ENV_NAME = exports.KNOWN_MODES = void 0;
7
5
  exports.get = get;
8
6
  exports.getEnvFiles = getEnvFiles;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_chalk","data","_interopRequireDefault","require","_getenv","_nodeConsole","_nodeFs","_nodePath","_constants","_parse","e","__esModule","default","debug","ORIGINAL_ENV_BACKUP_KEY","Symbol","for","globalStore","globalThis","originalEnvBackup","WeakMap","rememberOriginal","systemEnv","key","isUnsafeAllowedEnvKey","backup","get","Map","set","has","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","files","sensitiveLoadedKeys","loadedEnvVars","loadedEnvFiles","blockedByFile","localOnlyByFile","sensitive","Set","reverse","forEach","envFile","envFileContent","fs","readFileSync","envFileParsed","parse","isLocalFile","path","basename","endsWith","push","Object","keys","isIgnoredEnvKey","isLocalEnvKey","add","code","violations","length","formatBlockedViolation","formatLocalOnlyViolation","Error","join","expand","formatViolationFiles","byFile","entries","map","file","loadEnvFiles","force","result","loaded","JSON","parsed","loadedEnvKeys","stringify","parseProjectEnv","projectRoot","options","loadProjectEnv","getOriginalEnv","original","undefined","getOriginalEnvValue","logLoadedEnv","envInfo","log","chalk","gray","yellow","memo","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 { isIgnoredEnvKey, isLocalEnvKey, isUnsafeAllowedEnvKey } from './constants';\nimport { parse, expand, type EnvOutput } from './parse';\n\nconst debug = require('debug')('expo:env') as typeof console.log;\n\ntype EnvBackupStore = WeakMap<EnvOutput, Map<string, string | undefined>>;\n\nconst ORIGINAL_ENV_BACKUP_KEY = Symbol.for('@expo/env.originalEnvBackup.v1');\nconst globalStore = globalThis as Record<symbol, EnvBackupStore | undefined>;\nconst originalEnvBackup: EnvBackupStore =\n globalStore[ORIGINAL_ENV_BACKUP_KEY] ?? (globalStore[ORIGINAL_ENV_BACKUP_KEY] = new WeakMap());\n\nfunction rememberOriginal(systemEnv: EnvOutput, key: string): void {\n if (isUnsafeAllowedEnvKey(key)) return;\n let backup = originalEnvBackup.get(systemEnv);\n if (!backup) {\n backup = new Map();\n originalEnvBackup.set(systemEnv, backup);\n }\n if (!backup.has(key)) {\n backup.set(key, systemEnv[key]);\n }\n}\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: [], sensitiveLoadedKeys: [] as string[] };\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 const blockedByFile: Record<string, string[]> = {};\n const localOnlyByFile: Record<string, string[]> = {};\n const sensitive = new Set<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 const isLocalFile = path.basename(envFile).endsWith('.local');\n\n loadedEnvFiles.push(envFile);\n debug(`Loaded environment variables from: ${envFile}`);\n\n for (const key of Object.keys(envFileParsed)) {\n if (isIgnoredEnvKey(key)) {\n (blockedByFile[envFile] ||= []).push(key);\n debug(`\"${key}\" is blocked from dotenv files, skipping in: ${envFile}`);\n continue;\n }\n if (!isLocalFile && isLocalEnvKey(key)) {\n (localOnlyByFile[envFile] ||= []).push(key);\n debug(`\"${key}\" is only allowed in .local env files, skipping in: ${envFile}`);\n continue;\n }\n if (isLocalFile && isLocalEnvKey(key)) {\n sensitive.add(key);\n }\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 const violations: string[] = [];\n if (Object.keys(blockedByFile).length > 0) {\n violations.push(formatBlockedViolation(blockedByFile));\n }\n if (Object.keys(localOnlyByFile).length > 0) {\n violations.push(formatLocalOnlyViolation(localOnlyByFile));\n }\n if (violations.length > 0) {\n throw new Error(violations.join('\\n\\n'));\n }\n\n const env = expand(loadedEnvVars, systemEnv);\n for (const key in env) {\n rememberOriginal(systemEnv, key);\n }\n\n return {\n env,\n files: loadedEnvFiles.reverse(),\n sensitiveLoadedKeys: [...sensitive],\n };\n}\n\nfunction formatViolationFiles(byFile: Record<string, string[]>): string {\n return Object.entries(byFile)\n .map(([file, keys]) => ` ${path.basename(file)}: ${keys.join(', ')}`)\n .join('\\n');\n}\n\nfunction formatBlockedViolation(byFile: Record<string, string[]>): string {\n return [\n 'Refused to load dangerous environment variables from .env files.',\n 'Opt in via EXPO_UNSAFE_DOTENV_KEYS in your shell environment if you truly need them.',\n '',\n formatViolationFiles(byFile),\n ].join('\\n');\n}\n\nfunction formatLocalOnlyViolation(byFile: Record<string, string[]>): string {\n return [\n 'Refused to load personal environment variables from a non-.local env file.',\n 'Move them to a .local env file.',\n '',\n formatViolationFiles(byFile),\n ].join('\\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 rememberOriginal(systemEnv, key);\n systemEnv[key] = parsed.env[key];\n loadedEnvKeys.push(key);\n }\n }\n\n // Mark the environment as loaded\n rememberOriginal(systemEnv, LOADED_ENV_NAME);\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/**\n * Get a fresh clone of the system environment with all `@expo/env`-applied\n * mutations reverted to their pre-load values. The result is intended to be\n * passed as the `env` option of `child_process.spawn` / `@expo/spawn-async`\n * when a subprocess should observe the environment as it was before any\n * `.env*` files were loaded — for example, when resolving SDK tooling paths\n * that should not be influenced by project-controlled `.env` values.\n *\n * Allocates lazily: nothing is held until this function is called, and each\n * call returns a new object so callers may mutate it freely.\n *\n * @param systemEnv The env to revert against; defaults to `process.env`.\n */\nexport function getOriginalEnv(systemEnv: EnvOutput = process.env): EnvOutput {\n const result: EnvOutput = { ...systemEnv };\n const backup = originalEnvBackup.get(systemEnv);\n if (backup) {\n for (const [key, original] of backup) {\n if (original === undefined) {\n delete result[key];\n } else {\n result[key] = original;\n }\n }\n }\n return result;\n}\n\n/**\n * Get the pre-load value of a single environment variable as recorded by\n * `@expo/env`. Falls through to the value in `systemEnv` for keys that\n * `@expo/env` never touched. O(1) and allocation-free, intended for read-sites\n * that resolve filesystem paths or executables from a single env var.\n *\n * Honors `EXPO_UNSAFE_DOTENV_KEYS`: keys the caller has explicitly opted into\n * via the escape hatch return their currently loaded value, not the original.\n *\n * @param key The environment variable to read.\n * @param systemEnv The env to read against; defaults to `process.env`.\n */\nexport function getOriginalEnvValue(\n key: string,\n systemEnv: EnvOutput = process.env\n): string | undefined {\n const backup = originalEnvBackup.get(systemEnv);\n if (backup && backup.has(key)) {\n return backup.get(key);\n }\n return systemEnv[key];\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 // Highlight developer-tool roots / secrets that were loaded from a .local file —\n // the same keys would be refused from any non-.local file. Surfacing them here\n // tells the user which \"sensitive\" values are influencing the build.\n if (envInfo.result === 'loaded' && envInfo.sensitiveLoadedKeys?.length) {\n console.log(chalk.yellow('env: export (sensitive)', envInfo.sensitiveLoadedKeys.join(' ')));\n }\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: [], sensitiveLoadedKeys: [] as string[] };\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 rememberOriginal(process.env, key);\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 for (const key in env) {\n if (isIgnoredEnvKey(key)) {\n delete env[key];\n }\n }\n return expand(env, sourceEnv || {});\n } catch {\n return {};\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_chalk","data","_interopRequireDefault","require","_getenv","_nodeConsole","_nodeFs","_nodePath","_constants","_parse","e","__esModule","default","debug","ORIGINAL_ENV_BACKUP_KEY","Symbol","for","globalStore","globalThis","originalEnvBackup","WeakMap","rememberOriginal","systemEnv","key","isUnsafeAllowedEnvKey","backup","get","Map","set","has","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","files","sensitiveLoadedKeys","loadedEnvVars","loadedEnvFiles","blockedByFile","localOnlyByFile","sensitive","Set","reverse","forEach","envFile","envFileContent","fs","readFileSync","envFileParsed","parse","isLocalFile","path","basename","endsWith","push","Object","keys","isIgnoredEnvKey","isLocalEnvKey","add","code","violations","length","formatBlockedViolation","formatLocalOnlyViolation","Error","join","expand","formatViolationFiles","byFile","entries","map","file","loadEnvFiles","force","result","loaded","JSON","parsed","loadedEnvKeys","stringify","parseProjectEnv","projectRoot","options","loadProjectEnv","getOriginalEnv","original","undefined","getOriginalEnvValue","logLoadedEnv","envInfo","log","chalk","gray","yellow","memo","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 { isIgnoredEnvKey, isLocalEnvKey, isUnsafeAllowedEnvKey } from './constants';\nimport { parse, expand, type EnvOutput } from './parse';\n\nconst debug = require('debug')('expo:env') as typeof console.log;\n\ntype EnvBackupStore = WeakMap<EnvOutput, Map<string, string | undefined>>;\n\nconst ORIGINAL_ENV_BACKUP_KEY = Symbol.for('@expo/env.originalEnvBackup.v1');\nconst globalStore = globalThis as Record<symbol, EnvBackupStore | undefined>;\nconst originalEnvBackup: EnvBackupStore =\n globalStore[ORIGINAL_ENV_BACKUP_KEY] ?? (globalStore[ORIGINAL_ENV_BACKUP_KEY] = new WeakMap());\n\nfunction rememberOriginal(systemEnv: EnvOutput, key: string): void {\n if (isUnsafeAllowedEnvKey(key)) return;\n let backup = originalEnvBackup.get(systemEnv);\n if (!backup) {\n backup = new Map();\n originalEnvBackup.set(systemEnv, backup);\n }\n if (!backup.has(key)) {\n backup.set(key, systemEnv[key]);\n }\n}\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: [], sensitiveLoadedKeys: [] as string[] };\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 const blockedByFile: Record<string, string[]> = {};\n const localOnlyByFile: Record<string, string[]> = {};\n const sensitive = new Set<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 const isLocalFile = path.basename(envFile).endsWith('.local');\n\n loadedEnvFiles.push(envFile);\n debug(`Loaded environment variables from: ${envFile}`);\n\n for (const key of Object.keys(envFileParsed)) {\n if (isIgnoredEnvKey(key)) {\n (blockedByFile[envFile] ||= []).push(key);\n debug(`\"${key}\" is blocked from dotenv files, skipping in: ${envFile}`);\n continue;\n }\n if (!isLocalFile && isLocalEnvKey(key)) {\n (localOnlyByFile[envFile] ||= []).push(key);\n debug(`\"${key}\" is only allowed in .local env files, skipping in: ${envFile}`);\n continue;\n }\n if (isLocalFile && isLocalEnvKey(key)) {\n sensitive.add(key);\n }\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 const violations: string[] = [];\n if (Object.keys(blockedByFile).length > 0) {\n violations.push(formatBlockedViolation(blockedByFile));\n }\n if (Object.keys(localOnlyByFile).length > 0) {\n violations.push(formatLocalOnlyViolation(localOnlyByFile));\n }\n if (violations.length > 0) {\n throw new Error(violations.join('\\n\\n'));\n }\n\n const env = expand(loadedEnvVars, systemEnv);\n for (const key in env) {\n rememberOriginal(systemEnv, key);\n }\n\n return {\n env,\n files: loadedEnvFiles.reverse(),\n sensitiveLoadedKeys: [...sensitive],\n };\n}\n\nfunction formatViolationFiles(byFile: Record<string, string[]>): string {\n return Object.entries(byFile)\n .map(([file, keys]) => ` ${path.basename(file)}: ${keys.join(', ')}`)\n .join('\\n');\n}\n\nfunction formatBlockedViolation(byFile: Record<string, string[]>): string {\n return [\n 'Refused to load dangerous environment variables from .env files.',\n 'Opt in via EXPO_UNSAFE_DOTENV_KEYS in your shell environment if you truly need them.',\n '',\n formatViolationFiles(byFile),\n ].join('\\n');\n}\n\nfunction formatLocalOnlyViolation(byFile: Record<string, string[]>): string {\n return [\n 'Refused to load personal environment variables from a non-.local env file.',\n 'Move them to a .local env file.',\n '',\n formatViolationFiles(byFile),\n ].join('\\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 rememberOriginal(systemEnv, key);\n systemEnv[key] = parsed.env[key];\n loadedEnvKeys.push(key);\n }\n }\n\n // Mark the environment as loaded\n rememberOriginal(systemEnv, LOADED_ENV_NAME);\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/**\n * Get a fresh clone of the system environment with all `@expo/env`-applied\n * mutations reverted to their pre-load values. The result is intended to be\n * passed as the `env` option of `child_process.spawn` / `@expo/spawn-async`\n * when a subprocess should observe the environment as it was before any\n * `.env*` files were loaded — for example, when resolving SDK tooling paths\n * that should not be influenced by project-controlled `.env` values.\n *\n * Allocates lazily: nothing is held until this function is called, and each\n * call returns a new object so callers may mutate it freely.\n *\n * @param systemEnv The env to revert against; defaults to `process.env`.\n */\nexport function getOriginalEnv(systemEnv: EnvOutput = process.env): EnvOutput {\n const result: EnvOutput = { ...systemEnv };\n const backup = originalEnvBackup.get(systemEnv);\n if (backup) {\n for (const [key, original] of backup) {\n if (original === undefined) {\n delete result[key];\n } else {\n result[key] = original;\n }\n }\n }\n return result;\n}\n\n/**\n * Get the pre-load value of a single environment variable as recorded by\n * `@expo/env`. Falls through to the value in `systemEnv` for keys that\n * `@expo/env` never touched. O(1) and allocation-free, intended for read-sites\n * that resolve filesystem paths or executables from a single env var.\n *\n * Honors `EXPO_UNSAFE_DOTENV_KEYS`: keys the caller has explicitly opted into\n * via the escape hatch return their currently loaded value, not the original.\n *\n * @param key The environment variable to read.\n * @param systemEnv The env to read against; defaults to `process.env`.\n */\nexport function getOriginalEnvValue(\n key: string,\n systemEnv: EnvOutput = process.env\n): string | undefined {\n const backup = originalEnvBackup.get(systemEnv);\n if (backup && backup.has(key)) {\n return backup.get(key);\n }\n return systemEnv[key];\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 // Highlight developer-tool roots / secrets that were loaded from a .local file —\n // the same keys would be refused from any non-.local file. Surfacing them here\n // tells the user which \"sensitive\" values are influencing the build.\n if (envInfo.result === 'loaded' && envInfo.sensitiveLoadedKeys?.length) {\n console.log(chalk.yellow('env: export (sensitive)', envInfo.sensitiveLoadedKeys.join(' ')));\n }\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: [], sensitiveLoadedKeys: [] as string[] };\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 rememberOriginal(process.env, key);\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 for (const key in env) {\n if (isIgnoredEnvKey(key)) {\n delete env[key];\n }\n }\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,WAAA;EAAA,MAAAP,IAAA,GAAAE,OAAA;EAAAK,UAAA,YAAAA,CAAA;IAAA,OAAAP,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAQ,OAAA;EAAA,MAAAR,IAAA,GAAAE,OAAA;EAAAM,MAAA,YAAAA,CAAA;IAAA,OAAAR,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAwD,SAAAC,uBAAAQ,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAExD,MAAMG,KAAK,GAAGV,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,CAAuB;AAIhE,MAAMW,uBAAuB,GAAGC,MAAM,CAACC,GAAG,CAAC,gCAAgC,CAAC;AAC5E,MAAMC,WAAW,GAAGC,UAAwD;AAC5E,MAAMC,iBAAiC,GACrCF,WAAW,CAACH,uBAAuB,CAAC,KAAKG,WAAW,CAACH,uBAAuB,CAAC,GAAG,IAAIM,OAAO,CAAC,CAAC,CAAC;AAEhG,SAASC,gBAAgBA,CAACC,SAAoB,EAAEC,GAAW,EAAQ;EACjE,IAAI,IAAAC,kCAAqB,EAACD,GAAG,CAAC,EAAE;EAChC,IAAIE,MAAM,GAAGN,iBAAiB,CAACO,GAAG,CAACJ,SAAS,CAAC;EAC7C,IAAI,CAACG,MAAM,EAAE;IACXA,MAAM,GAAG,IAAIE,GAAG,CAAC,CAAC;IAClBR,iBAAiB,CAACS,GAAG,CAACN,SAAS,EAAEG,MAAM,CAAC;EAC1C;EACA,IAAI,CAACA,MAAM,CAACI,GAAG,CAACN,GAAG,CAAC,EAAE;IACpBE,MAAM,CAACG,GAAG,CAACL,GAAG,EAAED,SAAS,CAACC,GAAG,CAAC,CAAC;EACjC;AACF;;AAEA;AACO,SAASO,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;IAChBjB,KAAK,CAAC,uDAAuD,CAAC;IAC9D,OAAO,EAAE;EACX;EAEA,MAAM4B,QAAQ,GAAGD,MAAM,GAAG3B,KAAK,GAAG6B,sBAAO,CAACC,KAAK;EAC/C,MAAMC,UAAU,GAAGJ,MAAM,GAAG3B,KAAK,GAAG6B,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;EACE5B,SAAS,GAAGe,OAAO,CAACC;AAItB,CAAC,GAAG,CAAC,CAAC,EACN;EACA,IAAI,CAACR,SAAS,CAAC,CAAC,EAAE;IAChBjB,KAAK,CAAC,uDAAuD,CAAC;IAC9D,OAAO;MAAEyB,GAAG,EAAE,CAAC,CAAC;MAAEa,KAAK,EAAE,EAAE;MAAEC,mBAAmB,EAAE;IAAe,CAAC;EACpE;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA,MAAMC,aAAwB,GAAG,CAAC,CAAC;EACnC,MAAMC,cAAwB,GAAG,EAAE;EACnC,MAAMC,aAAuC,GAAG,CAAC,CAAC;EAClD,MAAMC,eAAyC,GAAG,CAAC,CAAC;EACpD,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAAS,CAAC;;EAEnC;EACA;EACA,CAAC,GAAGR,QAAQ,CAAC,CAACS,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;MAC3C,MAAMK,WAAW,GAAGC,mBAAI,CAACC,QAAQ,CAACR,OAAO,CAAC,CAACS,QAAQ,CAAC,QAAQ,CAAC;MAE7DhB,cAAc,CAACiB,IAAI,CAACV,OAAO,CAAC;MAC5BhD,KAAK,CAAC,sCAAsCgD,OAAO,EAAE,CAAC;MAEtD,KAAK,MAAMtC,GAAG,IAAIiD,MAAM,CAACC,IAAI,CAACR,aAAa,CAAC,EAAE;QAC5C,IAAI,IAAAS,4BAAe,EAACnD,GAAG,CAAC,EAAE;UACxB,CAACgC,aAAa,CAACM,OAAO,CAAC,KAAK,EAAE,EAAEU,IAAI,CAAChD,GAAG,CAAC;UACzCV,KAAK,CAAC,IAAIU,GAAG,gDAAgDsC,OAAO,EAAE,CAAC;UACvE;QACF;QACA,IAAI,CAACM,WAAW,IAAI,IAAAQ,0BAAa,EAACpD,GAAG,CAAC,EAAE;UACtC,CAACiC,eAAe,CAACK,OAAO,CAAC,KAAK,EAAE,EAAEU,IAAI,CAAChD,GAAG,CAAC;UAC3CV,KAAK,CAAC,IAAIU,GAAG,uDAAuDsC,OAAO,EAAE,CAAC;UAC9E;QACF;QACA,IAAIM,WAAW,IAAI,IAAAQ,0BAAa,EAACpD,GAAG,CAAC,EAAE;UACrCkC,SAAS,CAACmB,GAAG,CAACrD,GAAG,CAAC;QACpB;QACA,IAAI,OAAO8B,aAAa,CAAC9B,GAAG,CAAC,KAAK,WAAW,EAAE;UAC7CV,KAAK,CAAC,IAAIU,GAAG,4CAA4CsC,OAAO,EAAE,CAAC;QACrE;QAEAR,aAAa,CAAC9B,GAAG,CAAC,GAAG0C,aAAa,CAAC1C,GAAG,CAAC;MACzC;IACF,CAAC,CAAC,OAAOoB,KAAU,EAAE;MACnB,IAAI,MAAM,IAAIA,KAAK,IAAIA,KAAK,CAACkC,IAAI,KAAK,QAAQ,EAAE;QAC9C,OAAOhE,KAAK,CAAC,GAAGgD,OAAO,yCAAyC,CAAC;MACnE;MACA,IAAI,MAAM,IAAIlB,KAAK,IAAIA,KAAK,CAACkC,IAAI,KAAK,QAAQ,EAAE;QAC9C,OAAOhE,KAAK,CAAC,GAAGgD,OAAO,yCAAyC,CAAC;MACnE;MACA,IAAI,MAAM,IAAIlB,KAAK,IAAIA,KAAK,CAACkC,IAAI,KAAK,QAAQ,EAAE;QAC9C,OAAOhE,KAAK,CAAC,yBAAyBgD,OAAO,0BAA0B,CAAC;MAC1E;MAEA,MAAMlB,KAAK;IACb;EACF,CAAC,CAAC;EAEF,MAAMmC,UAAoB,GAAG,EAAE;EAC/B,IAAIN,MAAM,CAACC,IAAI,CAAClB,aAAa,CAAC,CAACwB,MAAM,GAAG,CAAC,EAAE;IACzCD,UAAU,CAACP,IAAI,CAACS,sBAAsB,CAACzB,aAAa,CAAC,CAAC;EACxD;EACA,IAAIiB,MAAM,CAACC,IAAI,CAACjB,eAAe,CAAC,CAACuB,MAAM,GAAG,CAAC,EAAE;IAC3CD,UAAU,CAACP,IAAI,CAACU,wBAAwB,CAACzB,eAAe,CAAC,CAAC;EAC5D;EACA,IAAIsB,UAAU,CAACC,MAAM,GAAG,CAAC,EAAE;IACzB,MAAM,IAAIG,KAAK,CAACJ,UAAU,CAACK,IAAI,CAAC,MAAM,CAAC,CAAC;EAC1C;EAEA,MAAM7C,GAAG,GAAG,IAAA8C,eAAM,EAAC/B,aAAa,EAAE/B,SAAS,CAAC;EAC5C,KAAK,MAAMC,GAAG,IAAIe,GAAG,EAAE;IACrBjB,gBAAgB,CAACC,SAAS,EAAEC,GAAG,CAAC;EAClC;EAEA,OAAO;IACLe,GAAG;IACHa,KAAK,EAAEG,cAAc,CAACK,OAAO,CAAC,CAAC;IAC/BP,mBAAmB,EAAE,CAAC,GAAGK,SAAS;EACpC,CAAC;AACH;AAEA,SAAS4B,oBAAoBA,CAACC,MAAgC,EAAU;EACtE,OAAOd,MAAM,CAACe,OAAO,CAACD,MAAM,CAAC,CAC1BE,GAAG,CAAC,CAAC,CAACC,IAAI,EAAEhB,IAAI,CAAC,KAAK,KAAKL,mBAAI,CAACC,QAAQ,CAACoB,IAAI,CAAC,KAAKhB,IAAI,CAACU,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CACrEA,IAAI,CAAC,IAAI,CAAC;AACf;AAEA,SAASH,sBAAsBA,CAACM,MAAgC,EAAU;EACxE,OAAO,CACL,kEAAkE,EAClE,sFAAsF,EACtF,EAAE,EACFD,oBAAoB,CAACC,MAAM,CAAC,CAC7B,CAACH,IAAI,CAAC,IAAI,CAAC;AACd;AAEA,SAASF,wBAAwBA,CAACK,MAAgC,EAAU;EAC1E,OAAO,CACL,4EAA4E,EAC5E,iCAAiC,EACjC,EAAE,EACFD,oBAAoB,CAACC,MAAM,CAAC,CAC7B,CAACH,IAAI,CAAC,IAAI,CAAC;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASO,YAAYA,CAC1BxC,QAAkB,EAClB;EACEyC,KAAK;EACLnD,MAAM,GAAG,KAAK;EACdlB,SAAS,GAAGe,OAAO,CAACC;AAMtB,CAAC,GAAG,CAAC,CAAC,EACN;EACA,IAAI,CAACqD,KAAK,IAAIrE,SAAS,CAACY,eAAe,CAAC,EAAE;IACxC,OAAO;MAAE0D,MAAM,EAAE,SAAkB;MAAEC,MAAM,EAAEC,IAAI,CAAC5B,KAAK,CAAC5C,SAAS,CAACY,eAAe,CAAC;IAAE,CAAC;EACvF;EAEA,MAAM6D,MAAM,GAAG9C,aAAa,CAACC,QAAQ,EAAE;IAAE5B;EAAU,CAAC,CAAC;EACrD,MAAM0E,aAAuB,GAAG,EAAE;EAElC,KAAK,MAAMzE,GAAG,IAAIwE,MAAM,CAACzD,GAAG,EAAE;IAC5B,IAAI,OAAOhB,SAAS,CAACC,GAAG,CAAC,KAAK,WAAW,EAAE;MACzCV,KAAK,CAAC,IAAIU,GAAG,6CAA6C,CAAC;IAC7D,CAAC,MAAM;MACLF,gBAAgB,CAACC,SAAS,EAAEC,GAAG,CAAC;MAChCD,SAAS,CAACC,GAAG,CAAC,GAAGwE,MAAM,CAACzD,GAAG,CAACf,GAAG,CAAC;MAChCyE,aAAa,CAACzB,IAAI,CAAChD,GAAG,CAAC;IACzB;EACF;;EAEA;EACAF,gBAAgB,CAACC,SAAS,EAAEY,eAAe,CAAC;EAC5CZ,SAAS,CAACY,eAAe,CAAC,GAAG4D,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,OAAOnD,aAAa,CAClBd,WAAW,CAACiE,OAAO,CAAC,CAACZ,GAAG,CAAE3B,OAAO,IAAKO,mBAAI,CAACe,IAAI,CAACgB,WAAW,EAAEtC,OAAO,CAAC,CAAC,EACtEuC,OACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,cAAcA,CAC5BF,WAAmB,EACnBC,OAAgF,EAChF;EACA,OAAOV,YAAY,CACjBvD,WAAW,CAACiE,OAAO,CAAC,CAACZ,GAAG,CAAE3B,OAAO,IAAKO,mBAAI,CAACe,IAAI,CAACgB,WAAW,EAAEtC,OAAO,CAAC,CAAC,EACtEuC,OACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,cAAcA,CAAChF,SAAoB,GAAGe,OAAO,CAACC,GAAG,EAAa;EAC5E,MAAMsD,MAAiB,GAAG;IAAE,GAAGtE;EAAU,CAAC;EAC1C,MAAMG,MAAM,GAAGN,iBAAiB,CAACO,GAAG,CAACJ,SAAS,CAAC;EAC/C,IAAIG,MAAM,EAAE;IACV,KAAK,MAAM,CAACF,GAAG,EAAEgF,QAAQ,CAAC,IAAI9E,MAAM,EAAE;MACpC,IAAI8E,QAAQ,KAAKC,SAAS,EAAE;QAC1B,OAAOZ,MAAM,CAACrE,GAAG,CAAC;MACpB,CAAC,MAAM;QACLqE,MAAM,CAACrE,GAAG,CAAC,GAAGgF,QAAQ;MACxB;IACF;EACF;EACA,OAAOX,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASa,mBAAmBA,CACjClF,GAAW,EACXD,SAAoB,GAAGe,OAAO,CAACC,GAAG,EACd;EACpB,MAAMb,MAAM,GAAGN,iBAAiB,CAACO,GAAG,CAACJ,SAAS,CAAC;EAC/C,IAAIG,MAAM,IAAIA,MAAM,CAACI,GAAG,CAACN,GAAG,CAAC,EAAE;IAC7B,OAAOE,MAAM,CAACC,GAAG,CAACH,GAAG,CAAC;EACxB;EACA,OAAOD,SAAS,CAACC,GAAG,CAAC;AACvB;;AAEA;AACO,SAASmF,YAAYA,CAC1BC,OAAwC,EACxCP,OAA2C,GAAG,CAAC,CAAC,EAChD;EACA;EACA,IAAIA,OAAO,CAACT,KAAK,IAAIS,OAAO,CAAC5D,MAAM,IAAI,CAACmE,OAAO,CAACd,MAAM,CAACd,MAAM,EAAE,OAAO4B,OAAO;;EAE7E;EACA,IAAIA,OAAO,CAACf,MAAM,KAAK,QAAQ,EAAE;IAC/BlD,sBAAO,CAACkE,GAAG,CACTC,gBAAK,CAACC,IAAI,CAAC,WAAW,EAAEH,OAAO,CAACxD,KAAK,CAACqC,GAAG,CAAEC,IAAI,IAAKrB,mBAAI,CAACC,QAAQ,CAACoB,IAAI,CAAC,CAAC,CAACN,IAAI,CAAC,GAAG,CAAC,CACpF,CAAC;EACH;;EAEA;EACAzC,sBAAO,CAACkE,GAAG,CAACC,gBAAK,CAACC,IAAI,CAAC,aAAa,EAAEH,OAAO,CAACd,MAAM,CAACV,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;EAEhE;EACA;EACA;EACA,IAAIwB,OAAO,CAACf,MAAM,KAAK,QAAQ,IAAIe,OAAO,CAACvD,mBAAmB,EAAE2B,MAAM,EAAE;IACtErC,sBAAO,CAACkE,GAAG,CAACC,gBAAK,CAACE,MAAM,CAAC,yBAAyB,EAAEJ,OAAO,CAACvD,mBAAmB,CAAC+B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;EAC7F;EAEA,OAAOwB,OAAO;AAChB;;AAEA;;AAEA,IAAIK,IAA6C,GAAG,IAAI;;AAExD;AACA;AACA;AACA;AACA;AACA;AACO,SAAStF,GAAGA,CACjByE,WAAmB,EACnB;EACER,KAAK;EACLnD;AAIF,CAAC,GAAG,CAAC,CAAC,EACN;EACA,IAAI,CAACV,SAAS,CAAC,CAAC,EAAE;IAChBjB,KAAK,CAAC,uDAAuD,CAAC;IAC9D,OAAO;MAAEyB,GAAG,EAAE,CAAC,CAAC;MAAEa,KAAK,EAAE,EAAE;MAAEC,mBAAmB,EAAE;IAAe,CAAC;EACpE;EACA,IAAIuC,KAAK,IAAI,CAACqB,IAAI,EAAE;IAClBA,IAAI,GAAGd,eAAe,CAACC,WAAW,EAAE;MAAE3D;IAAO,CAAC,CAAC;EACjD;EACA,OAAOwE,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,IAAIA,CAClBd,WAAmB,EACnBC,OAGC,GAAG,CAAC,CAAC,EACN;EACA,IAAI,CAACtE,SAAS,CAAC,CAAC,EAAE;IAChBjB,KAAK,CAAC,uDAAuD,CAAC;IAC9D,OAAOwB,OAAO,CAACC,GAAG;EACpB;EAEA,MAAMqE,OAAO,GAAGjF,GAAG,CAACyE,WAAW,EAAEC,OAAO,CAAC;EACzC,MAAMJ,aAAuB,GAAG,EAAE;EAElC,KAAK,MAAMzE,GAAG,IAAIoF,OAAO,CAACrE,GAAG,EAAE;IAC7B,IAAI,OAAOD,OAAO,CAACC,GAAG,CAACf,GAAG,CAAC,KAAK,WAAW,EAAE;MAC3CV,KAAK,CAAC,IAAIU,GAAG,6CAA6C,CAAC;IAC7D,CAAC,MAAM;MACL;MACAF,gBAAgB,CAACgB,OAAO,CAACC,GAAG,EAAEf,GAAG,CAAC;MAClCc,OAAO,CAACC,GAAG,CAACf,GAAG,CAAC,GAAGoF,OAAO,CAACrE,GAAG,CAACf,GAAG,CAAC;MACnCyE,aAAa,CAACzB,IAAI,CAAChD,GAAG,CAAC;IACzB;EACF;;EAEA;EACAmF,YAAY,CAAC;IAAE,GAAGC,OAAO;IAAEf,MAAM,EAAE,QAAQ;IAAEC,MAAM,EAAEG;EAAc,CAAC,EAAEI,OAAO,CAAC;EAE9E,OAAO/D,OAAO,CAACC,GAAG;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS4E,QAAQA,CAAC9E,IAAwB,EAAE;EAAEI,MAAM,GAAG;AAA4B,CAAC,GAAG,CAAC,CAAC,EAAE;EAChG,IAAI,CAACV,SAAS,CAAC,CAAC,EAAE;IAChBjB,KAAK,CAAC,uDAAuD,CAAC;IAC9D,OAAO,EAAE;EACX;EAEA,OAAOsB,WAAW,CAAC;IAAEC,IAAI;IAAEI;EAAO,CAAC,CAAC;AACtC;;AAEA;AACA;AACA;AACO,SAAS2E,QAAQA,CAACC,QAAgB,EAAEC,SAAqB,EAAa;EAC3E,IAAI;IACF,MAAM/E,GAAG,GAAG,IAAA4B,cAAK,EAACkD,QAAQ,CAAC;IAC3B,KAAK,MAAM7F,GAAG,IAAIe,GAAG,EAAE;MACrB,IAAI,IAAAoC,4BAAe,EAACnD,GAAG,CAAC,EAAE;QACxB,OAAOe,GAAG,CAACf,GAAG,CAAC;MACjB;IACF;IACA,OAAO,IAAA6D,eAAM,EAAC9C,GAAG,EAAE+E,SAAS,IAAI,CAAC,CAAC,CAAC;EACrC,CAAC,CAAC,MAAM;IACN,OAAO,CAAC,CAAC;EACX;AACF","ignoreList":[]}
package/build/parse.js CHANGED
@@ -1,8 +1,6 @@
1
1
  "use strict";
2
2
 
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
3
+ exports.__esModule = true;
6
4
  exports.expand = expand;
7
5
  exports.parse = parse;
8
6
  function _nodeUtil() {
@@ -1 +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 : inputEnv[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,GAC7CX,QAAQ,CAACP,GAAG,CAAC;IACrB,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":[]}
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 : inputEnv[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,GAC7CX,QAAQ,CAACP,GAAG,CAAC;IACrB,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.4.0",
3
+ "version": "2.4.1",
4
4
  "description": "hydrate environment variables from .env files into process.env",
5
5
  "main": "build/index.js",
6
6
  "repository": {
@@ -34,7 +34,7 @@
34
34
  "publishConfig": {
35
35
  "access": "public"
36
36
  },
37
- "gitHead": "e3eb896c5fdcd89e0cded98ff4e35c9db12cc9c0",
37
+ "gitHead": "5104cb89c3938bc9653e0cbad43da3a43a2e77a7",
38
38
  "scripts": {
39
39
  "build": "tsc --emitDeclarationOnly && babel src --out-dir build --extensions \".ts\" --source-maps --ignore \"src/**/__mocks__/*\",\"src/**/__tests__/*\"",
40
40
  "clean": "expo-module clean",