@remix-run/express
Advanced tools
Comparing version 0.0.0-nightly-d8bcdc1-20230506 to 0.0.0-nightly-d9061d154-20241010
307
CHANGELOG.md
# `@remix-run/express` | ||
## 2.12.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.12.1` | ||
## 2.12.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.12.0` | ||
## 2.11.2 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.11.2` | ||
## 2.11.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.11.1` | ||
## 2.11.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.11.0` | ||
## 2.10.3 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.10.3` | ||
## 2.10.2 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.10.2` | ||
## 2.10.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.10.1` | ||
## 2.10.0 | ||
### Patch Changes | ||
- Upgrade `express` dependency to `^4.19.2` ([#9184](https://github.com/remix-run/remix/pull/9184)) | ||
- Updated dependencies: | ||
- `@remix-run/node@2.10.0` | ||
## 2.9.2 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.9.2` | ||
## 2.9.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.9.1` | ||
## 2.9.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.9.0` | ||
## 2.8.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.8.1` | ||
## 2.8.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.8.0` | ||
## 2.7.2 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.7.2` | ||
## 2.7.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.7.1` | ||
## 2.7.0 | ||
### Minor Changes | ||
- Vite: Add a new `basename` option to the Vite plugin, allowing users to set the internal React Router [`basename`](https://reactrouter.com/en/main/routers/create-browser-router#basename) in order to to serve their applications underneath a subpath ([#8145](https://github.com/remix-run/remix/pull/8145)) | ||
### Patch Changes | ||
- Use `req.originalUrl` instead of `req.url` so that Remix sees the full URL ([#8145](https://github.com/remix-run/remix/pull/8145)) | ||
- Remix relies on the knowing the full URL to ensure that server and client code can function together, and does not support URL rewriting prior to the Remix handler | ||
- Updated dependencies: | ||
- `@remix-run/node@2.7.0` | ||
## 2.6.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.6.0` | ||
## 2.5.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.5.1` | ||
## 2.5.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.5.0` | ||
## 2.4.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.4.1` | ||
## 2.4.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.4.0` | ||
## 2.3.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.3.1` | ||
## 2.3.0 | ||
### Patch Changes | ||
- Fix flash of unstyled content on initial page load in Vite dev when using a custom Express server ([#7937](https://github.com/remix-run/remix/pull/7937)) | ||
- Updated dependencies: | ||
- `@remix-run/node@2.3.0` | ||
## 2.2.0 | ||
### Patch Changes | ||
- Allow the `@remix-run/express` adapter to work behind a proxy when using `app.enable('trust proxy')` ([#7323](https://github.com/remix-run/remix/pull/7323)) | ||
- Previously, this used `req.get('host')` to construct the Remix `Request`, but that does not respect `X-Forwarded-Host` | ||
- This now uses `req.hostname` which will respect `X-Forwarded-Host` | ||
- Updated dependencies: | ||
- `@remix-run/node@2.2.0` | ||
## 2.1.0 | ||
### Patch Changes | ||
- Flush headers for `text/event-stream` responses ([#7619](https://github.com/remix-run/remix/pull/7619)) | ||
- Updated dependencies: | ||
- `@remix-run/node@2.1.0` | ||
## 2.0.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@2.0.1` | ||
## 2.0.0 | ||
### Major Changes | ||
- Require Node >=18.0.0 ([#6939](https://github.com/remix-run/remix/pull/6939)) | ||
- For preparation of using Node's built in fetch implementation, installing the fetch globals is now a responsibility of the app server ([#7009](https://github.com/remix-run/remix/pull/7009)) | ||
- If you are using `remix-serve`, nothing is required | ||
- If you are using your own app server, you will need to install the globals yourself | ||
```js filename=server.js | ||
import { installGlobals } from "@remix-run/node"; | ||
installGlobals(); | ||
``` | ||
- `source-map-support` is now a responsibility of the app server ([#7009](https://github.com/remix-run/remix/pull/7009)) | ||
- If you are using `remix-serve`, nothing is required | ||
- If you are using your own app server, you will need to install [`source-map-support`](https://www.npmjs.com/package/source-map-support) yourself. | ||
```sh | ||
npm i source-map-support | ||
``` | ||
```js filename=server.js | ||
import sourceMapSupport from "source-map-support"; | ||
sourceMapSupport.install(); | ||
``` | ||
### Patch Changes | ||
- Switch to `headers.entries()` instead of non-spec-compliant `headers.raw()` in `sendRemixResponse` ([#7150](https://github.com/remix-run/remix/pull/7150)) | ||
- Remove references to fetch polyfills in node and arc adapters ([#7230](https://github.com/remix-run/remix/pull/7230)) | ||
- Updated dependencies: | ||
- `@remix-run/node@2.0.0` | ||
- `@remix-run/web-fetch@4.4.0` | ||
- `@remix-run/web-file@3.1.0` | ||
- `@remix-run/web-stream@1.1.0` | ||
## 1.19.3 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@1.19.3` | ||
## 1.19.2 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@1.19.2` | ||
## 1.19.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@1.19.1` | ||
## 1.19.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@1.19.0` | ||
## 1.18.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@1.18.1` | ||
## 1.18.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@1.18.0` | ||
## 1.17.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@1.17.1` | ||
## 1.17.0 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@1.17.0` | ||
## 1.16.1 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/node@1.16.1` | ||
## 1.16.0 | ||
@@ -4,0 +311,0 @@ |
@@ -1,3 +0,2 @@ | ||
import "./globals"; | ||
export type { GetLoadContextFunction, RequestHandler } from "./server"; | ||
export { createRequestHandler } from "./server"; |
/** | ||
* @remix-run/express v0.0.0-nightly-d8bcdc1-20230506 | ||
* @remix-run/express v0.0.0-nightly-d9061d154-20241010 | ||
* | ||
@@ -15,3 +15,2 @@ * Copyright (c) Remix Software Inc. | ||
require('./globals.js'); | ||
var server = require('./server.js'); | ||
@@ -18,0 +17,0 @@ |
@@ -0,4 +1,4 @@ | ||
/// <reference lib="dom.iterable" /> | ||
import type * as express from "express"; | ||
import type { AppLoadContext, ServerBuild, Response as NodeResponse } from "@remix-run/node"; | ||
import { Headers as NodeHeaders, Request as NodeRequest } from "@remix-run/node"; | ||
import type { AppLoadContext, ServerBuild } from "@remix-run/node"; | ||
/** | ||
@@ -18,8 +18,8 @@ * A function that returns the value to use as `context` in route `loader` and | ||
export declare function createRequestHandler({ build, getLoadContext, mode, }: { | ||
build: ServerBuild; | ||
build: ServerBuild | (() => Promise<ServerBuild>); | ||
getLoadContext?: GetLoadContextFunction; | ||
mode?: string; | ||
}): RequestHandler; | ||
export declare function createRemixHeaders(requestHeaders: express.Request["headers"]): NodeHeaders; | ||
export declare function createRemixRequest(req: express.Request, res: express.Response): NodeRequest; | ||
export declare function sendRemixResponse(res: express.Response, nodeResponse: NodeResponse): Promise<void>; | ||
export declare function createRemixHeaders(requestHeaders: express.Request["headers"]): Headers; | ||
export declare function createRemixRequest(req: express.Request, res: express.Response): Request; | ||
export declare function sendRemixResponse(res: express.Response, nodeResponse: Response): Promise<void>; |
/** | ||
* @remix-run/express v0.0.0-nightly-d8bcdc1-20230506 | ||
* @remix-run/express v0.0.0-nightly-d9061d154-20241010 | ||
* | ||
@@ -17,2 +17,4 @@ * Copyright (c) Remix Software Inc. | ||
// IDK why this is needed when it's in the tsconfig.......... | ||
/** | ||
@@ -50,3 +52,3 @@ * A function that returns the value to use as `context` in route `loader` and | ||
function createRemixHeaders(requestHeaders) { | ||
let headers = new node.Headers(); | ||
let headers = new Headers(); | ||
for (let [key, values] of Object.entries(requestHeaders)) { | ||
@@ -66,27 +68,44 @@ if (values) { | ||
function createRemixRequest(req, res) { | ||
let url = new URL(`${req.protocol}://${req.get("host")}${req.url}`); | ||
// Abort action/loaders once we can no longer write a response | ||
let controller = new node.AbortController(); | ||
res.on("close", () => controller.abort()); | ||
var _req$get, _req$get2; | ||
// req.hostname doesn't include port information so grab that from | ||
// `X-Forwarded-Host` or `Host` | ||
let [, hostnamePort] = ((_req$get = req.get("X-Forwarded-Host")) === null || _req$get === void 0 ? void 0 : _req$get.split(":")) ?? []; | ||
let [, hostPort] = ((_req$get2 = req.get("host")) === null || _req$get2 === void 0 ? void 0 : _req$get2.split(":")) ?? []; | ||
let port = hostnamePort || hostPort; | ||
// Use req.hostname here as it respects the "trust proxy" setting | ||
let resolvedHost = `${req.hostname}${port ? `:${port}` : ""}`; | ||
// Use `req.originalUrl` so Remix is aware of the full path | ||
let url = new URL(`${req.protocol}://${resolvedHost}${req.originalUrl}`); | ||
let controller = new AbortController(); | ||
let init = { | ||
method: req.method, | ||
headers: createRemixHeaders(req.headers), | ||
// Cast until reason/throwIfAborted added | ||
// https://github.com/mysticatea/abort-controller/issues/36 | ||
signal: controller.signal | ||
}; | ||
if (req.method !== "GET" && req.method !== "HEAD") { | ||
init.body = req; | ||
init.body = node.createReadableStreamFromReadable(req); | ||
init.duplex = "half"; | ||
} | ||
return new node.Request(url.href, init); | ||
// Abort action/loaders once we can no longer write a response iff we have | ||
// not yet sent a response (i.e., `close` without `finish`) | ||
// `finish` -> done rendering the response | ||
// `close` -> response can no longer be written to | ||
res.on("finish", () => controller = null); | ||
res.on("close", () => { | ||
var _controller; | ||
return (_controller = controller) === null || _controller === void 0 ? void 0 : _controller.abort(); | ||
}); | ||
return new Request(url.href, init); | ||
} | ||
async function sendRemixResponse(res, nodeResponse) { | ||
var _nodeResponse$headers; | ||
res.statusMessage = nodeResponse.statusText; | ||
res.status(nodeResponse.status); | ||
for (let [key, values] of Object.entries(nodeResponse.headers.raw())) { | ||
for (let value of values) { | ||
res.append(key, value); | ||
} | ||
for (let [key, value] of nodeResponse.headers.entries()) { | ||
res.append(key, value); | ||
} | ||
if ((_nodeResponse$headers = nodeResponse.headers.get("Content-Type")) !== null && _nodeResponse$headers !== void 0 && _nodeResponse$headers.match(/text\/event-stream/i)) { | ||
res.flushHeaders(); | ||
} | ||
if (nodeResponse.body) { | ||
@@ -93,0 +112,0 @@ await node.writeReadableStreamToWritable(nodeResponse.body, res); |
MIT License | ||
Copyright (c) Remix Software Inc. 2020-2021 | ||
Copyright (c) Shopify Inc. 2022-2023 | ||
Copyright (c) Shopify Inc. 2022-2024 | ||
@@ -6,0 +6,0 @@ Permission is hereby granted, free of charge, to any person obtaining a copy |
{ | ||
"name": "@remix-run/express", | ||
"version": "0.0.0-nightly-d8bcdc1-20230506", | ||
"version": "0.0.0-nightly-d9061d154-20241010", | ||
"description": "Express server request handler for Remix", | ||
@@ -17,16 +17,24 @@ "bugs": { | ||
"dependencies": { | ||
"@remix-run/node": "0.0.0-nightly-d8bcdc1-20230506" | ||
"@remix-run/node": "0.0.0-nightly-d9061d154-20241010" | ||
}, | ||
"devDependencies": { | ||
"@types/express": "^4.17.9", | ||
"@types/node": "^18.17.1", | ||
"@types/supertest": "^2.0.10", | ||
"express": "^4.17.1", | ||
"express": "^4.19.2", | ||
"node-mocks-http": "^1.10.1", | ||
"supertest": "^6.1.5" | ||
"supertest": "^6.3.3", | ||
"typescript": "^5.1.6" | ||
}, | ||
"peerDependencies": { | ||
"express": "^4.17.1" | ||
"express": "^4.19.2", | ||
"typescript": "^5.1.0" | ||
}, | ||
"peerDependenciesMeta": { | ||
"typescript": { | ||
"optional": true | ||
} | ||
}, | ||
"engines": { | ||
"node": ">=14" | ||
"node": ">=18.0.0" | ||
}, | ||
@@ -38,3 +46,6 @@ "files": [ | ||
"README.md" | ||
] | ||
} | ||
], | ||
"scripts": { | ||
"tsc": "tsc" | ||
} | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
151
17090
3
7
8
+ Added@remix-run/node@0.0.0-nightly-d9061d154-20241010(transitive)
+ Added@remix-run/router@1.20.0-pre.0(transitive)
+ Added@remix-run/server-runtime@0.0.0-nightly-d9061d154-20241010(transitive)
+ Added@types/cookie@0.6.0(transitive)
+ Addedcookie@0.6.0(transitive)
+ Addedturbo-stream@2.4.0(transitive)
+ Addedtypescript@5.7.2(transitive)
+ Addedundici@6.21.0(transitive)
- Removed@remix-run/node@0.0.0-nightly-d8bcdc1-20230506(transitive)
- Removed@remix-run/router@1.6.0(transitive)
- Removed@remix-run/server-runtime@0.0.0-nightly-d8bcdc1-20230506(transitive)
- Removedcookie@0.4.2(transitive)