diff --git a/packages/next/config.js b/packages/next/config.js index 668ee7c54f0e..dd6f7b1f1253 100644 --- a/packages/next/config.js +++ b/packages/next/config.js @@ -1 +1,12 @@ -module.exports = require('./dist/shared/lib/runtime-config.external') +let hasWarned = false + +module.exports = (() => { + if (!hasWarned) { + console.warn( + // ANSI code aligns with Next.js warning style from picocolors. + ' \x1b[33m\x1b[1m⚠\x1b[22m\x1b[39m Runtime config is deprecated and will be removed in Next.js 16. Please remove the usage of "next/config" from your project.' + ) + hasWarned = true + } + return require('./dist/shared/lib/runtime-config.external') +})() diff --git a/packages/next/src/server/config-shared.ts b/packages/next/src/server/config-shared.ts index d970e2b7b098..b12215629ea4 100644 --- a/packages/next/src/server/config-shared.ts +++ b/packages/next/src/server/config-shared.ts @@ -1118,14 +1118,16 @@ export interface NextConfig { /** * Add public (in browser) runtime configuration to your app * - * @see [Runtime configuration](https://nextjs.org/docs/pages/api-reference/config/next-config-js/runtime-configuration + * @see [Runtime configuration](https://nextjs.org/docs/pages/api-reference/config/next-config-js/runtime-configuration) + * @deprecated Runtime config is deprecated and will be removed in Next.js 16. */ publicRuntimeConfig?: { [key: string]: any } /** * Add server runtime configuration to your app * - * @see [Runtime configuration](https://nextjs.org/docs/pages/api-reference/config/next-config-js/runtime-configuration + * @see [Runtime configuration](https://nextjs.org/docs/pages/api-reference/config/next-config-js/runtime-configuration) + * @deprecated Runtime config is deprecated and will be removed in Next.js 16. */ serverRuntimeConfig?: { [key: string]: any } diff --git a/packages/next/src/server/config.ts b/packages/next/src/server/config.ts index d5d50db2ee95..33636da3b3a9 100644 --- a/packages/next/src/server/config.ts +++ b/packages/next/src/server/config.ts @@ -109,6 +109,19 @@ function checkDeprecations( silent: boolean, dir: string ) { + warnOptionHasBeenDeprecated( + userConfig, + 'publicRuntimeConfig', + `Runtime config is deprecated and the \`publicRuntimeConfig\` configuration option will be removed in Next.js 16.`, + silent + ) + warnOptionHasBeenDeprecated( + userConfig, + 'serverRuntimeConfig', + `Runtime config is deprecated and the \`serverRuntimeConfig\` configuration option will be removed in Next.js 16.`, + silent + ) + if (userConfig.experimental?.dynamicIO !== undefined) { warnOptionHasBeenDeprecated( userConfig, diff --git a/packages/next/src/shared/lib/runtime-config.external.ts b/packages/next/src/shared/lib/runtime-config.external.ts index b4a48a362d63..1a294922c94c 100644 --- a/packages/next/src/shared/lib/runtime-config.external.ts +++ b/packages/next/src/shared/lib/runtime-config.external.ts @@ -1,9 +1,15 @@ let runtimeConfig: any +/** + * @deprecated Runtime config is deprecated and will be removed in Next.js 16. + */ export default () => { return runtimeConfig } +/** + * @deprecated Runtime config is deprecated and will be removed in Next.js 16. + */ export function setConfig(configValue: any): void { runtimeConfig = configValue } diff --git a/test/e2e/app-dir/deprecation-warning-runtime-config/app/layout.tsx b/test/e2e/app-dir/deprecation-warning-runtime-config/app/layout.tsx new file mode 100644 index 000000000000..888614deda3b --- /dev/null +++ b/test/e2e/app-dir/deprecation-warning-runtime-config/app/layout.tsx @@ -0,0 +1,8 @@ +import { ReactNode } from 'react' +export default function Root({ children }: { children: ReactNode }) { + return ( + + {children} + + ) +} diff --git a/test/e2e/app-dir/deprecation-warning-runtime-config/app/page.tsx b/test/e2e/app-dir/deprecation-warning-runtime-config/app/page.tsx new file mode 100644 index 000000000000..b11185cc1000 --- /dev/null +++ b/test/e2e/app-dir/deprecation-warning-runtime-config/app/page.tsx @@ -0,0 +1,6 @@ +import getConfig from 'next/config' + +export default function Page() { + getConfig() + return

hello world

+} diff --git a/test/e2e/app-dir/deprecation-warning-runtime-config/deprecation-warning-runtime-config.test.ts b/test/e2e/app-dir/deprecation-warning-runtime-config/deprecation-warning-runtime-config.test.ts new file mode 100644 index 000000000000..19c3bbfd403c --- /dev/null +++ b/test/e2e/app-dir/deprecation-warning-runtime-config/deprecation-warning-runtime-config.test.ts @@ -0,0 +1,16 @@ +import { nextTestSetup } from 'e2e-utils' + +describe('deprecation-warning-runtime-config', () => { + const { next } = nextTestSetup({ + files: __dirname, + }) + + it('should warn when imported "next/config" module', async () => { + // Navigate to "/" for dev server to execute the code + await next.browser('/') + + expect(next.cliOutput).toContain( + 'Runtime config is deprecated and will be removed in Next.js 16. Please remove the usage of "next/config" from your project.' + ) + }) +}) diff --git a/test/e2e/app-dir/deprecation-warning-runtime-config/next.config.js b/test/e2e/app-dir/deprecation-warning-runtime-config/next.config.js new file mode 100644 index 000000000000..789b3b853ebe --- /dev/null +++ b/test/e2e/app-dir/deprecation-warning-runtime-config/next.config.js @@ -0,0 +1,13 @@ +/** + * @type {import('next').NextConfig} + */ +const nextConfig = { + publicRuntimeConfig: { + foo: 'bar', + }, + serverRuntimeConfig: { + foo: 'bar', + }, +} + +module.exports = nextConfig diff --git a/test/e2e/deprecation-warnings/deprecation-warnings.test.ts b/test/e2e/deprecation-warnings/deprecation-warnings.test.ts index 3be6fa6e0bb2..941b9a48b83f 100644 --- a/test/e2e/deprecation-warnings/deprecation-warnings.test.ts +++ b/test/e2e/deprecation-warnings/deprecation-warnings.test.ts @@ -32,6 +32,14 @@ describe('deprecation-warnings', () => { // Should warn about experimental.instrumentationHook expect(logs).toContain('experimental.instrumentationHook') expect(logs).toContain('no longer needed') + + // Should warn about publicRuntimeConfig + expect(logs).toContain('publicRuntimeConfig') + expect(logs).toContain('will be removed in Next.js 16') + + // Should warn about serverRuntimeConfig + expect(logs).toContain('serverRuntimeConfig') + expect(logs).toContain('will be removed in Next.js 16') }) }) }) diff --git a/test/e2e/deprecation-warnings/fixtures/with-deprecated-config/next.config.js b/test/e2e/deprecation-warnings/fixtures/with-deprecated-config/next.config.js index 904121504f6e..e966bf4e380c 100644 --- a/test/e2e/deprecation-warnings/fixtures/with-deprecated-config/next.config.js +++ b/test/e2e/deprecation-warnings/fixtures/with-deprecated-config/next.config.js @@ -1,6 +1,13 @@ +/** @type {import('next').NextConfig} */ module.exports = { // Explicitly configure deprecated options experimental: { instrumentationHook: true, }, + publicRuntimeConfig: { + foo: 'bar', + }, + serverRuntimeConfig: { + foo: 'bar', + }, }