UNPKG

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
"use strict"; 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]); } }