tsds-web-test-runner
Version:
Development stack for TypeScript libraries
66 lines (65 loc) • 2.52 kB
JavaScript
import spawn from 'cross-spawn-cb';
import getopts from 'getopts-compat';
import { installSync, removeSync } from 'install-optional';
import { link, unlink } from 'link-unlink';
import debounce from 'lodash.debounce';
import path from 'path';
import Queue from 'queue-cb';
import resolveBin from 'resolve-bin-sync';
import { installPath, wrapWorker } from 'tsds-lib';
import url from 'url';
const major = +process.versions.node.split('.')[0];
const version = major > 14 ? 'local' : 'stable';
const __dirname = path.dirname(typeof __filename === 'undefined' ? url.fileURLToPath(import.meta.url) : __filename);
const dist = path.join(__dirname, '..');
const workerWrapper = wrapWorker(path.join(dist, 'cjs', 'command.js'));
const config = path.join(dist, 'esm', 'wtr.config.js');
const installSyncRollup = debounce(installSync, 300, {
leading: true,
trailing: false
});
const installSynESBuild = debounce(installSync, 300, {
leading: true,
trailing: false
});
function worker(args, options, callback) {
const cwd = options.cwd || process.cwd();
link(cwd, installPath(options), (err, restore)=>{
if (err) return callback(err);
try {
installSyncRollup('rollup', `${process.platform}-${process.arch}`, {
cwd
});
removeSync('esbuild', '@esbuild/', {
cwd
});
installSynESBuild('esbuild', `${process.platform}-${process.arch}`, {
cwd
});
const wtr = resolveBin('@web/test-runner', 'wtr');
const { _, ...opts } = getopts(args, {
stopEarly: true,
alias: {
config: 'c'
}
});
const spawnArgs = [];
if (!opts.config) Array.prototype.push.apply(spawnArgs, [
'--config',
config
]);
Array.prototype.push.apply(spawnArgs, args);
if (_.length === 0) Array.prototype.push.apply(spawnArgs, [
'test/**/*.test.{ts,tsx,jsx,mjs}'
]);
const queue = new Queue(1);
queue.defer(spawn.bind(null, wtr, spawnArgs, options));
queue.await((err)=>unlink(restore, callback.bind(null, err)));
} catch (err) {
callback(err);
}
});
}
export default function testBrowser(args, options, callback) {
version !== 'local' ? workerWrapper('stable', args, options, callback) : worker(args, options, callback);
}