in packages/metro/src/ModuleGraph/worker/collectDependencies.js [364:404]
function isOptionalDependency<TSplitCondition>(
name: string,
path: NodePath<>,
state: State<TSplitCondition>,
): boolean {
const {allowOptionalDependencies} = state;
// The async require module is a 'built-in'. Resolving should never fail -> treat it as non-optional.
if (name === state.asyncRequireModulePathStringLiteral?.value) {
return false;
}
const isExcluded = () =>
Array.isArray(allowOptionalDependencies.exclude) &&
allowOptionalDependencies.exclude.includes(name);
if (!allowOptionalDependencies || isExcluded()) {
return false;
}
// Valid statement stack for single-level try-block: expressionStatement -> blockStatement -> tryStatement
let sCount = 0;
let p = path;
while (p && sCount < 3) {
if (p.isStatement()) {
if (p.node.type === 'BlockStatement') {
// A single-level should have the tryStatement immediately followed BlockStatement
// with the key 'block' to distinguish from the finally block, which has key = 'finalizer'
return (
p.parentPath != null &&
p.parentPath.node.type === 'TryStatement' &&
p.key === 'block'
);
}
sCount += 1;
}
p = p.parentPath;
}
return false;
}