vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
71 lines (68 loc) • 2 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { readFile } from 'fs/promises';
import { basename } from 'path';
import postcss from 'postcss';
let cssLoaderPort;
async function initialize(data) {
cssLoaderPort = data.port;
data.port.postMessage({ type: "INITIALIZED" });
data.port.unref();
}
const cssFilesByPage = /* @__PURE__ */ new Map();
function setCurrentPage(page) {
if (page && !cssFilesByPage.has(page)) {
cssFilesByPage.set(page, /* @__PURE__ */ new Set());
}
}
function getCssFilesForPage(page) {
return Array.from(cssFilesByPage.get(page) || []);
}
async function load(url, context, defaultLoad) {
if (url.endsWith(".css")) {
const source = await readFile(new URL(url), "utf-8");
const result = await postcss().process(source, {
from: url,
to: url,
map: {
inline: false,
annotation: false
}
});
const moduleName = basename(url, ".css").replace(".", "_");
const classes = {};
result.root.walkRules((rule) => {
const selector = rule.selector.replace(".", "");
const className = `${moduleName}_${selector}`;
classes[selector] = className;
rule.selector = `.${className}`;
});
const transformedCss = result.root.toString();
if (cssLoaderPort) {
cssLoaderPort.postMessage({
type: "CSS_FILE",
id: url,
cssFile: transformedCss
});
}
const moduleSource = `
const styles = ${JSON.stringify(classes)};
export default styles;
export const css = ${JSON.stringify(transformedCss)};
`;
return {
format: "module",
source: moduleSource,
shortCircuit: true
};
}
return defaultLoad(url, context, defaultLoad);
}
function resolve(specifier, context, defaultResolve) {
return defaultResolve(specifier, context, defaultResolve);
}
export { getCssFilesForPage, initialize, load, resolve, setCurrentPage };
//# sourceMappingURL=css-loader.js.map