Skip to content

Commit 7399845

Browse files
Simplify test resolution of Vite dependency (#12677)
1 parent e711f00 commit 7399845

File tree

13 files changed

+75
-110
lines changed

13 files changed

+75
-110
lines changed

integration/helpers/vite.ts

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -136,29 +136,6 @@ export const viteMajorTemplates = [
136136
templateDisplayName: string;
137137
}>;
138138

139-
function resolveDevPackageDir(root: string) {
140-
return path.join(root, "node_modules", "@react-router", "dev");
141-
}
142-
143-
function resolveDevPackageNodeModulesDir(root: string) {
144-
return path.join(resolveDevPackageDir(root), "node_modules");
145-
}
146-
147-
async function copyDirContents(
148-
srcDir: string,
149-
destDir: string,
150-
filter?: (file: string) => boolean
151-
) {
152-
for (const file of await fse.readdir(srcDir)) {
153-
if (filter && !filter(path.normalize(file))) {
154-
continue;
155-
}
156-
const srcFile = path.join(srcDir, file);
157-
const destFile = path.join(destDir, file);
158-
await fse.copy(srcFile, destFile, { errorOnExist: true });
159-
}
160-
}
161-
162139
export async function createProject(
163140
files: Record<string, string> = {},
164141
templateName: TemplateName = "vite-5-template"
@@ -169,27 +146,7 @@ export async function createProject(
169146

170147
// base template
171148
let templateDir = path.resolve(__dirname, templateName);
172-
173-
// When we copy the template, we need to filter out the version of Vite
174-
// installed locally within @react-router/dev. If we don't do this, the dev
175-
// package doesn't use the version of Vite defined within the test template
176-
// which means we can't run integration tests across different versions of
177-
// Vite. Since pnpm uses symlinks for dependencies, we need to perform the
178-
// copy in multiple steps so that we can filter at each level.
179-
await fse.copy(templateDir, projectDir, {
180-
errorOnExist: true,
181-
filter: (src) => !path.normalize(src).endsWith("/@react-router/dev"),
182-
});
183-
await copyDirContents(
184-
resolveDevPackageDir(templateDir),
185-
resolveDevPackageDir(projectDir),
186-
(file) => file !== "node_modules"
187-
);
188-
await copyDirContents(
189-
resolveDevPackageNodeModulesDir(templateDir),
190-
resolveDevPackageNodeModulesDir(projectDir),
191-
(file) => file !== "vite"
192-
);
149+
await fse.copy(templateDir, projectDir, { errorOnExist: true });
193150

194151
// user-defined files
195152
await Promise.all(

packages/react-router-dev/__tests__/cli-test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import childProcess from "node:child_process";
2-
import os from "node:os";
32
import path from "node:path";
43
import util from "node:util";
54
import fse from "fs-extra";
@@ -8,7 +7,7 @@ import semver from "semver";
87
let execFile = util.promisify(childProcess.execFile);
98

109
const TEMP_DIR = path.join(
11-
fse.realpathSync(os.tmpdir()),
10+
path.join(__dirname, ".tmp"),
1211
`remix-tests-${Math.random().toString(32).slice(2)}`
1312
);
1413

packages/react-router-dev/cli/commands.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@ import { loadPluginContext } from "../vite/plugin";
1212
import { transpile as convertFileToJS } from "./useJavascript";
1313
import * as profiler from "../vite/profiler";
1414
import * as Typegen from "../typegen";
15-
import {
16-
importViteEsmSync,
17-
preloadViteEsm,
18-
} from "../vite/import-vite-esm-sync";
15+
import { preloadVite, getVite } from "../vite/vite";
1916

2017
export async function routes(
2118
reactRouterRoot?: string,
@@ -205,8 +202,8 @@ export async function typegen(root: string, flags: { watch: boolean }) {
205202
root ??= process.cwd();
206203

207204
if (flags.watch) {
208-
await preloadViteEsm();
209-
const vite = importViteEsmSync();
205+
await preloadVite();
206+
const vite = getVite();
210207
const logger = vite.createLogger("info", { prefix: "[react-router]" });
211208

212209
await Typegen.watch(root, { logger });

packages/react-router-dev/config/config.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
configRoutesToRouteManifest,
2424
} from "./routes";
2525
import { detectPackageManager } from "../cli/detectPackageManager";
26+
import { isReactRouterRepo } from "./is-react-router-repo";
2627

2728
const excludedConfigPresetKeys = ["presets"] as const satisfies ReadonlyArray<
2829
keyof ReactRouterConfig
@@ -720,7 +721,7 @@ export async function resolveEntryFiles({
720721
return { entryClientFilePath, entryServerFilePath };
721722
}
722723

723-
export const ssrExternals = isInReactRouterMonorepo()
724+
export const ssrExternals = isReactRouterRepo()
724725
? [
725726
// This is only needed within this repo because these packages
726727
// are linked to a directory outside of node_modules so Vite
@@ -736,18 +737,6 @@ export const ssrExternals = isInReactRouterMonorepo()
736737
]
737738
: undefined;
738739

739-
function isInReactRouterMonorepo() {
740-
// We use '@react-router/node' for this check since it's a
741-
// dependency of this package and guaranteed to be in node_modules
742-
let serverRuntimePath = path.dirname(
743-
require.resolve("@react-router/node/package.json")
744-
);
745-
let serverRuntimeParentDir = path.basename(
746-
path.resolve(serverRuntimePath, "..")
747-
);
748-
return serverRuntimeParentDir === "packages";
749-
}
750-
751740
const entryExts = [".js", ".jsx", ".ts", ".tsx"];
752741

753742
function findEntry(
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import path from "pathe";
2+
3+
export function isReactRouterRepo() {
4+
// We use '@react-router/node' for this check since it's a
5+
// dependency of this package and guaranteed to be in node_modules
6+
let serverRuntimePath = path.dirname(
7+
require.resolve("@react-router/node/package.json")
8+
);
9+
let serverRuntimeParentDir = path.basename(
10+
path.resolve(serverRuntimePath, "..")
11+
);
12+
return serverRuntimeParentDir === "packages";
13+
}

packages/react-router-dev/vite/build.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
} from "../config/config";
1818
import type { RouteManifestEntry, RouteManifest } from "../config/routes";
1919
import invariant from "../invariant";
20-
import { preloadViteEsm } from "./import-vite-esm-sync";
20+
import { preloadVite, getVite } from "./vite";
2121

2222
function getAddressableRoutes(routes: RouteManifest): RouteManifestEntry[] {
2323
let nonAddressableIds = new Set<string>();
@@ -235,8 +235,8 @@ export async function build(
235235
}: ViteBuildOptions
236236
) {
237237
// Ensure Vite's ESM build is preloaded at the start of the process
238-
// so it can be accessed synchronously via `importViteEsmSync`
239-
await preloadViteEsm();
238+
// so it can be accessed synchronously via `getVite`
239+
await preloadVite();
240240

241241
let viteConfig = await resolveViteConfig({ configFile, mode, root });
242242

@@ -251,7 +251,7 @@ export async function build(
251251

252252
let { reactRouterConfig } = ctx;
253253

254-
let vite = await import("vite");
254+
let vite = getVite();
255255

256256
async function viteBuild({
257257
ssr,

packages/react-router-dev/vite/dev.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type * as Vite from "vite";
22
import colors from "picocolors";
33

4-
import { preloadViteEsm } from "./import-vite-esm-sync";
4+
import { preloadVite, getVite } from "./vite";
55
import * as profiler from "./profiler";
66

77
export interface ViteDevOptions {
@@ -34,10 +34,10 @@ export async function dev(
3434
}: ViteDevOptions
3535
) {
3636
// Ensure Vite's ESM build is preloaded at the start of the process
37-
// so it can be accessed synchronously via `importViteEsmSync`
38-
await preloadViteEsm();
37+
// so it can be accessed synchronously via `getVite`
38+
await preloadVite();
39+
let vite = getVite();
3940

40-
let vite = await import("vite");
4141
let server = await vite.createServer({
4242
root,
4343
mode,

packages/react-router-dev/vite/import-vite-esm-sync.ts

Lines changed: 0 additions & 21 deletions
This file was deleted.

packages/react-router-dev/vite/plugin.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import * as VirtualModule from "./virtual-module";
3535
import { resolveFileUrl } from "./resolve-file-url";
3636
import { combineURLs } from "./combine-urls";
3737
import { removeExports } from "./remove-exports";
38-
import { importViteEsmSync, preloadViteEsm } from "./import-vite-esm-sync";
38+
import { preloadVite, getVite } from "./vite";
3939
import {
4040
type ResolvedReactRouterConfig,
4141
type ConfigLoader,
@@ -54,7 +54,7 @@ export async function resolveViteConfig({
5454
mode?: string;
5555
root: string;
5656
}) {
57-
let vite = await import("vite");
57+
let vite = getVite();
5858

5959
let viteConfig = await vite.resolveConfig(
6060
{ mode, configFile, root },
@@ -169,7 +169,7 @@ const resolveRelativeRouteFilePath = (
169169
route: RouteManifestEntry,
170170
reactRouterConfig: ResolvedReactRouterConfig
171171
) => {
172-
let vite = importViteEsmSync();
172+
let vite = getVite();
173173
let file = route.file;
174174
let fullPath = path.resolve(reactRouterConfig.appDirectory, file);
175175

@@ -201,7 +201,7 @@ const resolveChunk = (
201201
viteManifest: Vite.Manifest,
202202
absoluteFilePath: string
203203
) => {
204-
let vite = importViteEsmSync();
204+
let vite = getVite();
205205
let rootRelativeFilePath = vite.normalizePath(
206206
path.relative(ctx.rootDirectory, absoluteFilePath)
207207
);
@@ -729,10 +729,10 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => {
729729
name: "react-router",
730730
config: async (_viteUserConfig, _viteConfigEnv) => {
731731
// Preload Vite's ESM build up-front as soon as we're in an async context
732-
await preloadViteEsm();
732+
await preloadVite();
733733

734734
// Ensure sync import of Vite works after async preload
735-
let vite = importViteEsmSync();
735+
let vite = getVite();
736736

737737
viteUserConfig = _viteUserConfig;
738738
viteConfigEnv = _viteConfigEnv;
@@ -948,7 +948,7 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => {
948948
);
949949
}
950950

951-
let vite = importViteEsmSync();
951+
let vite = getVite();
952952

953953
let childCompilerConfigFile = await vite.loadConfigFromFile(
954954
{
@@ -1342,7 +1342,7 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => {
13421342
return;
13431343
}
13441344

1345-
let vite = importViteEsmSync();
1345+
let vite = getVite();
13461346
let importerShort = vite.normalizePath(
13471347
path.relative(ctx.rootDirectory, importer)
13481348
);
@@ -1745,7 +1745,7 @@ function getRoute(
17451745
pluginConfig: ResolvedReactRouterConfig,
17461746
file: string
17471747
): RouteManifestEntry | undefined {
1748-
let vite = importViteEsmSync();
1748+
let vite = getVite();
17491749
let routePath = vite.normalizePath(
17501750
path.relative(pluginConfig.appDirectory, file)
17511751
);

packages/react-router-dev/vite/resolve-file-url.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import * as path from "node:path";
22

3-
import { importViteEsmSync } from "./import-vite-esm-sync";
3+
import { getVite } from "./vite";
44

55
export const resolveFileUrl = (
66
{ rootDirectory }: { rootDirectory: string },
77
filePath: string
88
) => {
9-
let vite = importViteEsmSync();
9+
let vite = getVite();
1010
let relativePath = path.relative(rootDirectory, filePath);
1111
let isWithinRoot =
1212
!relativePath.startsWith("..") && !path.isAbsolute(relativePath);

0 commit comments

Comments
 (0)