diff --git a/test/development/app-dir/dynamic-io-dev-cache-scope/next.config.js b/test/development/app-dir/dynamic-io-dev-cache-scope/next.config.js index ac4afcf43219..b0b2ad8d2353 100644 --- a/test/development/app-dir/dynamic-io-dev-cache-scope/next.config.js +++ b/test/development/app-dir/dynamic-io-dev-cache-scope/next.config.js @@ -4,6 +4,7 @@ const nextConfig = { experimental: { dynamicIO: true, + ppr: true, }, } diff --git a/test/development/app-dir/dynamic-io-dev-errors/next.config.js b/test/development/app-dir/dynamic-io-dev-errors/next.config.js index ac4afcf43219..b0b2ad8d2353 100644 --- a/test/development/app-dir/dynamic-io-dev-errors/next.config.js +++ b/test/development/app-dir/dynamic-io-dev-errors/next.config.js @@ -4,6 +4,7 @@ const nextConfig = { experimental: { dynamicIO: true, + ppr: true, }, } diff --git a/test/development/app-dir/dynamic-io-dev-warmup/next.config.js b/test/development/app-dir/dynamic-io-dev-warmup/next.config.js index bb76fc99dc6b..9026854a15ea 100644 --- a/test/development/app-dir/dynamic-io-dev-warmup/next.config.js +++ b/test/development/app-dir/dynamic-io-dev-warmup/next.config.js @@ -1,5 +1,6 @@ module.exports = { experimental: { dynamicIO: true, + ppr: true, }, } diff --git a/test/development/app-dir/dynamic-io-warnings/next.config.js b/test/development/app-dir/dynamic-io-warnings/next.config.js index bb76fc99dc6b..9026854a15ea 100644 --- a/test/development/app-dir/dynamic-io-warnings/next.config.js +++ b/test/development/app-dir/dynamic-io-warnings/next.config.js @@ -1,5 +1,6 @@ module.exports = { experimental: { dynamicIO: true, + ppr: true, }, } diff --git a/test/e2e/app-dir/dynamic-io-dynamic-imports/bundled/next.config.js b/test/e2e/app-dir/dynamic-io-dynamic-imports/bundled/next.config.js index 10cc99d480a1..b8faf416637f 100644 --- a/test/e2e/app-dir/dynamic-io-dynamic-imports/bundled/next.config.js +++ b/test/e2e/app-dir/dynamic-io-dynamic-imports/bundled/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, prerenderEarlyExit: false, }, diff --git a/test/e2e/app-dir/dynamic-io-dynamic-imports/dynamic-io-dynamic-imports.test.ts b/test/e2e/app-dir/dynamic-io-dynamic-imports/dynamic-io-dynamic-imports.test.ts index 938c2db8ab2e..a5e32066337e 100644 --- a/test/e2e/app-dir/dynamic-io-dynamic-imports/dynamic-io-dynamic-imports.test.ts +++ b/test/e2e/app-dir/dynamic-io-dynamic-imports/dynamic-io-dynamic-imports.test.ts @@ -17,11 +17,10 @@ describe('async imports in dynamicIO', () => { await next.readFile('.next/prerender-manifest.json') ) - let prerenderedRoutes = Object.keys(prerenderManifest.routes).sort() - - if (process.env.__NEXT_EXPERIMENTAL_PPR === 'true') { - // For the purpose of this test we don't consider an incomplete shell. - prerenderedRoutes = prerenderedRoutes.filter((route) => { + // For the purpose of this test we don't consider an incomplete shell. + const prerenderedRoutes = Object.keys(prerenderManifest.routes) + .sort() + .filter((route) => { const filename = route.replace(/^\//, '').replace(/^$/, 'index') try { return next @@ -37,7 +36,6 @@ describe('async imports in dynamicIO', () => { } } }) - } expect(prerenderedRoutes).toMatchInlineSnapshot(` [ diff --git a/test/e2e/app-dir/dynamic-io-dynamic-imports/external/next.config.js b/test/e2e/app-dir/dynamic-io-dynamic-imports/external/next.config.js index 026621644ec9..4968320760cd 100644 --- a/test/e2e/app-dir/dynamic-io-dynamic-imports/external/next.config.js +++ b/test/e2e/app-dir/dynamic-io-dynamic-imports/external/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, }, serverExternalPackages: ['external-esm-pkg-with-async-import'], diff --git a/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.platform-dynamic.test.ts b/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.platform-dynamic.test.ts index 268c63cfc768..f2cfe9f952ee 100644 --- a/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.platform-dynamic.test.ts +++ b/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.platform-dynamic.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - const stackStart = /\s+at / function createExpectError(cliOutput: string) { @@ -75,15 +73,9 @@ function runTests(options: { withMinification: boolean }) { throw new Error('expected build not to fail for fully static project') } - if (WITH_PPR) { - expect(next.cliOutput).toContain('◐ / ') - const $ = await next.render$('/') - expect($('[data-fallback]').length).toBe(2) - } else { - expect(next.cliOutput).toContain('ƒ / ') - const $ = await next.render$('/') - expect($('[data-fallback]').length).toBe(0) - } + expect(next.cliOutput).toContain('◐ / ') + const $ = await next.render$('/') + expect($('[data-fallback]').length).toBe(2) }) }) diff --git a/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.sync-dynamic.test.ts b/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.sync-dynamic.test.ts index 54d46b635fc0..3b32bfb96d07 100644 --- a/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.sync-dynamic.test.ts +++ b/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.sync-dynamic.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - const stackStart = /\s+at / function createExpectError(cliOutput: string) { @@ -75,15 +73,9 @@ function runTests(options: { withMinification: boolean }) { throw new Error('expected build not to fail for fully static project') } - if (WITH_PPR) { - expect(next.cliOutput).toContain('◐ / ') - const $ = await next.render$('/') - expect($('[data-fallback]').length).toBe(2) - } else { - expect(next.cliOutput).toContain('ƒ / ') - const $ = await next.render$('/') - expect($('[data-fallback]').length).toBe(2) - } + expect(next.cliOutput).toContain('◐ / ') + const $ = await next.render$('/') + expect($('[data-fallback]').length).toBe(2) }) }) @@ -162,15 +154,9 @@ function runTests(options: { withMinification: boolean }) { throw new Error('expected build not to fail for fully static project') } - if (WITH_PPR) { - expect(next.cliOutput).toContain('◐ / ') - const $ = await next.render$('/') - expect($('[data-fallback]').length).toBe(2) - } else { - expect(next.cliOutput).toContain('ƒ / ') - const $ = await next.render$('/') - expect($('[data-fallback]').length).toBe(0) - } + expect(next.cliOutput).toContain('◐ / ') + const $ = await next.render$('/') + expect($('[data-fallback]').length).toBe(2) }) }) @@ -249,15 +235,9 @@ function runTests(options: { withMinification: boolean }) { throw new Error('expected build not to fail for fully static project') } - if (WITH_PPR) { - expect(next.cliOutput).toContain('◐ / ') - const $ = await next.render$('/') - expect($('[data-fallback]').length).toBe(2) - } else { - expect(next.cliOutput).toContain('ƒ / ') - const $ = await next.render$('/') - expect($('[data-fallback]').length).toBe(0) - } + expect(next.cliOutput).toContain('◐ / ') + const $ = await next.render$('/') + expect($('[data-fallback]').length).toBe(2) }) }) diff --git a/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.test.ts b/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.test.ts index 337fd4bdea38..c904b560dd77 100644 --- a/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.test.ts +++ b/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - const stackStart = /\s+at / function createExpectError(cliOutput: string) { @@ -205,16 +203,10 @@ function runTests(options: { withMinification: boolean }) { throw new Error('expected build not to fail for fully static project') } - if (WITH_PPR) { - expect(next.cliOutput).toContain('◐ / ') - const $ = await next.render$('/') - expect($('#dynamic').text()).toBe('Dynamic') - expect($('[data-fallback]').length).toBe(1) - } else { - expect(next.cliOutput).toContain('ƒ / ') - const $ = await next.render$('/') - expect($('#dynamic').text()).toBe('Dynamic') - } + expect(next.cliOutput).toContain('◐ / ') + const $ = await next.render$('/') + expect($('#dynamic').text()).toBe('Dynamic') + expect($('[data-fallback]').length).toBe(1) }) }) @@ -379,16 +371,11 @@ function runTests(options: { withMinification: boolean }) { // Turbopack doesn't support disabling minification yet withMinification || isTurbopack ? undefined : 'IndirectionTwo' ) - if (WITH_PPR) { - // React currently fatals the render in canary because we don't have access to the prerender API there. with a fatal only - // one task actually reports and error at the moment. We should fix upstream but for now we exclude the second error when PPR is off - // because we are using canary React and renderToReadableStream rather than experimental React and prerender - expectError( - 'Route "/": A component accessed data, headers, params, searchParams, or a short-lived cache without a Suspense boundary nor a "use cache" above it.', - // Turbopack doesn't support disabling minification yet - withMinification || isTurbopack ? undefined : 'IndirectionThree' - ) - } + expectError( + 'Route "/": A component accessed data, headers, params, searchParams, or a short-lived cache without a Suspense boundary nor a "use cache" above it.', + // Turbopack doesn't support disabling minification yet + withMinification || isTurbopack ? undefined : 'IndirectionThree' + ) expectError('Error occurred prerendering page "/"') expectError('exiting the build.') }) @@ -421,36 +408,18 @@ function runTests(options: { withMinification: boolean }) { } }) - if (WITH_PPR) { - it('should partially prerender when all dynamic components are inside a Suspense boundary', async () => { - try { - await next.start() - } catch { - throw new Error( - 'expected build not to fail for fully static project' - ) - // we expect the build to fail - } - - expect(next.cliOutput).toContain('◐ / ') - const $ = await next.render$('/') - expect($('[data-fallback]').length).toBe(2) - }) - } else { - it('should not error the build when all dynamic components are inside a Suspense boundary', async () => { - try { - await next.start() - } catch { - throw new Error( - 'expected build not to fail for fully static project' - ) - } + it('should partially prerender when all dynamic components are inside a Suspense boundary', async () => { + try { + await next.start() + } catch { + throw new Error('expected build not to fail for fully static project') + // we expect the build to fail + } - expect(next.cliOutput).toContain('ƒ / ') - const $ = await next.render$('/') - expect($('[data-fallback]').length).toBe(2) - }) - } + expect(next.cliOutput).toContain('◐ / ') + const $ = await next.render$('/') + expect($('[data-fallback]').length).toBe(2) + }) }) }) } diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-boundary/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-boundary/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-boundary/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-boundary/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-dynamic-route/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-dynamic-route/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-dynamic-route/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-dynamic-route/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-error-route/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-error-route/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-error-route/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-error-route/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-static-route/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-static-route/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-static-route/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-static-route/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-static-with-suspense/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-static-with-suspense/next.config.js index a3d79eebc79c..3a95d8820b36 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-static-with-suspense/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-metadata-static-with-suspense/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, pprFallbacks: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', dynamicIO: true, serverMinification: true, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-root/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-root/next.config.js index a4a933871151..56a3077126ed 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-root/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-root/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: false, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-viewport-dynamic-route/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-viewport-dynamic-route/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-viewport-dynamic-route/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-viewport-dynamic-route/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-viewport-static-route/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-viewport-static-route/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-viewport-static-route/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/dynamic-viewport-static-route/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/lazy-module-init/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/lazy-module-init/next.config.js index a4a933871151..56a3077126ed 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/lazy-module-init/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/lazy-module-init/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: false, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/prospective-render-errors/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/prospective-render-errors/next.config.js index a4a933871151..56a3077126ed 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/prospective-render-errors/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/prospective-render-errors/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: false, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/static/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/static/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/static/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/static/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-client-search-with-fallback/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-client-search-with-fallback/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-client-search-with-fallback/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-client-search-with-fallback/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-client-search-without-fallback/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-client-search-without-fallback/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-client-search-without-fallback/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-client-search-without-fallback/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-cookies-with-fallback/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-cookies-with-fallback/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-cookies-with-fallback/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-cookies-with-fallback/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-cookies-without-fallback/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-cookies-without-fallback/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-cookies-without-fallback/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-cookies-without-fallback/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-random-with-fallback/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-random-with-fallback/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-random-with-fallback/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-random-with-fallback/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-random-without-fallback/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-random-without-fallback/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-random-without-fallback/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-random-without-fallback/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-server-search-with-fallback/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-server-search-with-fallback/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-server-search-with-fallback/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-server-search-with-fallback/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-server-search-without-fallback/next.config.js b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-server-search-without-fallback/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-server-search-without-fallback/next.config.js +++ b/test/e2e/app-dir/dynamic-io-errors/fixtures/sync-server-search-without-fallback/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-request-apis/dynamic-io-request-apis.test.ts b/test/e2e/app-dir/dynamic-io-request-apis/dynamic-io-request-apis.test.ts index 07efcdd2484e..b7b126558c31 100644 --- a/test/e2e/app-dir/dynamic-io-request-apis/dynamic-io-request-apis.test.ts +++ b/test/e2e/app-dir/dynamic-io-request-apis/dynamic-io-request-apis.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - const stackStart = /\s+at / function createExpectError(cliOutput: string) { @@ -62,11 +60,9 @@ describe(`Request Promises`, () => { } const expectError = createExpectError(next.cliOutput) - if (WITH_PPR) { - expectError( - 'Error: During prerendering, `params` rejects when the prerender is complete' - ) - } + expectError( + 'Error: During prerendering, `params` rejects when the prerender is complete' + ) expectError( 'Error: During prerendering, `searchParams` rejects when the prerender is complete' ) @@ -104,11 +100,9 @@ describe(`Request Promises`, () => { } const expectError = createExpectError(next.cliOutput) - if (WITH_PPR) { - expectError( - 'Error: During prerendering, `params` rejects when the prerender is complete' - ) - } + expectError( + 'Error: During prerendering, `params` rejects when the prerender is complete' + ) expectError( 'Error: During prerendering, `searchParams` rejects when the prerender is complete' ) diff --git a/test/e2e/app-dir/dynamic-io-request-apis/fixtures/reject-hanging-promises-dynamic/next.config.js b/test/e2e/app-dir/dynamic-io-request-apis/fixtures/reject-hanging-promises-dynamic/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-request-apis/fixtures/reject-hanging-promises-dynamic/next.config.js +++ b/test/e2e/app-dir/dynamic-io-request-apis/fixtures/reject-hanging-promises-dynamic/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io-request-apis/fixtures/reject-hanging-promises-static/next.config.js b/test/e2e/app-dir/dynamic-io-request-apis/fixtures/reject-hanging-promises-static/next.config.js index b23633baadc7..c790206c375e 100644 --- a/test/e2e/app-dir/dynamic-io-request-apis/fixtures/reject-hanging-promises-static/next.config.js +++ b/test/e2e/app-dir/dynamic-io-request-apis/fixtures/reject-hanging-promises-static/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, serverMinification: true, }, diff --git a/test/e2e/app-dir/dynamic-io/app/node-crypto/random-int/up-to/uncached/page.tsx b/test/e2e/app-dir/dynamic-io/app/node-crypto/random-int/up-to/uncached/page.tsx index a7d32639c0e0..fa2a29a7860d 100644 --- a/test/e2e/app-dir/dynamic-io/app/node-crypto/random-int/up-to/uncached/page.tsx +++ b/test/e2e/app-dir/dynamic-io/app/node-crypto/random-int/up-to/uncached/page.tsx @@ -5,7 +5,11 @@ import { SentinelValue } from '../../../../getSentinelValue' export default async function Page() { await new Promise((r) => process.nextTick(r)) const first = crypto.randomInt(128) - const second = crypto.randomInt(128) + let second = crypto.randomInt(128) + while (first === second) { + // Ensure that the second value is different from the first + second = crypto.randomInt(128) + } return (
diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.connection.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.connection.test.ts index 94570682a7e1..20270c4c361b 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.connection.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.connection.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - describe('dynamic-io', () => { const { next, isNextDev, skipped } = nextTestSetup({ files: __dirname, @@ -12,46 +10,29 @@ describe('dynamic-io', () => { return } - if (WITH_PPR) { - it('should partially prerender pages that use connection', async () => { - let $ = await next.render$('/connection/static-behavior/boundary', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#foo').text()).toBe('foo') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#foo').text()).toBe('foo') - } - }) - } else { - it('should produce dynamic pages when using connection', async () => { - let $ = await next.render$('/connection/static-behavior/boundary', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#foo').text()).toBe('foo') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#foo').text()).toBe('foo') - } - }) - } + it('should partially prerender pages that use connection', async () => { + let $ = await next.render$('/connection/static-behavior/boundary', {}) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#foo').text()).toBe('foo') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#foo').text()).toBe('foo') + } + }) - if (WITH_PPR) { - it('should be able to pass connection as a promise to another component and trigger an intermediate Suspense boundary', async () => { - const $ = await next.render$('/connection/static-behavior/pass-deeply') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#fallback').length).toBe(0) - expect($('#page').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#fallback').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - } - }) - } + it('should be able to pass connection as a promise to another component and trigger an intermediate Suspense boundary', async () => { + const $ = await next.render$('/connection/static-behavior/pass-deeply') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#fallback').length).toBe(0) + expect($('#page').text()).toBe('at runtime') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#fallback').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at runtime') + } + }) }) diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.cookies.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.cookies.test.ts index 6113f3863142..dde36ca12092 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.cookies.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.cookies.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - describe('dynamic-io', () => { const { next, isNextDev, skipped } = nextTestSetup({ files: __dirname, @@ -12,72 +10,44 @@ describe('dynamic-io', () => { return } - if (WITH_PPR) { - it('should partially prerender pages that use async cookies', async () => { - let $ = await next.render$('/cookies/static-behavior/async', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#x-sentinel').text()).toBe('hello') - } - }) - - it('should partially prerender pages that use sync cookies', async () => { - let $ = await next.render$('/cookies/static-behavior/sync', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#x-sentinel').text()).toBe('hello') - } - }) - } else { - it('should produce dynamic pages when using async or sync cookies', async () => { - let $ = await next.render$('/cookies/static-behavior/sync', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } - - $ = await next.render$('/cookies/static-behavior/async', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } - }) - } + it('should partially prerender pages that use async cookies', async () => { + let $ = await next.render$('/cookies/static-behavior/async', {}) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#x-sentinel').text()).toBe('hello') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#x-sentinel').text()).toBe('hello') + } + }) - if (WITH_PPR) { - it('should be able to pass cookies as a promise to another component and trigger an intermediate Suspense boundary', async () => { - const $ = await next.render$('/cookies/static-behavior/pass-deeply') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#fallback').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#fallback').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - } - }) - } + it('should partially prerender pages that use sync cookies', async () => { + let $ = await next.render$('/cookies/static-behavior/sync', {}) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#x-sentinel').text()).toBe('hello') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#x-sentinel').text()).toBe('hello') + } + }) + + it('should be able to pass cookies as a promise to another component and trigger an intermediate Suspense boundary', async () => { + const $ = await next.render$('/cookies/static-behavior/pass-deeply') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#fallback').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#fallback').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at runtime') + } + }) it('should be able to access cookie properties asynchronously', async () => { let $ = await next.render$('/cookies/exercise/async', {}) diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.date.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.date.test.ts index f2b4a48033a1..80df46dfe8af 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.date.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.date.test.ts @@ -1,6 +1,5 @@ import { nextTestSetup } from 'e2e-utils' - -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR +import expect from 'expect' describe('dynamic-io', () => { const { next, isNextDev, skipped } = nextTestSetup({ @@ -36,12 +35,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#value').text()).toMatch(/^\d+$/) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#value').text()).toMatch(/^\d+$/) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#value').text()).toMatch(/^\d+$/) } @@ -66,12 +61,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#value').text()).toContain('GMT') - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#value').text()).toContain('GMT') } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#value').text()).toContain('GMT') } @@ -96,12 +87,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#value').text()).toContain('GMT') - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#value').text()).toContain('GMT') } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#value').text()).toContain('GMT') } diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.headers.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.headers.test.ts index 98966384ed9d..5ea305fbe0e8 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.headers.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.headers.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - describe('dynamic-io', () => { const { next, isNextDev, skipped } = nextTestSetup({ files: __dirname, @@ -12,72 +10,44 @@ describe('dynamic-io', () => { return } - if (WITH_PPR) { - it('should partially prerender pages that use async headers', async () => { - let $ = await next.render$('/headers/static-behavior/async', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#x-sentinel').text()).toBe('hello') - } - }) - - it('should partially prerender pages that use sync headers', async () => { - let $ = await next.render$('/headers/static-behavior/sync', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#x-sentinel').text()).toBe('hello') - } - }) - } else { - it('should produce dynamic pages when using async or sync headers', async () => { - let $ = await next.render$('/headers/static-behavior/sync', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } - - $ = await next.render$('/headers/static-behavior/async', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#x-sentinel').text()).toBe('hello') - } - }) - } + it('should partially prerender pages that use async headers', async () => { + let $ = await next.render$('/headers/static-behavior/async', {}) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#x-sentinel').text()).toBe('hello') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#x-sentinel').text()).toBe('hello') + } + }) - if (WITH_PPR) { - it('should be able to pass headers as a promise to another component and trigger an intermediate Suspense boundary', async () => { - const $ = await next.render$('/headers/static-behavior/pass-deeply') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#fallback').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#fallback').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - } - }) - } + it('should partially prerender pages that use sync headers', async () => { + let $ = await next.render$('/headers/static-behavior/sync', {}) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#x-sentinel').text()).toBe('hello') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#x-sentinel').text()).toBe('hello') + } + }) + + it('should be able to pass headers as a promise to another component and trigger an intermediate Suspense boundary', async () => { + const $ = await next.render$('/headers/static-behavior/pass-deeply') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#fallback').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#fallback').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at runtime') + } + }) it('should be able to access headers properties asynchronously', async () => { let $ = await next.render$('/headers/exercise/async', {}) diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.node-crypto.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.node-crypto.test.ts index 9f5f10ce6f53..27fc2a1b90b8 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.node-crypto.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.node-crypto.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - describe('dynamic-io', () => { const { next, isNextDev, skipped } = nextTestSetup({ files: __dirname, @@ -36,12 +34,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } @@ -66,12 +60,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } @@ -96,12 +86,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } @@ -126,12 +112,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } @@ -156,12 +138,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } @@ -186,12 +164,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } @@ -216,12 +190,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } @@ -249,12 +219,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } @@ -279,12 +245,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.params.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.params.test.ts index 7283a98f12b5..8d9cf142e332 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.params.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.params.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - // cSpell:words lowcard highcard describe('dynamic-io', () => { const { next, isNextDev, skipped } = nextTestSetup({ @@ -28,382 +26,189 @@ describe('dynamic-io', () => { } describe('Async Params', () => { - if (WITH_PPR) { - it('should partially prerender pages that await params in a server components', async () => { - expect(getLines('Route "/params')).toEqual([]) - - let $ = await next.render$( - '/params/semantics/one/build/async/layout-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - } + it('should partially prerender pages that await params in a server components', async () => { + expect(getLines('Route "/params')).toEqual([]) - $ = await next.render$( - '/params/semantics/one/run/async/layout-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } + let $ = await next.render$( + '/params/semantics/one/build/async/layout-access/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') - $ = await next.render$( - '/params/semantics/one/build/async/page-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + expect(getLines('Route "/params')).toEqual([]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + } - $ = await next.render$( - '/params/semantics/one/run/async/page-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } - }) + $ = await next.render$( + '/params/semantics/one/run/async/layout-access/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') - it('should partially prerender pages that use params in a client components', async () => { + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') expect(getLines('Route "/params')).toEqual([]) + } - let $ = await next.render$( - '/params/semantics/one/build/async/layout-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } + $ = await next.render$( + '/params/semantics/one/build/async/page-access/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') - $ = await next.render$( - '/params/semantics/one/run/async/layout-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + expect(getLines('Route "/params')).toEqual([]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + expect(getLines('Route "/params')).toEqual([]) + } - $ = await next.render$( - '/params/semantics/one/build/async/page-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } + $ = await next.render$( + '/params/semantics/one/run/async/page-access/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') - $ = await next.render$( - '/params/semantics/one/run/async/page-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } - }) - } else { - it('should prerender pages that await params in a server component when prebuilt', async () => { + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/async/layout-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([]) + } + }) - $ = await next.render$( - '/params/semantics/one/build/async/page-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } - }) + it('should partially prerender pages that use params in a client components', async () => { + expect(getLines('Route "/params')).toEqual([]) - it('should prerender pages that `use` params in a client component when prebuilt', async () => { + let $ = await next.render$( + '/params/semantics/one/build/async/layout-access/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/async/layout-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + expect(getLines('Route "/params')).toEqual([]) + } - $ = await next.render$( - '/params/semantics/one/build/async/page-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } else { - // TODO at the moment pages receive searchParams which are not know at build time - // and always dynamic. We have to pessimistically assume they are accessed and thus - // we cannot actually produce a static shell without PPR. - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } - }) + $ = await next.render$( + '/params/semantics/one/run/async/layout-access/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') - it('should render pages that await params in a server component when not prebuilt', async () => { + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/run/async/layout-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/run/async/page-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } - }) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([]) + } - it('should render pages that `use` params in a client component when not prebuilt', async () => { + $ = await next.render$( + '/params/semantics/one/build/async/page-access/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/run/async/layout-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + expect(getLines('Route "/params')).toEqual([]) + } - $ = await next.render$( - '/params/semantics/one/run/async/page-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } - }) - } + $ = await next.render$( + '/params/semantics/one/run/async/page-access/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([]) + } + }) it('should fully prerender pages that check individual param keys after awaiting params in a server component', async () => { expect(getLines('Route "/params')).toEqual([]) @@ -466,30 +271,16 @@ describe('dynamic-io', () => { expect($('#param-has-foo').text()).toBe('false') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - // With PPR fallbacks the first visit is still partially prerendered - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } else { - // without PPR the first visit is dynamic - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } + // With PPR fallbacks the first visit is still partially prerendered + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-has-lowcard').text()).toBe('true') + expect($('#param-has-highcard').text()).toBe('true') + expect($('#param-has-foo').text()).toBe('false') + expect(getLines('Route "/params')).toEqual([]) } $ = await next.render$('/params/semantics/one/run/async/page-has/server') @@ -503,30 +294,16 @@ describe('dynamic-io', () => { expect($('#param-has-foo').text()).toBe('false') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - // With PPR fallbacks the first visit is still partially prerendered - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } else { - // without PPR the first visit is dynamic - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } + // With PPR fallbacks the first visit is still partially prerendered + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-has-lowcard').text()).toBe('true') + expect($('#param-has-highcard').text()).toBe('true') + expect($('#param-has-foo').text()).toBe('false') + expect(getLines('Route "/params')).toEqual([]) } }) @@ -568,31 +345,14 @@ describe('dynamic-io', () => { expect($('#param-has-foo').text()).toBe('false') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } else { - // When dynamicIO is on and PPR is off the search params passed to a client page - // are enough to mark the whole route as dynamic. This is because we can't know if - // you are going to use those searchParams in an update on the client so we can't infer - // anything about your lack of use during SSR. In the future we will update searchParams - // written to the client to actually derive those params from location and thus not - // require dynamic - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-has-lowcard').text()).toBe('true') + expect($('#param-has-highcard').text()).toBe('true') + expect($('#param-has-foo').text()).toBe('false') + expect(getLines('Route "/params')).toEqual([]) } $ = await next.render$( @@ -608,30 +368,16 @@ describe('dynamic-io', () => { expect($('#param-has-foo').text()).toBe('false') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - // With PPR fallbacks the first visit is still partially prerendered - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } else { - // without PPR the first visit is dynamic - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } + // With PPR fallbacks the first visit is still partially prerendered + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-has-lowcard').text()).toBe('true') + expect($('#param-has-highcard').text()).toBe('true') + expect($('#param-has-foo').text()).toBe('false') + expect(getLines('Route "/params')).toEqual([]) } $ = await next.render$('/params/semantics/one/run/async/page-has/client') @@ -645,859 +391,422 @@ describe('dynamic-io', () => { expect($('#param-has-foo').text()).toBe('false') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - // With PPR fallbacks the first visit is still partially prerendered - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } else { - // When dynamicIO is on and PPR is off the search params passed to a client page - // are enough to mark the whole route as dynamic. This is because we can't know if - // you are going to use those searchParams in an update on the client so we can't infer - // anything about your lack of use during SSR. In the future we will update searchParams - // written to the client to actually derive those params from location and thus not - // require dynamic - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } + // With PPR fallbacks the first visit is still partially prerendered + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-has-lowcard').text()).toBe('true') + expect($('#param-has-highcard').text()).toBe('true') + expect($('#param-has-foo').text()).toBe('false') + expect(getLines('Route "/params')).toEqual([]) } }) - if (WITH_PPR) { - it('should partially prerender pages that spread awaited params in a server component', async () => { + it('should partially prerender pages that spread awaited params in a server component', async () => { + expect(getLines('Route "/params')).toEqual([]) + let $ = await next.render$( + '/params/semantics/one/build/async/layout-spread/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/async/layout-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/build/async/page-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/run/async/layout-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/run/async/page-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - }) - - it('should partially prerender pages that spread `use`ed params in a client component', async () => { + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/async/layout-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/build/async/page-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/run/async/layout-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } + } - $ = await next.render$( - '/params/semantics/one/run/async/page-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - }) - } else { - it('should prerender pages that spread awaited params in a server component when prebuilt', async () => { + $ = await next.render$( + '/params/semantics/one/build/async/page-spread/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/async/layout-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/build/async/page-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - }) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } - it('should prerender pages that spread `use`ed params in a client component when prebuilt', async () => { + $ = await next.render$( + '/params/semantics/one/run/async/layout-spread/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/async/layout-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } - $ = await next.render$( - '/params/semantics/one/build/async/page-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } else { - // TODO at the moment pages receive searchParams which are not know at build time - // and always dynamic. We have to pessimistically assume they are accessed and thus - // we cannot actually produce a static shell without PPR. - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - }) + $ = await next.render$( + '/params/semantics/one/run/async/page-spread/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } + }) - it('should render pages that spread awaited params in a server component when not prebuilt', async () => { - let $ = await next.render$( - '/params/semantics/one/run/async/layout-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - } else { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - } + it('should partially prerender pages that spread `use`ed params in a client component', async () => { + expect(getLines('Route "/params')).toEqual([]) + let $ = await next.render$( + '/params/semantics/one/build/async/layout-spread/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } - $ = await next.render$( - '/params/semantics/one/run/async/page-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - } else { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - } - }) + $ = await next.render$( + '/params/semantics/one/build/async/page-spread/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } - it('should render pages that spread `use`ed params in a client component when not prebuilt', async () => { - let $ = await next.render$( - '/params/semantics/one/run/async/layout-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - } + $ = await next.render$( + '/params/semantics/one/run/async/layout-spread/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } - $ = await next.render$( - '/params/semantics/one/run/async/page-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - } - }) - } + $ = await next.render$( + '/params/semantics/one/run/async/page-spread/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } + }) }) describe('Synchronous Params access', () => { - if (WITH_PPR) { - it('should partially prerender pages that access params synchronously in a server components', async () => { - expect(getLines('Route "/params')).toEqual([]) - - let $ = await next.render$( - '/params/semantics/one/build/sync/layout-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - } + it('should partially prerender pages that access params synchronously in a server components', async () => { + expect(getLines('Route "/params')).toEqual([]) - $ = await next.render$( - '/params/semantics/one/run/sync/layout-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } + let $ = await next.render$( + '/params/semantics/one/build/sync/layout-access/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + } - $ = await next.render$( - '/params/semantics/one/build/sync/page-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } + $ = await next.render$( + '/params/semantics/one/run/sync/layout-access/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') - $ = await next.render$( - '/params/semantics/one/run/sync/page-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } - }) + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([]) + } - it('should partially prerender pages that access params synchronously in a client components', async () => { + $ = await next.render$( + '/params/semantics/one/build/sync/page-access/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') expect(getLines('Route "/params')).toEqual([]) + } - let $ = await next.render$( - '/params/semantics/one/build/sync/layout-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } + $ = await next.render$( + '/params/semantics/one/run/sync/page-access/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') - $ = await next.render$( - '/params/semantics/one/run/sync/layout-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([]) + } + }) - $ = await next.render$( - '/params/semantics/one/build/sync/page-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } + it('should partially prerender pages that access params synchronously in a client components', async () => { + expect(getLines('Route "/params')).toEqual([]) - $ = await next.render$( - '/params/semantics/one/run/sync/page-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } - }) - } else { - it('should prerender pages that access params synchronously in a server component when prebuilt', async () => { + let $ = await next.render$( + '/params/semantics/one/build/sync/layout-access/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/sync/layout-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } + } - $ = await next.render$( - '/params/semantics/one/build/sync/page-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } - }) + $ = await next.render$( + '/params/semantics/one/run/sync/layout-access/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') - it('should prerender pages that access params synchronously in a client component when prebuilt', async () => { + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/sync/layout-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } + } - $ = await next.render$( - '/params/semantics/one/build/sync/page-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - // TODO at the moment pages receive searchParams which are not know at build time - // and always dynamic. We have to pessimistically assume they are accessed and thus - // we cannot actually produce a static shell without PPR. - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('build') - expect(getLines('Route "/params')).toEqual([]) - } - }) + $ = await next.render$( + '/params/semantics/one/build/sync/page-access/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') - it('should render pages that access params synchronously in a server component when not prebuilt', async () => { + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('build') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/run/sync/layout-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } + } - $ = await next.render$( - '/params/semantics/one/run/sync/page-access/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } - }) + $ = await next.render$( + '/params/semantics/one/run/sync/page-access/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') - it('should render pages that access params synchronously in a client component when not prebuilt', async () => { + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-lowcard').text()).toBe('one') + expect($('#param-highcard').text()).toBe('run') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/run/sync/layout-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/run/sync/page-access/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-lowcard').text()).toBe('one') - expect($('#param-highcard').text()).toBe('run') - expect(getLines('Route "/params')).toEqual([]) - } - }) - } + } + }) it('should fully prerender pages that check individual param keys directly on the params prop in a server component', async () => { expect(getLines('Route "/params')).toEqual([]) @@ -1556,28 +865,16 @@ describe('dynamic-io', () => { expect($('#param-has-foo').text()).toBe('false') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - // With PPR fallbacks the first visit is fully prerendered - // because has-checking doesn't postpone even with ppr fallbacks - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } else { - // without PPR the first visit is dynamic - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } + // With PPR fallbacks the first visit is fully prerendered + // because has-checking doesn't postpone even with ppr fallbacks + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-has-lowcard').text()).toBe('true') + expect($('#param-has-highcard').text()).toBe('true') + expect($('#param-has-foo').text()).toBe('false') + expect(getLines('Route "/params')).toEqual([]) } $ = await next.render$('/params/semantics/one/run/sync/page-has/server') @@ -1591,28 +888,16 @@ describe('dynamic-io', () => { expect($('#param-has-foo').text()).toBe('false') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - // With PPR fallbacks the first visit is fully prerendered - // because has-checking doesn't postpone even with ppr fallbacks - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } else { - // without PPR the first visit is dynamic - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } + // With PPR fallbacks the first visit is fully prerendered + // because has-checking doesn't postpone even with ppr fallbacks + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-has-lowcard').text()).toBe('true') + expect($('#param-has-highcard').text()).toBe('true') + expect($('#param-has-foo').text()).toBe('false') + expect(getLines('Route "/params')).toEqual([]) } }) @@ -1652,31 +937,14 @@ describe('dynamic-io', () => { expect($('#param-has-foo').text()).toBe('false') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } else { - // When dynamicIO is on and PPR is off the search params passed to a client page - // are enough to mark the whole route as dynamic. This is because we can't know if - // you are going to use those searchParams in an update on the client so we can't infer - // anything about your lack of use during SSR. In the future we will update searchParams - // written to the client to actually derive those params from location and thus not - // require dynamic - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-has-lowcard').text()).toBe('true') + expect($('#param-has-highcard').text()).toBe('true') + expect($('#param-has-foo').text()).toBe('false') + expect(getLines('Route "/params')).toEqual([]) } $ = await next.render$('/params/semantics/one/run/sync/layout-has/client') @@ -1690,28 +958,16 @@ describe('dynamic-io', () => { expect($('#param-has-foo').text()).toBe('false') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - // With PPR fallbacks the first visit is fully prerendered - // because has-checking doesn't postpone even with ppr fallbacks - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } else { - // without PPR the first visit is dynamic - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } + // With PPR fallbacks the first visit is fully prerendered + // because has-checking doesn't postpone even with ppr fallbacks + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-has-lowcard').text()).toBe('true') + expect($('#param-has-highcard').text()).toBe('true') + expect($('#param-has-foo').text()).toBe('false') + expect(getLines('Route "/params')).toEqual([]) } $ = await next.render$('/params/semantics/one/run/sync/page-has/client') @@ -1725,491 +981,238 @@ describe('dynamic-io', () => { expect($('#param-has-foo').text()).toBe('false') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - // With PPR fallbacks the first visit is still fully prerendered - // has-checking keys isn't dynamic and since we aren't awaiting the - // whole params object we end up with a complete prerender even - // for the fallback page. - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } else { - // When dynamicIO is on and PPR is off the search params passed to a client page - // are enough to mark the whole route as dynamic. This is because we can't know if - // you are going to use those searchParams in an update on the client so we can't infer - // anything about your lack of use during SSR. In the future we will update searchParams - // written to the client to actually derive those params from location and thus not - // require dynamic - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-has-lowcard').text()).toBe('true') - expect($('#param-has-highcard').text()).toBe('true') - expect($('#param-has-foo').text()).toBe('false') - expect(getLines('Route "/params')).toEqual([]) - } + // With PPR fallbacks the first visit is still fully prerendered + // has-checking keys isn't dynamic and since we aren't awaiting the + // whole params object we end up with a complete prerender even + // for the fallback page. + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-has-lowcard').text()).toBe('true') + expect($('#param-has-highcard').text()).toBe('true') + expect($('#param-has-foo').text()).toBe('false') + expect(getLines('Route "/params')).toEqual([]) } }) - if (WITH_PPR) { - it('should partially prerender pages that spread params without awaiting first in a server component', async () => { + it('should partially prerender pages that spread params without awaiting first in a server component', async () => { + expect(getLines('Route "/params')).toEqual([]) + let $ = await next.render$( + '/params/semantics/one/build/sync/layout-spread/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`...params` or similar expression'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/sync/layout-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/build/sync/page-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/run/sync/layout-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/run/sync/page-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - }) + } - it('should partially prerender pages that spread params without `use`ing them first in a client component', async () => { + $ = await next.render$( + '/params/semantics/one/build/sync/page-spread/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`...params` or similar expression'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/sync/layout-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/build/sync/page-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/run/sync/layout-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } + } - $ = await next.render$( - '/params/semantics/one/run/sync/page-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#highcard-fallback').text()).toBe( - 'loading highcard children' - ) - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - }) - } else { - it('should prerender pages that spread params without awaiting first in a server component when prebuilt', async () => { + $ = await next.render$( + '/params/semantics/one/run/sync/layout-spread/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`...params` or similar expression'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/sync/layout-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/build/sync/page-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - }) + } - it('should prerender pages that spread params without `use`ing first in a client component when prebuilt', async () => { + $ = await next.render$( + '/params/semantics/one/run/sync/page-spread/server' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`...params` or similar expression'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/build/sync/layout-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#lowcard').text()).toBe('at buildtime') - expect($('#highcard').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - - $ = await next.render$( - '/params/semantics/one/build/sync/page-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - // TODO at the moment pages receive searchParams which are not know at build time - // and always dynamic. We have to pessimistically assume they are accessed and thus - // we cannot actually produce a static shell without PPR. - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('build') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - }) + } + }) - it('should prerender pages that spread params without awaiting first in a server component when not prebuilt', async () => { + it('should partially prerender pages that spread params without `use`ing them first in a client component', async () => { + expect(getLines('Route "/params')).toEqual([]) + let $ = await next.render$( + '/params/semantics/one/build/sync/layout-spread/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`...params` or similar expression'), + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/run/sync/layout-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - ]) - } else { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } + } - $ = await next.render$( - '/params/semantics/one/run/sync/page-spread/server' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - ]) - } else { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - }) + $ = await next.render$( + '/params/semantics/one/build/sync/page-spread/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`...params` or similar expression'), + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('build') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } - it('should prerender pages that spread params without `use`ing first in a client component when not prebuilt', async () => { + $ = await next.render$( + '/params/semantics/one/run/sync/layout-spread/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`...params` or similar expression'), + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') expect(getLines('Route "/params')).toEqual([]) - let $ = await next.render$( - '/params/semantics/one/run/sync/layout-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at runtime') - - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } + } - $ = await next.render$( - '/params/semantics/one/run/sync/page-spread/client' - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([ - expect.stringContaining('`...params` or similar expression'), - expect.stringContaining('`params.lowcard`'), - expect.stringContaining('`params.highcard`'), - ]) - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#lowcard').text()).toBe('at runtime') - expect($('#highcard').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#param-copied-lowcard').text()).toBe('one') - expect($('#param-copied-highcard').text()).toBe('run') - expect($('#param-key-count').text()).toBe('2') - expect(getLines('Route "/params')).toEqual([]) - } - }) - } + $ = await next.render$( + '/params/semantics/one/run/sync/page-spread/client' + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#lowcard').text()).toBe('at runtime') + expect($('#highcard').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([ + expect.stringContaining('`...params` or similar expression'), + expect.stringContaining('`params.lowcard`'), + expect.stringContaining('`params.highcard`'), + ]) + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#lowcard').text()).toBe('at buildtime') + expect($('#highcard').text()).toBe('at buildtime') + expect($('#highcard-fallback').text()).toBe('loading highcard children') + expect($('#page').text()).toBe('at runtime') + expect($('#param-copied-lowcard').text()).toBe('one') + expect($('#param-copied-highcard').text()).toBe('run') + expect($('#param-key-count').text()).toBe('2') + expect(getLines('Route "/params')).toEqual([]) + } + }) }) describe('Param Shadowing', () => { @@ -2227,11 +1230,7 @@ describe('dynamic-io', () => { expect($('#param-status').text()).toBe('qux') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - } else { - expect($('#layout').text()).toBe('at runtime') - } + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#param-dyn').text()).toBe('foo') expect($('#param-then').text()).toBe('bar') @@ -2252,11 +1251,7 @@ describe('dynamic-io', () => { expect($('#param-status').text()).toBe('qux') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - } else { - expect($('#layout').text()).toBe('at runtime') - } + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#param-dyn').text()).toBe('foo') expect($('#param-then').text()).toBe('bar') @@ -2280,11 +1275,7 @@ describe('dynamic-io', () => { expect($('#param-status').text()).toBe('qux') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - } else { - expect($('#layout').text()).toBe('at runtime') - } + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#param-dyn').text()).toBe('foo') expect($('#param-then').text()).toBe('bar') @@ -2305,11 +1296,7 @@ describe('dynamic-io', () => { expect($('#param-status').text()).toBe('qux') expect(getLines('Route "/params')).toEqual([]) } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - } else { - expect($('#layout').text()).toBe('at runtime') - } + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#param-dyn').text()).toBe('foo') expect($('#param-then').text()).toBe('bar') @@ -2339,11 +1326,7 @@ describe('dynamic-io', () => { expect.stringContaining('`params.value`'), ]) } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - } else { - expect($('#layout').text()).toBe('at runtime') - } + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#param-dyn').text()).toBe('foo') expect($('#param-then').text()).toEqual( @@ -2372,11 +1355,7 @@ describe('dynamic-io', () => { expect.stringContaining('`params.value`'), ]) } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - } else { - expect($('#layout').text()).toBe('at runtime') - } + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#param-dyn').text()).toBe('foo') expect($('#param-then').text()).toEqual( @@ -2410,11 +1389,7 @@ describe('dynamic-io', () => { expect.stringContaining('`params.value`'), ]) } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - } else { - expect($('#layout').text()).toBe('at runtime') - } + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#param-dyn').text()).toBe('foo') expect($('#param-then').text()).toEqual( @@ -2445,11 +1420,7 @@ describe('dynamic-io', () => { expect.stringContaining('`params.value`'), ]) } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - } else { - expect($('#layout').text()).toBe('at runtime') - } + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#param-dyn').text()).toBe('foo') expect($('#param-then').text()).toEqual( @@ -2484,14 +1455,10 @@ describe('dynamic-io', () => { line.includes('/params/generate-static-params/[slug]') ) { let nextLine = lines[i++] - if (WITH_PPR) { - // when PPR is on (in this test suite) we also turn on fallbacks. - // we expect the fallback shell first - expect(nextLine).toContain( - '/params/generate-static-params/[slug]' - ) - nextLine = lines[i++] - } + // we expect the fallback shell first + expect(nextLine).toContain('/params/generate-static-params/[slug]') + nextLine = lines[i++] + expect(nextLine).toMatch( /\/params\/generate-static-params\/\d+\/page/ ) diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.random.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.random.test.ts index 679bece90840..19e856d9e778 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.random.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.random.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - describe('dynamic-io', () => { const { next, isNextDev, skipped } = nextTestSetup({ files: __dirname, @@ -33,11 +31,8 @@ describe('dynamic-io', () => { if (isNextDev) { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') } }) diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.search.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.search.test.ts index a2fd659d9fb6..42ce81d1ce6a 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.search.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.search.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - describe('dynamic-io', () => { const { next, isNextDev, skipped } = nextTestSetup({ files: __dirname, @@ -26,399 +24,211 @@ describe('dynamic-io', () => { return warnings } - if (WITH_PPR) { - it('should partially prerender pages that await searchParams in a server component', async () => { - let $ = await next.render$('/search/async/server/await?sentinel=hello') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('main').text()).toContain('inner loading...') - expect($('main').text()).not.toContain('outer loading...') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } - }) - - it('should partially prerender pages that `use` searchParams in a server component', async () => { - let $ = await next.render$('/search/async/server/use?sentinel=hello') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('main').text()).toContain('inner loading...') - expect($('main').text()).not.toContain('outer loading...') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } - }) - - it('should partially prerender pages that `use` searchParams in a client component', async () => { - let $ = await next.render$('/search/async/client/use?sentinel=hello') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('main').text()).toContain('inner loading...') - expect($('main').text()).not.toContain('outer loading...') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } - }) - } else { - it('should not prerender pages that await searchParams in a server component', async () => { - let $ = await next.render$('/search/async/server/await?sentinel=hello') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } - }) - - it('should not prerender pages that `use` searchParams in a server component', async () => { - let $ = await next.render$('/search/async/server/use?sentinel=hello') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } - }) - - it('should not prerender pages that `use` searchParams in a client component', async () => { - let $ = await next.render$('/search/async/client/use?sentinel=hello') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } - }) - } - - if (WITH_PPR) { - it('should partially prerender pages that access a searchParam property synchronously in a server component', async () => { - let $ = await next.render$('/search/sync/server/access?sentinel=hello') - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining('`searchParams.sentinel`'), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at buildtime') - expect($('main').text()).not.toContain('inner loading...') - // This test case aborts synchronously and the later component render - // triggers the outer boundary - expect($('main').text()).toContain('outer loading...') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } - }) - - it('should partially prerender pages that access a searchParam property synchronously in a client component', async () => { - let $ = await next.render$('/search/sync/client/access?sentinel=hello') - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining('`searchParams.sentinel`'), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at buildtime') - expect($('main').text()).toContain('inner loading...') - expect($('main').text()).not.toContain('outer loading...') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } - }) - - it('should partially prerender pages that checks for the existence of a searchParam property synchronously in a server component', async () => { - let $ = await next.render$('/search/sync/server/has?sentinel=hello') - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#has-sentinel').text()).toBe('true') - expect($('#has-foo').text()).toBe('false') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining( - '`Reflect.has(searchParams, "sentinel")`, `"sentinel" in searchParams`, or similar' - ), - expect.stringContaining( - '`Reflect.has(searchParams, "foo")`, `"foo" in searchParams`, or similar' - ), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at buildtime') - expect($('main').text()).not.toContain('inner loading...') - // This test case aborts synchronously and the later component render - // triggers the outer boundary - expect($('main').text()).toContain('outer loading...') - expect($('#has-sentinel').text()).toBe('true') - expect($('#has-foo').text()).toBe('false') - expect($('#page').text()).toBe('at runtime') - } - }) + it('should partially prerender pages that await searchParams in a server component', async () => { + let $ = await next.render$('/search/async/server/await?sentinel=hello') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#value').text()).toBe('hello') + expect($('#page').text()).toBe('at runtime') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('main').text()).toContain('inner loading...') + expect($('main').text()).not.toContain('outer loading...') + expect($('#value').text()).toBe('hello') + expect($('#page').text()).toBe('at runtime') + } + }) - it('should partially prerender pages that checks for the existence of a searchParam property synchronously in a client component', async () => { - let $ = await next.render$('/search/sync/client/has?sentinel=hello') - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#has-sentinel').text()).toBe('true') - expect($('#has-foo').text()).toBe('false') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining( - '`Reflect.has(searchParams, "sentinel")`, `"sentinel" in searchParams`, or similar' - ), - expect.stringContaining( - '`Reflect.has(searchParams, "foo")`, `"foo" in searchParams`, or similar' - ), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at buildtime') - expect($('main').text()).toContain('inner loading...') - expect($('main').text()).not.toContain('outer loading...') - expect($('#has-sentinel').text()).toBe('true') - expect($('#has-foo').text()).toBe('false') - expect($('#page').text()).toBe('at runtime') - } - }) + it('should partially prerender pages that `use` searchParams in a server component', async () => { + let $ = await next.render$('/search/async/server/use?sentinel=hello') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#value').text()).toBe('hello') + expect($('#page').text()).toBe('at runtime') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('main').text()).toContain('inner loading...') + expect($('main').text()).not.toContain('outer loading...') + expect($('#value').text()).toBe('hello') + expect($('#page').text()).toBe('at runtime') + } + }) - it('should partially prerender pages that spreads ...searchParam synchronously in a server component', async () => { - let $ = await next.render$( - '/search/sync/server/spread?sentinel=hello&foo=foo&then=bar&value=baz' - ) - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('[data-value]').length).toBe(3) - expect($('#value-sentinel').text()).toBe('hello') - expect($('#value-foo').text()).toBe('foo') - expect($('#value-value').text()).toBe('baz') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining( - 'conflict with builtin or well-known property names: `then`' - ), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at buildtime') - expect($('main').text()).not.toContain('inner loading...') - // This test case aborts synchronously and the later component render - // triggers the outer boundary - expect($('main').text()).toContain('outer loading...') - expect($('[data-value]').length).toBe(3) - expect($('#value-sentinel').text()).toBe('hello') - expect($('#value-foo').text()).toBe('foo') - expect($('#value-value').text()).toBe('baz') - expect($('#page').text()).toBe('at runtime') - } - }) + it('should partially prerender pages that `use` searchParams in a client component', async () => { + let $ = await next.render$('/search/async/client/use?sentinel=hello') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#value').text()).toBe('hello') + expect($('#page').text()).toBe('at runtime') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('main').text()).toContain('inner loading...') + expect($('main').text()).not.toContain('outer loading...') + expect($('#value').text()).toBe('hello') + expect($('#page').text()).toBe('at runtime') + } + }) - it('should partially prerender pages that spreads ...searchParam synchronously in a client component', async () => { - let $ = await next.render$( - '/search/sync/client/spread?sentinel=hello&foo=foo&then=bar&value=baz' - ) - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('[data-value]').length).toBe(3) - expect($('#value-sentinel').text()).toBe('hello') - expect($('#value-foo').text()).toBe('foo') - expect($('#value-value').text()).toBe('baz') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining( - 'conflict with builtin or well-known property names: `then`' - ), - expect.stringContaining('`searchParams.sentinel`'), - expect.stringContaining('`searchParams.foo`'), - expect.stringContaining('`searchParams.value`'), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at buildtime') - expect($('main').text()).toContain('inner loading...') - expect($('main').text()).not.toContain('outer loading...') - expect($('[data-value]').length).toBe(3) - expect($('#value-sentinel').text()).toBe('hello') - expect($('#value-foo').text()).toBe('foo') - expect($('#value-value').text()).toBe('baz') - expect($('#page').text()).toBe('at runtime') - } - }) - } else { - it('should not prerender a page that accesses a searchParam property synchronously in a server component', async () => { - let $ = await next.render$('/search/sync/server/access?sentinel=hello') - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining('`searchParams.sentinel`'), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } - }) + it('should partially prerender pages that access a searchParam property synchronously in a server component', async () => { + let $ = await next.render$('/search/sync/server/access?sentinel=hello') + let searchWarnings = getLines('Route "/search') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#value').text()).toBe('hello') + expect($('#page').text()).toBe('at runtime') + expect(searchWarnings).toEqual([ + expect.stringContaining('`searchParams.sentinel`'), + ]) + } else { + expect(searchWarnings).toHaveLength(0) + expect($('#layout').text()).toBe('at buildtime') + expect($('main').text()).not.toContain('inner loading...') + // This test case aborts synchronously and the later component render + // triggers the outer boundary + expect($('main').text()).toContain('outer loading...') + expect($('#value').text()).toBe('hello') + expect($('#page').text()).toBe('at runtime') + } + }) - it('should not prerender a page that accesses a searchParam property synchronously in a client component', async () => { - let $ = await next.render$('/search/sync/client/access?sentinel=hello') - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining('`searchParams.sentinel`'), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - expect($('#page').text()).toBe('at runtime') - } - }) + it('should partially prerender pages that access a searchParam property synchronously in a client component', async () => { + let $ = await next.render$('/search/sync/client/access?sentinel=hello') + let searchWarnings = getLines('Route "/search') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#value').text()).toBe('hello') + expect($('#page').text()).toBe('at runtime') + expect(searchWarnings).toEqual([ + expect.stringContaining('`searchParams.sentinel`'), + ]) + } else { + expect(searchWarnings).toHaveLength(0) + expect($('#layout').text()).toBe('at buildtime') + expect($('main').text()).toContain('inner loading...') + expect($('main').text()).not.toContain('outer loading...') + expect($('#value').text()).toBe('hello') + expect($('#page').text()).toBe('at runtime') + } + }) - it('should not prerender a page that checks for the existence of a searchParam property synchronously in a server component', async () => { - let $ = await next.render$('/search/sync/server/has?sentinel=hello') - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#has-sentinel').text()).toBe('true') - expect($('#has-foo').text()).toBe('false') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining( - '`Reflect.has(searchParams, "sentinel")`, `"sentinel" in searchParams`, or similar' - ), - expect.stringContaining( - '`Reflect.has(searchParams, "foo")`, `"foo" in searchParams`, or similar' - ), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at runtime') - expect($('#has-sentinel').text()).toBe('true') - expect($('#has-foo').text()).toBe('false') - expect($('#page').text()).toBe('at runtime') - } - }) + it('should partially prerender pages that checks for the existence of a searchParam property synchronously in a server component', async () => { + let $ = await next.render$('/search/sync/server/has?sentinel=hello') + let searchWarnings = getLines('Route "/search') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#has-sentinel').text()).toBe('true') + expect($('#has-foo').text()).toBe('false') + expect($('#page').text()).toBe('at runtime') + expect(searchWarnings).toEqual([ + expect.stringContaining( + '`Reflect.has(searchParams, "sentinel")`, `"sentinel" in searchParams`, or similar' + ), + expect.stringContaining( + '`Reflect.has(searchParams, "foo")`, `"foo" in searchParams`, or similar' + ), + ]) + } else { + expect(searchWarnings).toHaveLength(0) + expect($('#layout').text()).toBe('at buildtime') + expect($('main').text()).not.toContain('inner loading...') + // This test case aborts synchronously and the later component render + // triggers the outer boundary + expect($('main').text()).toContain('outer loading...') + expect($('#has-sentinel').text()).toBe('true') + expect($('#has-foo').text()).toBe('false') + expect($('#page').text()).toBe('at runtime') + } + }) - it('should not prerender a page that checks for the existence of a searchParam property synchronously in a client component', async () => { - let $ = await next.render$('/search/sync/client/has?sentinel=hello') - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#has-sentinel').text()).toBe('true') - expect($('#has-foo').text()).toBe('false') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining( - '`Reflect.has(searchParams, "sentinel")`, `"sentinel" in searchParams`, or similar' - ), - expect.stringContaining( - '`Reflect.has(searchParams, "foo")`, `"foo" in searchParams`, or similar' - ), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at runtime') - expect($('#has-sentinel').text()).toBe('true') - expect($('#has-foo').text()).toBe('false') - expect($('#page').text()).toBe('at runtime') - } - }) + it('should partially prerender pages that checks for the existence of a searchParam property synchronously in a client component', async () => { + let $ = await next.render$('/search/sync/client/has?sentinel=hello') + let searchWarnings = getLines('Route "/search') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#has-sentinel').text()).toBe('true') + expect($('#has-foo').text()).toBe('false') + expect($('#page').text()).toBe('at runtime') + expect(searchWarnings).toEqual([ + expect.stringContaining( + '`Reflect.has(searchParams, "sentinel")`, `"sentinel" in searchParams`, or similar' + ), + expect.stringContaining( + '`Reflect.has(searchParams, "foo")`, `"foo" in searchParams`, or similar' + ), + ]) + } else { + expect(searchWarnings).toHaveLength(0) + expect($('#layout').text()).toBe('at buildtime') + expect($('main').text()).toContain('inner loading...') + expect($('main').text()).not.toContain('outer loading...') + expect($('#has-sentinel').text()).toBe('true') + expect($('#has-foo').text()).toBe('false') + expect($('#page').text()).toBe('at runtime') + } + }) - it('should not prerender a page that spreads ...searchParam synchronously in a server component', async () => { - let $ = await next.render$( - '/search/sync/server/spread?sentinel=hello&foo=foo&then=bar&value=baz' - ) - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('[data-value]').length).toBe(3) - expect($('#value-sentinel').text()).toBe('hello') - expect($('#value-foo').text()).toBe('foo') - expect($('#value-value').text()).toBe('baz') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining( - 'conflict with builtin or well-known property names: `then`' - ), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at runtime') - expect($('[data-value]').length).toBe(3) - expect($('#value-sentinel').text()).toBe('hello') - expect($('#value-foo').text()).toBe('foo') - expect($('#value-value').text()).toBe('baz') - expect($('#page').text()).toBe('at runtime') - } - }) + it('should partially prerender pages that spreads ...searchParam synchronously in a server component', async () => { + let $ = await next.render$( + '/search/sync/server/spread?sentinel=hello&foo=foo&then=bar&value=baz' + ) + let searchWarnings = getLines('Route "/search') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('[data-value]').length).toBe(3) + expect($('#value-sentinel').text()).toBe('hello') + expect($('#value-foo').text()).toBe('foo') + expect($('#value-value').text()).toBe('baz') + expect($('#page').text()).toBe('at runtime') + expect(searchWarnings).toEqual([ + expect.stringContaining( + 'conflict with builtin or well-known property names: `then`' + ), + ]) + } else { + expect(searchWarnings).toHaveLength(0) + expect($('#layout').text()).toBe('at buildtime') + expect($('main').text()).not.toContain('inner loading...') + // This test case aborts synchronously and the later component render + // triggers the outer boundary + expect($('main').text()).toContain('outer loading...') + expect($('[data-value]').length).toBe(3) + expect($('#value-sentinel').text()).toBe('hello') + expect($('#value-foo').text()).toBe('foo') + expect($('#value-value').text()).toBe('baz') + expect($('#page').text()).toBe('at runtime') + } + }) - it('should not prerender a page that spreads ...searchParam synchronously in a client component', async () => { - let $ = await next.render$( - '/search/sync/client/spread?sentinel=hello&foo=foo&then=bar&value=baz' - ) - let searchWarnings = getLines('Route "/search') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('[data-value]').length).toBe(3) - expect($('#value-sentinel').text()).toBe('hello') - expect($('#value-foo').text()).toBe('foo') - expect($('#value-value').text()).toBe('baz') - expect($('#page').text()).toBe('at runtime') - expect(searchWarnings).toEqual([ - expect.stringContaining( - 'conflict with builtin or well-known property names: `then`' - ), - expect.stringContaining('`searchParams.sentinel`'), - expect.stringContaining('`searchParams.foo`'), - expect.stringContaining('`searchParams.value`'), - ]) - } else { - expect(searchWarnings).toHaveLength(0) - expect($('#layout').text()).toBe('at runtime') - expect($('[data-value]').length).toBe(3) - expect($('#value-sentinel').text()).toBe('hello') - expect($('#value-foo').text()).toBe('foo') - expect($('#value-value').text()).toBe('baz') - expect($('#page').text()).toBe('at runtime') - } - }) - } + it('should partially prerender pages that spreads ...searchParam synchronously in a client component', async () => { + let $ = await next.render$( + '/search/sync/client/spread?sentinel=hello&foo=foo&then=bar&value=baz' + ) + let searchWarnings = getLines('Route "/search') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('[data-value]').length).toBe(3) + expect($('#value-sentinel').text()).toBe('hello') + expect($('#value-foo').text()).toBe('foo') + expect($('#value-value').text()).toBe('baz') + expect($('#page').text()).toBe('at runtime') + expect(searchWarnings).toEqual([ + expect.stringContaining( + 'conflict with builtin or well-known property names: `then`' + ), + expect.stringContaining('`searchParams.sentinel`'), + expect.stringContaining('`searchParams.foo`'), + expect.stringContaining('`searchParams.value`'), + ]) + } else { + expect(searchWarnings).toHaveLength(0) + expect($('#layout').text()).toBe('at buildtime') + expect($('main').text()).toContain('inner loading...') + expect($('main').text()).not.toContain('outer loading...') + expect($('[data-value]').length).toBe(3) + expect($('#value-sentinel').text()).toBe('hello') + expect($('#value-foo').text()).toBe('foo') + expect($('#value-value').text()).toBe('baz') + expect($('#page').text()).toBe('at runtime') + } + }) }) diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.server-action.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.server-action.test.ts index afda00a755e0..04bd962f6559 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.server-action.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.server-action.test.ts @@ -25,18 +25,13 @@ describe('dynamic-io', () => { expect(await browser.elementByCss('p').text()).toBe('result') }) - const isExperimentalReact = Boolean(process.env.__NEXT_EXPERIMENTAL_PPR) - if (isExperimentalReact && isNextDev) { - // TODO(react-time-info): Remove this branch for experimental React in dev mode when the - // issue is resolved where the inclusion of server timings in the RSC - // payload makes the serialized bound args not suitable to be used as a - // cache key. + if (isNextDev) { + // TODO(react-time-info): For experimental React in dev mode, the + // inclusion of server timings in the RSC payload makes the serialized + // bound args not suitable to be used as a cache key. When this is fixed + // we expect this error not to be logged anymore. expect(next.cliOutput).toMatch('Error: Route "/server-action-inline"') - } else { - expect(next.cliOutput).not.toMatch('Error: Route "/server-action-inline"') - } - if (isNextDev) { await assertNoRedbox(browser) } }) diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.test.ts index fbc68d0af393..9b1035d3c3f7 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.test.ts @@ -1,9 +1,5 @@ /* eslint-disable jest/no-standalone-expect */ import { nextTestSetup } from 'e2e-utils' -import { retry } from 'next-test-utils' -import { Playwright } from 'next-webdriver' - -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR describe('dynamic-io', () => { const { next, isNextDev, skipped } = nextTestSetup({ @@ -15,68 +11,6 @@ describe('dynamic-io', () => { return } - if (isNextDev && !WITH_PPR) { - async function hasStaticIndicator(browser: Playwright) { - await browser.elementByCss('[data-nextjs-dev-tools-button]').click() - - return await browser.eval( - () => - document - .querySelector('nextjs-portal') - .shadowRoot.querySelector('[data-nextjs-route-type]') - .getAttribute('data-nextjs-route-type') === 'static' - ) - } - - it('should not have static indicator on dynamic method route', async () => { - const browser = await next.browser('/cases/dynamic_api_cookies') - - await retry(async () => { - expect(await browser.eval('!!window.next.router ? "yes": "no"')).toBe( - 'yes' - ) - }) - - expect(await hasStaticIndicator(browser)).toBe(false) - }) - - it('should not have static indicator on dynamic IO route', async () => { - const browser = await next.browser('/cases/fetch_mixed') - - await retry(async () => { - expect(await browser.eval('!!window.next.router ? "yes": "no"')).toBe( - 'yes' - ) - }) - - expect(await hasStaticIndicator(browser)).toBe(false) - }) - - it('should have static indicator on static route', async () => { - const browser = await next.browser('/cases/static') - - await retry(async () => { - expect(await browser.eval('!!window.next.router ? "yes": "no"')).toBe( - 'yes' - ) - }) - - expect(await hasStaticIndicator(browser)).toBe(true) - }) - - it('should have static indicator on not-found route', async () => { - const browser = await next.browser('/cases/not-found') - - await retry(async () => { - expect(await browser.eval('!!window.next.router ? "yes": "no"')).toBe( - 'yes' - ) - - expect(await hasStaticIndicator(browser)).toBe(true) - }) - }) - } - it('should not have route specific errors', async () => { expect(next.cliOutput).not.toMatch('Error: Route "/') expect(next.cliOutput).not.toMatch('Error occurred prerendering page') @@ -150,37 +84,20 @@ describe('dynamic-io', () => { } }) - if (WITH_PPR) { - it('should partially prerender pages that take longer than a task to render', async () => { - let $ = await next.render$('/cases/task', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - // The inner slot is computed during the prerender but is hidden - // it gets revealed when the resume happens - expect($('#inner').text()).toBe('at buildtime') - } - }) - } else { - it('should not prerender pages that take longer than a single task to render', async () => { - let $ = await next.render$('/cases/task', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - // The inner slot is computed during the prerender but is hidden - // it gets revealed when the resume happens - expect($('#inner').text()).toBe('at runtime') - } - }) - } + it('should partially prerender pages that take longer than a task to render', async () => { + let $ = await next.render$('/cases/task', {}) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#inner').text()).toBe('at runtime') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + // The inner slot is computed during the prerender but is hidden + // it gets revealed when the resume happens + expect($('#inner').text()).toBe('at buildtime') + } + }) it('should prerender pages that only use cached fetches', async () => { const $ = await next.render$('/cases/fetch_cached', {}) @@ -193,33 +110,18 @@ describe('dynamic-io', () => { } }) - if (WITH_PPR) { - it('should partially prerender pages that use at least one fetch without cache', async () => { - let $ = await next.render$('/cases/fetch_mixed', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#inner').text()).toBe('at buildtime') - } - }) - } else { - it('should not prerender pages that use at least one fetch without cache', async () => { - let $ = await next.render$('/cases/fetch_mixed', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } - }) - } + it('should partially prerender pages that use at least one fetch without cache', async () => { + let $ = await next.render$('/cases/fetch_mixed', {}) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#inner').text()).toBe('at runtime') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#inner').text()).toBe('at buildtime') + } + }) it('should prerender pages that only use cached (unstable_cache) IO', async () => { const $ = await next.render$('/cases/io_cached', {}) @@ -254,125 +156,61 @@ describe('dynamic-io', () => { } }) - if (WITH_PPR) { - it('should partially prerender pages that do any uncached IO', async () => { - let $ = await next.render$('/cases/io_mixed', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#inner').text()).toBe('at buildtime') - } - }) - } else { - it('should not prerender pages that do any uncached IO', async () => { - let $ = await next.render$('/cases/io_mixed', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } - }) - } + it('should partially prerender pages that do any uncached IO', async () => { + let $ = await next.render$('/cases/io_mixed', {}) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#inner').text()).toBe('at runtime') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#inner').text()).toBe('at buildtime') + } + }) - if (WITH_PPR) { - it('should partially prerender pages that do any uncached IO (use cache)', async () => { - let $ = await next.render$('/cases/use_cache_mixed', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#inner').text()).toBe('at buildtime') - } - }) - } else { - it('should not prerender pages that do any uncached IO (use cache)', async () => { - let $ = await next.render$('/cases/use_cache_mixed', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - } - }) - } + it('should partially prerender pages that do any uncached IO (use cache)', async () => { + let $ = await next.render$('/cases/use_cache_mixed', {}) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#inner').text()).toBe('at runtime') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#inner').text()).toBe('at buildtime') + } + }) - if (WITH_PPR) { - it('should partially prerender pages that use `cookies()`', async () => { - let $ = await next.render$('/cases/dynamic_api_cookies', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#inner').text()).toBe('at buildtime') - expect($('#value').text()).toBe('hello') - } - }) - } else { - it('should not prerender pages that use `cookies()`', async () => { - let $ = await next.render$('/cases/dynamic_api_cookies', {}) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - } - }) - } + it('should partially prerender pages that use `cookies()`', async () => { + let $ = await next.render$('/cases/dynamic_api_cookies', {}) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#inner').text()).toBe('at runtime') + expect($('#value').text()).toBe('hello') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#inner').text()).toBe('at buildtime') + expect($('#value').text()).toBe('hello') + } + }) - if (WITH_PPR) { - it('should partially prerender pages that use `headers()`', async () => { - let $ = await next.render$('/cases/dynamic_api_headers') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#inner').text()).toBe('at buildtime') - expect($('#value').text()).toBe('hello') - } - }) - } else { - it('should not prerender pages that use `headers()`', async () => { - let $ = await next.render$('/cases/dynamic_api_headers') - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('hello') - } - }) - } + it('should partially prerender pages that use `headers()`', async () => { + let $ = await next.render$('/cases/dynamic_api_headers') + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#inner').text()).toBe('at runtime') + expect($('#value').text()).toBe('hello') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#inner').text()).toBe('at buildtime') + expect($('#value').text()).toBe('hello') + } + }) it('should fully prerender pages that use `unstable_noStore()`', async () => { let $ = await next.render$('/cases/dynamic_api_no_store', {}) @@ -387,83 +225,43 @@ describe('dynamic-io', () => { } }) - if (WITH_PPR) { - it('should partially prerender pages that use `searchParams` in Server Components', async () => { - let $ = await next.render$( - '/cases/dynamic_api_search_params_server?sentinel=my+sentinel', - {} - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('my sentinel') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - expect($('#inner').text()).toBe('at buildtime') - expect($('#value').text()).toBe('my sentinel') - } - }) - } else { - it('should not prerender pages that use `searchParams` in Server Components', async () => { - let $ = await next.render$( - '/cases/dynamic_api_search_params_server?sentinel=my+sentinel', - {} - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('my sentinel') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('my sentinel') - } - }) - } + it('should partially prerender pages that use `searchParams` in Server Components', async () => { + let $ = await next.render$( + '/cases/dynamic_api_search_params_server?sentinel=my+sentinel', + {} + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#inner').text()).toBe('at runtime') + expect($('#value').text()).toBe('my sentinel') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + expect($('#inner').text()).toBe('at buildtime') + expect($('#value').text()).toBe('my sentinel') + } + }) - if (WITH_PPR) { - it('should partially prerender pages that use `searchParams` in Client Components', async () => { - let $ = await next.render$( - '/cases/dynamic_api_search_params_client?sentinel=my+sentinel', - {} - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('my sentinel') - } else { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at buildtime') - // The second component renders before the first one aborts so we end up - // capturing the static value during buildtime - expect($('#inner').text()).toBe('at buildtime') - expect($('#value').text()).toBe('my sentinel') - } - }) - } else { - it('should not prerender pages that use `searchParams` in Client Components', async () => { - let $ = await next.render$( - '/cases/dynamic_api_search_params_client?sentinel=my+sentinel', - {} - ) - if (isNextDev) { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('my sentinel') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page').text()).toBe('at runtime') - expect($('#inner').text()).toBe('at runtime') - expect($('#value').text()).toBe('my sentinel') - } - }) - } + it('should partially prerender pages that use `searchParams` in Client Components', async () => { + let $ = await next.render$( + '/cases/dynamic_api_search_params_client?sentinel=my+sentinel', + {} + ) + if (isNextDev) { + expect($('#layout').text()).toBe('at runtime') + expect($('#page').text()).toBe('at runtime') + expect($('#inner').text()).toBe('at runtime') + expect($('#value').text()).toBe('my sentinel') + } else { + expect($('#layout').text()).toBe('at buildtime') + expect($('#page').text()).toBe('at buildtime') + // The second component renders before the first one aborts so we end up + // capturing the static value during buildtime + expect($('#inner').text()).toBe('at buildtime') + expect($('#value').text()).toBe('my sentinel') + } + }) it('can prerender pages with parallel routes that are static', async () => { const $ = await next.render$('/cases/parallel/static', {}) @@ -501,15 +299,9 @@ describe('dynamic-io', () => { expect($('#page-slot').text()).toBe('at runtime') expect($('#page-children').text()).toBe('at runtime') } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page-slot').text()).toBe('at runtime') - expect($('#page-children').text()).toBe('at buildtime') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page-slot').text()).toBe('at runtime') - expect($('#page-children').text()).toBe('at runtime') - } + expect($('#layout').text()).toBe('at buildtime') + expect($('#page-slot').text()).toBe('at runtime') + expect($('#page-children').text()).toBe('at buildtime') } }) @@ -533,15 +325,9 @@ describe('dynamic-io', () => { expect($('#page-slot').text()).toBe('at runtime') expect($('#page-children').text()).toBe('at runtime') } else { - if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page-slot').text()).toBe('at runtime') - expect($('#page-children').text()).toBe('at buildtime') - } else { - expect($('#layout').text()).toBe('at runtime') - expect($('#page-slot').text()).toBe('at runtime') - expect($('#page-children').text()).toBe('at runtime') - } + expect($('#layout').text()).toBe('at buildtime') + expect($('#page-slot').text()).toBe('at runtime') + expect($('#page-children').text()).toBe('at buildtime') } }) }) diff --git a/test/e2e/app-dir/dynamic-io/dynamic-io.web-crypto.test.ts b/test/e2e/app-dir/dynamic-io/dynamic-io.web-crypto.test.ts index 1b5ac0400ad1..67459e87e231 100644 --- a/test/e2e/app-dir/dynamic-io/dynamic-io.web-crypto.test.ts +++ b/test/e2e/app-dir/dynamic-io/dynamic-io.web-crypto.test.ts @@ -1,7 +1,5 @@ import { nextTestSetup } from 'e2e-utils' -const WITH_PPR = !!process.env.__NEXT_EXPERIMENTAL_PPR - describe('dynamic-io', () => { const { next, isNextDev, skipped } = nextTestSetup({ files: __dirname, @@ -36,12 +34,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } @@ -66,12 +60,8 @@ describe('dynamic-io', () => { expect($('#layout').text()).toBe('at runtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) - } else if (WITH_PPR) { - expect($('#layout').text()).toBe('at buildtime') - expect($('#page').text()).toBe('at runtime') - expect($('#first').text()).not.toEqual($('#second').text()) } else { - expect($('#layout').text()).toBe('at runtime') + expect($('#layout').text()).toBe('at buildtime') expect($('#page').text()).toBe('at runtime') expect($('#first').text()).not.toEqual($('#second').text()) } diff --git a/test/e2e/app-dir/dynamic-io/next.config.js b/test/e2e/app-dir/dynamic-io/next.config.js index 18a5238c3afd..16e8384b655b 100644 --- a/test/e2e/app-dir/dynamic-io/next.config.js +++ b/test/e2e/app-dir/dynamic-io/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, }, } diff --git a/test/e2e/app-dir/node-extensions/fixtures/random/dynamic-io/next.config.js b/test/e2e/app-dir/node-extensions/fixtures/random/dynamic-io/next.config.js index 18a5238c3afd..16e8384b655b 100644 --- a/test/e2e/app-dir/node-extensions/fixtures/random/dynamic-io/next.config.js +++ b/test/e2e/app-dir/node-extensions/fixtures/random/dynamic-io/next.config.js @@ -3,7 +3,7 @@ */ const nextConfig = { experimental: { - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, dynamicIO: true, }, } diff --git a/test/e2e/app-dir/server-source-maps/fixtures/default/next.config.js b/test/e2e/app-dir/server-source-maps/fixtures/default/next.config.js index 3ebbb3f52663..1e411141b940 100644 --- a/test/e2e/app-dir/server-source-maps/fixtures/default/next.config.js +++ b/test/e2e/app-dir/server-source-maps/fixtures/default/next.config.js @@ -4,6 +4,7 @@ const nextConfig = { experimental: { cpus: 1, + ppr: true, dynamicIO: true, serverSourceMaps: true, }, diff --git a/test/e2e/app-dir/use-cache-close-over-function/next.config.js b/test/e2e/app-dir/use-cache-close-over-function/next.config.js index 2e3b04951d3b..6bc18129e2da 100644 --- a/test/e2e/app-dir/use-cache-close-over-function/next.config.js +++ b/test/e2e/app-dir/use-cache-close-over-function/next.config.js @@ -4,6 +4,7 @@ const nextConfig = { experimental: { dynamicIO: true, + ppr: true, serverSourceMaps: true, }, } diff --git a/test/e2e/app-dir/use-cache-custom-handler/next.config.js b/test/e2e/app-dir/use-cache-custom-handler/next.config.js index 0220588c2b3c..41cd9084f6b0 100644 --- a/test/e2e/app-dir/use-cache-custom-handler/next.config.js +++ b/test/e2e/app-dir/use-cache-custom-handler/next.config.js @@ -4,6 +4,7 @@ const nextConfig = { experimental: { dynamicIO: true, + ppr: true, cacheHandlers: { default: require.resolve('./handler.js'), legacy: require.resolve('./legacy-handler.js'), diff --git a/test/e2e/app-dir/use-cache-hanging-inputs/next.config.js b/test/e2e/app-dir/use-cache-hanging-inputs/next.config.js index df2126c94163..64f02de79dfb 100644 --- a/test/e2e/app-dir/use-cache-hanging-inputs/next.config.js +++ b/test/e2e/app-dir/use-cache-hanging-inputs/next.config.js @@ -5,7 +5,7 @@ const nextConfig = { experimental: { dynamicIO: true, prerenderEarlyExit: false, - ppr: process.env.__NEXT_EXPERIMENTAL_PPR === 'true', + ppr: true, }, } diff --git a/test/e2e/app-dir/use-cache-metadata-route-handler/next.config.js b/test/e2e/app-dir/use-cache-metadata-route-handler/next.config.js index ac4afcf43219..b0b2ad8d2353 100644 --- a/test/e2e/app-dir/use-cache-metadata-route-handler/next.config.js +++ b/test/e2e/app-dir/use-cache-metadata-route-handler/next.config.js @@ -4,6 +4,7 @@ const nextConfig = { experimental: { dynamicIO: true, + ppr: true, }, } diff --git a/test/e2e/app-dir/use-cache-route-handler-only/next.config.js b/test/e2e/app-dir/use-cache-route-handler-only/next.config.js index ac4afcf43219..b0b2ad8d2353 100644 --- a/test/e2e/app-dir/use-cache-route-handler-only/next.config.js +++ b/test/e2e/app-dir/use-cache-route-handler-only/next.config.js @@ -4,6 +4,7 @@ const nextConfig = { experimental: { dynamicIO: true, + ppr: true, }, } diff --git a/test/ppr-tests-manifest.json b/test/ppr-tests-manifest.json index 69e18fb51067..69b57d258673 100644 --- a/test/ppr-tests-manifest.json +++ b/test/ppr-tests-manifest.json @@ -83,19 +83,20 @@ "test/development/acceptance-app/**/*.test.{t,j}s{,x}" ], "exclude": [ - "test/integration/app-dir-export/**/*", - "test/e2e/app-dir/next-font/**/*", - "test/e2e/app-dir/ppr/**/*", - "test/e2e/app-dir/ppr-*/**/*", - "test/e2e/app-dir/app-prefetch*/**/*", - "test/e2e/app-dir/searchparams-static-bailout/searchparams-static-bailout.test.ts", + "test/development/app-dir/dynamic-io-*/**/*", + "test/e2e/app-dir/app-client-cache/client-cache.defaults.test.ts", "test/e2e/app-dir/app-client-cache/client-cache.experimental.test.ts", "test/e2e/app-dir/app-client-cache/client-cache.original.test.ts", - "test/e2e/app-dir/app-client-cache/client-cache.defaults.test.ts", - "test/e2e/app-dir/react-max-headers-length/react-max-headers-length.test.ts", + "test/e2e/app-dir/app-prefetch*/**/*", + "test/e2e/app-dir/dynamic-io-*/**/*", + "test/e2e/app-dir/dynamic-io/**/*", + "test/e2e/app-dir/empty-fallback-shells/**/*", "test/e2e/app-dir/front-redirect-issue/front-redirect-issue.test.ts", - "test/e2e/app-dir/static-shell-debugging/static-shell-debugging.test.ts", - "test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.prospective-fallback.test.ts", + "test/e2e/app-dir/next-font/**/*", + "test/e2e/app-dir/ppr-*/**/*", + "test/e2e/app-dir/ppr/**/*", + "test/e2e/app-dir/react-max-headers-length/react-max-headers-length.test.ts", + "test/e2e/app-dir/searchparams-static-bailout/searchparams-static-bailout.test.ts", "test/e2e/app-dir/segment-cache/basic/segment-cache-basic.test.ts", "test/e2e/app-dir/segment-cache/export/segment-cache-output-export.test.ts", "test/e2e/app-dir/segment-cache/incremental-opt-in/segment-cache-incremental-opt-in.test.ts", @@ -103,6 +104,13 @@ "test/e2e/app-dir/segment-cache/prefetch-scheduling/prefetch-scheduling.test.ts", "test/e2e/app-dir/segment-cache/revalidation/segment-cache-revalidation.test.ts", "test/e2e/app-dir/segment-cache/staleness/segment-cache-stale-time.test.ts", + "test/e2e/app-dir/static-shell-debugging/static-shell-debugging.test.ts", + "test/e2e/app-dir/use-cache-close-over-function/**/*", + "test/e2e/app-dir/use-cache-custom-handler/**/*", + "test/e2e/app-dir/use-cache-hanging-inputs/**/*", + "test/e2e/app-dir/use-cache-metadata-route-handler/**/*", + "test/e2e/app-dir/use-cache-route-handler-only/**/*", + "test/integration/app-dir-export/**/*", "test/production/app-dir/build-output-tree-view/build-output-tree-view.test.ts", "test/production/app-dir/global-default-cache-handler/global-default-cache-handler.test.ts" ]