@expo/cli
Version:
169 lines (168 loc) • 6.64 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
getCombinedKnownVersionsAsync: function() {
return getCombinedKnownVersionsAsync;
},
getOperationLog: function() {
return getOperationLog;
},
getRemoteVersionsForSdkAsync: function() {
return getRemoteVersionsForSdkAsync;
},
getVersionedPackagesAsync: function() {
return getVersionedPackagesAsync;
}
});
function _npmpackagearg() {
const data = /*#__PURE__*/ _interop_require_default(require("npm-package-arg"));
_npmpackagearg = function() {
return data;
};
return data;
}
const _bundledNativeModules = require("./bundledNativeModules");
const _resolvePackages = require("./resolvePackages");
const _getVersions = require("../../../api/getVersions");
const _log = require("../../../log");
const _env = require("../../../utils/env");
const _errors = require("../../../utils/errors");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const debug = require('debug')('expo:doctor:dependencies:getVersionedPackages');
/** Adds `react-dom`, `react`, and `react-native` to the list of known package versions (`relatedPackages`) */ function normalizeSdkVersionObject(version) {
if (!version) {
return {};
}
const { relatedPackages, facebookReactVersion, facebookReactNativeVersion, expoVersion } = version;
const reactVersion = facebookReactVersion ? {
react: facebookReactVersion,
'react-dom': facebookReactVersion
} : undefined;
const expoVersionIfAvailable = expoVersion ? {
expo: expoVersion
} : undefined;
return {
...relatedPackages,
...reactVersion,
...expoVersionIfAvailable,
'react-native': facebookReactNativeVersion
};
}
async function getCombinedKnownVersionsAsync({ projectRoot, sdkVersion, skipCache }) {
const skipRemoteVersions = await (0, _resolvePackages.hasExpoCanaryAsync)(projectRoot);
if (skipRemoteVersions) {
_log.Log.warn('Dependency validation might be unreliable when using canary SDK versions');
}
if (_env.env.EXPO_NO_DEPENDENCY_VALIDATION) {
debug('Dependency validation is disabled through EXPO_NO_DEPENDENCY_VALIDATION=1');
return {};
}
const bundledNativeModules = sdkVersion ? await (0, _bundledNativeModules.getVersionedNativeModulesAsync)(projectRoot, sdkVersion, {
skipRemoteVersions
}) : {};
const versionsForSdk = !skipRemoteVersions ? await getRemoteVersionsForSdkAsync({
sdkVersion,
skipCache
}) : {};
return {
...bundledNativeModules,
// Prefer the remote versions over the bundled versions, this enables us to push
// emergency fixes that users can access without having to update the `expo` package.
...versionsForSdk
};
}
async function getRemoteVersionsForSdkAsync({ sdkVersion, skipCache } = {}) {
if (_env.env.EXPO_OFFLINE) {
_log.Log.warn('Dependency validation is unreliable in offline-mode');
return {};
}
try {
const { sdkVersions } = await (0, _getVersions.getVersionsAsync)({
skipCache
});
// We only want versioned dependencies so skip if they cannot be found.
if (!sdkVersion || !(sdkVersion in sdkVersions)) {
debug(`Skipping versioned dependencies because the SDK version is not found. (sdkVersion: ${sdkVersion}, available: ${Object.keys(sdkVersions).join(', ')})`);
return {};
}
const version = sdkVersions[sdkVersion];
return normalizeSdkVersionObject(version);
} catch (error) {
if (error instanceof _errors.CommandError && error.code === 'OFFLINE') {
return getRemoteVersionsForSdkAsync({
sdkVersion,
skipCache
});
}
throw error;
}
}
async function getVersionedPackagesAsync(projectRoot, { packages, sdkVersion, pkg }) {
const versionsForSdk = await getCombinedKnownVersionsAsync({
projectRoot,
sdkVersion,
skipCache: true
});
let nativeModulesCount = 0;
let othersCount = 0;
const excludedNativeModules = [];
const versionedPackages = packages.map((arg)=>{
const { name, type, raw, rawSpec } = (0, _npmpackagearg().default)(arg);
if ([
'tag',
'version',
'range'
].includes(type) && name && versionsForSdk[name]) {
var _pkg_expo_install_exclude, _pkg_expo_install, _pkg_expo;
// Unimodule packages from npm registry are modified to use the bundled version.
// Some packages have the recommended version listed in https://exp.host/--/api/v2/versions.
const isExcludedFromValidation = pkg == null ? void 0 : (_pkg_expo = pkg.expo) == null ? void 0 : (_pkg_expo_install = _pkg_expo.install) == null ? void 0 : (_pkg_expo_install_exclude = _pkg_expo_install.exclude) == null ? void 0 : _pkg_expo_install_exclude.includes(name);
const hasSpecifiedExactVersion = rawSpec !== '' && rawSpec !== '*';
if (isExcludedFromValidation || hasSpecifiedExactVersion) {
othersCount++;
excludedNativeModules.push({
name,
bundledNativeVersion: versionsForSdk[name],
isExcludedFromValidation,
specifiedVersion: hasSpecifiedExactVersion ? rawSpec : ''
});
return raw;
}
nativeModulesCount++;
return `${name}@${versionsForSdk[name]}`;
} else {
// Other packages are passed through unmodified.
othersCount++;
return raw;
}
});
const messages = getOperationLog({
othersCount,
nativeModulesCount,
sdkVersion
});
return {
packages: versionedPackages,
messages,
excludedNativeModules
};
}
function getOperationLog({ nativeModulesCount, sdkVersion, othersCount }) {
return [
nativeModulesCount > 0 && `${nativeModulesCount} SDK ${sdkVersion} compatible native ${nativeModulesCount === 1 ? 'module' : 'modules'}`,
othersCount > 0 && `${othersCount} other ${othersCount === 1 ? 'package' : 'packages'}`
].filter(Boolean);
}
//# sourceMappingURL=getVersionedPackages.js.map
;