vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
66 lines (63 loc) • 10.1 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { glob, readFile } from 'node:fs/promises';
import { existsSync, readFileSync } from 'node:fs';
import { resolve, join } from 'node:path';
import { sourceHasTopLevelClientDirective } from 'react-server-loader/directives';
const MODULE_SCRIPT_SRC = /<script\b[^>]*\btype=["']module["'][^>]*\bsrc=["']([^"']+)["']|<script\b[^>]*\bsrc=["']([^"']+)["'][^>]*\btype=["']module["']/gi;
function indexHtmlScriptSources(projectRoot) {
const path = join(projectRoot, "index.html");
if (!existsSync(path)) return /* @__PURE__ */ new Set();
try {
const html = readFileSync(path, "utf-8");
const srcs = /* @__PURE__ */ new Set();
for (const m of html.matchAll(MODULE_SCRIPT_SRC)) {
const src = (m[1] ?? m[2]).replace(/^\/+/, "");
if (src) srcs.add(resolve(projectRoot, src));
}
return srcs;
} catch {
return /* @__PURE__ */ new Set();
}
}
function createDirectiveClientAutoDiscover(modulePattern = "**/*.{tsx,jsx,mts,cts,ts,js,mjs,cjs}") {
return async function _directiveClientAutoDiscover({
inputs,
userOptions
}) {
const baseDir = resolve(userOptions.projectRoot, userOptions.moduleBase);
const absolutePattern = resolve(baseDir, modulePattern);
const indexHtmlEntries = indexHtmlScriptSources(userOptions.projectRoot);
let allFiles;
try {
allFiles = glob(absolutePattern);
} catch {
return inputs;
}
for await (const file of allFiles) {
if (/\.client\.[cm]?[jt]sx?$/.test(file)) continue;
if (file.includes("node_modules")) continue;
if (indexHtmlEntries.has(file)) continue;
let source;
try {
source = await readFile(file, "utf-8");
} catch {
continue;
}
if (!sourceHasTopLevelClientDirective(source)) continue;
const relativePath = file.replace(baseDir, "").replace(/^\/+/, "");
const [key, value] = userOptions.normalizer(
join(userOptions.moduleBase, relativePath)
);
if (!inputs[key]) {
inputs[key] = value;
}
}
return inputs;
};
}
export { createDirectiveClientAutoDiscover };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlRGlyZWN0aXZlQ2xpZW50QXV0b0Rpc2NvdmVyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW4vY29uZmlnL2F1dG9EaXNjb3Zlci9jcmVhdGVEaXJlY3RpdmVDbGllbnRBdXRvRGlzY292ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZXNvbHZlZFVzZXJPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBnbG9iLCByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHNvdXJjZUhhc1RvcExldmVsQ2xpZW50RGlyZWN0aXZlIH0gZnJvbSBcInJlYWN0LXNlcnZlci1sb2FkZXIvZGlyZWN0aXZlc1wiO1xuXG5jb25zdCBNT0RVTEVfU0NSSVBUX1NSQyA9XG4gIC88c2NyaXB0XFxiW14+XSpcXGJ0eXBlPVtcIiddbW9kdWxlW1wiJ11bXj5dKlxcYnNyYz1bXCInXShbXlwiJ10rKVtcIiddfDxzY3JpcHRcXGJbXj5dKlxcYnNyYz1bXCInXShbXlwiJ10rKVtcIiddW14+XSpcXGJ0eXBlPVtcIiddbW9kdWxlW1wiJ10vZ2k7XG5cbmZ1bmN0aW9uIGluZGV4SHRtbFNjcmlwdFNvdXJjZXMocHJvamVjdFJvb3Q6IHN0cmluZyk6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgcGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIFwiaW5kZXguaHRtbFwiKTtcbiAgaWYgKCFleGlzdHNTeW5jKHBhdGgpKSByZXR1cm4gbmV3IFNldCgpO1xuICB0cnkge1xuICAgIGNvbnN0IGh0bWwgPSByZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBzcmNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBtIG9mIGh0bWwubWF0Y2hBbGwoTU9EVUxFX1NDUklQVF9TUkMpKSB7XG4gICAgICBjb25zdCBzcmMgPSAobVsxXSA/PyBtWzJdKS5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpO1xuICAgICAgaWYgKHNyYykgc3Jjcy5hZGQocmVzb2x2ZShwcm9qZWN0Um9vdCwgc3JjKSk7XG4gICAgfVxuICAgIHJldHVybiBzcmNzO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG59XG5cbi8qKlxuICogQXV0by1kaXNjb3ZlcnMgZmlyc3QtcGFydHkgY2xpZW50IG1vZHVsZXMgZGV0ZWN0ZWQgYnkgYSB0b3Atb2YtZmlsZVxuICogYFwidXNlIGNsaWVudFwiYCBESVJFQ1RJVkUgcmF0aGVyIHRoYW4gdGhlIGAuY2xpZW50LmAgZmlsZW5hbWUgY29udmVudGlvbi5cbiAqXG4gKiBXaHkgdGhpcyBleGlzdHM6IGBjcmVhdGVHbG9iQXV0b0Rpc2NvdmVyKFwiKipcXC8qLmNsaWVudC4qXCIpYCBvbmx5IGZpbmRzXG4gKiBmaWxlbmFtZS1jb252ZW50aW9uIGNsaWVudCBtb2R1bGVzLiBBIGRpcmVjdGl2ZS1vbmx5IGNsaWVudCBtb2R1bGVcbiAqIChlLmcuIGBzcmMvY29tcG9uZW50cy9Db3VudGVyLnRzeGAgc3RhcnRpbmcgd2l0aCBgXCJ1c2UgY2xpZW50XCJgKSB3YXMgbmV2ZXJcbiAqIGFkZGVkIGFzIGEgY2xpZW50L1NTUiBidWlsZCBpbnB1dCwgc28gaXQgd2FzIE5PVCBlbWl0dGVkIHRvIGBkaXN0L2NsaWVudGAuXG4gKiBUaGUgc2VydmVyIGJ1aWxkJ3MgYHJlZ2lzdGVyQ2xpZW50UmVmZXJlbmNlYCB0aGVuIHBvaW50ZWQgaXRzIGhvc3RlZFxuICogbW9kdWxlSUQgYXQgYSBmaWxlIHRoYXQgZGlkbid0IGV4aXN0LCBhbmQgdGhlIGh0bWwtd29ya2VyJ3MgaW1wb3J0IDQwNCdkIGF0XG4gKiBTU0ctcmVuZGVyIHRpbWUuXG4gKlxuICogQWRkaW5nIHRoZXNlIG1vZHVsZXMgYXMgYnVpbGQgaW5wdXRzIG1ha2VzIFZpdGUgZW1pdCB0aGVtIHRvIGBkaXN0L2NsaWVudGBcbiAqIGF0IHByZXNlcnZlZC1tb2R1bGUgcGF0aHMgdGhhdCBsaW5lIHVwIHdpdGggdGhlIGhhc2hlZC9ob3N0ZWQgbW9kdWxlSURzXG4gKiBnZW5lcmF0ZWQgaW4gYGNyZWF0ZVRyYW5zZm9ybWVyUGx1Z2luYC5cbiAqXG4gKiBEZXRlY3Rpb24gaXMgc3RydWN0dXJhbCAoYHNvdXJjZUhhc1RvcExldmVsQ2xpZW50RGlyZWN0aXZlYCksIG5ldmVyIHRoZVxuICogbmFpdmUgXCJjb250YWlucyB0aGUgd29yZCBjbGllbnRcIiBzdWJzdHJpbmcgdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpcmVjdGl2ZUNsaWVudEF1dG9EaXNjb3ZlcihcbiAgbW9kdWxlUGF0dGVybiA9IFwiKiovKi57dHN4LGpzeCxtdHMsY3RzLHRzLGpzLG1qcyxjanN9XCJcbikge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gX2RpcmVjdGl2ZUNsaWVudEF1dG9EaXNjb3Zlcih7XG4gICAgaW5wdXRzLFxuICAgIHVzZXJPcHRpb25zLFxuICB9OiB7XG4gICAgaW5wdXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHVzZXJPcHRpb25zOiBQaWNrPFxuICAgICAgUmVzb2x2ZWRVc2VyT3B0aW9ucyxcbiAgICAgIFwibW9kdWxlQmFzZVwiIHwgXCJwcm9qZWN0Um9vdFwiIHwgXCJub3JtYWxpemVyXCJcbiAgICA+O1xuICB9KSB7XG4gICAgY29uc3QgYmFzZURpciA9IHJlc29sdmUodXNlck9wdGlvbnMucHJvamVjdFJvb3QsIHVzZXJPcHRpb25zLm1vZHVsZUJhc2UpO1xuICAgIGNvbnN0IGFic29sdXRlUGF0dGVybiA9IHJlc29sdmUoYmFzZURpciwgbW9kdWxlUGF0dGVybik7XG4gICAgLy8gRmlsZXMgVml0ZSBhbHJlYWR5IGRpc2NvdmVycyB2aWEgaW5kZXguaHRtbCdzIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICAgIC8vIGVudHJpZXMg4oCUIGFkZGluZyB0aGVtIGFnYWluIGhlcmUgbWFrZXMgVml0ZSBkcm9wIHRoZSBpbmRleC5odG1sXG4gICAgLy8gbWFuaWZlc3QgZW50cnksIHdoaWNoIGRvd25zdHJlYW0gQ1NTLWluamVjdGlvbiBkZXBlbmRzIG9uLlxuICAgIGNvbnN0IGluZGV4SHRtbEVudHJpZXMgPSBpbmRleEh0bWxTY3JpcHRTb3VyY2VzKHVzZXJPcHRpb25zLnByb2plY3RSb290KTtcblxuICAgIGxldCBhbGxGaWxlczogQXN5bmNJdGVyYWJsZTxzdHJpbmc+O1xuICAgIHRyeSB7XG4gICAgICBhbGxGaWxlcyA9IGdsb2IoYWJzb2x1dGVQYXR0ZXJuKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBpbnB1dHM7XG4gICAgfVxuXG4gICAgZm9yIGF3YWl0IChjb25zdCBmaWxlIG9mIGFsbEZpbGVzKSB7XG4gICAgICAvLyBTa2lwIGZpbGVzIGFscmVhZHkgY292ZXJlZCBieSB0aGUgYC5jbGllbnQuYCBmaWxlbmFtZSBjb252ZW50aW9uIOKAlFxuICAgICAgLy8gYGNyZWF0ZUdsb2JBdXRvRGlzY292ZXJgIGRpc2NvdmVycyB0aG9zZSBzZXBhcmF0ZWx5LlxuICAgICAgaWYgKC9cXC5jbGllbnRcXC5bY21dP1tqdF1zeD8kLy50ZXN0KGZpbGUpKSBjb250aW51ZTtcbiAgICAgIC8vIE5ldmVyIHRyZWF0IGRlcGVuZGVuY2llcyBhcyBmaXJzdC1wYXJ0eSBjbGllbnQgaW5wdXRzLlxuICAgICAgaWYgKGZpbGUuaW5jbHVkZXMoXCJub2RlX21vZHVsZXNcIikpIGNvbnRpbnVlO1xuICAgICAgLy8gU2tpcCBmaWxlcyBpbmRleC5odG1sIGFscmVhZHkgcmVmZXJlbmNlczsgVml0ZSB3aWxsIGRpc2NvdmVyIHRoZW0uXG4gICAgICBpZiAoaW5kZXhIdG1sRW50cmllcy5oYXMoZmlsZSkpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgc291cmNlOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShmaWxlLCBcInV0Zi04XCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXNvdXJjZUhhc1RvcExldmVsQ2xpZW50RGlyZWN0aXZlKHNvdXJjZSkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBmaWxlXG4gICAgICAgIC5yZXBsYWNlKGJhc2VEaXIsIFwiXCIpXG4gICAgICAgIC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpO1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gdXNlck9wdGlvbnMubm9ybWFsaXplcihcbiAgICAgICAgam9pbih1c2VyT3B0aW9ucy5tb2R1bGVCYXNlLCByZWxhdGl2ZVBhdGgpXG4gICAgICApO1xuICAgICAgaWYgKCFpbnB1dHNba2V5XSkge1xuICAgICAgICBpbnB1dHNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbnB1dHM7XG4gIH07XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQU1BLE1BQU0saUJBQ0osR0FBQSxpSUFBQTtBQUVGLFNBQVMsdUJBQXVCLFdBQWtDLEVBQUE7QUFDaEUsRUFBTSxNQUFBLElBQUEsR0FBTyxJQUFLLENBQUEsV0FBQSxFQUFhLFlBQVksQ0FBQTtBQUMzQyxFQUFBLElBQUksQ0FBQyxVQUFXLENBQUEsSUFBSSxDQUFHLEVBQUEsMkJBQVcsR0FBSSxFQUFBO0FBQ3RDLEVBQUksSUFBQTtBQUNGLElBQU0sTUFBQSxJQUFBLEdBQU8sWUFBYSxDQUFBLElBQUEsRUFBTSxPQUFPLENBQUE7QUFDdkMsSUFBTSxNQUFBLElBQUEsdUJBQVcsR0FBWSxFQUFBO0FBQzdCLElBQUEsS0FBQSxNQUFXLENBQUssSUFBQSxJQUFBLENBQUssUUFBUyxDQUFBLGlCQUFpQixDQUFHLEVBQUE7QUFDaEQsTUFBTSxNQUFBLEdBQUEsR0FBQSxDQUFPLEVBQUUsQ0FBQyxDQUFBLElBQUssRUFBRSxDQUFDLENBQUEsRUFBRyxPQUFRLENBQUEsTUFBQSxFQUFRLEVBQUUsQ0FBQTtBQUM3QyxNQUFBLElBQUksS0FBVSxJQUFBLENBQUEsR0FBQSxDQUFJLE9BQVEsQ0FBQSxXQUFBLEVBQWEsR0FBRyxDQUFDLENBQUE7QUFBQTtBQUU3QyxJQUFPLE9BQUEsSUFBQTtBQUFBLEdBQ0QsQ0FBQSxNQUFBO0FBQ04sSUFBQSwyQkFBVyxHQUFJLEVBQUE7QUFBQTtBQUVuQjtBQXFCTyxTQUFTLGlDQUFBLENBQ2QsZ0JBQWdCLHNDQUNoQixFQUFBO0FBQ0EsRUFBQSxPQUFPLGVBQWUsNEJBQTZCLENBQUE7QUFBQSxJQUNqRCxNQUFBO0FBQUEsSUFDQTtBQUFBLEdBT0MsRUFBQTtBQUNELElBQUEsTUFBTSxPQUFVLEdBQUEsT0FBQSxDQUFRLFdBQVksQ0FBQSxXQUFBLEVBQWEsWUFBWSxVQUFVLENBQUE7QUFDdkUsSUFBTSxNQUFBLGVBQUEsR0FBa0IsT0FBUSxDQUFBLE9BQUEsRUFBUyxhQUFhLENBQUE7QUFJdEQsSUFBTSxNQUFBLGdCQUFBLEdBQW1CLHNCQUF1QixDQUFBLFdBQUEsQ0FBWSxXQUFXLENBQUE7QUFFdkUsSUFBSSxJQUFBLFFBQUE7QUFDSixJQUFJLElBQUE7QUFDRixNQUFBLFFBQUEsR0FBVyxLQUFLLGVBQWUsQ0FBQTtBQUFBLEtBQ3pCLENBQUEsTUFBQTtBQUNOLE1BQU8sT0FBQSxNQUFBO0FBQUE7QUFHVCxJQUFBLFdBQUEsTUFBaUIsUUFBUSxRQUFVLEVBQUE7QUFHakMsTUFBSSxJQUFBLHlCQUFBLENBQTBCLElBQUssQ0FBQSxJQUFJLENBQUcsRUFBQTtBQUUxQyxNQUFJLElBQUEsSUFBQSxDQUFLLFFBQVMsQ0FBQSxjQUFjLENBQUcsRUFBQTtBQUVuQyxNQUFJLElBQUEsZ0JBQUEsQ0FBaUIsR0FBSSxDQUFBLElBQUksQ0FBRyxFQUFBO0FBRWhDLE1BQUksSUFBQSxNQUFBO0FBQ0osTUFBSSxJQUFBO0FBQ0YsUUFBUyxNQUFBLEdBQUEsTUFBTSxRQUFTLENBQUEsSUFBQSxFQUFNLE9BQU8sQ0FBQTtBQUFBLE9BQy9CLENBQUEsTUFBQTtBQUNOLFFBQUE7QUFBQTtBQUdGLE1BQUksSUFBQSxDQUFDLGdDQUFpQyxDQUFBLE1BQU0sQ0FBRyxFQUFBO0FBRS9DLE1BQU0sTUFBQSxZQUFBLEdBQWUsS0FDbEIsT0FBUSxDQUFBLE9BQUEsRUFBUyxFQUFFLENBQ25CLENBQUEsT0FBQSxDQUFRLFFBQVEsRUFBRSxDQUFBO0FBQ3JCLE1BQUEsTUFBTSxDQUFDLEdBQUEsRUFBSyxLQUFLLENBQUEsR0FBSSxXQUFZLENBQUEsVUFBQTtBQUFBLFFBQy9CLElBQUEsQ0FBSyxXQUFZLENBQUEsVUFBQSxFQUFZLFlBQVk7QUFBQSxPQUMzQztBQUNBLE1BQUksSUFBQSxDQUFDLE1BQU8sQ0FBQSxHQUFHLENBQUcsRUFBQTtBQUNoQixRQUFBLE1BQUEsQ0FBTyxHQUFHLENBQUksR0FBQSxLQUFBO0FBQUE7QUFDaEI7QUFHRixJQUFPLE9BQUEsTUFBQTtBQUFBLEdBQ1Q7QUFDRjs7OzsifQ==