207 lines
7.3 KiB
JavaScript
207 lines
7.3 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.hasModule = hasModule;
|
|
exports.getBundler = getBundler;
|
|
exports.getPlatform = getPlatform;
|
|
exports.getPossibleProjectRoot = getPossibleProjectRoot;
|
|
exports.getIsReactServer = getIsReactServer;
|
|
exports.getIsDev = getIsDev;
|
|
exports.getIsFastRefreshEnabled = getIsFastRefreshEnabled;
|
|
exports.getIsProd = getIsProd;
|
|
exports.getIsNodeModule = getIsNodeModule;
|
|
exports.getBaseUrl = getBaseUrl;
|
|
exports.getReactCompiler = getReactCompiler;
|
|
exports.getIsServer = getIsServer;
|
|
exports.getIsLoaderBundle = getIsLoaderBundle;
|
|
exports.getMetroSourceType = getMetroSourceType;
|
|
exports.getBabelRuntimeVersion = getBabelRuntimeVersion;
|
|
exports.getExpoRouterAbsoluteAppRoot = getExpoRouterAbsoluteAppRoot;
|
|
exports.getInlineEnvVarsEnabled = getInlineEnvVarsEnabled;
|
|
exports.getAsyncRoutes = getAsyncRoutes;
|
|
exports.createAddNamedImportOnce = createAddNamedImportOnce;
|
|
exports.toPosixPath = toPosixPath;
|
|
// @ts-expect-error: missing types
|
|
const helper_module_imports_1 = require("@babel/helper-module-imports");
|
|
const node_path_1 = __importDefault(require("node:path"));
|
|
function hasModule(name) {
|
|
try {
|
|
return !!require.resolve(name);
|
|
}
|
|
catch (error) {
|
|
if (error.code === 'MODULE_NOT_FOUND' && error.message.includes(name)) {
|
|
return false;
|
|
}
|
|
throw error;
|
|
}
|
|
}
|
|
/** Determine which bundler is being used. */
|
|
function getBundler(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
if (!caller)
|
|
return null;
|
|
if (caller.bundler)
|
|
return caller.bundler;
|
|
if (
|
|
// Known tools that use `webpack`-mode via `babel-loader`: `@expo/webpack-config`, Next.js <10
|
|
caller.name === 'babel-loader' ||
|
|
// NextJS 11 uses this custom caller name.
|
|
caller.name === 'next-babel-turbo-loader') {
|
|
return 'webpack';
|
|
}
|
|
// Assume anything else is Metro.
|
|
return 'metro';
|
|
}
|
|
function getPlatform(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
if (!caller)
|
|
return null;
|
|
if (caller.platform)
|
|
return caller.platform;
|
|
const bundler = getBundler(caller);
|
|
if (bundler === 'webpack') {
|
|
return 'web';
|
|
}
|
|
// unknown
|
|
return caller.platform;
|
|
}
|
|
function getPossibleProjectRoot(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
if (!caller)
|
|
return null;
|
|
if (caller.projectRoot)
|
|
return caller.projectRoot;
|
|
// unknown
|
|
return process.env.EXPO_PROJECT_ROOT;
|
|
}
|
|
/** If bundling for a react-server target. */
|
|
function getIsReactServer(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
return caller?.isReactServer ?? false;
|
|
}
|
|
function assertExpoBabelCaller(caller) { }
|
|
function getIsDev(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
if (caller?.isDev != null)
|
|
return caller.isDev;
|
|
// https://babeljs.io/docs/options#envname
|
|
return process.env.BABEL_ENV === 'development' || process.env.NODE_ENV === 'development';
|
|
}
|
|
function getIsFastRefreshEnabled(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
if (!caller)
|
|
return false;
|
|
// NOTE(@kitten): `isHMREnabled` is always true in `@expo/metro-config`.
|
|
// However, we still use this option to ensure fast refresh is only enabled in supported runtimes (Metro + Expo)
|
|
return !!caller.isHMREnabled && !caller.isServer && !caller.isNodeModule && getIsDev(caller);
|
|
}
|
|
function getIsProd(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
if (caller?.isDev != null)
|
|
return caller.isDev === false;
|
|
// https://babeljs.io/docs/options#envname
|
|
return process.env.BABEL_ENV === 'production' || process.env.NODE_ENV === 'production';
|
|
}
|
|
function getIsNodeModule(caller) {
|
|
return caller?.isNodeModule ?? false;
|
|
}
|
|
function getBaseUrl(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
return caller?.baseUrl ?? '';
|
|
}
|
|
function getReactCompiler(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
return caller?.supportsReactCompiler ?? false;
|
|
}
|
|
function getIsServer(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
return caller?.isServer ?? false;
|
|
}
|
|
function getIsLoaderBundle(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
return caller?.isLoaderBundle ?? false;
|
|
}
|
|
function getMetroSourceType(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
return caller?.metroSourceType;
|
|
}
|
|
function getBabelRuntimeVersion(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
let babelRuntimeVersion;
|
|
if (typeof caller?.babelRuntimeVersion === 'string') {
|
|
babelRuntimeVersion = caller.babelRuntimeVersion;
|
|
}
|
|
else {
|
|
try {
|
|
babelRuntimeVersion = require('@babel/runtime/package.json').version;
|
|
}
|
|
catch (error) {
|
|
if (error.code !== 'MODULE_NOT_FOUND')
|
|
throw error;
|
|
}
|
|
}
|
|
// NOTE(@kitten): The default shouldn't be higher than `expo/package.json`'s `@babel/runtime` version
|
|
// or `babel-preset-expo/package.json`'s peer dependency range for `@babel/runtime`
|
|
return babelRuntimeVersion ?? '^7.20.0';
|
|
}
|
|
function getExpoRouterAbsoluteAppRoot(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
const rootModuleId = caller?.routerRoot ?? './app';
|
|
if (node_path_1.default.isAbsolute(rootModuleId)) {
|
|
return rootModuleId;
|
|
}
|
|
const projectRoot = getPossibleProjectRoot(caller) || '/';
|
|
return node_path_1.default.join(projectRoot, rootModuleId);
|
|
}
|
|
function getInlineEnvVarsEnabled(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
const isWebpack = getBundler(caller) === 'webpack';
|
|
const isServer = getIsServer(caller);
|
|
const isNodeModule = getIsNodeModule(caller);
|
|
const preserveEnvVars = caller?.preserveEnvVars;
|
|
// Development env vars are added using references to enable HMR in development.
|
|
// Servers have env vars left as-is to read from the environment.
|
|
return !isNodeModule && !isWebpack && !isServer && !preserveEnvVars;
|
|
}
|
|
function getAsyncRoutes(caller) {
|
|
assertExpoBabelCaller(caller);
|
|
const isServer = getIsServer(caller);
|
|
if (isServer) {
|
|
return false;
|
|
}
|
|
const isProd = getIsProd(caller);
|
|
const platform = getPlatform(caller);
|
|
if (platform !== 'web' && isProd) {
|
|
return false;
|
|
}
|
|
return caller?.asyncRoutes ?? false;
|
|
}
|
|
const getOrCreateInMap = (map, key, create) => {
|
|
if (!map.has(key)) {
|
|
const result = create();
|
|
map.set(key, result);
|
|
return [result, true];
|
|
}
|
|
return [map.get(key), false];
|
|
};
|
|
function createAddNamedImportOnce(t) {
|
|
const addedImportsCache = new Map();
|
|
return function addNamedImportOnce(path, name, source) {
|
|
const [sourceCache] = getOrCreateInMap(addedImportsCache, source, () => new Map());
|
|
const [identifier, didCreate] = getOrCreateInMap(sourceCache, name, () => (0, helper_module_imports_1.addNamed)(path, name, source));
|
|
// for cached imports, we need to clone the resulting identifier, because otherwise
|
|
// '@babel/plugin-transform-modules-commonjs' won't replace the references to the import for some reason.
|
|
// this is a helper for that.
|
|
return didCreate ? identifier : t.cloneNode(identifier);
|
|
};
|
|
}
|
|
const REGEXP_REPLACE_SLASHES = /\\/g;
|
|
/**
|
|
* Convert any platform-specific path to a POSIX path.
|
|
*/
|
|
function toPosixPath(filePath) {
|
|
return filePath.replace(REGEXP_REPLACE_SLASHES, '/');
|
|
}
|