From 3abd1e97a4782c4076baa488c095f28963d6d27e Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Wed, 13 Aug 2025 02:16:40 +0200 Subject: [PATCH 1/7] fix: should not warn depredated config if next config file is not defined --- packages/next/src/server/config.ts | 6 ++- .../warn-removed-experimental-config.test.ts | 39 ++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/packages/next/src/server/config.ts b/packages/next/src/server/config.ts index f4f29a4fef6fd..18b0df0421447 100644 --- a/packages/next/src/server/config.ts +++ b/packages/next/src/server/config.ts @@ -71,17 +71,19 @@ export function warnOptionHasBeenDeprecated( let hasWarned = false if (!silent) { let current = config - let found = true + let found = false const nestedPropertyKeys = nestedPropertyKey.split('.') for (const key of nestedPropertyKeys) { if (current[key] !== undefined) { current = current[key] + found = true } else { found = false break } } - if (found) { + + if (found && config.configFile) { Log.warnOnce(reason) hasWarned = true } diff --git a/test/unit/warn-removed-experimental-config.test.ts b/test/unit/warn-removed-experimental-config.test.ts index e7cfc2924d78f..29593e068839b 100644 --- a/test/unit/warn-removed-experimental-config.test.ts +++ b/test/unit/warn-removed-experimental-config.test.ts @@ -1,6 +1,7 @@ import { warnOptionHasBeenMovedOutOfExperimental, warnOptionHasBeenDeprecated, + NextConfig, } from 'next/dist/server/config' import stripAnsi from 'strip-ansi' @@ -139,9 +140,12 @@ describe('warnOptionHasBeenMovedOutOfExperimental', () => { describe('warnOptionHasBeenDeprecated', () => { let spy: jest.SpyInstance - beforeAll(() => { + beforeEach(() => { spy = jest.spyOn(console, 'warn').mockImplementation(() => {}) }) + afterEach(() => { + spy.mockRestore() + }) it('should warn experimental.appDir has been deprecated', () => { const config = { @@ -157,4 +161,37 @@ describe('warnOptionHasBeenDeprecated', () => { ) expect(spy).toHaveBeenCalled() }) + + it('should not warn when config file is not defined', () => { + // When config file is not defined, the configFileName is default value, + // the configFile is undefined. + const config: NextConfig = { + configFile: undefined, + configFileName: 'next.config.js', + } + + warnOptionHasBeenDeprecated( + config, + 'experimental.appDir', + 'experimental.appDir has been removed', + false + ) + + expect(spy).not.toHaveBeenCalled() + }) + + it('should not warn when config key doesn not match', () => { + const config = { + badAssetPrefixKey: '/bar', + } + + warnOptionHasBeenDeprecated( + config, + 'assetPrefix', + 'assetPrefix is gone', + false + ) + + expect(spy).not.toHaveBeenCalled() + }) }) From e8a27f08c469dd577070e197cccf5af4dd82d9bb Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Wed, 13 Aug 2025 02:53:54 +0200 Subject: [PATCH 2/7] fix test --- packages/next/src/server/config.test.ts | 6 ++++-- packages/next/src/server/config.ts | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/next/src/server/config.test.ts b/packages/next/src/server/config.test.ts index ccdc235beb854..2c3c050375a14 100644 --- a/packages/next/src/server/config.test.ts +++ b/packages/next/src/server/config.test.ts @@ -194,7 +194,7 @@ describe('loadConfig', () => { dynamicIO: true, }, }, - silent: true, + silent: false, }) expect(result.experimental.cacheComponents).toBe(true) @@ -212,8 +212,9 @@ describe('loadConfig', () => { dynamicIO: true, cacheComponents: false, }, + configFile: '/project/next.config.js', }, - silent: true, + silent: false, }) expect(result.experimental.cacheComponents).toBe(false) @@ -232,6 +233,7 @@ describe('loadConfig', () => { experimental: { dynamicIO: true, }, + configFile: '/project/next.config.js', }, silent: false, }) diff --git a/packages/next/src/server/config.ts b/packages/next/src/server/config.ts index 18b0df0421447..cef450319b197 100644 --- a/packages/next/src/server/config.ts +++ b/packages/next/src/server/config.ts @@ -78,7 +78,6 @@ export function warnOptionHasBeenDeprecated( current = current[key] found = true } else { - found = false break } } From 8167bd408a9747289ed5f7fe924a0de8b880a58f Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Wed, 13 Aug 2025 09:42:51 +0200 Subject: [PATCH 3/7] log all warnings against userConfig --- packages/next/src/server/config.ts | 31 +++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/next/src/server/config.ts b/packages/next/src/server/config.ts index cef450319b197..e784d4737788e 100644 --- a/packages/next/src/server/config.ts +++ b/packages/next/src/server/config.ts @@ -569,9 +569,14 @@ function assignDefaults( ) if ( hasWarnedBuildActivityPosition && - result.devIndicators !== false && - 'buildActivityPosition' in result.devIndicators && - result.devIndicators.buildActivityPosition !== result.devIndicators.position + userConfig.devIndicators !== false && + userConfig.devIndicators && + 'buildActivityPosition' in userConfig.devIndicators && + userConfig.devIndicators.position && + userConfig.devIndicators.buildActivityPosition !== + userConfig.devIndicators.position && + result.devIndicators && + 'buildActivityPosition' in result.devIndicators ) { Log.warnOnce( `The \`devIndicators\` option \`buildActivityPosition\` ("${result.devIndicators.buildActivityPosition}") conflicts with \`position\` ("${result.devIndicators.position}"). Using \`buildActivityPosition\` ("${result.devIndicators.buildActivityPosition}") for backward compatibility.` @@ -580,28 +585,28 @@ function assignDefaults( } warnOptionHasBeenMovedOutOfExperimental( - result, + userConfig, 'bundlePagesExternals', 'bundlePagesRouterDependencies', configFileName, silent ) warnOptionHasBeenMovedOutOfExperimental( - result, + userConfig, 'serverComponentsExternalPackages', 'serverExternalPackages', configFileName, silent ) warnOptionHasBeenMovedOutOfExperimental( - result, + userConfig, 'relay', 'compiler.relay', configFileName, silent ) warnOptionHasBeenMovedOutOfExperimental( - result, + userConfig, 'styledComponents', 'compiler.styledComponents', configFileName, @@ -615,42 +620,42 @@ function assignDefaults( silent ) warnOptionHasBeenMovedOutOfExperimental( - result, + userConfig, 'reactRemoveProperties', 'compiler.reactRemoveProperties', configFileName, silent ) warnOptionHasBeenMovedOutOfExperimental( - result, + userConfig, 'removeConsole', 'compiler.removeConsole', configFileName, silent ) warnOptionHasBeenMovedOutOfExperimental( - result, + userConfig, 'swrDelta', 'expireTime', configFileName, silent ) warnOptionHasBeenMovedOutOfExperimental( - result, + userConfig, 'outputFileTracingRoot', 'outputFileTracingRoot', configFileName, silent ) warnOptionHasBeenMovedOutOfExperimental( - result, + userConfig, 'outputFileTracingIncludes', 'outputFileTracingIncludes', configFileName, silent ) warnOptionHasBeenMovedOutOfExperimental( - result, + userConfig, 'outputFileTracingExcludes', 'outputFileTracingExcludes', configFileName, From 1c92717cf4741fe2caca75fe65d6e59a79288eed Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Wed, 13 Aug 2025 12:09:28 +0200 Subject: [PATCH 4/7] more userConfig --- packages/next/src/server/config.ts | 16 ++++++++-------- .../build-indicator/test/index.test.js | 15 ++++++++------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/next/src/server/config.ts b/packages/next/src/server/config.ts index e784d4737788e..3c4ff78cb736a 100644 --- a/packages/next/src/server/config.ts +++ b/packages/next/src/server/config.ts @@ -71,13 +71,13 @@ export function warnOptionHasBeenDeprecated( let hasWarned = false if (!silent) { let current = config - let found = false + let found = true const nestedPropertyKeys = nestedPropertyKey.split('.') for (const key of nestedPropertyKeys) { if (current[key] !== undefined) { current = current[key] - found = true } else { + found = false break } } @@ -525,7 +525,7 @@ function assignDefaults( } warnCustomizedOption( - result, + userConfig, 'experimental.esmExternals', true, 'experimental.esmExternals is not recommended to be modified as it may disrupt module resolution', @@ -534,35 +534,35 @@ function assignDefaults( ) warnOptionHasBeenDeprecated( - result, + userConfig, 'experimental.instrumentationHook', `\`experimental.instrumentationHook\` is no longer needed, because \`instrumentation.js\` is available by default. You can remove it from ${configFileName}.`, silent ) warnOptionHasBeenDeprecated( - result, + userConfig, 'experimental.after', `\`experimental.after\` is no longer needed, because \`after\` is available by default. You can remove it from ${configFileName}.`, silent ) warnOptionHasBeenDeprecated( - result, + userConfig, 'devIndicators.appIsrStatus', `\`devIndicators.appIsrStatus\` is deprecated and no longer configurable. Please remove it from ${configFileName}.`, silent ) warnOptionHasBeenDeprecated( - result, + userConfig, 'devIndicators.buildActivity', `\`devIndicators.buildActivity\` is deprecated and no longer configurable. Please remove it from ${configFileName}.`, silent ) const hasWarnedBuildActivityPosition = warnOptionHasBeenDeprecated( - result, + userConfig, 'devIndicators.buildActivityPosition', `\`devIndicators.buildActivityPosition\` has been renamed to \`devIndicators.position\`. Please update your ${configFileName} file accordingly.`, silent diff --git a/test/integration/build-indicator/test/index.test.js b/test/integration/build-indicator/test/index.test.js index bfdf78a4e1b31..704f3b6bf2913 100644 --- a/test/integration/build-indicator/test/index.test.js +++ b/test/integration/build-indicator/test/index.test.js @@ -3,7 +3,7 @@ import fs from 'fs-extra' import { join } from 'path' import webdriver from 'next-webdriver' -import { findPort, launchApp, killApp, waitFor, check } from 'next-test-utils' +import { findPort, launchApp, killApp, waitFor, retry } from 'next-test-utils' import stripAnsi from 'strip-ansi' const appDir = join(__dirname, '..') @@ -33,7 +33,7 @@ describe('Build Activity Indicator', () => { ` module.exports = { devIndicators: { - buildActivityPosition: 'ttop-leff' + buildActivityPosition: 'top-leff' } } ` @@ -47,12 +47,13 @@ describe('Build Activity Indicator', () => { }) await fs.remove(configPath) - await check( - () => stripAnsi(stderr), - new RegExp( - `Invalid "devIndicator.position" provided, expected one of top-left, top-right, bottom-left, bottom-right, received ttop-leff` + await retry(() => { + const cleanStderr = stripAnsi(stderr) + // buildActivityPosition is deprecated, but we should warn it's not a valid option + expect(cleanStderr).toContain( + `Invalid input at "devIndicators.buildActivityPosition"` ) - ) + }) if (app) { await killApp(app) From e3341c286d6ae15b5a25c1096c9879339375df25 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Wed, 13 Aug 2025 12:30:04 +0200 Subject: [PATCH 5/7] fix test fixture --- test/production/pnpm-support/app-multi-page/next.config.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/production/pnpm-support/app-multi-page/next.config.js b/test/production/pnpm-support/app-multi-page/next.config.js index 219370f0d7b0a..80b49c916fd0a 100644 --- a/test/production/pnpm-support/app-multi-page/next.config.js +++ b/test/production/pnpm-support/app-multi-page/next.config.js @@ -2,8 +2,6 @@ const path = require('path') module.exports = { output: 'standalone', - experimental: { - // pnpm virtual-store-dir is outside the app directory - outputFileTracingRoot: path.resolve(__dirname, '../'), - }, + // pnpm virtual-store-dir is outside the app directory + outputFileTracingRoot: path.resolve(__dirname, '../'), } From 23424cccf58444169ab13fba32b7a7d41937a6aa Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Wed, 13 Aug 2025 16:12:11 +0200 Subject: [PATCH 6/7] revert --- packages/next/src/server/config.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/next/src/server/config.test.ts b/packages/next/src/server/config.test.ts index 2c3c050375a14..771292eb3ce90 100644 --- a/packages/next/src/server/config.test.ts +++ b/packages/next/src/server/config.test.ts @@ -194,7 +194,7 @@ describe('loadConfig', () => { dynamicIO: true, }, }, - silent: false, + silent: true, }) expect(result.experimental.cacheComponents).toBe(true) @@ -214,7 +214,7 @@ describe('loadConfig', () => { }, configFile: '/project/next.config.js', }, - silent: false, + silent: true, }) expect(result.experimental.cacheComponents).toBe(false) From b68f0bbcbbc047ffd761007170df12fc7d6ce93e Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Wed, 13 Aug 2025 16:15:40 +0200 Subject: [PATCH 7/7] Update test/unit/warn-removed-experimental-config.test.ts Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> --- test/unit/warn-removed-experimental-config.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/warn-removed-experimental-config.test.ts b/test/unit/warn-removed-experimental-config.test.ts index 29593e068839b..db82e1c41c2f2 100644 --- a/test/unit/warn-removed-experimental-config.test.ts +++ b/test/unit/warn-removed-experimental-config.test.ts @@ -180,7 +180,7 @@ describe('warnOptionHasBeenDeprecated', () => { expect(spy).not.toHaveBeenCalled() }) - it('should not warn when config key doesn not match', () => { + it('should not warn when config key does not match', () => { const config = { badAssetPrefixKey: '/bar', }