Skip to content

Commit 121ead3

Browse files
authored
Merge branch 'main' into renovate/babel-monorepo
2 parents 41a367f + 0f3e68f commit 121ead3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+16844
-21631
lines changed

.eslintrc.js

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ module.exports = {
4545
// unsupported by Node 12, i.e. optional chaining
4646
// TODO: re-enable after dropping support for Node 12
4747
'n/no-unsupported-features/es-syntax': 'off',
48+
'@typescript-eslint/no-extra-semi': 'off',
4849
},
4950
},
5051
{

.release-please-manifest.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"packages/runtime": "4.23.1",
3-
"packages/next": "1.3.0"
2+
"packages/runtime": "4.24.3",
3+
"packages/next": "1.3.1"
44
}

README.md

+20-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ commands separately will not work, because the Next.js Runtime will not generate
1616
If you use [`next/image`](https://nextjs.org/docs/basic-features/image-optimization), your images will be automatically
1717
optimized at runtime, ensuring that they are served at the best size and format. The image will be processed on the
1818
first request which means it may take longer to load, but the generated image is then cached at the edge and served as a
19-
static file to future visitors. By default, Next will deliver WebP images if the browser supports it. WebP is a new
19+
static file to future visitors. By default, Next.js will deliver WebP images if the browser supports it. WebP is a new
2020
image format with wide browser support that will usually generate smaller files than png or jpg. You can additionally
2121
enable the AVIF format, which is often even smaller in filesize than WebP. The drawback is that with particularly large
2222
images AVIF may take too long to generate, meaning the function times-out. You can configure
@@ -42,12 +42,28 @@ by targeting the `/_next/image/*` route:
4242
X-Test = 'foobar'
4343
```
4444

45+
## Disabling included image loader
46+
47+
If you wish to disable the use of the image loader which is bundled into the runtime by default, set the `DISABLE_IPX` environment variable to `true`.
48+
49+
This should only be done if the site is not using `next/image` or is using a different loader (such as Cloudinary or Imgix).
50+
51+
See the [Next.js documentation](https://nextjs.org/docs/api-reference/next/image#built-in-loaders) for image loader options.
52+
4553
## Next.js Middleware on Netlify
4654

4755
Next.js Middleware works out of the box on Netlify. By default, middleware runs using Netlify Edge Functions. For legacy
4856
support for running Middleware at the origin, set the environment variable `NEXT_DISABLE_NETLIFY_EDGE` to `true`. Be
4957
aware that this will result in slower performance, as all pages that match middleware must use SSR.
5058

59+
For more details on Next.js Middleware with Netlify, see the [middleware docs](https://github.com/netlify/next-runtime/blob/main/docs/middleware.md).
60+
61+
### Limitations
62+
63+
Due to how the site configuration is handled when it's run using Netlify Edge Functions, data such as `locale` and `defaultLocale` will be missing on the `req.nextUrl` object when running `netlify dev`.
64+
65+
However, this data is available on `req.nextUrl` in a production environment.
66+
5167
## Monorepos
5268

5369
If you are using a monorepo you will need to change `publish` to point to the full path to the built `.next` directory,
@@ -60,6 +76,8 @@ If you are using Nx, then you will need to point `publish` to the folder inside
6076
The Next.js Runtime fully supports ISR on Netlify. For more details see
6177
[the ISR docs](https://github.com/netlify/next-runtime/blob/main/docs/isr.md).
6278

79+
Note that Netlify has a minimum TTL of 60 seconds for revalidation.
80+
6381
## Use with `next export`
6482

6583
If you are using `next export` to generate a static site, you do not need most of the functionality of this Next.js
@@ -111,7 +129,7 @@ If you previously set these values, they're no longer needed and should be remov
111129
- `external_node_modules` in `netlify.toml`
112130
- The environment variable `NEXT_USE_NETLIFY_EDGE` can be removed as this is now the default
113131

114-
The `serverless` and `experimental-serverless-trace` targets are deprecated in Next 12, and all builds with this Next
132+
The `serverless` and `experimental-serverless-trace` targets are deprecated in Next.js 12, and all builds with this Next.js
115133
Runtime will now use the default `server` target. If you previously set the target in your `next.config.js`, you should
116134
remove it.
117135

Original file line numberDiff line numberDiff line change
@@ -1,127 +1,149 @@
1+
/* eslint-disable max-lines-per-function */
12
describe('Static Routing', () => {
23
it('renders correct page via SSR on a static route', () => {
3-
cy.request('/getServerSideProps/static/').then((res) => {
4+
cy.request({ url: '/getServerSideProps/static/', headers: { 'x-nf-debug-logging': '1' } }).then((res) => {
45
expect(res.status).to.eq(200)
5-
expect(res.headers).to.have.property('x-render-mode', 'ssr')
6+
expect(res.headers).to.have.property('x-nf-render-mode', 'ssr')
67
expect(res.body).to.contain('Sleepy Hollow')
78
})
89
})
910
it('serves correct static file on a static route', () => {
10-
cy.request('/getStaticProps/static/').then((res) => {
11+
cy.request({ url: '/getStaticProps/static/', headers: { 'x-nf-debug-logging': '1' } }).then((res) => {
1112
expect(res.status).to.eq(200)
12-
expect(res.headers).to.not.have.property('x-render-mode')
13+
expect(res.headers).to.not.have.property('x-nf-render-mode')
1314
expect(res.body).to.contain('Dancing with the Stars')
1415
})
1516
})
1617
it('renders correct page via ODB on a static route', () => {
17-
cy.request('/getStaticProps/with-revalidate/').then((res) => {
18+
cy.request({ url: '/getStaticProps/with-revalidate/', headers: { 'x-nf-debug-logging': '1' } }).then((res) => {
1819
expect(res.status).to.eq(200)
19-
expect(res.headers).to.have.property('x-render-mode', 'isr')
20+
expect(res.headers).to.have.property('x-nf-render-mode', 'odb ttl=60')
2021
expect(res.body).to.contain('Dancing with the Stars')
2122
})
2223
})
2324
})
2425

2526
describe('Dynamic Routing', () => {
2627
it('renders correct page via SSR on a dynamic route', () => {
27-
cy.request('/getServerSideProps/1/').then((res) => {
28+
cy.request({ url: '/getServerSideProps/1/', headers: { 'x-nf-debug-logging': '1' } }).then((res) => {
2829
expect(res.status).to.eq(200)
29-
expect(res.headers).to.have.property('x-render-mode', 'ssr')
30+
expect(res.headers).to.have.property('x-nf-render-mode', 'ssr')
3031
expect(res.body).to.contain('Under the Dome')
3132
})
3233
})
3334
it('renders correct page via SSR on a dynamic catch-all route', () => {
34-
cy.request('/getServerSideProps/all/1/').then((res) => {
35+
cy.request({ url: '/getServerSideProps/all/1/', headers: { 'x-nf-debug-logging': '1' } }).then((res) => {
3536
expect(res.status).to.eq(200)
36-
expect(res.headers).to.have.property('x-render-mode', 'ssr')
37+
expect(res.headers).to.have.property('x-nf-render-mode', 'ssr')
3738
expect(res.body).to.contain('Under the Dome')
3839
})
3940
})
4041
it('serves correct static file on a prerendered dynamic route with fallback: false', () => {
41-
cy.request('/getStaticProps/1/').then((res) => {
42+
cy.request({ url: '/getStaticProps/1/', headers: { 'x-nf-debug-logging': '1' } }).then((res) => {
4243
expect(res.status).to.eq(200)
43-
expect(res.headers).to.not.have.property('x-render-mode')
44+
expect(res.headers).to.not.have.property('x-nf-render-mode')
4445
expect(res.body).to.contain('Under the Dome')
4546
})
4647
})
4748
it('renders custom 404 on a non-prerendered dynamic route with fallback: false', () => {
48-
cy.request({ url: '/getStaticProps/3/', failOnStatusCode: false }).then((res) => {
49-
expect(res.status).to.eq(404)
50-
expect(res.headers).to.have.property('x-render-mode', 'odb')
51-
expect(res.body).to.contain('Custom 404')
52-
})
49+
cy.request({ url: '/getStaticProps/3/', headers: { 'x-nf-debug-logging': '1' }, failOnStatusCode: false }).then(
50+
(res) => {
51+
expect(res.status).to.eq(404)
52+
expect(res.headers).to.have.property('x-nf-render-mode', 'odb')
53+
expect(res.body).to.contain('Custom 404')
54+
},
55+
)
5356
})
5457
it('serves correct static file on a prerendered dynamic route with fallback: true', () => {
55-
cy.request('/getStaticProps/withFallback/1/').then((res) => {
58+
cy.request({ url: '/getStaticProps/withFallback/1/', headers: { 'x-nf-debug-logging': '1' } }).then((res) => {
5659
expect(res.status).to.eq(200)
57-
expect(res.headers).to.not.have.property('x-render-mode')
60+
expect(res.headers).to.not.have.property('x-nf-render-mode')
5861
expect(res.body).to.contain('Under the Dome')
5962
})
6063
})
6164
it('renders fallback page via ODB on a non-prerendered dynamic route with fallback: true', () => {
62-
cy.request('/getStaticProps/withFallback/3/').then((res) => {
65+
cy.request({ url: '/getStaticProps/withFallback/3/', headers: { 'x-nf-debug-logging': '1' } }).then((res) => {
6366
expect(res.status).to.eq(200)
6467
// expect 'odb' until https://github.com/netlify/pillar-runtime/issues/438 is fixed
65-
expect(res.headers).to.have.property('x-render-mode', 'odb')
68+
expect(res.headers).to.have.property('x-nf-render-mode', 'odb')
6669
// expect 'Bitten' until the above is fixed and we can test for fallback 'Loading...' message
6770
expect(res.body).to.contain('Bitten')
6871
})
6972
})
7073
it('serves correct static file on a prerendered dynamic route with fallback: blocking', () => {
71-
cy.request('/getStaticProps/withFallbackBlocking/1/').then((res) => {
72-
expect(res.status).to.eq(200)
73-
expect(res.headers).to.not.have.property('x-render-mode')
74-
expect(res.body).to.contain('Under the Dome')
75-
})
74+
cy.request({ url: '/getStaticProps/withFallbackBlocking/1/', headers: { 'x-nf-debug-logging': '1' } }).then(
75+
(res) => {
76+
expect(res.status).to.eq(200)
77+
expect(res.headers).to.not.have.property('x-nf-render-mode')
78+
expect(res.body).to.contain('Under the Dome')
79+
},
80+
)
7681
})
7782
it('renders correct page via ODB on a non-prerendered dynamic route with fallback: blocking', () => {
78-
cy.request('/getStaticProps/withFallbackBlocking/3/').then((res) => {
79-
expect(res.status).to.eq(200)
80-
expect(res.headers).to.have.property('x-render-mode', 'odb')
81-
expect(res.body).to.contain('Bitten')
82-
})
83+
cy.request({ url: '/getStaticProps/withFallbackBlocking/3/', headers: { 'x-nf-debug-logging': '1' } }).then(
84+
(res) => {
85+
expect(res.status).to.eq(200)
86+
expect(res.headers).to.have.property('x-nf-render-mode', 'odb')
87+
expect(res.body).to.contain('Bitten')
88+
},
89+
)
8390
})
8491
it('renders correct page via ODB on a prerendered dynamic route with revalidate and fallback: false', () => {
85-
cy.request('/getStaticProps/withRevalidate/1/').then((res) => {
92+
cy.request({ url: '/getStaticProps/withRevalidate/1/', headers: { 'x-nf-debug-logging': '1' } }).then((res) => {
8693
expect(res.status).to.eq(200)
87-
expect(res.headers).to.have.property('x-render-mode', 'isr')
94+
expect(res.headers).to.have.property('x-nf-render-mode', 'odb ttl=60')
8895
expect(res.body).to.contain('Under the Dome')
8996
})
9097
})
9198
it('renders custom 404 on a non-prerendered dynamic route with revalidate and fallback: false', () => {
92-
cy.request({ url: '/getStaticProps/withRevalidate/3/', failOnStatusCode: false }).then((res) => {
99+
cy.request({
100+
url: '/getStaticProps/withRevalidate/3/',
101+
headers: { 'x-nf-debug-logging': '1' },
102+
failOnStatusCode: false,
103+
}).then((res) => {
93104
expect(res.status).to.eq(404)
94-
expect(res.headers).to.have.property('x-render-mode', 'odb')
105+
expect(res.headers).to.have.property('x-nf-render-mode', 'odb')
95106
expect(res.body).to.contain('Custom 404')
96107
})
97108
})
98109
it('renders correct page via ODB on a prerendered dynamic route with revalidate and fallback: true', () => {
99-
cy.request('/getStaticProps/withRevalidate/withFallback/1/').then((res) => {
100-
expect(res.status).to.eq(200)
101-
expect(res.headers).to.have.property('x-render-mode', 'isr')
102-
expect(res.body).to.contain('Under the Dome')
103-
})
110+
cy.request({ url: '/getStaticProps/withRevalidate/withFallback/1/', headers: { 'x-nf-debug-logging': '1' } }).then(
111+
(res) => {
112+
expect(res.status).to.eq(200)
113+
expect(res.headers).to.have.property('x-nf-render-mode', 'odb ttl=60')
114+
expect(res.body).to.contain('Under the Dome')
115+
},
116+
)
104117
})
105118
it('renders fallback page via ODB on a non-prerendered dynamic route with revalidate and fallback: true', () => {
106-
cy.request('/getStaticProps/withRevalidate/withFallback/3/').then((res) => {
107-
expect(res.status).to.eq(200)
108-
expect(res.headers).to.have.property('x-render-mode', 'isr')
109-
// expect 'Bitten' until https://github.com/netlify/pillar-runtime/issues/438 is fixed
110-
expect(res.body).to.contain('Bitten')
111-
})
119+
cy.request({ url: '/getStaticProps/withRevalidate/withFallback/3/', headers: { 'x-nf-debug-logging': '1' } }).then(
120+
(res) => {
121+
expect(res.status).to.eq(200)
122+
expect(res.headers).to.have.property('x-nf-render-mode', 'odb ttl=60')
123+
// expect 'Bitten' until https://github.com/netlify/pillar-runtime/issues/438 is fixed
124+
expect(res.body).to.contain('Bitten')
125+
},
126+
)
112127
})
113128
it('renders correct page via ODB on a prerendered dynamic route with revalidate and fallback: blocking', () => {
114-
cy.request('/getStaticProps/withRevalidate/withFallbackBlocking/1/').then((res) => {
129+
cy.request({
130+
url: '/getStaticProps/withRevalidate/withFallbackBlocking/1/',
131+
headers: { 'x-nf-debug-logging': '1' },
132+
}).then((res) => {
115133
expect(res.status).to.eq(200)
116-
expect(res.headers).to.have.property('x-render-mode', 'isr')
134+
expect(res.headers).to.have.property('x-nf-render-mode', 'odb ttl=60')
117135
expect(res.body).to.contain('Under the Dome')
118136
})
119137
})
120138
it('renders correct page via ODB on a non-prerendered dynamic route with revalidate and fallback: blocking', () => {
121-
cy.request('/getStaticProps/withRevalidate/withFallbackBlocking/3/').then((res) => {
139+
cy.request({
140+
url: '/getStaticProps/withRevalidate/withFallbackBlocking/3/',
141+
headers: { 'x-nf-debug-logging': '1' },
142+
}).then((res) => {
122143
expect(res.status).to.eq(200)
123-
expect(res.headers).to.have.property('x-render-mode', 'isr')
144+
expect(res.headers).to.have.property('x-nf-render-mode', 'odb ttl=60')
124145
expect(res.body).to.contain('Bitten')
125146
})
126147
})
127148
})
149+
/* eslint-enable max-lines-per-function */

cypress/integration/nx/general.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ describe('Default site', () => {
44
})
55

66
it('loads home page', () => {
7-
cy.findByRole('heading', { name: 'Welcome to nx-nextjs-monorepo!' })
7+
cy.findByRole('heading', { name: 'Hello there, Welcome demo-monorepo 👋' })
88

99
cy.visit('//')
1010
cy.url().should('eq', `${Cypress.config().baseUrl}/`)

demos/canary/pages/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export default function Home() {
1717
</main>
1818

1919
<Image
20-
src="https://raw.githubusercontent.com/netlify/next-runtime/main/next-on-netlify.png"
20+
src="https://raw.githubusercontent.com/netlify/next-runtime/main/demos/default/public/next-on-netlify.png"
2121
alt="Picture of the author"
2222
width={540}
2323
height={191}

demos/default/netlify.toml

-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ NODE_VERSION = "16.15.1"
1818
Strict-Transport-Security = "max-age=31536000"
1919
X-Test = 'foobar'
2020

21-
[dev]
22-
framework = "#static"
23-
2421
[[plugins]]
2522
package = "../plugin-wrapper/"
2623

demos/default/next.config.js

+8-10
Original file line numberDiff line numberDiff line change
@@ -71,20 +71,18 @@ module.exports = {
7171
},
7272
// https://nextjs.org/docs/basic-features/image-optimization#domains
7373
images: {
74-
domains: ['raw.githubusercontent.com'],
74+
domains: ['raw.githubusercontent.com', 'upload.wikimedia.org'],
75+
remotePatterns: [
76+
{
77+
hostname: '*.imgur.com',
78+
}
79+
]
7580
},
7681
// https://nextjs.org/docs/basic-features/built-in-css-support#customizing-sass-options
7782
sassOptions: {
7883
includePaths: [path.join(__dirname, 'styles-sass-test')],
7984
},
8085
experimental: {
81-
optimizeCss: true,
82-
images: {
83-
remotePatterns: [
84-
{
85-
hostname: '*.imgur.com',
86-
},
87-
],
88-
},
89-
},
86+
optimizeCss: false,
87+
}
9088
}

demos/default/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,4 @@
3535
"npm-run-all": "^4.1.5",
3636
"typescript": "^4.6.3"
3737
}
38-
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import Link from 'next/link'
2+
3+
const Show = () => (
4+
<div>
5+
<p>This page is ISR, but will return a 404 if the current time ends in 0-4.</p>
6+
7+
<Link href="/">
8+
<a>Go back home</a>
9+
</Link>
10+
</div>
11+
)
12+
13+
export async function getStaticProps(context) {
14+
return {
15+
props: {},
16+
notFound: new Date().getMinutes() % 10 < 5,
17+
revalidate: 60,
18+
}
19+
}
20+
21+
export default Show

demos/default/pages/getStaticProps/with-revalidate.js

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export async function getStaticProps(context) {
2525
props: {
2626
show: data,
2727
},
28+
// ODB handler will use the minimum TTL=60s
2829
revalidate: 1,
2930
}
3031
}

demos/default/pages/image.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const Images = () => (
1515
<p>
1616
<Image src={logo} alt="netlify logomark" />
1717
<Image
18-
src="https://raw.githubusercontent.com/netlify/next-runtime/main/next-on-netlify.png"
18+
src="https://raw.githubusercontent.com/netlify/next-runtime/main/demos/default/public/next-on-netlify.png"
1919
alt="Picture of the author"
2020
width={500}
2121
height={500}

0 commit comments

Comments
 (0)