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
472 lines (357 loc) • 14.9 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.IsolatorExtension = void 0;
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 _path() {
const data = _interopRequireDefault(require("path"));
_path = function () {
return data;
};
return data;
}
function _objectHash() {
const data = _interopRequireDefault(require("object-hash"));
_objectHash = function () {
return data;
};
return data;
}
function _fsExtra() {
const data = _interopRequireDefault(require("fs-extra"));
_fsExtra = function () {
return data;
};
return data;
}
function _ramda() {
const data = require("ramda");
_ramda = function () {
return data;
};
return data;
}
function _constants() {
const data = require("../../constants");
_constants = function () {
return data;
};
return data;
}
function _component() {
const data = require("../component");
_component = function () {
return data;
};
return data;
}
function _dependencyResolver() {
const data = require("../dependency-resolver");
_dependencyResolver = function () {
return data;
};
return data;
}
function _capsule() {
const data = require("./capsule");
_capsule = function () {
return data;
};
return data;
}
function _writeComponentsToCapsules() {
const data = _interopRequireDefault(require("./write-components-to-capsules"));
_writeComponentsToCapsules = function () {
return data;
};
return data;
}
function _capsuleList() {
const data = _interopRequireDefault(require("./capsule-list"));
_capsuleList = function () {
return data;
};
return data;
}
function _capsuleList2() {
const data = require("./capsule-list.cmd");
_capsuleList2 = function () {
return data;
};
return data;
}
function _capsuleCreate() {
const data = require("./capsule-create.cmd");
_capsuleCreate = function () {
return data;
};
return data;
}
function _bitId() {
const data = require("../../bit-id");
_bitId = function () {
return data;
};
return data;
}
function _componentsGraph() {
const data = require("../../scope/graph/components-graph");
_componentsGraph = function () {
return data;
};
return data;
}
function _packageJsonFile() {
const data = _interopRequireDefault(require("../../consumer/component/package-json-file"));
_packageJsonFile = 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 _symlinkDependenciesToCapsules() {
const data = require("./symlink-dependencies-to-capsules");
_symlinkDependenciesToCapsules = function () {
return data;
};
return data;
}
function _logger() {
const data = _interopRequireDefault(require("../../logger/logger"));
_logger = function () {
return data;
};
return data;
}
function _cli() {
const data = require("../cli");
_cli = 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; }
const CAPSULES_BASE_DIR = _path().default.join(_constants().CACHE_ROOT, 'capsules'); // TODO: move elsewhere
function createCapsulesFromComponents(_x, _x2, _x3) {
return _createCapsulesFromComponents.apply(this, arguments);
}
function _createCapsulesFromComponents() {
_createCapsulesFromComponents = (0, _bluebird().coroutine)(function* (components, baseDir, orchOptions) {
const capsules = yield Promise.all((0, _ramda().map)(component => {
return _capsule().Capsule.createFromComponent(component, baseDir, orchOptions);
}, components));
return capsules;
});
return _createCapsulesFromComponents.apply(this, arguments);
}
function findSuccessorsInGraph(graph, seeders) {
const dependenciesFromAllIds = (0, _ramda().flatten)(seeders.map(bitId => graph.getSuccessorsByEdgeTypeRecursively(bitId)));
const components = (0, _ramda().filter)(val => val, (0, _ramda().uniq)((0, _ramda().concat)(dependenciesFromAllIds, seeders)).map(id => graph.node(id)));
return components;
}
class IsolatorExtension {
static provide([dependencyResolver, cli]) {
return (0, _bluebird().coroutine)(function* () {
const isolator = new IsolatorExtension(dependencyResolver);
const capsuleListCmd = new (_capsuleList2().CapsuleListCmd)(isolator);
const capsuleCreateCmd = new (_capsuleCreate().CapsuleCreateCmd)(isolator);
cli.register(capsuleListCmd);
cli.register(capsuleCreateCmd);
return isolator;
})();
}
constructor(dependencyResolver) {
this.dependencyResolver = dependencyResolver;
}
createNetworkFromConsumer(seeders, consumer, opts) {
var _this = this;
return (0, _bluebird().coroutine)(function* () {
_logger().default.debug(`isolatorExt, createNetworkFromConsumer ${seeders.join(', ')}`);
const seedersIds = seeders.map(seeder => consumer.getParsedId(seeder));
const graph = yield (0, _componentsGraph().buildOneGraphForComponents)(seedersIds, consumer);
const baseDir = _path().default.join(CAPSULES_BASE_DIR, (0, _objectHash().default)(consumer.projectPath)); // TODO: move this logic elsewhere
return _this.createNetwork(seedersIds, graph, baseDir, opts);
})();
}
createNetworkFromScope(seeders, scope, opts) {
var _this2 = this;
return (0, _bluebird().coroutine)(function* () {
_logger().default.debug(`isolatorExt, createNetworkFromScope ${seeders.join(', ')}`);
const seedersIds = yield Promise.all(seeders.map(seeder => scope.getParsedId(seeder)));
const graph = yield (0, _componentsGraph().buildOneGraphForComponentsUsingScope)(seedersIds, scope);
const baseDir = _path().default.join(CAPSULES_BASE_DIR, (0, _objectHash().default)(scope.path)); // TODO: move this logic elsewhere
return _this2.createNetwork(seedersIds, graph, baseDir, opts);
})();
}
getBitIdsIncludeVersionsFromGraph(seedersIds, graph) {
const components = graph.nodes().map(n => graph.node(n));
return seedersIds.map(seederId => {
const component = components.find(c => c.id.isEqual(seederId) || c.id.isEqualWithoutVersion(seederId));
if (!component) throw new Error(`unable to find ${seederId.toString()} in the graph`);
return component.id;
});
}
createNetwork(seedersIds, graph, baseDir, opts) {
var _this3 = this;
return (0, _bluebird().coroutine)(function* () {
const seederIds = _this3.getBitIdsIncludeVersionsFromGraph(seedersIds, graph);
const seeders = seederIds.map(s => s.toString());
const config = Object.assign({}, {
installPackages: true,
packageManager: undefined
}, opts);
const components = findSuccessorsInGraph(graph, seeders);
const capsules = yield createCapsulesFromComponents(components, baseDir, config);
const capsuleList = new (_capsuleList().default)(...capsules.map(c => {
const id = c.component.id instanceof _bitId().BitId ? new (_component().ComponentID)(c.component.id) : c.component.id;
return {
id,
capsule: c
};
}));
const capsulesWithPackagesData = yield getCapsulesPreviousPackageJson(capsules);
yield (0, _writeComponentsToCapsules().default)(components, graph, capsules, capsuleList, _this3.dependencyResolver.packageManagerName);
updateWithCurrentPackageJsonData(capsulesWithPackagesData, capsules);
if (config.installPackages) {
const capsulesToInstall = capsulesWithPackagesData.filter(capsuleWithPackageData => {
const packageJsonHasChanged = wereDependenciesInPackageJsonChanged(capsuleWithPackageData); // @todo: when a component is tagged, it changes all package-json of its dependents, but it
// should not trigger any "npm install" because they dependencies are symlinked by us
return packageJsonHasChanged;
}).map(capsuleWithPackageData => capsuleWithPackageData.capsule);
yield _this3.dependencyResolver.capsulesInstall(capsulesToInstall, {
packageManager: config.packageManager
});
yield (0, _symlinkDependenciesToCapsules().symlinkDependenciesToCapsules)(capsulesToInstall, capsuleList);
} // rewrite the package-json with the component dependencies in it. the original package.json
// that was written before, didn't have these dependencies in order for the package-manager to
// be able to install them without crushing when the versions don't exist yet
capsulesWithPackagesData.forEach(capsuleWithPackageData => {
capsuleWithPackageData.capsule.fs.writeFileSync(_constants().PACKAGE_JSON, JSON.stringify(capsuleWithPackageData.currentPackageJson, null, 2));
});
return {
capsules: capsuleList,
components: graph
};
})();
}
list(consumer) {
return (0, _bluebird().coroutine)(function* () {
const workspacePath = consumer.getPath();
try {
const workspaceCapsuleFolder = _path().default.join(CAPSULES_BASE_DIR, (0, _objectHash().default)(workspacePath));
const capsules = yield _fsExtra().default.readdir(workspaceCapsuleFolder);
const capsuleFullPaths = capsules.map(c => _path().default.join(workspaceCapsuleFolder, c));
return {
workspace: workspacePath,
capsules: capsuleFullPaths
};
} catch (e) {
if (e.code === 'ENOENT') {
return {
workspace: workspacePath,
capsules: []
};
}
throw e;
}
})();
}
}
exports.IsolatorExtension = IsolatorExtension;
(0, _defineProperty2().default)(IsolatorExtension, "id", '@teambit/isolator');
(0, _defineProperty2().default)(IsolatorExtension, "dependencies", [_dependencyResolver().DependencyResolverExtension, _cli().CLIExtension]);
(0, _defineProperty2().default)(IsolatorExtension, "defaultConfig", {});
function wereDependenciesInPackageJsonChanged(capsuleWithPackageData) {
const {
previousPackageJson,
currentPackageJson
} = capsuleWithPackageData;
if (!previousPackageJson) return true; // @ts-ignore at this point, currentPackageJson is set
return _constants().DEPENDENCIES_FIELDS.some(field => !(0, _ramda().equals)(previousPackageJson[field], currentPackageJson[field]));
}
function getCapsulesPreviousPackageJson(_x4) {
return _getCapsulesPreviousPackageJson.apply(this, arguments);
}
function _getCapsulesPreviousPackageJson() {
_getCapsulesPreviousPackageJson = (0, _bluebird().coroutine)(function* (capsules) {
return Promise.all(capsules.map( /*#__PURE__*/function () {
var _ref = (0, _bluebird().coroutine)(function* (capsule) {
const packageJsonPath = _path().default.join(capsule.wrkDir, 'package.json');
let previousPackageJson = null;
try {
const previousPackageJsonRaw = yield capsule.fs.promises.readFile(packageJsonPath, {
encoding: 'utf8'
});
previousPackageJson = JSON.parse(previousPackageJsonRaw);
} catch (e) {// package-json doesn't exist in the capsule, that's fine, it'll be considered as a cache miss
}
return {
capsule,
previousPackageJson
};
});
return function (_x5) {
return _ref.apply(this, arguments);
};
}()));
});
return _getCapsulesPreviousPackageJson.apply(this, arguments);
}
function updateWithCurrentPackageJsonData(capsulesWithPackagesData, capsules) {
capsules.forEach(capsule => {
// @ts-ignore
const component = capsule.component;
const packageJson = getCurrentPackageJson(component, capsule);
const found = capsulesWithPackagesData.find(c => c.capsule.component.id.isEqual(capsule.component.id));
if (!found) throw new Error(`updateWithCurrentPackageJsonData unable to find ${capsule.component.id}`);
found.currentPackageJson = packageJson.packageJsonObject;
});
}
function getCurrentPackageJson(component, capsule) {
const newVersion = '0.0.1-new';
const getBitDependencies = dependencies => {
return dependencies.reduce((acc, depId) => {
const packageDependency = depId.hasVersion() ? depId.version : newVersion;
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); // unfortunately, component.packageJsonFile is not available here.
// the reason is that `writeComponentsToCapsules` clones the component before writing them
// also, don't use `PackageJsonFile.createFromComponent`, as it looses the intermediate changes
// such as postInstall scripts for custom-module-resolution.
const packageJson = _packageJsonFile().default.loadFromCapsuleSync(capsule);
const addDependencies = packageJsonFile => {
packageJsonFile.addDependencies(bitDependencies);
packageJsonFile.addDevDependencies(_objectSpread({}, bitDevDependencies, {}, bitExtensionDependencies));
};
addDependencies(packageJson);
packageJson.addOrUpdateProperty('version', component.id.hasVersion() ? component.id.version : newVersion);
packageJson.removeDependency('bit-bin');
return packageJson;
}
;