UNPKG

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
"use strict"; 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