From 1454b97eb42de8975b970888e1de93c6701ef25b Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 11 Sep 2024 16:11:12 -0400 Subject: [PATCH 1/4] Update to RR experimental --- integration/package.json | 2 +- packages/remix-dev/package.json | 2 +- packages/remix-react/package.json | 6 +-- packages/remix-server-runtime/package.json | 2 +- packages/remix-testing/package.json | 4 +- pnpm-lock.yaml | 50 +++++++++++----------- 6 files changed, 33 insertions(+), 33 deletions(-) diff --git a/integration/package.json b/integration/package.json index bd94ebf2813..8479c0c3d7a 100644 --- a/integration/package.json +++ b/integration/package.json @@ -14,7 +14,7 @@ "@remix-run/dev": "workspace:*", "@remix-run/express": "workspace:*", "@remix-run/node": "workspace:*", - "@remix-run/router": "1.19.2", + "@remix-run/router": "0.0.0-experimental-819a53c77", "@remix-run/server-runtime": "workspace:*", "@types/express": "^4.17.9", "@vanilla-extract/css": "^1.10.0", diff --git a/packages/remix-dev/package.json b/packages/remix-dev/package.json index 81a939b29d6..2bd4fbdc30e 100644 --- a/packages/remix-dev/package.json +++ b/packages/remix-dev/package.json @@ -32,7 +32,7 @@ "@mdx-js/mdx": "^2.3.0", "@npmcli/package-json": "^4.0.1", "@remix-run/node": "workspace:*", - "@remix-run/router": "1.19.2", + "@remix-run/router": "0.0.0-experimental-819a53c77", "@remix-run/server-runtime": "workspace:*", "@types/mdx": "^2.0.5", "@vanilla-extract/integration": "^6.2.0", diff --git a/packages/remix-react/package.json b/packages/remix-react/package.json index 798318f9438..8d3124d20cc 100644 --- a/packages/remix-react/package.json +++ b/packages/remix-react/package.json @@ -19,10 +19,10 @@ "tsc": "tsc" }, "dependencies": { - "@remix-run/router": "1.19.2", + "@remix-run/router": "0.0.0-experimental-819a53c77", "@remix-run/server-runtime": "workspace:*", - "react-router": "6.26.2", - "react-router-dom": "6.26.2", + "react-router": "0.0.0-experimental-819a53c77", + "react-router-dom": "0.0.0-experimental-819a53c77", "turbo-stream": "2.4.0" }, "devDependencies": { diff --git a/packages/remix-server-runtime/package.json b/packages/remix-server-runtime/package.json index b7cd15393d7..5f3a2480951 100644 --- a/packages/remix-server-runtime/package.json +++ b/packages/remix-server-runtime/package.json @@ -19,7 +19,7 @@ "tsc": "tsc" }, "dependencies": { - "@remix-run/router": "1.19.2", + "@remix-run/router": "0.0.0-experimental-819a53c77", "@types/cookie": "^0.6.0", "@web3-storage/multipart-parser": "^1.0.0", "cookie": "^0.6.0", diff --git a/packages/remix-testing/package.json b/packages/remix-testing/package.json index 0bcf7bd3e6e..674c1dac843 100644 --- a/packages/remix-testing/package.json +++ b/packages/remix-testing/package.json @@ -21,8 +21,8 @@ "dependencies": { "@remix-run/node": "workspace:*", "@remix-run/react": "workspace:*", - "@remix-run/router": "1.19.2", - "react-router-dom": "6.26.2" + "@remix-run/router": "0.0.0-experimental-819a53c77", + "react-router-dom": "0.0.0-experimental-819a53c77" }, "devDependencies": { "@remix-run/server-runtime": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8be1d96c04..d156d650dab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -323,8 +323,8 @@ importers: specifier: workspace:* version: link:../packages/remix-node '@remix-run/router': - specifier: 1.19.2 - version: 1.19.2 + specifier: 0.0.0-experimental-819a53c77 + version: 0.0.0-experimental-819a53c77 '@remix-run/server-runtime': specifier: workspace:* version: link:../packages/remix-server-runtime @@ -871,8 +871,8 @@ importers: specifier: ^2.12.0 version: link:../remix-react '@remix-run/router': - specifier: 1.19.2 - version: 1.19.2 + specifier: 0.0.0-experimental-819a53c77 + version: 0.0.0-experimental-819a53c77 '@remix-run/server-runtime': specifier: workspace:* version: link:../remix-server-runtime @@ -1217,17 +1217,17 @@ importers: packages/remix-react: dependencies: '@remix-run/router': - specifier: 1.19.2 - version: 1.19.2 + specifier: 0.0.0-experimental-819a53c77 + version: 0.0.0-experimental-819a53c77 '@remix-run/server-runtime': specifier: workspace:* version: link:../remix-server-runtime react-router: - specifier: 6.26.2 - version: 6.26.2(react@18.2.0) + specifier: 0.0.0-experimental-819a53c77 + version: 0.0.0-experimental-819a53c77(react@18.2.0) react-router-dom: - specifier: 6.26.2 - version: 6.26.2(react-dom@18.2.0)(react@18.2.0) + specifier: 0.0.0-experimental-819a53c77 + version: 0.0.0-experimental-819a53c77(react-dom@18.2.0)(react@18.2.0) turbo-stream: specifier: 2.4.0 version: 2.4.0 @@ -1303,8 +1303,8 @@ importers: packages/remix-server-runtime: dependencies: '@remix-run/router': - specifier: 1.19.2 - version: 1.19.2 + specifier: 0.0.0-experimental-819a53c77 + version: 0.0.0-experimental-819a53c77 '@types/cookie': specifier: ^0.6.0 version: 0.6.0 @@ -1340,11 +1340,11 @@ importers: specifier: workspace:* version: link:../remix-react '@remix-run/router': - specifier: 1.19.2 - version: 1.19.2 + specifier: 0.0.0-experimental-819a53c77 + version: 0.0.0-experimental-819a53c77 react-router-dom: - specifier: 6.26.2 - version: 6.26.2(react-dom@18.2.0)(react@18.2.0) + specifier: 0.0.0-experimental-819a53c77 + version: 0.0.0-experimental-819a53c77(react-dom@18.2.0)(react@18.2.0) devDependencies: '@remix-run/server-runtime': specifier: workspace:* @@ -4206,8 +4206,8 @@ packages: - encoding dev: false - /@remix-run/router@1.19.2: - resolution: {integrity: sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==} + /@remix-run/router@0.0.0-experimental-819a53c77: + resolution: {integrity: sha512-0TlQxYS7Rbrl4ih75/odgRC5ZeJPHmy8AgiXcaiie5SB/8FbenqCw1rpJCP4hSes5SXfyhM/94PHGc8O3+raSQ==} engines: {node: '>=14.0.0'} dev: false @@ -12800,26 +12800,26 @@ packages: engines: {node: '>=0.10.0'} dev: false - /react-router-dom@6.26.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==} + /react-router-dom@0.0.0-experimental-819a53c77(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EgSQ/FgGMT59ynaufnjzT5oFQzYZp30sqPw4qegEKMVFNbVfHwb/SZXt3eONRh4q0kif2bSfWbQ9WmZw95/YGQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - '@remix-run/router': 1.19.2 + '@remix-run/router': 0.0.0-experimental-819a53c77 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router: 6.26.2(react@18.2.0) + react-router: 0.0.0-experimental-819a53c77(react@18.2.0) dev: false - /react-router@6.26.2(react@18.2.0): - resolution: {integrity: sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==} + /react-router@0.0.0-experimental-819a53c77(react@18.2.0): + resolution: {integrity: sha512-8gPGeJ67S0eXxokTSJzg+DecWU+WPkLsrwxZwWLge3wMcH9jX3kPKlSFeRypAfQMnsX3fxO3I1YbkHc5XkBsWA==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' dependencies: - '@remix-run/router': 1.19.2 + '@remix-run/router': 0.0.0-experimental-819a53c77 react: 18.2.0 dev: false From 2707152bc919bddd704359b9d2e846a5d2c2c8ac Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 11 Sep 2024 16:11:32 -0400 Subject: [PATCH 2/4] Proxy request.signal through in vite dev --- packages/remix-dev/vite/cloudflare-proxy-plugin.ts | 2 +- packages/remix-dev/vite/node-adapter.ts | 9 ++++++++- packages/remix-dev/vite/plugin.ts | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/remix-dev/vite/cloudflare-proxy-plugin.ts b/packages/remix-dev/vite/cloudflare-proxy-plugin.ts index 314c94cf33e..cdad892b21b 100644 --- a/packages/remix-dev/vite/cloudflare-proxy-plugin.ts +++ b/packages/remix-dev/vite/cloudflare-proxy-plugin.ts @@ -70,7 +70,7 @@ export const cloudflareDevProxyVitePlugin = ({ )) as ServerBuild; let handler = createRequestHandler(build, "development"); - let req = fromNodeRequest(nodeReq); + let req = fromNodeRequest(nodeReq, nodeRes); let loadContext = getLoadContext ? await getLoadContext({ request: req, context }) : context; diff --git a/packages/remix-dev/vite/node-adapter.ts b/packages/remix-dev/vite/node-adapter.ts index ad270a85525..2783da81778 100644 --- a/packages/remix-dev/vite/node-adapter.ts +++ b/packages/remix-dev/vite/node-adapter.ts @@ -32,7 +32,8 @@ function fromNodeHeaders(nodeHeaders: IncomingHttpHeaders): Headers { // Based on `createRemixRequest` in packages/remix-express/server.ts export function fromNodeRequest( - nodeReq: Vite.Connect.IncomingMessage + nodeReq: Vite.Connect.IncomingMessage, + nodeRes: ServerResponse ): Request { let origin = nodeReq.headers.origin && "null" !== nodeReq.headers.origin @@ -44,9 +45,15 @@ export function fromNodeRequest( "Expected `nodeReq.originalUrl` to be defined" ); let url = new URL(nodeReq.originalUrl, origin); + + // Abort action/loaders once we can no longer write a response + let controller = new AbortController(); + nodeRes.on("close", () => controller.abort()); + let init: RequestInit = { method: nodeReq.method, headers: fromNodeHeaders(nodeReq.headers), + signal: controller.signal, }; if (nodeReq.method !== "GET" && nodeReq.method !== "HEAD") { diff --git a/packages/remix-dev/vite/plugin.ts b/packages/remix-dev/vite/plugin.ts index d96d6b547cd..53ce6400b57 100644 --- a/packages/remix-dev/vite/plugin.ts +++ b/packages/remix-dev/vite/plugin.ts @@ -1382,7 +1382,7 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => { nodeReq, nodeRes ) => { - let req = fromNodeRequest(nodeReq); + let req = fromNodeRequest(nodeReq, nodeRes); let res = await handler(req, await remixDevLoadContext(req)); await toNodeRequest(res, nodeRes); }; From 6eb8bf6499fb6b7fbe72818dc7ba65350c273356 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 11 Sep 2024 16:11:58 -0400 Subject: [PATCH 3/4] Adopt stabilized single fetch/fog of war APIs --- packages/remix-react/browser.tsx | 4 ++-- packages/remix-react/fog-of-war.ts | 4 ++-- packages/remix-react/single-fetch.tsx | 14 +++++++------- packages/remix-server-runtime/single-fetch.ts | 10 +++++----- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/remix-react/browser.tsx b/packages/remix-react/browser.tsx index 39e27f11844..7ce8448b4de 100644 --- a/packages/remix-react/browser.tsx +++ b/packages/remix-react/browser.tsx @@ -303,14 +303,14 @@ export function RemixBrowser(_props: RemixBrowserProps): ReactElement { }, hydrationData, mapRouteProperties, - unstable_dataStrategy: window.__remixContext.future.unstable_singleFetch + dataStrategy: window.__remixContext.future.unstable_singleFetch ? getSingleFetchDataStrategy( window.__remixManifest, window.__remixRouteModules, () => router ) : undefined, - unstable_patchRoutesOnNavigation: getPatchRoutesOnNavigationFunction( + patchRoutesOnNavigation: getPatchRoutesOnNavigationFunction( window.__remixManifest, window.__remixRouteModules, window.__remixContext.future, diff --git a/packages/remix-react/fog-of-war.ts b/packages/remix-react/fog-of-war.ts index f2b47e48abb..83e5fb5086a 100644 --- a/packages/remix-react/fog-of-war.ts +++ b/packages/remix-react/fog-of-war.ts @@ -1,7 +1,7 @@ import type { Router } from "@remix-run/router"; import { matchRoutes } from "@remix-run/router"; import * as React from "react"; -import type { unstable_PatchRoutesOnNavigationFunction } from "react-router"; +import type { PatchRoutesOnNavigationFunction } from "react-router"; import type { AssetsManifest, FutureConfig } from "./entry"; import type { RouteModules } from "./routeModules"; @@ -70,7 +70,7 @@ export function getPatchRoutesOnNavigationFunction( future: FutureConfig, isSpaMode: boolean, basename: string | undefined -): unstable_PatchRoutesOnNavigationFunction | undefined { +): PatchRoutesOnNavigationFunction | undefined { if (!isFogOfWarEnabled(future, isSpaMode)) { return undefined; } diff --git a/packages/remix-react/single-fetch.tsx b/packages/remix-react/single-fetch.tsx index f390413fcec..9a905e7f7fb 100644 --- a/packages/remix-react/single-fetch.tsx +++ b/packages/remix-react/single-fetch.tsx @@ -1,22 +1,22 @@ import * as React from "react"; import type { - unstable_DataStrategyFunction as DataStrategyFunction, - unstable_DataStrategyResult as DataStrategyResult, - unstable_DataStrategyMatch, + DataStrategyFunction, + DataStrategyFunctionArgs, + DataStrategyResult, + DataStrategyMatch, Router as RemixRouter, } from "@remix-run/router"; import { UNSAFE_ErrorResponseImpl as ErrorResponseImpl, isRouteErrorResponse, redirect, - unstable_data, + data, } from "@remix-run/router"; import type { UNSAFE_SingleFetchResult as SingleFetchResult, UNSAFE_SingleFetchResults as SingleFetchResults, } from "@remix-run/server-runtime"; import { UNSAFE_SingleFetchRedirectSymbol as SingleFetchRedirectSymbol } from "@remix-run/server-runtime"; -import type { unstable_DataStrategyFunctionArgs as DataStrategyFunctionArgs } from "react-router-dom"; import { decode } from "turbo-stream"; import { createRequestInit, isResponse } from "./data"; @@ -175,7 +175,7 @@ async function singleFetchActionStrategy( return { [actionMatch.route.id]: { type: result.type, - result: unstable_data(result.result, actionStatus), + result: data(result.result, actionStatus), }, }; } @@ -344,7 +344,7 @@ async function singleFetchLoaderFetcherStrategy( function fetchSingleLoader( handler: Parameters< - NonNullable[0]> + NonNullable[0]> >[0], url: URL, init: RequestInit, diff --git a/packages/remix-server-runtime/single-fetch.ts b/packages/remix-server-runtime/single-fetch.ts index 222f74bb4e2..12558111e36 100644 --- a/packages/remix-server-runtime/single-fetch.ts +++ b/packages/remix-server-runtime/single-fetch.ts @@ -1,12 +1,12 @@ import type { StaticHandler, - unstable_DataStrategyFunctionArgs as DataStrategyFunctionArgs, - unstable_DataStrategyFunction as DataStrategyFunction, + DataStrategyFunctionArgs, + DataStrategyFunction, UNSAFE_DataWithResponseInit as DataWithResponseInit, } from "@remix-run/router"; import { isRouteErrorResponse, - unstable_data as routerData, + data as routerData, UNSAFE_ErrorResponseImpl as ErrorResponseImpl, stripBasename, } from "@remix-run/router"; @@ -102,7 +102,7 @@ export async function singleFetchAction( let result = await staticHandler.query(handlerRequest, { requestContext: loadContext, skipLoaderErrorBubbling: true, - unstable_dataStrategy: getSingleFetchDataStrategy({ + dataStrategy: getSingleFetchDataStrategy({ isActionDataRequest: true, }), }); @@ -190,7 +190,7 @@ export async function singleFetchLoaders( let result = await staticHandler.query(handlerRequest, { requestContext: loadContext, skipLoaderErrorBubbling: true, - unstable_dataStrategy: getSingleFetchDataStrategy({ + dataStrategy: getSingleFetchDataStrategy({ loadRouteIds, }), }); From ee1a1f9dbd5a4f71dd4a3771dafdf3f198672a1a Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 11 Sep 2024 16:32:51 -0400 Subject: [PATCH 4/4] Changeset --- .changeset/eight-dancers-allow.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/eight-dancers-allow.md diff --git a/.changeset/eight-dancers-allow.md b/.changeset/eight-dancers-allow.md new file mode 100644 index 00000000000..9a3b2afcb8c --- /dev/null +++ b/.changeset/eight-dancers-allow.md @@ -0,0 +1,5 @@ +--- +"@remix-run/react": minor +--- + +Add `fetcher.abort()`