From 733d96cd6737718ba5b103b9a47650bca5a20371 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 22 Sep 2025 17:49:52 -0400 Subject: [PATCH 1/3] BREAKING CHANGE!: bump `images.minimumCacheTTL` to 86400 --- docs/01-app/03-api-reference/02-components/image.mdx | 2 +- docs/02-pages/04-api-reference/01-components/image-legacy.mdx | 2 +- errors/invalid-images-config.mdx | 2 +- packages/next/src/shared/lib/image-config.ts | 2 +- .../next-image-new/app-dir-localpatterns/test/index.test.ts | 2 +- .../next-image-new/app-dir-qualities/test/index.test.ts | 2 +- test/integration/next-image-new/app-dir/test/index.test.ts | 2 +- test/integration/next-image-new/unicode/test/index.test.ts | 2 +- test/integration/next-image-new/unoptimized/test/index.test.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/01-app/03-api-reference/02-components/image.mdx b/docs/01-app/03-api-reference/02-components/image.mdx index d3667d0a3583b6..6968090eee268a 100644 --- a/docs/01-app/03-api-reference/02-components/image.mdx +++ b/docs/01-app/03-api-reference/02-components/image.mdx @@ -765,7 +765,7 @@ If no configuration is provided, the default below is used. ```js filename="next.config.js" module.exports = { images: { - minimumCacheTTL: 60, // 1 minute + minimumCacheTTL: 86400, // 1 day }, } ``` diff --git a/docs/02-pages/04-api-reference/01-components/image-legacy.mdx b/docs/02-pages/04-api-reference/01-components/image-legacy.mdx index 2b2dd0295458dd..8bfd3f4a4e02ef 100644 --- a/docs/02-pages/04-api-reference/01-components/image-legacy.mdx +++ b/docs/02-pages/04-api-reference/01-components/image-legacy.mdx @@ -561,7 +561,7 @@ If no configuration is provided, the default below is used. ```js filename="next.config.js" module.exports = { images: { - minimumCacheTTL: 60, // 1 minute + minimumCacheTTL: 86400, // 1 day }, } ``` diff --git a/errors/invalid-images-config.mdx b/errors/invalid-images-config.mdx index cbaa4c2982952c..041a544515284a 100644 --- a/errors/invalid-images-config.mdx +++ b/errors/invalid-images-config.mdx @@ -28,7 +28,7 @@ module.exports = { // disable static imports for image files disableStaticImages: false, // minimumCacheTTL is in seconds, must be integer 0 or more - minimumCacheTTL: 60, + minimumCacheTTL: 86400, // (prev 60s then changed to 1d in next@16) // ordered list of acceptable optimized image formats (mime types) formats: ['image/webp'], // enable dangerous use of SVG images diff --git a/packages/next/src/shared/lib/image-config.ts b/packages/next/src/shared/lib/image-config.ts index 3934003395acd0..39e4b58f1b2bf4 100644 --- a/packages/next/src/shared/lib/image-config.ts +++ b/packages/next/src/shared/lib/image-config.ts @@ -135,7 +135,7 @@ export const imageConfigDefault: ImageConfigComplete = { loaderFile: '', domains: [], disableStaticImages: false, - minimumCacheTTL: 60, + minimumCacheTTL: 86400, // 1 day formats: ['image/webp'], dangerouslyAllowSVG: false, contentSecurityPolicy: `script-src 'none'; frame-src 'none'; sandbox;`, diff --git a/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts b/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts index 6f4efede569205..0aef79e848e868 100644 --- a/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts +++ b/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts @@ -96,7 +96,7 @@ function runTests(mode: 'dev' | 'server') { search: '', }, ], - minimumCacheTTL: 60, + minimumCacheTTL: 86400, path: '/_next/image', qualities: [75], sizes: [ diff --git a/test/integration/next-image-new/app-dir-qualities/test/index.test.ts b/test/integration/next-image-new/app-dir-qualities/test/index.test.ts index b3186ba9f9f2a3..bc36f58ae68bdf 100644 --- a/test/integration/next-image-new/app-dir-qualities/test/index.test.ts +++ b/test/integration/next-image-new/app-dir-qualities/test/index.test.ts @@ -102,7 +102,7 @@ function runTests(mode: 'dev' | 'server') { loaderFile: '', remotePatterns: [], localPatterns: undefined, - minimumCacheTTL: 60, + minimumCacheTTL: 86400, path: '/_next/image', qualities: [42, 69, 88], sizes: [ diff --git a/test/integration/next-image-new/app-dir/test/index.test.ts b/test/integration/next-image-new/app-dir/test/index.test.ts index 7caa585610a580..d93f368d496238 100644 --- a/test/integration/next-image-new/app-dir/test/index.test.ts +++ b/test/integration/next-image-new/app-dir/test/index.test.ts @@ -1785,7 +1785,7 @@ function runTests(mode: 'dev' | 'server') { loaderFile: '', remotePatterns: [], localPatterns: undefined, - minimumCacheTTL: 60, + minimumCacheTTL: 86400, path: '/_next/image', qualities: [75], sizes: [ diff --git a/test/integration/next-image-new/unicode/test/index.test.ts b/test/integration/next-image-new/unicode/test/index.test.ts index 388df8aac99824..4f1d3099fc565f 100644 --- a/test/integration/next-image-new/unicode/test/index.test.ts +++ b/test/integration/next-image-new/unicode/test/index.test.ts @@ -94,7 +94,7 @@ function runTests(mode: 'server' | 'dev') { search: '', }, ], - minimumCacheTTL: 60, + minimumCacheTTL: 86400, path: '/_next/image', qualities: [75], sizes: [ diff --git a/test/integration/next-image-new/unoptimized/test/index.test.ts b/test/integration/next-image-new/unoptimized/test/index.test.ts index de58283a03ac24..0a8d4a76359a50 100644 --- a/test/integration/next-image-new/unoptimized/test/index.test.ts +++ b/test/integration/next-image-new/unoptimized/test/index.test.ts @@ -110,7 +110,7 @@ function runTests(url: string, mode: 'dev' | 'server') { loaderFile: '', remotePatterns: [], localPatterns: undefined, - minimumCacheTTL: 60, + minimumCacheTTL: 86400, path: '/_next/image', qualities: [75], sizes: [ From de125389f5cca271a0e73c220a87cbacdfb49bcf Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 22 Sep 2025 20:59:28 -0400 Subject: [PATCH 2/3] fix tests --- packages/next/src/server/image-optimizer.ts | 2 +- test/integration/image-optimizer/test/index.test.ts | 2 +- test/integration/image-optimizer/test/util.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/next/src/server/image-optimizer.ts b/packages/next/src/server/image-optimizer.ts index 727e812b6ae7da..f1f8c093386448 100644 --- a/packages/next/src/server/image-optimizer.ts +++ b/packages/next/src/server/image-optimizer.ts @@ -323,7 +323,7 @@ export class ImageOptimizerCache { deviceSizes = [], imageSizes = [], domains = [], - minimumCacheTTL = 60, + minimumCacheTTL = 86400, formats = ['image/webp'], } = imageData const remotePatterns = nextConfig.images?.remotePatterns || [] diff --git a/test/integration/image-optimizer/test/index.test.ts b/test/integration/image-optimizer/test/index.test.ts index 03b42fcf8a71c4..d8a3b815de7654 100644 --- a/test/integration/image-optimizer/test/index.test.ts +++ b/test/integration/image-optimizer/test/index.test.ts @@ -764,7 +764,7 @@ describe('Image Optimizer', () => { const res = await fetchViaHTTP(appPort, '/_next/image', query, opts) expect(res.status).toBe(200) expect(res.headers.get('Cache-Control')).toBe( - `public, max-age=60, must-revalidate` + `public, max-age=86400, must-revalidate` ) expect(res.headers.get('Content-Disposition')).toBe( `attachment; filename="test.webp"` diff --git a/test/integration/image-optimizer/test/util.ts b/test/integration/image-optimizer/test/util.ts index a5b1c7f96c129a..0af4d3a78ed02f 100644 --- a/test/integration/image-optimizer/test/util.ts +++ b/test/integration/image-optimizer/test/util.ts @@ -161,7 +161,7 @@ export function runTests(ctx: RunTestsCtx) { contentDispositionType = 'attachment', domains = [], formats = [], - minimumCacheTTL = 60, + minimumCacheTTL = 86400, } = nextConfigImages || {} const avifEnabled = formats[0] === 'image/avif' let slowImageServer: Awaited> From c40e7a30d85d7cdb1d90a97d75597663d7876bbb Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 23 Sep 2025 09:55:33 -0400 Subject: [PATCH 3/3] change to 4 hours --- docs/01-app/03-api-reference/02-components/image.mdx | 2 +- .../04-api-reference/01-components/image-legacy.mdx | 2 +- errors/invalid-images-config.mdx | 2 +- packages/next/src/server/image-optimizer.ts | 2 +- packages/next/src/shared/lib/image-config.ts | 2 +- test/integration/image-optimizer/test/index.test.ts | 8 ++++---- test/integration/image-optimizer/test/util.ts | 2 +- .../app-dir-localpatterns/test/index.test.ts | 2 +- .../next-image-new/app-dir-qualities/test/index.test.ts | 2 +- .../integration/next-image-new/app-dir/test/index.test.ts | 2 +- .../integration/next-image-new/unicode/test/index.test.ts | 2 +- .../next-image-new/unoptimized/test/index.test.ts | 2 +- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/01-app/03-api-reference/02-components/image.mdx b/docs/01-app/03-api-reference/02-components/image.mdx index 6968090eee268a..9836ac61004175 100644 --- a/docs/01-app/03-api-reference/02-components/image.mdx +++ b/docs/01-app/03-api-reference/02-components/image.mdx @@ -765,7 +765,7 @@ If no configuration is provided, the default below is used. ```js filename="next.config.js" module.exports = { images: { - minimumCacheTTL: 86400, // 1 day + minimumCacheTTL: 14400, // 4 hours }, } ``` diff --git a/docs/02-pages/04-api-reference/01-components/image-legacy.mdx b/docs/02-pages/04-api-reference/01-components/image-legacy.mdx index 8bfd3f4a4e02ef..e32802268e1270 100644 --- a/docs/02-pages/04-api-reference/01-components/image-legacy.mdx +++ b/docs/02-pages/04-api-reference/01-components/image-legacy.mdx @@ -561,7 +561,7 @@ If no configuration is provided, the default below is used. ```js filename="next.config.js" module.exports = { images: { - minimumCacheTTL: 86400, // 1 day + minimumCacheTTL: 14400, // 4 hours }, } ``` diff --git a/errors/invalid-images-config.mdx b/errors/invalid-images-config.mdx index 041a544515284a..f54852d003b855 100644 --- a/errors/invalid-images-config.mdx +++ b/errors/invalid-images-config.mdx @@ -28,7 +28,7 @@ module.exports = { // disable static imports for image files disableStaticImages: false, // minimumCacheTTL is in seconds, must be integer 0 or more - minimumCacheTTL: 86400, // (prev 60s then changed to 1d in next@16) + minimumCacheTTL: 14400, // 4 hours // ordered list of acceptable optimized image formats (mime types) formats: ['image/webp'], // enable dangerous use of SVG images diff --git a/packages/next/src/server/image-optimizer.ts b/packages/next/src/server/image-optimizer.ts index f1f8c093386448..6d4c098ec67ec3 100644 --- a/packages/next/src/server/image-optimizer.ts +++ b/packages/next/src/server/image-optimizer.ts @@ -323,7 +323,7 @@ export class ImageOptimizerCache { deviceSizes = [], imageSizes = [], domains = [], - minimumCacheTTL = 86400, + minimumCacheTTL = 14400, formats = ['image/webp'], } = imageData const remotePatterns = nextConfig.images?.remotePatterns || [] diff --git a/packages/next/src/shared/lib/image-config.ts b/packages/next/src/shared/lib/image-config.ts index 39e4b58f1b2bf4..177f35decdc9ac 100644 --- a/packages/next/src/shared/lib/image-config.ts +++ b/packages/next/src/shared/lib/image-config.ts @@ -135,7 +135,7 @@ export const imageConfigDefault: ImageConfigComplete = { loaderFile: '', domains: [], disableStaticImages: false, - minimumCacheTTL: 86400, // 1 day + minimumCacheTTL: 14400, // 4 hours formats: ['image/webp'], dangerouslyAllowSVG: false, contentSecurityPolicy: `script-src 'none'; frame-src 'none'; sandbox;`, diff --git a/test/integration/image-optimizer/test/index.test.ts b/test/integration/image-optimizer/test/index.test.ts index d8a3b815de7654..266218f60b4e25 100644 --- a/test/integration/image-optimizer/test/index.test.ts +++ b/test/integration/image-optimizer/test/index.test.ts @@ -709,7 +709,7 @@ describe('Image Optimizer', () => { headers: [ { key: 'Cache-Control', - value: 'public, max-age=86400, must-revalidate', + value: 'public, max-age=14400, must-revalidate', }, ], }, @@ -733,7 +733,7 @@ describe('Image Optimizer', () => { const res = await fetchViaHTTP(appPort, '/_next/image', query, opts) expect(res.status).toBe(200) expect(res.headers.get('Cache-Control')).toBe( - `public, max-age=86400, must-revalidate` + `public, max-age=14400, must-revalidate` ) expect(res.headers.get('Content-Disposition')).toBe( `attachment; filename="test.webp"` @@ -743,7 +743,7 @@ describe('Image Optimizer', () => { const files = await fsToJson(imagesDir) let found = false - const maxAge = '86400' + const maxAge = '14400' Object.keys(files).forEach((dir) => { if ( @@ -764,7 +764,7 @@ describe('Image Optimizer', () => { const res = await fetchViaHTTP(appPort, '/_next/image', query, opts) expect(res.status).toBe(200) expect(res.headers.get('Cache-Control')).toBe( - `public, max-age=86400, must-revalidate` + `public, max-age=14400, must-revalidate` ) expect(res.headers.get('Content-Disposition')).toBe( `attachment; filename="test.webp"` diff --git a/test/integration/image-optimizer/test/util.ts b/test/integration/image-optimizer/test/util.ts index 0af4d3a78ed02f..5cb09689c3c02c 100644 --- a/test/integration/image-optimizer/test/util.ts +++ b/test/integration/image-optimizer/test/util.ts @@ -161,7 +161,7 @@ export function runTests(ctx: RunTestsCtx) { contentDispositionType = 'attachment', domains = [], formats = [], - minimumCacheTTL = 86400, + minimumCacheTTL = 14400, } = nextConfigImages || {} const avifEnabled = formats[0] === 'image/avif' let slowImageServer: Awaited> diff --git a/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts b/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts index 0aef79e848e868..aa713be30cdabb 100644 --- a/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts +++ b/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts @@ -96,7 +96,7 @@ function runTests(mode: 'dev' | 'server') { search: '', }, ], - minimumCacheTTL: 86400, + minimumCacheTTL: 14400, path: '/_next/image', qualities: [75], sizes: [ diff --git a/test/integration/next-image-new/app-dir-qualities/test/index.test.ts b/test/integration/next-image-new/app-dir-qualities/test/index.test.ts index bc36f58ae68bdf..161771a1fe1ba4 100644 --- a/test/integration/next-image-new/app-dir-qualities/test/index.test.ts +++ b/test/integration/next-image-new/app-dir-qualities/test/index.test.ts @@ -102,7 +102,7 @@ function runTests(mode: 'dev' | 'server') { loaderFile: '', remotePatterns: [], localPatterns: undefined, - minimumCacheTTL: 86400, + minimumCacheTTL: 14400, path: '/_next/image', qualities: [42, 69, 88], sizes: [ diff --git a/test/integration/next-image-new/app-dir/test/index.test.ts b/test/integration/next-image-new/app-dir/test/index.test.ts index d93f368d496238..42d65e47345dfe 100644 --- a/test/integration/next-image-new/app-dir/test/index.test.ts +++ b/test/integration/next-image-new/app-dir/test/index.test.ts @@ -1785,7 +1785,7 @@ function runTests(mode: 'dev' | 'server') { loaderFile: '', remotePatterns: [], localPatterns: undefined, - minimumCacheTTL: 86400, + minimumCacheTTL: 14400, path: '/_next/image', qualities: [75], sizes: [ diff --git a/test/integration/next-image-new/unicode/test/index.test.ts b/test/integration/next-image-new/unicode/test/index.test.ts index 4f1d3099fc565f..29e722a3bea621 100644 --- a/test/integration/next-image-new/unicode/test/index.test.ts +++ b/test/integration/next-image-new/unicode/test/index.test.ts @@ -94,7 +94,7 @@ function runTests(mode: 'server' | 'dev') { search: '', }, ], - minimumCacheTTL: 86400, + minimumCacheTTL: 14400, path: '/_next/image', qualities: [75], sizes: [ diff --git a/test/integration/next-image-new/unoptimized/test/index.test.ts b/test/integration/next-image-new/unoptimized/test/index.test.ts index 0a8d4a76359a50..6aa7049a9cf4d5 100644 --- a/test/integration/next-image-new/unoptimized/test/index.test.ts +++ b/test/integration/next-image-new/unoptimized/test/index.test.ts @@ -110,7 +110,7 @@ function runTests(url: string, mode: 'dev' | 'server') { loaderFile: '', remotePatterns: [], localPatterns: undefined, - minimumCacheTTL: 86400, + minimumCacheTTL: 14400, path: '/_next/image', qualities: [75], sizes: [