Skip to content

Commit

Permalink
Ensure optional params are normalized in minimal mode (#22676)
Browse files Browse the repository at this point in the history
  • Loading branch information
ijjk authored Mar 2, 2021
1 parent a107dcb commit e037c22
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 4 deletions.
8 changes: 4 additions & 4 deletions packages/next/next-server/server/next-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -369,10 +369,9 @@ export default class Server {
// interpolate dynamic params and normalize URL if needed
if (pageIsDynamic) {
let params: ParsedUrlQuery | false = {}
const paramsResult = utils.normalizeDynamicRouteParams({
...parsedUrl.query,
...query,
})

Object.assign(parsedUrl.query, query)
const paramsResult = utils.normalizeDynamicRouteParams(parsedUrl.query)

if (paramsResult.hasValidParams) {
params = paramsResult.params
Expand Down Expand Up @@ -407,6 +406,7 @@ export default class Server {
pathname: matchedPathname,
})
}

Object.assign(parsedUrl.query, params)
utils.normalizeVercelUrl(req, true)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export default (req, res) => {
console.log(req.url, 'query', req.query)
res.json({
url: req.url,
query: req.query,
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
export const getStaticProps = ({ params }) => {
return {
props: {
random: Math.random(),
params: params || null,
},
revalidate: 1,
}
}

export const getStaticPaths = () => {
return {
paths: [],
fallback: true,
}
}

export default function Page(props) {
return <p id="props">{JSON.stringify(props)}</p>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
export const getServerSideProps = ({ query, params }) => {
return {
props: {
random: Math.random(),
query: query,
params: params || null,
},
}
}

export default function Page(props) {
return <p id="props">{JSON.stringify(props)}</p>
}
54 changes: 54 additions & 0 deletions test/integration/required-server-files/test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -448,4 +448,58 @@ describe('Required Server Files', () => {
expect(errors.length).toBe(1)
expect(errors[0].message).toContain('gsp hit an oops')
})

it('should normalize optional values correctly for SSP page', async () => {
const res = await fetchViaHTTP(
appPort,
'/optional-ssp',
{ rest: '', another: 'value' },
{
headers: {
'x-matched-path': '/optional-ssp/[[...rest]]',
},
}
)

const html = await res.text()
const $ = cheerio.load(html)
const props = JSON.parse($('#props').text())
expect(props.params).toEqual({})
expect(props.query).toEqual({ another: 'value' })
})

it('should normalize optional values correctly for SSG page', async () => {
const res = await fetchViaHTTP(
appPort,
'/optional-ssg',
{ rest: '', another: 'value' },
{
headers: {
'x-matched-path': '/optional-ssg/[[...rest]]',
},
}
)

const html = await res.text()
const $ = cheerio.load(html)
const props = JSON.parse($('#props').text())
expect(props.params).toEqual({})
})

it('should normalize optional values correctly for API page', async () => {
const res = await fetchViaHTTP(
appPort,
'/api/optional',
{ rest: '', another: 'value' },
{
headers: {
'x-matched-path': '/api/optional/[[...rest]]',
},
}
)

const json = await res.json()
expect(json.query).toEqual({ another: 'value' })
expect(json.url).toBe('/api/optional?another=value')
})
})

0 comments on commit e037c22

Please sign in to comment.