From eb1fca0fcf372838a17c814438cf6d14c15bc3a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 14 Jul 2022 01:07:36 +0200 Subject: [PATCH 1/6] fix internal type --- .../next/build/webpack/loaders/next-edge-ssr-loader/render.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts b/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts index e8d4660e87cb..39c5c23da52f 100644 --- a/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts +++ b/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts @@ -105,7 +105,7 @@ export function getRender({ }) const requestHandler = server.getRequestHandler() - return async function render(request: NextRequest) { + return async function render(request: Request) { const extendedReq = new WebNextRequest(request) const extendedRes = new WebNextResponse() requestHandler(extendedReq, extendedRes) From 2a6b590d98648ebdc75ce4ae7c3f97fec38996ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 14 Jul 2022 01:08:15 +0200 Subject: [PATCH 2/6] allow `void` to be returned from Middleware --- packages/next/server/web/types.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/next/server/web/types.ts b/packages/next/server/web/types.ts index 029a1024d462..f03d473dd41c 100644 --- a/packages/next/server/web/types.ts +++ b/packages/next/server/web/types.ts @@ -47,7 +47,12 @@ export interface FetchEventResult { waitUntil: Promise } -export type NextMiddlewareResult = NextResponse | Response | null | undefined +export type NextMiddlewareResult = + | NextResponse + | Response + | null + | undefined + | void export type NextMiddleware = ( request: NextRequest, From 91fe7aee743b5df693b5233fdc587f6493a9cbd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 14 Jul 2022 01:08:41 +0200 Subject: [PATCH 3/6] mark deprecated APIs in JSDoc --- packages/next/server/web/spec-extension/request.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/next/server/web/spec-extension/request.ts b/packages/next/server/web/spec-extension/request.ts index e6d55ba0500b..c81a088f14e5 100644 --- a/packages/next/server/web/spec-extension/request.ts +++ b/packages/next/server/web/spec-extension/request.ts @@ -46,10 +46,20 @@ export class NextRequest extends Request { return this[INTERNALS].url } + /** + * @deprecated + * `page` has been deprecated in favour of `URLPattern`. + * Read more: https://nextjs.org/docs/messages/middleware-request-page + */ public get page() { throw new RemovedPageError() } + /** + * @deprecated + * `ua` has been removed in favour of \`userAgent\` function. + * Read more: https://nextjs.org/docs/messages/middleware-parse-user-agent + */ public get ua() { throw new RemovedUAError() } From 488887ea2593243af5e1ac9ba4886c0df3b2c020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 14 Jul 2022 01:08:50 +0200 Subject: [PATCH 4/6] fix typo --- packages/next/server/web/error.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/server/web/error.ts b/packages/next/server/web/error.ts index a55f4a6fe882..d15bb00fd7fc 100644 --- a/packages/next/server/web/error.ts +++ b/packages/next/server/web/error.ts @@ -21,7 +21,7 @@ export class RemovedPageError extends Error { export class RemovedUAError extends Error { constructor() { - super(`The request.page has been removed in favour of \`userAgent\` function. + super(`The request.ua has been removed in favour of \`userAgent\` function. Read more: https://nextjs.org/docs/messages/middleware-parse-user-agent `) } From 18f67e6a5729c228d7ef14eb10da79eac87a6df0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 14 Jul 2022 01:08:59 +0200 Subject: [PATCH 5/6] add missing error page --- errors/manifest.json | 4 ++++ errors/middleware-parse-user-agent.md | 34 +++++++++++++++++++++++++++ errors/middleware-request-page.md | 2 +- 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 errors/middleware-parse-user-agent.md diff --git a/errors/manifest.json b/errors/manifest.json index 9bc09eebbd1b..41d9307d60a5 100644 --- a/errors/manifest.json +++ b/errors/manifest.json @@ -715,6 +715,10 @@ { "title": "invalid-next-config", "path": "/errors/invalid-next-config.md" + }, + { + "title": "middleware-parse-user-agent", + "path": "/errors/middleware-parse-user-agent.md" } ] } diff --git a/errors/middleware-parse-user-agent.md b/errors/middleware-parse-user-agent.md new file mode 100644 index 000000000000..60f80e10d4e4 --- /dev/null +++ b/errors/middleware-parse-user-agent.md @@ -0,0 +1,34 @@ +# Removed parsed User Agent from Middleware API + +#### Why This Error Occurred + +Your application is interacting with `req.ua` which has been deprecated. + +```ts +// middleware.ts +import { NextRequest, NextResponse } from 'next/server' + +export function middleware(request: NextRequest) { + const viewport = request.ua.device.type === 'mobile' ? 'mobile' : 'desktop' + + request.nextUrl.searchParams.set('viewport', viewport) + return NextResponse.rewrites(request.nextUrl) +} +``` + +#### Possible Ways to Fix It + +The internal logic has been moved into a separate `userAgent` function that you can import from `next/server` and wrap your request instead. + +```ts +// middleware.ts +import { NextRequest, NextResponse, userAgent } from 'next/server' + +export function middleware(request: NextRequest) { + const { device } = userAgent(request) + const viewport = device.type === 'mobile' ? 'mobile' : 'desktop' + + request.nextUrl.searchParams.set('viewport', viewport) + return NextResponse.rewrites(request.nextUrl) +} +``` diff --git a/errors/middleware-request-page.md b/errors/middleware-request-page.md index 4bffc2a8740b..76dad8572396 100644 --- a/errors/middleware-request-page.md +++ b/errors/middleware-request-page.md @@ -2,7 +2,7 @@ #### Why This Error Occurred -Your application is interacting with `request.page`, and it's being deprecated. +Your application is interacting with `request.page` which has been deprecated. ```typescript // middleware.ts From ac9801fec14588d024a1a9bb8b786a901bfb1892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 14 Jul 2022 01:47:59 +0200 Subject: [PATCH 6/6] remove unused import --- .../next/build/webpack/loaders/next-edge-ssr-loader/render.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts b/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts index 39c5c23da52f..f20365696874 100644 --- a/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts +++ b/packages/next/build/webpack/loaders/next-edge-ssr-loader/render.ts @@ -3,8 +3,6 @@ import type { DocumentType, AppType } from '../../../../shared/lib/utils' import type { BuildManifest } from '../../../../server/get-page-files' import type { ReactLoadableManifest } from '../../../../server/load-components' -import { NextRequest } from '../../../../server/web/spec-extension/request' - import WebServer from '../../../../server/web-server' import { WebNextRequest,