No description
Find a file
Damien Simonin Feugas bf089562c7
feat(middleware)!: forbids middleware response body (#36835)
_Hello Next.js team! First PR here, I hope I've followed the right practices._

### What's in there?

It has been decided to only support the following uses cases in Next.js' middleware:
- rewrite the URL (`x-middleware-rewrite` response header)
- redirect to another URL (`Location` response header)
- pass on to the next piece in the request pipeline (`x-middleware-next` response header)

1. during development, a warning on console tells developers when they are returning a response (either with `Response` or `NextResponse`).
2. at build time, this warning becomes an error.
3. at run time, returning a response body will trigger a 500 HTTP error with a JSON payload containing the detailed error.

All returned/thrown errors contain a link to the documentation.

This is a breaking feature compared to the _beta_ middleware implementation, and also removes `NextResponse.json()` which makes no sense any more.

### How to try it?
- runtime behavior: `HEADLESS=true yarn jest test/integration/middleware/core`
- build behavior : `yarn jest test/integration/middleware/build-errors`
- development behavior: `HEADLESS=true yarn jest test/development/middleware-warnings`

### Notes to reviewers

The limitation happens in next's web adapter. ~The initial implementation was to check `response.body` existence, but it turns out [`Response.redirect()`](https://github.com/vercel/next.js/blob/canary/packages/next/server/web/spec-compliant/response.ts#L42-L53) may set the response body (https://github.com/vercel/next.js/pull/31886). Hence why the proposed implementation specifically looks at response headers.~
`Response.redirect()` and `NextResponse.redirect()` do not need to include the final location in their body: it is handled by next server https://github.com/vercel/next.js/blob/canary/packages/next/server/next-server.ts#L1142

Because this is a breaking change, I had to adjust several tests cases, previously returning JSON/stream/text bodies. When relevant, these middlewares are returning data using response headers.

About DevEx: relying on AST analysis to detect forbidden use cases is not as good as running the code.
Such cases are easy to detect:
```js
new Response('a text value')
new Response(JSON.stringify({ /* whatever */ })
```
But these are false-positive cases:
```js
function returnNull() { return null }
new Response(returnNull())

function doesNothing() {}
new Response(doesNothing())
```
However, I see no good reasons to let users ship middleware such as the one above, hence why the build will fail, even if _technically speaking_, they are not setting the response body. 



## Feature

- [x] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR.
- [ ] Related issues linked using `fixes #number`
- [x] Integration tests added
- [x] Documentation added
- [ ] Telemetry added. In case of a feature if it's used or not.
- [x] Errors have helpful link attached, see `contributing.md`

## Documentation / Examples

- [x] Make sure the linting passes by running `yarn lint`
2022-05-19 22:02:20 +00:00
.github Update to latest version of turbo (#37046) 2022-05-19 20:59:06 +00:00
.vscode Additional bench tracing improvements (#29325) 2021-09-27 12:57:37 +02:00
bench Send build trace to datadog in CI (#35306) 2022-03-31 14:37:59 +02:00
docs feat(middleware)!: forbids middleware response body (#36835) 2022-05-19 22:02:20 +00:00
errors feat(middleware)!: forbids middleware response body (#36835) 2022-05-19 22:02:20 +00:00
examples Add with-markdoc/ example (#36867) 2022-05-18 18:52:45 -05:00
packages feat(middleware)!: forbids middleware response body (#36835) 2022-05-19 22:02:20 +00:00
scripts Make setup-wasm script work for local dev (#36355) 2022-04-21 15:41:48 -05:00
test feat(middleware)!: forbids middleware response body (#36835) 2022-05-19 22:02:20 +00:00
.alexignore Enable Alex documentation linting for docs (#26598) 2021-06-25 11:40:50 -05:00
.alexrc Add instructions to create pages directory and add an index.js file to it (#35971) 2022-04-15 14:40:37 +02:00
.eslintignore Adds web worker support to <Script /> using Partytown (#34244) 2022-03-11 22:26:46 +00:00
.eslintrc.json test: warn on substr() usage (#35499) 2022-03-24 18:35:33 -04:00
.gitattributes the way towards webpack 5 typings (#29105) 2021-09-21 19:17:16 +02:00
.gitignore feat(middleware)!: forbids middleware response body (#36835) 2022-05-19 22:02:20 +00:00
.npmrc Remove version prefix 2018-10-02 01:35:56 +02:00
.prettierignore fixes to allow lazy compilation for import() (#32441) 2021-12-14 11:33:04 +01:00
.prettierignore_staged Extract next-swc Rust code into its own package (#31635) 2021-11-21 12:59:56 +01:00
.prettierrc.json Prettier trailingComma default value to es5 since 2.0 (#14391) 2020-06-22 13:25:24 +02:00
azure-pipelines.yml Update azure config (#33999) 2022-02-04 13:42:22 -06:00
CODE_OF_CONDUCT.md updated code of conduct to v2.1 (#34208) 2022-02-10 18:11:42 -06:00
contributing.md enforce omitting name and version (#36771) 2022-05-09 11:27:44 +00:00
jest.config.js Don't swallow test failures caused by POSIX signals (#32688) 2021-12-21 12:52:07 -06:00
lerna.json v12.1.7-canary.9 2022-05-19 13:06:44 -05:00
license.md Update license year 2022-01-13 16:02:34 +01:00
lint-staged.config.js Replace CLIEngine with ESLint (#25801) 2021-06-09 13:54:10 +02:00
package.json Update to latest version of turbo (#37046) 2022-05-19 20:59:06 +00:00
plopfile.js Clarify test types during scaffolding (#34638) 2022-02-21 12:09:32 -06:00
readme.md Monorepo (#5341) 2018-10-01 01:02:10 +02:00
release.js Fix labels for release sections 2021-11-21 13:11:54 +01:00
run-tests.js Continue testing react v17 with e2e tests (#35787) 2022-03-31 17:35:00 -05:00
SECURITY.md Add link to security email directly. (#33358) 2022-01-15 21:33:43 -06:00
skip-docs-change.js Update repo scripts to separate folder (#26787) 2021-07-01 13:41:27 +02:00
test-file.txt Add additional file serving tests (#12479) 2020-05-04 11:58:19 -05:00
tsconfig-tsec.json Integrate tsec into the linting process (#33746) 2022-02-24 16:59:18 -08:00
tsconfig.json Update test set-up to leverage playwright when able to (#28634) 2021-09-13 14:36:25 +02:00
tsec-exemptions.json Fix various Trusted Types violations without use of policy (#34726) 2022-05-05 00:11:36 +00:00
turbo.json Update components in GitHub Actions (#36669) 2022-05-04 18:51:25 +00:00
UPGRADING.md Move upgrading guide to /docs (#10727) 2020-02-28 23:46:18 +01:00
vercel.json Silence GH Comments for Preview URLs (#18766) 2020-11-03 21:59:47 +00:00
yarn.lock Update to latest version of turbo (#37046) 2022-05-19 20:59:06 +00:00

Next.js

Getting Started

Visit https://nextjs.org/learn to get started with Next.js.

Documentation

Visit https://nextjs.org/docs to view the full documentation.

Who is using Next.js?

Next.js is used by the world's leading companies. Check out the Next.js Showcase to learn more.

Community

The Next.js community can be found on GitHub Discussions, where you can ask questions, voice ideas, and share your projects.

To chat with other community members you can join the Next.js Discord.

Our Code of Conduct applies to all Next.js community channels.

Contributing

Please see our contributing.md.

Good First Issues

We have a list of good first issues that contain bugs which have a relatively limited scope. This is a great place to get started, gain experience, and get familiar with our contribution process.

Authors