Skip to content

Commit e5f3101

Browse files
committed
Merge branch 'dev' into vite-v6-resolve-conditions
2 parents ee43601 + db92c69 commit e5f3101

22 files changed

+215
-113
lines changed

Diff for: .changeset/beige-ants-pay.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@remix-run/router": patch
3+
---
4+
5+
Fix issue with fetcher data cleanup in the data layer on fetcher unmount

Diff for: contributors.yml

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
- goodrone
110110
- gowthamvbhat
111111
- GraxMonzo
112+
- guppy0356
112113
- GuptaSiddhant
113114
- haivuw
114115
- hampelm

Diff for: docs/how-to/suspense.md

-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ export default function MyComponent({
5353
<Await resolve={nonCriticalData}>
5454
{(value) => <h3>Non critical value: {value}</h3>}
5555
</Await>
56-
<NonCriticalUI p={nonCriticalData} />
5756
</React.Suspense>
5857
</div>
5958
);

Diff for: integration/helpers/vite.ts

+1-44
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(

Diff for: package.json

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
"test:integration": "pnpm build && pnpm test:integration:run",
2222
"posttest:integration:run": "pnpm clean:integration",
2323
"playwright:integration": "playwright test --config ./integration/playwright.config.ts",
24+
"vite-ecosystem-ci:build": "pnpm build",
25+
"vite-ecosystem-ci:before-test": "pnpm playwright install",
26+
"vite-ecosystem-ci:test": "pnpm playwright:integration --project=chromium && pnpm clean:integration",
2427
"changeset": "changeset",
2528
"changeset:version": "changeset version && node ./scripts/remove-prerelease-changelogs.mjs",
2629
"publish": "node scripts/publish.js",

Diff for: packages/react-router-dev/__tests__/cli-test.ts

+1-2
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

Diff for: packages/react-router-dev/cli/commands.ts

+3-6
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 });

Diff for: packages/react-router-dev/config/config.ts

+2-13
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(
+13
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+
}

Diff for: packages/react-router-dev/vite/build.ts

+4-4
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,

Diff for: packages/react-router-dev/vite/dev.ts

+4-4
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,

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

-21
This file was deleted.

Diff for: packages/react-router-dev/vite/plugin.ts

+9-9
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;
@@ -969,7 +969,7 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => {
969969
);
970970
}
971971

972-
let vite = importViteEsmSync();
972+
let vite = getVite();
973973

974974
let childCompilerConfigFile = await vite.loadConfigFromFile(
975975
{
@@ -1363,7 +1363,7 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => {
13631363
return;
13641364
}
13651365

1366-
let vite = importViteEsmSync();
1366+
let vite = getVite();
13671367
let importerShort = vite.normalizePath(
13681368
path.relative(ctx.rootDirectory, importer)
13691369
);
@@ -1766,7 +1766,7 @@ function getRoute(
17661766
pluginConfig: ResolvedReactRouterConfig,
17671767
file: string
17681768
): RouteManifestEntry | undefined {
1769-
let vite = importViteEsmSync();
1769+
let vite = getVite();
17701770
let routePath = vite.normalizePath(
17711771
path.relative(pluginConfig.appDirectory, file)
17721772
);

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

+2-2
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);

Diff for: packages/react-router-dev/vite/styles.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { ModuleNode, ViteDevServer } from "vite";
55

66
import type { ResolvedReactRouterConfig } from "../config/config";
77
import { resolveFileUrl } from "./resolve-file-url";
8-
import { importViteEsmSync } from "./import-vite-esm-sync";
8+
import { getVite } from "./vite";
99

1010
type ServerRouteManifest = ServerBuild["routes"];
1111
type ServerRoute = ServerRouteManifest[string];
@@ -63,7 +63,7 @@ const getStylesForFiles = async ({
6363
cssModulesManifest: Record<string, string>;
6464
files: string[];
6565
}): Promise<string | undefined> => {
66-
let vite = importViteEsmSync();
66+
let vite = getVite();
6767
let viteMajor = parseInt(vite.version.split(".")[0], 10);
6868

6969
let styles: Record<string, string> = {};

Diff for: packages/react-router-dev/vite/vite-node.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ViteNodeRunner } from "vite-node/client";
33
import { installSourcemapsSupport } from "vite-node/source-map";
44
import type * as Vite from "vite";
55

6-
import { importViteEsmSync, preloadViteEsm } from "./import-vite-esm-sync";
6+
import { preloadVite, getVite } from "./vite";
77

88
export type Context = {
99
devServer: Vite.ViteDevServer;
@@ -14,8 +14,8 @@ export type Context = {
1414
export async function createContext(
1515
viteConfig: Vite.InlineConfig = {}
1616
): Promise<Context> {
17-
await preloadViteEsm();
18-
const vite = importViteEsmSync();
17+
await preloadVite();
18+
const vite = getVite();
1919

2020
const devServer = await vite.createServer(
2121
vite.mergeConfig(

0 commit comments

Comments
 (0)