Skip to content

Commit fd88b98

Browse files
authored
feat: add support for Next 12.3 middleware matchers (#1612)
* feat: add support for Next 12.3 middleware matchers * fix: support legacy experimental config * chore: make canary use old version * feat: support middleware `has` matchers * chore: make canary use old version * chore: add test middleware * chore: add e2e tests * fix: handle json headers
1 parent e24534a commit fd88b98

File tree

31 files changed

+918
-416
lines changed

31 files changed

+918
-416
lines changed

.eslintignore

+1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ test
44
lib
55
demos
66
packages/runtime/src/templates/edge
7+
packages/runtime/src/templates/edge-shared
78
packages/runtime/lib
89
packages/runtime/dist-types

.vscode/settings.json

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"deno.enablePaths": [
33
"packages/runtime/src/templates/edge",
4+
"packages/runtime/src/templates/edge-shared",
45
"demos/middleware/.netlify/edge-functions",
56
"demos/server-components/.netlify/edge-functions",
67
],

cypress/integration/middleware/standard.spec.ts

+23
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,26 @@ describe('Standard middleware', () => {
2020
})
2121
})
2222
})
23+
24+
describe('Middleware matchers', () => {
25+
it('does not apply "has" matcher when headers are not sent', () => {
26+
cy.request('/conditional').then((response) => {
27+
expect(response.headers).not.to.have.property('x-is-deno', 'true')
28+
expect(response.headers).not.to.have.property('x-modified-edge', 'true')
29+
})
30+
})
31+
32+
it('matches when headers are sent', () => {
33+
cy.request({ url: '/conditional', headers: { 'x-my-header': 'my-value' } }).then((response) => {
34+
expect(response.headers).to.have.property('x-is-deno', 'true')
35+
expect(response.headers).to.have.property('x-modified-edge', 'true')
36+
})
37+
})
38+
39+
it('matches when headers are sent', () => {
40+
cy.request('/_next/data/build-id/static.json').then((response) => {
41+
expect(response.headers).to.have.property('x-is-deno', 'true')
42+
expect(response.headers).to.have.property('x-modified-edge', 'true')
43+
})
44+
})
45+
})

demos/base-path/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"typescript": "^4.6.3"
1414
},
1515
"dependencies": {
16-
"next": "^12.2.0"
16+
"next": "^12.3.0"
1717
},
1818
"scripts": {
1919
"test": "echo \"Error: no test specified\" && exit 1"

demos/canary/middleware.ts

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { NextResponse } from 'next/server'
2+
import type { NextRequest } from 'next/server'
3+
4+
export async function middleware(req: NextRequest) {
5+
const res = NextResponse.rewrite(new URL('/', req.url))
6+
res.headers.set('x-response-header', 'set in middleware')
7+
res.headers.set('x-is-deno', 'Deno' in globalThis ? 'true' : 'false')
8+
return res
9+
}
10+
11+
export const config = {
12+
matcher: ['/foo'],
13+
}

0 commit comments

Comments
 (0)