"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createClientEnvironment = void 0; const getenv_1 = require("getenv"); const semver_1 = __importDefault(require("semver")); const webpack_1 = require("webpack"); const env_1 = require("../env"); const RESTRICTED_MANIFEST_FIELDS = [ // Omit app.json properties that get removed during the native build 'facebookScheme', 'facebookAppId', 'facebookDisplayName', // Remove iOS and Android. 'ios', 'android', // Hide internal / build values 'plugins', 'hooks', '_internal', // Remove metro-specific values 'assetBundlePatterns', ]; function createEnvironmentConstants(appManifest) { var _a; const publicManifest = { ...appManifest, // @ts-ignore: displayName doesn't exist on ExpoConfig name: appManifest.displayName || appManifest.name, // Use the PWA `manifest.json` as the native web manifest. web: { // Pass through config properties that are not stored in the // PWA `manifest.json`, but still need to be accessible // through `Constants.manifest`. config: (_a = appManifest.web) === null || _a === void 0 ? void 0 : _a.config, }, }; for (const field of RESTRICTED_MANIFEST_FIELDS) { delete publicManifest[field]; } return publicManifest; } /** * Create the global environment variables to surface in the project. Also creates the `__DEV__` boolean to provide better parity with Metro bundler. * * @param mode defines the Metro bundler `global.__DEV__` value. * @param publicPath passed as `process.env.PUBLIC_URL` to the app. * @param nativeAppManifest public values to be used in `expo-constants`. * @internal */ function createClientEnvironment(mode, publicPath, nativeAppManifest) { const environment = (0, env_1.getMode)({ mode }); const __DEV__ = environment !== 'production'; // Adding the env variables to the Expo manifest is unsafe. // This feature is deprecated in SDK 41 forward. const isEnvBindingSupported = lteSdkVersion(nativeAppManifest, '40.0.0'); const ENV_VAR_REGEX = isEnvBindingSupported ? /^(EXPO_|REACT_NATIVE_|CI$)/i : /^(CI$)/i; const SECRET_REGEX = /(PASSWORD|SECRET|TOKEN)/i; const shouldDefineKeys = (0, getenv_1.boolish)('EXPO_WEBPACK_DEFINE_ENVIRONMENT_AS_KEYS', false); const prefix = shouldDefineKeys ? 'process.env.' : ''; const processEnv = Object.keys(process.env) .filter(key => ENV_VAR_REGEX.test(key) && !SECRET_REGEX.test(key)) .reduce((env, key) => { env[`${prefix}${key}`] = JSON.stringify(process.env[key]); return env; }, { /** * Useful for determining whether we’re running in production mode. * Most importantly, it switches React into the correct mode. */ [`${prefix}NODE_ENV`]: JSON.stringify(environment), /** * Useful for resolving the correct path to static assets in `public`. * For example, . * This should only be used as an escape hatch. Normally you would put * images into the root folder and `import` them in code to get their paths. */ [`${prefix}PUBLIC_URL`]: JSON.stringify(publicPath), /** * Surfaces the `app.json` (config) as an environment variable which is then parsed by * `expo-constants` https://docs.expo.dev/versions/latest/sdk/constants/ */ [`${prefix}APP_MANIFEST`]: JSON.stringify(nativeAppManifest), }); if (shouldDefineKeys) { return { ...processEnv, __DEV__, }; } return { 'process.env': processEnv, __DEV__, }; } exports.createClientEnvironment = createClientEnvironment; /** * Required for `expo-constants` https://docs.expo.dev/versions/latest/sdk/constants/. * This surfaces the `app.json` (config) as an environment variable which is then parsed by `expo-constants`. * @category plugins */ class DefinePlugin extends webpack_1.DefinePlugin { constructor({ mode, publicUrl, config }) { const publicAppManifest = createEnvironmentConstants(config); const environmentVariables = createClientEnvironment(mode, publicUrl, publicAppManifest); super(environmentVariables); } } exports.default = DefinePlugin; DefinePlugin.createClientEnvironment = createClientEnvironment; DefinePlugin.fromEnv = (env) => { const mode = (0, env_1.getMode)(env); const { publicUrl } = (0, env_1.getPublicPaths)(env); const config = env.config || (0, env_1.getConfig)(env); return new DefinePlugin({ mode, publicUrl, config, }); }; function lteSdkVersion(exp, sdkVersion) { if (!exp.sdkVersion) { return false; } if (exp.sdkVersion === 'UNVERSIONED') { return false; } try { return semver_1.default.lte(exp.sdkVersion, sdkVersion); } catch { return false; } } //# sourceMappingURL=ExpoDefinePlugin.js.map