bit-bin
Version:
<a href="https://opensource.org/licenses/Apache-2.0"><img alt="apache" src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a> <a href="https://github.com/teambit/bit/blob/master/CONTRIBUTING.md"><img alt="prs" src="https://img.shields.io/b
245 lines (186 loc) • 9.09 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = updateDependenciesVersions;
function path() {
const data = _interopRequireWildcard(require("path"));
path = function () {
return data;
};
return data;
}
function _ramda() {
const data = _interopRequireDefault(require("ramda"));
_ramda = function () {
return data;
};
return data;
}
function _semver() {
const data = _interopRequireDefault(require("semver"));
_semver = function () {
return data;
};
return data;
}
function _logger() {
const data = _interopRequireDefault(require("../../../../logger/logger"));
_logger = function () {
return data;
};
return data;
}
function _componentNodeModulesPath() {
const data = _interopRequireDefault(require("../../../../utils/bit/component-node-modules-path"));
_componentNodeModulesPath = function () {
return data;
};
return data;
}
function _componentIdToPackageName() {
const data = _interopRequireDefault(require("../../../../utils/bit/component-id-to-package-name"));
_componentIdToPackageName = function () {
return data;
};
return data;
}
function _filesDependencyBuilder() {
const data = require("../files-dependency-builder");
_filesDependencyBuilder = function () {
return data;
};
return data;
}
/**
* The dependency version is determined by the following strategies by this order.
* 1) if the component bit.json or package.json has "overrides" property, check whether the dependency version is overridden
* 2) if workspace-config overrides this component, use it. (technically this is done via #1 because we merge the two before)
* 3) if package.json is different than the model, use package.json. to find the package.json follow this steps:
* 3 a) search in the component directory for package.json and look for dependencies or devDependencies with the name of the dependency
* 3 b) if not found there, propagate until you reach the consumer root directory.
* 3 c) if not found, go directly to the dependency directory and find the version in its package.json
* 4) if bitmap has a version, use it.
* 5) use the model if it has a version.
* 6) use the package.json regardless the model.
*
* cases where dependency version may be different than the model:
* 1) user added the component to `overrides` of the workspace config. (workspace bit.json or package.json)
* 2) user changed package.json, either, manually or by npm-install —save.
* 3) user updated a dependency with npm without —save.
* 4) user imported the dependency with different version causing the bitmap to change.
*
* keep in mind that since v14.0.5 bit.json doesn't have the dependencies, so it's impossible
* to change a dependency version from the component bit.json.
*/
function updateDependenciesVersions(consumer, component) {
updateDependencies(component.dependencies);
updateDependencies(component.devDependencies);
updateExtensions(component.extensions);
function resolveVersion(id) {
// $FlowFixMe component.componentFromModel is set
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const idFromModel = getIdFromModelDeps(component.componentFromModel, id);
const idFromPackageJson = getIdFromPackageJson(id);
const idFromBitMap = getIdFromBitMap(id);
const idFromComponentConfig = getIdFromComponentConfig(id);
const idFromDependentPackageJson = getIdFromDependentPackageJson(id); // get from packageJson when it was changed from the model or when there is no model.
const getFromPackageJsonIfChanged = () => {
if (!idFromPackageJson) return null;
if (!idFromModel) return idFromPackageJson;
if (!idFromPackageJson.isEqual(idFromModel)) return idFromPackageJson;
return null;
};
const getFromComponentConfig = () => idFromComponentConfig;
const getFromBitMap = () => idFromBitMap || null;
const getFromModel = () => idFromModel || null;
const getFromPackageJson = () => idFromPackageJson || null;
const getFromDependentPackageJson = () => idFromDependentPackageJson || null;
const strategies = [getFromComponentConfig, getFromDependentPackageJson, getFromPackageJsonIfChanged, getFromBitMap, getFromModel, getFromPackageJson];
for (const strategy of strategies) {
const strategyId = strategy();
if (strategyId) {
_logger().default.debug(`found dependency version ${strategyId.version} for ${id.toString()} in strategy ${strategy.name}`);
return strategyId.version;
}
}
return undefined;
}
function updateDependency(dependency) {
const resolvedVersion = resolveVersion(dependency.id);
if (resolvedVersion) {
dependency.id = dependency.id.changeVersion(resolvedVersion);
}
}
function updateDependencies(dependencies) {
dependencies.get().forEach(updateDependency);
}
function updateExtension(extension) {
if (extension.extensionId) {
const resolvedVersion = resolveVersion(extension.extensionId);
if (resolvedVersion) {
extension.extensionId = extension.extensionId.changeVersion(resolvedVersion);
}
}
}
function updateExtensions(extensions) {
extensions.forEach(updateExtension);
} // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
function getIdFromModelDeps(componentFromModel, componentId) {
if (!componentFromModel) return null;
const dependency = componentFromModel.getAllDependenciesIds().searchWithoutVersion(componentId);
if (!dependency) return null;
return dependency;
}
/**
* the logic of finding the dependency version in the package.json is mostly done in the driver
* resolveNodePackage method.
* it first searches in the dependent package.json and propagate up to the consumer root, if not
* found it goes to the dependency package.json.
*/
function getIdFromPackageJson(componentId) {
if (!componentId.scope) return null; // $FlowFixMe component.componentMap is set
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const rootDir = component.componentMap.rootDir;
const consumerPath = consumer.getPath();
const basePath = rootDir ? path().join(consumerPath, rootDir) : consumerPath;
const packagePath = (0, _componentNodeModulesPath().default)(component.bindingPrefix, componentId);
const packageName = packagePath.replace(`node_modules${path().sep}`, ''); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const modulePath = (0, _filesDependencyBuilder().resolveModulePath)(packageName, basePath, consumerPath);
if (!modulePath) return null; // e.g. it's author and wasn't exported yet, so there's no node_modules of that component
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const packageObject = (0, _filesDependencyBuilder().resolveNodePackage)(basePath, modulePath);
if (!packageObject || _ramda().default.isEmpty(packageObject)) return null;
const packageId = Object.keys(packageObject)[0];
const version = packageObject[packageId];
if (!_semver().default.valid(version) && !_semver().default.validRange(version)) return null; // it's probably a relative path to the component
const validVersion = version.replace(/[^0-9.]/g, ''); // allow only numbers and dots to get an exact version
return componentId.changeVersion(validVersion);
}
function getIdFromDependentPackageJson(componentId) {
// for author, there is not package.json of a component
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
if (!component.packageJsonFile || !component.packageJsonFile.packageJsonObject.dependencies) {
return null;
}
const dependencyIdAsPackage = (0, _componentIdToPackageName().default)(componentId, component.bindingPrefix, component.defaultScope); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const version = component.packageJsonFile.packageJsonObject.dependencies[dependencyIdAsPackage];
if (!_semver().default.valid(version) && !_semver().default.validRange(version)) return null; // it's probably a relative path to the component
const validVersion = version.replace(/[^0-9.]/g, ''); // allow only numbers and dots to get an exact version
return componentId.changeVersion(validVersion);
}
function getIdFromBitMap(componentId) {
return consumer.bitMap.getBitIdIfExist(componentId, {
ignoreVersion: true
});
}
function getIdFromComponentConfig(componentId) {
const dependencies = component.overrides.getComponentDependenciesWithVersion();
if (_ramda().default.isEmpty(dependencies)) return undefined;
const dependency = Object.keys(dependencies).find(idStr => componentId.toStringWithoutVersion() === idStr || componentId.toStringWithoutScopeAndVersion() === idStr);
if (!dependency) return undefined;
return componentId.changeVersion(dependencies[dependency]);
}
}
;