expo-router
Version:
Expo Router is a file-based router for React Native and web applications.
66 lines • 3.43 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.doctor = void 0;
const debug_1 = __importDefault(require("debug"));
const subset_1 = __importDefault(require("semver/ranges/subset"));
const debug = (0, debug_1.default)('expo:router:doctor');
/**
* Small hack to get the package.json.
* We do no use import() as this would require changing the rootDir in `tsconfig.json`,
* which in turn will change the structure of the outDir.
*/
const routerPkg = require('../../package.json');
const routerDependencies = Object.entries(Object.assign({}, routerPkg.dependencies, routerPkg.peerDependencies)).filter((entry) => entry[0].startsWith('@react-navigation') && entry[1] !== '*');
function doctor(pkg, appReactNavigationPath,
// Reuse the formatting functions from expo-cli
{ bold, learnMore, }) {
const resolvedDependencies = { ...pkg.dependencies, ...pkg.devDependencies };
const libReactNavigationPath = require.resolve('@react-navigation/native');
const userExcluded = new Set(pkg.expo?.install?.exclude);
const incorrectDependencies = [];
/**
* If the user has a dependency with a sub-dependency on @react-navigation/native, this may install a different
* version of @react-navigation/native than the one required by expo-router.
*
* To detect this, we require the caller of this function to first resolve their path to @react-navigation/native, as
* they will get the 'top' level package. When expo-router resolves the path to @react-navigation/native, if it is different
* when the versions must not have matched and the package manager installed a nested node_module folder with a different
* version of @react-navigation/native.
*/
if (userExcluded.has('@react-navigation/native') &&
appReactNavigationPath !== libReactNavigationPath) {
console.warn(`Detected multiple versions of ${bold('@react-navigation/native')} in your ${bold('node_modules')}. This may lead to unexpected navigation behavior and errors. ${learnMore('https://expo.fyi/router-navigation-deps')}.`);
}
for (const [dep, allowedRange] of routerDependencies) {
if (userExcluded.has(dep)) {
debug(`Skipping ${dep} because it is excluded in the config`);
continue;
}
const usersRange = resolvedDependencies[dep];
/**
* routerDependencies contains all the dependencies that are required by expo-router,
* both peerDependencies and dependencies. If the user has not manually installed
* them, then we should skip them.
*/
if (!usersRange) {
continue;
}
debug(`Checking ${dep} with ${allowedRange} and found ${usersRange}`);
if (!usersRange || (0, subset_1.default)(allowedRange, usersRange)) {
continue;
}
debug(`Incorrect dependency found for ${dep}`);
incorrectDependencies.push({
packageName: dep,
packageType: pkg.dependencies && dep in pkg.dependencies ? 'dependencies' : 'devDependencies',
expectedVersionOrRange: allowedRange,
actualVersion: usersRange,
});
}
return incorrectDependencies;
}
exports.doctor = doctor;
//# sourceMappingURL=index.js.map
;