Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[pull] main from remix-run:main #385

Merged
merged 15 commits into from
Jan 30, 2025
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
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ tsconfig.tsbuildinfo
/fixtures/my-remix-app
/fixtures/deno-app
/integration/playwright-report
/test-results
/integration/test-results
/uploads

.eslintcache
Expand Down
131 changes: 75 additions & 56 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,175 +13,178 @@ We manage release notes in this file instead of the paginated Github Releases Pa
<summary>Table of Contents</summary>

- [Remix Releases](#remix-releases)
- [v2.15.2](#v2152)
- [v2.15.3](#v2153)
- [Patch Changes](#patch-changes)
- [Updated Dependencies](#updated-dependencies)
- [v2.15.1](#v2151)
- [v2.15.2](#v2152)
- [Patch Changes](#patch-changes-1)
- [v2.15.0](#v2150)
- [Updated Dependencies](#updated-dependencies-1)
- [v2.15.1](#v2151)
- [Patch Changes](#patch-changes-2)
- [v2.15.0](#v2150)
- [Patch Changes](#patch-changes-3)
- [v2.14.0](#v2140)
- [Minor Changes](#minor-changes)
- [Patch Changes](#patch-changes-3)
- [Updated Dependencies](#updated-dependencies-1)
- [Patch Changes](#patch-changes-4)
- [Updated Dependencies](#updated-dependencies-2)
- [Changes by Package](#changes-by-package)
- [v2.13.1](#v2131)
- [Patch Changes](#patch-changes-4)
- [Patch Changes](#patch-changes-5)
- [v2.13.0](#v2130)
- [What's Changed](#whats-changed)
- [Stabilized APIs](#stabilized-apis)
- [Minor Changes](#minor-changes-1)
- [Patch Changes](#patch-changes-5)
- [Updated Dependencies](#updated-dependencies-2)
- [Patch Changes](#patch-changes-6)
- [Updated Dependencies](#updated-dependencies-3)
- [Changes by Package](#changes-by-package-1)
- [v2.12.1](#v2121)
- [Patch Changes](#patch-changes-6)
- [Patch Changes](#patch-changes-7)
- [Changes by Package](#changes-by-package-2)
- [v2.12.0](#v2120)
- [What's Changed](#whats-changed-1)
- [Future Flag for Automatic Dependency Optimization (unstable)](#future-flag-for-automatic-dependency-optimization-unstable)
- [Improved Single Fetch Type Safety (unstable)](#improved-single-fetch-type-safety-unstable)
- [Updates to Single Fetch Revalidation Behavior (unstable)](#updates-to-single-fetch-revalidation-behavior-unstable)
- [Minor Changes](#minor-changes-2)
- [Patch Changes](#patch-changes-7)
- [Updated Dependencies](#updated-dependencies-3)
- [Changes by Package](#changes-by-package-3)
- [v2.11.2](#v2112)
- [Patch Changes](#patch-changes-8)
- [Updated Dependencies](#updated-dependencies-4)
- [Changes by Package](#changes-by-package-3)
- [v2.11.2](#v2112)
- [Patch Changes](#patch-changes-9)
- [Updated Dependencies](#updated-dependencies-5)
- [Changes by Package](#changes-by-package-4)
- [v2.11.1](#v2111)
- [Patch Changes](#patch-changes-9)
- [Patch Changes](#patch-changes-10)
- [Changes by Package](#changes-by-package-5)
- [v2.11.0](#v2110)
- [What's Changed](#whats-changed-2)
- [Renamed `unstable_fogOfWar` future flag to `unstable_lazyRouteDiscovery` (unstable)](#renamed-unstable_fogofwar-future-flag-to-unstable_lazyroutediscovery-unstable)
- [Removed `response` stub in Single Fetch (unstable)](#removed-response-stub-in-single-fetch-unstable)
- [Minor Changes](#minor-changes-3)
- [Patch Changes](#patch-changes-10)
- [Updated Dependencies](#updated-dependencies-5)
- [Changes by Package](#changes-by-package-6)
- [v2.10.3](#v2103)
- [Patch Changes](#patch-changes-11)
- [Updated Dependencies](#updated-dependencies-6)
- [Changes by Package](#changes-by-package-6)
- [v2.10.3](#v2103)
- [Patch Changes](#patch-changes-12)
- [Updated Dependencies](#updated-dependencies-7)
- [Changes by Package](#changes-by-package-7)
- [v2.10.2](#v2102)
- [Patch Changes](#patch-changes-12)
- [Patch Changes](#patch-changes-13)
- [Changes by Package](#changes-by-package-8)
- [v2.10.1](#v2101)
- [Patch Changes](#patch-changes-13)
- [Updated Dependencies](#updated-dependencies-7)
- [Patch Changes](#patch-changes-14)
- [Updated Dependencies](#updated-dependencies-8)
- [Changes by Package](#changes-by-package-9)
- [v2.10.0](#v2100)
- [What's Changed](#whats-changed-3)
- [Lazy Route Discovery (a.k.a. "Fog of War")](#lazy-route-discovery-aka-fog-of-war)
- [Minor Changes](#minor-changes-4)
- [Patch Changes](#patch-changes-14)
- [Updated Dependencies](#updated-dependencies-8)
- [Patch Changes](#patch-changes-15)
- [Updated Dependencies](#updated-dependencies-9)
- [Changes by Package](#changes-by-package-10)
- [v2.9.2](#v292)
- [What's Changed](#whats-changed-4)
- [Updated Type-Safety for Single Fetch](#updated-type-safety-for-single-fetch)
- [Patch Changes](#patch-changes-15)
- [Updated Dependencies](#updated-dependencies-9)
- [Patch Changes](#patch-changes-16)
- [Updated Dependencies](#updated-dependencies-10)
- [Changes by Package](#changes-by-package-11)
- [v2.9.1](#v291)
- [Patch Changes](#patch-changes-16)
- [Patch Changes](#patch-changes-17)
- [Changes by Package](#changes-by-package-12)
- [v2.9.0](#v290)
- [What's Changed](#whats-changed-5)
- [Single Fetch (unstable)](#single-fetch-unstable)
- [Undici](#undici)
- [Minor Changes](#minor-changes-5)
- [Patch Changes](#patch-changes-17)
- [Updated Dependencies](#updated-dependencies-10)
- [Changes by Package](#changes-by-package-13)
- [v2.8.1](#v281)
- [Patch Changes](#patch-changes-18)
- [Updated Dependencies](#updated-dependencies-11)
- [Changes by Package](#changes-by-package-13)
- [v2.8.1](#v281)
- [Patch Changes](#patch-changes-19)
- [Updated Dependencies](#updated-dependencies-12)
- [Changes by Package](#changes-by-package-14)
- [v2.8.0](#v280)
- [Minor Changes](#minor-changes-6)
- [Patch Changes](#patch-changes-19)
- [Updated Dependencies](#updated-dependencies-12)
- [Patch Changes](#patch-changes-20)
- [Updated Dependencies](#updated-dependencies-13)
- [Changes by Package](#changes-by-package-15)
- [2.7.2](#272)
- [Patch Changes](#patch-changes-20)
- [2.7.1](#271)
- [Patch Changes](#patch-changes-21)
- [2.7.1](#271)
- [Patch Changes](#patch-changes-22)
- [v2.7.0](#v270)
- [What's Changed](#whats-changed-6)
- [Stabilized Vite Plugin](#stabilized-vite-plugin)
- [New `Layout` Export](#new-layout-export)
- [Basename support](#basename-support)
- [Cloudflare Proxy as a Vite Plugin](#cloudflare-proxy-as-a-vite-plugin)
- [Minor Changes](#minor-changes-7)
- [Patch Changes](#patch-changes-22)
- [Updated Dependencies](#updated-dependencies-13)
- [Patch Changes](#patch-changes-23)
- [Updated Dependencies](#updated-dependencies-14)
- [Changes by Package](#changes-by-package-16)
- [v2.6.0](#v260)
- [What's Changed](#whats-changed-7)
- [Unstable Vite Plugin updates](#unstable-vite-plugin-updates)
- [Minor Changes](#minor-changes-8)
- [Patch Changes](#patch-changes-23)
- [Updated Dependencies](#updated-dependencies-14)
- [Changes by Package](#changes-by-package-17)
- [v2.5.1](#v251)
- [Patch Changes](#patch-changes-24)
- [Updated Dependencies](#updated-dependencies-15)
- [Changes by Package](#changes-by-package-17)
- [v2.5.1](#v251)
- [Patch Changes](#patch-changes-25)
- [Updated Dependencies](#updated-dependencies-16)
- [Changes by Package](#changes-by-package-18)
- [v2.5.0](#v250)
- [What's Changed](#whats-changed-8)
- [SPA Mode (unstable)](#spa-mode-unstable)
- [Server Bundles (unstable)](#server-bundles-unstable)
- [Minor Changes](#minor-changes-9)
- [Patch Changes](#patch-changes-25)
- [Updated Dependencies](#updated-dependencies-16)
- [Changes by Package](#changes-by-package-19)
- [v2.4.1](#v241)
- [Patch Changes](#patch-changes-26)
- [Updated Dependencies](#updated-dependencies-17)
- [Changes by Package](#changes-by-package-19)
- [v2.4.1](#v241)
- [Patch Changes](#patch-changes-27)
- [Updated Dependencies](#updated-dependencies-18)
- [Changes by Package](#changes-by-package-20)
- [v2.4.0](#v240)
- [What's Changed](#whats-changed-9)
- [Client Data](#client-data)
- [`future.v3_relativeSplatPath`](#futurev3_relativesplatpath)
- [Vite Updates (Unstable)](#vite-updates-unstable)
- [Minor Changes](#minor-changes-10)
- [Patch Changes](#patch-changes-27)
- [Updated Dependencies](#updated-dependencies-18)
- [Changes by Package](#changes-by-package-21)
- [v2.3.1](#v231)
- [Patch Changes](#patch-changes-28)
- [Updated Dependencies](#updated-dependencies-19)
- [Changes by Package](#changes-by-package-21)
- [v2.3.1](#v231)
- [Patch Changes](#patch-changes-29)
- [Updated Dependencies](#updated-dependencies-20)
- [Changes by Package](#changes-by-package-22)
- [v2.3.0](#v230)
- [What's Changed](#whats-changed-10)
- [Stabilized `useBlocker`](#stabilized-useblocker)
- [`unstable_flushSync` API](#unstable_flushsync-api)
- [Minor Changes](#minor-changes-11)
- [Patch Changes](#patch-changes-29)
- [Updated Dependencies](#updated-dependencies-20)
- [Patch Changes](#patch-changes-30)
- [Updated Dependencies](#updated-dependencies-21)
- [Changes by Package](#changes-by-package-23)
- [v2.2.0](#v220)
- [What's Changed](#whats-changed-11)
- [Vite!](#vite)
- [New Fetcher APIs](#new-fetcher-apis)
- [Persistence Future Flag](#persistence-future-flag)
- [Minor Changes](#minor-changes-12)
- [Patch Changes](#patch-changes-30)
- [Updated Dependencies](#updated-dependencies-21)
- [Patch Changes](#patch-changes-31)
- [Updated Dependencies](#updated-dependencies-22)
- [Changes by Package](#changes-by-package-24)
- [v2.1.0](#v210)
- [What's Changed](#whats-changed-12)
- [View Transitions](#view-transitions)
- [Stable `createRemixStub`](#stable-createremixstub)
- [Minor Changes](#minor-changes-13)
- [Patch Changes](#patch-changes-31)
- [Updated Dependencies](#updated-dependencies-22)
- [Patch Changes](#patch-changes-32)
- [Updated Dependencies](#updated-dependencies-23)
- [Changes by Package](#changes-by-package-25)
- [v2.0.1](#v201)
- [Patch Changes](#patch-changes-32)
- [Patch Changes](#patch-changes-33)
- [Changes by Package 🔗](#changes-by-package-)
- [v2.0.0](#v200)
- [Breaking Changes](#breaking-changes)
Expand All @@ -193,7 +196,7 @@ We manage release notes in this file instead of the paginated Github Releases Pa
- [Breaking Type Changes](#breaking-type-changes)
- [New Features](#new-features)
- [Other Notable Changes](#other-notable-changes)
- [Updated Dependencies](#updated-dependencies-23)
- [Updated Dependencies](#updated-dependencies-24)
- [Changes by Package](#changes-by-package-26)

</details>
Expand Down Expand Up @@ -245,6 +248,22 @@ Date: YYYY-MM-DD

-->

## v2.15.3

Date: 2025-01-30

### Patch Changes

- `@remix-run/react` - Properly handle interrupted manifest requests in lazy route discovery ([#10447](https://github.com/remix-run/remix/pull/10447))
- `@remix-run/server-runtime` - Avoid duplication of `Set-Cookie` headers if also returned from `headers` ([#10424](https://github.com/remix-run/remix/pull/10424))
- `@remix-run/server-runtime` - Properly handle status codes that cannot have a body in single fetch responses (204, etc.) ([#10410](https://github.com/remix-run/remix/pull/10410))

### Updated Dependencies

- [`react-router-dom@6.29.0`](https://github.com/remix-run/react-router/releases/tag/react-router%406.29.0)

**Full Changelog**: [`v2.15.2...v2.15.3`](https://github.com/remix-run/remix/compare/remix@2.15.2...remix@2.15.3)

## v2.15.2

Date: 2024-12-20
Expand Down
62 changes: 62 additions & 0 deletions integration/fog-of-war-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1448,4 +1448,66 @@ test.describe("Fog of War", () => {
),
]);
});

test("handles interruptions from back to back navigations", async ({
page,
}) => {
let fixture = await createFixture({
config: {
future: {
v3_lazyRouteDiscovery: true,
},
},
files: {
...getFiles(),
"app/routes/a.tsx": js`
import { Link, Outlet, useLoaderData, useNavigate } from "@remix-run/react";

export function loader({ request }) {
return { message: "A LOADER" };
}

export default function Index() {
let data = useLoaderData();
let navigate = useNavigate();
return (
<>
<h1 id="a">A: {data.message}</h1>
<button data-link onClick={async () => {
navigate('/a/b');
setTimeout(() => navigate('/a/b'), 0)
}}>
/a/b
</button>
<Outlet/>
</>
)
}
`,
},
});
let appFixture = await createAppFixture(fixture);
let app = new PlaywrightFixture(appFixture, page);

await app.goto("/a", true);
expect(
await page.evaluate(() =>
Object.keys((window as any).__remixManifest.routes)
)
).toEqual(["root", "routes/a", "routes/_index"]);

// /a/b gets discovered on click
await app.clickElement("[data-link]");
await new Promise((resolve) => setTimeout(resolve, 1000));
expect(await (await page.$("body"))?.textContent()).not.toContain(
"Not Found"
);
await page.waitForSelector("#b");

expect(
await page.evaluate(() =>
Object.keys((window as any).__remixManifest.routes)
)
).toEqual(["root", "routes/a", "routes/_index", "routes/a.b"]);
});
});
50 changes: 50 additions & 0 deletions integration/headers-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -418,4 +418,54 @@ test.describe("headers export", () => {
])
);
});

test("does not duplicate set-cookie headers also returned via headers() function", async () => {
let fixture = await createFixture(
{
files: {
"app/root.tsx": js`
import { Links, Meta, Outlet, Scripts } from "@remix-run/react";
export default function Root() {
return (
<html lang="en">
<head>
<Meta />
<Links />
</head>
<body>
<Outlet />
<Scripts />
</body>
</html>
);
}
`,

"app/routes/_index.tsx": js`
export function headers({ loaderHeaders }) {
return loaderHeaders;
}
export function loader() {
return new Response(null, {
headers: {
"X-Test": "value",
"Set-Cookie": "cookie=yum"
}
})
}
export default function Index() {
return <div>Heyo!</div>
}
`,
},
},
ServerMode.Test
);
let response = await fixture.requestDocument("/");
expect([...response.headers.entries()]).toEqual([
["content-type", "text/html"],
["set-cookie", "cookie=yum"],
["x-test", "value"],
]);
});
});
Loading