Skip to content
5 changes: 4 additions & 1 deletion packages/vinext/src/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -811,7 +811,10 @@ export function getMissingDeps(
missing.push({ name: "@vitejs/plugin-react", version: "latest" });
}
if (info.isAppRouter && !info.hasRscPlugin) {
missing.push({ name: "@vitejs/plugin-rsc", version: "latest" });
missing.push({
name: "@vitejs/plugin-rsc",
version: "https://pkg.pr.new/@vitejs/plugin-rsc@50eaf476",
});
}
if (info.isAppRouter) {
// react-server-dom-webpack must be resolvable from the project root for Vite.
Expand Down
41 changes: 19 additions & 22 deletions packages/vinext/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ import { createMiddlewareServerOnlyPlugin } from "./plugins/middleware-server-on
import { createOptimizeImportsPlugin } from "./plugins/optimize-imports.js";
import { createDynamicPreloadMetadataPlugin } from "./plugins/dynamic-preload-metadata.js";
import { createOgInlineFetchAssetsPlugin, createOgAssetsPlugin } from "./plugins/og-assets.js";
import {
createServerFunctionDirectivePlugin,
type ServerFunctionDirectiveContext,
} from "./plugins/server-function-directives.js";
import { generateRouteTypes } from "./typegen.js";
import {
mergeOptimizeDepsExclude,
Expand Down Expand Up @@ -187,16 +191,6 @@ import { randomBytes, randomUUID } from "node:crypto";
import commonjs from "vite-plugin-commonjs";
import { normalizePathSeparators, stripViteModuleQuery } from "./utils/path.js";

type ServerFunctionDirectiveContext = {
value: string;
name: string;
id: string;
directiveMatch: RegExpMatchArray;
location: "inline" | "module";
parameters?: { count: number; hasRest: boolean };
runtime?: string;
};

function parseUseCacheVariant(directive: string): string {
return directive === "use cache"
? ""
Expand Down Expand Up @@ -943,15 +937,18 @@ export default function vinext(options: VinextOptions = {}): PluginOption[] {
}
const rscImport = import(pathToFileURL(resolvedRscPath).href);
rscPluginPromise = rscImport
.then((mod) => {
.then(async (mod) => {
const rsc = mod.default;
return rsc({
const plugins: Plugin[] = rsc({
entries: {
rsc: VIRTUAL_RSC_ENTRY,
ssr: VIRTUAL_APP_SSR_ENTRY,
client: VIRTUAL_APP_BROWSER_ENTRY,
},
serverFunctionDirectives: [
});
const serverFunctionPlugin = await createServerFunctionDirectivePlugin({
projectRoot: earlyBaseDir,
definitions: [
{
directive: /^use cache.*$/,
test: (code: string) => code.includes("use cache"),
Expand Down Expand Up @@ -1002,15 +999,7 @@ export default function vinext(options: VinextOptions = {}): PluginOption[] {
: "";
return `${runtime}.registerCachedFunction(${value}, ${JSON.stringify(id + ":" + name)}, ${JSON.stringify(variant)}${pageOptions})`;
},
filterExport: ({
name,
id,
meta,
}: {
name: string;
id: string;
meta: { isFunction?: boolean };
}) => {
filterExport: ({ name, id, meta }) => {
if (meta.isFunction === false) return false;
if (/\/(layout|template)\.(tsx?|jsx?|mjs)$/.test(id) && name === "default") {
return false;
Expand All @@ -1019,7 +1008,15 @@ export default function vinext(options: VinextOptions = {}): PluginOption[] {
},
},
],
serverEnvironmentName: "rsc",
browserEnvironmentName: "client",
});
const useServerIndex = plugins.findIndex((plugin) => plugin.name === "rsc:use-server");
if (useServerIndex === -1) {
throw new Error("vinext: Failed to locate @vitejs/plugin-rsc use-server plugin.");
}
plugins.splice(useServerIndex, 0, serverFunctionPlugin);
return plugins;
})
.catch((cause) => {
throw new Error("vinext: Failed to load @vitejs/plugin-rsc.", {
Expand Down
8 changes: 7 additions & 1 deletion packages/vinext/src/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ export function addScripts(root: string, port: number): string[] {

// ─── Dependency Installation ─────────────────────────────────────────────────

const PLUGIN_RSC_INSTALL_SPEC = "@vitejs/plugin-rsc@https://pkg.pr.new/@vitejs/plugin-rsc@50eaf476";

export function getInitDeps(isAppRouter: boolean): string[] {
const deps = ["vinext", "vite", "@vitejs/plugin-react"];
if (isAppRouter) {
Expand Down Expand Up @@ -308,7 +310,11 @@ export async function init(options: InitOptions): Promise<InitResult> {

if (missingDeps.length > 0) {
console.log(` Installing ${missingDeps.join(", ")}...`);
installDeps(root, missingDeps, exec);
installDeps(
root,
missingDeps.map((dep) => (dep === "@vitejs/plugin-rsc" ? PLUGIN_RSC_INSTALL_SPEC : dep)),
exec,
);
console.log();
}

Expand Down
Loading
Loading