kizu
Version:
An easy-to-use, fast, and defensive Typescript/Javascript test runner designed to help you to write simple, readable, and maintainable tests.
70 lines • 2.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.workerPool = workerPool;
const os_1 = require("os");
const child_process_1 = require("child_process");
const toResult_1 = require("./lib/toResult");
const path_1 = require("path");
const numCores = (0, os_1.cpus)().length; // will be the size of our worker pool
let numWorkers = 0;
let currentSpecFileIndex = 0;
function getTypeScriptRuntime() {
try {
// Try to use tsx first (much faster)
require.resolve('tsx/cjs');
return ['-r', 'tsx/cjs'];
}
catch (error) {
// tsx not found
throw new Error('tsx not found. You can install it with `npm install --save-dev tsx`');
}
}
function createWorker(file) {
const isTypeScript = (0, path_1.extname)(file) === '.ts';
let execArgv = [];
if (isTypeScript) {
execArgv = getTypeScriptRuntime();
}
const [err, worker] = (0, toResult_1.toResult)(() => (0, child_process_1.fork)(file, [], { execArgv }));
if (err) {
throw new Error(`failed to create worker for ${file}`);
}
return worker;
}
function setupWorker(worker, file, addTestResults, next, reject) {
worker.on('close', () => {
numWorkers--;
next();
});
worker.on('error', (error) => {
numWorkers--;
reject(new Error(`Worker process error for ${file}: ${error.message}`));
});
worker.on('message', (msg) => addTestResults(file, msg));
}
function workerPool(specFiles, addTestResults) {
return new Promise((resolve, reject) => {
function next() {
if (currentSpecFileIndex >= specFiles.length && numWorkers === 0)
resolve();
if (currentSpecFileIndex >= specFiles.length)
return;
if (numWorkers >= numCores)
return;
const file = specFiles[currentSpecFileIndex];
let worker;
try {
worker = createWorker(file);
}
catch (error) {
return reject(error);
}
numWorkers++;
currentSpecFileIndex++;
setupWorker(worker, file, addTestResults, next, reject);
next();
}
next();
});
}
//# sourceMappingURL=workerPool.js.map