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

Normalize trailing slashes #13333

Merged
merged 65 commits into from Jun 23, 2020
Merged

Normalize trailing slashes #13333

merged 65 commits into from Jun 23, 2020

Conversation

Janpot
Copy link
Contributor

@Janpot Janpot commented May 25, 2020

Fixes #5214

Redirect pages with a trailing slash to their non-trailing slash counterpart. Also introduce a trailingSlash option. When true, all pages will permanently redirect to their path with a trailing slash, when false the inverse will happen. Links will also be rewritten to automatically include the trailing slash based on this setting.

Since people seem to be interested in the progress, things I'm still looking into before this PR can land:

@Janpot Janpot changed the title Trailing slashes Normalize trailing slashes May 25, 2020
@ijjk
Copy link
Member

ijjk commented May 25, 2020

Failing test suites

test/integration/api-catch-all/test/index.test.js

  • API routes > Server support > should 404 when catch-all with index and trailing slash
  • API routes > Serverless support > should 404 when catch-all with index and trailing slash
  • API routes > dev support > should 404 when catch-all with index and trailing slash
Expand output

● API routes › dev support › should 404 when catch-all with index and trailing slash

expect(received).toEqual(expected) // deep equality

Expected: 404
Received: 200

  32 |     )
  33 | 
> 34 |     expect(data).toEqual(404)
     |                  ^
  35 |   })
  36 | 
  37 |   it('should return data when catch-all with index and no trailing slash', async () => {

  at Object.<anonymous> (integration/api-catch-all/test/index.test.js:34:18)

● API routes › Server support › should 404 when catch-all with index and trailing slash

expect(received).toEqual(expected) // deep equality

Expected: 404
Received: 200

  32 |     )
  33 | 
> 34 |     expect(data).toEqual(404)
     |                  ^
  35 |   })
  36 | 
  37 |   it('should return data when catch-all with index and no trailing slash', async () => {

  at Object.<anonymous> (integration/api-catch-all/test/index.test.js:34:18)

● API routes › Serverless support › should 404 when catch-all with index and trailing slash

expect(received).toEqual(expected) // deep equality

Expected: 404
Received: 200

  32 |     )
  33 | 
> 34 |     expect(data).toEqual(404)
     |                  ^
  35 |   })
  36 | 
  37 |   it('should return data when catch-all with index and no trailing slash', async () => {

  at Object.<anonymous> (integration/api-catch-all/test/index.test.js:34:18)

test/integration/serverless-trace/test/index.test.js

  • Serverless Trace > should 404 on API request with trailing slash
Expand output

● Serverless Trace › should 404 on API request with trailing slash

expect(received).toBe(expected) // Object.is equality

Expected: 404
Received: 200

  173 |   it('should 404 on API request with trailing slash', async () => {
  174 |     const res = await fetchViaHTTP(appPort, '/api/hello/')
> 175 |     expect(res.status).toBe(404)
      |                        ^
  176 |   })
  177 | 
  178 |   describe('With basic usage', () => {

  at Object.<anonymous> (integration/serverless-trace/test/index.test.js:175:24)

test/integration/serverless/test/index.test.js

  • Serverless > should 404 on API request with trailing slash
Expand output

● Serverless › should 404 on API request with trailing slash

expect(received).toBe(expected) // Object.is equality

Expected: 404
Received: 200

  238 |   it('should 404 on API request with trailing slash', async () => {
  239 |     const res = await fetchViaHTTP(appPort, '/api/hello/')
> 240 |     expect(res.status).toBe(404)
      |                        ^
  241 |   })
  242 | 
  243 |   it('should have the correct query string for a dynamic route', async () => {

  at Object.<anonymous> (integration/serverless/test/index.test.js:240:24)

test/integration/client-navigation/test/index.test.js

  • Client Navigation > Rendering via HTTP > 404 > should 404 for /
  • Client Navigation > with 404 pages > should 404 for /
Expand output

● Client Navigation › with 404 pages › should 404 for /

NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"h1"}
  (Session info: headless chrome=81.0.4044.138)

  993 |     it('should 404 for <page>/', async () => {
  994 |       const browser = await webdriver(context.appPort, '/nav/about/')
> 995 |       expect(await browser.elementByCss('h1').text()).toBe('404')
      |              ^
  996 |       expect(await browser.elementByCss('h2').text()).toBe(
  997 |         'This page could not be found.'
  998 |       )

  at Object.throwDecodedError (../node_modules/selenium-webdriver/lib/error.js:550:15)
  at parseHttpResponse (../node_modules/selenium-webdriver/lib/http.js:563:13)
  at Executor.execute (../node_modules/selenium-webdriver/lib/http.js:489:26)
      at runMicrotasks (<anonymous>)
  at thenableWebDriverProxy.execute (../node_modules/selenium-webdriver/lib/webdriver.js:699:17)
  at Object.<anonymous> (integration/client-navigation/test/index.test.js:995:14)

● Client Navigation › with 404 pages › should 404 for /

thrown: "Exceeded timeout of 300000 ms for a test.
Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test."

  991 |     })
  992 | 
> 993 |     it('should 404 for <page>/', async () => {
      |     ^
  994 |       const browser = await webdriver(context.appPort, '/nav/about/')
  995 |       expect(await browser.elementByCss('h1').text()).toBe('404')
  996 |       expect(await browser.elementByCss('h2').text()).toBe(

  at integration/client-navigation/test/index.test.js:993:5
  at integration/client-navigation/test/index.test.js:983:3
  at Object.<anonymous> (integration/client-navigation/test/index.test.js:21:1)

● Client Navigation › Rendering via HTTP › 404 › should 404 for /

expect(received).toBe(expected) // Object.is equality

Expected: "404"
Received: ""

  370 |       it('should 404 for <page>/', async () => {
  371 |         const $ = await get$('/nav/about/')
> 372 |         expect($('h1').text()).toBe('404')
      |                                ^
  373 |         expect($('h2').text()).toBe('This page could not be found.')
  374 |       })
  375 | 

  at Object.<anonymous> (integration/client-navigation/test/rendering.js:372:32)
      at runMicrotasks (<anonymous>)

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 13.5s 13.5s ⚠️ +42ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +688 B
Page Load Tests Overall increase ✓
zeit/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.426 2.301 -0.12
/ avg req/sec 1030.59 1086.33 ⚠️ +55.74
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.501 1.461 -0.04
/error-in-render avg req/sec 1665.02 1710.83 ⚠️ +45.81
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes
zeit/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 927 B 927 B
link.html gzip 937 B 937 B
withRouter.html gzip 924 B 924 B
Overall change 2.79 kB 2.79 kB

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 14.4s 14.2s -207ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +688 B
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
_error.js 844 kB 844 kB ⚠️ +257 B
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 844 kB 844 kB ⚠️ +257 B
link.js 882 kB 882 kB ⚠️ +257 B
routerDirect.js 874 kB 874 kB ⚠️ +257 B
withRouter.js 874 kB 874 kB ⚠️ +257 B
Overall change 4.33 MB 4.33 MB ⚠️ +1.28 kB

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.6s 12.8s ⚠️ +235ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +688 B
Page Load Tests Overall increase ✓
zeit/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.304 2.258 -0.05
/ avg req/sec 1085.18 1107.25 ⚠️ +22.07
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.433 1.394 -0.04
/error-in-render avg req/sec 1743.99 1792.96 ⚠️ +48.97
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes
zeit/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 927 B 927 B
link.html gzip 937 B 937 B
withRouter.html gzip 924 B 924 B
Overall change 2.79 kB 2.79 kB

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 13.3s 13.4s ⚠️ +98ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +688 B
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
_error.js 844 kB 844 kB ⚠️ +257 B
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 844 kB 844 kB ⚠️ +257 B
link.js 882 kB 882 kB ⚠️ +257 B
routerDirect.js 874 kB 874 kB ⚠️ +257 B
withRouter.js 874 kB 874 kB ⚠️ +257 B
Overall change 4.33 MB 4.33 MB ⚠️ +1.28 kB

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Failing test suites

test/integration/serverless-trace/test/index.test.js

  • Serverless Trace > should 404 on API request with trailing slash
Expand output

● Serverless Trace › should 404 on API request with trailing slash

expect(received).toBe(expected) // Object.is equality

Expected: 404
Received: 200

  173 |   it('should 404 on API request with trailing slash', async () => {
  174 |     const res = await fetchViaHTTP(appPort, '/api/hello/')
> 175 |     expect(res.status).toBe(404)
      |                        ^
  176 |   })
  177 | 
  178 |   describe('With basic usage', () => {

  at Object.<anonymous> (integration/serverless-trace/test/index.test.js:175:24)

test/integration/serverless/test/index.test.js

  • Serverless > should 404 on API request with trailing slash
Expand output

● Serverless › should 404 on API request with trailing slash

expect(received).toBe(expected) // Object.is equality

Expected: 404
Received: 200

  238 |   it('should 404 on API request with trailing slash', async () => {
  239 |     const res = await fetchViaHTTP(appPort, '/api/hello/')
> 240 |     expect(res.status).toBe(404)
      |                        ^
  241 |   })
  242 | 
  243 |   it('should have the correct query string for a dynamic route', async () => {

  at Object.<anonymous> (integration/serverless/test/index.test.js:240:24)

test/integration/client-navigation/test/index.test.js

  • Client Navigation > Rendering via HTTP > 404 > should 404 for /
  • Client Navigation > with 404 pages > should 404 for /
Expand output

● Client Navigation › with 404 pages › should 404 for /

NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"h1"}
  (Session info: headless chrome=81.0.4044.138)

  993 |     it('should 404 for <page>/', async () => {
  994 |       const browser = await webdriver(context.appPort, '/nav/about/')
> 995 |       expect(await browser.elementByCss('h1').text()).toBe('404')
      |              ^
  996 |       expect(await browser.elementByCss('h2').text()).toBe(
  997 |         'This page could not be found.'
  998 |       )

  at Object.throwDecodedError (../node_modules/selenium-webdriver/lib/error.js:550:15)
  at parseHttpResponse (../node_modules/selenium-webdriver/lib/http.js:563:13)
  at Executor.execute (../node_modules/selenium-webdriver/lib/http.js:489:26)
      at runMicrotasks (<anonymous>)
  at thenableWebDriverProxy.execute (../node_modules/selenium-webdriver/lib/webdriver.js:699:17)
  at Object.<anonymous> (integration/client-navigation/test/index.test.js:995:14)

● Client Navigation › with 404 pages › should 404 for /

thrown: "Exceeded timeout of 300000 ms for a test.
Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test."

  991 |     })
  992 | 
> 993 |     it('should 404 for <page>/', async () => {
      |     ^
  994 |       const browser = await webdriver(context.appPort, '/nav/about/')
  995 |       expect(await browser.elementByCss('h1').text()).toBe('404')
  996 |       expect(await browser.elementByCss('h2').text()).toBe(

  at integration/client-navigation/test/index.test.js:993:5
  at integration/client-navigation/test/index.test.js:983:3
  at Object.<anonymous> (integration/client-navigation/test/index.test.js:21:1)

● Client Navigation › Rendering via HTTP › 404 › should 404 for /

expect(received).toBe(expected) // Object.is equality

Expected: "404"
Received: ""

  370 |       it('should 404 for <page>/', async () => {
  371 |         const $ = await get$('/nav/about/')
> 372 |         expect($('h1').text()).toBe('404')
      |                                ^
  373 |         expect($('h2').text()).toBe('This page could not be found.')
  374 |       })
  375 | 

  at Object.<anonymous> (integration/client-navigation/test/rendering.js:372:32)
      at runMicrotasks (<anonymous>)

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Stats from current PR

Default Server Mode (Decrease detected ✓)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.3s 12.1s -194ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +688 B
Page Load Tests Overall decrease ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.07 2.047 -0.02
/ avg req/sec 1207.73 1221.01 ⚠️ +13.28
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.171 1.264 ⚠️ +0.09
/error-in-render avg req/sec 2134.39 1977.83 -156.56
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes
zeit/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 927 B 927 B
link.html gzip 937 B 937 B
withRouter.html gzip 924 B 924 B
Overall change 2.79 kB 2.79 kB

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 13s 12.7s -354ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +688 B
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
_error.js 844 kB 844 kB ⚠️ +257 B
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 844 kB 844 kB ⚠️ +257 B
link.js 882 kB 882 kB ⚠️ +257 B
routerDirect.js 874 kB 874 kB ⚠️ +257 B
withRouter.js 874 kB 874 kB ⚠️ +257 B
Overall change 4.33 MB 4.33 MB ⚠️ +1.28 kB

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Failing test suites

test/integration/serverless/test/index.test.js

  • Serverless > should 404 on API request with trailing slash
Expand output

● Serverless › should 404 on API request with trailing slash

expect(received).toBe(expected) // Object.is equality

Expected: 404
Received: 200

  238 |   it('should 404 on API request with trailing slash', async () => {
  239 |     const res = await fetchViaHTTP(appPort, '/api/hello/')
> 240 |     expect(res.status).toBe(404)
      |                        ^
  241 |   })
  242 | 
  243 |   it('should have the correct query string for a dynamic route', async () => {

  at Object.<anonymous> (integration/serverless/test/index.test.js:240:24)

test/integration/client-navigation/test/index.test.js

  • Client Navigation > Rendering via HTTP > 404 > should 404 for /
  • Client Navigation > with 404 pages > should 404 for /
Expand output

● Client Navigation › with 404 pages › should 404 for /

NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"h1"}
  (Session info: headless chrome=81.0.4044.138)

  993 |     it('should 404 for <page>/', async () => {
  994 |       const browser = await webdriver(context.appPort, '/nav/about/')
> 995 |       expect(await browser.elementByCss('h1').text()).toBe('404')
      |              ^
  996 |       expect(await browser.elementByCss('h2').text()).toBe(
  997 |         'This page could not be found.'
  998 |       )

  at Object.throwDecodedError (../node_modules/selenium-webdriver/lib/error.js:550:15)
  at parseHttpResponse (../node_modules/selenium-webdriver/lib/http.js:563:13)
  at Executor.execute (../node_modules/selenium-webdriver/lib/http.js:489:26)
      at runMicrotasks (<anonymous>)
  at thenableWebDriverProxy.execute (../node_modules/selenium-webdriver/lib/webdriver.js:699:17)
  at Object.<anonymous> (integration/client-navigation/test/index.test.js:995:14)

● Client Navigation › with 404 pages › should 404 for /

thrown: "Exceeded timeout of 300000 ms for a test.
Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test."

  991 |     })
  992 | 
> 993 |     it('should 404 for <page>/', async () => {
      |     ^
  994 |       const browser = await webdriver(context.appPort, '/nav/about/')
  995 |       expect(await browser.elementByCss('h1').text()).toBe('404')
  996 |       expect(await browser.elementByCss('h2').text()).toBe(

  at integration/client-navigation/test/index.test.js:993:5
  at integration/client-navigation/test/index.test.js:983:3
  at Object.<anonymous> (integration/client-navigation/test/index.test.js:21:1)

● Client Navigation › Rendering via HTTP › 404 › should 404 for /

expect(received).toBe(expected) // Object.is equality

Expected: "404"
Received: ""

  370 |       it('should 404 for <page>/', async () => {
  371 |         const $ = await get$('/nav/about/')
> 372 |         expect($('h1').text()).toBe('404')
      |                                ^
  373 |         expect($('h2').text()).toBe('This page could not be found.')
  374 |       })
  375 | 

  at Object.<anonymous> (integration/client-navigation/test/rendering.js:372:32)
      at runMicrotasks (<anonymous>)

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Failing test suites

test/integration/app-document-import-order/test/index.test.js

  • Root components import order > _app chunks should be attached to de dom before page chunks
  • Root components import order > on dev server > _app chunks should be attached to de dom before page chunks
Expand output

● Root components import order › _app chunks should be attached to de dom before page chunks

FetchError: request to http://localhost:45909/ failed, reason: connect ECONNREFUSED 127.0.0.1:45909

  at ClientRequest.<anonymous> (../node_modules/node-fetch/lib/index.js:1455:11)

● Root components import order › on dev server › _app chunks should be attached to de dom before page chunks

expect(received).toBeLessThan(expected)

Expected: < -1
Received:   0

  71 |     const requiredByPageIndex = chunks.indexOf('requiredByPage')
  72 | 
> 73 |     expect(requiredByAppIndex).toBeLessThan(requiredByPageIndex)
     |                                ^
  74 |   }
  75 | 
  76 |   it(

  at Object.respectsChunkAttachmentOrder (integration/app-document-import-order/test/index.test.js:73:32)

test/integration/amphtml-fragment-style/test/index.test.js

  • AMP Fragment Styles > adds styles from fragment in AMP mode correctly
Expand output

● AMP Fragment Styles › adds styles from fragment in AMP mode correctly

expect(received).toBe(expected) // Object.is equality

Expected: "PASS"
Received: "FAIL"

  16 |     }
  17 |   }
> 18 |   expect(result.status).toBe('PASS')
     |                         ^
  19 | }
  20 | 

  at validateAMP (lib/amp-test-utils.js:18:25)
  at Object.<anonymous> (integration/amphtml-fragment-style/test/index.test.js:36:5)

test/integration/404-page-custom-error/test/index.test.js

  • Default 404 Page with custom _error > dev mode > should render index page normal
  • Default 404 Page with custom _error > server mode > should render index page normal
  • Default 404 Page with custom _error > serverless mode > should render index page normal
Expand output

● Default 404 Page with custom _error › server mode › should render index page normal

expect(received).toContain(expected) // indexOf

Expected substring: "hello from index"
Received string:    "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/LtT6BppUFg7BTxgdQbbrT/pages/_app.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/8ecb111494dcbfccf46841ad792701684c82777d.97e5f0ba08167c27d95c.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main-3599c65a6c9deac0b9cf.js\" as=\"script\"/></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"LtT6BppUFg7BTxgdQbbrT\",\"nextExport\":true,\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills-a92bdd746eaf317bf1cc.js\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/LtT6BppUFg7BTxgdQbbrT/pages/_app.js\"></script><script src=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" async=\"\"></script><script src=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" async=\"\"></script><script src=\"/_next/static/chunks/8ecb111494dcbfccf46841ad792701684c82777d.97e5f0ba08167c27d95c.js\" async=\"\"></script><script src=\"/_next/static/runtime/main-3599c65a6c9deac0b9cf.js\" async=\"\"></script><script src=\"/_next/static/LtT6BppUFg7BTxgdQbbrT/_buildManifest.js\" async=\"\"></script><script src=\"/_next/static/LtT6BppUFg7BTxgdQbbrT/_ssgManifest.js\" async=\"\"></script></body></html>"

  38 |   it('should render index page normal', async () => {
  39 |     const html = await renderViaHTTP(appPort, '/')
> 40 |     expect(html).toContain('hello from index')
     |                  ^
  41 |   })
  42 | 
  43 |   if (!isDev) {

  at Object.<anonymous> (integration/404-page-custom-error/test/index.test.js:40:18)

● Default 404 Page with custom _error › serverless mode › should render index page normal

expect(received).toContain(expected) // indexOf

Expected substring: "hello from index"
Received string:    "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/pMkGDY9VepAKaqSwClmUy/pages/_app.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/3c8a12cfd615743571049c8b49a0750e75de62ed.97e5f0ba08167c27d95c.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main-3599c65a6c9deac0b9cf.js\" as=\"script\"/></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"pMkGDY9VepAKaqSwClmUy\",\"runtimeConfig\":{},\"nextExport\":true,\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills-a92bdd746eaf317bf1cc.js\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/pMkGDY9VepAKaqSwClmUy/pages/_app.js\"></script><script src=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" async=\"\"></script><script src=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" async=\"\"></script><script src=\"/_next/static/chunks/3c8a12cfd615743571049c8b49a0750e75de62ed.97e5f0ba08167c27d95c.js\" async=\"\"></script><script src=\"/_next/static/runtime/main-3599c65a6c9deac0b9cf.js\" async=\"\"></script><script src=\"/_next/static/pMkGDY9VepAKaqSwClmUy/_buildManifest.js\" async=\"\"></script><script src=\"/_next/static/pMkGDY9VepAKaqSwClmUy/_ssgManifest.js\" async=\"\"></script></body></html>"

  38 |   it('should render index page normal', async () => {
  39 |     const html = await renderViaHTTP(appPort, '/')
> 40 |     expect(html).toContain('hello from index')
     |                  ^
  41 |   })
  42 | 
  43 |   if (!isDev) {

  at Object.<anonymous> (integration/404-page-custom-error/test/index.test.js:40:18)

● Default 404 Page with custom _error › dev mode › should render index page normal

expect(received).toContain(expected) // indexOf

Expected substring: "hello from index"
Received string:    "<!DOCTYPE html><html><head><style data-next-hide-fouc=\"true\">body{display:none}</style><noscript data-next-hide-fouc=\"true\"><style>body{display:block}</style></noscript><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/development/pages/_app.js?ts=1590400138314\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack.js?ts=1590400138314\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main.js?ts=1590400138314\" as=\"script\"/><noscript id=\"__next_css__DO_NOT_USE__\"></noscript></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script src=\"/_next/static/runtime/react-refresh.js?ts=1590400138314\"></script><script src=\"/_next/static/development/dll/dll_e752bf37127677417811.js?ts=1590400138314\"></script><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"development\",\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills.js?ts=1590400138314\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/development/pages/_app.js?ts=1590400138314\"></script><script src=\"/_next/static/runtime/webpack.js?ts=1590400138314\" async=\"\"></script><script src=\"/_next/static/runtime/main.js?ts=1590400138314\" async=\"\"></script><script src=\"/_next/static/development/_buildManifest.js?ts=1590400138314\" async=\"\"></script><script src=\"/_next/static/development/_ssgManifest.js?ts=1590400138314\" async=\"\"></script></body></html>"

  38 |   it('should render index page normal', async () => {
  39 |     const html = await renderViaHTTP(appPort, '/')
> 40 |     expect(html).toContain('hello from index')
     |                  ^
  41 |   })
  42 | 
  43 |   if (!isDev) {

  at Object.<anonymous> (integration/404-page-custom-error/test/index.test.js:40:18)

test/integration/dynamic-require/test/index.test.js

  • Dynamic require > should not throw error when dynamic require is used
Expand output

● Dynamic require › should not throw error when dynamic require is used

expect(received).toMatch(expected)

Expected pattern: /If you can see this then we are good/
Received string:  "<!DOCTYPE html><html><head><style data-next-hide-fouc=\"true\">body{display:none}</style><noscript data-next-hide-fouc=\"true\"><style>body{display:block}</style></noscript><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/development/pages/_app.js?ts=1590400231390\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack.js?ts=1590400231390\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main.js?ts=1590400231390\" as=\"script\"/><noscript id=\"__next_css__DO_NOT_USE__\"></noscript></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script src=\"/_next/static/runtime/react-refresh.js?ts=1590400231390\"></script><script src=\"/_next/static/development/dll/dll_e752bf37127677417811.js?ts=1590400231390\"></script><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"development\",\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills.js?ts=1590400231390\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/development/pages/_app.js?ts=1590400231390\"></script><script src=\"/_next/static/runtime/webpack.js?ts=1590400231390\" async=\"\"></script><script src=\"/_next/static/runtime/main.js?ts=1590400231390\" async=\"\"></script><script src=\"/_next/static/development/_buildManifest.js?ts=1590400231390\" async=\"\"></script><script src=\"/_next/static/development/_ssgManifest.js?ts=1590400231390\" async=\"\"></script></body></html>"

  18 |   it('should not throw error when dynamic require is used', async () => {
  19 |     const html = await renderViaHTTP(appPort, '/')
> 20 |     expect(html).toMatch(/If you can see this then we are good/)
     |                  ^
  21 |   })
  22 | })
  23 | 

  at Object.<anonymous> (integration/dynamic-require/test/index.test.js:20:18)

test/integration/amphtml-custom-validator/test/index.test.js

  • AMP Custom Validator > should build and start successfully
  • AMP Custom Validator > should run in dev mode successfully
Expand output

● AMP Custom Validator › should build and start successfully

expect(received).toContain(expected) // indexOf

Expected substring: "Hello from AMP"
Received string:    "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/01ZiaWtXgkU8LsC1DdnBT/pages/_app.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/87f72fb208733730596c8aa64ef470e7953b8535.97e5f0ba08167c27d95c.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main-e6ebcd99606e6d990015.js\" as=\"script\"/></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"01ZiaWtXgkU8LsC1DdnBT\",\"nextExport\":true,\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills-c347cb6f295444888ea6.js\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/01ZiaWtXgkU8LsC1DdnBT/pages/_app.js\"></script><script src=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" async=\"\"></script><script src=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" async=\"\"></script><script src=\"/_next/static/chunks/87f72fb208733730596c8aa64ef470e7953b8535.97e5f0ba08167c27d95c.js\" async=\"\"></script><script src=\"/_next/static/runtime/main-e6ebcd99606e6d990015.js\" async=\"\"></script><script src=\"/_next/static/01ZiaWtXgkU8LsC1DdnBT/_buildManifest.js\" async=\"\"></script><script src=\"/_next/static/01ZiaWtXgkU8LsC1DdnBT/_ssgManifest.js\" async=\"\"></script></body></html>"

  28 |     await killApp(app)
  29 | 
> 30 |     expect(html).toContain('Hello from AMP')
     |                  ^
  31 |   })
  32 | 
  33 |   it('should run in dev mode successfully', async () => {

  at Object.<anonymous> (integration/amphtml-custom-validator/test/index.test.js:30:18)

● AMP Custom Validator › should run in dev mode successfully

expect(received).toContain(expected) // indexOf

Expected substring: "Hello from AMP"
Received string:    "<!DOCTYPE html><html><head><style data-next-hide-fouc=\"true\">body{display:none}</style><noscript data-next-hide-fouc=\"true\"><style>body{display:block}</style></noscript><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/development/pages/_app.js?ts=1590400259781\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack.js?ts=1590400259781\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main.js?ts=1590400259781\" as=\"script\"/><noscript id=\"__next_css__DO_NOT_USE__\"></noscript></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script src=\"/_next/static/runtime/react-refresh.js?ts=1590400259781\"></script><script src=\"/_next/static/development/dll/dll_e752bf37127677417811.js?ts=1590400259781\"></script><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"development\",\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills.js?ts=1590400259781\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/development/pages/_app.js?ts=1590400259781\"></script><script src=\"/_next/static/runtime/webpack.js?ts=1590400259781\" async=\"\"></script><script src=\"/_next/static/runtime/main.js?ts=1590400259781\" async=\"\"></script><script src=\"/_next/static/development/_buildManifest.js?ts=1590400259781\" async=\"\"></script><script src=\"/_next/static/development/_ssgManifest.js?ts=1590400259781\" async=\"\"></script></body></html>"

  45 | 
  46 |     expect(stderr).not.toContain('error')
> 47 |     expect(html).toContain('Hello from AMP')
     |                  ^
  48 |   })
  49 | })
  50 | 

  at Object.<anonymous> (integration/amphtml-custom-validator/test/index.test.js:47:18)

test/acceptance/ReactRefreshRegression.test.js

  • styled-components hydration mismatch

Expand output

● styled-components hydration mismatch

Application is in inconsistent state: timeout.

  84 |           }
  85 |           if (status !== 'pending') {
> 86 |             throw new Error(`Application is in inconsistent state: ${status}.`)
     |                   ^
  87 |           }
  88 | 
  89 |           await new Promise((resolve) => setTimeout(resolve, 30))

  at Object.patch (acceptance/helpers.js:86:19)
      at runMicrotasks (<anonymous>)
  at Object.<anonymous> (acceptance/ReactRefreshRegression.test.js:47:20)

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Failing test suites

test/integration/amphtml-fragment-style/test/index.test.js

  • AMP Fragment Styles > adds styles from fragment in AMP mode correctly
Expand output

● AMP Fragment Styles › adds styles from fragment in AMP mode correctly

expect(received).toBe(expected) // Object.is equality

Expected: "PASS"
Received: "FAIL"

  16 |     }
  17 |   }
> 18 |   expect(result.status).toBe('PASS')
     |                         ^
  19 | }
  20 | 

  at validateAMP (lib/amp-test-utils.js:18:25)
  at Object.<anonymous> (integration/amphtml-fragment-style/test/index.test.js:36:5)

test/integration/app-document-import-order/test/index.test.js

  • Root components import order > _app chunks should be attached to de dom before page chunks
  • Root components import order > on dev server > _app chunks should be attached to de dom before page chunks
Expand output

● Root components import order › _app chunks should be attached to de dom before page chunks

FetchError: request to http://localhost:38489/ failed, reason: connect ECONNREFUSED 127.0.0.1:38489

  at ClientRequest.<anonymous> (../node_modules/node-fetch/lib/index.js:1455:11)

● Root components import order › on dev server › _app chunks should be attached to de dom before page chunks

expect(received).toBeLessThan(expected)

Expected: < -1
Received:   0

  71 |     const requiredByPageIndex = chunks.indexOf('requiredByPage')
  72 | 
> 73 |     expect(requiredByAppIndex).toBeLessThan(requiredByPageIndex)
     |                                ^
  74 |   }
  75 | 
  76 |   it(

  at Object.respectsChunkAttachmentOrder (integration/app-document-import-order/test/index.test.js:73:32)

test/integration/404-page-custom-error/test/index.test.js

  • Default 404 Page with custom _error > dev mode > should render index page normal
  • Default 404 Page with custom _error > server mode > should render index page normal
  • Default 404 Page with custom _error > serverless mode > should render index page normal
Expand output

● Default 404 Page with custom _error › server mode › should render index page normal

expect(received).toContain(expected) // indexOf

Expected substring: "hello from index"
Received string:    "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/9tU_mnx7k3s4YefBPrr9G/pages/_app.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/656b50b94fa79fcdfdbd7b969c030ba77de4f107.97e5f0ba08167c27d95c.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main-3599c65a6c9deac0b9cf.js\" as=\"script\"/></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"9tU_mnx7k3s4YefBPrr9G\",\"nextExport\":true,\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills-a92bdd746eaf317bf1cc.js\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/9tU_mnx7k3s4YefBPrr9G/pages/_app.js\"></script><script src=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" async=\"\"></script><script src=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" async=\"\"></script><script src=\"/_next/static/chunks/656b50b94fa79fcdfdbd7b969c030ba77de4f107.97e5f0ba08167c27d95c.js\" async=\"\"></script><script src=\"/_next/static/runtime/main-3599c65a6c9deac0b9cf.js\" async=\"\"></script><script src=\"/_next/static/9tU_mnx7k3s4YefBPrr9G/_buildManifest.js\" async=\"\"></script><script src=\"/_next/static/9tU_mnx7k3s4YefBPrr9G/_ssgManifest.js\" async=\"\"></script></body></html>"

  38 |   it('should render index page normal', async () => {
  39 |     const html = await renderViaHTTP(appPort, '/')
> 40 |     expect(html).toContain('hello from index')
     |                  ^
  41 |   })
  42 | 
  43 |   if (!isDev) {

  at Object.<anonymous> (integration/404-page-custom-error/test/index.test.js:40:18)

● Default 404 Page with custom _error › serverless mode › should render index page normal

expect(received).toContain(expected) // indexOf

Expected substring: "hello from index"
Received string:    "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/skvQqiNWvcfUML8sX4rVg/pages/_app.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/57c314b8f298708005d7221b84a57f03a1597b6e.97e5f0ba08167c27d95c.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main-acab55987b55e0be4483.js\" as=\"script\"/></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"skvQqiNWvcfUML8sX4rVg\",\"runtimeConfig\":{},\"nextExport\":true,\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills-7d94efec8e126461d16d.js\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/skvQqiNWvcfUML8sX4rVg/pages/_app.js\"></script><script src=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" async=\"\"></script><script src=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" async=\"\"></script><script src=\"/_next/static/chunks/57c314b8f298708005d7221b84a57f03a1597b6e.97e5f0ba08167c27d95c.js\" async=\"\"></script><script src=\"/_next/static/runtime/main-acab55987b55e0be4483.js\" async=\"\"></script><script src=\"/_next/static/skvQqiNWvcfUML8sX4rVg/_buildManifest.js\" async=\"\"></script><script src=\"/_next/static/skvQqiNWvcfUML8sX4rVg/_ssgManifest.js\" async=\"\"></script></body></html>"

  38 |   it('should render index page normal', async () => {
  39 |     const html = await renderViaHTTP(appPort, '/')
> 40 |     expect(html).toContain('hello from index')
     |                  ^
  41 |   })
  42 | 
  43 |   if (!isDev) {

  at Object.<anonymous> (integration/404-page-custom-error/test/index.test.js:40:18)

● Default 404 Page with custom _error › dev mode › should render index page normal

expect(received).toContain(expected) // indexOf

Expected substring: "hello from index"
Received string:    "<!DOCTYPE html><html><head><style data-next-hide-fouc=\"true\">body{display:none}</style><noscript data-next-hide-fouc=\"true\"><style>body{display:block}</style></noscript><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/development/pages/_app.js?ts=1590400169729\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack.js?ts=1590400169729\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main.js?ts=1590400169729\" as=\"script\"/><noscript id=\"__next_css__DO_NOT_USE__\"></noscript></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script src=\"/_next/static/runtime/react-refresh.js?ts=1590400169729\"></script><script src=\"/_next/static/development/dll/dll_e752bf37127677417811.js?ts=1590400169729\"></script><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"development\",\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills.js?ts=1590400169729\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/development/pages/_app.js?ts=1590400169729\"></script><script src=\"/_next/static/runtime/webpack.js?ts=1590400169729\" async=\"\"></script><script src=\"/_next/static/runtime/main.js?ts=1590400169729\" async=\"\"></script><script src=\"/_next/static/development/_buildManifest.js?ts=1590400169729\" async=\"\"></script><script src=\"/_next/static/development/_ssgManifest.js?ts=1590400169729\" async=\"\"></script></body></html>"

  38 |   it('should render index page normal', async () => {
  39 |     const html = await renderViaHTTP(appPort, '/')
> 40 |     expect(html).toContain('hello from index')
     |                  ^
  41 |   })
  42 | 
  43 |   if (!isDev) {

  at Object.<anonymous> (integration/404-page-custom-error/test/index.test.js:40:18)

test/integration/amphtml-custom-validator/test/index.test.js

  • AMP Custom Validator > should build and start successfully
  • AMP Custom Validator > should run in dev mode successfully
Expand output

● AMP Custom Validator › should build and start successfully

expect(received).toContain(expected) // indexOf

Expected substring: "Hello from AMP"
Received string:    "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/bTHJxQ2lL-c7xeIpkBxaE/pages/_app.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/chunks/2e3b78e519d30db9f206d5bbf712d47b85dc8369.97e5f0ba08167c27d95c.js\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main-e6ebcd99606e6d990015.js\" as=\"script\"/></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"bTHJxQ2lL-c7xeIpkBxaE\",\"nextExport\":true,\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills-c347cb6f295444888ea6.js\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/bTHJxQ2lL-c7xeIpkBxaE/pages/_app.js\"></script><script src=\"/_next/static/runtime/webpack-c212667a5f965e81e004.js\" async=\"\"></script><script src=\"/_next/static/chunks/framework.6c1ee01da8e490b7ed87.js\" async=\"\"></script><script src=\"/_next/static/chunks/2e3b78e519d30db9f206d5bbf712d47b85dc8369.97e5f0ba08167c27d95c.js\" async=\"\"></script><script src=\"/_next/static/runtime/main-e6ebcd99606e6d990015.js\" async=\"\"></script><script src=\"/_next/static/bTHJxQ2lL-c7xeIpkBxaE/_buildManifest.js\" async=\"\"></script><script src=\"/_next/static/bTHJxQ2lL-c7xeIpkBxaE/_ssgManifest.js\" async=\"\"></script></body></html>"

  28 |     await killApp(app)
  29 | 
> 30 |     expect(html).toContain('Hello from AMP')
     |                  ^
  31 |   })
  32 | 
  33 |   it('should run in dev mode successfully', async () => {

  at Object.<anonymous> (integration/amphtml-custom-validator/test/index.test.js:30:18)

● AMP Custom Validator › should run in dev mode successfully

expect(received).toContain(expected) // indexOf

Expected substring: "Hello from AMP"
Received string:    "<!DOCTYPE html><html><head><style data-next-hide-fouc=\"true\">body{display:none}</style><noscript data-next-hide-fouc=\"true\"><style>body{display:block}</style></noscript><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/development/pages/_app.js?ts=1590400209969\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack.js?ts=1590400209969\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main.js?ts=1590400209969\" as=\"script\"/><noscript id=\"__next_css__DO_NOT_USE__\"></noscript></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script src=\"/_next/static/runtime/react-refresh.js?ts=1590400209969\"></script><script src=\"/_next/static/development/dll/dll_e752bf37127677417811.js?ts=1590400209969\"></script><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"development\",\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills.js?ts=1590400209969\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/development/pages/_app.js?ts=1590400209969\"></script><script src=\"/_next/static/runtime/webpack.js?ts=1590400209969\" async=\"\"></script><script src=\"/_next/static/runtime/main.js?ts=1590400209969\" async=\"\"></script><script src=\"/_next/static/development/_buildManifest.js?ts=1590400209969\" async=\"\"></script><script src=\"/_next/static/development/_ssgManifest.js?ts=1590400209969\" async=\"\"></script></body></html>"

  45 | 
  46 |     expect(stderr).not.toContain('error')
> 47 |     expect(html).toContain('Hello from AMP')
     |                  ^
  48 |   })
  49 | })
  50 | 

  at Object.<anonymous> (integration/amphtml-custom-validator/test/index.test.js:47:18)

test/integration/dynamic-require/test/index.test.js

  • Dynamic require > should not throw error when dynamic require is used
Expand output

● Dynamic require › should not throw error when dynamic require is used

expect(received).toMatch(expected)

Expected pattern: /If you can see this then we are good/
Received string:  "<!DOCTYPE html><html><head><style data-next-hide-fouc=\"true\">body{display:none}</style><noscript data-next-hide-fouc=\"true\"><style>body{display:block}</style></noscript><meta name=\"viewport\" content=\"width=device-width\"/><meta charSet=\"utf-8\"/><title>404: This page could not be found</title><meta name=\"next-head-count\" content=\"3\"/><link rel=\"preload\" href=\"/_next/static/development/pages/_app.js?ts=1590400280601\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/webpack.js?ts=1590400280601\" as=\"script\"/><link rel=\"preload\" href=\"/_next/static/runtime/main.js?ts=1590400280601\" as=\"script\"/><noscript id=\"__next_css__DO_NOT_USE__\"></noscript></head><body><div id=\"__next\"><div style=\"color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div><style>body { margin: 0 }</style><h1 style=\"display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top\">404</h1><div style=\"display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle\"><h2 style=\"font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0\">This page could not be found<!-- -->.</h2></div></div></div></div><script src=\"/_next/static/runtime/react-refresh.js?ts=1590400280601\"></script><script src=\"/_next/static/development/dll/dll_e752bf37127677417811.js?ts=1590400280601\"></script><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":404}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"development\",\"isFallback\":false,\"gip\":true}</script><script nomodule=\"\" src=\"/_next/static/runtime/polyfills.js?ts=1590400280601\"></script><script async=\"\" data-next-page=\"/_app\" src=\"/_next/static/development/pages/_app.js?ts=1590400280601\"></script><script src=\"/_next/static/runtime/webpack.js?ts=1590400280601\" async=\"\"></script><script src=\"/_next/static/runtime/main.js?ts=1590400280601\" async=\"\"></script><script src=\"/_next/static/development/_buildManifest.js?ts=1590400280601\" async=\"\"></script><script src=\"/_next/static/development/_ssgManifest.js?ts=1590400280601\" async=\"\"></script></body></html>"

  18 |   it('should not throw error when dynamic require is used', async () => {
  19 |     const html = await renderViaHTTP(appPort, '/')
> 20 |     expect(html).toMatch(/If you can see this then we are good/)
     |                  ^
  21 |   })
  22 | })
  23 | 

  at Object.<anonymous> (integration/dynamic-require/test/index.test.js:20:18)

test/acceptance/ReactRefreshRegression.test.js

  • styled-components hydration mismatch

Expand output

● styled-components hydration mismatch

Application is in inconsistent state: timeout.

  84 |           }
  85 |           if (status !== 'pending') {
> 86 |             throw new Error(`Application is in inconsistent state: ${status}.`)
     |                   ^
  87 |           }
  88 | 
  89 |           await new Promise((resolve) => setTimeout(resolve, 30))

  at Object.patch (acceptance/helpers.js:86:19)
      at runMicrotasks (<anonymous>)
  at Object.<anonymous> (acceptance/ReactRefreshRegression.test.js:47:20)

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 11.5s 11.1s -398ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +456 B
Page Load Tests Overall increase ✓
zeit/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 1.956 1.418 -0.54
/ avg req/sec 1278.19 1763.59 ⚠️ +485.4
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.261 1.162 -0.1
/error-in-render avg req/sec 1983.08 2150.81 ⚠️ +167.73
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes Overall decrease ✓
zeit/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 927 B N/A N/A
link.html gzip 937 B 937 B
withRouter.html gzip 924 B 924 B
Overall change 2.79 kB 1.86 kB -927 B

Diffs

Diff for index.html
deleted

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 11.7s 11.7s -48ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +456 B
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
_error.js 844 kB 844 kB ⚠️ +74 B
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 844 kB 844 kB ⚠️ +74 B
link.js 882 kB 882 kB ⚠️ +74 B
routerDirect.js 874 kB 874 kB ⚠️ +74 B
withRouter.js 874 kB 874 kB ⚠️ +74 B
Overall change 4.33 MB 4.33 MB ⚠️ +370 B

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 11.8s 11.4s -309ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +456 B
Page Load Tests Overall increase ✓
zeit/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.019 1.326 -0.69
/ avg req/sec 1238.39 1884.88 ⚠️ +646.49
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.202 1.059 -0.14
/error-in-render avg req/sec 2079.54 2360.44 ⚠️ +280.9
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes Overall decrease ✓
zeit/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 927 B N/A N/A
link.html gzip 937 B 937 B
withRouter.html gzip 924 B 924 B
Overall change 2.79 kB 1.86 kB -927 B

Diffs

Diff for index.html
deleted

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.2s 12.2s ⚠️ +29ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +456 B
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
_error.js 844 kB 844 kB ⚠️ +74 B
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 844 kB 844 kB ⚠️ +74 B
link.js 882 kB 882 kB ⚠️ +74 B
routerDirect.js 874 kB 874 kB ⚠️ +74 B
withRouter.js 874 kB 874 kB ⚠️ +74 B
Overall change 4.33 MB 4.33 MB ⚠️ +370 B

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12s 11.9s -120ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +466 B
Page Load Tests Overall increase ✓
zeit/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 1.966 1.974 ⚠️ +0.01
/ avg req/sec 1271.55 1266.19 -5.36
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.159 1.119 -0.04
/error-in-render avg req/sec 2156.35 2234.76 ⚠️ +78.41
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes
zeit/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 927 B 927 B
link.html gzip 937 B 937 B
withRouter.html gzip 924 B 924 B
Overall change 2.79 kB 2.79 kB

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.5s 12.6s ⚠️ +70ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +466 B
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
_error.js 844 kB 844 kB ⚠️ +74 B
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 844 kB 844 kB ⚠️ +74 B
link.js 882 kB 882 kB ⚠️ +74 B
routerDirect.js 874 kB 874 kB ⚠️ +74 B
withRouter.js 874 kB 874 kB ⚠️ +74 B
Overall change 4.33 MB 4.33 MB ⚠️ +370 B

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Failing test suites

test/integration/client-navigation/test/index.test.js

  • Client Navigation > Rendering via HTTP > 404 > should 404 for /
  • Client Navigation > with 404 pages > should 404 for /
Expand output

● Client Navigation › with 404 pages › should 404 for /

NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"h1"}
  (Session info: headless chrome=81.0.4044.138)

  993 |     it('should 404 for <page>/', async () => {
  994 |       const browser = await webdriver(context.appPort, '/nav/about/')
> 995 |       expect(await browser.elementByCss('h1').text()).toBe('404')
      |              ^
  996 |       expect(await browser.elementByCss('h2').text()).toBe(
  997 |         'This page could not be found.'
  998 |       )

  at Object.throwDecodedError (../node_modules/selenium-webdriver/lib/error.js:550:15)
  at parseHttpResponse (../node_modules/selenium-webdriver/lib/http.js:563:13)
  at Executor.execute (../node_modules/selenium-webdriver/lib/http.js:489:26)
      at runMicrotasks (<anonymous>)
  at thenableWebDriverProxy.execute (../node_modules/selenium-webdriver/lib/webdriver.js:699:17)
  at Object.<anonymous> (integration/client-navigation/test/index.test.js:995:14)

● Client Navigation › with 404 pages › should 404 for /

thrown: "Exceeded timeout of 300000 ms for a test.
Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test."

  991 |     })
  992 | 
> 993 |     it('should 404 for <page>/', async () => {
      |     ^
  994 |       const browser = await webdriver(context.appPort, '/nav/about/')
  995 |       expect(await browser.elementByCss('h1').text()).toBe('404')
  996 |       expect(await browser.elementByCss('h2').text()).toBe(

  at integration/client-navigation/test/index.test.js:993:5
  at integration/client-navigation/test/index.test.js:983:3
  at Object.<anonymous> (integration/client-navigation/test/index.test.js:21:1)

● Client Navigation › Rendering via HTTP › 404 › should 404 for /

expect(received).toBe(expected) // Object.is equality

Expected: "404"
Received: ""

  370 |       it('should 404 for <page>/', async () => {
  371 |         const $ = await get$('/nav/about/')
> 372 |         expect($('h1').text()).toBe('404')
      |                                ^
  373 |         expect($('h2').text()).toBe('This page could not be found.')
  374 |       })
  375 | 

  at Object.<anonymous> (integration/client-navigation/test/rendering.js:372:32)
      at runMicrotasks (<anonymous>)

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Stats from current PR

Default Server Mode (Decrease detected ✓)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 11s 10.9s -138ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +466 B
Page Load Tests Overall decrease ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 1.959 1.887 -0.07
/ avg req/sec 1276.38 1325.11 ⚠️ +48.73
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.055 1.15 ⚠️ +0.09
/error-in-render avg req/sec 2369.56 2174.81 -194.75
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes
zeit/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 927 B 927 B
link.html gzip 937 B 937 B
withRouter.html gzip 924 B 924 B
Overall change 2.79 kB 2.79 kB

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.3s 11.4s -831ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +466 B
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
_error.js 844 kB 844 kB ⚠️ +74 B
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 844 kB 844 kB ⚠️ +74 B
link.js 882 kB 882 kB ⚠️ +74 B
routerDirect.js 874 kB 874 kB ⚠️ +74 B
withRouter.js 874 kB 874 kB ⚠️ +74 B
Overall change 4.33 MB 4.33 MB ⚠️ +370 B

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Failing test suites

test/integration/client-navigation/test/index.test.js

  • Client Navigation > Rendering via HTTP > 404 > should 404 for /
Expand output

● Client Navigation › Rendering via HTTP › 404 › should 404 for /

expect(received).toBe(expected) // Object.is equality

Expected: "404"
Received: ""

  370 |       it('should 404 for <page>/', async () => {
  371 |         const $ = await get$('/nav/about/')
> 372 |         expect($('h1').text()).toBe('404')
      |                                ^
  373 |         expect($('h2').text()).toBe('This page could not be found.')
  374 |       })
  375 | 

  at Object.<anonymous> (integration/client-navigation/test/rendering.js:372:32)
      at runMicrotasks (<anonymous>)

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 9.8s 9.7s -111ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +466 B
Page Load Tests Overall increase ✓
zeit/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 1.622 1.589 -0.03
/ avg req/sec 1541.41 1573.06 ⚠️ +31.65
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 0.944 0.927 -0.02
/error-in-render avg req/sec 2649.25 2697.05 ⚠️ +47.8
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes
zeit/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 927 B 927 B
link.html gzip 937 B 937 B
withRouter.html gzip 924 B 924 B
Overall change 2.79 kB 2.79 kB

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 10.1s 10s -81ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +466 B
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
_error.js 844 kB 844 kB ⚠️ +74 B
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 844 kB 844 kB ⚠️ +74 B
link.js 882 kB 882 kB ⚠️ +74 B
routerDirect.js 874 kB 874 kB ⚠️ +74 B
withRouter.js 874 kB 874 kB ⚠️ +74 B
Overall change 4.33 MB 4.33 MB ⚠️ +370 B

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.3s 12.2s -154ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +156 B
Page Load Tests Overall increase ✓
zeit/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.116 2.128 ⚠️ +0.01
/ avg req/sec 1181.51 1174.57 -6.94
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.258 1.181 -0.08
/error-in-render avg req/sec 1988.01 2117.02 ⚠️ +129.01
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes
zeit/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 927 B 927 B
link.html gzip 937 B 937 B
withRouter.html gzip 924 B 924 B
Overall change 2.79 kB 2.79 kB

Serverless Mode
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.8s 13s ⚠️ +169ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +156 B
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles
zeit/next.js canary Janpot/next.js trailing-slashes Change
_error.js 844 kB 844 kB
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 844 kB 844 kB
link.js 882 kB 882 kB
routerDirect.js 874 kB 874 kB
withRouter.js 874 kB 874 kB
Overall change 4.33 MB 4.33 MB

@ijjk
Copy link
Member

ijjk commented May 25, 2020

Stats from current PR

Default Server Mode (Decrease detected ✓)
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 13.4s 12.9s -440ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +156 B
Page Load Tests Overall decrease ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.34 2.328 -0.01
/ avg req/sec 1068.17 1074.02 ⚠️ +5.85
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.472 1.519 ⚠️ +0.05
/error-in-render avg req/sec 1698.24 1645.51 -52.73
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes
zeit/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 927 B 927 B
link.html gzip 937 B 937 B
withRouter.html gzip 924 B 924 B
Overall change 2.79 kB 2.79 kB

Serverless Mode
General Overall increase ⚠️
zeit/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 13.8s 14.3s ⚠️ +552ms
nodeModulesSize 61.8 MB 61.8 MB ⚠️ +156 B
Client Bundles (main, webpack, commons)
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.59 kB 6.59 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..1e23.js gzip 10.5 kB 10.5 kB
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.67 kB 5.67 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 6.92 kB
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.5 kB 52.5 kB
Legacy Client Bundles (polyfills)
zeit/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.22 kB 8.22 kB
Client Pages Modern
zeit/next.js canary Janpot/next.js trailing-slashes Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.33 kB 5.33 kB
Client Build Manifests
zeit/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles
zeit/next.js canary Janpot/next.js trailing-slashes Change
_error.js 844 kB 844 kB
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 844 kB 844 kB
link.js 882 kB 882 kB
routerDirect.js 874 kB 874 kB
withRouter.js 874 kB 874 kB
Overall change 4.33 MB 4.33 MB

@ijjk
Copy link
Member

ijjk commented Jun 13, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.8s 12.9s ⚠️ +67ms
nodeModulesSize 65.2 MB 65.2 MB ⚠️ +4.49 kB
Page Load Tests Overall increase ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.256 2.286 ⚠️ +0.03
/ avg req/sec 1108.23 1093.42 -14.81
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.494 1.419 -0.07
/error-in-render avg req/sec 1673.55 1762.31 ⚠️ +88.76
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..0538.js gzip 10.5 kB 10.6 kB ⚠️ +76 B
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 56.9 kB 57 kB ⚠️ +76 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.6 kB 5.6 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.93 kB 7.01 kB ⚠️ +78 B
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.4 kB 52.5 kB ⚠️ +78 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB N/A N/A
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 6.29 kB -2.05 kB
Client Pages Modern Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB N/A N/A
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 3.98 kB -1.52 kB
Client Build Manifests
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 270 B 271 B ⚠️ +1 B
_buildManife..dule.js gzip 274 B 273 B -1 B
Overall change 544 B 544 B
Rendered Page Sizes Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 956 B 955 B -1 B
link.html gzip 963 B 963 B
withRouter.html gzip 949 B 948 B -1 B
Overall change 2.87 kB 2.87 kB -2 B

Diffs

Diff for _buildManifest.js
@@ -2,7 +2,7 @@ self.__BUILD_MANIFEST = {
   "/": ["static\u002F8f6ec52978e4ed685749\u002Fpages\u002Findex.js"],
   "/_error": ["static\u002F280ae3949913ae3eca18\u002Fpages\u002F_error.js"],
   "/hooks": ["static\u002F701db499b372d8b4ad8a\u002Fpages\u002Fhooks.js"],
-  "/link": ["static\u002Fe826d21ad4f09aa9e68e\u002Fpages\u002Flink.js"],
+  "/link": ["static\u002F8b761fc6c799fd929630\u002Fpages\u002Flink.js"],
   "/routerDirect": [
     "static\u002F70609b58a7b84ec58870\u002Fpages\u002FrouterDirect.js"
   ],
Diff for _buildManifest.module.js
@@ -6,7 +6,7 @@ self.__BUILD_MANIFEST = {
   "/hooks": [
     "static\u002F680ac2d033b0bc870c3a\u002Fpages\u002Fhooks.module.js"
   ],
-  "/link": ["static\u002Fd5a70ed72905d882658f\u002Fpages\u002Flink.module.js"],
+  "/link": ["static\u002Fa9a7a3996ad0d62cb2fd\u002Fpages\u002Flink.module.js"],
   "/routerDirect": [
     "static\u002Ff4884873d5a5d6e895c1\u002Fpages\u002FrouterDirect.module.js"
   ],
Diff for de003c3a9d30..8dcf890b6.js
@@ -239,6 +239,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -728,6 +747,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -762,8 +783,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url: url,
           as: as
Diff for de003c3a9d30..6c.module.js
@@ -216,6 +216,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -600,6 +619,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -633,8 +654,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url,
           as
Diff for link.module.js
@@ -65,13 +65,15 @@
     /***/ cTJO: /***/ function(module, exports, __webpack_require__) {
       "use strict";
 
-      var _interopRequireDefault = __webpack_require__("TqRt");
-
       var _interopRequireWildcard = __webpack_require__("284h");
 
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
       exports.__esModule = true;
       exports.default = void 0;
 
+      var _extends2 = _interopRequireDefault(__webpack_require__("pVnL"));
+
       var _react = _interopRequireWildcard(__webpack_require__("q1tI"));
 
       var _url = __webpack_require__("QmWs");
@@ -82,6 +84,8 @@
 
       var _router2 = __webpack_require__("elyg");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function isLocal(href) {
         var url = (0, _url.parse)(href, false, true);
         var origin = (0, _url.parse)(
@@ -112,10 +116,30 @@
         };
       }
 
+      function formatTrailingSlash(url) {
+        return (0, _extends2.default)(
+          (0, _extends2.default)({}, url),
+          {},
+          {
+            pathname:
+              url.pathname &&
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(
+                url.pathname,
+                !!false
+              )
+          }
+        );
+      }
+
       function formatUrl(url) {
-        return url && typeof url === "object"
-          ? (0, _utils.formatWithValidation)(url)
-          : url;
+        return (
+          url &&
+          (0, _utils.formatWithValidation)(
+            formatTrailingSlash(
+              typeof url === "object" ? url : (0, _url.parse)(url)
+            )
+          )
+        );
       }
 
       var cachedObserver;
@@ -379,6 +403,32 @@
       var _default = Link;
       exports.default = _default;
 
+      /***/
+    },
+
+    /***/ pVnL: /***/ function(module, exports) {
+      function _extends() {
+        module.exports = _extends =
+          Object.assign ||
+          function(target) {
+            for (var i = 1; i < arguments.length; i++) {
+              var source = arguments[i];
+
+              for (var key in source) {
+                if (Object.prototype.hasOwnProperty.call(source, key)) {
+                  target[key] = source[key];
+                }
+              }
+            }
+
+            return target;
+          };
+
+        return _extends.apply(this, arguments);
+      }
+
+      module.exports = _extends;
+
       /***/
     }
   },
Diff for link.js
@@ -183,13 +183,15 @@
         }
       }
 
-      var _interopRequireDefault = __webpack_require__("TqRt");
-
       var _interopRequireWildcard = __webpack_require__("284h");
 
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
       exports.__esModule = true;
       exports["default"] = void 0;
 
+      var _extends2 = _interopRequireDefault(__webpack_require__("pVnL"));
+
       var _react = _interopRequireWildcard(__webpack_require__("q1tI"));
 
       var _url = __webpack_require__("QmWs");
@@ -200,6 +202,8 @@
 
       var _router2 = __webpack_require__("elyg");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function isLocal(href) {
         var url = (0, _url.parse)(href, false, true);
         var origin = (0, _url.parse)(
@@ -230,10 +234,30 @@
         };
       }
 
+      function formatTrailingSlash(url) {
+        return (0, _extends2["default"])(
+          (0, _extends2["default"])({}, url),
+          {},
+          {
+            pathname:
+              url.pathname &&
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(
+                url.pathname,
+                !!false
+              )
+          }
+        );
+      }
+
       function formatUrl(url) {
-        return url && typeof url === "object"
-          ? (0, _utils.formatWithValidation)(url)
-          : url;
+        return (
+          url &&
+          (0, _utils.formatWithValidation)(
+            formatTrailingSlash(
+              typeof url === "object" ? url : (0, _url.parse)(url)
+            )
+          )
+        );
       }
 
       var cachedObserver;
@@ -551,6 +575,32 @@
       var _default = Link;
       exports["default"] = _default;
 
+      /***/
+    },
+
+    /***/ pVnL: /***/ function(module, exports) {
+      function _extends() {
+        module.exports = _extends =
+          Object.assign ||
+          function(target) {
+            for (var i = 1; i < arguments.length; i++) {
+              var source = arguments[i];
+
+              for (var key in source) {
+                if (Object.prototype.hasOwnProperty.call(source, key)) {
+                  target[key] = source[key];
+                }
+              }
+            }
+
+            return target;
+          };
+
+        return _extends.apply(this, arguments);
+      }
+
+      module.exports = _extends;
+
       /***/
     }
   },
Diff for index.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.0ea083186308dcf890b6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.d500ad3fc59d95594bc1.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -36,7 +36,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/d5a70ed72905d882658f/pages/link.module.js"
+      href="/_next/static/a9a7a3996ad0d62cb2fd/pages/link.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -122,13 +122,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.0ea083186308dcf890b6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.d500ad3fc59d95594bc1.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -146,13 +146,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/e826d21ad4f09aa9e68e/pages/link.js"
+      src="/_next/static/8b761fc6c799fd929630/pages/link.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/d5a70ed72905d882658f/pages/link.module.js"
+      src="/_next/static/a9a7a3996ad0d62cb2fd/pages/link.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.0ea083186308dcf890b6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.d500ad3fc59d95594bc1.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 13.6s 13.6s -11ms
nodeModulesSize 65.2 MB 65.2 MB ⚠️ +4.49 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..0538.js gzip 10.5 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
de003c3a9d30..7202.js gzip N/A 10.6 kB N/A
Overall change 56.9 kB 57 kB ⚠️ +76 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.6 kB 5.6 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.93 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 7.01 kB N/A
Overall change 52.4 kB 52.5 kB ⚠️ +78 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.22 kB ⚠️ +169 B
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 8.51 kB ⚠️ +169 B
Client Pages Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB 1.71 kB ⚠️ +193 B
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 5.69 kB ⚠️ +193 B
Client Build Manifests
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 270 B 271 B ⚠️ +1 B
_buildManife..dule.js gzip 274 B 273 B -1 B
Overall change 544 B 544 B
Serverless bundles Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
_error.js 875 kB 875 kB ⚠️ +143 B
404.html 4.17 kB 4.17 kB
hooks.html 3.79 kB 3.79 kB
index.js 875 kB 875 kB ⚠️ +143 B
link.js 913 kB 915 kB ⚠️ +1.63 kB
routerDirect.js 905 kB 906 kB ⚠️ +753 B
withRouter.js 905 kB 906 kB ⚠️ +753 B
Overall change 4.48 MB 4.48 MB ⚠️ +3.42 kB

@ijjk
Copy link
Member

ijjk commented Jun 13, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 13.6s 14s ⚠️ +413ms
nodeModulesSize 65.2 MB 65.2 MB ⚠️ +4.49 kB
Page Load Tests Overall increase ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.327 2.358 ⚠️ +0.03
/ avg req/sec 1074.32 1060.07 -14.25
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.526 1.491 -0.03
/error-in-render avg req/sec 1638.3 1676.68 ⚠️ +38.38
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..0538.js gzip 10.5 kB 10.6 kB ⚠️ +76 B
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 56.9 kB 57 kB ⚠️ +76 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.6 kB 5.6 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.93 kB 7.01 kB ⚠️ +78 B
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.4 kB 52.5 kB ⚠️ +78 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB N/A N/A
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 6.29 kB -2.05 kB
Client Pages Modern Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB N/A N/A
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 3.98 kB -1.52 kB
Client Build Manifests
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 270 B 271 B ⚠️ +1 B
_buildManife..dule.js gzip 274 B 273 B -1 B
Overall change 544 B 544 B
Rendered Page Sizes Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 956 B 955 B -1 B
link.html gzip 963 B 963 B
withRouter.html gzip 949 B 948 B -1 B
Overall change 2.87 kB 2.87 kB -2 B

Diffs

Diff for _buildManifest.js
@@ -2,7 +2,7 @@ self.__BUILD_MANIFEST = {
   "/": ["static\u002F8f6ec52978e4ed685749\u002Fpages\u002Findex.js"],
   "/_error": ["static\u002F280ae3949913ae3eca18\u002Fpages\u002F_error.js"],
   "/hooks": ["static\u002F701db499b372d8b4ad8a\u002Fpages\u002Fhooks.js"],
-  "/link": ["static\u002Fe826d21ad4f09aa9e68e\u002Fpages\u002Flink.js"],
+  "/link": ["static\u002F8b761fc6c799fd929630\u002Fpages\u002Flink.js"],
   "/routerDirect": [
     "static\u002F70609b58a7b84ec58870\u002Fpages\u002FrouterDirect.js"
   ],
Diff for _buildManifest.module.js
@@ -6,7 +6,7 @@ self.__BUILD_MANIFEST = {
   "/hooks": [
     "static\u002F680ac2d033b0bc870c3a\u002Fpages\u002Fhooks.module.js"
   ],
-  "/link": ["static\u002Fd5a70ed72905d882658f\u002Fpages\u002Flink.module.js"],
+  "/link": ["static\u002Fa9a7a3996ad0d62cb2fd\u002Fpages\u002Flink.module.js"],
   "/routerDirect": [
     "static\u002Ff4884873d5a5d6e895c1\u002Fpages\u002FrouterDirect.module.js"
   ],
Diff for de003c3a9d30..8dcf890b6.js
@@ -239,6 +239,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -728,6 +747,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -762,8 +783,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url: url,
           as: as
Diff for de003c3a9d30..6c.module.js
@@ -216,6 +216,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -600,6 +619,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -633,8 +654,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url,
           as
Diff for link.module.js
@@ -65,13 +65,15 @@
     /***/ cTJO: /***/ function(module, exports, __webpack_require__) {
       "use strict";
 
-      var _interopRequireDefault = __webpack_require__("TqRt");
-
       var _interopRequireWildcard = __webpack_require__("284h");
 
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
       exports.__esModule = true;
       exports.default = void 0;
 
+      var _extends2 = _interopRequireDefault(__webpack_require__("pVnL"));
+
       var _react = _interopRequireWildcard(__webpack_require__("q1tI"));
 
       var _url = __webpack_require__("QmWs");
@@ -82,6 +84,8 @@
 
       var _router2 = __webpack_require__("elyg");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function isLocal(href) {
         var url = (0, _url.parse)(href, false, true);
         var origin = (0, _url.parse)(
@@ -112,10 +116,30 @@
         };
       }
 
+      function formatTrailingSlash(url) {
+        return (0, _extends2.default)(
+          (0, _extends2.default)({}, url),
+          {},
+          {
+            pathname:
+              url.pathname &&
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(
+                url.pathname,
+                !!false
+              )
+          }
+        );
+      }
+
       function formatUrl(url) {
-        return url && typeof url === "object"
-          ? (0, _utils.formatWithValidation)(url)
-          : url;
+        return (
+          url &&
+          (0, _utils.formatWithValidation)(
+            formatTrailingSlash(
+              typeof url === "object" ? url : (0, _url.parse)(url)
+            )
+          )
+        );
       }
 
       var cachedObserver;
@@ -379,6 +403,32 @@
       var _default = Link;
       exports.default = _default;
 
+      /***/
+    },
+
+    /***/ pVnL: /***/ function(module, exports) {
+      function _extends() {
+        module.exports = _extends =
+          Object.assign ||
+          function(target) {
+            for (var i = 1; i < arguments.length; i++) {
+              var source = arguments[i];
+
+              for (var key in source) {
+                if (Object.prototype.hasOwnProperty.call(source, key)) {
+                  target[key] = source[key];
+                }
+              }
+            }
+
+            return target;
+          };
+
+        return _extends.apply(this, arguments);
+      }
+
+      module.exports = _extends;
+
       /***/
     }
   },
Diff for link.js
@@ -183,13 +183,15 @@
         }
       }
 
-      var _interopRequireDefault = __webpack_require__("TqRt");
-
       var _interopRequireWildcard = __webpack_require__("284h");
 
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
       exports.__esModule = true;
       exports["default"] = void 0;
 
+      var _extends2 = _interopRequireDefault(__webpack_require__("pVnL"));
+
       var _react = _interopRequireWildcard(__webpack_require__("q1tI"));
 
       var _url = __webpack_require__("QmWs");
@@ -200,6 +202,8 @@
 
       var _router2 = __webpack_require__("elyg");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function isLocal(href) {
         var url = (0, _url.parse)(href, false, true);
         var origin = (0, _url.parse)(
@@ -230,10 +234,30 @@
         };
       }
 
+      function formatTrailingSlash(url) {
+        return (0, _extends2["default"])(
+          (0, _extends2["default"])({}, url),
+          {},
+          {
+            pathname:
+              url.pathname &&
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(
+                url.pathname,
+                !!false
+              )
+          }
+        );
+      }
+
       function formatUrl(url) {
-        return url && typeof url === "object"
-          ? (0, _utils.formatWithValidation)(url)
-          : url;
+        return (
+          url &&
+          (0, _utils.formatWithValidation)(
+            formatTrailingSlash(
+              typeof url === "object" ? url : (0, _url.parse)(url)
+            )
+          )
+        );
       }
 
       var cachedObserver;
@@ -551,6 +575,32 @@
       var _default = Link;
       exports["default"] = _default;
 
+      /***/
+    },
+
+    /***/ pVnL: /***/ function(module, exports) {
+      function _extends() {
+        module.exports = _extends =
+          Object.assign ||
+          function(target) {
+            for (var i = 1; i < arguments.length; i++) {
+              var source = arguments[i];
+
+              for (var key in source) {
+                if (Object.prototype.hasOwnProperty.call(source, key)) {
+                  target[key] = source[key];
+                }
+              }
+            }
+
+            return target;
+          };
+
+        return _extends.apply(this, arguments);
+      }
+
+      module.exports = _extends;
+
       /***/
     }
   },
Diff for index.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.0ea083186308dcf890b6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.d500ad3fc59d95594bc1.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -36,7 +36,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/d5a70ed72905d882658f/pages/link.module.js"
+      href="/_next/static/a9a7a3996ad0d62cb2fd/pages/link.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -122,13 +122,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.0ea083186308dcf890b6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.d500ad3fc59d95594bc1.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -146,13 +146,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/e826d21ad4f09aa9e68e/pages/link.js"
+      src="/_next/static/8b761fc6c799fd929630/pages/link.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/d5a70ed72905d882658f/pages/link.module.js"
+      src="/_next/static/a9a7a3996ad0d62cb2fd/pages/link.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.0ea083186308dcf890b6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.d500ad3fc59d95594bc1.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 15.1s 14.8s -251ms
nodeModulesSize 65.2 MB 65.2 MB ⚠️ +4.49 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..0538.js gzip 10.5 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
de003c3a9d30..7202.js gzip N/A 10.6 kB N/A
Overall change 56.9 kB 57 kB ⚠️ +76 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.6 kB 5.6 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.93 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 7.01 kB N/A
Overall change 52.4 kB 52.5 kB ⚠️ +78 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.22 kB ⚠️ +169 B
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 8.51 kB ⚠️ +169 B
Client Pages Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB 1.71 kB ⚠️ +193 B
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 5.69 kB ⚠️ +193 B
Client Build Manifests
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 270 B 271 B ⚠️ +1 B
_buildManife..dule.js gzip 274 B 273 B -1 B
Overall change 544 B 544 B
Serverless bundles Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
_error.js 875 kB 875 kB ⚠️ +143 B
404.html 4.17 kB 4.17 kB
hooks.html 3.79 kB 3.79 kB
index.js 875 kB 875 kB ⚠️ +143 B
link.js 913 kB 915 kB ⚠️ +1.63 kB
routerDirect.js 905 kB 906 kB ⚠️ +753 B
withRouter.js 905 kB 906 kB ⚠️ +753 B
Overall change 4.48 MB 4.48 MB ⚠️ +3.42 kB

@ijjk
Copy link
Member

ijjk commented Jun 13, 2020

Failing test suites

test/integration/dynamic-routing/test/index.test.js

  • Dynamic Routing > production mode > should output a routes-manifest correctly
  • Dynamic Routing > serverless mode > should output a routes-manifest correctly
Expand output

● Dynamic Routing › production mode › should output a routes-manifest correctly

expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 8

@@ -110,9 +110,16 @@
        ],
      },
    ],
    "headers": Array [],
    "pages404": true,
-   "redirects": Array [],
+   "redirects": Array [
+     Object {
+       "destination": "/:path+",
+       "regex": "^(?:\\/((?:[^\\/]+?)(?:\\/(?:[^\\/]+?))*))\\/$",
+       "source": "/:path+/",
+       "statusCode": 308,
+     },
+   ],
    "rewrites": Array [],
    "version": 1,
  }

  522 |       }
  523 | 
> 524 |       expect(manifest).toEqual({
      |                        ^
  525 |         version: 1,
  526 |         pages404: true,
  527 |         basePath: '',

  at Object.<anonymous> (integration/dynamic-routing/test/index.test.js:524:24)

● Dynamic Routing › serverless mode › should output a routes-manifest correctly

expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 8

@@ -110,9 +110,16 @@
        ],
      },
    ],
    "headers": Array [],
    "pages404": true,
-   "redirects": Array [],
+   "redirects": Array [
+     Object {
+       "destination": "/:path+",
+       "regex": "^(?:\\/((?:[^\\/]+?)(?:\\/(?:[^\\/]+?))*))\\/$",
+       "source": "/:path+/",
+       "statusCode": 308,
+     },
+   ],
    "rewrites": Array [],
    "version": 1,
  }

  522 |       }
  523 | 
> 524 |       expect(manifest).toEqual({
      |                        ^
  525 |         version: 1,
  526 |         pages404: true,
  527 |         basePath: '',

  at Object.<anonymous> (integration/dynamic-routing/test/index.test.js:524:24)

@ijjk
Copy link
Member

ijjk commented Jun 13, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.4s 12.6s ⚠️ +223ms
nodeModulesSize 65.2 MB 65.2 MB ⚠️ +4.49 kB
Page Load Tests Overall decrease ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.116 2.084 -0.03
/ avg req/sec 1181.35 1199.53 ⚠️ +18.18
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.191 1.22 ⚠️ +0.03
/error-in-render avg req/sec 2098.3 2048.9 -49.4
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..0538.js gzip 10.5 kB 10.6 kB ⚠️ +76 B
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 56.9 kB 57 kB ⚠️ +76 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.6 kB 5.6 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.93 kB 7.01 kB ⚠️ +78 B
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.4 kB 52.5 kB ⚠️ +78 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB N/A N/A
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 6.29 kB -2.05 kB
Client Pages Modern Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB N/A N/A
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 3.98 kB -1.52 kB
Client Build Manifests
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 270 B 271 B ⚠️ +1 B
_buildManife..dule.js gzip 274 B 273 B -1 B
Overall change 544 B 544 B
Rendered Page Sizes Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 956 B 955 B -1 B
link.html gzip 963 B 963 B
withRouter.html gzip 949 B 948 B -1 B
Overall change 2.87 kB 2.87 kB -2 B

Diffs

Diff for _buildManifest.js
@@ -2,7 +2,7 @@ self.__BUILD_MANIFEST = {
   "/": ["static\u002F8f6ec52978e4ed685749\u002Fpages\u002Findex.js"],
   "/_error": ["static\u002F280ae3949913ae3eca18\u002Fpages\u002F_error.js"],
   "/hooks": ["static\u002F701db499b372d8b4ad8a\u002Fpages\u002Fhooks.js"],
-  "/link": ["static\u002Fe826d21ad4f09aa9e68e\u002Fpages\u002Flink.js"],
+  "/link": ["static\u002F8b761fc6c799fd929630\u002Fpages\u002Flink.js"],
   "/routerDirect": [
     "static\u002F70609b58a7b84ec58870\u002Fpages\u002FrouterDirect.js"
   ],
Diff for _buildManifest.module.js
@@ -6,7 +6,7 @@ self.__BUILD_MANIFEST = {
   "/hooks": [
     "static\u002F680ac2d033b0bc870c3a\u002Fpages\u002Fhooks.module.js"
   ],
-  "/link": ["static\u002Fd5a70ed72905d882658f\u002Fpages\u002Flink.module.js"],
+  "/link": ["static\u002Fa9a7a3996ad0d62cb2fd\u002Fpages\u002Flink.module.js"],
   "/routerDirect": [
     "static\u002Ff4884873d5a5d6e895c1\u002Fpages\u002FrouterDirect.module.js"
   ],
Diff for de003c3a9d30..8dcf890b6.js
@@ -239,6 +239,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -728,6 +747,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -762,8 +783,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url: url,
           as: as
Diff for de003c3a9d30..6c.module.js
@@ -216,6 +216,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -600,6 +619,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -633,8 +654,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url,
           as
Diff for link.module.js
@@ -65,13 +65,15 @@
     /***/ cTJO: /***/ function(module, exports, __webpack_require__) {
       "use strict";
 
-      var _interopRequireDefault = __webpack_require__("TqRt");
-
       var _interopRequireWildcard = __webpack_require__("284h");
 
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
       exports.__esModule = true;
       exports.default = void 0;
 
+      var _extends2 = _interopRequireDefault(__webpack_require__("pVnL"));
+
       var _react = _interopRequireWildcard(__webpack_require__("q1tI"));
 
       var _url = __webpack_require__("QmWs");
@@ -82,6 +84,8 @@
 
       var _router2 = __webpack_require__("elyg");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function isLocal(href) {
         var url = (0, _url.parse)(href, false, true);
         var origin = (0, _url.parse)(
@@ -112,10 +116,30 @@
         };
       }
 
+      function formatTrailingSlash(url) {
+        return (0, _extends2.default)(
+          (0, _extends2.default)({}, url),
+          {},
+          {
+            pathname:
+              url.pathname &&
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(
+                url.pathname,
+                !!false
+              )
+          }
+        );
+      }
+
       function formatUrl(url) {
-        return url && typeof url === "object"
-          ? (0, _utils.formatWithValidation)(url)
-          : url;
+        return (
+          url &&
+          (0, _utils.formatWithValidation)(
+            formatTrailingSlash(
+              typeof url === "object" ? url : (0, _url.parse)(url)
+            )
+          )
+        );
       }
 
       var cachedObserver;
@@ -379,6 +403,32 @@
       var _default = Link;
       exports.default = _default;
 
+      /***/
+    },
+
+    /***/ pVnL: /***/ function(module, exports) {
+      function _extends() {
+        module.exports = _extends =
+          Object.assign ||
+          function(target) {
+            for (var i = 1; i < arguments.length; i++) {
+              var source = arguments[i];
+
+              for (var key in source) {
+                if (Object.prototype.hasOwnProperty.call(source, key)) {
+                  target[key] = source[key];
+                }
+              }
+            }
+
+            return target;
+          };
+
+        return _extends.apply(this, arguments);
+      }
+
+      module.exports = _extends;
+
       /***/
     }
   },
Diff for link.js
@@ -183,13 +183,15 @@
         }
       }
 
-      var _interopRequireDefault = __webpack_require__("TqRt");
-
       var _interopRequireWildcard = __webpack_require__("284h");
 
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
       exports.__esModule = true;
       exports["default"] = void 0;
 
+      var _extends2 = _interopRequireDefault(__webpack_require__("pVnL"));
+
       var _react = _interopRequireWildcard(__webpack_require__("q1tI"));
 
       var _url = __webpack_require__("QmWs");
@@ -200,6 +202,8 @@
 
       var _router2 = __webpack_require__("elyg");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function isLocal(href) {
         var url = (0, _url.parse)(href, false, true);
         var origin = (0, _url.parse)(
@@ -230,10 +234,30 @@
         };
       }
 
+      function formatTrailingSlash(url) {
+        return (0, _extends2["default"])(
+          (0, _extends2["default"])({}, url),
+          {},
+          {
+            pathname:
+              url.pathname &&
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(
+                url.pathname,
+                !!false
+              )
+          }
+        );
+      }
+
       function formatUrl(url) {
-        return url && typeof url === "object"
-          ? (0, _utils.formatWithValidation)(url)
-          : url;
+        return (
+          url &&
+          (0, _utils.formatWithValidation)(
+            formatTrailingSlash(
+              typeof url === "object" ? url : (0, _url.parse)(url)
+            )
+          )
+        );
       }
 
       var cachedObserver;
@@ -551,6 +575,32 @@
       var _default = Link;
       exports["default"] = _default;
 
+      /***/
+    },
+
+    /***/ pVnL: /***/ function(module, exports) {
+      function _extends() {
+        module.exports = _extends =
+          Object.assign ||
+          function(target) {
+            for (var i = 1; i < arguments.length; i++) {
+              var source = arguments[i];
+
+              for (var key in source) {
+                if (Object.prototype.hasOwnProperty.call(source, key)) {
+                  target[key] = source[key];
+                }
+              }
+            }
+
+            return target;
+          };
+
+        return _extends.apply(this, arguments);
+      }
+
+      module.exports = _extends;
+
       /***/
     }
   },
Diff for index.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.0ea083186308dcf890b6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.d500ad3fc59d95594bc1.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -36,7 +36,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/d5a70ed72905d882658f/pages/link.module.js"
+      href="/_next/static/a9a7a3996ad0d62cb2fd/pages/link.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -122,13 +122,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.0ea083186308dcf890b6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.d500ad3fc59d95594bc1.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -146,13 +146,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/e826d21ad4f09aa9e68e/pages/link.js"
+      src="/_next/static/8b761fc6c799fd929630/pages/link.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/d5a70ed72905d882658f/pages/link.module.js"
+      src="/_next/static/a9a7a3996ad0d62cb2fd/pages/link.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.0ea083186308dcf890b6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.d500ad3fc59d95594bc1.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.f733a40f0fc0ecaa4b6c.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b05ce186af7a2566dcea.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 13.5s 14.3s ⚠️ +769ms
nodeModulesSize 65.2 MB 65.2 MB ⚠️ +4.49 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..0538.js gzip 10.5 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
de003c3a9d30..7202.js gzip N/A 10.6 kB N/A
Overall change 56.9 kB 57 kB ⚠️ +76 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.6 kB 5.6 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.93 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 7.01 kB N/A
Overall change 52.4 kB 52.5 kB ⚠️ +78 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.22 kB ⚠️ +169 B
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 8.51 kB ⚠️ +169 B
Client Pages Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB 1.71 kB ⚠️ +193 B
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 5.69 kB ⚠️ +193 B
Client Build Manifests
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 270 B 271 B ⚠️ +1 B
_buildManife..dule.js gzip 274 B 273 B -1 B
Overall change 544 B 544 B
Serverless bundles Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
_error.js 875 kB 875 kB ⚠️ +143 B
404.html 4.17 kB 4.17 kB
hooks.html 3.79 kB 3.79 kB
index.js 875 kB 875 kB ⚠️ +143 B
link.js 913 kB 915 kB ⚠️ +1.63 kB
routerDirect.js 905 kB 906 kB ⚠️ +753 B
withRouter.js 905 kB 906 kB ⚠️ +753 B
Overall change 4.48 MB 4.48 MB ⚠️ +3.42 kB

@ijjk
Copy link
Member

ijjk commented Jun 18, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 10s 10.2s ⚠️ +108ms
nodeModulesSize 67 MB 67 MB ⚠️ +4.49 kB
Page Load Tests Overall increase ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 1.728 1.764 ⚠️ +0.04
/ avg req/sec 1446.66 1417.05 -29.61
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.01 0.988 -0.02
/error-in-render avg req/sec 2476.13 2531.64 ⚠️ +55.51
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..4dd5.js gzip 10.5 kB 10.6 kB ⚠️ +78 B
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 56.9 kB 57 kB ⚠️ +78 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.6 kB 5.6 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB 7 kB ⚠️ +76 B
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.4 kB 52.5 kB ⚠️ +76 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB N/A N/A
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 6.29 kB -2.05 kB
Client Pages Modern Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB N/A N/A
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 3.98 kB -1.52 kB
Client Build Manifests
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 270 B 271 B ⚠️ +1 B
_buildManife..dule.js gzip 274 B 273 B -1 B
Overall change 544 B 544 B
Rendered Page Sizes Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 953 B 955 B ⚠️ +2 B
link.html gzip 960 B 962 B ⚠️ +2 B
withRouter.html gzip 947 B 948 B ⚠️ +1 B
Overall change 2.86 kB 2.87 kB ⚠️ +5 B

Diffs

Diff for _buildManifest.js
@@ -2,7 +2,7 @@ self.__BUILD_MANIFEST = {
   "/": ["static\u002F8f6ec52978e4ed685749\u002Fpages\u002Findex.js"],
   "/_error": ["static\u002F280ae3949913ae3eca18\u002Fpages\u002F_error.js"],
   "/hooks": ["static\u002F701db499b372d8b4ad8a\u002Fpages\u002Fhooks.js"],
-  "/link": ["static\u002Fe826d21ad4f09aa9e68e\u002Fpages\u002Flink.js"],
+  "/link": ["static\u002F8b761fc6c799fd929630\u002Fpages\u002Flink.js"],
   "/routerDirect": [
     "static\u002F70609b58a7b84ec58870\u002Fpages\u002FrouterDirect.js"
   ],
Diff for _buildManifest.module.js
@@ -6,7 +6,7 @@ self.__BUILD_MANIFEST = {
   "/hooks": [
     "static\u002F680ac2d033b0bc870c3a\u002Fpages\u002Fhooks.module.js"
   ],
-  "/link": ["static\u002Fd5a70ed72905d882658f\u002Fpages\u002Flink.module.js"],
+  "/link": ["static\u002Fa9a7a3996ad0d62cb2fd\u002Fpages\u002Flink.module.js"],
   "/routerDirect": [
     "static\u002Ff4884873d5a5d6e895c1\u002Fpages\u002FrouterDirect.module.js"
   ],
Diff for de003c3a9d30..ce095b7e0.js
@@ -239,6 +239,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -726,6 +745,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -760,8 +781,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url: url,
           as: as
Diff for de003c3a9d30..84.module.js
@@ -216,6 +216,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -598,6 +617,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -631,8 +652,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url,
           as
Diff for link.module.js
@@ -65,13 +65,15 @@
     /***/ cTJO: /***/ function(module, exports, __webpack_require__) {
       "use strict";
 
-      var _interopRequireDefault = __webpack_require__("TqRt");
-
       var _interopRequireWildcard = __webpack_require__("284h");
 
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
       exports.__esModule = true;
       exports.default = void 0;
 
+      var _extends2 = _interopRequireDefault(__webpack_require__("pVnL"));
+
       var _react = _interopRequireWildcard(__webpack_require__("q1tI"));
 
       var _url = __webpack_require__("QmWs");
@@ -82,6 +84,8 @@
 
       var _router2 = __webpack_require__("elyg");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function isLocal(href) {
         var url = (0, _url.parse)(href, false, true);
         var origin = (0, _url.parse)(
@@ -112,10 +116,30 @@
         };
       }
 
+      function formatTrailingSlash(url) {
+        return (0, _extends2.default)(
+          (0, _extends2.default)({}, url),
+          {},
+          {
+            pathname:
+              url.pathname &&
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(
+                url.pathname,
+                !!false
+              )
+          }
+        );
+      }
+
       function formatUrl(url) {
-        return url && typeof url === "object"
-          ? (0, _utils.formatWithValidation)(url)
-          : url;
+        return (
+          url &&
+          (0, _utils.formatWithValidation)(
+            formatTrailingSlash(
+              typeof url === "object" ? url : (0, _url.parse)(url)
+            )
+          )
+        );
       }
 
       var cachedObserver;
@@ -379,6 +403,32 @@
       var _default = Link;
       exports.default = _default;
 
+      /***/
+    },
+
+    /***/ pVnL: /***/ function(module, exports) {
+      function _extends() {
+        module.exports = _extends =
+          Object.assign ||
+          function(target) {
+            for (var i = 1; i < arguments.length; i++) {
+              var source = arguments[i];
+
+              for (var key in source) {
+                if (Object.prototype.hasOwnProperty.call(source, key)) {
+                  target[key] = source[key];
+                }
+              }
+            }
+
+            return target;
+          };
+
+        return _extends.apply(this, arguments);
+      }
+
+      module.exports = _extends;
+
       /***/
     }
   },
Diff for link.js
@@ -183,13 +183,15 @@
         }
       }
 
-      var _interopRequireDefault = __webpack_require__("TqRt");
-
       var _interopRequireWildcard = __webpack_require__("284h");
 
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
       exports.__esModule = true;
       exports["default"] = void 0;
 
+      var _extends2 = _interopRequireDefault(__webpack_require__("pVnL"));
+
       var _react = _interopRequireWildcard(__webpack_require__("q1tI"));
 
       var _url = __webpack_require__("QmWs");
@@ -200,6 +202,8 @@
 
       var _router2 = __webpack_require__("elyg");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function isLocal(href) {
         var url = (0, _url.parse)(href, false, true);
         var origin = (0, _url.parse)(
@@ -230,10 +234,30 @@
         };
       }
 
+      function formatTrailingSlash(url) {
+        return (0, _extends2["default"])(
+          (0, _extends2["default"])({}, url),
+          {},
+          {
+            pathname:
+              url.pathname &&
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(
+                url.pathname,
+                !!false
+              )
+          }
+        );
+      }
+
       function formatUrl(url) {
-        return url && typeof url === "object"
-          ? (0, _utils.formatWithValidation)(url)
-          : url;
+        return (
+          url &&
+          (0, _utils.formatWithValidation)(
+            formatTrailingSlash(
+              typeof url === "object" ? url : (0, _url.parse)(url)
+            )
+          )
+        );
       }
 
       var cachedObserver;
@@ -551,6 +575,32 @@
       var _default = Link;
       exports["default"] = _default;
 
+      /***/
+    },
+
+    /***/ pVnL: /***/ function(module, exports) {
+      function _extends() {
+        module.exports = _extends =
+          Object.assign ||
+          function(target) {
+            for (var i = 1; i < arguments.length; i++) {
+              var source = arguments[i];
+
+              for (var key in source) {
+                if (Object.prototype.hasOwnProperty.call(source, key)) {
+                  target[key] = source[key];
+                }
+              }
+            }
+
+            return target;
+          };
+
+        return _extends.apply(this, arguments);
+      }
+
+      module.exports = _extends;
+
       /***/
     }
   },
Diff for index.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.5a995b3d16da54ca817d.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.c055dea44cbce095b7e0.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.af7d5c5f7307e8bb510c.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.5a995b3d16da54ca817d.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.5a995b3d16da54ca817d.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -36,7 +36,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/d5a70ed72905d882658f/pages/link.module.js"
+      href="/_next/static/a9a7a3996ad0d62cb2fd/pages/link.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -122,13 +122,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.c055dea44cbce095b7e0.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.af7d5c5f7307e8bb510c.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.5a995b3d16da54ca817d.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -146,13 +146,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/e826d21ad4f09aa9e68e/pages/link.js"
+      src="/_next/static/8b761fc6c799fd929630/pages/link.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/d5a70ed72905d882658f/pages/link.module.js"
+      src="/_next/static/a9a7a3996ad0d62cb2fd/pages/link.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.5a995b3d16da54ca817d.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.c055dea44cbce095b7e0.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.af7d5c5f7307e8bb510c.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.5a995b3d16da54ca817d.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 10.8s 11.3s ⚠️ +507ms
nodeModulesSize 67 MB 67 MB ⚠️ +4.49 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..4dd5.js gzip 10.5 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
de003c3a9d30..d094.js gzip N/A 10.6 kB N/A
Overall change 56.9 kB 57 kB ⚠️ +78 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.6 kB 5.6 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 7 kB N/A
Overall change 52.4 kB 52.5 kB ⚠️ +76 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.22 kB ⚠️ +169 B
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 8.51 kB ⚠️ +169 B
Client Pages Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB 1.71 kB ⚠️ +193 B
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 5.69 kB ⚠️ +193 B
Client Build Manifests
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 270 B 271 B ⚠️ +1 B
_buildManife..dule.js gzip 274 B 273 B -1 B
Overall change 544 B 544 B
Serverless bundles Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
_error.js 875 kB 875 kB ⚠️ +143 B
404.html 4.17 kB 4.17 kB
hooks.html 3.79 kB 3.79 kB
index.js 875 kB 875 kB ⚠️ +143 B
link.js 914 kB 915 kB ⚠️ +1.63 kB
routerDirect.js 906 kB 907 kB ⚠️ +753 B
withRouter.js 906 kB 907 kB ⚠️ +753 B
Overall change 4.48 MB 4.49 MB ⚠️ +3.42 kB

@ijjk
Copy link
Member

ijjk commented Jun 22, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.3s 12.1s -144ms
nodeModulesSize 67.1 MB 67.1 MB ⚠️ +4.45 kB
Page Load Tests Overall increase ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.153 2.102 -0.05
/ avg req/sec 1160.95 1189.13 ⚠️ +28.18
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.224 1.239 ⚠️ +0.02
/error-in-render avg req/sec 2041.95 2017.15 -24.8
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.52 kB 6.52 kB
webpack-HASH.js gzip 746 B 746 B
19b7e98f51cc..62e5.js gzip 10.6 kB 10.6 kB ⚠️ +73 B
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57 kB ⚠️ +73 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.61 kB 5.61 kB
webpack-HASH..dule.js gzip 746 B 746 B
19b7e98f51cc..dule.js gzip 6.93 kB 7.01 kB ⚠️ +73 B
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.4 kB 52.5 kB ⚠️ +73 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Build Manifests Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 267 B 266 B -1 B
_buildManife..dule.js gzip 272 B 272 B
Overall change 539 B 538 B -1 B
Rendered Page Sizes Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 956 B 955 B -1 B
link.html gzip 962 B 961 B -1 B
withRouter.html gzip 946 B 947 B ⚠️ +1 B
Overall change 2.86 kB 2.86 kB -1 B

Diffs

Diff for _buildManifest.js
@@ -2,7 +2,7 @@ self.__BUILD_MANIFEST = {
   "/": ["static\u002Fpages\u002Findex-11fe542e59ffe08b9c17.js"],
   "/_error": ["static\u002Fpages\u002F_error-3b4c50655cec434681df.js"],
   "/hooks": ["static\u002Fpages\u002Fhooks-4bc500c4cb1edb297db7.js"],
-  "/link": ["static\u002Fpages\u002Flink-e03b00bf99fc4142d3b8.js"],
+  "/link": ["static\u002Fpages\u002Flink-c9a1ace6466cff976cc5.js"],
   "/routerDirect": [
     "static\u002Fpages\u002FrouterDirect-d5190aca2cfed21f89ed.js"
   ],
Diff for _buildManifest.module.js
@@ -2,7 +2,7 @@ self.__BUILD_MANIFEST = {
   "/": ["static\u002Fpages\u002Findex-9af5bb863ea5ea898abb.module.js"],
   "/_error": ["static\u002Fpages\u002F_error-73fdfd5f8b4aa7735f04.module.js"],
   "/hooks": ["static\u002Fpages\u002Fhooks-6506ef7c612d218944dc.module.js"],
-  "/link": ["static\u002Fpages\u002Flink-23662bf1d721600d499b.module.js"],
+  "/link": ["static\u002Fpages\u002Flink-fad4ca04f543ec28b3ec.module.js"],
   "/routerDirect": [
     "static\u002Fpages\u002FrouterDirect-59db351f2f9a8da9cf40.module.js"
   ],
Diff for 19b7e98f51cc..96.module.js
@@ -216,6 +216,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -607,6 +626,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -642,8 +663,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url,
           as
Diff for 19b7e98f51cc..8bf3c44ba.js
@@ -239,6 +239,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -737,6 +756,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -772,8 +793,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url: url,
           as: as
Diff for index.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.38f50e949e1a74742f96.module.js"
+      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.613b0e8259fc167fd0b7.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.45aa21b8a4d8bf3c44ba.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.e4d6859c2a880f88dd4c.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.38f50e949e1a74742f96.module.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.613b0e8259fc167fd0b7.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.38f50e949e1a74742f96.module.js"
+      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.613b0e8259fc167fd0b7.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -36,7 +36,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/pages/link-23662bf1d721600d499b.module.js"
+      href="/_next/static/pages/link-fad4ca04f543ec28b3ec.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -122,13 +122,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.45aa21b8a4d8bf3c44ba.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.e4d6859c2a880f88dd4c.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.38f50e949e1a74742f96.module.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.613b0e8259fc167fd0b7.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -146,13 +146,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/pages/link-e03b00bf99fc4142d3b8.js"
+      src="/_next/static/pages/link-c9a1ace6466cff976cc5.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/pages/link-23662bf1d721600d499b.module.js"
+      src="/_next/static/pages/link-fad4ca04f543ec28b3ec.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.38f50e949e1a74742f96.module.js"
+      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.613b0e8259fc167fd0b7.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.45aa21b8a4d8bf3c44ba.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.e4d6859c2a880f88dd4c.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.38f50e949e1a74742f96.module.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.613b0e8259fc167fd0b7.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 13.1s 12.6s -525ms
nodeModulesSize 67.1 MB 67.1 MB ⚠️ +4.45 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.52 kB 6.52 kB
webpack-HASH.js gzip 746 B 746 B
19b7e98f51cc..62e5.js gzip 10.6 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
19b7e98f51cc..de4f.js gzip N/A 10.6 kB N/A
Overall change 57 kB 57 kB ⚠️ +73 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.61 kB 5.61 kB
webpack-HASH..dule.js gzip 746 B 746 B
19b7e98f51cc..dule.js gzip 6.93 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
19b7e98f51cc..dule.js gzip N/A 7.01 kB N/A
Overall change 52.4 kB 52.5 kB ⚠️ +73 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Build Manifests Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 267 B 266 B -1 B
_buildManife..dule.js gzip 272 B 272 B
Overall change 539 B 538 B -1 B
Serverless bundles Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
_error.js 875 kB 875 kB ⚠️ +143 B
404.html 4.17 kB 4.17 kB
hooks.html 3.79 kB 3.79 kB
index.js 875 kB 875 kB ⚠️ +143 B
link.js 914 kB 915 kB ⚠️ +1.03 kB
routerDirect.js 906 kB 907 kB ⚠️ +753 B
withRouter.js 906 kB 907 kB ⚠️ +753 B
Overall change 4.48 MB 4.49 MB ⚠️ +2.83 kB
Commit: 3597a69

…-slashes

# Conflicts:
#	packages/next/next-server/lib/router/router.ts
#	packages/next/next-server/server/next-server.ts
timneutkens
timneutkens previously approved these changes Jun 23, 2020
@ijjk
Copy link
Member

ijjk commented Jun 23, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 12.2s 12.4s ⚠️ +213ms
nodeModulesSize 67.1 MB 67.1 MB ⚠️ +4.45 kB
Page Load Tests Overall increase ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
/ failed reqs 0 0
/ total time (seconds) 2.057 1.985 -0.07
/ avg req/sec 1215.48 1259.7 ⚠️ +44.22
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.33 1.203 -0.13
/error-in-render avg req/sec 1880.21 2078.47 ⚠️ +198.26
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.49 kB 6.49 kB
webpack-HASH.js gzip 746 B 746 B
19b7e98f51cc..bcce.js gzip 10.6 kB 10.7 kB ⚠️ +66 B
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 57 kB 57.1 kB ⚠️ +66 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.57 kB 5.57 kB
webpack-HASH..dule.js gzip 746 B 746 B
19b7e98f51cc..dule.js gzip 6.99 kB 7.07 kB ⚠️ +77 B
framework.HA..dule.js gzip 39.1 kB 39.1 kB
Overall change 52.4 kB 52.5 kB ⚠️ +77 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Build Manifests Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 267 B 266 B -1 B
_buildManife..dule.js gzip 272 B 272 B
Overall change 539 B 538 B -1 B
Rendered Page Sizes Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
index.html gzip 953 B 954 B ⚠️ +1 B
link.html gzip 957 B 961 B ⚠️ +4 B
withRouter.html gzip 945 B 946 B ⚠️ +1 B
Overall change 2.85 kB 2.86 kB ⚠️ +6 B

Diffs

Diff for _buildManifest.js
@@ -2,7 +2,7 @@ self.__BUILD_MANIFEST = {
   "/": ["static\u002Fpages\u002Findex-11fe542e59ffe08b9c17.js"],
   "/_error": ["static\u002Fpages\u002F_error-3b4c50655cec434681df.js"],
   "/hooks": ["static\u002Fpages\u002Fhooks-4bc500c4cb1edb297db7.js"],
-  "/link": ["static\u002Fpages\u002Flink-e03b00bf99fc4142d3b8.js"],
+  "/link": ["static\u002Fpages\u002Flink-c9a1ace6466cff976cc5.js"],
   "/routerDirect": [
     "static\u002Fpages\u002FrouterDirect-d5190aca2cfed21f89ed.js"
   ],
Diff for _buildManifest.module.js
@@ -2,7 +2,7 @@ self.__BUILD_MANIFEST = {
   "/": ["static\u002Fpages\u002Findex-9af5bb863ea5ea898abb.module.js"],
   "/_error": ["static\u002Fpages\u002F_error-73fdfd5f8b4aa7735f04.module.js"],
   "/hooks": ["static\u002Fpages\u002Fhooks-6506ef7c612d218944dc.module.js"],
-  "/link": ["static\u002Fpages\u002Flink-23662bf1d721600d499b.module.js"],
+  "/link": ["static\u002Fpages\u002Flink-fad4ca04f543ec28b3ec.module.js"],
   "/routerDirect": [
     "static\u002Fpages\u002FrouterDirect-59db351f2f9a8da9cf40.module.js"
   ],
Diff for 19b7e98f51cc..78a1ad7fa.js
@@ -263,6 +263,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -761,6 +780,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       var _getAssetPathFromRoute = _interopRequireDefault(
         __webpack_require__("Lab5")
       );
@@ -799,8 +820,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url: url,
           as: as
Diff for 19b7e98f51cc..bd.module.js
@@ -240,6 +240,25 @@
       /***/
     },
 
+    /***/ NkFK: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.normalizeTrailingSlash = normalizeTrailingSlash;
+
+      function normalizeTrailingSlash(path, requireSlash) {
+        if (path === "/") {
+          return path;
+        } else if (path.endsWith("/")) {
+          return requireSlash ? path : path.slice(0, -1);
+        } else {
+          return requireSlash ? path + "/" : path;
+        }
+      }
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -631,6 +650,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
+      var _normalizeTrailingSlash = __webpack_require__("NkFK");
+
       var _getAssetPathFromRoute = _interopRequireDefault(
         __webpack_require__("Lab5")
       );
@@ -669,8 +690,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         url =
           typeof url === "object" ? (0, _utils.formatWithValidation)(url) : url;
         as = typeof as === "object" ? (0, _utils.formatWithValidation)(as) : as;
-        url = addBasePath(url);
-        as = as ? addBasePath(as) : as;
+        url = addBasePath(
+          (0, _normalizeTrailingSlash.normalizeTrailingSlash)(url, !!false)
+        );
+        as = as
+          ? addBasePath(
+              (0, _normalizeTrailingSlash.normalizeTrailingSlash)(as, !!false)
+            )
+          : as;
         return {
           url,
           as
Diff for index.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.a305f69ab07958bac8bd.module.js"
+      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.49eb0f00d05cbc3d1aae.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.3bf88d6a54d78a1ad7fa.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.84ae27d08f82341fc613.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.a305f69ab07958bac8bd.module.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.49eb0f00d05cbc3d1aae.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.a305f69ab07958bac8bd.module.js"
+      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.49eb0f00d05cbc3d1aae.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -36,7 +36,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/pages/link-23662bf1d721600d499b.module.js"
+      href="/_next/static/pages/link-fad4ca04f543ec28b3ec.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -122,13 +122,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.3bf88d6a54d78a1ad7fa.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.84ae27d08f82341fc613.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.a305f69ab07958bac8bd.module.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.49eb0f00d05cbc3d1aae.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -146,13 +146,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/pages/link-e03b00bf99fc4142d3b8.js"
+      src="/_next/static/pages/link-c9a1ace6466cff976cc5.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/pages/link-23662bf1d721600d499b.module.js"
+      src="/_next/static/pages/link-fad4ca04f543ec28b3ec.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.a305f69ab07958bac8bd.module.js"
+      href="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.49eb0f00d05cbc3d1aae.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.3bf88d6a54d78a1ad7fa.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.84ae27d08f82341fc613.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.a305f69ab07958bac8bd.module.js"
+      src="/_next/static/chunks/19b7e98f51cc0d86c45d01159bbbfb942bfe49b8.49eb0f00d05cbc3d1aae.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
buildDuration 13.1s 13.4s ⚠️ +331ms
nodeModulesSize 67.1 MB 67.1 MB ⚠️ +4.45 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.js gzip 6.49 kB 6.49 kB
webpack-HASH.js gzip 746 B 746 B
19b7e98f51cc..bcce.js gzip 10.6 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
19b7e98f51cc..14a7.js gzip N/A 10.7 kB N/A
Overall change 57 kB 57.1 kB ⚠️ +66 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
main-HASH.module.js gzip 5.57 kB 5.57 kB
webpack-HASH..dule.js gzip 746 B 746 B
19b7e98f51cc..dule.js gzip 6.99 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
19b7e98f51cc..dule.js gzip N/A 7.07 kB N/A
Overall change 52.4 kB 52.5 kB ⚠️ +77 B
Legacy Client Bundles (polyfills)
vercel/next.js canary Janpot/next.js trailing-slashes Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Build Manifests Overall decrease ✓
vercel/next.js canary Janpot/next.js trailing-slashes Change
_buildManifest.js gzip 267 B 266 B -1 B
_buildManife..dule.js gzip 272 B 272 B
Overall change 539 B 538 B -1 B
Serverless bundles Overall increase ⚠️
vercel/next.js canary Janpot/next.js trailing-slashes Change
_error.js 875 kB 875 kB ⚠️ +143 B
404.html 4.17 kB 4.17 kB
hooks.html 3.79 kB 3.79 kB
index.js 875 kB 875 kB ⚠️ +143 B
link.js 915 kB 916 kB ⚠️ +1.03 kB
routerDirect.js 907 kB 908 kB ⚠️ +753 B
withRouter.js 907 kB 908 kB ⚠️ +753 B
Overall change 4.49 MB 4.49 MB ⚠️ +2.83 kB
Commit: 4d71df7

@timneutkens timneutkens merged commit 2142b76 into vercel:canary Jun 23, 2020
@Janpot Janpot deleted the trailing-slashes branch June 23, 2020 12:18
rokinsky pushed a commit to rokinsky/next.js that referenced this pull request Jul 11, 2020
Discovered while doing vercel#13333. `#` or `?` used to be stripped if there wasn't a value behind
rokinsky pushed a commit to rokinsky/next.js that referenced this pull request Jul 11, 2020
)

Extracted from vercel#13333, the same exact code lives in that PR as well, but we can merge this separately if it makes reviewing vercel#13333 easier

This PR does 3 things 
- deduplicate code from build and next-dev-server that loads custom routes from next.config.js  (`loadCustomRoutes`)
- in `loadCustomRoutes`, load these rewrites, headers and redirects configs concurrently instead of sequentially.
- in next-server, make `this.customRoutes` always defined, this allows us to remove the big `if` around its initialization code in `generateRoutes`, which in turn makes it possible to reuse this code for other routing than user defined routes, which is how vercel#13333 adds its redirects.
rokinsky pushed a commit to rokinsky/next.js that referenced this pull request Jul 11, 2020
Co-authored-by: Joe Haddad <joe.haddad@zeit.co>
Co-authored-by: Tim Neutkens <timneutkens@me.com>
@vercel vercel locked as resolved and limited conversation to collaborators Jan 30, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
5 participants