Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix rewrite and dynamic params on navigating to initial history entry #25495

Merged
5 changes: 4 additions & 1 deletion packages/next/next-server/lib/router/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -650,11 +650,14 @@ export default class Router implements BaseRouter {
if (as.substr(0, 2) !== '//') {
// in order for `e.state` to work on the `onpopstate` event
// we have to register the initial route upon initialization
const options: TransitionOptions = { locale }
;(options as any)._shouldResolveHref = as !== pathname

this.changeState(
'replaceState',
formatWithValidation({ pathname: addBasePath(pathname), query }),
getURL(),
{ locale }
options
)
}

Expand Down
2 changes: 1 addition & 1 deletion test/integration/build-output/test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ describe('Build Output', () => {
true
)

expect(parseFloat(mainSize)).toBeCloseTo(gz ? 19.4 : 60.5, 1)
expect(parseFloat(mainSize)).toBeCloseTo(gz ? 19.4 : 60.6, 1)
expect(mainSize.endsWith('kB')).toBe(true)

expect(parseFloat(frameworkSize)).toBeCloseTo(gz ? 42.0 : 130, 1)
Expand Down
10 changes: 10 additions & 0 deletions test/integration/rewrite-with-browser-history/next.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module.exports = {
rewrites() {
return [
{
source: '/:pagePrefix/:path*',
destination: '/dynamic-page/:pagePrefix/:path*',
},
]
},
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { useRouter } from 'next/router'
import Link from 'next/link'

export default function Page(props) {
const router = useRouter()

return (
<>
<p id="another">another page</p>
<p id="pathname">{router.pathname}</p>
<p id="query">{JSON.stringify(router.query)}</p>

<Link href="/" as="/">
<a id="to-index">Go back to index</a>
</Link>
<br />
</>
)
}

export const getServerSideProps = () => {
return { props: {} }
}
19 changes: 19 additions & 0 deletions test/integration/rewrite-with-browser-history/pages/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { useRouter } from 'next/router'

export default function Page() {
const router = useRouter()

return (
<>
<p id="index">index page</p>
<p id="pathname">{router.pathname}</p>
<p id="query">{JSON.stringify(router.query)}</p>

<br />
</>
)
}

export const getServerSideProps = () => {
return { props: {} }
}
62 changes: 62 additions & 0 deletions test/integration/rewrite-with-browser-history/test/index.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/* eslint-env jest */

import { join } from 'path'
import {
findPort,
killApp,
launchApp,
nextBuild,
nextStart,
} from 'next-test-utils'
import webdriver from 'next-webdriver'

jest.setTimeout(1000 * 60 * 2)

const appDir = join(__dirname, '../')

let appPort
let app

const runTests = () => {
it('back-button should go back to rewritten path successfully', async () => {
const browser = await webdriver(appPort, '/rewrite-me/path')

expect(await browser.elementByCss('#another').text()).toBe('another page')

await browser.eval('window.beforeNav = 1')

await browser
.elementByCss('#to-index')
.click()
.waitForElementByCss('#index')

await browser.back()

expect(await browser.elementByCss('#another').text()).toBe('another page')

expect(await browser.eval('window.beforeNav')).toBe(1)
})
}

describe('rewrites persist with browser history actions', () => {
describe('dev mode', () => {
beforeAll(async () => {
appPort = await findPort()
app = await launchApp(appDir, appPort)
})
afterAll(() => killApp(app))

runTests()
})

describe('production mode', () => {
beforeAll(async () => {
await nextBuild(appDir)
appPort = await findPort()
app = await nextStart(appDir, appPort)
})
afterAll(() => killApp(app))

runTests()
})
})