@react-router/express
Advanced tools
Comparing version
166
CHANGELOG.md
@@ -1,3 +0,167 @@ | ||
# `@remix-run/express` | ||
# `@react-router/express` | ||
## 7.6.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.6.1` | ||
- `@react-router/node@7.6.1` | ||
## 7.6.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.6.0` | ||
- `@react-router/node@7.6.0` | ||
## 7.5.3 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.5.3` | ||
- `@react-router/node@7.5.3` | ||
## 7.5.2 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.5.2` | ||
- `@react-router/node@7.5.2` | ||
## 7.5.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.5.1` | ||
- `@react-router/node@7.5.1` | ||
## 7.5.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.5.0` | ||
- `@react-router/node@7.5.0` | ||
## 7.4.1 | ||
### Patch Changes | ||
- Better validation of `x-forwarded-host` header to preent potential security issues. ([#13309](https://github.com/remix-run/react-router/pull/13309)) | ||
- Updated dependencies: | ||
- `react-router@7.4.1` | ||
- `@react-router/node@7.4.1` | ||
## 7.4.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.4.0` | ||
- `@react-router/node@7.4.0` | ||
## 7.3.0 | ||
### Patch Changes | ||
- Update `express` `peerDependency` to include v5 (<https://github.com/remix-run/react-router/pull/13064>) ([#12961](https://github.com/remix-run/react-router/pull/12961)) | ||
- Updated dependencies: | ||
- `react-router@7.3.0` | ||
- `@react-router/node@7.3.0` | ||
## 7.2.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.2.0` | ||
- `@react-router/node@7.2.0` | ||
## 7.1.5 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.1.5` | ||
- `@react-router/node@7.1.5` | ||
## 7.1.4 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.1.4` | ||
- `@react-router/node@7.1.4` | ||
## 7.1.3 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.1.3` | ||
- `@react-router/node@7.1.3` | ||
## 7.1.2 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.1.2` | ||
- `@react-router/node@7.1.2` | ||
## 7.1.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.1.1` | ||
- `@react-router/node@7.1.1` | ||
## 7.1.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.1.0` | ||
- `@react-router/node@7.1.0` | ||
## 7.0.2 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.0.2` | ||
- `@react-router/node@7.0.2` | ||
## 7.0.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.0.1` | ||
- `@react-router/node@7.0.1` | ||
## 7.0.0 | ||
### Major Changes | ||
- Remove single fetch future flag. ([#11522](https://github.com/remix-run/react-router/pull/11522)) | ||
- update minimum node version to 18 ([#11690](https://github.com/remix-run/react-router/pull/11690)) | ||
- Add `exports` field to all packages ([#11675](https://github.com/remix-run/react-router/pull/11675)) | ||
- node package no longer re-exports from react-router ([#11702](https://github.com/remix-run/react-router/pull/11702)) | ||
- Drop support for Node 18, update minimum Node vestion to 20 ([#12171](https://github.com/remix-run/react-router/pull/12171)) | ||
- Remove `installGlobals()` as this should no longer be necessary | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `react-router@7.0.0` | ||
- `@react-router/node@7.0.0` | ||
## 2.9.0 | ||
@@ -4,0 +168,0 @@ |
@@ -1,2 +0,26 @@ | ||
export type { GetLoadContextFunction, RequestHandler } from "./server"; | ||
export { createRequestHandler } from "./server"; | ||
import * as express from 'express'; | ||
import { UNSAFE_MiddlewareEnabled, unstable_InitialContext, AppLoadContext, ServerBuild } from 'react-router'; | ||
/// <reference lib="dom.iterable" /> | ||
type MaybePromise<T> = T | Promise<T>; | ||
/** | ||
* A function that returns the value to use as `context` in route `loader` and | ||
* `action` functions. | ||
* | ||
* You can think of this as an escape hatch that allows you to pass | ||
* environment/platform-specific values through to your loader/action, such as | ||
* values that are generated by Express middleware like `req.session`. | ||
*/ | ||
type GetLoadContextFunction = (req: express.Request, res: express.Response) => UNSAFE_MiddlewareEnabled extends true ? MaybePromise<unstable_InitialContext> : MaybePromise<AppLoadContext>; | ||
type RequestHandler = (req: express.Request, res: express.Response, next: express.NextFunction) => Promise<void>; | ||
/** | ||
* Returns a request handler for Express that serves the response using Remix. | ||
*/ | ||
declare function createRequestHandler({ build, getLoadContext, mode, }: { | ||
build: ServerBuild | (() => Promise<ServerBuild>); | ||
getLoadContext?: GetLoadContextFunction; | ||
mode?: string; | ||
}): RequestHandler; | ||
export { type GetLoadContextFunction, type RequestHandler, createRequestHandler }; |
/** | ||
* @react-router/express v0.0.0-experimental-cb25a21e1 | ||
* @react-router/express v0.0.0-experimental-cb75ef9 | ||
* | ||
@@ -11,10 +11,103 @@ * Copyright (c) Remix Software Inc. | ||
*/ | ||
'use strict'; | ||
"use strict"; | ||
var __defProp = Object.defineProperty; | ||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
var __getOwnPropNames = Object.getOwnPropertyNames; | ||
var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
var __export = (target, all) => { | ||
for (var name in all) | ||
__defProp(target, name, { get: all[name], enumerable: true }); | ||
}; | ||
var __copyProps = (to, from, except, desc) => { | ||
if (from && typeof from === "object" || typeof from === "function") { | ||
for (let key of __getOwnPropNames(from)) | ||
if (!__hasOwnProp.call(to, key) && key !== except) | ||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||
} | ||
return to; | ||
}; | ||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
// index.ts | ||
var react_router_express_exports = {}; | ||
__export(react_router_express_exports, { | ||
createRequestHandler: () => createRequestHandler | ||
}); | ||
module.exports = __toCommonJS(react_router_express_exports); | ||
var server = require('./server.js'); | ||
exports.createRequestHandler = server.createRequestHandler; | ||
// server.ts | ||
var import_react_router = require("react-router"); | ||
var import_node = require("@react-router/node"); | ||
function createRequestHandler({ | ||
build, | ||
getLoadContext, | ||
mode = process.env.NODE_ENV | ||
}) { | ||
let handleRequest = (0, import_react_router.createRequestHandler)(build, mode); | ||
return async (req, res, next) => { | ||
try { | ||
let request = createRemixRequest(req, res); | ||
let loadContext = await getLoadContext?.(req, res); | ||
let response = await handleRequest(request, loadContext); | ||
await sendRemixResponse(res, response); | ||
} catch (error) { | ||
next(error); | ||
} | ||
}; | ||
} | ||
function createRemixHeaders(requestHeaders) { | ||
let headers = new Headers(); | ||
for (let [key, values] of Object.entries(requestHeaders)) { | ||
if (values) { | ||
if (Array.isArray(values)) { | ||
for (let value of values) { | ||
headers.append(key, value); | ||
} | ||
} else { | ||
headers.set(key, values); | ||
} | ||
} | ||
} | ||
return headers; | ||
} | ||
function createRemixRequest(req, res) { | ||
let [, hostnamePortStr] = req.get("X-Forwarded-Host")?.split(":") ?? []; | ||
let [, hostPortStr] = req.get("host")?.split(":") ?? []; | ||
let hostnamePort = Number.parseInt(hostnamePortStr, 10); | ||
let hostPort = Number.parseInt(hostPortStr, 10); | ||
let port = Number.isSafeInteger(hostnamePort) ? hostnamePort : Number.isSafeInteger(hostPort) ? hostPort : ""; | ||
let resolvedHost = `${req.hostname}${port ? `:${port}` : ""}`; | ||
let url = new URL(`${req.protocol}://${resolvedHost}${req.originalUrl}`); | ||
let controller = new AbortController(); | ||
let init = { | ||
method: req.method, | ||
headers: createRemixHeaders(req.headers), | ||
signal: controller.signal | ||
}; | ||
res.on("finish", () => controller = null); | ||
res.on("close", () => controller?.abort()); | ||
if (req.method !== "GET" && req.method !== "HEAD") { | ||
init.body = (0, import_node.createReadableStreamFromReadable)(req); | ||
init.duplex = "half"; | ||
} | ||
return new Request(url.href, init); | ||
} | ||
async function sendRemixResponse(res, nodeResponse) { | ||
res.statusMessage = nodeResponse.statusText; | ||
res.status(nodeResponse.status); | ||
for (let [key, value] of nodeResponse.headers.entries()) { | ||
res.append(key, value); | ||
} | ||
if (nodeResponse.headers.get("Content-Type")?.match(/text\/event-stream/i)) { | ||
res.flushHeaders(); | ||
} | ||
if (nodeResponse.body) { | ||
await (0, import_node.writeReadableStreamToWritable)(nodeResponse.body, res); | ||
} else { | ||
res.end(); | ||
} | ||
} | ||
// Annotate the CommonJS export names for ESM import in node: | ||
0 && (module.exports = { | ||
createRequestHandler | ||
}); |
{ | ||
"name": "@react-router/express", | ||
"version": "0.0.0-experimental-cb25a21e1", | ||
"version": "0.0.0-experimental-cb75ef9", | ||
"description": "Express server request handler for React Router", | ||
@@ -11,3 +11,3 @@ "bugs": { | ||
"url": "https://github.com/remix-run/react-router", | ||
"directory": "packages/remix-express" | ||
"directory": "packages/react-router-express" | ||
}, | ||
@@ -17,17 +17,51 @@ "license": "MIT", | ||
"typings": "dist/index.d.ts", | ||
"exports": { | ||
".": { | ||
"node": { | ||
"types": "./dist/index.d.ts", | ||
"module-sync": "./dist/index.mjs", | ||
"default": "./dist/index.js" | ||
}, | ||
"import": { | ||
"types": "./dist/index.d.mts", | ||
"default": "./dist/index.mjs" | ||
}, | ||
"default": { | ||
"types": "./dist/index.d.ts", | ||
"default": "./dist/index.js" | ||
} | ||
}, | ||
"./package.json": "./package.json" | ||
}, | ||
"wireit": { | ||
"build": { | ||
"command": "tsup", | ||
"files": [ | ||
"*.ts", | ||
"tsconfig.json", | ||
"package.json" | ||
], | ||
"output": [ | ||
"dist/**" | ||
] | ||
} | ||
}, | ||
"dependencies": { | ||
"@react-router/node": "0.0.0-experimental-cb25a21e1" | ||
"@react-router/node": "0.0.0-experimental-cb75ef9" | ||
}, | ||
"devDependencies": { | ||
"@types/express": "^4.17.9", | ||
"@types/node": "^18.17.1", | ||
"@types/node": "^20.0.0", | ||
"@types/supertest": "^2.0.10", | ||
"express": "^4.17.1", | ||
"express": "^4.19.2", | ||
"node-mocks-http": "^1.10.1", | ||
"supertest": "^6.3.3", | ||
"typescript": "^5.1.6" | ||
"tsup": "^8.3.0", | ||
"typescript": "^5.1.6", | ||
"wireit": "0.14.9" | ||
}, | ||
"peerDependencies": { | ||
"express": "^4.17.1", | ||
"typescript": "^5.1.0" | ||
"express": "^4.17.1 || ^5", | ||
"typescript": "^5.1.0", | ||
"react-router": "0.0.0-experimental-cb75ef9" | ||
}, | ||
@@ -40,3 +74,3 @@ "peerDependenciesMeta": { | ||
"engines": { | ||
"node": ">=18.0.0" | ||
"node": ">=20.0.0" | ||
}, | ||
@@ -50,4 +84,5 @@ "files": [ | ||
"scripts": { | ||
"tsc": "tsc" | ||
"build": "wireit", | ||
"typecheck": "tsc" | ||
} | ||
} |
@@ -1,13 +0,5 @@ | ||
# Welcome to Remix! | ||
[Express](https://expressjs.com) server request handler for React Router. | ||
[Remix](https://remix.run) is a web framework that helps you build better websites with React. | ||
To get started, open a new shell and run: | ||
```sh | ||
npx create-remix@latest | ||
npm install @react-router/express | ||
``` | ||
Then follow the prompts you see in your terminal. | ||
For more information about Remix, [visit remix.run](https://remix.run)! |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
22720
46.85%221
62.5%4
33.33%9
28.57%6
-57.14%2
100%1
Infinity%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed