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
1,387 lines (1,046 loc) • 44.4 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
function _bluebird() {
const data = require("bluebird");
_bluebird = function () {
return data;
};
return data;
}
function _defineProperty2() {
const data = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
_defineProperty2 = function () {
return data;
};
return data;
}
function path() {
const data = _interopRequireWildcard(require("path"));
path = function () {
return data;
};
return data;
}
function _semver() {
const data = _interopRequireDefault(require("semver"));
_semver = function () {
return data;
};
return data;
}
function _fsExtra() {
const data = _interopRequireDefault(require("fs-extra"));
_fsExtra = function () {
return data;
};
return data;
}
function _ramda() {
const data = _interopRequireDefault(require("ramda"));
_ramda = function () {
return data;
};
return data;
}
function _pMapSeries() {
const data = _interopRequireDefault(require("p-map-series"));
_pMapSeries = function () {
return data;
};
return data;
}
function _consumerLocator() {
const data = require("./consumer-locator");
_consumerLocator = function () {
return data;
};
return data;
}
function _exceptions() {
const data = require("./exceptions");
_exceptions = function () {
return data;
};
return data;
}
function _bitId() {
const data = require("../bit-id");
_bitId = function () {
return data;
};
return data;
}
function _component() {
const data = _interopRequireDefault(require("./component"));
_component = function () {
return data;
};
return data;
}
function _constants() {
const data = require("../constants");
_constants = function () {
return data;
};
return data;
}
function _scope() {
const data = require("../scope");
_scope = function () {
return data;
};
return data;
}
function _consumerMigratorManifest() {
const data = _interopRequireDefault(require("./migrations/consumer-migrator-manifest"));
_consumerMigratorManifest = function () {
return data;
};
return data;
}
function _consumerMigrator() {
const data = _interopRequireDefault(require("./migrations/consumer-migrator"));
_consumerMigrator = function () {
return data;
};
return data;
}
function _loader() {
const data = _interopRequireDefault(require("../cli/loader"));
_loader = function () {
return data;
};
return data;
}
function _loaderMessages() {
const data = require("../cli/loader/loader-messages");
_loaderMessages = function () {
return data;
};
return data;
}
function _bitMap() {
const data = _interopRequireDefault(require("./bit-map/bit-map"));
_bitMap = function () {
return data;
};
return data;
}
function _logger() {
const data = _interopRequireDefault(require("../logger/logger"));
_logger = function () {
return data;
};
return data;
}
function _dirStructure() {
const data = _interopRequireDefault(require("./dir-structure/dir-structure"));
_dirStructure = function () {
return data;
};
return data;
}
function _utils() {
const data = require("../utils");
_utils = function () {
return data;
};
return data;
}
function _models() {
const data = require("../scope/models");
_models = function () {
return data;
};
return data;
}
function packageJsonUtils() {
const data = _interopRequireWildcard(require("./component/package-json-utils"));
packageJsonUtils = function () {
return data;
};
return data;
}
function _dependencies() {
const data = require("./component/dependencies");
_dependencies = function () {
return data;
};
return data;
}
function _analytics() {
const data = require("../analytics/analytics");
_analytics = function () {
return data;
};
return data;
}
function _generalError() {
const data = _interopRequireDefault(require("../error/general-error"));
_generalError = function () {
return data;
};
return data;
}
function _tagModelComponent() {
const data = _interopRequireDefault(require("../scope/component-ops/tag-model-component"));
_tagModelComponent = function () {
return data;
};
return data;
}
function _autoTag() {
const data = require("../scope/component-ops/auto-tag");
_autoTag = function () {
return data;
};
return data;
}
function _exceptions2() {
const data = require("../scope/exceptions");
_exceptions2 = function () {
return data;
};
return data;
}
function _manipulateDir() {
const data = require("./component-ops/manipulate-dir");
_manipulateDir = function () {
return data;
};
return data;
}
function _componentLoader() {
const data = _interopRequireDefault(require("./component/component-loader"));
_componentLoader = function () {
return data;
};
return data;
}
function _scopeRemotes() {
const data = require("../scope/scope-remotes");
_scopeRemotes = function () {
return data;
};
return data;
}
function _scopeComponentsImporter() {
const data = _interopRequireDefault(require("../scope/component-ops/scope-components-importer"));
_scopeComponentsImporter = function () {
return data;
};
return data;
}
function _installExtensions() {
const data = _interopRequireDefault(require("../scope/extensions/install-extensions"));
_installExtensions = function () {
return data;
};
return data;
}
function _composeComponentPath() {
const data = require("../utils/bit/compose-component-path");
_composeComponentPath = function () {
return data;
};
return data;
}
function _componentNodeModulesPath() {
const data = _interopRequireDefault(require("../utils/bit/component-node-modules-path"));
_componentNodeModulesPath = function () {
return data;
};
return data;
}
function _envFactory() {
const data = _interopRequireDefault(require("../legacy-extensions/env-factory"));
_envFactory = function () {
return data;
};
return data;
}
function _componentsPendingImport() {
const data = _interopRequireDefault(require("./component-ops/exceptions/components-pending-import"));
_componentsPendingImport = function () {
return data;
};
return data;
}
function _packageNameToComponentId() {
const data = require("../utils/bit/package-name-to-component-id");
_packageNameToComponentId = function () {
return data;
};
return data;
}
function _packageJsonFile() {
const data = _interopRequireDefault(require("./component/package-json-file"));
_packageJsonFile = function () {
return data;
};
return data;
}
function _failedLoadForTag() {
const data = require("./component/exceptions/failed-load-for-tag");
_failedLoadForTag = function () {
return data;
};
return data;
}
function _workspaceConfig() {
const data = _interopRequireDefault(require("./config/workspace-config"));
_workspaceConfig = function () {
return data;
};
return data;
}
function _componentStatusLoader() {
const data = require("./component-ops/component-status-loader");
_componentStatusLoader = function () {
return data;
};
return data;
}
/**
* @todo: change the class name to Workspace
*/
class Consumer {
// Mark that the consumer instance is of isolated env and not real
// list of git hooks added during init process
// list of git hooks already exists during init process
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
// cache loaded components
// args entered by the user in the command line after '--'
constructor({
projectPath,
config,
scope,
created = false,
isolated = false,
bitMap,
addedGitHooks,
existingGitHooks
}) {
(0, _defineProperty2().default)(this, "projectPath", void 0);
(0, _defineProperty2().default)(this, "created", void 0);
(0, _defineProperty2().default)(this, "config", void 0);
(0, _defineProperty2().default)(this, "scope", void 0);
(0, _defineProperty2().default)(this, "bitMap", void 0);
(0, _defineProperty2().default)(this, "isolated", false);
(0, _defineProperty2().default)(this, "addedGitHooks", void 0);
(0, _defineProperty2().default)(this, "existingGitHooks", void 0);
(0, _defineProperty2().default)(this, "_dirStructure", void 0);
(0, _defineProperty2().default)(this, "_componentsStatusCache", {});
(0, _defineProperty2().default)(this, "packageManagerArgs", []);
(0, _defineProperty2().default)(this, "componentLoader", void 0);
(0, _defineProperty2().default)(this, "componentStatusLoader", void 0);
(0, _defineProperty2().default)(this, "packageJson", void 0);
this.projectPath = projectPath;
this.config = config;
this.created = created;
this.isolated = isolated;
this.scope = scope;
this.bitMap = bitMap || _bitMap().default.load(projectPath);
this.addedGitHooks = addedGitHooks;
this.existingGitHooks = existingGitHooks;
this.componentLoader = _componentLoader().default.getInstance(this);
this.componentStatusLoader = new (_componentStatusLoader().ComponentStatusLoader)(this);
this.packageJson = _packageJsonFile().default.loadSync(projectPath);
} // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
get compiler() {
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
return this.getEnv(_constants().COMPILER_ENV_TYPE);
} // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
get tester() {
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
return this.getEnv(_constants().TESTER_ENV_TYPE);
} // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
get dirStructure() {
if (!this._dirStructure) {
this._dirStructure = new (_dirStructure().default)(this.config.componentsDefaultDirectory, this.config._dependenciesDirectory);
}
return this._dirStructure;
} // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
get bitmapIds() {
return this.bitMap.getAllBitIds();
}
getEnv(envType, context) {
var _this = this;
return (0, _bluebird().coroutine)(function* () {
const props = _this._getEnvProps(envType, context);
if (!props) return undefined;
return (0, _envFactory().default)(envType, props);
})();
}
getTmpFolder(fullPath = false) {
if (!fullPath) {
return _constants().BIT_WORKSPACE_TMP_DIRNAME;
}
return path().join(this.getPath(), _constants().BIT_WORKSPACE_TMP_DIRNAME);
}
cleanTmpFolder() {
var _this2 = this;
return (0, _bluebird().coroutine)(function* () {
const tmpPath = _this2.getTmpFolder(true);
const exists = yield _fsExtra().default.pathExists(tmpPath);
if (exists) {
_logger().default.info(`consumer.cleanTmpFolder, deleting ${tmpPath}`);
return _fsExtra().default.remove(tmpPath);
}
return undefined;
})();
}
/**
* Running migration process for consumer to update the stores (.bit.map.json) to the current version
*
* @param {any} verbose - print debug logs
* @returns {Object} - wether the process run and wether it successeded
* @memberof Consumer
*/
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
migrate(verbose) {
var _this3 = this;
return (0, _bluebird().coroutine)(function* () {
// Check version of stores (bitmap / bitjson) to check if we need to run migrate
// If migration is needed add loader - loader.start(BEFORE_MIGRATION);
// bitmap migrate
if (verbose) console.log('running migration process for consumer'); // eslint-disable-line
// We start to use this process after version 0.10.9, so we assume the scope is in the last production version
const bitmapVersion = _this3.bitMap.version || '0.10.9';
if (_semver().default.gte(bitmapVersion, _constants().BIT_VERSION)) {
_logger().default.silly('bit.map version is up to date');
return {
run: false
};
}
_loader().default.start(_loaderMessages().BEFORE_MIGRATION);
_logger().default.debugAndAddBreadCrumb('consumer.migrate', `start consumer migration. bitmapVersion version ${bitmapVersion}, bit version ${_constants().BIT_VERSION}`);
const result = yield (0, _consumerMigrator().default)(bitmapVersion, _consumerMigratorManifest().default, _this3.bitMap, verbose);
result.bitMap.version = _constants().BIT_VERSION; // mark the bitmap as changed to make sure it persist to FS
result.bitMap.markAsChanged(); // Update the version of the bitmap instance of the consumer (to prevent duplicate migration)
_this3.bitMap.version = result.bitMap.version;
yield result.bitMap.write();
_loader().default.stop();
return {
run: true,
success: true
};
})();
}
write() {
var _this4 = this;
return (0, _bluebird().coroutine)(function* () {
yield Promise.all([_this4.config.write({
workspaceDir: _this4.projectPath
}), _this4.scope.ensureDir()]);
_this4.bitMap.markAsChanged();
yield _this4.bitMap.write();
return _this4;
})();
}
getPath() {
return this.projectPath;
}
toAbsolutePath(pathStr) {
if (path().isAbsolute(pathStr)) throw new Error(`toAbsolutePath expects relative path, got ${pathStr}`);
return path().join(this.projectPath, pathStr);
}
getPathRelativeToConsumer(pathToCheck) {
const absolutePath = path().resolve(pathToCheck); // if pathToCheck was absolute, it returns it back
return path().relative(this.getPath(), absolutePath);
}
getParsedId(id) {
// @ts-ignore (we know it will never be undefined since it pass throw=true)
const bitId = this.bitMap.getExistingBitId(id, true);
const version = _bitId().BitId.getVersionOnlyFromString(id);
return bitId.changeVersion(version || _constants().LATEST);
}
getParsedIdIfExist(id) {
const bitId = this.bitMap.getExistingBitId(id, false);
if (!bitId) return undefined;
const version = _bitId().BitId.getVersionOnlyFromString(id);
return bitId.changeVersion(version);
}
/**
* throws a ComponentNotFound exception if not found in the model
*/
loadComponentFromModel(id) {
var _this5 = this;
return (0, _bluebird().coroutine)(function* () {
if (!id.version) throw new TypeError('consumer.loadComponentFromModel, version is missing from the id');
const modelComponent = yield _this5.scope.getModelComponent(id);
const componentVersion = modelComponent.toComponentVersion(id.version);
const manipulateDirData = yield (0, _manipulateDir().getManipulateDirForExistingComponents)(_this5, componentVersion);
return modelComponent.toConsumerComponent(id.version, _this5.scope.name, _this5.scope.objects, manipulateDirData);
})();
}
/**
* return a component only when it's stored locally.
* don't go to any remote server and don't throw an exception if the component is not there.
*/
loadComponentFromModelIfExist(id) {
var _this6 = this;
return (0, _bluebird().coroutine)(function* () {
if (!id.version) return undefined;
return _this6.loadComponentFromModel(id).catch(err => {
if (err instanceof _exceptions2().ComponentNotFound) return undefined;
throw err;
});
})();
}
loadAllVersionsOfComponentFromModel(id) {
var _this7 = this;
return (0, _bluebird().coroutine)(function* () {
const modelComponent = yield _this7.scope.getModelComponent(id);
const componentsP = modelComponent.listVersions().map( /*#__PURE__*/function () {
var _ref = (0, _bluebird().coroutine)(function* (versionNum) {
const componentVersion = modelComponent.toComponentVersion(versionNum);
const manipulateDirData = yield (0, _manipulateDir().getManipulateDirForExistingComponents)(_this7, componentVersion);
return modelComponent.toConsumerComponent(versionNum, _this7.scope.name, _this7.scope.objects, manipulateDirData);
});
return function (_x) {
return _ref.apply(this, arguments);
};
}());
return Promise.all(componentsP);
})();
}
loadComponentWithDependenciesFromModel(id, throwIfNotExist = true) {
var _this8 = this;
return (0, _bluebird().coroutine)(function* () {
const scopeComponentsImporter = _scopeComponentsImporter().default.getInstance(_this8.scope);
const getModelComponent = /*#__PURE__*/function () {
var _ref2 = (0, _bluebird().coroutine)(function* () {
if (throwIfNotExist) return _this8.scope.getModelComponent(id);
const modelComponent = yield _this8.scope.getModelComponentIfExist(id);
if (modelComponent) return modelComponent;
yield scopeComponentsImporter.importMany(new (_bitId().BitIds)(id));
return _this8.scope.getModelComponent(id);
});
return function getModelComponent() {
return _ref2.apply(this, arguments);
};
}();
const modelComponent = yield getModelComponent();
if (!id.version) {
throw new TypeError('consumer.loadComponentWithDependenciesFromModel, version is missing from the id');
}
const versionDependencies = yield scopeComponentsImporter.componentToVersionDependencies(modelComponent, id);
const manipulateDirData = yield (0, _manipulateDir().getManipulateDirWhenImportingComponents)(_this8.bitMap, [versionDependencies], _this8.scope.objects);
return versionDependencies.toConsumer(_this8.scope.objects, manipulateDirData);
})();
}
loadComponent(id) {
var _this9 = this;
return (0, _bluebird().coroutine)(function* () {
const {
components
} = yield _this9.loadComponents(_bitId().BitIds.fromArray([id]));
return components[0];
})();
}
loadComponentForCapsule(id) {
return this.componentLoader.loadForCapsule(id);
}
loadComponents(ids, throwOnFailure = true) {
var _this10 = this;
return (0, _bluebird().coroutine)(function* () {
return _this10.componentLoader.loadMany(ids, throwOnFailure);
})();
}
importEnvironment(bitId, verbose = false, dontPrintEnvMsg) {
return (0, _installExtensions().default)({
ids: [{
componentId: bitId
}],
scope: this.scope,
verbose,
dontPrintEnvMsg
});
}
importComponents(ids, withAllVersions, saveDependenciesAsComponents) {
var _this11 = this;
return (0, _bluebird().coroutine)(function* () {
const scopeComponentsImporter = _scopeComponentsImporter().default.getInstance(_this11.scope);
const versionDependenciesArr = withAllVersions ? yield scopeComponentsImporter.importManyWithAllVersions(ids, false) : yield scopeComponentsImporter.importMany(ids);
const shouldDependenciesSavedAsComponents = yield _this11.shouldDependenciesSavedAsComponents(versionDependenciesArr.map(v => v.component.id), saveDependenciesAsComponents);
const manipulateDirData = yield (0, _manipulateDir().getManipulateDirWhenImportingComponents)(_this11.bitMap, versionDependenciesArr, _this11.scope.objects);
const componentWithDependencies = yield (0, _pMapSeries().default)(versionDependenciesArr, versionDependencies => versionDependencies.toConsumer(_this11.scope.objects, manipulateDirData));
componentWithDependencies.forEach(componentWithDeps => {
const shouldSavedAsComponents = shouldDependenciesSavedAsComponents.find(c => c.id.isEqual(componentWithDeps.component.id));
if (!shouldSavedAsComponents) {
throw new Error(`saveDependenciesAsComponents is missing for ${componentWithDeps.component.id.toString()}`);
}
componentWithDeps.component.dependenciesSavedAsComponents = shouldSavedAsComponents.saveDependenciesAsComponents;
});
return componentWithDependencies;
})();
}
shouldDependenciesSavedAsComponents(bitIds, saveDependenciesAsComponents) {
var _this12 = this;
return (0, _bluebird().coroutine)(function* () {
if (saveDependenciesAsComponents === undefined) {
saveDependenciesAsComponents = _this12.config._saveDependenciesAsComponents;
}
const remotes = yield (0, _scopeRemotes().getScopeRemotes)(_this12.scope);
const shouldDependenciesSavedAsComponents = bitIds.map(bitId => {
return {
id: bitId,
// if it doesn't go to the hub, it can't import dependencies as packages
saveDependenciesAsComponents: saveDependenciesAsComponents || !remotes.isHub(bitId.scope)
};
});
return shouldDependenciesSavedAsComponents;
})();
}
/**
* By default, the dists paths are inside the component.
* If dist attribute is populated in bit.json, the paths are in consumer-root/dist-target.
*/
shouldDistsBeInsideTheComponent() {
return !this.config._distEntry && !this.config._distTarget;
}
potentialComponentsForAutoTagging(modifiedComponents) {
const candidateComponents = this.bitMap.getAuthoredAndImportedBitIds();
const modifiedComponentsWithoutVersions = modifiedComponents.map(modifiedComponent => modifiedComponent.toStringWithoutVersion()); // if a modified component is in candidates array, remove it from the array as it will be already tagged with the
// correct version
const idsWithoutModified = candidateComponents.filter(component => !modifiedComponentsWithoutVersions.includes(component.toStringWithoutVersion()));
return _bitId().BitIds.fromArray(idsWithoutModified);
}
listComponentsForAutoTagging(modifiedComponents) {
var _this13 = this;
return (0, _bluebird().coroutine)(function* () {
const candidateComponents = _this13.potentialComponentsForAutoTagging(modifiedComponents);
return (0, _autoTag().getAutoTagPending)(_this13.scope, candidateComponents, modifiedComponents);
})();
}
/**
* Check whether a model representation and file-system representation of the same component is the same.
* The way how it is done is by converting the file-system representation of the component into
* a Version object. Once this is done, we have two Version objects, and we can compare their hashes
*/
isComponentModified(componentFromModel, componentFromFileSystem) {
var _this14 = this;
return (0, _bluebird().coroutine)(function* () {
if (!(componentFromModel instanceof _models().Version)) {
throw new TypeError(`isComponentModified expects componentFromModel to be Version, got ${typeof componentFromModel}`);
}
if (!(componentFromFileSystem instanceof _component().default)) {
throw new TypeError(`isComponentModified expects componentFromFileSystem to be ConsumerComponent, got ${typeof componentFromFileSystem}`);
}
if (typeof componentFromFileSystem._isModified === 'undefined') {
const componentMap = _this14.bitMap.getComponent(componentFromFileSystem.id);
if (componentMap.originallySharedDir) {
componentFromFileSystem.originallySharedDir = componentMap.originallySharedDir;
} // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const {
version
} = yield _this14.scope.sources.consumerComponentToVersion({
consumer: _this14,
consumerComponent: componentFromFileSystem
});
version.log = componentFromModel.log; // ignore the log, it's irrelevant for the comparison
// sometime dependencies from the FS don't have an exact version.
const copyDependenciesVersionsFromModelToFS = (dependenciesFS, dependenciesModel) => {
dependenciesFS.get().forEach(dependency => {
const dependencyFromModel = dependenciesModel.get().find(modelDependency => modelDependency.id.isEqualWithoutVersion(dependency.id));
if (dependencyFromModel && !dependency.id.hasVersion()) {
dependency.id = dependencyFromModel.id;
}
});
};
copyDependenciesVersionsFromModelToFS(version.dependencies, componentFromModel.dependencies);
copyDependenciesVersionsFromModelToFS(version.devDependencies, componentFromModel.devDependencies);
sortProperties(version); // prefix your command with "BIT_LOG=*" to see the actual id changes
if (process.env.BIT_LOG && componentFromModel.hash().hash !== version.hash().hash) {
console.log('-------------------componentFromModel------------------------'); // eslint-disable-line no-console
console.log(componentFromModel.id()); // eslint-disable-line no-console
console.log('------------------------componentFromFileSystem (version)----'); // eslint-disable-line no-console
console.log(version.id()); // eslint-disable-line no-console
console.log('-------------------------END---------------------------------'); // eslint-disable-line no-console
}
componentFromFileSystem._isModified = componentFromModel.hash().hash !== version.hash().hash;
}
return componentFromFileSystem._isModified;
function sortProperties(version) {
// sort the files by 'relativePath' because the order can be changed when adding or renaming
// files in bitmap, which affects later on the model.
version.files = _ramda().default.sortBy(_ramda().default.prop('relativePath'), version.files);
componentFromModel.files = _ramda().default.sortBy(_ramda().default.prop('relativePath'), componentFromModel.files);
version.dependencies.sort();
version.devDependencies.sort();
version.packageDependencies = (0, _utils().sortObject)(version.packageDependencies);
version.devPackageDependencies = (0, _utils().sortObject)(version.devPackageDependencies);
version.compilerPackageDependencies = (0, _utils().sortObject)(version.compilerPackageDependencies);
version.testerPackageDependencies = (0, _utils().sortObject)(version.testerPackageDependencies);
version.peerPackageDependencies = (0, _utils().sortObject)(version.peerPackageDependencies);
sortOverrides(version.overrides);
componentFromModel.dependencies.sort();
componentFromModel.devDependencies.sort();
componentFromModel.packageDependencies = (0, _utils().sortObject)(componentFromModel.packageDependencies);
componentFromModel.devPackageDependencies = (0, _utils().sortObject)(componentFromModel.devPackageDependencies);
componentFromModel.compilerPackageDependencies = (0, _utils().sortObject)(componentFromModel.compilerPackageDependencies);
componentFromModel.testerPackageDependencies = (0, _utils().sortObject)(componentFromModel.testerPackageDependencies);
componentFromModel.peerPackageDependencies = (0, _utils().sortObject)(componentFromModel.peerPackageDependencies);
sortOverrides(componentFromModel.overrides);
}
function sortOverrides(overrides) {
if (!overrides) return;
_constants().DEPENDENCIES_FIELDS.forEach(field => {
if (overrides[field]) overrides[field] = (0, _utils().sortObject)(overrides[field]);
});
}
})();
}
getManyComponentsStatuses(ids) {
var _this15 = this;
return (0, _bluebird().coroutine)(function* () {
return _this15.componentStatusLoader.getManyComponentsStatuses(ids);
})();
}
getComponentStatusById(id) {
var _this16 = this;
return (0, _bluebird().coroutine)(function* () {
return _this16.componentStatusLoader.getComponentStatusById(id);
})();
}
tag(ids, message, exactVersion, releaseType, force, verbose, ignoreUnresolvedDependencies, ignoreNewestVersion, skipTests = false, skipAutoTag) {
var _this17 = this;
return (0, _bluebird().coroutine)(function* () {
_logger().default.debug(`tagging the following components: ${ids.toString()}`);
_analytics().Analytics.addBreadCrumb('tag', `tagging the following components: ${_analytics().Analytics.hashData(ids)}`);
const components = yield _this17._loadComponentsForTag(ids); // go through the components list to check if there are missing dependencies
// if there is at least one we won't tag anything
const componentsWithRelativeAuthored = components.filter(component => component.issues && component.issues.relativeComponentsAuthored);
if (!_this17.isLegacy && !_ramda().default.isEmpty(componentsWithRelativeAuthored)) {
throw new (_exceptions().MissingDependencies)(componentsWithRelativeAuthored);
}
if (!ignoreUnresolvedDependencies) {
// components that have issues other than relativeComponentsAuthored.
const componentsWithOtherIssues = components.filter(component => {
const issues = component.issues;
return issues && Object.keys(issues).some(label => label !== 'relativeComponentsAuthored' && !_ramda().default.isEmpty(issues[label]));
});
if (!_ramda().default.isEmpty(componentsWithOtherIssues)) throw new (_exceptions().MissingDependencies)(componentsWithOtherIssues);
}
const areComponentsMissingFromScope = components.some(c => !c.componentFromModel && c.id.hasScope());
if (areComponentsMissingFromScope) {
throw new (_componentsPendingImport().default)();
}
const {
taggedComponents,
autoTaggedResults
} = yield (0, _tagModelComponent().default)({
consumerComponents: components,
scope: _this17.scope,
message,
exactVersion,
releaseType,
force,
consumer: _this17,
ignoreNewestVersion,
skipTests,
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
verbose,
skipAutoTag
});
const autoTaggedComponents = autoTaggedResults.map(r => r.component);
const allComponents = [...taggedComponents, ...autoTaggedComponents];
yield _this17.updateComponentsVersions(allComponents);
return {
taggedComponents,
autoTaggedResults
};
})();
}
_loadComponentsForTag(ids) {
var _this18 = this;
return (0, _bluebird().coroutine)(function* () {
const {
components
} = yield _this18.loadComponents(ids);
if (_this18.isLegacy) {
return components;
}
let shouldReloadComponents;
const componentsWithRelativePaths = [];
const componentsWithFilesNotDir = [];
components.forEach(component => {
const componentMap = component.componentMap;
if (componentMap.rootDir) return;
const hasRelativePaths = component.issues && component.issues.relativeComponentsAuthored; // leaving this because it can be helpful for users upgrade from legacy
if (componentMap.trackDir && !hasRelativePaths) {
componentMap.changeRootDirAndUpdateFilesAccordingly(componentMap.trackDir);
shouldReloadComponents = true;
return;
}
if (hasRelativePaths) {
componentsWithRelativePaths.push(component.id.toStringWithoutVersion());
}
if (!componentMap.trackDir) {
componentsWithFilesNotDir.push(component.id.toStringWithoutVersion());
}
});
if (componentsWithRelativePaths.length || componentsWithFilesNotDir.length) {
throw new (_failedLoadForTag().FailedLoadForTag)(componentsWithRelativePaths.sort(), componentsWithFilesNotDir.sort());
}
if (!shouldReloadComponents) return components;
_this18.componentLoader.clearComponentsCache();
const {
components: reloadedComponents
} = yield _this18.loadComponents(ids);
return reloadedComponents;
})();
}
updateComponentsVersions(components) {
const getPackageJsonDir = (componentMap, bitId, bindingPrefix) => {
if (componentMap.origin === _constants().COMPONENT_ORIGINS.AUTHORED) {
if (componentMap.hasRootDir()) return null; // no package.json in this case
return (0, _componentNodeModulesPath().default)(bindingPrefix, bitId, true, this.config.defaultScope);
}
return componentMap.rootDir;
};
const updateVersionsP = components.map(component => {
const id = component instanceof _models().ModelComponent ? component.toBitIdWithLatestVersionAllowNull() : component.id;
this.bitMap.updateComponentId(id);
const componentMap = this.bitMap.getComponent(id);
const packageJsonDir = getPackageJsonDir(componentMap, id, component.bindingPrefix);
return packageJsonDir // if it has package.json, it's imported, which must have a version
? packageJsonUtils().updateAttribute(this, packageJsonDir, 'version', id.version) : Promise.resolve();
});
return Promise.all(updateVersionsP);
}
getComponentIdFromNodeModulesPath(requirePath, bindingPrefix) {
requirePath = (0, _utils().pathNormalizeToLinux)(requirePath);
const prefix = requirePath.includes('node_modules') ? 'node_modules/' : '';
const withoutPrefix = prefix ? requirePath.substr(requirePath.indexOf(prefix) + prefix.length) : requirePath;
if (!withoutPrefix.includes('/')) {
throw new (_generalError().default)('getComponentIdFromNodeModulesPath expects the path to have at least one slash for the scoped package, such as @bit/');
}
const packageSplitBySlash = withoutPrefix.split('/'); // the part after the second slash is the path inside the package, just ignore it.
// (e.g. @bit/my-scope.my-name/internal-path.js).
const packageName = `${packageSplitBySlash[0]}/${packageSplitBySlash[1]}`;
return (0, _packageNameToComponentId().packageNameToComponentId)(this, packageName, bindingPrefix);
}
composeRelativeComponentPath(bitId) {
const {
componentsDefaultDirectory
} = this.dirStructure;
return (0, _composeComponentPath().composeComponentPath)(bitId, componentsDefaultDirectory);
}
composeComponentPath(bitId) {
const addToPath = [this.getPath(), this.composeRelativeComponentPath(bitId)];
_logger().default.debug(`component dir path: ${addToPath.join('/')}`);
_analytics().Analytics.addBreadCrumb('composeComponentPath', `component dir path: ${_analytics().Analytics.hashData(addToPath.join('/'))}`);
return path().join(...addToPath);
}
composeRelativeDependencyPath(bitId) {
const dependenciesDir = this.dirStructure.dependenciesDirStructure;
return (0, _composeComponentPath().composeDependencyPath)(bitId, dependenciesDir);
}
composeDependencyPath(bitId) {
const relativeDependencyPath = this.composeRelativeDependencyPath(bitId);
return path().join(this.getPath(), relativeDependencyPath);
}
static create(projectPath, noGit = false, workspaceConfigProps) {
return this.ensure(projectPath, noGit, workspaceConfigProps);
}
static _getScopePath(projectPath, noGit) {
const gitDirPath = path().join(projectPath, _constants().DOT_GIT_DIR);
let resolvedScopePath = path().join(projectPath, _constants().BIT_HIDDEN_DIR);
if (!noGit && _fsExtra().default.existsSync(gitDirPath) && !_fsExtra().default.existsSync(resolvedScopePath)) {
resolvedScopePath = path().join(gitDirPath, _constants().BIT_GIT_DIR);
}
return resolvedScopePath;
}
static ensure(projectPath, standAlone = false, workspaceConfigProps) {
return (0, _bluebird().coroutine)(function* () {
const resolvedScopePath = Consumer._getScopePath(projectPath, standAlone);
let existingGitHooks;
const bitMap = _bitMap().default.load(projectPath); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const scopeP = _scope().Scope.ensure(resolvedScopePath);
const configP = _workspaceConfig().default.ensure(projectPath, standAlone, workspaceConfigProps);
const [scope, config] = yield Promise.all([scopeP, configP]);
return new Consumer({
projectPath,
created: true,
scope,
config,
bitMap,
existingGitHooks
});
})();
}
/**
* if resetHard, delete consumer-files: bitMap and bit.json and also the local scope (.bit dir).
* otherwise, delete the consumer-files only when they are corrupted
*/
static reset(projectPath, resetHard, noGit = false) {
return (0, _bluebird().coroutine)(function* () {
const resolvedScopePath = Consumer._getScopePath(projectPath, noGit);
_bitMap().default.reset(projectPath, resetHard);
const scopeP = _scope().Scope.reset(resolvedScopePath, resetHard);
const configP = _workspaceConfig().default.reset(projectPath, resetHard);
yield Promise.all([scopeP, configP]);
})();
}
static createIsolatedWithExistingScope(consumerPath, scope) {
return (0, _bluebird().coroutine)(function* () {
// if it's an isolated environment, it's normal to have already the consumer
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const config = yield _workspaceConfig().default._ensure(consumerPath); // isolated environments in the workspace rely on a physical node_modules folder
// for this reason, we must use a package manager that supports one
config.packageManager = 'npm'; // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
return new Consumer({
projectPath: consumerPath,
created: true,
scope,
isolated: true,
config
});
})();
}
static locateProjectScope(projectPath) {
if (_fsExtra().default.existsSync(path().join(projectPath, _constants().DOT_GIT_DIR, _constants().BIT_GIT_DIR))) {
return path().join(projectPath, _constants().DOT_GIT_DIR, _constants().BIT_GIT_DIR);
}
if (_fsExtra().default.existsSync(path().join(projectPath, _constants().BIT_HIDDEN_DIR))) {
return path().join(projectPath, _constants().BIT_HIDDEN_DIR);
}
return undefined;
}
static load(currentPath) {
return (0, _bluebird().coroutine)(function* () {
const consumerInfo = yield (0, _consumerLocator().getConsumerInfo)(currentPath);
if (!consumerInfo) {
return Promise.reject(new (_exceptions().ConsumerNotFound)());
}
let consumer;
if ((!consumerInfo.hasConsumerConfig || !consumerInfo.hasScope) && consumerInfo.hasBitMap) {
consumer = yield Consumer.create(consumerInfo.path);
yield Promise.all([consumer.config.write({
workspaceDir: consumer.projectPath
}), consumer.scope.ensureDir()]);
}
const config = consumer && consumer.config ? consumer.config : yield _workspaceConfig().default.loadIfExist(consumerInfo.path);
const scopePath = Consumer.locateProjectScope(consumerInfo.path); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const scope = yield _scope().Scope.load(scopePath); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
return new Consumer({
projectPath: consumerInfo.path,
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
config,
scope
});
})();
}
/**
* legacy is a workspace uses the old bit.json or "bit" prop of package.json.
* new workspaces use workspace.jsonc file
*/
get isLegacy() {
if (!('isLegacy' in this.config)) {
// this happens for example when running `bit import --compiler`. the environment dir has its
// own consumer and the config is not ILegacyWorkspaceConfig but WorkspaceConfig
return true;
}
return this.config.isLegacy;
}
/**
* clean up removed components from bitmap
* @param {BitIds} componentsToRemoveFromFs - delete component that are used by other components.
* @param {BitIds} removedDependencies - delete component that are used by other components.
*/
cleanFromBitMap(componentsToRemoveFromFs, removedDependencies) {
var _this19 = this;
return (0, _bluebird().coroutine)(function* () {
_logger().default.debug(`consumer.cleanFromBitMap, cleaning ${componentsToRemoveFromFs.toString()} from .bitmap`);
_this19.bitMap.removeComponents(componentsToRemoveFromFs);
_this19.bitMap.removeComponents(removedDependencies);
})();
}
addRemoteAndLocalVersionsToDependencies(component, loadedFromFileSystem) {
var _this20 = this;
return (0, _bluebird().coroutine)(function* () {
_logger().default.debug(`addRemoteAndLocalVersionsToDependencies for ${component.id.toString()}`);
_analytics().Analytics.addBreadCrumb('addRemoteAndLocalVersionsToDependencies', `addRemoteAndLocalVersionsToDependencies for ${_analytics().Analytics.hashData(component.id.toString())}`);
let modelDependencies = new (_dependencies().Dependencies)([]);
let modelDevDependencies = new (_dependencies().Dependencies)([]);
if (loadedFromFileSystem) {
// when loaded from file-system, the dependencies versions are fetched from bit.map.
// find the model version of the component and get the stored versions of the dependencies
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const mainComponentFromModel = component.componentFromModel;
if (mainComponentFromModel) {
// otherwise, the component is probably on the file-system only and not on the model.
modelDependencies = mainComponentFromModel.dependencies;
modelDevDependencies = mainComponentFromModel.devDependencies;
}
}
yield component.dependencies.addRemoteAndLocalVersions(_this20.scope, modelDependencies);
yield component.devDependencies.addRemoteAndLocalVersions(_this20.scope, modelDevDependencies);
})();
}
getAuthoredAndImportedDependentsIdsOf(components) {
var _this21 = this;
return (0, _bluebird().coroutine)(function* () {
const authoredAndImportedComponents = _this21.bitMap.getAllBitIds([_constants().COMPONENT_ORIGINS.IMPORTED, _constants().COMPONENT_ORIGINS.AUTHORED]);
const componentsIds = _bitId().BitIds.fromArray(components.map(c => c.id));
return _this21.scope.findDirectDependentComponents(authoredAndImportedComponents, componentsIds);
})();
}
getAuthoredAndImportedDependentsComponentsOf(components) {
var _this22 = this;
return (0, _bluebird().coroutine)(function* () {
const dependentsIds = yield _this22.getAuthoredAndImportedDependentsIdsOf(components);
const scopeComponentsImporter = _scopeComponentsImporter().default.getInstance(_this22.scope);
const versionDependenciesArr = yield scopeComponentsImporter.importMany(dependentsIds, true, false);
const manipulateDirData = yield (0, _manipulateDir().getManipulateDirWhenImportingComponents)(_this22.bitMap, versionDependenciesArr, _this22.scope.objects);
const dependentComponentsP = versionDependenciesArr.map(c => c.component.toConsumer(_this22.scope.objects, manipulateDirData));
return Promise.all(dependentComponentsP);
})();
}
ejectConf(componentId) {
var _this23 = this;
return (0, _bluebird().coroutine)(function* () {
const component = yield _this23.loadComponent(componentId);
return component.writeConfig(_this23);
})();
}
injectConf(componentId, force) {
var _this24 = this;
return (0, _bluebird().coroutine)(function* () {
const component = yield _this24.loadComponent(componentId);
return component.injectConfig(_this24.getPath(), _this24.bitMap, force);
})();
}
_getEnvProps(envType, context) {
const envs = this.config._getEnvsByType(envType);
if (!envs) return undefined;
const envName = Object.keys(envs)[0];
const envObject = envs[envName];
return {
name: envName,
consumerPath: this.getPath(),
scopePath: this.scope.getPath(),
rawConfig: envObject.rawConfig,
files: envObject.files,
bitJsonPath: path().dirname(this.config.path),
options: envObject.options,
envType,
context
};
}
onDestroy() {
var _this25 = this;
return (0, _bluebird().coroutine)(function* () {
yield _this25.cleanTmpFolder();
return _this25.bitMap.write();
})();
}
}
exports.default = Consumer;