eslint-svelte3-preprocess
Version:
svelte preprocess for eslint-plugin-svelte3
66 lines (65 loc) • 2.25 kB
JavaScript
import debug from "debug";
import tty from "tty";
import { SHARE_ENV, Worker } from "worker_threads";
import workerFile from "./worker";
const debugMain = debug("eslint:svelte-preprocess:main");
function eslintSveltePreprocess(svelteConfigPath) {
if (tty.isatty(process.stderr.fd)) {
process.env.DEBUG_COLORS = "true";
}
const isRunningWithinCli = !process.argv.includes("--node-ipc");
const isDoneBuffer = new SharedArrayBuffer(4);
const isDoneView = new Int32Array(isDoneBuffer);
const dataBuffer = new SharedArrayBuffer(50 * 1024 * 1024);
const dataView = new Uint8Array(dataBuffer);
const dataLengthBuffer = new SharedArrayBuffer(4);
const dataLengthView = new Uint32Array(dataLengthBuffer);
const worker = new Worker(workerFile.path, {
env: SHARE_ENV,
workerData: {
isDoneView,
dataView,
dataLengthView,
svelteConfigPath,
},
});
let lastResult;
return (src, filename) => {
debugMain(`Asking worker to preprocess ${filename}`);
try {
worker.postMessage({
src,
filename,
});
debugMain("Locking thread to wait for worker");
const waitResult = Atomics.wait(isDoneView, 0, 0, 5000);
Atomics.store(isDoneView, 0, 0);
debugMain(`Unlocked: ${waitResult}`);
}
catch (error) {
debugMain(`error: ${error}`);
}
try {
const textDecoder = new TextDecoder();
const decoded = textDecoder.decode(dataView.subarray(0, dataLengthView[0]));
const result = JSON.parse(decoded);
debugMain("Finished");
lastResult = result;
return result;
}
catch {
debugMain("No result obtained; finished with last result");
return lastResult;
}
finally {
if (isRunningWithinCli) {
setTimeout(async () => {
debugMain("Terminating worker");
await worker.terminate();
});
}
}
};
}
module.exports = eslintSveltePreprocess;
export default module.exports;