Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions .github/workflows/build_and_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,7 @@ jobs:
export NEXT_TEST_MODE=dev
export NEXT_TEST_REACT_VERSION="${{ matrix.react }}"
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false
export RUST_BACKTRACE=1

node run-tests.js \
Expand Down Expand Up @@ -448,6 +449,7 @@ jobs:
export NEXT_TEST_MODE=start
export NEXT_TEST_REACT_VERSION="${{ matrix.react }}"
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false
export RUST_BACKTRACE=1

node run-tests.js --timings --require-timings -g ${{ matrix.group }} --type production
Expand Down Expand Up @@ -484,6 +486,7 @@ jobs:
export NEXT_TEST_MODE=dev
export NEXT_TEST_REACT_VERSION="${{ matrix.react }}"
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false

# rspack flags
export NEXT_RSPACK=1
Expand Down Expand Up @@ -530,6 +533,7 @@ jobs:
export NEXT_TEST_MODE=start
export NEXT_TEST_REACT_VERSION="${{ matrix.react }}"
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false

# rspack flags
export NEXT_RSPACK=1
Expand Down Expand Up @@ -692,6 +696,7 @@ jobs:
with:
afterBuild: |
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false
node scripts/test-new-tests.mjs \
--flake-detection \
--mode dev \
Expand All @@ -718,6 +723,7 @@ jobs:
with:
afterBuild: |
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false
node scripts/test-new-tests.mjs \
--flake-detection \
--mode start \
Expand Down Expand Up @@ -747,6 +753,7 @@ jobs:
export NEXT_ENABLE_ADAPTER=1
export NEXT_E2E_TEST_TIMEOUT=240000
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false
node scripts/test-new-tests.mjs \
--mode deploy \
--group ${{ matrix.group }} \
Expand Down Expand Up @@ -778,7 +785,6 @@ jobs:
afterBuild: |
export __NEXT_CACHE_COMPONENTS=true
export __NEXT_EXPERIMENTAL_CACHED_NAVIGATIONS=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=true
export NEXT_ENABLE_ADAPTER=1
export NEXT_EXTERNAL_TESTS_FILTERS="test/deploy-tests-manifest.json,test/cache-components-tests-manifest.json"
export NEXT_E2E_TEST_TIMEOUT=240000
Expand Down Expand Up @@ -818,6 +824,7 @@ jobs:
export NEXT_TEST_MODE=dev
export NEXT_TEST_REACT_VERSION="${{ matrix.react }}"
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false

node run-tests.js \
--timings \
Expand All @@ -839,6 +846,7 @@ jobs:
afterBuild: |
export NEXT_TEST_MODE=dev
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false
export IS_TURBOPACK_TEST=1
export TURBOPACK_DEV=1

Expand All @@ -862,6 +870,7 @@ jobs:
afterBuild: |
export NEXT_TEST_MODE=start
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false
export IS_TURBOPACK_TEST=1
export TURBOPACK_BUILD=1

Expand All @@ -886,6 +895,7 @@ jobs:
afterBuild: |
export NEXT_TEST_MODE=start
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false
export IS_TURBOPACK_TEST=1
export TURBOPACK_BUILD=1

Expand Down Expand Up @@ -927,6 +937,7 @@ jobs:
export NEXT_TEST_MODE=start
export NEXT_TEST_REACT_VERSION="${{ matrix.react }}"
export __NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false

node run-tests.js --timings --require-timings -g ${{ matrix.group }} --type production
testTimingsArtifact: 'test-timings'
Expand All @@ -946,6 +957,7 @@ jobs:
# these all run without concurrency because they're heavier
export TEST_CONCURRENCY=1
export IS_TURBOPACK_TEST=1
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=false
TURBOPACK_BUILD=1 NEXT_TEST_MODE=start BROWSER_NAME=firefox node run-tests.js \
test/production/pages-dir/production/test/index.test.ts \
test/production/chunk-load-failure/chunk-load-failure.test.ts
Expand Down Expand Up @@ -990,7 +1002,6 @@ jobs:
afterBuild: |
export __NEXT_CACHE_COMPONENTS=true
export __NEXT_EXPERIMENTAL_CACHED_NAVIGATIONS=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=true
export __NEXT_EXPERIMENTAL_SERVER_COMPONENTS_HMR_CANCELLATION=true
export NEXT_EXTERNAL_TESTS_FILTERS="test/cache-components-tests-manifest.json"
export NEXT_TEST_MODE=dev
Expand Down Expand Up @@ -1027,7 +1038,6 @@ jobs:
afterBuild: |
export __NEXT_CACHE_COMPONENTS=true
export __NEXT_EXPERIMENTAL_CACHED_NAVIGATIONS=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=true
export __NEXT_EXPERIMENTAL_SERVER_COMPONENTS_HMR_CANCELLATION=true
export NEXT_EXTERNAL_TESTS_FILTERS="test/cache-components-tests-manifest.json"
export NEXT_TEST_MODE=start
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@
"with-rspack": "cross-env NEXT_RSPACK=1 NEXT_TEST_USE_RSPACK=1",
"with-turbo": "cross-env IS_TURBOPACK_TEST=1",
"with-webpack": "cross-env IS_WEBPACK_TEST=1",
"with-experimental": "cross-env __NEXT_CACHE_COMPONENTS=true __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=true"
"with-experimental": "cross-env __NEXT_CACHE_COMPONENTS=true"
},
"devDependencies": {
"@actions/core": "1.10.1",
Expand Down
2 changes: 1 addition & 1 deletion packages/next/src/server/config-shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2087,7 +2087,7 @@ export const defaultConfig = Object.freeze({
},
adapterPath: process.env.NEXT_ADAPTER_PATH || undefined,
experimental: {
appNewScrollHandler: false,
appNewScrollHandler: true,
coldCacheBadge: false,
useSkewCookie: false,
cssChunking: true,
Expand Down
17 changes: 11 additions & 6 deletions packages/next/src/server/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2286,21 +2286,26 @@ function enforceExperimentalFeatures(
config.experimental.appShells = true
}

// TODO: Remove this once appNewScrollHandler is the default.
// appNewScrollHandler defaults to `true`. The env var lets us opt back out to
// keep test coverage of the old scroll handler on the non-experimental CI
// shards. Like the other env-var experimental toggles, opting out is surfaced
// in the reported experimental features.
// TODO: Remove this once the appNewScrollHandler opt-out is no longer needed
// for test coverage.
if (
process.env.__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER === 'true' &&
process.env.__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER === 'false' &&
// We do respect an explicit value in the user config.
(config.experimental.appNewScrollHandler === undefined ||
(isDefaultConfig && !config.experimental.appNewScrollHandler))
(isDefaultConfig && config.experimental.appNewScrollHandler))
) {
config.experimental.appNewScrollHandler = true
config.experimental.appNewScrollHandler = false

if (configuredExperimentalFeatures) {
addConfiguredExperimentalFeature(
configuredExperimentalFeatures,
'appNewScrollHandler',
true,
'enabled by `__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER`'
false,
'disabled by `__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER`'
)
}
}
Expand Down
12 changes: 11 additions & 1 deletion scripts/run-jest.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

set -eo pipefail

experimental=false

while [ $# -gt 0 ]; do
case "$1" in
--mode=dev|--mode=start|--mode=deploy)
Expand All @@ -39,8 +41,8 @@ while [ $# -gt 0 ]; do
exit 1
;;
--experimental)
experimental=true
export __NEXT_CACHE_COMPONENTS=true
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=true
;;
--headless)
export HEADLESS=true
Expand All @@ -57,6 +59,14 @@ while [ $# -gt 0 ]; do
shift
done

# appNewScrollHandler defaults to `true`. Non-experimental runs opt out so
# local runs mirror the non-experimental CI shards and keep coverage of the old
# scroll handler; experimental runs leave it on via the default. An explicit
# value in the environment is respected either way.
if [ "$experimental" != true ]; then
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER="${__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER:-false}"
fi

# Resolves to `node_modules/.bin/jest` via `$PATH`. This relies on being
# invoked through pnpm (or another package runner), which prepends the
# workspace's `node_modules/.bin/` to `$PATH` before running the script.
Expand Down
2 changes: 1 addition & 1 deletion test/development/browser-logs/browser-logs.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { retry } from 'next-test-utils'

const bundlerName = process.env.IS_TURBOPACK_TEST ? 'Turbopack' : 'Webpack'
const enableNewScrollHandler =
process.env.__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER === 'true'
process.env.__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER !== 'false'
const innerScrollAndMaybeFocusHandlerName = enableNewScrollHandler
? 'InnerScrollHandlerNew'
: 'InnerScrollAndFocusHandlerOld'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ describe('server-side dev errors', () => {
// with the test capturing `cliOutputIdx`.
if (trimmed.startsWith('- ')) return false
if (/^[✓⚠△] /.test(trimmed)) return false
// Individual entries under the `- Experiments` header are indented and
// use status glyphs (✓ enabled, ⨯ disabled, · value), e.g.
// ` ⨯ appNewScrollHandler (disabled by ...)`. Only these banner entries
// are indented; real dev errors start at column 0 (`⨯ ReferenceError:
// ...`), so key off the leading indentation to avoid dropping them.
if (/^\s+[✓⚠△⨯·] /.test(item)) return false
// Drop compiling indicator lines (e.g. "○ Compiling /gsp ...").
if (trimmed.startsWith('○ ')) return false
return true
Expand Down
2 changes: 1 addition & 1 deletion test/e2e/app-dir/navigation-focus/navigation-focus.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { nextTestSetup } from 'e2e-utils'
import { retry } from 'next-test-utils'

const enableNewScrollHandler =
process.env.__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER === 'true'
process.env.__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER !== 'false'

describe('navigation-focus', () => {
const { next } = nextTestSetup({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { nextTestSetup, type Playwright } from 'e2e-utils'
import { check, assertNoConsoleErrors, retry } from 'next-test-utils'

const enableNewScrollHandler =
process.env.__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER === 'true'
process.env.__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER !== 'false'

describe('router autoscrolling on navigation', () => {
const { next, isNextDev } = nextTestSetup({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@ describe('Config Experimental Warning', () => {
nextConfig: {
images: {},
experimental: {
// We enable this by default in CI
// We enable this in some CI shards
strictRouteTypes: false,
// We disable this in some CI shards
appNewScrollHandler: true,
},
},
})
Expand Down Expand Up @@ -99,8 +101,10 @@ describe('Config Experimental Warning', () => {
module.exports = (phase) => ({
experimental: {
workerThreads: false,
// We enable this by default in CI
// We enable this in some CI shards
strictRouteTypes: false,
// We disable this in some CI shards
appNewScrollHandler: true,
}
})
`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,12 @@ function extractErrorBlock(output: string, errorTitle: string): string {

const beforeTitle = output.substring(0, titleIdx)

// In dev mode, errors start with a `⨯` marker on the same line as the file path.
// In prod mode, errors start with a bare file-path line above the title.
const markerIdx = beforeTitle.lastIndexOf('⨯ ')
// In dev mode, errors start with a `⨯` marker on the same line as the file
// path (e.g. `⨯ ./app/file.js`). In prod mode, errors start with a bare
// file-path line above the title. Match `⨯ ./` specifically so we don't latch
// onto unrelated `⨯` markers in the startup output, such as the experimental
// features list (e.g. `⨯ appNewScrollHandler (disabled by ...)`).
const markerIdx = beforeTitle.lastIndexOf('⨯ ./')
let startIdx: number
if (markerIdx !== -1) {
startIdx = markerIdx
Expand Down
Loading
Loading