@redwoodjs/sdk
Version:
Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime
34 lines (33 loc) • 1.09 kB
JavaScript
import MagicString from "magic-string";
import { virtualPlugin } from "./virtualPlugin.mjs";
import { $ } from "../lib/$.mjs";
export const findFilesContainingUseClient = async ({ rootDir, containingPath, }) => {
const result = await $({
cwd: rootDir,
// context(justinvdm, 2024-12-05): Empty grep results will cause non-zero exit code
reject: false,
}) `grep -rl --include=*.ts --include=*.tsx -e ${'"use client"'} -e ${"'use client'"} ${containingPath}`;
return (result.stdout
?.split("\n")
.map((line) => line.trim().slice(1))
.filter(Boolean) ?? []);
};
export const useClientLookupPlugin = ({ rootDir, containingPath, }) => virtualPlugin("use-client-lookup", async () => {
const files = await findFilesContainingUseClient({
rootDir,
containingPath,
});
const s = new MagicString(`
export const useClientLookup = {
${files
.map((file) => `
"${file}": () => import("${file}"),
`)
.join("")}
};
`);
return {
code: s.toString(),
map: s.generateMap(),
};
});