eslint-remote-tester
Version:
Tool for running ESLint on multiple repositories
70 lines (69 loc) • 2.53 kB
JavaScript
import { Worker, isMainThread } from 'node:worker_threads';
import { fileURLToPath } from 'node:url';
import workerTask, { createErrorMessage, } from './worker-task.js';
import { resolveConfigurationLocation } from '../config/index.js';
if (!isMainThread) {
workerTask();
}
/**
* Start scanning of given repository in a separate thread
* - Keeps progress-logger up-to-date via onMessage
*/
function scanRepository(repository, onMessage, workerCallback) {
return new Promise(resolve => {
// Notify about worker starting. It can take a while to get worker starting up
// Prevents showing blank screen between worker start and repository reading
onMessage({ type: 'START' });
const worker = new Worker(fileURLToPath(import.meta.url), {
workerData: {
repository,
configurationLocation: resolveConfigurationLocation(),
},
env: {
...process.env,
// Prevent git from prompting password. Instead just fail repository cloning.
GIT_TERMINAL_PROMPT: '0',
},
});
const cleanup = workerCallback(worker);
worker.on('message', (message) => {
switch (message.type) {
case 'LINT_END':
return resolve();
default:
return onMessage(message);
}
});
worker.on('error', (error) => {
const messages = [
createErrorMessage({
path: repository,
ruleId: '',
message: [error.code, error.message]
.filter(Boolean)
.join(' '),
}),
];
onMessage({ type: 'WORKER_ERROR', payload: error.code });
onMessage({ type: 'ON_RESULT', payload: { messages } });
resolve();
});
worker.on('exit', code => {
cleanup();
// 0 = success, 1 = termination
if (code === 0 || code === 1) {
return resolve();
}
const messages = [
createErrorMessage({
message: `Worker exited with code ${code}`,
path: repository,
ruleId: '',
}),
];
onMessage({ type: 'ON_RESULT', payload: { messages } });
resolve();
});
});
}
export default { scanRepository };