@redwoodjs/sdk
Version:
Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime
48 lines (47 loc) • 1.91 kB
JavaScript
import { relative } from "node:path";
import { parse } from "es-module-lexer";
import MagicString from "magic-string";
export const useServerPlugin = () => ({
name: "rwsdk:use-server",
async transform(code, id) {
if (id.includes(".vite/deps") || id.includes("node_modules")) {
return;
}
const relativeId = `/${relative(this.environment.getTopLevelConfig().root, id)}`;
if (code.includes('"use server"') || code.includes("'use server'")) {
// context(justinvdm, 5 Dec 2024): they've served their purpose at this point, keeping them around just causes rollup warnings since module level directives can't easily be applied to bundled
// modules
let s = new MagicString(code);
s.replaceAll("'use server'", "");
s.replaceAll('"use server"', "");
s.trim();
if (this.environment.name === "worker") {
// TODO: Rewrite the code, but register the "function" against
s.prepend(`
import { registerServerReference } from "@redwoodjs/sdk/worker";
`);
const [_, exports] = parse(code);
for (const e of exports) {
s.append(`
registerServerReference(${e.ln}, ${JSON.stringify(relativeId)}, ${JSON.stringify(e.ln)});
`);
}
}
if (this.environment.name === "client") {
s = new MagicString(`\
import { createServerReference } from "@redwoodjs/sdk/client";
`);
const [_, exports] = parse(code);
for (const e of exports) {
s.append(`\
export const ${e.ln} = createServerReference(${JSON.stringify(relativeId)}, ${JSON.stringify(e.ln)})
`);
}
}
return {
code: s.toString(),
map: s.generateMap(),
};
}
},
});