@netlify/plugin-nextjs 4.4.3 → 4.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netlify/plugin-nextjs",
3
- "version": "4.4.3",
3
+ "version": "4.4.4",
4
4
  "description": "Run Next.js seamlessly on Netlify",
5
5
  "main": "lib/index.js",
6
6
  "files": [
@@ -28,6 +28,7 @@
28
28
  "tiny-glob": "^0.2.9"
29
29
  },
30
30
  "devDependencies": {
31
+ "@delucis/if-env": "^1.1.2",
31
32
  "@netlify/build": "^27.0.1",
32
33
  "@types/fs-extra": "^9.0.13",
33
34
  "@types/jest": "^27.4.1",
@@ -5,6 +5,19 @@ export interface FetchEventResult {
5
5
  waitUntil: Promise<any>
6
6
  }
7
7
 
8
+ /**
9
+ * This is how Next handles rewritten URLs.
10
+ */
11
+ export function relativizeURL(url: string | string, base: string | URL) {
12
+ const baseURL = typeof base === 'string' ? new URL(base) : base
13
+ const relative = new URL(url, base)
14
+ const origin = `${baseURL.protocol}//${baseURL.host}`
15
+ return `${relative.protocol}//${relative.host}` === origin
16
+ ? relative.toString().replace(origin, '')
17
+ : relative.toString()
18
+ }
19
+
20
+
8
21
  export const addMiddlewareHeaders = async (
9
22
  originResponse: Promise<Response> | Response,
10
23
  middlewareResponse: Response,
@@ -14,7 +27,8 @@ export const addMiddlewareHeaders = async (
14
27
  return originResponse
15
28
  }
16
29
  // We need to await the response to get the origin headers, then we can add the ones from middleware.
17
- const response = await originResponse
30
+ const res = await originResponse
31
+ const response = new Response(res.body, res)
18
32
  middlewareResponse.headers.forEach((value, key) => {
19
33
  response.headers.set(key, value)
20
34
  })
@@ -33,6 +47,14 @@ export const buildResponse = async ({
33
47
  request.headers.set('x-nf-next-middleware', 'skip')
34
48
  const rewrite = res.headers.get('x-middleware-rewrite')
35
49
  if (rewrite) {
50
+ const rewriteUrl = new URL(rewrite, request.url)
51
+ const baseUrl = new URL(request.url)
52
+ if(rewriteUrl.hostname !== baseUrl.hostname) {
53
+ // Netlify Edge Functions don't support proxying to external domains, but Next middleware does
54
+ const proxied = fetch(new Request(rewriteUrl.toString(), request))
55
+ return addMiddlewareHeaders(proxied, res)
56
+ }
57
+ res.headers.set('x-middleware-rewrite', relativizeURL(rewrite, request.url))
36
58
  return addMiddlewareHeaders(context.rewrite(rewrite), res)
37
59
  }
38
60
  if (res.headers.get('x-middleware-next') === '1') {