You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
5.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"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 were 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, <img src={process.env.PUBLIC_URL + '/img/logo.png'} />.
* 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