GT2/Ejectable/node_modules/babel-preset-expo/plugins/disable-ambiguous-requires.js

53 lines
1.5 KiB
JavaScript

/**
* Disable ambiguous module ID requires from React Native:
* https://github.com/facebook/react-native/commit/06b5bda34923b68ba5141e78c36ccbdc5f4bcff1
*
* Without this operation, the following error will be thrown when bundling with Webpack:
* `Critical dependency: require function is used in a way in which dependencies cannot be statically extracted`
*
* - react-native/Libraries/Performance/Systrace.js 124:2-9
* - react-native/Libraries/Core/setUpReactRefresh.js 30:2-9
*/
module.exports = () => ({
visitor: {
AssignmentExpression(path) {
if (isValidRequire(path) && (isCastedRequire(path) || isChainedRequire(path))) {
path.remove();
}
},
},
});
/**
* Is a require statement being assigned to something.
* Prevents further checks when `path.node.left` is undefined.
*
* @param {*} path
*/
function isValidRequire(path) {
return path.node.operator === '=' && path.node.left.type === 'MemberExpression';
}
/**
* Is a require statement formatted like: `(require: any)`
*
* Example from `react-native/Libraries/Core/setUpReactRefresh.js 30:2-9`:
* `(require: any).Refresh = Refresh;`
*
* @param {*} path
*/
function isCastedRequire(path) {
const { object } = path.node.left;
return object.type === 'TypeCastExpression' && object.expression.name === 'require';
}
/**
* Is a require statement formatted like: `require.`
*
* @param {*} path
*/
function isChainedRequire(path) {
const { object } = path.node.left;
return object.type === 'Identifier' && object.name === 'require';
}