123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
- var _os = _interopRequireDefault(require("os"));
- var _pLimit = _interopRequireDefault(require("p-limit"));
- var _jestWorker = _interopRequireDefault(require("jest-worker"));
- var _serializeJavascript = _interopRequireDefault(require("serialize-javascript"));
- var _minify = _interopRequireDefault(require("./minify"));
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
- const workerPath = require.resolve('./worker');
- class TaskRunner {
- constructor(options = {}) {
- this.taskGenerator = options.taskGenerator;
- this.files = options.files;
- this.cache = options.cache;
- this.availableNumberOfCores = TaskRunner.getAvailableNumberOfCores(options.parallel);
- }
- static getAvailableNumberOfCores(parallel) {
- // In some cases cpus() returns undefined
- // https://github.com/nodejs/node/issues/19022
- const cpus = _os.default.cpus() || {
- length: 1
- };
- return parallel === true ? cpus.length - 1 : Math.min(Number(parallel) || 0, cpus.length - 1);
- }
- async runTask(task) {
- if (this.worker) {
- return this.worker.transform((0, _serializeJavascript.default)(task));
- }
- return (0, _minify.default)(task);
- }
- async run() {
- const {
- availableNumberOfCores,
- cache,
- files,
- taskGenerator
- } = this;
- let concurrency = Infinity;
- if (availableNumberOfCores > 0) {
- // Do not create unnecessary workers when the number of files is less than the available cores, it saves memory
- const numWorkers = Math.min(files.length, availableNumberOfCores);
- concurrency = numWorkers;
- this.worker = new _jestWorker.default(workerPath, {
- numWorkers
- }); // https://github.com/facebook/jest/issues/8872#issuecomment-524822081
- const workerStdout = this.worker.getStdout();
- if (workerStdout) {
- workerStdout.on('data', chunk => {
- return process.stdout.write(chunk);
- });
- }
- const workerStderr = this.worker.getStderr();
- if (workerStderr) {
- workerStderr.on('data', chunk => {
- return process.stderr.write(chunk);
- });
- }
- }
- const limit = (0, _pLimit.default)(concurrency);
- const scheduledTasks = [];
- for (const file of files) {
- const enqueue = async task => {
- let taskResult;
- try {
- taskResult = await this.runTask(task);
- } catch (error) {
- taskResult = {
- error
- };
- }
- if (cache.isEnabled() && !taskResult.error) {
- taskResult = await cache.store(task, taskResult).then(() => taskResult, () => taskResult);
- }
- task.callback(taskResult);
- return taskResult;
- };
- scheduledTasks.push(limit(() => {
- const task = taskGenerator(file).next().value;
- if (!task) {
- // Something went wrong, for example the `cacheKeys` option throw an error
- return Promise.resolve();
- }
- if (cache.isEnabled()) {
- return cache.get(task).then(taskResult => task.callback(taskResult), () => enqueue(task));
- }
- return enqueue(task);
- }));
- }
- return Promise.all(scheduledTasks);
- }
- async exit() {
- if (!this.worker) {
- return Promise.resolve();
- }
- return this.worker.end();
- }
- }
- exports.default = TaskRunner;
|