Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 101 additions & 89 deletions CHANGELOG.md

Large diffs are not rendered by default.

325 changes: 308 additions & 17 deletions integration/typegen-test.ts

Large diffs are not rendered by default.

166 changes: 99 additions & 67 deletions integration/vite-dotenv-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,32 @@ import { test, expect } from "@playwright/test";
import getPort from "get-port";

import {
type TemplateName,
createProject,
customDev,
EXPRESS_SERVER,
viteConfig,
} from "./helpers/vite.js";

let getFiles = async ({ envDir, port }: { envDir?: string; port: number }) => {
const templateNames = [
"vite-5-template",
"rsc-vite-framework",
] as const satisfies TemplateName[];

let getFiles = async ({
templateName,
envDir,
port,
}: {
templateName: TemplateName;
envDir?: string;
port: number;
}) => {
let envPath = `${envDir ? `${envDir}/` : ""}.env`;

return {
"vite.config.js": await viteConfig.basic({ port, envDir }),
"server.mjs": EXPRESS_SERVER({ port }),
"vite.config.js": await viteConfig.basic({ templateName, port, envDir }),
"server.mjs": EXPRESS_SERVER({ port, templateName }),
[envPath]: `
ENV_VAR_FROM_DOTENV_FILE=Content from ${envPath} file
`,
Expand Down Expand Up @@ -49,72 +63,90 @@ let getFiles = async ({ envDir, port }: { envDir?: string; port: number }) => {
};

test.describe("Vite .env", () => {
test.describe("defaults", async () => {
let port: number;
let cwd: string;
let stop: () => void;

test.beforeAll(async () => {
port = await getPort();
cwd = await createProject(await getFiles({ port }));
stop = await customDev({ cwd, port });
});
test.afterAll(() => stop());

test("express", async ({ page }) => {
let pageErrors: unknown[] = [];
page.on("pageerror", (error) => pageErrors.push(error));

await page.goto(`http://localhost:${port}/dotenv`, {
waitUntil: "networkidle",
for (const templateName of templateNames) {
test.describe(`template: ${templateName}`, () => {
test.describe("defaults", async () => {
let port: number;
let cwd: string;
let stop: () => void;

test.beforeAll(async () => {
port = await getPort();
cwd = await createProject(
await getFiles({ port, templateName }),
templateName,
);
stop = await customDev({ cwd, port });
});
test.afterAll(() => stop());

test("express", async ({ page }) => {
let pageErrors: unknown[] = [];
page.on("pageerror", (error) => pageErrors.push(error));

await page.goto(`http://localhost:${port}/dotenv`, {
waitUntil: "networkidle",
});
expect(pageErrors).toEqual([]);

let loaderContent = page.locator(
"[data-dotenv-route-loader-content]",
);
await expect(loaderContent).toHaveText("Content from .env file");

let clientContent = page.locator(
"[data-dotenv-route-client-content]",
);
await expect(clientContent).toHaveText(
"process.env.ENV_VAR_FROM_DOTENV_FILE not available on the client, which is a good thing",
);

expect(pageErrors).toEqual([]);
});
});
expect(pageErrors).toEqual([]);

let loaderContent = page.locator("[data-dotenv-route-loader-content]");
await expect(loaderContent).toHaveText("Content from .env file");

let clientContent = page.locator("[data-dotenv-route-client-content]");
await expect(clientContent).toHaveText(
"process.env.ENV_VAR_FROM_DOTENV_FILE not available on the client, which is a good thing",
);

expect(pageErrors).toEqual([]);
});
});

test.describe("custom env dir", async () => {
let port: number;
let cwd: string;
let stop: () => void;

test.beforeAll(async () => {
const envDir = "custom-env-dir";
port = await getPort();
cwd = await createProject(await getFiles({ envDir, port }));
stop = await customDev({ cwd, port });
});
test.afterAll(() => stop());

test("express", async ({ page }) => {
let pageErrors: unknown[] = [];
page.on("pageerror", (error) => pageErrors.push(error));

await page.goto(`http://localhost:${port}/dotenv`, {
waitUntil: "networkidle",
test.describe("custom env dir", async () => {
let port: number;
let cwd: string;
let stop: () => void;

test.beforeAll(async () => {
const envDir = "custom-env-dir";
port = await getPort();
cwd = await createProject(
await getFiles({ envDir, port, templateName }),
templateName,
);
stop = await customDev({ cwd, port });
});
test.afterAll(() => stop());

test("express", async ({ page }) => {
let pageErrors: unknown[] = [];
page.on("pageerror", (error) => pageErrors.push(error));

await page.goto(`http://localhost:${port}/dotenv`, {
waitUntil: "networkidle",
});
expect(pageErrors).toEqual([]);

let loaderContent = page.locator(
"[data-dotenv-route-loader-content]",
);
await expect(loaderContent).toHaveText(
"Content from custom-env-dir/.env file",
);

let clientContent = page.locator(
"[data-dotenv-route-client-content]",
);
await expect(clientContent).toHaveText(
"process.env.ENV_VAR_FROM_DOTENV_FILE not available on the client, which is a good thing",
);

expect(pageErrors).toEqual([]);
});
});
expect(pageErrors).toEqual([]);

let loaderContent = page.locator("[data-dotenv-route-loader-content]");
await expect(loaderContent).toHaveText(
"Content from custom-env-dir/.env file",
);

let clientContent = page.locator("[data-dotenv-route-client-content]");
await expect(clientContent).toHaveText(
"process.env.ENV_VAR_FROM_DOTENV_FILE not available on the client, which is a good thing",
);

expect(pageErrors).toEqual([]);
});
});
}
});
4 changes: 4 additions & 0 deletions packages/create-react-router/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# `create-react-router`

## 7.9.1

_No changes_

## 7.9.0

_No changes_
Expand Down
2 changes: 1 addition & 1 deletion packages/create-react-router/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "create-react-router",
"version": "7.9.0",
"version": "7.9.1",
"description": "Create a new React Router app",
"homepage": "https://reactrouter.com",
"bugs": {
Expand Down
8 changes: 8 additions & 0 deletions packages/react-router-architect/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# `@react-router/architect`

## 7.9.1

### Patch Changes

- Updated dependencies:
- `react-router@7.9.1`
- `@react-router/node@7.9.1`

## 7.9.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/react-router-architect/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@react-router/architect",
"version": "7.9.0",
"version": "7.9.1",
"description": "Architect server request handler for React Router",
"bugs": {
"url": "https://github.com/remix-run/react-router/issues"
Expand Down
7 changes: 7 additions & 0 deletions packages/react-router-cloudflare/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# `@react-router/cloudflare`

## 7.9.1

### Patch Changes

- Updated dependencies:
- `react-router@7.9.1`

## 7.9.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/react-router-cloudflare/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@react-router/cloudflare",
"version": "7.9.0",
"version": "7.9.1",
"description": "Cloudflare platform abstractions for React Router",
"bugs": {
"url": "https://github.com/remix-run/react-router/issues"
Expand Down
10 changes: 10 additions & 0 deletions packages/react-router-dev/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# `@react-router/dev`

## 7.9.1

### Patch Changes

- Fix internal `Future` interface naming from `middleware` -> `v8_middleware` ([#14327](https://github.com/remix-run/react-router/pull/14327))
- Updated dependencies:
- `react-router@7.9.1`
- `@react-router/node@7.9.1`
- `@react-router/serve@7.9.1`

## 7.9.0

### Minor Changes
Expand Down
10 changes: 10 additions & 0 deletions packages/react-router-dev/cli/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,13 +247,22 @@ export async function typegen(
) {
root = resolveRootDirectory(root, flags);

const rsc = await hasReactRouterRscPlugin({
root,
viteBuildOptions: {
config: flags.config,
mode: flags.mode,
},
});

if (flags.watch) {
await preloadVite();
const vite = getVite();
const logger = vite.createLogger("info", { prefix: "[react-router]" });

await Typegen.watch(root, {
mode: flags.mode ?? "development",
rsc,
logger,
});
await new Promise(() => {}); // keep alive
Expand All @@ -262,5 +271,6 @@ export async function typegen(

await Typegen.run(root, {
mode: flags.mode ?? "production",
rsc,
});
}
12 changes: 7 additions & 5 deletions packages/react-router-dev/config/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,8 @@ type Result<T> =
error: string;
};

type ConfigResult = Result<ResolvedReactRouterConfig>;

function ok<T>(value: T): Result<T> {
return { ok: true, value };
}
Expand All @@ -365,7 +367,7 @@ async function resolveConfig({
reactRouterConfigFile?: string;
skipRoutes?: boolean;
validateConfig?: ValidateConfigFunction;
}): Promise<Result<ResolvedReactRouterConfig>> {
}): Promise<ConfigResult> {
let reactRouterUserConfig: ReactRouterConfig = {};

if (reactRouterConfigFile) {
Expand Down Expand Up @@ -506,7 +508,7 @@ async function resolveConfig({
let appDirectory = Path.resolve(root, userAppDirectory || "app");
let buildDirectory = Path.resolve(root, userBuildDirectory);

let rootRouteFile = findEntry(appDirectory, "root");
let rootRouteFile = findEntry(appDirectory, "root", { absolute: true });
if (!rootRouteFile) {
let rootRouteDisplayPath = Path.relative(
root,
Expand Down Expand Up @@ -556,7 +558,7 @@ async function resolveConfig({
{
id: "root",
path: "",
file: rootRouteFile,
file: Path.relative(appDirectory, rootRouteFile),
children: result.routeConfig,
},
];
Expand Down Expand Up @@ -622,7 +624,7 @@ async function resolveConfig({
type ChokidarEventName = ChokidarEmitArgs[0];

type ChangeHandler = (args: {
result: Result<ResolvedReactRouterConfig>;
result: ConfigResult;
configCodeChanged: boolean;
routeConfigCodeChanged: boolean;
configChanged: boolean;
Expand All @@ -632,7 +634,7 @@ type ChangeHandler = (args: {
}) => void;

export type ConfigLoader = {
getConfig: () => Promise<Result<ResolvedReactRouterConfig>>;
getConfig: () => Promise<ConfigResult>;
onChange: (handler: ChangeHandler) => () => void;
close: () => Promise<void>;
};
Expand Down
2 changes: 1 addition & 1 deletion packages/react-router-dev/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@react-router/dev",
"version": "7.9.0",
"version": "7.9.1",
"description": "Dev tools and CLI for React Router",
"homepage": "https://reactrouter.com",
"bugs": {
Expand Down
4 changes: 4 additions & 0 deletions packages/react-router-dev/typegen/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,19 @@ export type Context = {
rootDirectory: string;
configLoader: ConfigLoader;
config: ResolvedReactRouterConfig;
rsc: boolean;
};

export async function createContext({
rootDirectory,
watch,
mode,
rsc,
}: {
rootDirectory: string;
watch: boolean;
mode: string;
rsc: boolean;
}): Promise<Context> {
const configLoader = await createConfigLoader({ rootDirectory, mode, watch });
const configResult = await configLoader.getConfig();
Expand All @@ -32,5 +35,6 @@ export async function createContext({
configLoader,
rootDirectory,
config,
rsc,
};
}
Loading