From 9d1e94d56d4d3ad8ff0119192733b760fe8752ad Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Wed, 16 Jul 2025 13:25:12 -0600 Subject: [PATCH 1/7] fix: revert client segment route changes for sub shell generation (#81731) Reverts changes to the `routes-manifest.json` from #81321. Incorrect route sorting was causing some routing errors. --- packages/next/src/build/index.ts | 34 +++---------------- .../sub-shell-generation.test.ts | 2 ++ 2 files changed, 6 insertions(+), 30 deletions(-) diff --git a/packages/next/src/build/index.ts b/packages/next/src/build/index.ts index c203498fa7824..4a34ad711c336 100644 --- a/packages/next/src/build/index.ts +++ b/packages/next/src/build/index.ts @@ -3103,44 +3103,18 @@ export default async function build( } let prefetchDataRoute: string | undefined - let dynamicRoute = routesManifest.dynamicRoutes.find( - (r) => r.page === route.pathname - ) if (!isAppRouteHandler && isAppPPREnabled) { prefetchDataRoute = path.posix.join( `${normalizedRoute}${RSC_PREFETCH_SUFFIX}` ) - - // If the dynamic route wasn't found, then we need to create - // it. This ensures that for each fallback shell there's an - // entry in the app routes manifest which enables routing for - // this fallback shell. - if (!dynamicRoute) { - dynamicRoute = pageToRoute(route.pathname) - - // This route is not for the internal router, but instead - // for external routers. - dynamicRoute.skipInternalRouting = true - - // Push this to the end of the array. The dynamic routes are - // sorted by page later. - routesManifest.dynamicRoutes.push(dynamicRoute) - } } if (!isAppRouteHandler && metadata?.segmentPaths) { - // If PPR isn't enabled, then we might not find the dynamic - // route by pathname. If that's the case, we need to find the - // route by page. + const dynamicRoute = routesManifest.dynamicRoutes.find( + (r) => r.page === page + ) if (!dynamicRoute) { - dynamicRoute = routesManifest.dynamicRoutes.find( - (r) => r.page === page - ) - - // If it can't be found by page, we must throw an error. - if (!dynamicRoute) { - throw new InvariantError('Dynamic route not found') - } + throw new InvariantError('Dynamic route not found') } dynamicRoute.prefetchSegmentDataRoutes ??= [] diff --git a/test/e2e/app-dir/sub-shell-generation/sub-shell-generation.test.ts b/test/e2e/app-dir/sub-shell-generation/sub-shell-generation.test.ts index 4c02303e4a149..8f9c0b769c67b 100644 --- a/test/e2e/app-dir/sub-shell-generation/sub-shell-generation.test.ts +++ b/test/e2e/app-dir/sub-shell-generation/sub-shell-generation.test.ts @@ -4,6 +4,8 @@ import * as cheerio from 'cheerio' describe('sub-shell-generation', () => { const { next, isNextDev, isNextDeploy } = nextTestSetup({ files: __dirname, + // FIXME: re-enable once we've re-enabled the sub-shell generation in Vercel + skipDeployment: true, }) if (isNextDev) { From 40d2fa9b5e578c71989251ad387214ffb2c1507f Mon Sep 17 00:00:00 2001 From: nextjs-bot Date: Wed, 16 Jul 2025 19:31:14 +0000 Subject: [PATCH 2/7] v15.4.2-canary.4 --- lerna.json | 2 +- packages/create-next-app/package.json | 2 +- packages/eslint-config-next/package.json | 4 ++-- packages/eslint-plugin-internal/package.json | 2 +- packages/eslint-plugin-next/package.json | 2 +- packages/font/package.json | 2 +- packages/next-bundle-analyzer/package.json | 2 +- packages/next-codemod/package.json | 2 +- packages/next-env/package.json | 2 +- packages/next-mdx/package.json | 2 +- packages/next-plugin-storybook/package.json | 2 +- packages/next-polyfill-module/package.json | 2 +- packages/next-polyfill-nomodule/package.json | 2 +- packages/next-rspack/package.json | 2 +- packages/next-swc/package.json | 2 +- packages/next/package.json | 14 +++++++------- packages/react-refresh-utils/package.json | 2 +- packages/third-parties/package.json | 4 ++-- pnpm-lock.yaml | 16 ++++++++-------- 19 files changed, 34 insertions(+), 34 deletions(-) diff --git a/lerna.json b/lerna.json index 8e41bfbfc5cf7..44709b88cbc6d 100644 --- a/lerna.json +++ b/lerna.json @@ -16,5 +16,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "15.4.2-canary.3" + "version": "15.4.2-canary.4" } diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json index 92b4d80b520df..aedb243b132bc 100644 --- a/packages/create-next-app/package.json +++ b/packages/create-next-app/package.json @@ -1,6 +1,6 @@ { "name": "create-next-app", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "keywords": [ "react", "next", diff --git a/packages/eslint-config-next/package.json b/packages/eslint-config-next/package.json index 9798362d069c1..bdc59188f0008 100644 --- a/packages/eslint-config-next/package.json +++ b/packages/eslint-config-next/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-next", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "description": "ESLint configuration used by Next.js.", "main": "index.js", "license": "MIT", @@ -10,7 +10,7 @@ }, "homepage": "https://nextjs.org/docs/app/api-reference/config/eslint", "dependencies": { - "@next/eslint-plugin-next": "15.4.2-canary.3", + "@next/eslint-plugin-next": "15.4.2-canary.4", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", diff --git a/packages/eslint-plugin-internal/package.json b/packages/eslint-plugin-internal/package.json index d095c5636dccb..eedc51d8d1a1b 100644 --- a/packages/eslint-plugin-internal/package.json +++ b/packages/eslint-plugin-internal/package.json @@ -1,7 +1,7 @@ { "name": "@next/eslint-plugin-internal", "private": true, - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "description": "ESLint plugin for working on Next.js.", "exports": { ".": "./src/eslint-plugin-internal.js" diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json index 4bb417e5432c3..d49f2fe83f721 100644 --- a/packages/eslint-plugin-next/package.json +++ b/packages/eslint-plugin-next/package.json @@ -1,6 +1,6 @@ { "name": "@next/eslint-plugin-next", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "description": "ESLint plugin for Next.js.", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/font/package.json b/packages/font/package.json index f2a8d22066192..30906e24c5e4f 100644 --- a/packages/font/package.json +++ b/packages/font/package.json @@ -1,7 +1,7 @@ { "name": "@next/font", "private": true, - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "repository": { "url": "vercel/next.js", "directory": "packages/font" diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json index 301ed217534eb..0faf2423cbe6e 100644 --- a/packages/next-bundle-analyzer/package.json +++ b/packages/next-bundle-analyzer/package.json @@ -1,6 +1,6 @@ { "name": "@next/bundle-analyzer", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "main": "index.js", "types": "index.d.ts", "license": "MIT", diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json index 52f2a25f204e8..609f49c56794d 100644 --- a/packages/next-codemod/package.json +++ b/packages/next-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@next/codemod", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "license": "MIT", "repository": { "type": "git", diff --git a/packages/next-env/package.json b/packages/next-env/package.json index f5270b4f8c38b..0e7a6ec1561d2 100644 --- a/packages/next-env/package.json +++ b/packages/next-env/package.json @@ -1,6 +1,6 @@ { "name": "@next/env", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "keywords": [ "react", "next", diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json index 112029e77f20d..ec3e45ecbb2bc 100644 --- a/packages/next-mdx/package.json +++ b/packages/next-mdx/package.json @@ -1,6 +1,6 @@ { "name": "@next/mdx", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json index 55904e97b4d4b..0fabbca3302f6 100644 --- a/packages/next-plugin-storybook/package.json +++ b/packages/next-plugin-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-storybook", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-storybook" diff --git a/packages/next-polyfill-module/package.json b/packages/next-polyfill-module/package.json index 1ea52e1f2de7c..37370f5169984 100644 --- a/packages/next-polyfill-module/package.json +++ b/packages/next-polyfill-module/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-module", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)", "main": "dist/polyfill-module.js", "license": "MIT", diff --git a/packages/next-polyfill-nomodule/package.json b/packages/next-polyfill-nomodule/package.json index 2f94126a6b2d8..0b2d84c72c446 100644 --- a/packages/next-polyfill-nomodule/package.json +++ b/packages/next-polyfill-nomodule/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-nomodule", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "description": "A polyfill for non-dead, nomodule browsers.", "main": "dist/polyfill-nomodule.js", "license": "MIT", diff --git a/packages/next-rspack/package.json b/packages/next-rspack/package.json index 38ca84cf5133e..ff957f9b390df 100644 --- a/packages/next-rspack/package.json +++ b/packages/next-rspack/package.json @@ -1,6 +1,6 @@ { "name": "next-rspack", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "repository": { "url": "vercel/next.js", "directory": "packages/next-rspack" diff --git a/packages/next-swc/package.json b/packages/next-swc/package.json index e176784ee60dd..0cc946902c44f 100644 --- a/packages/next-swc/package.json +++ b/packages/next-swc/package.json @@ -1,6 +1,6 @@ { "name": "@next/swc", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "private": true, "files": [ "native/" diff --git a/packages/next/package.json b/packages/next/package.json index 92892e124d3e3..49d9dc7460623 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -100,7 +100,7 @@ ] }, "dependencies": { - "@next/env": "15.4.2-canary.3", + "@next/env": "15.4.2-canary.4", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -163,11 +163,11 @@ "@jest/types": "29.5.0", "@mswjs/interceptors": "0.23.0", "@napi-rs/triples": "1.2.0", - "@next/font": "15.4.2-canary.3", - "@next/polyfill-module": "15.4.2-canary.3", - "@next/polyfill-nomodule": "15.4.2-canary.3", - "@next/react-refresh-utils": "15.4.2-canary.3", - "@next/swc": "15.4.2-canary.3", + "@next/font": "15.4.2-canary.4", + "@next/polyfill-module": "15.4.2-canary.4", + "@next/polyfill-nomodule": "15.4.2-canary.4", + "@next/react-refresh-utils": "15.4.2-canary.4", + "@next/swc": "15.4.2-canary.4", "@opentelemetry/api": "1.6.0", "@playwright/test": "1.51.1", "@rspack/core": "1.4.5", diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json index 84c8617a7d3b8..174bc90b18c98 100644 --- a/packages/react-refresh-utils/package.json +++ b/packages/react-refresh-utils/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-refresh-utils", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "description": "An experimental package providing utilities for React Refresh.", "repository": { "url": "vercel/next.js", diff --git a/packages/third-parties/package.json b/packages/third-parties/package.json index a06029a910004..182c3e5523d0d 100644 --- a/packages/third-parties/package.json +++ b/packages/third-parties/package.json @@ -1,6 +1,6 @@ { "name": "@next/third-parties", - "version": "15.4.2-canary.3", + "version": "15.4.2-canary.4", "repository": { "url": "vercel/next.js", "directory": "packages/third-parties" @@ -26,7 +26,7 @@ "third-party-capital": "1.0.20" }, "devDependencies": { - "next": "15.4.2-canary.3", + "next": "15.4.2-canary.4", "outdent": "0.8.0", "prettier": "2.5.1", "typescript": "5.8.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9eb08f4c92a5..1cbf779ae7932 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -854,7 +854,7 @@ importers: packages/eslint-config-next: dependencies: '@next/eslint-plugin-next': - specifier: 15.4.2-canary.3 + specifier: 15.4.2-canary.4 version: link:../eslint-plugin-next '@rushstack/eslint-patch': specifier: ^1.10.3 @@ -924,7 +924,7 @@ importers: packages/next: dependencies: '@next/env': - specifier: 15.4.2-canary.3 + specifier: 15.4.2-canary.4 version: link:../next-env '@swc/helpers': specifier: 0.5.15 @@ -1046,19 +1046,19 @@ importers: specifier: 1.2.0 version: 1.2.0 '@next/font': - specifier: 15.4.2-canary.3 + specifier: 15.4.2-canary.4 version: link:../font '@next/polyfill-module': - specifier: 15.4.2-canary.3 + specifier: 15.4.2-canary.4 version: link:../next-polyfill-module '@next/polyfill-nomodule': - specifier: 15.4.2-canary.3 + specifier: 15.4.2-canary.4 version: link:../next-polyfill-nomodule '@next/react-refresh-utils': - specifier: 15.4.2-canary.3 + specifier: 15.4.2-canary.4 version: link:../react-refresh-utils '@next/swc': - specifier: 15.4.2-canary.3 + specifier: 15.4.2-canary.4 version: link:../next-swc '@opentelemetry/api': specifier: 1.6.0 @@ -1758,7 +1758,7 @@ importers: version: 1.0.20 devDependencies: next: - specifier: 15.4.2-canary.3 + specifier: 15.4.2-canary.4 version: link:../next outdent: specifier: 0.8.0 From 2eac9dccd85d8ec941c416de5f8f01236a8f1e2e Mon Sep 17 00:00:00 2001 From: Ben Gubler Date: Wed, 16 Jul 2025 13:58:34 -0700 Subject: [PATCH 3/7] chore: update username from 'nebrelbug' to 'bgub' (#81734) ## Update GitHub username in labeler configuration I just changed my username from "nebrelbug" to "bgub" --- .github/labeler.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/labeler.json b/.github/labeler.json index 9b74fd4e216b8..1a1e59dc6c2fc 100644 --- a/.github/labeler.json +++ b/.github/labeler.json @@ -59,7 +59,7 @@ { "type": "user", "pattern": "ijjk" }, { "type": "user", "pattern": "lazarv" }, { "type": "user", "pattern": "lubieowoce" }, - { "type": "user", "pattern": "nebrelbug" }, + { "type": "user", "pattern": "bgub" }, { "type": "user", "pattern": "RobPruzan" }, { "type": "user", "pattern": "samcx" }, { "type": "user", "pattern": "sebmarkbage" }, From 63090e20f198f7bda7bb746e29fe6a25a1391d8c Mon Sep 17 00:00:00 2001 From: Zack Tanner <1939140+ztanner@users.noreply.github.com> Date: Wed, 16 Jul 2025 14:25:01 -0700 Subject: [PATCH 4/7] fix: pages router metadata bugs with React 19 (#81733) When we updated `experimental.strictNextHead` to be true in #65418, we did not update all spots that would default to true in the case where the value was omitted entirely. This led to the default value not being correctly applied in pages router, which resulted in duplicate metadata w/ React 19. Since we made the flag the default, we can also probably clean up this flag all together, but that can be done separately. Fixes #81655 Fixes #81689 --- packages/next/src/build/templates/pages.ts | 5 +- packages/next/src/server/config-shared.ts | 1 + .../client-navigation/fixture/next.config.js | 9 +- .../pages/head-with-custom-metadata.js | 14 ++ .../client-navigation/rendering-head.test.ts | 132 +++++++++++------- 5 files changed, 106 insertions(+), 55 deletions(-) create mode 100644 test/development/pages-dir/client-navigation/fixture/pages/head-with-custom-metadata.js diff --git a/packages/next/src/build/templates/pages.ts b/packages/next/src/build/templates/pages.ts index d110080c1635a..339e5a15ace71 100644 --- a/packages/next/src/build/templates/pages.ts +++ b/packages/next/src/build/templates/pages.ts @@ -289,9 +289,8 @@ export async function handler( reactLoadableManifest, assetPrefix: nextConfig.assetPrefix, - strictNextHead: Boolean( - nextConfig.experimental.strictNextHead - ), + strictNextHead: + nextConfig.experimental.strictNextHead ?? true, previewProps: prerenderManifest.preview, images: nextConfig.images as any, nextConfigOutput: nextConfig.output, diff --git a/packages/next/src/server/config-shared.ts b/packages/next/src/server/config-shared.ts index 3f318b04fcb08..73b5b6b01e8c9 100644 --- a/packages/next/src/server/config-shared.ts +++ b/packages/next/src/server/config-shared.ts @@ -1466,6 +1466,7 @@ export const defaultConfig = Object.freeze({ devtoolSegmentExplorer: false, browserDebugInfoInTerminal: false, optimizeRouterScrolling: false, + strictNextHead: true, }, htmlLimitedBots: undefined, bundlePagesRouterDependencies: false, diff --git a/test/development/pages-dir/client-navigation/fixture/next.config.js b/test/development/pages-dir/client-navigation/fixture/next.config.js index c7fa1a4a1081e..827ccc75e1159 100644 --- a/test/development/pages-dir/client-navigation/fixture/next.config.js +++ b/test/development/pages-dir/client-navigation/fixture/next.config.js @@ -4,9 +4,12 @@ module.exports = { // Make sure entries are not getting disposed. maxInactiveAge: 1000 * 60 * 60, }, - experimental: { - strictNextHead: process.env.TEST_STRICT_NEXT_HEAD !== 'false', - }, + experimental: + process.env.TEST_STRICT_NEXT_HEAD !== undefined + ? { + strictNextHead: process.env.TEST_STRICT_NEXT_HEAD === 'true', + } + : {}, // scroll position can be finicky with the // indicators showing so hide by default devIndicators: false, diff --git a/test/development/pages-dir/client-navigation/fixture/pages/head-with-custom-metadata.js b/test/development/pages-dir/client-navigation/fixture/pages/head-with-custom-metadata.js new file mode 100644 index 0000000000000..be2f22ded7cdb --- /dev/null +++ b/test/development/pages-dir/client-navigation/fixture/pages/head-with-custom-metadata.js @@ -0,0 +1,14 @@ +import Head from 'next/head' + +export default function Page() { + return ( +
+ + Title Page + + + +

This is a page!

+
+ ) +} diff --git a/test/development/pages-dir/client-navigation/rendering-head.test.ts b/test/development/pages-dir/client-navigation/rendering-head.test.ts index 769b1d7ea258d..06cf0ffe9cb72 100644 --- a/test/development/pages-dir/client-navigation/rendering-head.test.ts +++ b/test/development/pages-dir/client-navigation/rendering-head.test.ts @@ -8,14 +8,17 @@ import path from 'path' const isReact18 = parseInt(process.env.NEXT_TEST_REACT_VERSION) === 18 describe('Client Navigation rendering ', () => { - describe.each([[false], [true]])( + describe.each([[false], [true], [undefined]])( 'with strictNextHead=%s', (strictNextHead) => { const { next } = nextTestSetup({ files: path.join(__dirname, 'fixture'), - env: { - TEST_STRICT_NEXT_HEAD: String(strictNextHead), - }, + env: + strictNextHead !== undefined + ? { + TEST_STRICT_NEXT_HEAD: String(strictNextHead), + } + : {}, }) function render( @@ -37,7 +40,7 @@ describe('Client Navigation rendering ', () => { test('header renders default charset', async () => { const html = await render('/default-head') expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) @@ -47,7 +50,7 @@ describe('Client Navigation rendering ', () => { test('header renders default viewport', async () => { const html = await render('/default-head') expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) @@ -56,17 +59,17 @@ describe('Client Navigation rendering ', () => { test('header helper renders header information', async () => { const html = await render('/head') expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) @@ -76,17 +79,17 @@ describe('Client Navigation rendering ', () => { test('header helper dedupes tags', async () => { const html = await render('/head') expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).not.toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) @@ -96,24 +99,25 @@ describe('Client Navigation rendering ', () => { '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) - const dedupeLink = strictNextHead - ? '' - : '' + const dedupeLink = + strictNextHead !== false + ? '' + : '' expect(html).toContain(dedupeLink) expect( html.substring(html.indexOf(dedupeLink) + dedupeLink.length) ).not.toContain('' : '' ) @@ -129,12 +133,12 @@ describe('Client Navigation rendering ', () => { // Expect exactly one `viewport` expect((html.match(/name="viewport"/g) || []).length).toBe(1) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) @@ -144,98 +148,98 @@ describe('Client Navigation rendering ', () => { const html = await render('/head') console.log(html) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).not.toContain('' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) @@ -244,12 +248,12 @@ describe('Client Navigation rendering ', () => { test('header helper avoids dedupe of meta tags with the same name if they use unique keys', async () => { const html = await render('/head') expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) @@ -258,12 +262,12 @@ describe('Client Navigation rendering ', () => { test('header helper renders Fragment children', async () => { const html = await render('/head') expect(html).toContain( - strictNextHead + strictNextHead !== false ? 'Fragment title' : 'Fragment title' ) expect(html).toContain( - strictNextHead + strictNextHead !== false ? '' : '' ) @@ -272,17 +276,17 @@ describe('Client Navigation rendering ', () => { test('header helper renders boolean attributes correctly children', async () => { const html = await render('/head') expect(html).toContain( - strictNextHead + strictNextHead !== false ? '