vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
99 lines (97 loc) • 14 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
const CSS_EXT = /\.(css|scss|sass|less|styl|stylus|pcss|postcss)(\?|$)/;
async function collectRunnerCss(server, pagePath, projectRoot, logger, verbose = false) {
const env = server.environments?.["server"];
if (!env) {
if (verbose) logger.warn(`[collectRunnerCss] no server environment`);
return [];
}
const moduleGraph = env.moduleGraph;
const candidates = [
pagePath,
pagePath.startsWith("/") ? pagePath : `/${pagePath}`,
pagePath.startsWith(projectRoot) ? pagePath : `${projectRoot}/${pagePath}`
];
let pageModule;
for (const url of candidates) {
pageModule = await moduleGraph.getModuleByUrl(url);
if (pageModule) break;
}
if (!pageModule) {
const idMap = moduleGraph.idToModuleMap;
if (idMap) {
for (const [id, node] of idMap.entries()) {
if (id.endsWith(pagePath) || id.endsWith(`/${pagePath}`)) {
pageModule = node;
break;
}
}
}
}
if (!pageModule) {
if (verbose) {
logger.warn(
`[collectRunnerCss] no module for pagePath: ${pagePath} (tried: ${candidates.join(", ")}; graph size: ${moduleGraph.idToModuleMap?.size ?? "?"})`
);
}
return [];
}
if (verbose) {
logger.info(`[collectRunnerCss] resolved page module: ${pageModule.id}`);
}
const seen = /* @__PURE__ */ new Set();
const out = [];
const walk = async (mod) => {
if (!mod?.id || seen.has(mod.id)) return;
seen.add(mod.id);
if (CSS_EXT.test(mod.id)) {
try {
const transformed = await env.transformRequest(`${mod.id}?inline`);
if (transformed?.code) {
const code = transformed.code;
const exportMatch = code.match(/__vite_ssr_export_default__\s*=\s*("(?:\\.|[^"\\])*")/) ?? code.match(/export\s+default\s+("(?:\\.|[^"\\])*")/) ?? code.match(/__vite__cssModules\.default\s*=\s*("(?:\\.|[^"\\])*")/);
if (exportMatch) {
const raw = JSON.parse(exportMatch[1]);
if (typeof raw === "string" && raw.length > 0) {
out.push({ id: mod.id, code: raw });
} else if (verbose) {
logger.warn(`[collectRunnerCss] inline default empty for ${mod.id}`);
}
} else if (verbose) {
logger.warn(
`[collectRunnerCss] could not find inline export in transform for ${mod.id} (codeLen=${code.length})`
);
}
} else if (verbose) {
logger.warn(`[collectRunnerCss] no transformed code for ${mod.id}?inline`);
}
} catch (err) {
if (verbose) {
logger.warn(
`[collectRunnerCss] failed to inline ${mod.id}: ${String(err)}`
);
}
}
}
if (mod.importedModules) {
for (const imported of mod.importedModules) {
if (imported && typeof imported === "object" && "id" in imported) {
await walk(imported);
}
}
}
};
await walk(pageModule);
if (verbose) {
logger.info(
`[collectRunnerCss] collected ${out.length} CSS file(s) for ${pagePath}`
);
}
return out;
}
export { CSS_EXT, collectRunnerCss };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdFJ1bm5lckNzcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2Rldi1zZXJ2ZXIvY29sbGVjdFJ1bm5lckNzcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEVudmlyb25tZW50TW9kdWxlR3JhcGgsXG4gIEVudmlyb25tZW50TW9kdWxlTm9kZSxcbiAgTW9kdWxlTm9kZSxcbiAgVml0ZURldlNlcnZlcixcbiAgTG9nZ2VyLFxufSBmcm9tIFwidml0ZVwiO1xuXG5leHBvcnQgY29uc3QgQ1NTX0VYVCA9IC9cXC4oY3NzfHNjc3N8c2Fzc3xsZXNzfHN0eWx8c3R5bHVzfHBjc3N8cG9zdGNzcykoXFw/fCQpLztcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGVkQ3NzID0geyBpZDogc3RyaW5nOyBjb2RlOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBXYWxrcyB0aGUgVml0ZSBzZXJ2ZXIgZW52aXJvbm1lbnQncyBtb2R1bGUgZ3JhcGggZnJvbSBgcGFnZVBhdGhgIGFuZFxuICogcmV0dXJucyB0aGUgcmF3IENTUyBjb2RlIG9mIGV2ZXJ5IENTUyBtb2R1bGUgcmVhY2hhYmxlIGZyb20gaXQuXG4gKlxuICogUmVwbGFjZXMgdGhlIHJzYy13b3JrZXIncyBOb2RlIEVTTSBDU1MgbG9hZGVyIGZvciBydW5uZXIgbW9kZTogdGhlXG4gKiBydW5uZXIgYnlwYXNzZXMgTm9kZSdzIGltcG9ydCByZXNvbHZlciwgc28gdGhlIGxvYWRlciBuZXZlciBmaXJlcy5cbiAqIFRoZSBtYWluIHRocmVhZCBoYXMgdmlzaWJpbGl0eSBpbnRvIHRoZSBzYW1lIG1vZHVsZSBncmFwaCBhbmQgY2FuXG4gKiBjb2xsZWN0IENTUyBkZXRlcm1pbmlzdGljYWxseSBvbmNlIGBydW5uZXIuaW1wb3J0KHBhZ2VQYXRoKWAgaGFzXG4gKiBjYXVzZWQgVml0ZSB0byB0cmFuc2Zvcm0gdGhlIHBhZ2UgYW5kIGl0cyBkZXBzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29sbGVjdFJ1bm5lckNzcyhcbiAgc2VydmVyOiBWaXRlRGV2U2VydmVyLFxuICBwYWdlUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBsb2dnZXI6IExvZ2dlcixcbiAgdmVyYm9zZSA9IGZhbHNlXG4pOiBQcm9taXNlPENvbGxlY3RlZENzc1tdPiB7XG4gIGNvbnN0IGVudiA9IHNlcnZlci5lbnZpcm9ubWVudHM/LltcInNlcnZlclwiXTtcbiAgaWYgKCFlbnYpIHtcbiAgICBpZiAodmVyYm9zZSkgbG9nZ2VyLndhcm4oYFtjb2xsZWN0UnVubmVyQ3NzXSBubyBzZXJ2ZXIgZW52aXJvbm1lbnRgKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBtb2R1bGVHcmFwaDogRW52aXJvbm1lbnRNb2R1bGVHcmFwaCA9IGVudi5tb2R1bGVHcmFwaDtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICBwYWdlUGF0aCxcbiAgICBwYWdlUGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhZ2VQYXRoIDogYC8ke3BhZ2VQYXRofWAsXG4gICAgcGFnZVBhdGguc3RhcnRzV2l0aChwcm9qZWN0Um9vdCkgPyBwYWdlUGF0aCA6IGAke3Byb2plY3RSb290fS8ke3BhZ2VQYXRofWAsXG4gIF07XG5cbiAgbGV0IHBhZ2VNb2R1bGU6IEVudmlyb25tZW50TW9kdWxlTm9kZSB8IE1vZHVsZU5vZGUgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgdXJsIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBwYWdlTW9kdWxlID0gYXdhaXQgbW9kdWxlR3JhcGguZ2V0TW9kdWxlQnlVcmwodXJsKTtcbiAgICBpZiAocGFnZU1vZHVsZSkgYnJlYWs7XG4gIH1cblxuICAvLyBGYWxsYmFjazogc2NhbiBpZFRvTW9kdWxlTWFwIGZvciBhbiBlbnRyeSB3aG9zZSBpZCBlbmRzV2l0aCB0aGUgcGFnZVBhdGguXG4gIC8vIFZpdGUga2V5cyBzZXJ2ZXItZW52IG1vZHVsZXMgYnkgZnVsbCBhYnNvbHV0ZSBwYXRoIHdpdGggb3B0aW9uYWwgcXVlcnkuXG4gIGlmICghcGFnZU1vZHVsZSkge1xuICAgIGNvbnN0IGlkTWFwID0gKG1vZHVsZUdyYXBoIGFzIGFueSkuaWRUb01vZHVsZU1hcCBhc1xuICAgICAgfCBNYXA8c3RyaW5nLCBFbnZpcm9ubWVudE1vZHVsZU5vZGU+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaWRNYXApIHtcbiAgICAgIGZvciAoY29uc3QgW2lkLCBub2RlXSBvZiBpZE1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKGlkLmVuZHNXaXRoKHBhZ2VQYXRoKSB8fCBpZC5lbmRzV2l0aChgLyR7cGFnZVBhdGh9YCkpIHtcbiAgICAgICAgICBwYWdlTW9kdWxlID0gbm9kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghcGFnZU1vZHVsZSkge1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFtjb2xsZWN0UnVubmVyQ3NzXSBubyBtb2R1bGUgZm9yIHBhZ2VQYXRoOiAke3BhZ2VQYXRofSAodHJpZWQ6ICR7Y2FuZGlkYXRlcy5qb2luKFwiLCBcIil9OyBncmFwaCBzaXplOiAke1xuICAgICAgICAgIChtb2R1bGVHcmFwaCBhcyBhbnkpLmlkVG9Nb2R1bGVNYXA/LnNpemUgPz8gXCI/XCJcbiAgICAgICAgfSlgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBsb2dnZXIuaW5mbyhgW2NvbGxlY3RSdW5uZXJDc3NdIHJlc29sdmVkIHBhZ2UgbW9kdWxlOiAke3BhZ2VNb2R1bGUuaWR9YCk7XG4gIH1cblxuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG91dDogQ29sbGVjdGVkQ3NzW10gPSBbXTtcblxuICBjb25zdCB3YWxrID0gYXN5bmMgKG1vZDogRW52aXJvbm1lbnRNb2R1bGVOb2RlIHwgTW9kdWxlTm9kZSkgPT4ge1xuICAgIGlmICghbW9kPy5pZCB8fCBzZWVuLmhhcyhtb2QuaWQpKSByZXR1cm47XG4gICAgc2Vlbi5hZGQobW9kLmlkKTtcblxuICAgIGlmIChDU1NfRVhULnRlc3QobW9kLmlkKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBhd2FpdCBlbnYudHJhbnNmb3JtUmVxdWVzdChgJHttb2QuaWR9P2lubGluZWApO1xuICAgICAgICBpZiAodHJhbnNmb3JtZWQ/LmNvZGUpIHtcbiAgICAgICAgICBjb25zdCBjb2RlID0gdHJhbnNmb3JtZWQuY29kZTtcbiAgICAgICAgICAvLyBWaXRlIHRyYW5zZm9ybXMgYC5jc3M/aW5saW5lYCBtb2R1bGVzIHdpdGggZGlmZmVyZW50IGZyYW1pbmdzOlxuICAgICAgICAgIC8vIC0gU1NSIHJ1bm5lciBvdXRwdXQ6IGBjb25zdCBfX3ZpdGVfc3NyX2V4cG9ydF9kZWZhdWx0X18gPSBcIi4uLlwiO2BcbiAgICAgICAgICAvLyAtIHBsYWluIEVTTSBvdXRwdXQ6ICBgZXhwb3J0IGRlZmF1bHQgXCIuLi5cIjtgXG4gICAgICAgICAgLy8gLSBsZWdhY3kgbW9kdWxlIEFQSTogYF9fdml0ZV9fY3NzTW9kdWxlcy5kZWZhdWx0ID0gXCIuLi5cIjtgXG4gICAgICAgICAgY29uc3QgZXhwb3J0TWF0Y2ggPVxuICAgICAgICAgICAgY29kZS5tYXRjaCgvX192aXRlX3Nzcl9leHBvcnRfZGVmYXVsdF9fXFxzKj1cXHMqKFwiKD86XFxcXC58W15cIlxcXFxdKSpcIikvKSA/P1xuICAgICAgICAgICAgY29kZS5tYXRjaCgvZXhwb3J0XFxzK2RlZmF1bHRcXHMrKFwiKD86XFxcXC58W15cIlxcXFxdKSpcIikvKSA/P1xuICAgICAgICAgICAgY29kZS5tYXRjaCgvX192aXRlX19jc3NNb2R1bGVzXFwuZGVmYXVsdFxccyo9XFxzKihcIig/OlxcXFwufFteXCJcXFxcXSkqXCIpLyk7XG4gICAgICAgICAgaWYgKGV4cG9ydE1hdGNoKSB7XG4gICAgICAgICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKGV4cG9ydE1hdGNoWzFdKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmF3ID09PSBcInN0cmluZ1wiICYmIHJhdy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIG91dC5wdXNoKHsgaWQ6IG1vZC5pZCwgY29kZTogcmF3IH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbY29sbGVjdFJ1bm5lckNzc10gaW5saW5lIGRlZmF1bHQgZW1wdHkgZm9yICR7bW9kLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBbY29sbGVjdFJ1bm5lckNzc10gY291bGQgbm90IGZpbmQgaW5saW5lIGV4cG9ydCBpbiB0cmFuc2Zvcm0gZm9yICR7bW9kLmlkfSAoY29kZUxlbj0ke2NvZGUubGVuZ3RofSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtjb2xsZWN0UnVubmVyQ3NzXSBubyB0cmFuc2Zvcm1lZCBjb2RlIGZvciAke21vZC5pZH0/aW5saW5lYCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFtjb2xsZWN0UnVubmVyQ3NzXSBmYWlsZWQgdG8gaW5saW5lICR7bW9kLmlkfTogJHtTdHJpbmcoZXJyKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2QuaW1wb3J0ZWRNb2R1bGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGltcG9ydGVkIG9mIG1vZC5pbXBvcnRlZE1vZHVsZXMgYXMgSXRlcmFibGU8XG4gICAgICAgIEVudmlyb25tZW50TW9kdWxlTm9kZSB8IE1vZHVsZU5vZGVcbiAgICAgID4pIHtcbiAgICAgICAgaWYgKGltcG9ydGVkICYmIHR5cGVvZiBpbXBvcnRlZCA9PT0gXCJvYmplY3RcIiAmJiBcImlkXCIgaW4gaW1wb3J0ZWQpIHtcbiAgICAgICAgICBhd2FpdCB3YWxrKGltcG9ydGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBhd2FpdCB3YWxrKHBhZ2VNb2R1bGUpO1xuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgW2NvbGxlY3RSdW5uZXJDc3NdIGNvbGxlY3RlZCAke291dC5sZW5ndGh9IENTUyBmaWxlKHMpIGZvciAke3BhZ2VQYXRofWBcbiAgICApO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFRTyxNQUFNLE9BQVUsR0FBQTtBQWN2QixlQUFzQixpQkFDcEIsTUFDQSxFQUFBLFFBQUEsRUFDQSxXQUNBLEVBQUEsTUFBQSxFQUNBLFVBQVUsS0FDZSxFQUFBO0FBQ3pCLEVBQU0sTUFBQSxHQUFBLEdBQU0sTUFBTyxDQUFBLFlBQUEsR0FBZSxRQUFRLENBQUE7QUFDMUMsRUFBQSxJQUFJLENBQUMsR0FBSyxFQUFBO0FBQ1IsSUFBSSxJQUFBLE9BQUEsRUFBZ0IsTUFBQSxDQUFBLElBQUEsQ0FBSyxDQUEwQyx3Q0FBQSxDQUFBLENBQUE7QUFDbkUsSUFBQSxPQUFPLEVBQUM7QUFBQTtBQUdWLEVBQUEsTUFBTSxjQUFzQyxHQUFJLENBQUEsV0FBQTtBQUNoRCxFQUFBLE1BQU0sVUFBYSxHQUFBO0FBQUEsSUFDakIsUUFBQTtBQUFBLElBQ0EsU0FBUyxVQUFXLENBQUEsR0FBRyxDQUFJLEdBQUEsUUFBQSxHQUFXLElBQUksUUFBUSxDQUFBLENBQUE7QUFBQSxJQUNsRCxRQUFBLENB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