diff --git a/decisions/0014-context-middleware.md b/decisions/0014-context-middleware.md index 10dd5db633..4609256ab2 100644 --- a/decisions/0014-context-middleware.md +++ b/decisions/0014-context-middleware.md @@ -17,7 +17,7 @@ We've done a lot of work since then to get us to a place where we could ship a m - Shipped [Single Fetch][single-fetch] - Shipped [`dataStrategy`][data-strategy] for DIY middleware in React Router SPAs -- Iterated on middleware/context APIs in the [Remix the Web][remix-the-web] project +- Iterated on middleware/context APIs in the [Remix 3][remix-3] project - Developed a non-invasive type-safe + composable [context][async-provider] API ## Decision @@ -276,5 +276,5 @@ If `clientLoaders` do call `serverLoaders` it gets trickier since they make indi [client-context]: https://github.com/remix-run/react-router/discussions/9856 [single-fetch]: https://remix.run/docs/en/main/guides/single-fetch [data-strategy]: https://reactrouter.com/v6/routers/create-browser-router#optsdatastrategy -[remix-the-web]: https://github.com/mjackson/remix-the-web +[remix-3]: https://github.com/remix-run/remix/tree/v3 [async-provider]: https://github.com/ryanflorence/async-provider diff --git a/docs/how-to/file-uploads.md b/docs/how-to/file-uploads.md index cb463a1648..85d3ea49f1 100644 --- a/docs/how-to/file-uploads.md +++ b/docs/how-to/file-uploads.md @@ -9,8 +9,6 @@ title: File Uploads

-Handle file uploads in your React Router applications. This guide uses some packages from the [Remix The Web][remix-the-web] project to make file uploads easier. - _Thank you to David Adams for [writing an original guide](https://programmingarehard.com/2024/09/06/remix-file-uploads-updated.html/) on which this doc is based. You can refer to it for even more examples._ ## Basic File Upload @@ -38,7 +36,7 @@ export default [ `form-data-parser` is a wrapper around `request.formData()` that provides streaming support for handling file uploads. ```shellscript -npm i @mjackson/form-data-parser +npm i @remix-run/form-data-parser ``` [See the `form-data-parser` docs for more information][form-data-parser] @@ -57,11 +55,13 @@ You must set the form's `enctype` to `multipart/form-data` for file uploads to w import { type FileUpload, parseFormData, -} from "@mjackson/form-data-parser"; +} from "@remix-run/form-data-parser"; + +import type { Route } from "./+types/user-profile"; export async function action({ request, -}: ActionFunctionArgs) { +}: Route.ActionArgs) { const uploadHandler = async (fileUpload: FileUpload) => { if (fileUpload.fieldName === "avatar") { // process the upload and return a File @@ -93,7 +93,7 @@ export default function Component() { `file-storage` is a key/value interface for storing [File objects][file] in JavaScript. Similar to how `localStorage` allows you to store key/value pairs of strings in the browser, file-storage allows you to store key/value pairs of files on the server. ```shellscript -npm i @mjackson/file-storage +npm i @remix-run/file-storage ``` [See the `file-storage` docs for more information][file-storage] @@ -103,7 +103,7 @@ npm i @mjackson/file-storage Create a file that exports a `LocalFileStorage` instance to be used by different routes. ```ts filename=avatar-storage.server.ts -import { LocalFileStorage } from "@mjackson/file-storage/local"; +import { LocalFileStorage } from "@remix-run/file-storage/local"; export const fileStorage = new LocalFileStorage( "./uploads/avatars", @@ -122,7 +122,7 @@ Update the form's `action` to store files in the `fileStorage` instance. import { type FileUpload, parseFormData, -} from "@mjackson/form-data-parser"; +} from "@remix-run/form-data-parser"; import { fileStorage, getStorageKey, @@ -212,8 +212,7 @@ export async function loader({ params }: Route.LoaderArgs) { } ``` -[remix-the-web]: https://github.com/mjackson/remix-the-web -[form-data-parser]: https://github.com/mjackson/remix-the-web/tree/main/packages/form-data-parser -[file-storage]: https://github.com/mjackson/remix-the-web/tree/main/packages/file-storage +[form-data-parser]: https://www.npmjs.com/package/@remix-run/form-data-parser +[file-storage]: https://www.npmjs.com/package/@remix-run/file-storage [file]: https://developer.mozilla.org/en-US/docs/Web/API/File [resource-route]: ../how-to/resource-routes diff --git a/docs/how-to/react-server-components.md b/docs/how-to/react-server-components.md index 19727de247..ab256ce0fd 100644 --- a/docs/how-to/react-server-components.md +++ b/docs/how-to/react-server-components.md @@ -256,7 +256,7 @@ The following naming conventions have been chosen for familiarity and simplicity See the relevant bundler documentation below for specific code examples for each of the following entry points. -These examples all use [express][express] and [@mjackson/node-fetch-server][node-fetch-server] for the server and request handling. +These examples all use [express][express] and [@remix-run/node-fetch-server][node-fetch-server] for the server and request handling. **Routes** @@ -332,7 +332,7 @@ To configure Parcel, add the following to your `package.json`: "source": "src/entry.rsc.tsx", "scopeHoist": false, "includeNodeModules": { - "@mjackson/node-fetch-server": false, + "@remix-run/node-fetch-server": false, "compression": false, "express": false } @@ -425,7 +425,7 @@ export async function generateHTML( The following is a simplified example of a Parcel RSC Server. ```tsx filename=src/entry.rsc.tsx -import { createRequestListener } from "@mjackson/node-fetch-server"; +import { createRequestListener } from "@remix-run/node-fetch-server"; import express from "express"; import { unstable_matchRSCServerRequest as matchRSCServerRequest } from "react-router"; import { @@ -781,6 +781,6 @@ createFromReadableStream( [get-rsc-stream]: ../api/rsc/getRSCStream [rsc-hydrated-router]: ../api/rsc/RSCHydratedRouter [express]: https://expressjs.com/ -[node-fetch-server]: https://github.com/mjackson/remix-the-web/tree/main/packages/node-fetch-server +[node-fetch-server]: https://www.npmjs.com/package/@remix-run/node-fetch-server [parcel-rsc-template]: https://github.com/remix-run/react-router-templates/tree/main/unstable_rsc-parcel [vite-rsc-template]: https://github.com/remix-run/react-router-templates/tree/main/unstable_rsc-vite diff --git a/integration/helpers/rsc-parcel-framework/package.json b/integration/helpers/rsc-parcel-framework/package.json index a17de0ed03..d93d577de1 100644 --- a/integration/helpers/rsc-parcel-framework/package.json +++ b/integration/helpers/rsc-parcel-framework/package.json @@ -33,8 +33,8 @@ "typescript": "^5.1.6" }, "dependencies": { - "@mjackson/node-fetch-server": "0.6.1", "@parcel/runtime-rsc": "2.15.0", + "@remix-run/node-fetch-server": "^0.8.0", "cross-env": "^7.0.3", "express": "^4.21.2", "react": "^19.0.0", diff --git a/integration/helpers/rsc-parcel-framework/start.js b/integration/helpers/rsc-parcel-framework/start.js index 8ebd27db0f..74a552dd84 100644 --- a/integration/helpers/rsc-parcel-framework/start.js +++ b/integration/helpers/rsc-parcel-framework/start.js @@ -1,4 +1,4 @@ -const { createRequestListener } = require("@mjackson/node-fetch-server"); +const { createRequestListener } = require("@remix-run/node-fetch-server"); const express = require("express"); const reactRouterRequestHandler = require("./build/server/index.js").requestHandler; diff --git a/integration/helpers/rsc-parcel/package.json b/integration/helpers/rsc-parcel/package.json index 0b5c2eecac..d601bfec57 100644 --- a/integration/helpers/rsc-parcel/package.json +++ b/integration/helpers/rsc-parcel/package.json @@ -37,8 +37,8 @@ "url": "^0.11.0" }, "dependencies": { - "@mjackson/node-fetch-server": "0.6.1", "@parcel/runtime-rsc": "2.15.0", + "@remix-run/node-fetch-server": "^0.8.0", "cross-env": "^7.0.3", "express": "^4.21.2", "react": "^19.1.0", diff --git a/integration/helpers/rsc-parcel/src/server.tsx b/integration/helpers/rsc-parcel/src/server.tsx index a5684ffd7f..8817b6af3f 100644 --- a/integration/helpers/rsc-parcel/src/server.tsx +++ b/integration/helpers/rsc-parcel/src/server.tsx @@ -1,5 +1,5 @@ import { parseArgs } from "node:util"; -import { createRequestListener } from "@mjackson/node-fetch-server"; +import { createRequestListener } from "@remix-run/node-fetch-server"; import express from "express"; import { unstable_matchRSCServerRequest as matchRSCServerRequest } from "react-router"; import { diff --git a/integration/helpers/rsc-vite-framework/package.json b/integration/helpers/rsc-vite-framework/package.json index b9b7c715e7..ef3538d298 100644 --- a/integration/helpers/rsc-vite-framework/package.json +++ b/integration/helpers/rsc-vite-framework/package.json @@ -25,7 +25,7 @@ "vite-tsconfig-paths": "^4.2.1" }, "dependencies": { - "@mjackson/node-fetch-server": "0.6.1", + "@remix-run/node-fetch-server": "^0.8.0", "compression": "^1.8.0", "express": "^4.21.2", "react": "^19.0.0", diff --git a/integration/helpers/rsc-vite-framework/start.js b/integration/helpers/rsc-vite-framework/start.js index 91b7c93a3b..ee69fab674 100644 --- a/integration/helpers/rsc-vite-framework/start.js +++ b/integration/helpers/rsc-vite-framework/start.js @@ -1,4 +1,4 @@ -import { createRequestListener } from "@mjackson/node-fetch-server"; +import { createRequestListener } from "@remix-run/node-fetch-server"; import express from "express"; import reactRouterRequestHandler from "./build/server/index.js"; diff --git a/integration/helpers/rsc-vite/package.json b/integration/helpers/rsc-vite/package.json index 9058d98848..b08ee9db59 100644 --- a/integration/helpers/rsc-vite/package.json +++ b/integration/helpers/rsc-vite/package.json @@ -20,7 +20,7 @@ "vite": "^6.2.0" }, "dependencies": { - "@mjackson/node-fetch-server": "0.6.1", + "@remix-run/node-fetch-server": "^0.8.0", "compression": "^1.8.0", "cross-env": "^7.0.3", "express": "^4.21.2", diff --git a/integration/helpers/rsc-vite/server.js b/integration/helpers/rsc-vite/server.js index c897acd7ad..a572da1ec0 100644 --- a/integration/helpers/rsc-vite/server.js +++ b/integration/helpers/rsc-vite/server.js @@ -1,5 +1,5 @@ import { parseArgs } from "node:util"; -import { createRequestListener } from "@mjackson/node-fetch-server"; +import { createRequestListener } from "@remix-run/node-fetch-server"; import compression from "compression"; import express from "express"; diff --git a/packages/react-router-node/package.json b/packages/react-router-node/package.json index 0781217383..8a2ddd4d15 100644 --- a/packages/react-router-node/package.json +++ b/packages/react-router-node/package.json @@ -50,7 +50,7 @@ } }, "dependencies": { - "@mjackson/node-fetch-server": "^0.2.0" + "@remix-run/node-fetch-server": "^0.8.0" }, "devDependencies": { "react-router": "workspace:*", diff --git a/packages/react-router-node/server.ts b/packages/react-router-node/server.ts index 6038db0229..aabd9fd579 100644 --- a/packages/react-router-node/server.ts +++ b/packages/react-router-node/server.ts @@ -1,5 +1,7 @@ import type { RequestListener } from "node:http"; +import type { ClientAddress } from "@remix-run/node-fetch-server"; +import { createRequestListener as createRequestListener_ } from "@remix-run/node-fetch-server"; import type { AppLoadContext, ServerBuild, @@ -7,8 +9,6 @@ import type { unstable_RouterContextProvider, } from "react-router"; import { createRequestHandler } from "react-router"; -import type { ClientAddress } from "@mjackson/node-fetch-server"; -import { createRequestListener as createRequestListener_ } from "@mjackson/node-fetch-server"; type MaybePromise = T | Promise; diff --git a/playground/rsc-parcel-framework/package.json b/playground/rsc-parcel-framework/package.json index f306209a99..e774b6cac4 100644 --- a/playground/rsc-parcel-framework/package.json +++ b/playground/rsc-parcel-framework/package.json @@ -31,8 +31,8 @@ "parcel-config-react-router-experimental": "1.0.25" }, "dependencies": { - "@mjackson/node-fetch-server": "0.6.1", "@parcel/runtime-rsc": "2.15.0", + "@remix-run/node-fetch-server": "^0.8.0", "express": "^4.21.2", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/playground/rsc-parcel/package.json b/playground/rsc-parcel/package.json index 8b4ba155b9..096310e842 100644 --- a/playground/rsc-parcel/package.json +++ b/playground/rsc-parcel/package.json @@ -37,8 +37,8 @@ "url": "^0.11.0" }, "dependencies": { - "@mjackson/node-fetch-server": "0.6.1", "@parcel/runtime-rsc": "2.15.0", + "@remix-run/node-fetch-server": "^0.8.0", "express": "^4.21.2", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/playground/rsc-parcel/src/entry.ssr.tsx b/playground/rsc-parcel/src/entry.ssr.tsx index 56df53c587..395a24df90 100644 --- a/playground/rsc-parcel/src/entry.ssr.tsx +++ b/playground/rsc-parcel/src/entry.ssr.tsx @@ -1,4 +1,4 @@ -import { createRequestListener } from "@mjackson/node-fetch-server"; +import { createRequestListener } from "@remix-run/node-fetch-server"; import express from "express"; // @ts-expect-error - no types import { renderToReadableStream as renderHTMLToReadableStream } from "react-dom/server.edge" assert { env: "react-client" }; @@ -28,11 +28,11 @@ app.use( bootstrapScriptContent: ( fetchServer as unknown as { bootstrapScript: string } ).bootstrapScript, - } + }, ); }, }); - }) + }), ); const server = app.listen(3000); diff --git a/playground/rsc-vite-framework/package.json b/playground/rsc-vite-framework/package.json index c93a32839a..71c076c905 100644 --- a/playground/rsc-vite-framework/package.json +++ b/playground/rsc-vite-framework/package.json @@ -23,7 +23,7 @@ "vite": "^6.2.0" }, "dependencies": { - "@mjackson/node-fetch-server": "0.6.1", + "@remix-run/node-fetch-server": "^0.8.0", "compression": "^1.8.0", "express": "^4.21.2", "react": "^19.0.0", diff --git a/playground/rsc-vite-framework/start.js b/playground/rsc-vite-framework/start.js index 91b7c93a3b..ee69fab674 100644 --- a/playground/rsc-vite-framework/start.js +++ b/playground/rsc-vite-framework/start.js @@ -1,4 +1,4 @@ -import { createRequestListener } from "@mjackson/node-fetch-server"; +import { createRequestListener } from "@remix-run/node-fetch-server"; import express from "express"; import reactRouterRequestHandler from "./build/server/index.js"; diff --git a/playground/rsc-vite/package.json b/playground/rsc-vite/package.json index 736990179e..6a2f4aa11b 100644 --- a/playground/rsc-vite/package.json +++ b/playground/rsc-vite/package.json @@ -21,7 +21,7 @@ "vite": "^6.2.0" }, "dependencies": { - "@mjackson/node-fetch-server": "0.6.1", + "@remix-run/node-fetch-server": "^0.8.0", "compression": "^1.8.0", "express": "^4.21.2", "react": "^19.0.0", diff --git a/playground/rsc-vite/server.js b/playground/rsc-vite/server.js index c897acd7ad..a572da1ec0 100644 --- a/playground/rsc-vite/server.js +++ b/playground/rsc-vite/server.js @@ -1,5 +1,5 @@ import { parseArgs } from "node:util"; -import { createRequestListener } from "@mjackson/node-fetch-server"; +import { createRequestListener } from "@remix-run/node-fetch-server"; import compression from "compression"; import express from "express"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 994b7704b9..66ff2181da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,7 +110,7 @@ importers: version: 7.34.1(eslint@8.57.0) eslint-plugin-react-hooks: specifier: next - version: 6.1.0-canary-19baee81-20250725(eslint@8.57.0) + version: 6.1.0-canary-be11cb5c-20250804(eslint@8.57.0) fast-glob: specifier: 3.2.11 version: 3.2.11 @@ -337,12 +337,12 @@ importers: integration/helpers/rsc-parcel: dependencies: - '@mjackson/node-fetch-server': - specifier: 0.6.1 - version: 0.6.1 '@parcel/runtime-rsc': specifier: 2.15.0 version: 2.15.0(@parcel/core@2.15.0) + '@remix-run/node-fetch-server': + specifier: ^0.8.0 + version: 0.8.0 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -413,12 +413,12 @@ importers: integration/helpers/rsc-parcel-framework: dependencies: - '@mjackson/node-fetch-server': - specifier: 0.6.1 - version: 0.6.1 '@parcel/runtime-rsc': specifier: 2.15.0 version: 2.15.0(@parcel/core@2.15.0) + '@remix-run/node-fetch-server': + specifier: ^0.8.0 + version: 0.8.0 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -474,9 +474,9 @@ importers: integration/helpers/rsc-vite: dependencies: - '@mjackson/node-fetch-server': - specifier: 0.6.1 - version: 0.6.1 + '@remix-run/node-fetch-server': + specifier: ^0.8.0 + version: 0.8.0 compression: specifier: ^1.8.0 version: 1.8.0 @@ -523,9 +523,9 @@ importers: integration/helpers/rsc-vite-framework: dependencies: - '@mjackson/node-fetch-server': - specifier: 0.6.1 - version: 0.6.1 + '@remix-run/node-fetch-server': + specifier: ^0.8.0 + version: 0.8.0 compression: specifier: ^1.8.0 version: 1.8.0 @@ -1325,9 +1325,9 @@ importers: packages/react-router-node: dependencies: - '@mjackson/node-fetch-server': - specifier: ^0.2.0 - version: 0.2.0 + '@remix-run/node-fetch-server': + specifier: ^0.8.0 + version: 0.8.0 devDependencies: react-router: specifier: workspace:* @@ -1742,12 +1742,12 @@ importers: playground/rsc-parcel: dependencies: - '@mjackson/node-fetch-server': - specifier: 0.6.1 - version: 0.6.1 '@parcel/runtime-rsc': specifier: 2.15.0 version: 2.15.0(@parcel/core@2.15.0) + '@remix-run/node-fetch-server': + specifier: ^0.8.0 + version: 0.8.0 express: specifier: ^4.21.2 version: 4.21.2 @@ -1815,12 +1815,12 @@ importers: playground/rsc-parcel-framework: dependencies: - '@mjackson/node-fetch-server': - specifier: 0.6.1 - version: 0.6.1 '@parcel/runtime-rsc': specifier: 2.15.0 version: 2.15.0(@parcel/core@2.15.0) + '@remix-run/node-fetch-server': + specifier: ^0.8.0 + version: 0.8.0 express: specifier: ^4.21.2 version: 4.21.2 @@ -1870,9 +1870,9 @@ importers: playground/rsc-vite: dependencies: - '@mjackson/node-fetch-server': - specifier: 0.6.1 - version: 0.6.1 + '@remix-run/node-fetch-server': + specifier: ^0.8.0 + version: 0.8.0 compression: specifier: ^1.8.0 version: 1.8.0 @@ -1919,9 +1919,9 @@ importers: playground/rsc-vite-framework: dependencies: - '@mjackson/node-fetch-server': - specifier: 0.6.1 - version: 0.6.1 + '@remix-run/node-fetch-server': + specifier: ^0.8.0 + version: 0.8.0 compression: specifier: ^1.8.0 version: 1.8.0 @@ -3800,9 +3800,6 @@ packages: resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} engines: {node: '>=12.0.0'} - '@mjackson/node-fetch-server@0.2.0': - resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==} - '@mjackson/node-fetch-server@0.6.1': resolution: {integrity: sha512-9ZJnk/DJjt805uv5PPv11haJIW+HHf3YEEyVXv+8iLQxLD/iXA68FH220XoiTPBC4gCg5q+IMadDw8qPqlA5wg==} @@ -4402,6 +4399,9 @@ packages: '@remix-run/changelog-github@0.0.5': resolution: {integrity: sha512-43tqwUqWqirbv6D9uzo55ASPsCJ61Ein1k/M8qn+Qpros0MmbmuzjLVPmtaxfxfe2ANX0LefLvCD0pAgr1tp4g==} + '@remix-run/node-fetch-server@0.8.0': + resolution: {integrity: sha512-8/sKegb4HrM6IdcQeU0KPhj9VOHm5SUqswJDHuMCS3mwbr/NRx078QDbySmn0xslahvvZoOENd7EnK40kWKxkg==} + '@remix-run/web-blob@3.1.0': resolution: {integrity: sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==} @@ -6375,8 +6375,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react-hooks@6.1.0-canary-19baee81-20250725: - resolution: {integrity: sha512-ryYWKqWvR3I/nRITbbupJxlajWqK8CthGw1yMomw5BUfAVb0MpqD2b2fk7ZmCqQDpPz0I91gmqhH2/FTrjeKWQ==} + eslint-plugin-react-hooks@6.1.0-canary-be11cb5c-20250804: + resolution: {integrity: sha512-1OEkOyYzJdlfaxQzetiIeNjkAYAnrGSeT0pTgzIPowaiywcsktoiTccyThHXDML+aCYEQoghr2lqfYAVHe04ZQ==} engines: {node: '>=18'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -9181,6 +9181,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -11998,8 +11999,6 @@ snapshots: '@lezer/lr': 1.4.2 json5: 2.2.3 - '@mjackson/node-fetch-server@0.2.0': {} - '@mjackson/node-fetch-server@0.6.1': {} '@mjackson/node-fetch-server@0.7.0': {} @@ -12846,6 +12845,8 @@ snapshots: transitivePeerDependencies: - encoding + '@remix-run/node-fetch-server@0.8.0': {} + '@remix-run/web-blob@3.1.0': dependencies: '@remix-run/web-stream': 1.1.0 @@ -15264,7 +15265,7 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react-hooks@6.1.0-canary-19baee81-20250725(eslint@8.57.0): + eslint-plugin-react-hooks@6.1.0-canary-be11cb5c-20250804(eslint@8.57.0): dependencies: '@babel/core': 7.27.7 '@babel/parser': 7.27.7