next-yak
Version:
next-yak is a CSS-in-JS solution tailored for Next.js that seamlessly combines the expressive power of styled-components syntax with efficient build-time extraction of CSS using Next.js's built-in CSS configuration
59 lines (58 loc) • 1.58 kB
JavaScript
import { register } from "node:module";
import { MessageChannel, parentPort, workerData } from "node:worker_threads";
import { pathToFileURL } from "node:url";
//#region isolated-source-eval/worker.ts
if (!parentPort) throw new Error("This file must be run as a worker thread");
const loaderDataUrl = workerData.loaderDataUrl;
const { port1, port2 } = new MessageChannel();
register(loaderDataUrl, {
parentURL: import.meta.url,
data: { port: port2 },
transferList: [port2]
});
function requestDeps() {
return new Promise((resolve) => {
port1.once("message", (deps) => {
resolve(deps);
});
port1.postMessage("getDeps");
});
}
parentPort.on("message", async (msg) => {
if (msg.type !== "evaluate") return;
try {
const ns = await import(pathToFileURL(msg.absolutePath).href);
const deps = await requestDeps();
if (!deps.includes(msg.absolutePath)) deps.unshift(msg.absolutePath);
const value = {};
for (const key of Object.keys(ns)) value[key] = ns[key];
parentPort.postMessage({
type: "result",
id: msg.id,
ok: true,
value,
dependencies: deps
});
} catch (err) {
const error = err instanceof Error ? {
message: err.message,
stack: err.stack ?? ""
} : {
message: String(err),
stack: ""
};
const deps = await requestDeps();
if (!deps.includes(msg.absolutePath)) deps.unshift(msg.absolutePath);
parentPort.postMessage({
type: "result",
id: msg.id,
ok: false,
error,
dependencies: deps
});
}
});
parentPort.postMessage({ type: "ready" });
//#endregion
export {};
//# sourceMappingURL=worker.js.map