UNPKG

rwsdk

Version:

Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime

87 lines (86 loc) 3.83 kB
import { resolve } from "node:path"; import reactPlugin from "@vitejs/plugin-react"; import tsconfigPaths from "vite-tsconfig-paths"; import { transformJsxScriptTagsPlugin } from "./transformJsxScriptTagsPlugin.mjs"; import { directivesPlugin } from "./directivesPlugin.mjs"; import { useClientLookupPlugin } from "./useClientLookupPlugin.mjs"; import { useServerLookupPlugin } from "./useServerLookupPlugin.mjs"; import { miniflarePlugin } from "./miniflarePlugin.mjs"; import { moveStaticAssetsPlugin } from "./moveStaticAssetsPlugin.mjs"; import { configPlugin } from "./configPlugin.mjs"; import { $ } from "../lib/$.mjs"; import { reactConditionsResolverPlugin } from "./reactConditionsResolverPlugin.mjs"; import { findWranglerConfig } from "../lib/findWranglerConfig.mjs"; import { pathExists } from "fs-extra"; import { injectVitePreamble } from "./injectVitePreamblePlugin.mjs"; import { vitePreamblePlugin } from "./vitePreamblePlugin.mjs"; import { prismaPlugin } from "./prismaPlugin.mjs"; import { ssrBridgePlugin } from "./ssrBridgePlugin.mjs"; import { hasPkgScript } from "../lib/hasPkgScript.mjs"; import { devServerTimingPlugin } from "./devServerTimingPlugin.mjs"; export const redwoodPlugin = async (options = {}) => { const projectRootDir = process.cwd(); const mode = options.mode ?? (process.env.NODE_ENV === "development" ? "development" : "production"); const clientEntryPathname = resolve(projectRootDir, options?.entry?.client ?? "src/client.tsx"); const workerEntryPathname = resolve(projectRootDir, options?.entry?.worker ?? "src/worker.tsx"); const clientFiles = new Set(); const serverFiles = new Set(); // context(justinvdm, 31 Mar 2025): We assume that if there is no .wrangler directory, // then this is fresh install, and we run `npm run dev:init` here. if (process.env.RWSDK_WORKER_RUN !== "1" && process.env.RWSDK_DEPLOY !== "1" && !(await pathExists(resolve(projectRootDir, ".wrangler"))) && (await hasPkgScript(projectRootDir, "dev:init"))) { console.log("🚀 Project has no .wrangler directory yet, assuming fresh install: running `npm run dev:init`..."); await $({ // context(justinvdm, 01 Apr 2025): We want to avoid interactive migration y/n prompt, so we ignore stdin // as a signal to operate in no-tty mode stdio: ["ignore", "inherit", "inherit"], }) `npm run dev:init`; } return [ devServerTimingPlugin(), configPlugin({ mode, silent: options.silent ?? false, projectRootDir, clientEntryPathname, workerEntryPathname, }), ssrBridgePlugin({ clientFiles, serverFiles, projectRootDir, }), reactConditionsResolverPlugin(), tsconfigPaths({ root: projectRootDir }), miniflarePlugin({ rootDir: projectRootDir, viteEnvironment: { name: "worker" }, workerEntryPathname, configPath: options.configPath ?? (await findWranglerConfig(projectRootDir)), }), reactPlugin(), directivesPlugin({ projectRootDir, clientFiles, serverFiles, }), vitePreamblePlugin(), injectVitePreamble({ clientEntryPathname, mode }), useClientLookupPlugin({ projectRootDir, clientFiles, }), useServerLookupPlugin({ projectRootDir, serverFiles, }), transformJsxScriptTagsPlugin({ manifestPath: resolve(projectRootDir, "dist", "client", ".vite", "manifest.json"), }), moveStaticAssetsPlugin({ rootDir: projectRootDir }), prismaPlugin({ projectRootDir }), ]; };