diff --git a/CHANGELOG.md b/CHANGELOG.md
index d291b1d6733..bee61988277 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,56 +13,58 @@ We manage release notes in this file instead of the paginated GitHub Releases Pa
Table of Contents
- [Remix Releases](#remix-releases)
+ - [v2.17.1](#v2171)
+ - [Patch Changes](#patch-changes)
- [v2.17.0](#v2170)
- [Minor Changes](#minor-changes)
- [Changes by Package](#changes-by-package)
- [v2.16.8](#v2168)
- - [Patch Changes](#patch-changes)
- - [v2.16.7](#v2167)
- [Patch Changes](#patch-changes-1)
- - [v2.16.6](#v2166)
+ - [v2.16.7](#v2167)
- [Patch Changes](#patch-changes-2)
- - [v2.16.5](#v2165)
+ - [v2.16.6](#v2166)
- [Patch Changes](#patch-changes-3)
- - [v2.16.4](#v2164)
+ - [v2.16.5](#v2165)
- [Patch Changes](#patch-changes-4)
+ - [v2.16.4](#v2164)
+ - [Patch Changes](#patch-changes-5)
- [v2.16.3](#v2163)
- [Security Notice](#security-notice)
- - [Patch Changes](#patch-changes-5)
- - [v2.16.2](#v2162)
- [Patch Changes](#patch-changes-6)
- - [v2.16.1](#v2161)
+ - [v2.16.2](#v2162)
- [Patch Changes](#patch-changes-7)
+ - [v2.16.1](#v2161)
+ - [Patch Changes](#patch-changes-8)
- [v2.16.0](#v2160)
- [Minor Changes](#minor-changes-1)
- - [Patch Changes](#patch-changes-8)
+ - [Patch Changes](#patch-changes-9)
- [Updated Dependencies](#updated-dependencies)
- [v2.15.3](#v2153)
- - [Patch Changes](#patch-changes-9)
+ - [Patch Changes](#patch-changes-10)
- [Updated Dependencies](#updated-dependencies-1)
- [v2.15.2](#v2152)
- - [Patch Changes](#patch-changes-10)
+ - [Patch Changes](#patch-changes-11)
- [Updated Dependencies](#updated-dependencies-2)
- [v2.15.1](#v2151)
- - [Patch Changes](#patch-changes-11)
- - [v2.15.0](#v2150)
- [Patch Changes](#patch-changes-12)
+ - [v2.15.0](#v2150)
+ - [Patch Changes](#patch-changes-13)
- [v2.14.0](#v2140)
- [Minor Changes](#minor-changes-2)
- - [Patch Changes](#patch-changes-13)
+ - [Patch Changes](#patch-changes-14)
- [Updated Dependencies](#updated-dependencies-3)
- [Changes by Package](#changes-by-package-1)
- [v2.13.1](#v2131)
- - [Patch Changes](#patch-changes-14)
+ - [Patch Changes](#patch-changes-15)
- [v2.13.0](#v2130)
- [What's Changed](#whats-changed)
- [Stabilized APIs](#stabilized-apis)
- [Minor Changes](#minor-changes-3)
- - [Patch Changes](#patch-changes-15)
+ - [Patch Changes](#patch-changes-16)
- [Updated Dependencies](#updated-dependencies-4)
- [Changes by Package](#changes-by-package-2)
- [v2.12.1](#v2121)
- - [Patch Changes](#patch-changes-16)
+ - [Patch Changes](#patch-changes-17)
- [Changes by Package](#changes-by-package-3)
- [v2.12.0](#v2120)
- [What's Changed](#whats-changed-1)
@@ -70,72 +72,72 @@ We manage release notes in this file instead of the paginated GitHub Releases Pa
- [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-4)
- - [Patch Changes](#patch-changes-17)
+ - [Patch Changes](#patch-changes-18)
- [Updated Dependencies](#updated-dependencies-5)
- [Changes by Package](#changes-by-package-4)
- [v2.11.2](#v2112)
- - [Patch Changes](#patch-changes-18)
+ - [Patch Changes](#patch-changes-19)
- [Updated Dependencies](#updated-dependencies-6)
- [Changes by Package](#changes-by-package-5)
- [v2.11.1](#v2111)
- - [Patch Changes](#patch-changes-19)
+ - [Patch Changes](#patch-changes-20)
- [Changes by Package](#changes-by-package-6)
- [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-5)
- - [Patch Changes](#patch-changes-20)
+ - [Patch Changes](#patch-changes-21)
- [Updated Dependencies](#updated-dependencies-7)
- [Changes by Package](#changes-by-package-7)
- [v2.10.3](#v2103)
- - [Patch Changes](#patch-changes-21)
+ - [Patch Changes](#patch-changes-22)
- [Updated Dependencies](#updated-dependencies-8)
- [Changes by Package](#changes-by-package-8)
- [v2.10.2](#v2102)
- - [Patch Changes](#patch-changes-22)
+ - [Patch Changes](#patch-changes-23)
- [Changes by Package](#changes-by-package-9)
- [v2.10.1](#v2101)
- - [Patch Changes](#patch-changes-23)
+ - [Patch Changes](#patch-changes-24)
- [Updated Dependencies](#updated-dependencies-9)
- [Changes by Package](#changes-by-package-10)
- [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-6)
- - [Patch Changes](#patch-changes-24)
+ - [Patch Changes](#patch-changes-25)
- [Updated Dependencies](#updated-dependencies-10)
- [Changes by Package](#changes-by-package-11)
- [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-25)
+ - [Patch Changes](#patch-changes-26)
- [Updated Dependencies](#updated-dependencies-11)
- [Changes by Package](#changes-by-package-12)
- [v2.9.1](#v291)
- - [Patch Changes](#patch-changes-26)
+ - [Patch Changes](#patch-changes-27)
- [Changes by Package](#changes-by-package-13)
- [v2.9.0](#v290)
- [What's Changed](#whats-changed-5)
- [Single Fetch (unstable)](#single-fetch-unstable)
- [Undici](#undici)
- [Minor Changes](#minor-changes-7)
- - [Patch Changes](#patch-changes-27)
+ - [Patch Changes](#patch-changes-28)
- [Updated Dependencies](#updated-dependencies-12)
- [Changes by Package](#changes-by-package-14)
- [v2.8.1](#v281)
- - [Patch Changes](#patch-changes-28)
+ - [Patch Changes](#patch-changes-29)
- [Updated Dependencies](#updated-dependencies-13)
- [Changes by Package](#changes-by-package-15)
- [v2.8.0](#v280)
- [Minor Changes](#minor-changes-8)
- - [Patch Changes](#patch-changes-29)
+ - [Patch Changes](#patch-changes-30)
- [Updated Dependencies](#updated-dependencies-14)
- [Changes by Package](#changes-by-package-16)
- [2.7.2](#272)
- - [Patch Changes](#patch-changes-30)
- - [2.7.1](#271)
- [Patch Changes](#patch-changes-31)
+ - [2.7.1](#271)
+ - [Patch Changes](#patch-changes-32)
- [v2.7.0](#v270)
- [What's Changed](#whats-changed-6)
- [Stabilized Vite Plugin](#stabilized-vite-plugin)
@@ -143,18 +145,18 @@ We manage release notes in this file instead of the paginated GitHub Releases Pa
- [Basename support](#basename-support)
- [Cloudflare Proxy as a Vite Plugin](#cloudflare-proxy-as-a-vite-plugin)
- [Minor Changes](#minor-changes-9)
- - [Patch Changes](#patch-changes-32)
+ - [Patch Changes](#patch-changes-33)
- [Updated Dependencies](#updated-dependencies-15)
- [Changes by Package](#changes-by-package-17)
- [v2.6.0](#v260)
- [What's Changed](#whats-changed-7)
- [Unstable Vite Plugin updates](#unstable-vite-plugin-updates)
- [Minor Changes](#minor-changes-10)
- - [Patch Changes](#patch-changes-33)
+ - [Patch Changes](#patch-changes-34)
- [Updated Dependencies](#updated-dependencies-16)
- [Changes by Package](#changes-by-package-18)
- [v2.5.1](#v251)
- - [Patch Changes](#patch-changes-34)
+ - [Patch Changes](#patch-changes-35)
- [Updated Dependencies](#updated-dependencies-17)
- [Changes by Package](#changes-by-package-19)
- [v2.5.0](#v250)
@@ -162,11 +164,11 @@ We manage release notes in this file instead of the paginated GitHub Releases Pa
- [SPA Mode (unstable)](#spa-mode-unstable)
- [Server Bundles (unstable)](#server-bundles-unstable)
- [Minor Changes](#minor-changes-11)
- - [Patch Changes](#patch-changes-35)
+ - [Patch Changes](#patch-changes-36)
- [Updated Dependencies](#updated-dependencies-18)
- [Changes by Package](#changes-by-package-20)
- [v2.4.1](#v241)
- - [Patch Changes](#patch-changes-36)
+ - [Patch Changes](#patch-changes-37)
- [Updated Dependencies](#updated-dependencies-19)
- [Changes by Package](#changes-by-package-21)
- [v2.4.0](#v240)
@@ -175,11 +177,11 @@ We manage release notes in this file instead of the paginated GitHub Releases Pa
- [`future.v3_relativeSplatPath`](#futurev3_relativesplatpath)
- [Vite Updates (Unstable)](#vite-updates-unstable)
- [Minor Changes](#minor-changes-12)
- - [Patch Changes](#patch-changes-37)
+ - [Patch Changes](#patch-changes-38)
- [Updated Dependencies](#updated-dependencies-20)
- [Changes by Package](#changes-by-package-22)
- [v2.3.1](#v231)
- - [Patch Changes](#patch-changes-38)
+ - [Patch Changes](#patch-changes-39)
- [Updated Dependencies](#updated-dependencies-21)
- [Changes by Package](#changes-by-package-23)
- [v2.3.0](#v230)
@@ -187,7 +189,7 @@ We manage release notes in this file instead of the paginated GitHub Releases Pa
- [Stabilized `useBlocker`](#stabilized-useblocker)
- [`unstable_flushSync` API](#unstable_flushsync-api)
- [Minor Changes](#minor-changes-13)
- - [Patch Changes](#patch-changes-39)
+ - [Patch Changes](#patch-changes-40)
- [Updated Dependencies](#updated-dependencies-22)
- [Changes by Package](#changes-by-package-24)
- [v2.2.0](#v220)
@@ -196,7 +198,7 @@ We manage release notes in this file instead of the paginated GitHub Releases Pa
- [New Fetcher APIs](#new-fetcher-apis)
- [Persistence Future Flag](#persistence-future-flag)
- [Minor Changes](#minor-changes-14)
- - [Patch Changes](#patch-changes-40)
+ - [Patch Changes](#patch-changes-41)
- [Updated Dependencies](#updated-dependencies-23)
- [Changes by Package](#changes-by-package-25)
- [v2.1.0](#v210)
@@ -204,11 +206,11 @@ We manage release notes in this file instead of the paginated GitHub Releases Pa
- [View Transitions](#view-transitions)
- [Stable `createRemixStub`](#stable-createremixstub)
- [Minor Changes](#minor-changes-15)
- - [Patch Changes](#patch-changes-41)
+ - [Patch Changes](#patch-changes-42)
- [Updated Dependencies](#updated-dependencies-24)
- [Changes by Package](#changes-by-package-26)
- [v2.0.1](#v201)
- - [Patch Changes](#patch-changes-42)
+ - [Patch Changes](#patch-changes-43)
- [Changes by Package 🔗](#changes-by-package-)
- [v2.0.0](#v200)
- [Breaking Changes](#breaking-changes)
@@ -272,6 +274,16 @@ Date: YYYY-MM-DD
-->
+## v2.17.1
+
+Date: 2025-09-11
+
+### Patch Changes
+
+- `@remix-run/react` - Escape HTML in `meta()` JSON-LD content
+
+**Full Changelog**: [`v2.17.0...v2.17.1`](https://github.com/remix-run/remix/compare/remix@2.17.0...remix@2.17.1)
+
## v2.17.0
Date: 2025-07-25
diff --git a/integration/helpers/deno-template/server.ts b/integration/helpers/deno-template/server.ts
index a7caa47e204..36bf4670dee 100644
--- a/integration/helpers/deno-template/server.ts
+++ b/integration/helpers/deno-template/server.ts
@@ -1,3 +1,4 @@
+// deno-lint-ignore no-import-prefix
import { serve } from "https://deno.land/std@0.128.0/http/server.ts";
import { createRequestHandlerWithStaticFiles } from "@remix-run/deno";
// Import path interpreted by the Remix compiler
diff --git a/packages/remix-deno/server.ts b/packages/remix-deno/server.ts
index a9b88ebc0d5..8a91f3ad133 100644
--- a/packages/remix-deno/server.ts
+++ b/packages/remix-deno/server.ts
@@ -1,3 +1,4 @@
+// deno-lint-ignore no-import-prefix
import * as path from "https://deno.land/std@0.128.0/path/mod.ts";
import mime from "mime";
import { createRequestHandler as createRemixRequestHandler } from "@remix-run/server-runtime";
diff --git a/packages/remix-deno/sessions/fileStorage.ts b/packages/remix-deno/sessions/fileStorage.ts
index 1595b69f7b0..9bf24d41156 100644
--- a/packages/remix-deno/sessions/fileStorage.ts
+++ b/packages/remix-deno/sessions/fileStorage.ts
@@ -1,3 +1,4 @@
+// deno-lint-ignore no-import-prefix
import * as path from "https://deno.land/std@0.128.0/path/mod.ts";
import type {
diff --git a/packages/remix-react/__tests__/integration/meta-test.tsx b/packages/remix-react/__tests__/integration/meta-test.tsx
index 644bfba530e..d6f22cf6c83 100644
--- a/packages/remix-react/__tests__/integration/meta-test.tsx
+++ b/packages/remix-react/__tests__/integration/meta-test.tsx
@@ -219,6 +219,7 @@ describe("meta", () => {
postalCode: "92107",
},
email: ["sonnyday@fancymail.com", "surfergal@veryprofessional.org"],
+ bio: "A surfer & coder.",
};
let RemixStub = createRemixStub([
@@ -241,6 +242,9 @@ describe("meta", () => {
container.querySelector('script[type="application/ld+json"]')
?.innerHTML || "{}";
expect(JSON.parse(scriptTagContents)).toEqual(jsonLd);
+ expect(scriptTagContents).toContain(
+ "A \\u003cb\\u003esurfer\\u003c/b\\u003e \\u0026 \\u003cem\\u003ecoder\\u003c/em\\u003e."
+ );
});
it("{ tagName: 'link' } adds a ", () => {
diff --git a/packages/remix-react/components.tsx b/packages/remix-react/components.tsx
index 3a773fab73b..5f7ef90acae 100644
--- a/packages/remix-react/components.tsx
+++ b/packages/remix-react/components.tsx
@@ -689,7 +689,7 @@ export function Meta() {
);
} catch (err) {