Skip to content

Commit

Permalink
refactor(remix-dev/vite): clean resolved Remix config (#8586)
Browse files Browse the repository at this point in the history
  • Loading branch information
markdalgleish committed Jan 24, 2024
1 parent 1d1d196 commit e4aab77
Show file tree
Hide file tree
Showing 3 changed files with 185 additions and 185 deletions.
59 changes: 27 additions & 32 deletions packages/remix-dev/vite/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import fse from "fs-extra";
import colors from "picocolors";

import {
type ResolvedVitePluginConfig,
type ServerBundleBuildConfig,
type RemixPluginContext,
type BuildManifest,
type ServerBundleBuildConfig,
type ServerBundlesBuildManifest,
configRouteToBranchRoute,
getServerBuildRootDirectory,
getServerBuildDirectory,
} from "./plugin";
import type { ConfigRoute, RouteManifest } from "../config/routes";
import invariant from "../invariant";
Expand Down Expand Up @@ -38,16 +38,17 @@ async function resolveViteConfig({
return viteConfig;
}

async function extractRemixConfig(viteConfig: Vite.ResolvedConfig) {
let remixConfig = viteConfig[
"__remixPluginResolvedConfig" as keyof typeof viteConfig
] as ResolvedVitePluginConfig | undefined;
if (!remixConfig) {
async function extractRemixPluginContext(viteConfig: Vite.ResolvedConfig) {
let ctx = viteConfig["__remixPluginContext" as keyof typeof viteConfig] as
| RemixPluginContext
| undefined;

if (!ctx) {
console.error(colors.red("Remix Vite plugin not found in Vite config"));
process.exit(1);
}

return remixConfig;
return ctx;
}

function getAddressableRoutes(routes: RouteManifest): ConfigRoute[] {
Expand Down Expand Up @@ -102,19 +103,15 @@ type RemixViteServerBuildArgs = {

type RemixViteBuildArgs = RemixViteClientBuildArgs | RemixViteServerBuildArgs;

async function getServerBuilds(remixConfig: ResolvedVitePluginConfig): Promise<{
async function getServerBuilds(ctx: RemixPluginContext): Promise<{
serverBuilds: RemixViteServerBuildArgs[];
buildManifest: BuildManifest;
}> {
let { rootDirectory } = ctx;
// eslint-disable-next-line prefer-let/prefer-let -- Improve type narrowing
const {
routes,
serverBuildFile,
serverBundles,
rootDirectory,
appDirectory,
} = remixConfig;
let serverBuildRootDirectory = getServerBuildRootDirectory(remixConfig);
const { routes, serverBuildFile, serverBundles, appDirectory } =
ctx.remixConfig;
let serverBuildDirectory = getServerBuildDirectory(ctx);
if (!serverBundles) {
return {
serverBuilds: [{ ssr: true }],
Expand Down Expand Up @@ -164,7 +161,7 @@ async function getServerBuilds(remixConfig: ResolvedVitePluginConfig): Promise<{

let relativeServerBundleDirectory = path.relative(
rootDirectory,
path.join(serverBuildRootDirectory, serverBundleId)
path.join(serverBuildDirectory, serverBundleId)
);
let serverBuildConfig = serverBundleBuildConfigById.get(serverBundleId);
if (!serverBuildConfig) {
Expand Down Expand Up @@ -202,21 +199,18 @@ async function getServerBuilds(remixConfig: ResolvedVitePluginConfig): Promise<{
};
}

async function cleanServerBuildRootDirectory(
async function cleanServerBuildDirectory(
viteConfig: Vite.ResolvedConfig,
remixConfig: ResolvedVitePluginConfig
ctx: RemixPluginContext
) {
let serverBuildRootDirectory = getServerBuildRootDirectory(remixConfig);
let serverBuildDirectory = getServerBuildDirectory(ctx);
let isWithinRoot = () => {
let relativePath = path.relative(
remixConfig.rootDirectory,
serverBuildRootDirectory
);
let relativePath = path.relative(ctx.rootDirectory, serverBuildDirectory);
return !relativePath.startsWith("..") && !path.isAbsolute(relativePath);
};

if (viteConfig.build.emptyOutDir ?? isWithinRoot()) {
await fse.remove(serverBuildRootDirectory);
await fse.remove(serverBuildDirectory);
}
}

Expand Down Expand Up @@ -250,7 +244,8 @@ export async function build(
await preloadViteEsm();

let viteConfig = await resolveViteConfig({ configFile, mode, root });
let remixConfig = await extractRemixConfig(viteConfig);
let ctx = await extractRemixPluginContext(viteConfig);
let { remixConfig } = ctx;

let vite = await import("vite");

Expand All @@ -276,19 +271,19 @@ export async function build(
// output directories, we need to clean the root server build directory
// ourselves rather than relying on Vite to do it, otherwise you can end up
// with stale server bundle directories in your build output
await cleanServerBuildRootDirectory(viteConfig, remixConfig);
await cleanServerBuildDirectory(viteConfig, ctx);

// Run the Vite client build first
await viteBuild({ ssr: false });

// Then run Vite SSR builds in parallel
let { serverBuilds, buildManifest } = await getServerBuilds(remixConfig);
let { serverBuilds, buildManifest } = await getServerBuilds(ctx);

await Promise.all(serverBuilds.map(viteBuild));

if (remixConfig.manifest) {
if (ctx.remixConfig.manifest) {
await fse.writeFile(
path.join(remixConfig.buildDirectory, "manifest.json"),
path.join(ctx.remixConfig.buildDirectory, "manifest.json"),
JSON.stringify(buildManifest, null, 2),
"utf-8"
);
Expand Down

0 comments on commit e4aab77

Please sign in to comment.