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

490 lines (373 loc) 18.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.addComponentsToRoot = addComponentsToRoot; exports.addComponentsWithVersionToRoot = addComponentsWithVersionToRoot; exports.changeDependenciesToRelativeSyntax = changeDependenciesToRelativeSyntax; exports.preparePackageJsonToWrite = preparePackageJsonToWrite; exports.updateAttribute = updateAttribute; exports.addWorkspacesToPackageJson = addWorkspacesToPackageJson; exports.removeComponentsFromWorkspacesAndDependencies = removeComponentsFromWorkspacesAndDependencies; exports.convertToValidPathForPackageManager = convertToValidPathForPackageManager; function _defineProperty2() { const data = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); _defineProperty2 = function () { return data; }; return data; } function _bluebird() { const data = require("bluebird"); _bluebird = function () { return data; }; return data; } function _ramda() { const data = _interopRequireDefault(require("ramda")); _ramda = function () { return data; }; return data; } function _fsExtra() { const data = _interopRequireDefault(require("fs-extra")); _fsExtra = function () { return data; }; return data; } function _ramdaAdjunct() { const data = require("ramda-adjunct"); _ramdaAdjunct = function () { return data; }; return data; } function _bitId() { const data = require("../../bit-id"); _bitId = function () { return data; }; return data; } function _constants() { const data = require("../../constants"); _constants = function () { return data; }; return data; } function _utils() { const data = require("../../utils"); _utils = function () { return data; }; return data; } function _path() { const data = require("../../utils/path"); _path = function () { return data; }; return data; } function _componentNodeModulesPath() { const data = _interopRequireDefault(require("../../utils/bit/component-node-modules-path")); _componentNodeModulesPath = function () { return data; }; return data; } function _logger() { const data = _interopRequireDefault(require("../../logger/logger")); _logger = function () { return data; }; return data; } function _npmRegistryName() { const data = _interopRequireDefault(require("../../utils/bit/npm-registry-name")); _npmRegistryName = 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 _packageJsonFile() { const data = _interopRequireDefault(require("./package-json-file")); _packageJsonFile = function () { return data; }; return data; } function _searchFilesIgnoreExt() { const data = _interopRequireDefault(require("../../utils/fs/search-files-ignore-ext")); _searchFilesIgnoreExt = function () { return data; }; return data; } function _showDoctorError() { const data = _interopRequireDefault(require("../../error/show-doctor-error")); _showDoctorError = function () { return data; }; return data; } function _packageJson() { const data = _interopRequireDefault(require("./package-json")); _packageJson = function () { return data; }; return data; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2().default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } /** * Add components as dependencies to root package.json */ function addComponentsToRoot(_x, _x2) { return _addComponentsToRoot.apply(this, arguments); } /** * Add given components with their versions to root package.json */ function _addComponentsToRoot() { _addComponentsToRoot = (0, _bluebird().coroutine)(function* (consumer, components) { const componentsToAdd = components.reduce((acc, component) => { const componentMap = consumer.bitMap.getComponent(component.id); if (componentMap.origin !== _constants().COMPONENT_ORIGINS.IMPORTED) return acc; if (!componentMap.rootDir) { throw new (_showDoctorError().default)(`rootDir is missing from an imported component ${component.id.toString()}`); } const locationAsUnixFormat = convertToValidPathForPackageManager(componentMap.rootDir); const packageName = (0, _componentIdToPackageName().default)(component.id, component.bindingPrefix, component.defaultScope); acc[packageName] = locationAsUnixFormat; return acc; }, {}); if (_ramda().default.isEmpty(componentsToAdd)) return; yield _addDependenciesPackagesIntoPackageJson(consumer.getPath(), componentsToAdd); }); return _addComponentsToRoot.apply(this, arguments); } function addComponentsWithVersionToRoot(_x3, _x4) { return _addComponentsWithVersionToRoot.apply(this, arguments); } function _addComponentsWithVersionToRoot() { _addComponentsWithVersionToRoot = (0, _bluebird().coroutine)(function* (consumer, componentsVersions) { const componentsToAdd = _ramda().default.fromPairs(componentsVersions.map(({ component, version }) => { const packageName = (0, _componentIdToPackageName().default)(component.toBitId(), component.bindingPrefix); return [packageName, version]; })); yield _addDependenciesPackagesIntoPackageJson(consumer.getPath(), componentsToAdd); }); return _addComponentsWithVersionToRoot.apply(this, arguments); } function changeDependenciesToRelativeSyntax(_x5, _x6, _x7) { return _changeDependenciesToRelativeSyntax.apply(this, arguments); } function _changeDependenciesToRelativeSyntax() { _changeDependenciesToRelativeSyntax = (0, _bluebird().coroutine)(function* (consumer, components, dependencies) { const dependenciesIds = _bitId().BitIds.fromArray(dependencies.map(dependency => dependency.id)); const updateComponentPackageJson = /*#__PURE__*/function () { var _ref = (0, _bluebird().coroutine)(function* (component) { const componentMap = consumer.bitMap.getComponent(component.id); const componentRootDir = componentMap.rootDir; if (!componentRootDir) return null; const packageJsonFile = yield _packageJsonFile().default.load(consumer.getPath(), componentRootDir); if (!packageJsonFile.fileExist) return null; // if package.json doesn't exist no need to update anything const devDeps = getPackages(component.devDependencies.getAllIds(), componentMap); const extensionDeps = getPackages(component.extensions.extensionsBitIds, componentMap); packageJsonFile.addDependencies(getPackages(component.dependencies.getAllIds(), componentMap)); packageJsonFile.addDevDependencies(_objectSpread({}, devDeps, {}, extensionDeps)); return packageJsonFile.toVinylFile(); }); return function updateComponentPackageJson(_x20) { return _ref.apply(this, arguments); }; }(); const packageJsonFiles = yield Promise.all(components.map(component => updateComponentPackageJson(component))); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! return packageJsonFiles.filter(file => file); function getPackages(deps, componentMap) { return deps.reduce((acc, dependencyId) => { const dependencyIdStr = dependencyId.toStringWithoutVersion(); if (dependenciesIds.searchWithoutVersion(dependencyId)) { const dependencyComponent = dependencies.find(d => d.id.isEqualWithoutVersion(dependencyId)); if (!dependencyComponent) { throw new Error('getDependenciesAsPackages, dependencyComponent is missing'); } const dependencyComponentMap = consumer.bitMap.getComponentIfExist(dependencyComponent.id); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! const dependencyPackageValue = getPackageDependencyValue(dependencyIdStr, componentMap, dependencyComponentMap); if (dependencyPackageValue) { const packageName = (0, _componentIdToPackageName().default)(dependencyId, dependencyComponent.bindingPrefix, dependencyComponent.defaultScope); acc[packageName] = dependencyPackageValue; } } return acc; }, {}); } }); return _changeDependenciesToRelativeSyntax.apply(this, arguments); } function preparePackageJsonToWrite(bitMap, component, bitDir, override = true, writeBitDependencies = false, // e.g. when it's a capsule excludeRegistryPrefix, packageManager) { _logger().default.debug(`package-json.preparePackageJsonToWrite. bitDir ${bitDir}. override ${override.toString()}`); const getBitDependencies = dependencies => { if (!writeBitDependencies) return {}; return dependencies.reduce((acc, depId) => { const packageDependency = getPackageDependency(bitMap, depId, component.id); const packageName = (0, _componentIdToPackageName().default)(depId, component.bindingPrefix, component.defaultScope); acc[packageName] = packageDependency; return acc; }, {}); }; const bitDependencies = getBitDependencies(component.dependencies.getAllIds()); const bitDevDependencies = getBitDependencies(component.devDependencies.getAllIds()); const bitExtensionDependencies = getBitDependencies(component.extensions.extensionsBitIds); const packageJson = _packageJsonFile().default.createFromComponent(bitDir, component, excludeRegistryPrefix); const main = (0, _path().pathNormalizeToLinux)(component.dists.calculateMainDistFile(component.mainFile)); packageJson.addOrUpdateProperty('main', main); const addDependencies = packageJsonFile => { packageJsonFile.addDependencies(bitDependencies); packageJsonFile.addDevDependencies(_objectSpread({}, bitDevDependencies, {}, bitExtensionDependencies)); }; packageJson.setPackageManager(packageManager); addDependencies(packageJson); let distPackageJson; if (!component.dists.isEmpty() && !component.dists.areDistsInsideComponentDir) { const distRootDir = component.dists.distsRootDir; if (!distRootDir) throw new Error('component.dists.distsRootDir is not defined yet'); distPackageJson = _packageJsonFile().default.createFromComponent(distRootDir, component, excludeRegistryPrefix); const distMainFile = (0, _searchFilesIgnoreExt().default)(component.dists.get(), component.mainFile, 'relative'); distPackageJson.addOrUpdateProperty('main', component.dists.getMainDistFile() || distMainFile); addDependencies(distPackageJson); } return { packageJson, distPackageJson }; } function updateAttribute(_x8, _x9, _x10, _x11) { return _updateAttribute.apply(this, arguments); } /** * Adds workspace array to package.json - only if user wants to work with yarn workspaces */ function _updateAttribute() { _updateAttribute = (0, _bluebird().coroutine)(function* (consumer, componentDir, attributeName, attributeValue) { const packageJsonFile = yield _packageJsonFile().default.load(consumer.getPath(), componentDir); if (!packageJsonFile.fileExist) return; // package.json doesn't exist, that's fine, no need to update anything packageJsonFile.addOrUpdateProperty(attributeName, attributeValue); yield packageJsonFile.write(); }); return _updateAttribute.apply(this, arguments); } function addWorkspacesToPackageJson(_x12, _x13) { return _addWorkspacesToPackageJson.apply(this, arguments); } function _addWorkspacesToPackageJson() { _addWorkspacesToPackageJson = (0, _bluebird().coroutine)(function* (consumer, customImportPath) { if (consumer.config._manageWorkspaces && consumer.config.packageManager === 'yarn' && consumer.config._useWorkspaces) { const rootDir = consumer.getPath(); const dependenciesDirectory = consumer.config._dependenciesDirectory; const { componentsDefaultDirectory } = consumer.dirStructure; yield _packageJson().default.addWorkspacesToPackageJson(rootDir, componentsDefaultDirectory + _constants().SUB_DIRECTORIES_GLOB_PATTERN, dependenciesDirectory + _constants().SUB_DIRECTORIES_GLOB_PATTERN, customImportPath ? consumer.getPathRelativeToConsumer(customImportPath) : customImportPath); } }); return _addWorkspacesToPackageJson.apply(this, arguments); } function removeComponentsFromWorkspacesAndDependencies(_x14, _x15) { return _removeComponentsFromWorkspacesAndDependencies.apply(this, arguments); } function _removeComponentsFromWorkspacesAndDependencies() { _removeComponentsFromWorkspacesAndDependencies = (0, _bluebird().coroutine)(function* (consumer, componentIds) { const rootDir = consumer.getPath(); if (consumer.config._manageWorkspaces && consumer.config.packageManager === 'yarn' && consumer.config._useWorkspaces) { const dirsToRemove = componentIds.map(id => consumer.bitMap.getComponent(id, { ignoreVersion: true }).rootDir); if (dirsToRemove && dirsToRemove.length) { const dirsToRemoveWithoutEmpty = (0, _ramdaAdjunct().compact)(dirsToRemove); yield _packageJson().default.removeComponentsFromWorkspaces(rootDir, dirsToRemoveWithoutEmpty); } } yield _packageJson().default.removeComponentsFromDependencies(rootDir, // @todo: fix. the registryPrefix should be retrieved from the component. consumer.config._bindingPrefix || (0, _npmRegistryName().default)(), componentIds.map(id => id.toStringWithoutVersion())); yield removeComponentsFromNodeModules(consumer, componentIds); }); return _removeComponentsFromWorkspacesAndDependencies.apply(this, arguments); } function _addDependenciesPackagesIntoPackageJson(_x16, _x17) { return _addDependenciesPackagesIntoPackageJson2.apply(this, arguments); } function _addDependenciesPackagesIntoPackageJson2() { _addDependenciesPackagesIntoPackageJson2 = (0, _bluebird().coroutine)(function* (dir, dependencies) { const packageJsonFile = yield _packageJsonFile().default.load(dir); packageJsonFile.addDependencies(dependencies); yield packageJsonFile.write(); }); return _addDependenciesPackagesIntoPackageJson2.apply(this, arguments); } function removeComponentsFromNodeModules(_x18, _x19) { return _removeComponentsFromNodeModules.apply(this, arguments); } function _removeComponentsFromNodeModules() { _removeComponentsFromNodeModules = (0, _bluebird().coroutine)(function* (consumer, componentIds) { _logger().default.debug(`removeComponentsFromNodeModules: ${componentIds.map(c => c.toString()).join(', ')}`); // @todo: fix. the registryPrefix should be retrieved from the component. const registryPrefix = consumer.config._bindingPrefix || (0, _npmRegistryName().default)(); // paths without scope name, don't have a symlink in node-modules const pathsToRemove = componentIds.map(id => { return id.scope ? (0, _componentNodeModulesPath().default)(registryPrefix, id) : null; }).filter(a => a); // remove null _logger().default.debug(`deleting the following paths: ${pathsToRemove.join('\n')}`); // $FlowFixMe nulls were removed in the previous filter function // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! return Promise.all(pathsToRemove.map(componentPath => _fsExtra().default.remove(consumer.toAbsolutePath(componentPath)))); }); return _removeComponentsFromNodeModules.apply(this, arguments); } function convertToValidPathForPackageManager(pathStr) { const prefix = 'file:'; // it works for both, Yarn and NPM return prefix + (pathStr.startsWith('.') ? pathStr : `./${pathStr}`); } /** * Only imported components should be saved with relative path in package.json * If a component is nested or imported as a package dependency, it should be saved with the version * If a component is authored, no need to save it as a dependency of the imported component because * the root package.json takes care of it already. */ function getPackageDependencyValue(dependencyId, parentComponentMap, dependencyComponentMap, capsuleMap) { if (capsuleMap && capsuleMap[dependencyId.toString()]) { return capsuleMap[dependencyId.toString()].wrkdir; } if (!dependencyComponentMap || dependencyComponentMap.origin === _constants().COMPONENT_ORIGINS.NESTED) { return dependencyId.version; } if (dependencyComponentMap.origin === _constants().COMPONENT_ORIGINS.AUTHORED) { return null; } const dependencyRootDir = dependencyComponentMap.rootDir; if (!dependencyRootDir) { throw new Error(`rootDir is missing from an imported component ${dependencyId.toString()}`); } if (!parentComponentMap.rootDir) throw new Error('rootDir is missing from an imported component'); const rootDirRelative = (0, _utils().pathRelativeLinux)(parentComponentMap.rootDir, dependencyRootDir); return convertToValidPathForPackageManager(rootDirRelative); } function getPackageDependency(bitMap, dependencyId, parentId) { const parentComponentMap = bitMap.getComponent(parentId); const dependencyComponentMap = bitMap.getComponentIfExist(dependencyId); return getPackageDependencyValue(dependencyId, parentComponentMap, dependencyComponentMap); }