Skip to content

Conversation

@huozhi
Copy link
Member

@huozhi huozhi commented Jun 24, 2021

Fixes #6973
Closes: #21217

Bug

  • Related issues linked using fixes #number
  • Integration tests added

Description

trying to display a fallback error page when there's error occurs in custom _error page on client side, to avoid infinite rerender with next internal _error page

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@huozhi huozhi marked this pull request as ready for review June 24, 2021 13:11
@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@huozhi huozhi marked this pull request as draft June 24, 2021 17:36
@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@huozhi huozhi marked this pull request as ready for review June 24, 2021 18:22
@ijjk

This comment has been minimized.

@huozhi huozhi marked this pull request as draft June 25, 2021 15:46
@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@huozhi huozhi marked this pull request as ready for review June 29, 2021 18:54
@huozhi huozhi requested a review from timneutkens June 29, 2021 18:54
@huozhi huozhi requested review from padmaia and styfle as code owners July 1, 2021 08:48
@ijjk ijjk added the created-by: Next.js team PRs by the Next.js team. label Jul 1, 2021
@ijjk

This comment has been minimized.

@ijjk
Copy link
Member

ijjk commented Jul 1, 2021

Failing test suites

Commit: 1cbf9c4

test/integration/font-optimization/test/index.test.js

  • Font Optimization > with-google > Font optimization for SSR apps > should minify the css
  • Font Optimization > with-google > Font optimization for emulated serverless apps > should minify the css
  • Font Optimization > with-google > Font optimization for serverless apps > should minify the css
Expand output

● Font Optimization › with-google › Font optimization for SSR apps › should minify the css

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

- Expected  - 1
+ Received  + 1

  Object {
    "https://fonts.googleapis.com/css2?family=Modak": "@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEsnME.woff) format('woff')}@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEskMB-hR77LKVTy8.woff2) format('woff2');unicode-range:U+0900-097F,U+1CD0-1CF6,U+1CF8-1CF9,U+200C-200D,U+20A8,U+20B9,U+25CC,U+A830-A839,U+A8E0-A8FB}@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEskMO-hR77LKVTy8.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEskMA-hR77LKV.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
    "https://fonts.googleapis.com/css2?family=Roboto:wght@400;700;900&display=swap": "@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Me5g.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlvAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtvAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
    "https://fonts.googleapis.com/css2?family=Roboto:wght@700": "@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlvAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
-   "https://fonts.googleapis.com/css?family=Voces": "@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v12/-F6_fjJyLyU8d7PGDmk.woff) format('woff')}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v12/-F6_fjJyLyU8d7PIDm_6pClI_ik.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v12/-F6_fjJyLyU8d7PGDm_6pClI.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
+   "https://fonts.googleapis.com/css?family=Voces": "@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v15/-F6_fjJyLyU8d7PGDmk.woff) format('woff')}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v15/-F6_fjJyLyU8d7PIDm_6pClI_ik.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v15/-F6_fjJyLyU8d7PGDm_6pClI.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
  }

  220 |           })
  221 |
> 222 |           expect(testCss).toStrictEqual(snapshotCss)
      |                           ^
  223 |         })
  224 |
  225 |         // Re-run build to check if it works when build is cached

  at Object.<anonymous> (integration/font-optimization/test/index.test.js:222:27)

● Font Optimization › with-google › Font optimization for serverless apps › should minify the css

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

- Expected  - 1
+ Received  + 1

  Object {
    "https://fonts.googleapis.com/css2?family=Modak": "@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEsnME.woff) format('woff')}@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEskMB-hR77LKVTy8.woff2) format('woff2');unicode-range:U+0900-097F,U+1CD0-1CF6,U+1CF8-1CF9,U+200C-200D,U+20A8,U+20B9,U+25CC,U+A830-A839,U+A8E0-A8FB}@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEskMO-hR77LKVTy8.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEskMA-hR77LKV.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
    "https://fonts.googleapis.com/css2?family=Roboto:wght@400;700;900&display=swap": "@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Me5g.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlvAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtvAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
    "https://fonts.googleapis.com/css2?family=Roboto:wght@700": "@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlvAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
-   "https://fonts.googleapis.com/css?family=Voces": "@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v12/-F6_fjJyLyU8d7PGDmk.woff) format('woff')}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v12/-F6_fjJyLyU8d7PIDm_6pClI_ik.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v12/-F6_fjJyLyU8d7PGDm_6pClI.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
+   "https://fonts.googleapis.com/css?family=Voces": "@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v15/-F6_fjJyLyU8d7PGDmk.woff) format('woff')}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v15/-F6_fjJyLyU8d7PIDm_6pClI_ik.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v15/-F6_fjJyLyU8d7PGDm_6pClI.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
  }

  220 |           })
  221 |
> 222 |           expect(testCss).toStrictEqual(snapshotCss)
      |                           ^
  223 |         })
  224 |
  225 |         // Re-run build to check if it works when build is cached

  at Object.<anonymous> (integration/font-optimization/test/index.test.js:222:27)

● Font Optimization › with-google › Font optimization for emulated serverless apps › should minify the css

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

- Expected  - 1
+ Received  + 1

  Object {
    "https://fonts.googleapis.com/css2?family=Modak": "@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEsnME.woff) format('woff')}@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEskMB-hR77LKVTy8.woff2) format('woff2');unicode-range:U+0900-097F,U+1CD0-1CF6,U+1CF8-1CF9,U+200C-200D,U+20A8,U+20B9,U+25CC,U+A830-A839,U+A8E0-A8FB}@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEskMO-hR77LKVTy8.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Modak';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/modak/v8/EJRYQgs1XtIEskMA-hR77LKV.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
    "https://fonts.googleapis.com/css2?family=Roboto:wght@400;700;900&display=swap": "@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Me5g.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlvAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtvAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmYUtfBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
    "https://fonts.googleapis.com/css2?family=Roboto:wght@700": "@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlvAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/roboto/v27/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
-   "https://fonts.googleapis.com/css?family=Voces": "@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v12/-F6_fjJyLyU8d7PGDmk.woff) format('woff')}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v12/-F6_fjJyLyU8d7PIDm_6pClI_ik.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v12/-F6_fjJyLyU8d7PGDm_6pClI.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
+   "https://fonts.googleapis.com/css?family=Voces": "@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v15/-F6_fjJyLyU8d7PGDmk.woff) format('woff')}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v15/-F6_fjJyLyU8d7PIDm_6pClI_ik.woff2) format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Voces';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/voces/v15/-F6_fjJyLyU8d7PGDm_6pClI.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}",
  }

  220 |           })
  221 |
> 222 |           expect(testCss).toStrictEqual(snapshotCss)
      |                           ^
  223 |         })
  224 |
  225 |         // Re-run build to check if it works when build is cached

  at Object.<anonymous> (integration/font-optimization/test/index.test.js:222:27)

@ijjk
Copy link
Member

ijjk commented Jul 1, 2021

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js fix/error-loop Change
buildDuration 12.9s 13.6s ⚠️ +635ms
buildDurationCached 3.3s 3.4s ⚠️ +111ms
nodeModulesSize 49.3 MB 49.3 MB ⚠️ +871 B
Page Load Tests Overall decrease ⚠️
vercel/next.js canary vercel/next.js fix/error-loop Change
/ failed reqs 0 0
/ total time (seconds) 2.346 2.359 ⚠️ +0.01
/ avg req/sec 1065.83 1059.94 ⚠️ -5.89
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.295 1.382 ⚠️ +0.09
/error-in-render avg req/sec 1930.13 1808.83 ⚠️ -121.3
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary vercel/next.js fix/error-loop Change
framework-HASH.js gzip 42 kB 42 kB
main-HASH.js gzip 20.2 kB 20.2 kB ⚠️ +76 B
webpack-HASH.js gzip 810 B 1.49 kB ⚠️ +684 B
359.HASH.js gzip N/A 3.09 kB N/A
Overall change 63 kB 66.9 kB ⚠️ +3.85 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js fix/error-loop Change
polyfills-HASH.js gzip 31.1 kB 31.1 kB
Overall change 31.1 kB 31.1 kB
Client Pages Overall increase ⚠️
vercel/next.js canary vercel/next.js fix/error-loop Change
_app-HASH.js gzip 803 B 803 B
_error-HASH.js gzip 3.17 kB 3.18 kB ⚠️ +3 B
amp-HASH.js gzip 526 B 526 B
css-HASH.js gzip 329 B 329 B
hooks-HASH.js gzip 903 B 903 B
index-HASH.js gzip 263 B 263 B
link-HASH.js gzip 1.65 kB 1.65 kB
routerDirect..HASH.js gzip 322 B 322 B
withRouter-HASH.js gzip 320 B 320 B
bb14e60e810b..30f.css gzip 125 B 125 B
Overall change 8.42 kB 8.42 kB ⚠️ +3 B
Client Build Manifests Overall decrease ✓
vercel/next.js canary vercel/next.js fix/error-loop Change
_buildManifest.js gzip 391 B 390 B -1 B
Overall change 391 B 390 B -1 B
Rendered Page Sizes Overall decrease ✓
vercel/next.js canary vercel/next.js fix/error-loop Change
index.html gzip 525 B 522 B -3 B
link.html gzip 537 B 535 B -2 B
withRouter.html gzip 516 B 515 B -1 B
Overall change 1.58 kB 1.57 kB -6 B

Diffs

Diff for _buildManifest.js
@@ -2,7 +2,7 @@ self.__BUILD_MANIFEST = {
   __rewrites: { beforeFiles: [], afterFiles: [], fallback: [] },
   "/": ["static\u002Fchunks\u002Fpages\u002Findex-96d821e908dd023681e4.js"],
   "/_error": [
-    "static\u002Fchunks\u002Fpages\u002F_error-c606d3b8579a00983b58.js"
+    "static\u002Fchunks\u002Fpages\u002F_error-3cd003e3c07a727d48b6.js"
   ],
   "/amp": ["static\u002Fchunks\u002Fpages\u002Famp-99a85859b8a93cc45609.js"],
   "/css": [
Diff for _error-HASH.js
@@ -1,5 +1,5 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
-  [820],
+  [820, 359],
   {
     /***/ 3646: /***/ function(
       module,
Diff for 359.HASH.js
@@ -0,0 +1,846 @@
+(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
+  [359],
+  {
+    /***/ 3646: /***/ function(
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) {
+      var arrayLikeToArray = __webpack_require__(7228);
+
+      function _arrayWithoutHoles(arr) {
+        if (Array.isArray(arr)) return arrayLikeToArray(arr);
+      }
+
+      module.exports = _arrayWithoutHoles;
+
+      /***/
+    },
+
+    /***/ 9713: /***/ function(module) {
+      function _defineProperty(obj, key, value) {
+        if (key in obj) {
+          Object.defineProperty(obj, key, {
+            value: value,
+            enumerable: true,
+            configurable: true,
+            writable: true
+          });
+        } else {
+          obj[key] = value;
+        }
+
+        return obj;
+      }
+
+      module.exports = _defineProperty;
+
+      /***/
+    },
+
+    /***/ 6860: /***/ function(module) {
+      function _iterableToArray(iter) {
+        if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter))
+          return Array.from(iter);
+      }
+
+      module.exports = _iterableToArray;
+
+      /***/
+    },
+
+    /***/ 8206: /***/ function(module) {
+      function _nonIterableSpread() {
+        throw new TypeError(
+          "Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."
+        );
+      }
+
+      module.exports = _nonIterableSpread;
+
+      /***/
+    },
+
+    /***/ 319: /***/ function(
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) {
+      var arrayWithoutHoles = __webpack_require__(3646);
+
+      var iterableToArray = __webpack_require__(6860);
+
+      var unsupportedIterableToArray = __webpack_require__(379);
+
+      var nonIterableSpread = __webpack_require__(8206);
+
+      function _toConsumableArray(arr) {
+        return (
+          arrayWithoutHoles(arr) ||
+          iterableToArray(arr) ||
+          unsupportedIterableToArray(arr) ||
+          nonIterableSpread()
+        );
+      }
+
+      module.exports = _toConsumableArray;
+
+      /***/
+    },
+
+    /***/ 3359: /***/ function(
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) {
+      "use strict";
+
+      var _classCallCheck = __webpack_require__(4575);
+
+      var _createClass = __webpack_require__(3913);
+
+      var _inherits = __webpack_require__(2205);
+
+      var _possibleConstructorReturn = __webpack_require__(8585);
+
+      var _getPrototypeOf = __webpack_require__(9754);
+
+      function _createSuper(Derived) {
+        var hasNativeReflectConstruct = _isNativeReflectConstruct();
+        return function _createSuperInternal() {
+          var Super = _getPrototypeOf(Derived),
+            result;
+          if (hasNativeReflectConstruct) {
+            var NewTarget = _getPrototypeOf(this).constructor;
+            result = Reflect.construct(Super, arguments, NewTarget);
+          } else {
+            result = Super.apply(this, arguments);
+          }
+          return _possibleConstructorReturn(this, result);
+        };
+      }
+
+      function _isNativeReflectConstruct() {
+        if (typeof Reflect === "undefined" || !Reflect.construct) return false;
+        if (Reflect.construct.sham) return false;
+        if (typeof Proxy === "function") return true;
+        try {
+          Date.prototype.toString.call(
+            Reflect.construct(Date, [], function() {})
+          );
+          return true;
+        } catch (e) {
+          return false;
+        }
+      }
+
+      var _interopRequireDefault = __webpack_require__(5318);
+
+      exports.__esModule = true;
+      exports.default = void 0;
+
+      var _react = _interopRequireDefault(__webpack_require__(7294));
+
+      var _head = _interopRequireDefault(__webpack_require__(639));
+
+      var statusCodes = {
+        400: "Bad Request",
+        404: "This page could not be found",
+        405: "Method Not Allowed",
+        500: "Internal Server Error"
+      };
+
+      function _getInitialProps(_ref) {
+        var res = _ref.res,
+          err = _ref.err;
+        var statusCode =
+          res && res.statusCode ? res.statusCode : err ? err.statusCode : 404;
+        return {
+          statusCode: statusCode
+        };
+      }
+      /**
+       * `Error` component used for handling errors.
+       */
+
+      var Error = /*#__PURE__*/ (function(_react$default$Compon) {
+        _inherits(Error, _react$default$Compon);
+
+        var _super = _createSuper(Error);
+
+        function Error() {
+          _classCallCheck(this, Error);
+
+          return _super.apply(this, arguments);
+        }
+
+        _createClass(Error, [
+          {
+            key: "render",
+            value: function render() {
+              var statusCode = this.props.statusCode;
+              var title =
+                this.props.title ||
+                statusCodes[statusCode] ||
+                "An unexpected error has occurred";
+              return /*#__PURE__*/ _react["default"].createElement(
+                "div",
+                {
+                  style: styles.error
+                },
+                /*#__PURE__*/ _react["default"].createElement(
+                  _head["default"],
+                  null,
+                  /*#__PURE__*/ _react["default"].createElement(
+                    "title",
+                    null,
+                    statusCode
+                      ? "".concat(statusCode, ": ").concat(title)
+                      : "Application error: a client-side exception has occurred"
+                  )
+                ),
+                /*#__PURE__*/ _react["default"].createElement(
+                  "div",
+                  null,
+                  /*#__PURE__*/ _react["default"].createElement("style", {
+                    dangerouslySetInnerHTML: {
+                      __html: "body { margin: 0 }"
+                    }
+                  }),
+                  statusCode
+                    ? /*#__PURE__*/ _react["default"].createElement(
+                        "h1",
+                        {
+                          style: styles.h1
+                        },
+                        statusCode
+                      )
+                    : null,
+                  /*#__PURE__*/ _react["default"].createElement(
+                    "div",
+                    {
+                      style: styles.desc
+                    },
+                    /*#__PURE__*/ _react["default"].createElement(
+                      "h2",
+                      {
+                        style: styles.h2
+                      },
+                      this.props.title || statusCode
+                        ? title
+                        : /*#__PURE__*/ _react["default"].createElement(
+                            _react["default"].Fragment,
+                            null,
+                            "Application error: a client-side exception has occurred (",
+                            /*#__PURE__*/ _react["default"].createElement(
+                              "a",
+                              {
+                                href:
+                                  "https://nextjs.org/docs/messages/client-side-exception-occurred"
+                              },
+                              "developer guidance"
+                            ),
+                            ")"
+                          ),
+                      "."
+                    )
+                  )
+                )
+              );
+            }
+          }
+        ]);
+
+        return Error;
+      })(_react["default"].Component);
+
+      exports.default = Error;
+      Error.displayName = "ErrorPage";
+      Error.getInitialProps = _getInitialProps;
+      Error.origGetInitialProps = _getInitialProps;
+      var styles = {
+        error: {
+          color: "#000",
+          background: "#fff",
+          fontFamily:
+            '-apple-system, BlinkMacSystemFont, Roboto, "Segoe UI", "Fira Sans", Avenir, "Helvetica Neue", "Lucida Grande", sans-serif',
+          height: "100vh",
+          textAlign: "center",
+          display: "flex",
+          flexDirection: "column",
+          alignItems: "center",
+          justifyContent: "center"
+        },
+        desc: {
+          display: "inline-block",
+          textAlign: "left",
+          lineHeight: "49px",
+          height: "49px",
+          verticalAlign: "middle"
+        },
+        h1: {
+          display: "inline-block",
+          borderRight: "1px solid rgba(0, 0, 0,.3)",
+          margin: 0,
+          marginRight: "20px",
+          padding: "10px 23px 10px 0",
+          fontSize: "24px",
+          fontWeight: 500,
+          verticalAlign: "top"
+        },
+        h2: {
+          fontSize: "14px",
+          fontWeight: "normal",
+          lineHeight: "inherit",
+          margin: 0,
+          padding: 0
+        }
+      };
+
+      /***/
+    },
+
+    /***/ 6046: /***/ function(
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.AmpStateContext = void 0;
+
+      var _react = _interopRequireDefault(__webpack_require__(7294));
+
+      function _interopRequireDefault(obj) {
+        return obj && obj.__esModule
+          ? obj
+          : {
+              default: obj
+            };
+      }
+
+      var AmpStateContext = /*#__PURE__*/ _react["default"].createContext({});
+
+      exports.AmpStateContext = AmpStateContext;
+
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 3237: /***/ function(
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.isInAmpMode = isInAmpMode;
+      exports.useAmp = useAmp;
+
+      var _react = _interopRequireDefault(__webpack_require__(7294));
+
+      var _ampContext = __webpack_require__(6046);
+
+      function _interopRequireDefault(obj) {
+        return obj && obj.__esModule
+          ? obj
+          : {
+              default: obj
+            };
+      }
+
+      function isInAmpMode() {
+        var _ref =
+            arguments.length > 0 && arguments[0] !== undefined
+              ? arguments[0]
+              : {},
+          _ref$ampFirst = _ref.ampFirst,
+          ampFirst = _ref$ampFirst === void 0 ? false : _ref$ampFirst,
+          _ref$hybrid = _ref.hybrid,
+          hybrid = _ref$hybrid === void 0 ? false : _ref$hybrid,
+          _ref$hasQuery = _ref.hasQuery,
+          hasQuery = _ref$hasQuery === void 0 ? false : _ref$hasQuery;
+
+        return ampFirst || (hybrid && hasQuery);
+      }
+
+      function useAmp() {
+        // Don't assign the context value to a variable to save bytes
+        return isInAmpMode(
+          _react["default"].useContext(_ampContext.AmpStateContext)
+        );
+      }
+
+      /***/
+    },
+
+    /***/ 639: /***/ function(
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) {
+      "use strict";
+
+      var _defineProperty = __webpack_require__(9713);
+
+      function ownKeys(object, enumerableOnly) {
+        var keys = Object.keys(object);
+        if (Object.getOwnPropertySymbols) {
+          var symbols = Object.getOwnPropertySymbols(object);
+          if (enumerableOnly)
+            symbols = symbols.filter(function(sym) {
+              return Object.getOwnPropertyDescriptor(object, sym).enumerable;
+            });
+          keys.push.apply(keys, symbols);
+        }
+        return keys;
+      }
+
+      function _objectSpread(target) {
+        for (var i = 1; i < arguments.length; i++) {
+          var source = arguments[i] != null ? arguments[i] : {};
+          if (i % 2) {
+            ownKeys(Object(source), true).forEach(function(key) {
+              _defineProperty(target, key, source[key]);
+            });
+          } else if (Object.getOwnPropertyDescriptors) {
+            Object.defineProperties(
+              target,
+              Object.getOwnPropertyDescriptors(source)
+            );
+          } else {
+            ownKeys(Object(source)).forEach(function(key) {
+              Object.defineProperty(
+                target,
+                key,
+                Object.getOwnPropertyDescriptor(source, key)
+              );
+            });
+          }
+        }
+        return target;
+      }
+
+      exports.__esModule = true;
+      exports.defaultHead = defaultHead;
+      exports.default = void 0;
+
+      var _react = _interopRequireWildcard(__webpack_require__(7294));
+
+      var _sideEffect = _interopRequireDefault(__webpack_require__(4766));
+
+      var _ampContext = __webpack_require__(6046);
+
+      var _headManagerContext = __webpack_require__(699);
+
+      var _amp = __webpack_require__(3237);
+
+      function _interopRequireDefault(obj) {
+        return obj && obj.__esModule
+          ? obj
+          : {
+              default: obj
+            };
+      }
+
+      function _getRequireWildcardCache() {
+        if (typeof WeakMap !== "function") return null;
+        var cache = new WeakMap();
+
+        _getRequireWildcardCache = function _getRequireWildcardCache() {
+          return cache;
+        };
+
+        return cache;
+      }
+
+      function _interopRequireWildcard(obj) {
+        if (obj && obj.__esModule) {
+          return obj;
+        }
+
+        if (
+          obj === null ||
+          (typeof obj !== "object" && typeof obj !== "function")
+        ) {
+          return {
+            default: obj
+          };
+        }
+
+        var cache = _getRequireWildcardCache();
+
+        if (cache && cache.has(obj)) {
+          return cache.get(obj);
+        }
+
+        var newObj = {};
+        var hasPropertyDescriptor =
+          Object.defineProperty && Object.getOwnPropertyDescriptor;
+
+        for (var key in obj) {
+          if (Object.prototype.hasOwnProperty.call(obj, key)) {
+            var desc = hasPropertyDescriptor
+              ? Object.getOwnPropertyDescriptor(obj, key)
+              : null;
+
+            if (desc && (desc.get || desc.set)) {
+              Object.defineProperty(newObj, key, desc);
+            } else {
+              newObj[key] = obj[key];
+            }
+          }
+        }
+
+        newObj["default"] = obj;
+
+        if (cache) {
+          cache.set(obj, newObj);
+        }
+
+        return newObj;
+      }
+
+      function defaultHead() {
+        var inAmpMode =
+          arguments.length > 0 && arguments[0] !== undefined
+            ? arguments[0]
+            : false;
+        var head = [
+          /*#__PURE__*/ _react["default"].createElement("meta", {
+            charSet: "utf-8"
+          })
+        ];
+
+        if (!inAmpMode) {
+          head.push(
+            /*#__PURE__*/ _react["default"].createElement("meta", {
+              name: "viewport",
+              content: "width=device-width"
+            })
+          );
+        }
+
+        return head;
+      }
+
+      function onlyReactElement(list, child) {
+        // React children can be "string" or "number" in this case we ignore them for backwards compat
+        if (typeof child === "string" || typeof child === "number") {
+          return list;
+        } // Adds support for React.Fragment
+
+        if (child.type === _react["default"].Fragment) {
+          return list.concat(
+            _react["default"].Children.toArray(child.props.children).reduce(
+              function(fragmentList, fragmentChild) {
+                if (
+                  typeof fragmentChild === "string" ||
+                  typeof fragmentChild === "number"
+                ) {
+                  return fragmentList;
+                }
+
+                return fragmentList.concat(fragmentChild);
+              },
+              []
+            )
+          );
+        }
+
+        return list.concat(child);
+      }
+
+      var METATYPES = ["name", "httpEquiv", "charSet", "itemProp"];
+      /*
+returns a function for filtering head child elements
+which shouldn't be duplicated, like <title/>
+Also adds support for deduplicated `key` properties
+*/
+
+      function unique() {
+        var keys = new Set();
+        var tags = new Set();
+        var metaTypes = new Set();
+        var metaCategories = {};
+        return function(h) {
+          var isUnique = true;
+          var hasKey = false;
+
+          if (h.key && typeof h.key !== "number" && h.key.indexOf("$") > 0) {
+            hasKey = true;
+            var key = h.key.slice(h.key.indexOf("$") + 1);
+
+            if (keys.has(key)) {
+              isUnique = false;
+            } else {
+              keys.add(key);
+            }
+          } // eslint-disable-next-line default-case
+
+          switch (h.type) {
+            case "title":
+            case "base":
+              if (tags.has(h.type)) {
+                isUnique = false;
+              } else {
+                tags.add(h.type);
+              }
+
+              break;
+
+            case "meta":
+              for (var i = 0, len = METATYPES.length; i < len; i++) {
+                var metatype = METATYPES[i];
+                if (!h.props.hasOwnProperty(metatype)) continue;
+
+                if (metatype === "charSet") {
+                  if (metaTypes.has(metatype)) {
+                    isUnique = false;
+                  } else {
+                    metaTypes.add(metatype);
+                  }
+                } else {
+                  var category = h.props[metatype];
+                  var categories = metaCategories[metatype] || new Set();
+
+                  if (
+                    (metatype !== "name" || !hasKey) &&
+                    categories.has(category)
+                  ) {
+                    isUnique = false;
+                  } else {
+                    categories.add(category);
+                    metaCategories[metatype] = categories;
+                  }
+                }
+              }
+
+              break;
+          }
+
+          return isUnique;
+        };
+      }
+      /**
+       *
+       * @param headElements List of multiple <Head> instances
+       */
+
+      function reduceComponents(headElements, props) {
+        return headElements
+          .reduce(function(list, headElement) {
+            var headElementChildren = _react["default"].Children.toArray(
+              headElement.props.children
+            );
+
+            return list.concat(headElementChildren);
+          }, [])
+          .reduce(onlyReactElement, [])
+          .reverse()
+          .concat(defaultHead(props.inAmpMode))
+          .filter(unique())
+          .reverse()
+          .map(function(c, i) {
+            var key = c.key || i;
+
+            if (true && !props.inAmpMode) {
+              if (
+                c.type === "link" &&
+                c.props["href"] && // TODO(prateekbh@): Replace this with const from `constants` when the tree shaking works.
+                [
+                  "https://fonts.googleapis.com/css",
+                  "https://use.typekit.net/"
+                ].some(function(url) {
+                  return c.props["href"].startsWith(url);
+                })
+              ) {
+                var newProps = _objectSpread({}, c.props || {});
+
+                newProps["data-href"] = newProps["href"];
+                newProps["href"] = undefined; // Add this attribute to make it easy to identify optimized tags
+
+                newProps["data-optimized-fonts"] = true;
+                return /*#__PURE__*/ _react["default"].cloneElement(
+                  c,
+                  newProps
+                );
+              }
+            }
+
+            return /*#__PURE__*/ _react["default"].cloneElement(c, {
+              key: key
+            });
+          });
+      }
+      /**
+       * This component injects elements to `<head>` of your page.
+       * To avoid duplicated `tags` in `<head>` you can use the `key` property, which will make sure every tag is only rendered once.
+       */
+
+      function Head(_ref) {
+        var children = _ref.children;
+        var ampState = (0, _react.useContext)(_ampContext.AmpStateContext);
+        var headManager = (0, _react.useContext)(
+          _headManagerContext.HeadManagerContext
+        );
+        return /*#__PURE__*/ _react["default"].createElement(
+          _sideEffect["default"],
+          {
+            reduceComponentsToState: reduceComponents,
+            headManager: headManager,
+            inAmpMode: (0, _amp.isInAmpMode)(ampState)
+          },
+          children
+        );
+      }
+
+      var _default = Head;
+      exports.default = _default;
+
+      /***/
+    },
+
+    /***/ 4766: /***/ function(
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) {
+      "use strict";
+
+      var _toConsumableArray = __webpack_require__(319);
+
+      var _classCallCheck = __webpack_require__(4575);
+
+      var _createClass = __webpack_require__(3913);
+
+      var _assertThisInitialized = __webpack_require__(1506);
+
+      var _inherits = __webpack_require__(2205);
+
+      var _possibleConstructorReturn = __webpack_require__(8585);
+
+      var _getPrototypeOf = __webpack_require__(9754);
+
+      function _createSuper(Derived) {
+        var hasNativeReflectConstruct = _isNativeReflectConstruct();
+        return function _createSuperInternal() {
+          var Super = _getPrototypeOf(Derived),
+            result;
+          if (hasNativeReflectConstruct) {
+            var NewTarget = _getPrototypeOf(this).constructor;
+            result = Reflect.construct(Super, arguments, NewTarget);
+          } else {
+            result = Super.apply(this, arguments);
+          }
+          return _possibleConstructorReturn(this, result);
+        };
+      }
+
+      function _isNativeReflectConstruct() {
+        if (typeof Reflect === "undefined" || !Reflect.construct) return false;
+        if (Reflect.construct.sham) return false;
+        if (typeof Proxy === "function") return true;
+        try {
+          Date.prototype.toString.call(
+            Reflect.construct(Date, [], function() {})
+          );
+          return true;
+        } catch (e) {
+          return false;
+        }
+      }
+
+      exports.__esModule = true;
+      exports.default = void 0;
+
+      var _react = __webpack_require__(7294);
+
+      var isServer = false;
+
+      var _default = /*#__PURE__*/ (function(_react$Component) {
+        _inherits(_default, _react$Component);
+
+        var _super = _createSuper(_default);
+
+        function _default(props) {
+          var _this;
+
+          _classCallCheck(this, _default);
+
+          _this = _super.call(this, props);
+          _this._hasHeadManager = void 0;
+
+          _this.emitChange = function() {
+            if (_this._hasHeadManager) {
+              _this.props.headManager.updateHead(
+                _this.props.reduceComponentsToState(
+                  _toConsumableArray(_this.props.headManager.mountedInstances),
+                  _this.props
+                )
+              );
+            }
+          };
+
+          _this._hasHeadManager =
+            _this.props.headManager && _this.props.headManager.mountedInstances;
+
+          if (isServer && _this._hasHeadManager) {
+            _this.props.headManager.mountedInstances.add(
+              _assertThisInitialized(_this)
+            );
+
+            _this.emitChange();
+          }
+
+          return _this;
+        }
+
+        _createClass(_default, [
+          {
+            key: "componentDidMount",
+            value: function componentDidMount() {
+              if (this._hasHeadManager) {
+                this.props.headManager.mountedInstances.add(this);
+              }
+
+              this.emitChange();
+            }
+          },
+          {
+            key: "componentDidUpdate",
+            value: function componentDidUpdate() {
+              this.emitChange();
+            }
+          },
+          {
+            key: "componentWillUnmount",
+            value: function componentWillUnmount() {
+              if (this._hasHeadManager) {
+                this.props.headManager.mountedInstances["delete"](this);
+              }
+
+              this.emitChange();
+            }
+          },
+          {
+            key: "render",
+            value: function render() {
+              return null;
+            }
+          }
+        ]);
+
+        return _default;
+      })(_react.Component);
+
+      exports.default = _default;
+
+      /***/
+    }
+  }
+]);
Diff for main-HASH.js
@@ -1385,40 +1385,65 @@
         } // Make sure we log the error to the console, otherwise users can't track down issues.
 
         console.error(err);
-        return pageLoader.loadPage("/_error").then(function(_ref5) {
-          var ErrorComponent = _ref5.page,
-            styleSheets = _ref5.styleSheets;
-          // In production we do a normal render with the `ErrorComponent` as component.
-          // If we've gotten here upon initial render, we can use the props from the server.
-          // Otherwise, we need to call `getInitialProps` on `App` before mounting.
-          var AppTree = wrapApp(App);
-          var appCtx = {
-            Component: ErrorComponent,
-            AppTree: AppTree,
-            router: router,
-            ctx: {
-              err: err,
-              pathname: page,
-              query: query,
-              asPath: asPath,
-              AppTree: AppTree
-            }
-          };
-          return Promise.resolve(
-            renderErrorProps.props
-              ? renderErrorProps.props
-              : (0, _utils.loadGetInitialProps)(App, appCtx)
-          ).then(function(initProps) {
-            return doRender(
-              (0, _extends2["default"])({}, renderErrorProps, {
+        return pageLoader
+          .loadPage("/_error")
+          .then(function(_ref5) {
+            var ErrorComponent = _ref5.page,
+              styleSheets = _ref5.styleSheets;
+
+            var _lastAppProps;
+
+            return ((_lastAppProps = lastAppProps) == null
+              ? void 0
+              : _lastAppProps.Component) === ErrorComponent
+              ? __webpack_require__
+                  .e(/* import() */ 359)
+                  .then(__webpack_require__.bind(__webpack_require__, 3359))
+                  .then(function(m) {
+                    return {
+                      ErrorComponent: m["default"],
+                      styleSheets: []
+                    };
+                  })
+              : {
+                  ErrorComponent: ErrorComponent,
+                  styleSheets: styleSheets
+                };
+          })
+          .then(function(_ref6) {
+            var ErrorComponent = _ref6.ErrorComponent,
+              styleSheets = _ref6.styleSheets;
+            // In production we do a normal render with the `ErrorComponent` as component.
+            // If we've gotten here upon initial render, we can use the props from the server.
+            // Otherwise, we need to call `getInitialProps` on `App` before mounting.
+            var AppTree = wrapApp(App);
+            var appCtx = {
+              Component: ErrorComponent,
+              AppTree: AppTree,
+              router: router,
+              ctx: {
                 err: err,
-                Component: ErrorComponent,
-                styleSheets: styleSheets,
-                props: initProps
-              })
-            );
+                pathname: page,
+                query: query,
+                asPath: asPath,
+                AppTree: AppTree
+              }
+            };
+            return Promise.resolve(
+              renderErrorProps.props
+                ? renderErrorProps.props
+                : (0, _utils.loadGetInitialProps)(App, appCtx)
+            ).then(function(initProps) {
+              return doRender(
+                (0, _extends2["default"])({}, renderErrorProps, {
+                  err: err,
+                  Component: ErrorComponent,
+                  styleSheets: styleSheets,
+                  props: initProps
+                })
+              );
+            });
           });
-        });
       }
 
       var reactRoot = null; // On initial render a hydrate should always happen
@@ -1511,8 +1536,8 @@
         );
       }
 
-      function AppContainer(_ref6) {
-        var children = _ref6.children;
+      function AppContainer(_ref7) {
+        var children = _ref7.children;
         return /*#__PURE__*/ _react["default"].createElement(
           Container,
           {
@@ -1615,9 +1640,9 @@
           var noscript = document.querySelector("noscript[data-n-css]");
           var nonce =
             noscript == null ? void 0 : noscript.getAttribute("data-n-css");
-          styleSheets.forEach(function(_ref7) {
-            var href = _ref7.href,
-              text = _ref7.text;
+          styleSheets.forEach(function(_ref8) {
+            var href = _ref8.href,
+              text = _ref8.text;
 
             if (!currentHrefs.has(href)) {
               var styleTag = document.createElement("style");
@@ -1670,8 +1695,8 @@
               // This should be an invariant:
               referenceNode
             ) {
-              styleSheets.forEach(function(_ref8) {
-                var href = _ref8.href;
+              styleSheets.forEach(function(_ref9) {
+                var href = _ref9.href;
                 var targetTag = document.querySelector(
                   'style[data-n-href="'.concat(href, '"]')
                 );
@@ -1745,9 +1770,9 @@
         return renderPromise;
       }
 
-      function Root(_ref9) {
-        var callbacks = _ref9.callbacks,
-          children = _ref9.children;
+      function Root(_ref10) {
+        var callbacks = _ref10.callbacks,
+          children = _ref10.children;
 
         // We use `useLayoutEffect` to guarantee the callbacks are executed
         // as soon as React flushes the update
@@ -1780,8 +1805,8 @@
       } // Dummy component that we render as a child of Root so that we can
       // toggle the correct styles before the page is rendered.
 
-      function Head(_ref10) {
-        var callback = _ref10.callback;
+      function Head(_ref11) {
+        var callback = _ref11.callback;
 
         // We use `useLayoutEffect` to guarantee the callback is executed
         // as soon as React flushes the update.
Diff for webpack-HASH.js
@@ -134,6 +134,46 @@
       /******/
     };
     /******/
+  })(); /* webpack/runtime/ensure chunk */
+  /******/
+
+  /******/ /******/ !(function() {
+    /******/ __webpack_require__.f = {}; // This file contains only the entry chunk. // The chunk loading function for additional chunks
+    /******/ /******/ /******/ __webpack_require__.e = function(chunkId) {
+      /******/ return Promise.all(
+        Object.keys(__webpack_require__.f).reduce(function(promises, key) {
+          /******/ __webpack_require__.f[key](chunkId, promises);
+          /******/ return promises;
+          /******/
+        }, [])
+      );
+      /******/
+    };
+    /******/
+  })(); /* webpack/runtime/get javascript chunk filename */
+  /******/
+
+  /******/ /******/ !(function() {
+    /******/ // This function allow to reference async chunks
+    /******/ __webpack_require__.u = function(chunkId) {
+      /******/ // return url for filenames based on template
+      /******/ return (
+        "static/chunks/" + chunkId + "." + "9e8a22bf0eefac79f784" + ".js"
+      );
+      /******/
+    };
+    /******/
+  })(); /* webpack/runtime/get mini-css chunk filename */
+  /******/
+
+  /******/ /******/ !(function() {
+    /******/ // This function allow to reference all chunks
+    /******/ __webpack_require__.miniCssF = function(chunkId) {
+      /******/ // return url for filenames based on template
+      /******/ return "static/css/" + "59de118426c393f58653" + ".css";
+      /******/
+    };
+    /******/
   })(); /* webpack/runtime/global */
   /******/
 
@@ -158,6 +198,81 @@
       return Object.prototype.hasOwnProperty.call(obj, prop);
     };
     /******/
+  })(); /* webpack/runtime/load script */
+  /******/
+
+  /******/ /******/ !(function() {
+    /******/ var inProgress = {};
+    /******/ var dataWebpackPrefix = "_N_E:"; // loadScript function to load a script via script tag
+    /******/ /******/ __webpack_require__.l = function(
+      url,
+      done,
+      key,
+      chunkId
+    ) {
+      /******/ if (inProgress[url]) {
+        inProgress[url].push(done);
+        return;
+      }
+      /******/ var script, needAttach;
+      /******/ if (key !== undefined) {
+        /******/ var scripts = document.getElementsByTagName("script");
+        /******/ for (var i = 0; i < scripts.length; i++) {
+          /******/ var s = scripts[i];
+          /******/ if (
+            s.getAttribute("src") == url ||
+            s.getAttribute("data-webpack") == dataWebpackPrefix + key
+          ) {
+            script = s;
+            break;
+          }
+          /******/
+        }
+        /******/
+      }
+      /******/ if (!script) {
+        /******/ needAttach = true;
+        /******/ script = document.createElement("script");
+        /******/
+
+        /******/ script.charset = "utf-8";
+        /******/ script.timeout = 120;
+        /******/ if (__webpack_require__.nc) {
+          /******/ script.setAttribute("nonce", __webpack_require__.nc);
+          /******/
+        }
+        /******/ script.setAttribute("data-webpack", dataWebpackPrefix + key);
+        /******/ script.src = url;
+        /******/
+      }
+      /******/ inProgress[url] = [done];
+      /******/ var onScriptComplete = function(prev, event) {
+        /******/ // avoid mem leaks in IE.
+        /******/ script.onerror = script.onload = null;
+        /******/ clearTimeout(timeout);
+        /******/ var doneFns = inProgress[url];
+        /******/ delete inProgress[url];
+        /******/ script.parentNode && script.parentNode.removeChild(script);
+        /******/ doneFns &&
+          doneFns.forEach(function(fn) {
+            return fn(event);
+          });
+        /******/ if (prev) return prev(event);
+        /******/
+      };
+      /******/ /******/ var timeout = setTimeout(
+        onScriptComplete.bind(null, undefined, {
+          type: "timeout",
+          target: script
+        }),
+        120000
+      );
+      /******/ script.onerror = onScriptComplete.bind(null, script.onerror);
+      /******/ script.onload = onScriptComplete.bind(null, script.onload);
+      /******/ needAttach && document.head.appendChild(script);
+      /******/
+    };
+    /******/
   })(); /* webpack/runtime/make namespace object */
   /******/
 
@@ -193,10 +308,80 @@
     /******/ var installedChunks = {
       /******/ 272: 0
       /******/
-    }; // no chunk on demand loading // no prefetching // no preloaded // no HMR // no HMR manifest
+    };
     /******/
 
-    /******/ /******/
+    /******/ __webpack_require__.f.j = function(chunkId, promises) {
+      /******/ // JSONP chunk loading for javascript
+      /******/ var installedChunkData = __webpack_require__.o(
+        installedChunks,
+        chunkId
+      )
+        ? installedChunks[chunkId]
+        : undefined;
+      /******/ if (installedChunkData !== 0) {
+        // 0 means "already installed".
+        /******/
+
+        /******/ // a Promise means "currently loading".
+        /******/ if (installedChunkData) {
+          /******/ promises.push(installedChunkData[2]);
+          /******/
+        } else {
+          /******/ if (272 != chunkId) {
+            /******/ // setup Promise in chunk cache
+            /******/ var promise = new Promise(function(resolve, reject) {
+              installedChunkData = installedChunks[chunkId] = [resolve, reject];
+            });
+            /******/ promises.push((installedChunkData[2] = promise)); // start chunk loading
+            /******/
+
+            /******/ /******/ var url =
+              __webpack_require__.p + __webpack_require__.u(chunkId); // create error before stack unwound to get useful stacktrace later
+            /******/ /******/ var error = new Error();
+            /******/ var loadingEnded = function(event) {
+              /******/ if (__webpack_require__.o(installedChunks, chunkId)) {
+                /******/ installedChunkData = installedChunks[chunkId];
+                /******/ if (installedChunkData !== 0)
+                  installedChunks[chunkId] = undefined;
+                /******/ if (installedChunkData) {
+                  /******/ var errorType =
+                    event && (event.type === "load" ? "missing" : event.type);
+                  /******/ var realSrc =
+                    event && event.target && event.target.src;
+                  /******/ error.message =
+                    "Loading chunk " +
+                    chunkId +
+                    " failed.\n(" +
+                    errorType +
+                    ": " +
+                    realSrc +
+                    ")";
+                  /******/ error.name = "ChunkLoadError";
+                  /******/ error.type = errorType;
+                  /******/ error.request = realSrc;
+                  /******/ installedChunkData[1](error);
+                  /******/
+                }
+                /******/
+              }
+              /******/
+            };
+            /******/ __webpack_require__.l(
+              url,
+              loadingEnded,
+              "chunk-" + chunkId,
+              chunkId
+            );
+            /******/
+          } else installedChunks[chunkId] = 0;
+          /******/
+        }
+        /******/
+      }
+      /******/
+    }; // no prefetching // no preloaded // no HMR // no HMR manifest
+    /******/
 
     /******/ /******/
Diff for index.html
@@ -11,7 +11,7 @@
       src="/_next/static/chunks/polyfills-78af6fe89161f65f5762.js"
     ></script>
     <script
-      src="/_next/static/chunks/webpack-c14d70924bc10b27e8cb.js"
+      src="/_next/static/chunks/webpack-42f1545080114fddca9d.js"
       defer=""
     ></script>
     <script
@@ -19,7 +19,7 @@
       defer=""
     ></script>
     <script
-      src="/_next/static/chunks/main-4aac7c58023fe877c9e3.js"
+      src="/_next/static/chunks/main-4e4ce95bcecaac8aab47.js"
       defer=""
     ></script>
     <script
Diff for link.html
@@ -11,7 +11,7 @@
       src="/_next/static/chunks/polyfills-78af6fe89161f65f5762.js"
     ></script>
     <script
-      src="/_next/static/chunks/webpack-c14d70924bc10b27e8cb.js"
+      src="/_next/static/chunks/webpack-42f1545080114fddca9d.js"
       defer=""
     ></script>
     <script
@@ -19,7 +19,7 @@
       defer=""
     ></script>
     <script
-      src="/_next/static/chunks/main-4aac7c58023fe877c9e3.js"
+      src="/_next/static/chunks/main-4e4ce95bcecaac8aab47.js"
       defer=""
     ></script>
     <script
Diff for withRouter.html
@@ -11,7 +11,7 @@
       src="/_next/static/chunks/polyfills-78af6fe89161f65f5762.js"
     ></script>
     <script
-      src="/_next/static/chunks/webpack-c14d70924bc10b27e8cb.js"
+      src="/_next/static/chunks/webpack-42f1545080114fddca9d.js"
       defer=""
     ></script>
     <script
@@ -19,7 +19,7 @@
       defer=""
     ></script>
     <script
-      src="/_next/static/chunks/main-4aac7c58023fe877c9e3.js"
+      src="/_next/static/chunks/main-4e4ce95bcecaac8aab47.js"
       defer=""
     ></script>
     <script

Webpack 4 Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js fix/error-loop Change
buildDuration 11.8s 11.9s ⚠️ +121ms
buildDurationCached 4.9s 4.7s -159ms
nodeModulesSize 49.3 MB 49.3 MB ⚠️ +871 B
Page Load Tests Overall decrease ⚠️
vercel/next.js canary vercel/next.js fix/error-loop Change
/ failed reqs 0 0
/ total time (seconds) 2.441 2.384 -0.06
/ avg req/sec 1024.1 1048.45 +24.35
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.305 1.323 ⚠️ +0.02
/error-in-render avg req/sec 1916 1889.4 ⚠️ -26.6
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary vercel/next.js fix/error-loop Change
677f882d2ed8..HASH.js gzip 13.4 kB 13.4 kB
framework.HASH.js gzip 41.8 kB 41.8 kB
main-HASH.js gzip 7.99 kB 8.07 kB ⚠️ +82 B
webpack-HASH.js gzip 757 B 1.19 kB ⚠️ +434 B
14.HASH.js gzip N/A 3.11 kB N/A
Overall change 63.9 kB 67.5 kB ⚠️ +3.62 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js fix/error-loop Change
polyfills-HASH.js gzip 31.3 kB 31.3 kB
Overall change 31.3 kB 31.3 kB
Client Pages Overall increase ⚠️
vercel/next.js canary vercel/next.js fix/error-loop Change
_app-HASH.js gzip 1.07 kB 1.07 kB
_error-HASH.js gzip 3.83 kB 3.83 kB ⚠️ +3 B
amp-HASH.js gzip 531 B 531 B
css-HASH.js gzip 333 B 333 B
hooks-HASH.js gzip 910 B 910 B
index-HASH.js gzip 227 B 227 B
link-HASH.js gzip 1.64 kB 1.64 kB
routerDirect..HASH.js gzip 295 B 295 B
withRouter-HASH.js gzip 292 B 292 B
e025d2764813..52f.css gzip 125 B 125 B
Overall change 9.26 kB 9.26 kB ⚠️ +3 B
Client Build Manifests Overall decrease ✓
vercel/next.js canary vercel/next.js fix/error-loop Change
_buildManifest.js gzip 422 B 418 B -4 B
Overall change 422 B 418 B -4 B
Rendered Page Sizes Overall decrease ✓
vercel/next.js canary vercel/next.js fix/error-loop Change
index.html gzip 567 B 566 B -1 B
link.html gzip 580 B 579 B -1 B
withRouter.html gzip 561 B 559 B -2 B
Overall change 1.71 kB 1.7 kB -4 B

Diffs

Diff for _buildManifest.js
@@ -2,7 +2,7 @@ self.__BUILD_MANIFEST = {
   __rewrites: { beforeFiles: [], afterFiles: [], fallback: [] },
   "/": ["static\u002Fchunks\u002Fpages\u002Findex-b460df3d63326fbb06a1.js"],
   "/_error": [
-    "static\u002Fchunks\u002Fpages\u002F_error-5225b5d6d91905cc2b11.js"
+    "static\u002Fchunks\u002Fpages\u002F_error-bef1871fd32355e6147b.js"
   ],
   "/amp": ["static\u002Fchunks\u002Fpages\u002Famp-5b1703f6b64f268c0fdc.js"],
   "/css": [
Diff for _error-HASH.js
@@ -1,5 +1,5 @@
 _N_E = (window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([
-  [5],
+  [5, 14],
   {
     /***/ "/a9y": /***/ function(module, exports, __webpack_require__) {
       "use strict";
Diff for 14.HASH.js
@@ -0,0 +1,818 @@
+(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([
+  [14],
+  {
+    /***/ "/a9y": /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      var _classCallCheck = __webpack_require__("lwsE");
+
+      var _createClass = __webpack_require__("W8MJ");
+
+      var _inherits = __webpack_require__("7W2i");
+
+      var _possibleConstructorReturn = __webpack_require__("a1gu");
+
+      var _getPrototypeOf = __webpack_require__("Nsbk");
+
+      function _createSuper(Derived) {
+        var hasNativeReflectConstruct = _isNativeReflectConstruct();
+        return function _createSuperInternal() {
+          var Super = _getPrototypeOf(Derived),
+            result;
+          if (hasNativeReflectConstruct) {
+            var NewTarget = _getPrototypeOf(this).constructor;
+            result = Reflect.construct(Super, arguments, NewTarget);
+          } else {
+            result = Super.apply(this, arguments);
+          }
+          return _possibleConstructorReturn(this, result);
+        };
+      }
+
+      function _isNativeReflectConstruct() {
+        if (typeof Reflect === "undefined" || !Reflect.construct) return false;
+        if (Reflect.construct.sham) return false;
+        if (typeof Proxy === "function") return true;
+        try {
+          Date.prototype.toString.call(
+            Reflect.construct(Date, [], function() {})
+          );
+          return true;
+        } catch (e) {
+          return false;
+        }
+      }
+
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
+      exports.__esModule = true;
+      exports["default"] = void 0;
+
+      var _react = _interopRequireDefault(__webpack_require__("q1tI"));
+
+      var _head = _interopRequireDefault(__webpack_require__("mLbm"));
+
+      var statusCodes = {
+        400: "Bad Request",
+        404: "This page could not be found",
+        405: "Method Not Allowed",
+        500: "Internal Server Error"
+      };
+
+      function _getInitialProps(_ref) {
+        var res = _ref.res,
+          err = _ref.err;
+        var statusCode =
+          res && res.statusCode ? res.statusCode : err ? err.statusCode : 404;
+        return {
+          statusCode: statusCode
+        };
+      }
+      /**
+       * `Error` component used for handling errors.
+       */
+
+      var Error = /*#__PURE__*/ (function(_react$default$Compon) {
+        _inherits(Error, _react$default$Compon);
+
+        var _super = _createSuper(Error);
+
+        function Error() {
+          _classCallCheck(this, Error);
+
+          return _super.apply(this, arguments);
+        }
+
+        _createClass(Error, [
+          {
+            key: "render",
+            value: function render() {
+              var statusCode = this.props.statusCode;
+              var title =
+                this.props.title ||
+                statusCodes[statusCode] ||
+                "An unexpected error has occurred";
+              return /*#__PURE__*/ _react["default"].createElement(
+                "div",
+                {
+                  style: styles.error
+                },
+                /*#__PURE__*/ _react["default"].createElement(
+                  _head["default"],
+                  null,
+                  /*#__PURE__*/ _react["default"].createElement(
+                    "title",
+                    null,
+                    statusCode
+                      ? "".concat(statusCode, ": ").concat(title)
+                      : "Application error: a client-side exception has occurred"
+                  )
+                ),
+                /*#__PURE__*/ _react["default"].createElement(
+                  "div",
+                  null,
+                  /*#__PURE__*/ _react["default"].createElement("style", {
+                    dangerouslySetInnerHTML: {
+                      __html: "body { margin: 0 }"
+                    }
+                  }),
+                  statusCode
+                    ? /*#__PURE__*/ _react["default"].createElement(
+                        "h1",
+                        {
+                          style: styles.h1
+                        },
+                        statusCode
+                      )
+                    : null,
+                  /*#__PURE__*/ _react["default"].createElement(
+                    "div",
+                    {
+                      style: styles.desc
+                    },
+                    /*#__PURE__*/ _react["default"].createElement(
+                      "h2",
+                      {
+                        style: styles.h2
+                      },
+                      this.props.title || statusCode
+                        ? title
+                        : /*#__PURE__*/ _react["default"].createElement(
+                            _react["default"].Fragment,
+                            null,
+                            "Application error: a client-side exception has occurred (",
+                            /*#__PURE__*/ _react["default"].createElement(
+                              "a",
+                              {
+                                href:
+                                  "https://nextjs.org/docs/messages/client-side-exception-occurred"
+                              },
+                              "developer guidance"
+                            ),
+                            ")"
+                          ),
+                      "."
+                    )
+                  )
+                )
+              );
+            }
+          }
+        ]);
+
+        return Error;
+      })(_react["default"].Component);
+
+      exports["default"] = Error;
+      Error.displayName = "ErrorPage";
+      Error.getInitialProps = _getInitialProps;
+      Error.origGetInitialProps = _getInitialProps;
+      var styles = {
+        error: {
+          color: "#000",
+          background: "#fff",
+          fontFamily:
+            '-apple-system, BlinkMacSystemFont, Roboto, "Segoe UI", "Fira Sans", Avenir, "Helvetica Neue", "Lucida Grande", sans-serif',
+          height: "100vh",
+          textAlign: "center",
+          display: "flex",
+          flexDirection: "column",
+          alignItems: "center",
+          justifyContent: "center"
+        },
+        desc: {
+          display: "inline-block",
+          textAlign: "left",
+          lineHeight: "49px",
+          height: "49px",
+          verticalAlign: "middle"
+        },
+        h1: {
+          display: "inline-block",
+          borderRight: "1px solid rgba(0, 0, 0,.3)",
+          margin: 0,
+          marginRight: "20px",
+          padding: "10px 23px 10px 0",
+          fontSize: "24px",
+          fontWeight: 500,
+          verticalAlign: "top"
+        },
+        h2: {
+          fontSize: "14px",
+          fontWeight: "normal",
+          lineHeight: "inherit",
+          margin: 0,
+          padding: 0
+        }
+      };
+
+      /***/
+    },
+
+    /***/ BdAR: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      var _toConsumableArray = __webpack_require__("RIqP");
+
+      var _classCallCheck = __webpack_require__("lwsE");
+
+      var _createClass = __webpack_require__("W8MJ");
+
+      var _assertThisInitialized = __webpack_require__("PJYZ");
+
+      var _inherits = __webpack_require__("7W2i");
+
+      var _possibleConstructorReturn = __webpack_require__("a1gu");
+
+      var _getPrototypeOf = __webpack_require__("Nsbk");
+
+      function _createSuper(Derived) {
+        var hasNativeReflectConstruct = _isNativeReflectConstruct();
+        return function _createSuperInternal() {
+          var Super = _getPrototypeOf(Derived),
+            result;
+          if (hasNativeReflectConstruct) {
+            var NewTarget = _getPrototypeOf(this).constructor;
+            result = Reflect.construct(Super, arguments, NewTarget);
+          } else {
+            result = Super.apply(this, arguments);
+          }
+          return _possibleConstructorReturn(this, result);
+        };
+      }
+
+      function _isNativeReflectConstruct() {
+        if (typeof Reflect === "undefined" || !Reflect.construct) return false;
+        if (Reflect.construct.sham) return false;
+        if (typeof Proxy === "function") return true;
+        try {
+          Date.prototype.toString.call(
+            Reflect.construct(Date, [], function() {})
+          );
+          return true;
+        } catch (e) {
+          return false;
+        }
+      }
+
+      exports.__esModule = true;
+      exports["default"] = void 0;
+
+      var _react = __webpack_require__("q1tI");
+
+      var isServer = false;
+
+      var _default = /*#__PURE__*/ (function(_react$Component) {
+        _inherits(_default, _react$Component);
+
+        var _super = _createSuper(_default);
+
+        function _default(props) {
+          var _this;
+
+          _classCallCheck(this, _default);
+
+          _this = _super.call(this, props);
+          _this._hasHeadManager = void 0;
+
+          _this.emitChange = function() {
+            if (_this._hasHeadManager) {
+              _this.props.headManager.updateHead(
+                _this.props.reduceComponentsToState(
+                  _toConsumableArray(_this.props.headManager.mountedInstances),
+                  _this.props
+                )
+              );
+            }
+          };
+
+          _this._hasHeadManager =
+            _this.props.headManager && _this.props.headManager.mountedInstances;
+
+          if (isServer && _this._hasHeadManager) {
+            _this.props.headManager.mountedInstances.add(
+              _assertThisInitialized(_this)
+            );
+
+            _this.emitChange();
+          }
+
+          return _this;
+        }
+
+        _createClass(_default, [
+          {
+            key: "componentDidMount",
+            value: function componentDidMount() {
+              if (this._hasHeadManager) {
+                this.props.headManager.mountedInstances.add(this);
+              }
+
+              this.emitChange();
+            }
+          },
+          {
+            key: "componentDidUpdate",
+            value: function componentDidUpdate() {
+              this.emitChange();
+            }
+          },
+          {
+            key: "componentWillUnmount",
+            value: function componentWillUnmount() {
+              if (this._hasHeadManager) {
+                this.props.headManager.mountedInstances["delete"](this);
+              }
+
+              this.emitChange();
+            }
+          },
+          {
+            key: "render",
+            value: function render() {
+              return null;
+            }
+          }
+        ]);
+
+        return _default;
+      })(_react.Component);
+
+      exports["default"] = _default;
+
+      /***/
+    },
+
+    /***/ Bnag: /***/ function(module, exports) {
+      function _nonIterableSpread() {
+        throw new TypeError(
+          "Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."
+        );
+      }
+
+      module.exports = _nonIterableSpread;
+
+      /***/
+    },
+
+    /***/ EbDI: /***/ function(module, exports) {
+      function _iterableToArray(iter) {
+        if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter))
+          return Array.from(iter);
+      }
+
+      module.exports = _iterableToArray;
+
+      /***/
+    },
+
+    /***/ Ijbi: /***/ function(module, exports, __webpack_require__) {
+      var arrayLikeToArray = __webpack_require__("WkPL");
+
+      function _arrayWithoutHoles(arr) {
+        if (Array.isArray(arr)) return arrayLikeToArray(arr);
+      }
+
+      module.exports = _arrayWithoutHoles;
+
+      /***/
+    },
+
+    /***/ RIqP: /***/ function(module, exports, __webpack_require__) {
+      var arrayWithoutHoles = __webpack_require__("Ijbi");
+
+      var iterableToArray = __webpack_require__("EbDI");
+
+      var unsupportedIterableToArray = __webpack_require__("ZhPi");
+
+      var nonIterableSpread = __webpack_require__("Bnag");
+
+      function _toConsumableArray(arr) {
+        return (
+          arrayWithoutHoles(arr) ||
+          iterableToArray(arr) ||
+          unsupportedIterableToArray(arr) ||
+          nonIterableSpread()
+        );
+      }
+
+      module.exports = _toConsumableArray;
+
+      /***/
+    },
+
+    /***/ dTAc: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.isInAmpMode = isInAmpMode;
+      exports.useAmp = useAmp;
+
+      var _react = _interopRequireDefault(__webpack_require__("q1tI"));
+
+      var _ampContext = __webpack_require__("r55Z");
+
+      function _interopRequireDefault(obj) {
+        return obj && obj.__esModule
+          ? obj
+          : {
+              default: obj
+            };
+      }
+
+      function isInAmpMode() {
+        var _ref =
+            arguments.length > 0 && arguments[0] !== undefined
+              ? arguments[0]
+              : {},
+          _ref$ampFirst = _ref.ampFirst,
+          ampFirst = _ref$ampFirst === void 0 ? false : _ref$ampFirst,
+          _ref$hybrid = _ref.hybrid,
+          hybrid = _ref$hybrid === void 0 ? false : _ref$hybrid,
+          _ref$hasQuery = _ref.hasQuery,
+          hasQuery = _ref$hasQuery === void 0 ? false : _ref$hasQuery;
+
+        return ampFirst || (hybrid && hasQuery);
+      }
+
+      function useAmp() {
+        // Don't assign the context value to a variable to save bytes
+        return isInAmpMode(
+          _react["default"].useContext(_ampContext.AmpStateContext)
+        );
+      }
+
+      /***/
+    },
+
+    /***/ lSNA: /***/ function(module, exports) {
+      function _defineProperty(obj, key, value) {
+        if (key in obj) {
+          Object.defineProperty(obj, key, {
+            value: value,
+            enumerable: true,
+            configurable: true,
+            writable: true
+          });
+        } else {
+          obj[key] = value;
+        }
+
+        return obj;
+      }
+
+      module.exports = _defineProperty;
+
+      /***/
+    },
+
+    /***/ mLbm: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      var _defineProperty = __webpack_require__("lSNA");
+
+      function ownKeys(object, enumerableOnly) {
+        var keys = Object.keys(object);
+        if (Object.getOwnPropertySymbols) {
+          var symbols = Object.getOwnPropertySymbols(object);
+          if (enumerableOnly)
+            symbols = symbols.filter(function(sym) {
+              return Object.getOwnPropertyDescriptor(object, sym).enumerable;
+            });
+          keys.push.apply(keys, symbols);
+        }
+        return keys;
+      }
+
+      function _objectSpread(target) {
+        for (var i = 1; i < arguments.length; i++) {
+          var source = arguments[i] != null ? arguments[i] : {};
+          if (i % 2) {
+            ownKeys(Object(source), true).forEach(function(key) {
+              _defineProperty(target, key, source[key]);
+            });
+          } else if (Object.getOwnPropertyDescriptors) {
+            Object.defineProperties(
+              target,
+              Object.getOwnPropertyDescriptors(source)
+            );
+          } else {
+            ownKeys(Object(source)).forEach(function(key) {
+              Object.defineProperty(
+                target,
+                key,
+                Object.getOwnPropertyDescriptor(source, key)
+              );
+            });
+          }
+        }
+        return target;
+      }
+
+      exports.__esModule = true;
+      exports.defaultHead = defaultHead;
+      exports["default"] = void 0;
+
+      var _react = _interopRequireWildcard(__webpack_require__("q1tI"));
+
+      var _sideEffect = _interopRequireDefault(__webpack_require__("BdAR"));
+
+      var _ampContext = __webpack_require__("r55Z");
+
+      var _headManagerContext = __webpack_require__("CM2u");
+
+      var _amp = __webpack_require__("dTAc");
+
+      function _interopRequireDefault(obj) {
+        return obj && obj.__esModule
+          ? obj
+          : {
+              default: obj
+            };
+      }
+
+      function _getRequireWildcardCache() {
+        if (typeof WeakMap !== "function") return null;
+        var cache = new WeakMap();
+
+        _getRequireWildcardCache = function _getRequireWildcardCache() {
+          return cache;
+        };
+
+        return cache;
+      }
+
+      function _interopRequireWildcard(obj) {
+        if (obj && obj.__esModule) {
+          return obj;
+        }
+
+        if (
+          obj === null ||
+          (typeof obj !== "object" && typeof obj !== "function")
+        ) {
+          return {
+            default: obj
+          };
+        }
+
+        var cache = _getRequireWildcardCache();
+
+        if (cache && cache.has(obj)) {
+          return cache.get(obj);
+        }
+
+        var newObj = {};
+ 
Post job cleanup.
[command]/usr/bin/git version
git version 2.32.0
[command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
[command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :
[command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
http.https://github.com/.extraheader
[command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader
[command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :
Cleaning up orphan processes
Commit: 722b614c82babbe8c487bd3f3d16fd9991a623de

@timneutkens timneutkens merged commit e89b8e4 into canary Jul 1, 2021
@timneutkens timneutkens deleted the fix/error-loop branch July 1, 2021 11:54
@vercel vercel locked as resolved and limited conversation to collaborators Jan 28, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Endless loop when _error render throws on client side

5 participants