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
318 lines (241 loc) • 7.79 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.IdsAndFlows = exports.Flows = 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 _events() {
const data = require("events");
_events = function () {
return data;
};
return data;
}
function _network() {
const data = require("./network");
_network = function () {
return data;
};
return data;
}
function _component() {
const data = require("../component");
_component = function () {
return data;
};
return data;
}
function _flow() {
const data = require("./flow/flow");
_flow = function () {
return data;
};
return data;
}
function _bitId() {
const data = require("../../bit-id");
_bitId = function () {
return data;
};
return data;
}
function _network2() {
const data = require("./network/network");
_network2 = function () {
return data;
};
return data;
}
function _cache() {
const data = require("./cache");
_cache = function () {
return data;
};
return data;
}
function _logger() {
const data = _interopRequireDefault(require("../../logger/logger"));
_logger = function () {
return data;
};
return data;
}
/* eslint-disable @typescript-eslint/no-unused-vars */
/* eslint-disable max-classes-per-file */
class Flows {
constructor(workspace) {
this.workspace = workspace;
(0, _defineProperty2().default)(this, "emitter", new (_events().EventEmitter)());
}
getIds(ids) {
return ids.map(id => new (_component().ComponentID)(this.workspace.consumer.getParsedId(id)));
}
/**
* Creates a custom network from workspace.
*
* @param seeders - array of components to build.
* @param getFlow - function which provide component flow.
* @param postFlow - postFlow callback.
*/
createNetwork(seeders, getFlow, postFlow = () => Promise.resolve()) {
const network = new (_network().Network)(this.workspace, seeders, getFlow, _network2().getWorkspaceGraph, postFlow);
network.onWorkspaceLoaded((...args) => {
this.emitter.emit('workspaceLoaded', args);
});
return network;
}
/**
* Creates network which runs named flow according to project configuration.
*
* @param seeders array of components to build
* @param name flow name
* @param options
*/
createNetworkByFlowName(seeders, name = 'build', options) {
var _this = this;
const getFlow = /*#__PURE__*/function () {
var _ref = (0, _bluebird().coroutine)(function* (capsule) {
var _component$config$ext;
const seed = capsule.component.id;
const id = seed instanceof _bitId().BitId ? seed : seed._legacy;
const component = yield _this.workspace.get(id);
if (!component) {
return new (_flow().Flow)([]);
}
const isCached = yield (0, _cache().getExecutionCache)().compareToCache(capsule, name);
const flowsConfig = (_component$config$ext = component.config.extensions.findCoreExtension('flows')) === null || _component$config$ext === void 0 ? void 0 : _component$config$ext.config;
const tasks = flowsConfig && flowsConfig.tasks ? flowsConfig.tasks[name] : [];
const flow = isCached && options.caching ? new (_flow().Flow)([]) : new (_flow().Flow)(tasks);
return flow;
});
return function getFlow(_x) {
return _ref.apply(this, arguments);
};
}();
const postFlow = /*#__PURE__*/function () {
var _ref2 = (0, _bluebird().coroutine)(function* (capsule) {
const cache = (0, _cache().getExecutionCache)();
return cache.saveHashValue(capsule, name);
});
return function postFlow(_x2) {
return _ref2.apply(this, arguments);
};
}();
return this.createNetwork(seeders, getFlow, postFlow);
}
/**
* Executes named flow on network and returns a promise with network:result message.
*
* @param seeders array of components to build
* @param name flow name
* @param options
* @param network optional custom network
*/
runToPromise(seeders, name = 'build', options, network) {
var _this2 = this;
return (0, _bluebird().coroutine)(function* () {
_logger().default.debug(`flowsExt, runToPromise is running ${name} on ${seeders.map(s => s.toString()).join(', ')}`);
const resultStream = yield _this2.run(seeders, name, options, network);
_logger().default.debug(`flowsExt, runToPromise got resultStream`);
return new Promise((resolve, reject) => {
resultStream.subscribe({
next(data) {
if (data.type === 'network:result') {
_logger().default.debug(`flowsExt, runToPromise going to resolve the promise.`);
resolve(data);
} else {
_logger().default.debug(`flowsExt, runToPromise data.type is ${data.type}. the promise is not resolved nor rejected`);
}
},
error(err) {
_logger().default.debug(`flowsExt, runToPromise going to reject the promise.`);
reject(err);
},
complete() {
_logger().default.debug(`flowsExt, runToPromise in complete()`);
}
});
});
})();
}
/**
* Executes named flow on network and returns an execution stream.
*
* @param seeders array of components to build
* @param name flow name
* @param options
* @param network optional custom network
*/
// @todo: @qballer please add return type
run(seeders, name = 'build', options, network) {
var _this3 = this;
return (0, _bluebird().coroutine)(function* () {
const opts = Object.assign({
caching: true,
concurrency: 4,
traverse: 'both'
}, options);
network = network || _this3.createNetworkByFlowName(seeders, name, opts);
const resultStream = yield network.execute(opts);
return resultStream;
})();
}
/**
* runs custom flow on network.
*
* @param flowsWithIds
* @param options
*/
runMultiple(flowsWithIds, options) {
var _this4 = this;
return (0, _bluebird().coroutine)(function* () {
const getFlow = capsule => {
const id = capsule.component.id; // @ts-ignore for some reason the capsule.component here is ConsumerComponent
const value = flowsWithIds.getFlows(id);
return Promise.resolve(new (_flow().Flow)(value || []));
};
const ids = flowsWithIds.map(withID => new (_component().ComponentID)(withID.id));
const network = _this4.createNetwork(ids, getFlow);
return _this4.runToPromise(ids, '', options || {}, network);
})();
}
onWorkspaceLoaded(cb) {
this.emitter.on('workspaceLoaded', cb);
}
}
exports.Flows = Flows;
class IdsAndFlows extends Array {
getFlows(id) {
const found = this.find(item => item.id.isEqual(id));
return found ? found.value : null;
}
getFlowsIgnoreVersion(id) {
const found = this.find(item => item.id.isEqualWithoutVersion(id));
return found ? found.value : null;
}
getFlowsIgnoreScopeAndVersion(id) {
const found = this.find(item => item.id.isEqualWithoutScopeAndVersion(id));
return found ? found.value : null;
}
toString() {
return this.map(({
id,
value
}) => `id: ${id}, task: ${value.join(', ')}`).join('; ');
}
}
exports.IdsAndFlows = IdsAndFlows;
;