Skip to content

Commit

Permalink
fix: properly handle trailingSlash: true and rewrites (#43641)
Browse files Browse the repository at this point in the history
Fixes #43623

## Bug

- [ ] Related issues linked using `fixes #number`
- [ ] Integration tests added
- [ ] Errors have a helpful link attached, see
[`contributing.md`](https://github.com/vercel/next.js/blob/canary/contributing.md)

## Feature

- [ ] Implements an existing feature request or RFC. Make sure the
feature request has been accepted for implementation before opening a
PR.
- [ ] Related issues linked using `fixes #number`
- [ ]
[e2e](https://github.com/vercel/next.js/blob/canary/contributing/core/testing.md#writing-tests-for-nextjs)
tests added
- [ ] Documentation added
- [ ] Telemetry added. In case of a feature if it's used or not.
- [ ] Errors have a helpful link attached, see
[`contributing.md`](https://github.com/vercel/next.js/blob/canary/contributing.md)

## Documentation / Examples

- [ ] Make sure the linting passes by running `pnpm build && pnpm lint`
- [ ] The "examples guidelines" are followed from [our contributing
doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)

Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
  • Loading branch information
balazsorban44 and wyattjoh committed Dec 3, 2022
1 parent d464ef8 commit bb770ca
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 1 deletion.
9 changes: 8 additions & 1 deletion packages/next/shared/lib/router/adapters.tsx
Expand Up @@ -117,7 +117,14 @@ export function PathnameContextProviderAdapter({
// any query strings), so it should have that stripped. Read more about the
// `asPath` option over at:
// https://nextjs.org/docs/api-reference/next/router#router-object
const url = new URL(router.asPath, 'http://f')
let url: URL
try {
url = new URL(router.asPath, 'http://f')
} catch (_) {
// fallback to / for invalid asPath values e.g. //
return '/'
}

return url.pathname
}, [router.asPath, router.isFallback, router.isReady, router.pathname])

Expand Down
6 changes: 6 additions & 0 deletions test/e2e/trailingslash-with-rewrite/app/next.config.js
@@ -0,0 +1,6 @@
module.exports = {
trailingSlash: true,
async rewrites() {
return [{ source: '/country/', destination: '/' }]
},
}
7 changes: 7 additions & 0 deletions test/e2e/trailingslash-with-rewrite/app/pages/index.js
@@ -0,0 +1,7 @@
export default function Home() {
return <p>Welcome home</p>
}

export async function getStaticProps() {
return { props: {} }
}
25 changes: 25 additions & 0 deletions test/e2e/trailingslash-with-rewrite/index.test.ts
@@ -0,0 +1,25 @@
import { join } from 'path'
import { createNext, FileRef } from 'e2e-utils'
import { NextInstance } from 'test/lib/next-modes/base'
import { fetchViaHTTP } from 'next-test-utils'

describe('trailingSlash:true with rewrites and getStaticProps', () => {
let next: NextInstance

if ((global as any).isNextDeploy) {
it('should skip for deploy mode for now', () => {})
return
}

beforeAll(async () => {
next = await createNext({
files: new FileRef(join(__dirname, './app')),
})
})
afterAll(() => next.destroy())

it('should work', async () => {
const res = await fetchViaHTTP(next.url, '/country')
expect(await res.text()).toContain('Welcome home')
})
})

0 comments on commit bb770ca

Please sign in to comment.