Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Make sure to handle query parsing correctly on client/server #12154

Closed
wants to merge 13 commits into from

Conversation

ijjk
Copy link
Member

@ijjk ijjk commented Apr 23, 2020

This updates to match query parsing behavior between the client and in node following the URLSearchParams spec. After investigation it seems the major browsers are following the spec correctly although node is not.

Closes: #12145
x-ref: nodejs/node#33892
x-ref: web-platform-tests/wpt#24152

Note: ie11 tests are currently failing due to the url-polyfill incorrectly using decodeURIComponent which doesn't match spec for URLSearchParams

@ijjk ijjk added this to the 9.3.6 milestone Apr 23, 2020
@ijjk
Copy link
Member Author

ijjk commented Apr 23, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
buildDuration 9.6s 11.8s ⚠️ +2.3s
nodeModulesSize 55.2 MB 55.2 MB ⚠️ +4.19 kB
Page Load Tests Overall decrease ⚠️
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
/ failed reqs 0 0
/ total time (seconds) 1.613 1.955 ⚠️ +0.34
/ avg req/sec 1549.46 1278.63 -270.83
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 0.842 0.989 ⚠️ +0.15
/error-in-render avg req/sec 2970.57 2528.66 -441.91
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.js gzip 6.25 kB 6.31 kB ⚠️ +61 B
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..45d6.js gzip 10.3 kB N/A N/A
framework.a1..NSE.txt gzip 220 B 220 B
framework.a1..NSE.txt gzip 220 B 220 B
framework.HASH.js gzip 39 kB 39 kB
de003c3a9d30..ed83.js gzip N/A 10.3 kB N/A
Overall change 56.7 kB 56.8 kB ⚠️ +69 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.module.js gzip 4.79 kB 4.85 kB ⚠️ +54 B
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.87 kB N/A N/A
framework.HA..dule.js gzip 39 kB 39 kB
de003c3a9d30..dule.js gzip N/A 6.86 kB N/A
Overall change 51.4 kB 51.5 kB ⚠️ +51 B
Legacy Client Bundles (polyfills)
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
polyfills-HASH.js gzip 26.2 kB 26.2 kB
Overall change 26.2 kB 26.2 kB
Client Pages
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
_app.js gzip 1.23 kB 1.23 kB
_error.js gzip 3.12 kB 3.12 kB
hooks.js gzip 663 B 663 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 280 B 280 B
withRouter.js gzip 278 B 278 B
Overall change 7.85 kB 7.85 kB
Client Pages Modern
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
_app.module.js gzip 598 B 598 B
_error.module.js gzip 2.09 kB 2.09 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 279 B 279 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.37 kB 5.37 kB
Client Build Manifests
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes Overall decrease ✓
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
index.html gzip 929 B 927 B -2 B
link.html gzip 938 B 937 B -1 B
withRouter.html gzip 925 B 925 B
Overall change 2.79 kB 2.79 kB -3 B

Diffs

Diff for de003c3a9d30..e23ef6016.js
@@ -114,11 +114,16 @@ module.exports = _interopRequireWildcard;
 
 /***/ }),
 
-/***/ "4JlD":
+/***/ "HG3D":
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-// Copyright Joyent, Inc. and other Node contributors.
+
+
+exports.__esModule = true;
+exports.encode = encode;
+exports.decode = decode;
+exports.stringify = exports.parse = void 0; // Copyright Joyent, Inc. and other Node contributors.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a
 // copy of this software and associated documentation files (the
@@ -138,10 +143,18 @@ module.exports = _interopRequireWildcard;
 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+// This is a modified version of querystring-es3 to allow passing
+// an option for custom decodeURIComponent logic which matches
+// the built-in node options https://nodejs.org/api/querystring.html#querystring_querystring_parse_str_sep_eq_options
 
+function hasOwnProperty(obj, prop) {
+  return Object.prototype.hasOwnProperty.call(obj, prop);
+}
 
-
-var stringifyPrimitive = function(v) {
+var stringifyPrimitive = function stringifyPrimitive(v) {
   switch (typeof v) {
     case 'string':
       return v;
@@ -157,53 +170,117 @@ var stringifyPrimitive = function(v) {
   }
 };
 
-module.exports = function(obj, sep, eq, name) {
+function encode(obj, sep, eq, name) {
   sep = sep || '&';
   eq = eq || '=';
+
   if (obj === null) {
     obj = undefined;
   }
 
   if (typeof obj === 'object') {
-    return map(objectKeys(obj), function(k) {
+    return map(objectKeys(obj), function (k) {
       var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+
       if (isArray(obj[k])) {
-        return map(obj[k], function(v) {
+        return map(obj[k], function (v) {
           return ks + encodeURIComponent(stringifyPrimitive(v));
         }).join(sep);
       } else {
         return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
       }
     }).join(sep);
-
   }
 
   if (!name) return '';
-  return encodeURIComponent(stringifyPrimitive(name)) + eq +
-         encodeURIComponent(stringifyPrimitive(obj));
-};
+  return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj));
+}
 
 var isArray = Array.isArray || function (xs) {
   return Object.prototype.toString.call(xs) === '[object Array]';
 };
 
-function map (xs, f) {
+function map(xs, f) {
   if (xs.map) return xs.map(f);
   var res = [];
+
   for (var i = 0; i < xs.length; i++) {
     res.push(f(xs[i], i));
   }
+
   return res;
 }
 
 var objectKeys = Object.keys || function (obj) {
   var res = [];
+
   for (var key in obj) {
     if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
   }
+
   return res;
 };
 
+function decode(qs, sep, eq, options) {
+  sep = sep || '&';
+  eq = eq || '=';
+  var obj = {};
+  options = options || {};
+  var decodeComponent = options.decodeURIComponent || decodeURIComponent;
+
+  if (typeof qs !== 'string' || qs.length === 0) {
+    return obj;
+  }
+
+  var regexp = /\+/g;
+  qs = qs.split(sep);
+  var maxKeys = 1000;
+
+  if (options && typeof options.maxKeys === 'number') {
+    maxKeys = options.maxKeys;
+  }
+
+  var len = qs.length; // maxKeys <= 0 means that we should not limit keys count
+
+  if (maxKeys > 0 && len > maxKeys) {
+    len = maxKeys;
+  }
+
+  for (var i = 0; i < len; ++i) {
+    var x = qs[i].replace(regexp, '%20'),
+        idx = x.indexOf(eq),
+        kstr,
+        vstr,
+        k,
+        v;
+
+    if (idx >= 0) {
+      kstr = x.substr(0, idx);
+      vstr = x.substr(idx + 1);
+    } else {
+      kstr = x;
+      vstr = '';
+    }
+
+    k = decodeComponent(kstr);
+    v = decodeComponent(vstr);
+
+    if (!hasOwnProperty(obj, k)) {
+      obj[k] = v;
+    } else if (isArray(obj[k])) {
+      obj[k].push(v);
+    } else {
+      obj[k] = [obj[k], v];
+    }
+  }
+
+  return obj;
+}
+
+var parse = decode;
+exports.parse = parse;
+var stringify = encode;
+exports.stringify = stringify;
 
 /***/ }),
 
@@ -235,7 +312,7 @@ var assign=Object.assign.bind(Object);module.exports=assign;module.exports.defau
 /***/ "QmWs":
 /***/ (function(module, exports, __webpack_require__) {
 
-var e,t=(e=__webpack_require__("s4NR"))&&"object"==typeof e&&"default"in e?e.default:e,r=/https?|ftp|gopher|file/;function o(e){"string"==typeof e&&(e=g(e));var o=function(e,t,r){var o=e.auth,a=e.hostname,s=e.protocol||"",c=e.pathname||"",h=e.hash||"",p=e.query||"",n=!1;o=o?encodeURIComponent(o).replace(/%3A/i,":")+"@":"",e.host?n=o+e.host:a&&(n=o+(~a.indexOf(":")?"["+a+"]":a),e.port&&(n+=":"+e.port)),p&&"object"==typeof p&&(p=t.encode(p));var l=e.search||p&&"?"+p||"";return s&&":"!==s.substr(-1)&&(s+=":"),e.slashes||(!s||r.test(s))&&!1!==n?(n="//"+(n||""),c&&"/"!==c[0]&&(c="/"+c)):n||(n=""),h&&"#"!==h[0]&&(h="#"+h),l&&"?"!==l[0]&&(l="?"+l),{protocol:s,host:n,pathname:c=c.replace(/[?#]/g,encodeURIComponent),search:l=l.replace("#","%23"),hash:h}}(e,t,r);return""+o.protocol+o.host+o.pathname+o.search+o.hash}var a="http://",s="w.w",c=a+s,h=/^([a-z0-9.+-]*:\/\/\/)([a-z0-9.+-]:\/*)?/i,p=/https?|ftp|gopher|file/;function n(e,t){var r="string"==typeof e?g(e):e;e="object"==typeof e?o(e):e;var s=g(t),n="";r.protocol&&!r.slashes&&(n=r.protocol,e=e.replace(r.protocol,""),n+="/"===t[0]||"/"===e[0]?"/":""),n&&s.protocol&&(n="",s.slashes||(n=s.protocol,t=t.replace(s.protocol,"")));var l=e.match(h);l&&!s.protocol&&(e=e.substr((n=l[1]+(l[2]||"")).length),/^\/\/[^/]/.test(t)&&(n=n.slice(0,-1)));var i=new URL(e,c+"/"),f=new URL(t,i).toString().replace(c,""),u=s.protocol||r.protocol;return u+=r.slashes||s.slashes?"//":"",!n&&u?f=f.replace(a,u):n&&(f=f.replace(a,"")),p.test(f)||~t.indexOf(".")||"/"===e.slice(-1)||"/"===t.slice(-1)||"/"!==f.slice(-1)||(f=f.slice(0,-1)),n&&(f=n+("/"===f[0]?f.substr(1):f)),f}function l(){}l.parse=g,l.format=o,l.resolve=n,l.resolveObject=n;var i=/^https?|ftp|gopher|file/,f=/^(.*?)([#?].*)/,u=/^([a-z0-9.+-]*:)(\/{0,3})(.*)/i,m=/^([a-z0-9.+-]*:)?\/\/\/*/i,v=/^([a-z0-9.+-]*:)(\/{0,2})\[(.*)\]$/i;function d(e){try{return decodeURI(e)}catch(t){return e}}function g(e,r,a){if(void 0===r&&(r=!1),void 0===a&&(a=!1),e&&"object"==typeof e&&e instanceof l)return e;var h=(e=e.trim()).match(f);e=h?d(h[1]).replace(/\\/g,"/")+h[2]:d(e).replace(/\\/g,"/"),v.test(e)&&"/"!==e.slice(-1)&&(e+="/");var p=!/(^javascript)/.test(e)&&e.match(u),n=m.test(e),g="";p&&(i.test(p[1])||(g=p[1].toLowerCase(),e=""+p[2]+p[3]),p[2]||(n=!1,i.test(p[1])?(g=p[1],e=""+p[3]):e="//"+p[3]),3!==p[2].length&&1!==p[2].length||(g=p[1],e="/"+p[3]));var b,y=(h?h[1]:e).match(/(:[0-9]+)/),j="";y&&y[1]&&3===y[1].length&&(e=e.replace(j=y[1],j+"00"));var w=new l,x="",U="";try{b=new URL(e)}catch(t){x=t,g||a||!/^\/\//.test(e)||/^\/\/.+[@.]/.test(e)||(U="/",e=e.substr(1));try{b=new URL(e,c)}catch(e){return w.protocol=g,w.href=g,w}}w.slashes=n&&!U,w.host=b.host===s?"":b.host,w.hostname=b.hostname===s?"":b.hostname.replace(/(\[|\])/g,""),w.protocol=x?g||null:b.protocol,w.search=b.search.replace(/\\/g,"%5C"),w.hash=b.hash.replace(/\\/g,"%5C");var R=e.split("#");!w.search&&~R[0].indexOf("?")&&(w.search="?"),w.hash||""!==R[1]||(w.hash="#"),w.query=r?t.decode(b.search.substr(1)):w.search.substr(1),w.pathname=U+d(b.pathname).replace(/"/g,"%22"),"about:"===w.protocol&&"blank"===w.pathname&&(w.protocol="",w.pathname=""),x&&"/"!==e[0]&&(w.pathname=w.pathname.substr(1)),g&&!i.test(g)&&"/"!==e.slice(-1)&&"/"===w.pathname&&(w.pathname=""),w.path=w.pathname+w.search,w.auth=[b.username,b.password].map(decodeURIComponent).filter(Boolean).join(":"),w.port=b.port,j&&(w.host=w.host.replace(j+"00",j),w.port=w.port.slice(0,-2)),w.href=U?""+w.pathname+w.search+w.hash:o(w);var O=/^(file)/.test(w.href)?["host","hostname"]:[];return Object.keys(w).forEach(function(e){~O.indexOf(e)||(w[e]=w[e]||null)}),w}exports.parse=g,exports.format=o,exports.resolve=n,exports.resolveObject=function(e,t){return g(n(e,t))},exports.Url=l;
+var e,t=(e=__webpack_require__("HG3D"))&&"object"==typeof e&&"default"in e?e.default:e,r=/https?|ftp|gopher|file/;function o(e){"string"==typeof e&&(e=g(e));var o=function(e,t,r){var o=e.auth,a=e.hostname,s=e.protocol||"",c=e.pathname||"",h=e.hash||"",p=e.query||"",n=!1;o=o?encodeURIComponent(o).replace(/%3A/i,":")+"@":"",e.host?n=o+e.host:a&&(n=o+(~a.indexOf(":")?"["+a+"]":a),e.port&&(n+=":"+e.port)),p&&"object"==typeof p&&(p=t.encode(p));var l=e.search||p&&"?"+p||"";return s&&":"!==s.substr(-1)&&(s+=":"),e.slashes||(!s||r.test(s))&&!1!==n?(n="//"+(n||""),c&&"/"!==c[0]&&(c="/"+c)):n||(n=""),h&&"#"!==h[0]&&(h="#"+h),l&&"?"!==l[0]&&(l="?"+l),{protocol:s,host:n,pathname:c=c.replace(/[?#]/g,encodeURIComponent),search:l=l.replace("#","%23"),hash:h}}(e,t,r);return""+o.protocol+o.host+o.pathname+o.search+o.hash}var a="http://",s="w.w",c=a+s,h=/^([a-z0-9.+-]*:\/\/\/)([a-z0-9.+-]:\/*)?/i,p=/https?|ftp|gopher|file/;function n(e,t){var r="string"==typeof e?g(e):e;e="object"==typeof e?o(e):e;var s=g(t),n="";r.protocol&&!r.slashes&&(n=r.protocol,e=e.replace(r.protocol,""),n+="/"===t[0]||"/"===e[0]?"/":""),n&&s.protocol&&(n="",s.slashes||(n=s.protocol,t=t.replace(s.protocol,"")));var l=e.match(h);l&&!s.protocol&&(e=e.substr((n=l[1]+(l[2]||"")).length),/^\/\/[^/]/.test(t)&&(n=n.slice(0,-1)));var i=new URL(e,c+"/"),f=new URL(t,i).toString().replace(c,""),u=s.protocol||r.protocol;return u+=r.slashes||s.slashes?"//":"",!n&&u?f=f.replace(a,u):n&&(f=f.replace(a,"")),p.test(f)||~t.indexOf(".")||"/"===e.slice(-1)||"/"===t.slice(-1)||"/"!==f.slice(-1)||(f=f.slice(0,-1)),n&&(f=n+("/"===f[0]?f.substr(1):f)),f}function l(){}l.parse=g,l.format=o,l.resolve=n,l.resolveObject=n;var i=/^https?|ftp|gopher|file/,f=/^(.*?)([#?].*)/,u=/^([a-z0-9.+-]*:)(\/{0,3})(.*)/i,m=/^([a-z0-9.+-]*:)?\/\/\/*/i,v=/^([a-z0-9.+-]*:)(\/{0,2})\[(.*)\]$/i;function d(e){try{return decodeURI(e)}catch(t){return e}}function g(e,r,a){if(void 0===r&&(r=!1),void 0===a&&(a=!1),e&&"object"==typeof e&&e instanceof l)return e;var h=(e=e.trim()).match(f);e=h?d(h[1]).replace(/\\/g,"/")+h[2]:d(e).replace(/\\/g,"/"),v.test(e)&&"/"!==e.slice(-1)&&(e+="/");var p=!/(^javascript)/.test(e)&&e.match(u),n=m.test(e),g="";p&&(i.test(p[1])||(g=p[1].toLowerCase(),e=""+p[2]+p[3]),p[2]||(n=!1,i.test(p[1])?(g=p[1],e=""+p[3]):e="//"+p[3]),3!==p[2].length&&1!==p[2].length||(g=p[1],e="/"+p[3]));var b,y=(h?h[1]:e).match(/(:[0-9]+)/),j="";y&&y[1]&&3===y[1].length&&(e=e.replace(j=y[1],j+"00"));var w=new l,x="",U="";try{b=new URL(e)}catch(t){x=t,g||a||!/^\/\//.test(e)||/^\/\/.+[@.]/.test(e)||(U="/",e=e.substr(1));try{b=new URL(e,c)}catch(e){return w.protocol=g,w.href=g,w}}w.slashes=n&&!U,w.host=b.host===s?"":b.host,w.hostname=b.hostname===s?"":b.hostname.replace(/(\[|\])/g,""),w.protocol=x?g||null:b.protocol,w.search=b.search.replace(/\\/g,"%5C"),w.hash=b.hash.replace(/\\/g,"%5C");var R=e.split("#");!w.search&&~R[0].indexOf("?")&&(w.search="?"),w.hash||""!==R[1]||(w.hash="#"),w.query=r?t.decode(b.search.substr(1)):w.search.substr(1),w.pathname=U+d(b.pathname).replace(/"/g,"%22"),"about:"===w.protocol&&"blank"===w.pathname&&(w.protocol="",w.pathname=""),x&&"/"!==e[0]&&(w.pathname=w.pathname.substr(1)),g&&!i.test(g)&&"/"!==e.slice(-1)&&"/"===w.pathname&&(w.pathname=""),w.path=w.pathname+w.search,w.auth=[b.username,b.password].map(decodeURIComponent).filter(Boolean).join(":"),w.port=b.port,j&&(w.host=w.host.replace(j+"00",j),w.port=w.port.slice(0,-2)),w.href=U?""+w.pathname+w.search+w.hash:o(w);var O=/^(file)/.test(w.href)?["host","hostname"]:[];return Object.keys(w).forEach(function(e){~O.indexOf(e)||(w[e]=w[e]||null)}),w}exports.parse=g,exports.format=o,exports.resolve=n,exports.resolveObject=function(e,t){return g(n(e,t))},exports.Url=l;
 //# sourceMappingURL=index.js.map
 
 
@@ -1389,98 +1466,6 @@ function getRouteMatcher(routeRegex) {
 
 exports.getRouteMatcher = getRouteMatcher;
 
-/***/ }),
-
-/***/ "kd2E":
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-
-// If obj.hasOwnProperty has been overridden, then calling
-// obj.hasOwnProperty(prop) will break.
-// See: https://github.com/joyent/node/issues/1707
-function hasOwnProperty(obj, prop) {
-  return Object.prototype.hasOwnProperty.call(obj, prop);
-}
-
-module.exports = function(qs, sep, eq, options) {
-  sep = sep || '&';
-  eq = eq || '=';
-  var obj = {};
-
-  if (typeof qs !== 'string' || qs.length === 0) {
-    return obj;
-  }
-
-  var regexp = /\+/g;
-  qs = qs.split(sep);
-
-  var maxKeys = 1000;
-  if (options && typeof options.maxKeys === 'number') {
-    maxKeys = options.maxKeys;
-  }
-
-  var len = qs.length;
-  // maxKeys <= 0 means that we should not limit keys count
-  if (maxKeys > 0 && len > maxKeys) {
-    len = maxKeys;
-  }
-
-  for (var i = 0; i < len; ++i) {
-    var x = qs[i].replace(regexp, '%20'),
-        idx = x.indexOf(eq),
-        kstr, vstr, k, v;
-
-    if (idx >= 0) {
-      kstr = x.substr(0, idx);
-      vstr = x.substr(idx + 1);
-    } else {
-      kstr = x;
-      vstr = '';
-    }
-
-    k = decodeURIComponent(kstr);
-    v = decodeURIComponent(vstr);
-
-    if (!hasOwnProperty(obj, k)) {
-      obj[k] = v;
-    } else if (isArray(obj[k])) {
-      obj[k].push(v);
-    } else {
-      obj[k] = [obj[k], v];
-    }
-  }
-
-  return obj;
-};
-
-var isArray = Array.isArray || function (xs) {
-  return Object.prototype.toString.call(xs) === '[object Array]';
-};
-
-
 /***/ }),
 
 /***/ "ls82":
@@ -2480,18 +2465,6 @@ exports.RouterContext = React.createContext(null);
 
 if (false) {}
 
-/***/ }),
-
-/***/ "s4NR":
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-exports.decode = exports.parse = __webpack_require__("kd2E");
-exports.encode = exports.stringify = __webpack_require__("4JlD");
-
-
 /***/ }),
 
 /***/ "sXyB":
Diff for de003c3a9d30..b6.module.js
@@ -114,11 +114,16 @@ module.exports = _interopRequireWildcard;
 
 /***/ }),
 
-/***/ "4JlD":
+/***/ "HG3D":
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
-// Copyright Joyent, Inc. and other Node contributors.
+
+
+exports.__esModule = true;
+exports.encode = encode;
+exports.decode = decode;
+exports.stringify = exports.parse = void 0; // Copyright Joyent, Inc. and other Node contributors.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a
 // copy of this software and associated documentation files (the
@@ -138,10 +143,18 @@ module.exports = _interopRequireWildcard;
 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+// This is a modified version of querystring-es3 to allow passing
+// an option for custom decodeURIComponent logic which matches
+// the built-in node options https://nodejs.org/api/querystring.html#querystring_querystring_parse_str_sep_eq_options
 
+function hasOwnProperty(obj, prop) {
+  return Object.prototype.hasOwnProperty.call(obj, prop);
+}
 
-
-var stringifyPrimitive = function(v) {
+var stringifyPrimitive = function stringifyPrimitive(v) {
   switch (typeof v) {
     case 'string':
       return v;
@@ -157,53 +170,117 @@ var stringifyPrimitive = function(v) {
   }
 };
 
-module.exports = function(obj, sep, eq, name) {
+function encode(obj, sep, eq, name) {
   sep = sep || '&';
   eq = eq || '=';
+
   if (obj === null) {
     obj = undefined;
   }
 
   if (typeof obj === 'object') {
-    return map(objectKeys(obj), function(k) {
+    return map(objectKeys(obj), function (k) {
       var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+
       if (isArray(obj[k])) {
-        return map(obj[k], function(v) {
+        return map(obj[k], function (v) {
           return ks + encodeURIComponent(stringifyPrimitive(v));
         }).join(sep);
       } else {
         return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
       }
     }).join(sep);
-
   }
 
   if (!name) return '';
-  return encodeURIComponent(stringifyPrimitive(name)) + eq +
-         encodeURIComponent(stringifyPrimitive(obj));
-};
+  return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj));
+}
 
 var isArray = Array.isArray || function (xs) {
   return Object.prototype.toString.call(xs) === '[object Array]';
 };
 
-function map (xs, f) {
+function map(xs, f) {
   if (xs.map) return xs.map(f);
   var res = [];
+
   for (var i = 0; i < xs.length; i++) {
     res.push(f(xs[i], i));
   }
+
   return res;
 }
 
 var objectKeys = Object.keys || function (obj) {
   var res = [];
+
   for (var key in obj) {
     if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
   }
+
   return res;
 };
 
+function decode(qs, sep, eq, options) {
+  sep = sep || '&';
+  eq = eq || '=';
+  var obj = {};
+  options = options || {};
+  var decodeComponent = options.decodeURIComponent || decodeURIComponent;
+
+  if (typeof qs !== 'string' || qs.length === 0) {
+    return obj;
+  }
+
+  var regexp = /\+/g;
+  qs = qs.split(sep);
+  var maxKeys = 1000;
+
+  if (options && typeof options.maxKeys === 'number') {
+    maxKeys = options.maxKeys;
+  }
+
+  var len = qs.length; // maxKeys <= 0 means that we should not limit keys count
+
+  if (maxKeys > 0 && len > maxKeys) {
+    len = maxKeys;
+  }
+
+  for (var i = 0; i < len; ++i) {
+    var x = qs[i].replace(regexp, '%20'),
+        idx = x.indexOf(eq),
+        kstr,
+        vstr,
+        k,
+        v;
+
+    if (idx >= 0) {
+      kstr = x.substr(0, idx);
+      vstr = x.substr(idx + 1);
+    } else {
+      kstr = x;
+      vstr = '';
+    }
+
+    k = decodeComponent(kstr);
+    v = decodeComponent(vstr);
+
+    if (!hasOwnProperty(obj, k)) {
+      obj[k] = v;
+    } else if (isArray(obj[k])) {
+      obj[k].push(v);
+    } else {
+      obj[k] = [obj[k], v];
+    }
+  }
+
+  return obj;
+}
+
+var parse = decode;
+exports.parse = parse;
+var stringify = encode;
+exports.stringify = stringify;
 
 /***/ }),
 
@@ -218,7 +295,7 @@ var assign=Object.assign.bind(Object);module.exports=assign;module.exports.defau
 /***/ "QmWs":
 /***/ (function(module, exports, __webpack_require__) {
 
-var e,t=(e=__webpack_require__("s4NR"))&&"object"==typeof e&&"default"in e?e.default:e,r=/https?|ftp|gopher|file/;function o(e){"string"==typeof e&&(e=g(e));var o=function(e,t,r){var o=e.auth,a=e.hostname,s=e.protocol||"",c=e.pathname||"",h=e.hash||"",p=e.query||"",n=!1;o=o?encodeURIComponent(o).replace(/%3A/i,":")+"@":"",e.host?n=o+e.host:a&&(n=o+(~a.indexOf(":")?"["+a+"]":a),e.port&&(n+=":"+e.port)),p&&"object"==typeof p&&(p=t.encode(p));var l=e.search||p&&"?"+p||"";return s&&":"!==s.substr(-1)&&(s+=":"),e.slashes||(!s||r.test(s))&&!1!==n?(n="//"+(n||""),c&&"/"!==c[0]&&(c="/"+c)):n||(n=""),h&&"#"!==h[0]&&(h="#"+h),l&&"?"!==l[0]&&(l="?"+l),{protocol:s,host:n,pathname:c=c.replace(/[?#]/g,encodeURIComponent),search:l=l.replace("#","%23"),hash:h}}(e,t,r);return""+o.protocol+o.host+o.pathname+o.search+o.hash}var a="http://",s="w.w",c=a+s,h=/^([a-z0-9.+-]*:\/\/\/)([a-z0-9.+-]:\/*)?/i,p=/https?|ftp|gopher|file/;function n(e,t){var r="string"==typeof e?g(e):e;e="object"==typeof e?o(e):e;var s=g(t),n="";r.protocol&&!r.slashes&&(n=r.protocol,e=e.replace(r.protocol,""),n+="/"===t[0]||"/"===e[0]?"/":""),n&&s.protocol&&(n="",s.slashes||(n=s.protocol,t=t.replace(s.protocol,"")));var l=e.match(h);l&&!s.protocol&&(e=e.substr((n=l[1]+(l[2]||"")).length),/^\/\/[^/]/.test(t)&&(n=n.slice(0,-1)));var i=new URL(e,c+"/"),f=new URL(t,i).toString().replace(c,""),u=s.protocol||r.protocol;return u+=r.slashes||s.slashes?"//":"",!n&&u?f=f.replace(a,u):n&&(f=f.replace(a,"")),p.test(f)||~t.indexOf(".")||"/"===e.slice(-1)||"/"===t.slice(-1)||"/"!==f.slice(-1)||(f=f.slice(0,-1)),n&&(f=n+("/"===f[0]?f.substr(1):f)),f}function l(){}l.parse=g,l.format=o,l.resolve=n,l.resolveObject=n;var i=/^https?|ftp|gopher|file/,f=/^(.*?)([#?].*)/,u=/^([a-z0-9.+-]*:)(\/{0,3})(.*)/i,m=/^([a-z0-9.+-]*:)?\/\/\/*/i,v=/^([a-z0-9.+-]*:)(\/{0,2})\[(.*)\]$/i;function d(e){try{return decodeURI(e)}catch(t){return e}}function g(e,r,a){if(void 0===r&&(r=!1),void 0===a&&(a=!1),e&&"object"==typeof e&&e instanceof l)return e;var h=(e=e.trim()).match(f);e=h?d(h[1]).replace(/\\/g,"/")+h[2]:d(e).replace(/\\/g,"/"),v.test(e)&&"/"!==e.slice(-1)&&(e+="/");var p=!/(^javascript)/.test(e)&&e.match(u),n=m.test(e),g="";p&&(i.test(p[1])||(g=p[1].toLowerCase(),e=""+p[2]+p[3]),p[2]||(n=!1,i.test(p[1])?(g=p[1],e=""+p[3]):e="//"+p[3]),3!==p[2].length&&1!==p[2].length||(g=p[1],e="/"+p[3]));var b,y=(h?h[1]:e).match(/(:[0-9]+)/),j="";y&&y[1]&&3===y[1].length&&(e=e.replace(j=y[1],j+"00"));var w=new l,x="",U="";try{b=new URL(e)}catch(t){x=t,g||a||!/^\/\//.test(e)||/^\/\/.+[@.]/.test(e)||(U="/",e=e.substr(1));try{b=new URL(e,c)}catch(e){return w.protocol=g,w.href=g,w}}w.slashes=n&&!U,w.host=b.host===s?"":b.host,w.hostname=b.hostname===s?"":b.hostname.replace(/(\[|\])/g,""),w.protocol=x?g||null:b.protocol,w.search=b.search.replace(/\\/g,"%5C"),w.hash=b.hash.replace(/\\/g,"%5C");var R=e.split("#");!w.search&&~R[0].indexOf("?")&&(w.search="?"),w.hash||""!==R[1]||(w.hash="#"),w.query=r?t.decode(b.search.substr(1)):w.search.substr(1),w.pathname=U+d(b.pathname).replace(/"/g,"%22"),"about:"===w.protocol&&"blank"===w.pathname&&(w.protocol="",w.pathname=""),x&&"/"!==e[0]&&(w.pathname=w.pathname.substr(1)),g&&!i.test(g)&&"/"!==e.slice(-1)&&"/"===w.pathname&&(w.pathname=""),w.path=w.pathname+w.search,w.auth=[b.username,b.password].map(decodeURIComponent).filter(Boolean).join(":"),w.port=b.port,j&&(w.host=w.host.replace(j+"00",j),w.port=w.port.slice(0,-2)),w.href=U?""+w.pathname+w.search+w.hash:o(w);var O=/^(file)/.test(w.href)?["host","hostname"]:[];return Object.keys(w).forEach(function(e){~O.indexOf(e)||(w[e]=w[e]||null)}),w}exports.parse=g,exports.format=o,exports.resolve=n,exports.resolveObject=function(e,t){return g(n(e,t))},exports.Url=l;
+var e,t=(e=__webpack_require__("HG3D"))&&"object"==typeof e&&"default"in e?e.default:e,r=/https?|ftp|gopher|file/;function o(e){"string"==typeof e&&(e=g(e));var o=function(e,t,r){var o=e.auth,a=e.hostname,s=e.protocol||"",c=e.pathname||"",h=e.hash||"",p=e.query||"",n=!1;o=o?encodeURIComponent(o).replace(/%3A/i,":")+"@":"",e.host?n=o+e.host:a&&(n=o+(~a.indexOf(":")?"["+a+"]":a),e.port&&(n+=":"+e.port)),p&&"object"==typeof p&&(p=t.encode(p));var l=e.search||p&&"?"+p||"";return s&&":"!==s.substr(-1)&&(s+=":"),e.slashes||(!s||r.test(s))&&!1!==n?(n="//"+(n||""),c&&"/"!==c[0]&&(c="/"+c)):n||(n=""),h&&"#"!==h[0]&&(h="#"+h),l&&"?"!==l[0]&&(l="?"+l),{protocol:s,host:n,pathname:c=c.replace(/[?#]/g,encodeURIComponent),search:l=l.replace("#","%23"),hash:h}}(e,t,r);return""+o.protocol+o.host+o.pathname+o.search+o.hash}var a="http://",s="w.w",c=a+s,h=/^([a-z0-9.+-]*:\/\/\/)([a-z0-9.+-]:\/*)?/i,p=/https?|ftp|gopher|file/;function n(e,t){var r="string"==typeof e?g(e):e;e="object"==typeof e?o(e):e;var s=g(t),n="";r.protocol&&!r.slashes&&(n=r.protocol,e=e.replace(r.protocol,""),n+="/"===t[0]||"/"===e[0]?"/":""),n&&s.protocol&&(n="",s.slashes||(n=s.protocol,t=t.replace(s.protocol,"")));var l=e.match(h);l&&!s.protocol&&(e=e.substr((n=l[1]+(l[2]||"")).length),/^\/\/[^/]/.test(t)&&(n=n.slice(0,-1)));var i=new URL(e,c+"/"),f=new URL(t,i).toString().replace(c,""),u=s.protocol||r.protocol;return u+=r.slashes||s.slashes?"//":"",!n&&u?f=f.replace(a,u):n&&(f=f.replace(a,"")),p.test(f)||~t.indexOf(".")||"/"===e.slice(-1)||"/"===t.slice(-1)||"/"!==f.slice(-1)||(f=f.slice(0,-1)),n&&(f=n+("/"===f[0]?f.substr(1):f)),f}function l(){}l.parse=g,l.format=o,l.resolve=n,l.resolveObject=n;var i=/^https?|ftp|gopher|file/,f=/^(.*?)([#?].*)/,u=/^([a-z0-9.+-]*:)(\/{0,3})(.*)/i,m=/^([a-z0-9.+-]*:)?\/\/\/*/i,v=/^([a-z0-9.+-]*:)(\/{0,2})\[(.*)\]$/i;function d(e){try{return decodeURI(e)}catch(t){return e}}function g(e,r,a){if(void 0===r&&(r=!1),void 0===a&&(a=!1),e&&"object"==typeof e&&e instanceof l)return e;var h=(e=e.trim()).match(f);e=h?d(h[1]).replace(/\\/g,"/")+h[2]:d(e).replace(/\\/g,"/"),v.test(e)&&"/"!==e.slice(-1)&&(e+="/");var p=!/(^javascript)/.test(e)&&e.match(u),n=m.test(e),g="";p&&(i.test(p[1])||(g=p[1].toLowerCase(),e=""+p[2]+p[3]),p[2]||(n=!1,i.test(p[1])?(g=p[1],e=""+p[3]):e="//"+p[3]),3!==p[2].length&&1!==p[2].length||(g=p[1],e="/"+p[3]));var b,y=(h?h[1]:e).match(/(:[0-9]+)/),j="";y&&y[1]&&3===y[1].length&&(e=e.replace(j=y[1],j+"00"));var w=new l,x="",U="";try{b=new URL(e)}catch(t){x=t,g||a||!/^\/\//.test(e)||/^\/\/.+[@.]/.test(e)||(U="/",e=e.substr(1));try{b=new URL(e,c)}catch(e){return w.protocol=g,w.href=g,w}}w.slashes=n&&!U,w.host=b.host===s?"":b.host,w.hostname=b.hostname===s?"":b.hostname.replace(/(\[|\])/g,""),w.protocol=x?g||null:b.protocol,w.search=b.search.replace(/\\/g,"%5C"),w.hash=b.hash.replace(/\\/g,"%5C");var R=e.split("#");!w.search&&~R[0].indexOf("?")&&(w.search="?"),w.hash||""!==R[1]||(w.hash="#"),w.query=r?t.decode(b.search.substr(1)):w.search.substr(1),w.pathname=U+d(b.pathname).replace(/"/g,"%22"),"about:"===w.protocol&&"blank"===w.pathname&&(w.protocol="",w.pathname=""),x&&"/"!==e[0]&&(w.pathname=w.pathname.substr(1)),g&&!i.test(g)&&"/"!==e.slice(-1)&&"/"===w.pathname&&(w.pathname=""),w.path=w.pathname+w.search,w.auth=[b.username,b.password].map(decodeURIComponent).filter(Boolean).join(":"),w.port=b.port,j&&(w.host=w.host.replace(j+"00",j),w.port=w.port.slice(0,-2)),w.href=U?""+w.pathname+w.search+w.hash:o(w);var O=/^(file)/.test(w.href)?["host","hostname"]:[];return Object.keys(w).forEach(function(e){~O.indexOf(e)||(w[e]=w[e]||null)}),w}exports.parse=g,exports.format=o,exports.resolve=n,exports.resolveObject=function(e,t){return g(n(e,t))},exports.Url=l;
 //# sourceMappingURL=index.js.map
 
 
@@ -1210,98 +1287,6 @@ function getRouteMatcher(routeRegex) {
 
 exports.getRouteMatcher = getRouteMatcher;
 
-/***/ }),
-
-/***/ "kd2E":
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-
-// If obj.hasOwnProperty has been overridden, then calling
-// obj.hasOwnProperty(prop) will break.
-// See: https://github.com/joyent/node/issues/1707
-function hasOwnProperty(obj, prop) {
-  return Object.prototype.hasOwnProperty.call(obj, prop);
-}
-
-module.exports = function(qs, sep, eq, options) {
-  sep = sep || '&';
-  eq = eq || '=';
-  var obj = {};
-
-  if (typeof qs !== 'string' || qs.length === 0) {
-    return obj;
-  }
-
-  var regexp = /\+/g;
-  qs = qs.split(sep);
-
-  var maxKeys = 1000;
-  if (options && typeof options.maxKeys === 'number') {
-    maxKeys = options.maxKeys;
-  }
-
-  var len = qs.length;
-  // maxKeys <= 0 means that we should not limit keys count
-  if (maxKeys > 0 && len > maxKeys) {
-    len = maxKeys;
-  }
-
-  for (var i = 0; i < len; ++i) {
-    var x = qs[i].replace(regexp, '%20'),
-        idx = x.indexOf(eq),
-        kstr, vstr, k, v;
-
-    if (idx >= 0) {
-      kstr = x.substr(0, idx);
-      vstr = x.substr(idx + 1);
-    } else {
-      kstr = x;
-      vstr = '';
-    }
-
-    k = decodeURIComponent(kstr);
-    v = decodeURIComponent(vstr);
-
-    if (!hasOwnProperty(obj, k)) {
-      obj[k] = v;
-    } else if (isArray(obj[k])) {
-      obj[k].push(v);
-    } else {
-      obj[k] = [obj[k], v];
-    }
-  }
-
-  return obj;
-};
-
-var isArray = Array.isArray || function (xs) {
-  return Object.prototype.toString.call(xs) === '[object Array]';
-};
-
-
 /***/ }),
 
 /***/ "nOHt":
@@ -1490,18 +1475,6 @@ exports.RouterContext = React.createContext(null);
 
 if (false) {}
 
-/***/ }),
-
-/***/ "s4NR":
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-exports.decode = exports.parse = __webpack_require__("kd2E");
-exports.encode = exports.stringify = __webpack_require__("4JlD");
-
-
 /***/ })
 
 }]);
\ No newline at end of file
Diff for main-HASH.js
@@ -233,7 +233,7 @@ var _headManagerContext = __webpack_require__("FYa8");
 
 var _routerContext = __webpack_require__("qOIg");
 
-var _querystring = __webpack_require__("s4NR");
+var _querystring = __webpack_require__("HG3D");
 
 var _isDynamic = __webpack_require__("/jkW");
 
@@ -325,8 +325,27 @@ var Container = /*#__PURE__*/function (_react$default$Compon) {
 
 
       if (router.isSsr && (isFallback || data.nextExport && ((0, _isDynamic.isDynamicRoute)(router.pathname) || location.search) || props.__N_SSG && location.search)) {
-        // update query on mount for exported pages
-        router.replace(router.pathname + '?' + (0, _querystring.stringify)((0, _extends2["default"])({}, router.query, {}, (0, _querystring.parse)(location.search.substr(1)))), asPath, {
+        var parsedQuery = (0, _querystring.parse)(location.search.substr(1), '&', '=', {
+          decodeURIComponent: function (_decodeURIComponent) {
+            function decodeURIComponent(_x) {
+              return _decodeURIComponent.apply(this, arguments);
+            }
+
+            decodeURIComponent.toString = function () {
+              return _decodeURIComponent.toString();
+            };
+
+            return decodeURIComponent;
+          }(function (str) {
+            try {
+              return decodeURIComponent(str);
+            } catch (err) {
+              return str;
+            }
+          })
+        }); // update query on mount for exported pages
+
+        router.replace(router.pathname + '?' + (0, _querystring.stringify)((0, _extends2["default"])({}, router.query, {}, parsedQuery)), asPath, {
           // WARNING: `_h` is an internal option for handing Next.js
           // client-side hydration. Your app should _never_ use this property.
           // It may change at any time without notice.
Diff for main-HASH.module.js
@@ -193,7 +193,7 @@ var _headManagerContext = __webpack_require__("FYa8");
 
 var _routerContext = __webpack_require__("qOIg");
 
-var _querystring = __webpack_require__("s4NR");
+var _querystring = __webpack_require__("HG3D");
 
 var _isDynamic = __webpack_require__("/jkW");
 
@@ -271,8 +271,27 @@ class Container extends _react.default.Component {
 
 
     if (router.isSsr && (isFallback || data.nextExport && ((0, _isDynamic.isDynamicRoute)(router.pathname) || location.search) || props.__N_SSG && location.search)) {
-      // update query on mount for exported pages
-      router.replace(router.pathname + '?' + (0, _querystring.stringify)((0, _extends2.default)({}, router.query, {}, (0, _querystring.parse)(location.search.substr(1)))), asPath, {
+      var parsedQuery = (0, _querystring.parse)(location.search.substr(1), '&', '=', {
+        decodeURIComponent: function (_decodeURIComponent) {
+          function decodeURIComponent(_x) {
+            return _decodeURIComponent.apply(this, arguments);
+          }
+
+          decodeURIComponent.toString = function () {
+            return _decodeURIComponent.toString();
+          };
+
+          return decodeURIComponent;
+        }(str => {
+          try {
+            return decodeURIComponent(str);
+          } catch (err) {
+            return str;
+          }
+        })
+      }); // update query on mount for exported pages
+
+      router.replace(router.pathname + '?' + (0, _querystring.stringify)((0, _extends2.default)({}, router.query, {}, parsedQuery)), asPath, {
         // WARNING: `_h` is an internal option for handing Next.js
         // client-side hydration. Your app should _never_ use this property.
         // It may change at any time without notice.
Diff for index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/BUILD_ID/pages/_app.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/BUILD_ID/pages/index.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e33c31df63c7bd08d3b6.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/main-f77bc7795f1b604d4867.module.js" as="script" crossorigin="anonymous"/></head><body><div id="__next">Hello world 👋</div><script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"BUILD_ID","isFallback":false,"gip":true}</script><script crossorigin="anonymous" nomodule="">!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script><script crossorigin="anonymous" nomodule="" src="/_next/static/runtime/polyfills-51838dc5b2b8e0705281.js"></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.module.js" crossorigin="anonymous" type="module"></script><script async="" data-next-page="/" src="/_next/static/BUILD_ID/pages/index.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/" src="/_next/static/BUILD_ID/pages/index.module.js" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/webpack-4d739ac7b0d8f888ab18.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.3ae202e2988e23ef6016.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e33c31df63c7bd08d3b6.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/main-53fa6ff5b47debf41437.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/main-f77bc7795f1b604d4867.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_buildManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_buildManifest.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_ssgManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_ssgManifest.module.js" async="" crossorigin="anonymous" type="module"></script></body></html>
\ No newline at end of file
+<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/BUILD_ID/pages/_app.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/BUILD_ID/pages/index.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.162526e009e26504b896.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/main-00f1ee44b583a0888426.module.js" as="script" crossorigin="anonymous"/></head><body><div id="__next">Hello world 👋</div><script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"BUILD_ID","isFallback":false,"gip":true}</script><script crossorigin="anonymous" nomodule="">!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script><script crossorigin="anonymous" nomodule="" src="/_next/static/runtime/polyfills-51838dc5b2b8e0705281.js"></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.module.js" crossorigin="anonymous" type="module"></script><script async="" data-next-page="/" src="/_next/static/BUILD_ID/pages/index.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/" src="/_next/static/BUILD_ID/pages/index.module.js" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/webpack-4d739ac7b0d8f888ab18.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e4397b5a3cf74bc6412c.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.162526e009e26504b896.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/main-190a919bac7ebe1c5a01.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/main-00f1ee44b583a0888426.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_buildManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_buildManifest.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_ssgManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_ssgManifest.module.js" async="" crossorigin="anonymous" type="module"></script></body></html>
\ No newline at end of file
Diff for link.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/BUILD_ID/pages/_app.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/BUILD_ID/pages/link.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e33c31df63c7bd08d3b6.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/main-f77bc7795f1b604d4867.module.js" as="script" crossorigin="anonymous"/></head><body><div id="__next"><div><h3>A Link page!</h3><a href="/">Go to /</a></div></div><script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">{"props":{"pageProps":{}},"page":"/link","query":{},"buildId":"BUILD_ID","isFallback":false,"gip":true}</script><script crossorigin="anonymous" nomodule="">!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script><script crossorigin="anonymous" nomodule="" src="/_next/static/runtime/polyfills-51838dc5b2b8e0705281.js"></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.module.js" crossorigin="anonymous" type="module"></script><script async="" data-next-page="/link" src="/_next/static/BUILD_ID/pages/link.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/link" src="/_next/static/BUILD_ID/pages/link.module.js" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/webpack-4d739ac7b0d8f888ab18.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.3ae202e2988e23ef6016.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e33c31df63c7bd08d3b6.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/main-53fa6ff5b47debf41437.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/main-f77bc7795f1b604d4867.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_buildManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_buildManifest.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_ssgManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_ssgManifest.module.js" async="" crossorigin="anonymous" type="module"></script></body></html>
\ No newline at end of file
+<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/BUILD_ID/pages/_app.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/BUILD_ID/pages/link.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.162526e009e26504b896.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/main-00f1ee44b583a0888426.module.js" as="script" crossorigin="anonymous"/></head><body><div id="__next"><div><h3>A Link page!</h3><a href="/">Go to /</a></div></div><script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">{"props":{"pageProps":{}},"page":"/link","query":{},"buildId":"BUILD_ID","isFallback":false,"gip":true}</script><script crossorigin="anonymous" nomodule="">!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script><script crossorigin="anonymous" nomodule="" src="/_next/static/runtime/polyfills-51838dc5b2b8e0705281.js"></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.module.js" crossorigin="anonymous" type="module"></script><script async="" data-next-page="/link" src="/_next/static/BUILD_ID/pages/link.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/link" src="/_next/static/BUILD_ID/pages/link.module.js" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/webpack-4d739ac7b0d8f888ab18.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e4397b5a3cf74bc6412c.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.162526e009e26504b896.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/main-190a919bac7ebe1c5a01.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/main-00f1ee44b583a0888426.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_buildManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_buildManifest.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_ssgManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_ssgManifest.module.js" async="" crossorigin="anonymous" type="module"></script></body></html>
\ No newline at end of file
Diff for withRouter.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/BUILD_ID/pages/_app.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/BUILD_ID/pages/withRouter.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e33c31df63c7bd08d3b6.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/main-f77bc7795f1b604d4867.module.js" as="script" crossorigin="anonymous"/></head><body><div id="__next"><div>I use withRouter</div></div><script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">{"props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"BUILD_ID","isFallback":false,"gip":true}</script><script crossorigin="anonymous" nomodule="">!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script><script crossorigin="anonymous" nomodule="" src="/_next/static/runtime/polyfills-51838dc5b2b8e0705281.js"></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.module.js" crossorigin="anonymous" type="module"></script><script async="" data-next-page="/withRouter" src="/_next/static/BUILD_ID/pages/withRouter.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/withRouter" src="/_next/static/BUILD_ID/pages/withRouter.module.js" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/webpack-4d739ac7b0d8f888ab18.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.3ae202e2988e23ef6016.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e33c31df63c7bd08d3b6.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/main-53fa6ff5b47debf41437.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/main-f77bc7795f1b604d4867.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_buildManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_buildManifest.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_ssgManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_ssgManifest.module.js" async="" crossorigin="anonymous" type="module"></script></body></html>
\ No newline at end of file
+<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/BUILD_ID/pages/_app.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/BUILD_ID/pages/withRouter.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.162526e009e26504b896.module.js" as="script" crossorigin="anonymous"/><link rel="preload" href="/_next/static/runtime/main-00f1ee44b583a0888426.module.js" as="script" crossorigin="anonymous"/></head><body><div id="__next"><div>I use withRouter</div></div><script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">{"props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"BUILD_ID","isFallback":false,"gip":true}</script><script crossorigin="anonymous" nomodule="">!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script><script crossorigin="anonymous" nomodule="" src="/_next/static/runtime/polyfills-51838dc5b2b8e0705281.js"></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/_app" src="/_next/static/BUILD_ID/pages/_app.module.js" crossorigin="anonymous" type="module"></script><script async="" data-next-page="/withRouter" src="/_next/static/BUILD_ID/pages/withRouter.js" crossorigin="anonymous" nomodule=""></script><script async="" data-next-page="/withRouter" src="/_next/static/BUILD_ID/pages/withRouter.module.js" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/webpack-4d739ac7b0d8f888ab18.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/webpack-d629b83a65f3e33fa99e.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/framework.5bb7f30f859f5f31359f.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e4397b5a3cf74bc6412c.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.162526e009e26504b896.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/runtime/main-190a919bac7ebe1c5a01.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/runtime/main-00f1ee44b583a0888426.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_buildManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_buildManifest.module.js" async="" crossorigin="anonymous" type="module"></script><script src="/_next/static/BUILD_ID/_ssgManifest.js" async="" crossorigin="anonymous" nomodule=""></script><script src="/_next/static/BUILD_ID/_ssgManifest.module.js" async="" crossorigin="anonymous" type="module"></script></body></html>
\ No newline at end of file

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
buildDuration 12.2s 12.7s ⚠️ +444ms
nodeModulesSize 55.2 MB 55.2 MB ⚠️ +4.19 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.js gzip 6.25 kB 6.31 kB ⚠️ +61 B
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..45d6.js gzip 10.3 kB N/A N/A
framework.a1..NSE.txt gzip 220 B 220 B
framework.a1..NSE.txt gzip 220 B 220 B
framework.HASH.js gzip 39 kB 39 kB
de003c3a9d30..ed83.js gzip N/A 10.3 kB N/A
Overall change 56.7 kB 56.8 kB ⚠️ +69 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.module.js gzip 4.79 kB 4.85 kB ⚠️ +54 B
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.87 kB N/A N/A
framework.HA..dule.js gzip 39 kB 39 kB
de003c3a9d30..dule.js gzip N/A 6.86 kB N/A
Overall change 51.4 kB 51.5 kB ⚠️ +51 B
Legacy Client Bundles (polyfills)
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
polyfills-HASH.js gzip 26.2 kB 26.2 kB
Overall change 26.2 kB 26.2 kB
Client Pages
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
_app.js gzip 1.23 kB 1.23 kB
_error.js gzip 3.12 kB 3.12 kB
hooks.js gzip 663 B 663 B
index.js gzip 222 B 222 B
link.js gzip 2.06 kB 2.06 kB
routerDirect.js gzip 280 B 280 B
withRouter.js gzip 278 B 278 B
Overall change 7.85 kB 7.85 kB
Client Pages Modern
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
_app.module.js gzip 598 B 598 B
_error.module.js gzip 2.09 kB 2.09 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.52 kB 1.52 kB
routerDirect..dule.js gzip 279 B 279 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.37 kB 5.37 kB
Client Build Manifests
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles
zeit/next.js canary ijjk/next.js fix/unencoded-query Change
_error.js 558 kB 558 kB
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 558 kB 558 kB
link.js 595 kB 595 kB
routerDirect.js 587 kB 587 kB
withRouter.js 587 kB 587 kB
Overall change 2.89 MB 2.89 MB

@Timer Timer modified the milestones: 9.3.6, 9.3.x Apr 28, 2020
@Timer Timer self-assigned this May 23, 2020
@timneutkens
Copy link
Member

I think we should probably just catch the error and render a proper error screen instead of handling it

Copy link
Member

@Timer Timer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code looks way too overkill IMO. Is there a tiny npm module or something that we can adapt that handles this? Not a fan of stubbing querystring either really.

@timneutkens
Copy link
Member

This code looks way too overkill IMO. Is there a tiny npm module or something that we can adapt that handles this? Not a fan of stubbing querystring either really.

I think we should just handle the error being thrown, that's the overarching issue it seems.

Copy link
Member

@Timer Timer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's render /_error with the Bad Request error instead of gracefully handling.

@ijjk
Copy link
Member Author

ijjk commented Jun 1, 2020

@Timer rendering an error during CSR for this will differ from SSR since during SSR it works without error, note the added test here https://github.com/vercel/next.js/pull/12154/files#diff-69f7e9194d478ccba109389dc3578e3cR378

@ijjk ijjk requested a review from Timer June 1, 2020 15:58
Copy link
Member

@Timer Timer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please test more complex cases:

> querystring.parse('b=%2sf%2a')
[Object: null prototype] { b: '%2sf*' }

> querystring.parse('b=%2%2af%2a')
[Object: null prototype] { b: '%2%2af*' }

> querystring.parse('b=%2%2a%2af%2a')
[Object: null prototype] { b: '%2%2a*f*' }

> querystring.parse('b=%%2a')
[Object: null prototype] { b: '%%2a' }

> querystring.parse('b=%%2a%2a')
[Object: null prototype] { b: '%%2a*' }

@ijjk
Copy link
Member Author

ijjk commented Jun 1, 2020

Do we want to match the node behavior exactly in the browser or do we want to match the browser behavior in node?

We can match node exactly in the browser with our polyfill if we use the actual querystring logic which has custom escaping/unescaping logic. Source: https://github.com/nodejs/node/blob/41796ebd30744173cbe19201493349e7c8995082/lib/querystring.js

@Timer
Copy link
Member

Timer commented Jun 1, 2020

Let's see what the weight increase is of C+P the Node impl to match it exact.

@ijjk
Copy link
Member Author

ijjk commented Jun 1, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
buildDuration 11.5s 12.5s ⚠️ +1s
nodeModulesSize 65.3 MB 65.3 MB ⚠️ +51.3 kB
Page Load Tests Overall increase ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
/ failed reqs 0 0
/ total time (seconds) 1.993 2.077 ⚠️ +0.08
/ avg req/sec 1254.32 1203.41 -50.91
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.336 1.258 -0.08
/error-in-render avg req/sec 1871.86 1987.07 ⚠️ +115.21
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.js gzip 6.59 kB 6.59 kB ⚠️ +1 B
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..6c2a.js gzip 10.5 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
de003c3a9d30..ef61.js gzip N/A 18.1 kB N/A
Overall change 57 kB 64.6 kB ⚠️ +7.55 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.module.js gzip 5.67 kB 5.67 kB ⚠️ +1 B
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.93 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 14.4 kB N/A
Overall change 52.5 kB 60 kB ⚠️ +7.5 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.05 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.21 kB 8.21 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.51 kB 1.51 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.32 kB 5.32 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes Overall decrease ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
index.html gzip 925 B 925 B
link.html gzip 935 B 935 B
withRouter.html gzip 923 B 922 B -1 B
Overall change 2.78 kB 2.78 kB -1 B

Diffs

Diff for de003c3a9d30..8a09594e6.js

Diff too large to display

Diff for de003c3a9d30..34.module.js
deleted
Diff for de003c3a9d30..e6.module.js

Diff too large to display

Diff for main-HASH.js
@@ -252,7 +252,7 @@
 
       var _router = __webpack_require__("nOHt");
 
-      var _querystring = __webpack_require__("s4NR");
+      var _querystring = __webpack_require__("HG3D");
 
       var _react = _interopRequireDefault(__webpack_require__("q1tI"));
Diff for main-HASH.module.js
@@ -172,7 +172,7 @@
 
       var _router = __webpack_require__("nOHt");
 
-      var _querystring = __webpack_require__("s4NR");
+      var _querystring = __webpack_require__("HG3D");
 
       var _react = _interopRequireDefault(__webpack_require__("q1tI"));
Diff for index.html
@@ -30,13 +30,13 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.3c80bb2585780eac15e6.module.js"
       as="script"
       crossorigin="anonymous"
     />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      href="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -133,25 +133,25 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.133d5a9780b8a09594e6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e09c373fa6cd0f7db853.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.3c80bb2585780eac15e6.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
     ></script>
     <script
-      src="/_next/static/runtime/main-ade021272639fc39635d.js"
+      src="/_next/static/runtime/main-565b3ca68e174691f56b.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      src="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -30,13 +30,13 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.3c80bb2585780eac15e6.module.js"
       as="script"
       crossorigin="anonymous"
     />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      href="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -138,25 +138,25 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.133d5a9780b8a09594e6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e09c373fa6cd0f7db853.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.3c80bb2585780eac15e6.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
     ></script>
     <script
-      src="/_next/static/runtime/main-ade021272639fc39635d.js"
+      src="/_next/static/runtime/main-565b3ca68e174691f56b.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      src="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -30,13 +30,13 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.3c80bb2585780eac15e6.module.js"
       as="script"
       crossorigin="anonymous"
     />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      href="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -133,25 +133,25 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.133d5a9780b8a09594e6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.e09c373fa6cd0f7db853.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.3c80bb2585780eac15e6.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
     ></script>
     <script
-      src="/_next/static/runtime/main-ade021272639fc39635d.js"
+      src="/_next/static/runtime/main-565b3ca68e174691f56b.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      src="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
buildDuration 12.7s 13.3s ⚠️ +623ms
nodeModulesSize 65.3 MB 65.3 MB ⚠️ +51.3 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.js gzip 6.59 kB 6.59 kB ⚠️ +1 B
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..6c2a.js gzip 10.5 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
de003c3a9d30..ef61.js gzip N/A 18.1 kB N/A
Overall change 57 kB 64.6 kB ⚠️ +7.55 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.module.js gzip 5.67 kB 5.67 kB ⚠️ +1 B
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.93 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 14.4 kB N/A
Overall change 52.5 kB 60 kB ⚠️ +7.5 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.05 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.21 kB 8.21 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.51 kB 1.51 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.32 kB 5.32 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_error.js 877 kB 877 kB
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 877 kB 877 kB
link.js 915 kB 915 kB
routerDirect.js 908 kB 908 kB
withRouter.js 908 kB 908 kB
Overall change 4.49 MB 4.49 MB

@ijjk
Copy link
Member Author

ijjk commented Jun 1, 2020

Failing test suites

test/integration/size-limit/test/index.test.js

  • Production response size > should not increase the overall response size of default build
  • Production response size > should not increase the overall response size of modern build
Expand output

● Production response size › should not increase the overall response size of default build

expect(received).toBeLessThanOrEqual(expected)

Expected: <= 1024
Received:    25211

  82 |     // These numbers are without gzip compression!
  83 |     const delta = responseSizesBytes - 264 * 1024
> 84 |     expect(delta).toBeLessThanOrEqual(1024) // don't increase size more than 1kb
     |                   ^
  85 |     expect(delta).toBeGreaterThanOrEqual(-1024) // don't decrease size more than 1kb without updating target
  86 |   })
  87 | 

  at Object.<anonymous> (integration/size-limit/test/index.test.js:84:19)

● Production response size › should not increase the overall response size of modern build

expect(received).toBeLessThanOrEqual(expected)

Expected: <= 1024
Received:    25342

  102 |     // These numbers are without gzip compression!
  103 |     const delta = responseSizesBytes - 169 * 1024
> 104 |     expect(delta).toBeLessThanOrEqual(1024) // don't increase size more than 1kb
      |                   ^
  105 |     expect(delta).toBeGreaterThanOrEqual(-1024) // don't decrease size more than 1kb without updating target
  106 |   })
  107 | })

  at Object.<anonymous> (integration/size-limit/test/index.test.js:104:19)
      at runMicrotasks (<anonymous>)

@ijjk
Copy link
Member Author

ijjk commented Jun 1, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
buildDuration 12.4s 14.6s ⚠️ +2.2s
nodeModulesSize 65.3 MB 65.3 MB ⚠️ +51.3 kB
Page Load Tests Overall decrease ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
/ failed reqs 0 0
/ total time (seconds) 2.292 2.575 ⚠️ +0.28
/ avg req/sec 1090.55 970.86 -119.69
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.285 1.552 ⚠️ +0.27
/error-in-render avg req/sec 1945.79 1610.85 -334.94
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.js gzip 6.59 kB 6.59 kB ⚠️ +1 B
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..6c2a.js gzip 10.5 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
de003c3a9d30..f860.js gzip N/A 18.1 kB N/A
Overall change 57 kB 64.6 kB ⚠️ +7.55 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.module.js gzip 5.67 kB 5.67 kB ⚠️ +1 B
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.93 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 14.4 kB N/A
Overall change 52.5 kB 60 kB ⚠️ +7.51 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.05 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.21 kB 8.21 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.51 kB 1.51 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.32 kB 5.32 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Rendered Page Sizes Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
index.html gzip 925 B 928 B ⚠️ +3 B
link.html gzip 935 B 937 B ⚠️ +2 B
withRouter.html gzip 923 B 925 B ⚠️ +2 B
Overall change 2.78 kB 2.79 kB ⚠️ +7 B

Diffs

Diff for de003c3a9d30..8a09594e6.js

Diff too large to display

Diff for de003c3a9d30..34.module.js
deleted
Diff for de003c3a9d30..58.module.js

Diff too large to display

Diff for main-HASH.js
@@ -252,7 +252,7 @@
 
       var _router = __webpack_require__("nOHt");
 
-      var _querystring = __webpack_require__("s4NR");
+      var _querystring = __webpack_require__("HG3D");
 
       var _react = _interopRequireDefault(__webpack_require__("q1tI"));
Diff for main-HASH.module.js
@@ -172,7 +172,7 @@
 
       var _router = __webpack_require__("nOHt");
 
-      var _querystring = __webpack_require__("s4NR");
+      var _querystring = __webpack_require__("HG3D");
 
       var _react = _interopRequireDefault(__webpack_require__("q1tI"));
Diff for index.html
@@ -30,13 +30,13 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.aef395d7a49b93143558.module.js"
       as="script"
       crossorigin="anonymous"
     />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      href="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -133,25 +133,25 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.133d5a9780b8a09594e6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.fc37d4583578211eaf6b.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.aef395d7a49b93143558.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
     ></script>
     <script
-      src="/_next/static/runtime/main-ade021272639fc39635d.js"
+      src="/_next/static/runtime/main-565b3ca68e174691f56b.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      src="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -30,13 +30,13 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.aef395d7a49b93143558.module.js"
       as="script"
       crossorigin="anonymous"
     />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      href="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -138,25 +138,25 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.133d5a9780b8a09594e6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.fc37d4583578211eaf6b.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.aef395d7a49b93143558.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
     ></script>
     <script
-      src="/_next/static/runtime/main-ade021272639fc39635d.js"
+      src="/_next/static/runtime/main-565b3ca68e174691f56b.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      src="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -30,13 +30,13 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.aef395d7a49b93143558.module.js"
       as="script"
       crossorigin="anonymous"
     />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      href="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -133,25 +133,25 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.133d5a9780b8a09594e6.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.fc37d4583578211eaf6b.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2a9df3ecdcd8c7823f34.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.aef395d7a49b93143558.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
     ></script>
     <script
-      src="/_next/static/runtime/main-ade021272639fc39635d.js"
+      src="/_next/static/runtime/main-565b3ca68e174691f56b.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-4b42eee9e2c6700187bd.module.js"
+      src="/_next/static/runtime/main-e4dc39a0a4c730b2c346.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
buildDuration 12.3s 12.9s ⚠️ +587ms
nodeModulesSize 65.3 MB 65.3 MB ⚠️ +51.3 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.js gzip 6.59 kB 6.59 kB ⚠️ +1 B
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..6c2a.js gzip 10.5 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
de003c3a9d30..f860.js gzip N/A 18.1 kB N/A
Overall change 57 kB 64.6 kB ⚠️ +7.55 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.module.js gzip 5.67 kB 5.67 kB ⚠️ +1 B
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.93 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 14.4 kB N/A
Overall change 52.5 kB 60 kB ⚠️ +7.51 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_app.js gzip 1.26 kB 1.26 kB
_error.js gzip 3.25 kB 3.25 kB
hooks.js gzip 881 B 881 B
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.05 kB
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
Overall change 8.21 kB 8.21 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_app.module.js gzip 604 B 604 B
_error.module.js gzip 2.04 kB 2.04 kB
hooks.module.js gzip 383 B 383 B
index.module.js gzip 223 B 223 B
link.module.js gzip 1.51 kB 1.51 kB
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 5.32 kB 5.32 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_buildManifest.js gzip 61 B 61 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 122 B 122 B
Serverless bundles
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_error.js 877 kB 877 kB
404.html 4.18 kB 4.18 kB
hooks.html 3.81 kB 3.81 kB
index.js 877 kB 877 kB
link.js 915 kB 915 kB
routerDirect.js 908 kB 908 kB
withRouter.js 908 kB 908 kB
Overall change 4.49 MB 4.49 MB

@ijjk
Copy link
Member Author

ijjk commented Jun 1, 2020

Failing test suites

test/integration/size-limit/test/index.test.js

  • Production response size > should not increase the overall response size of default build
  • Production response size > should not increase the overall response size of modern build
Expand output

● Production response size › should not increase the overall response size of default build

expect(received).toBeLessThanOrEqual(expected)

Expected: <= 1024
Received:    25219

  82 |     // These numbers are without gzip compression!
  83 |     const delta = responseSizesBytes - 264 * 1024
> 84 |     expect(delta).toBeLessThanOrEqual(1024) // don't increase size more than 1kb
     |                   ^
  85 |     expect(delta).toBeGreaterThanOrEqual(-1024) // don't decrease size more than 1kb without updating target
  86 |   })
  87 | 

  at Object.<anonymous> (integration/size-limit/test/index.test.js:84:19)

● Production response size › should not increase the overall response size of modern build

expect(received).toBeLessThanOrEqual(expected)

Expected: <= 1024
Received:    25350

  102 |     // These numbers are without gzip compression!
  103 |     const delta = responseSizesBytes - 169 * 1024
> 104 |     expect(delta).toBeLessThanOrEqual(1024) // don't increase size more than 1kb
      |                   ^
  105 |     expect(delta).toBeGreaterThanOrEqual(-1024) // don't decrease size more than 1kb without updating target
  106 |   })
  107 | })

  at Object.<anonymous> (integration/size-limit/test/index.test.js:104:19)
      at runMicrotasks (<anonymous>)

@ijjk
Copy link
Member Author

ijjk commented Jun 15, 2020

@Timer took another look at this with using URLSearchParams instead and the difference between node and the whatwg spec and it does seems like node has the incorrect parsing behavior.

Per https://url.spec.whatwg.org/#percent-encoded-bytes, if byte is 0x25 (%) and the next two bytes after byte in input are not in the ranges 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F), and 0x61 (a) to 0x66 (f), all inclusive, append byte to output.

Which node does not follow in either querystring.parse or URLSearchParams which can be seen by running the below snippet in node and then also running it in any modern browser:

Object.fromEntries(new URLSearchParams('id=0&value=%')) // should be {id: "0", value: "%"}
Object.fromEntries(new URLSearchParams('b=%2sf%2a')) // should be {b: "%2sf*"}
Object.fromEntries(new URLSearchParams('b=%2%2af%2a')) // should be {b: "%2*f*"}

in node when it encounters % it seems to treat the next two-bytes as included as percent-encoded even if they aren't which goes against spec as far as I'm understanding. A minimal example of this is parsing %%2a which should parse to %* according to spec but node parses it to %%2a

@jasnell
Copy link

jasnell commented Jun 15, 2020

Interesting... if you haven't done so already, can you open an issue on the nodejs/node issue tracker for the discrepancy?

@ijjk
Copy link
Member Author

ijjk commented Jun 15, 2020

@jasnell opened an issue in node for this here nodejs/node#33892

@ijjk ijjk changed the title Make sure to handle un-encoded query values client side Make sure to handle query parsing correctly on client/server Jun 18, 2020
@ijjk
Copy link
Member Author

ijjk commented Jun 18, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
buildDuration 13.4s 13.4s -82ms
nodeModulesSize 67 MB 67 MB ⚠️ +48.9 kB
Page Load Tests Overall increase ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
/ failed reqs 0 0
/ total time (seconds) 2.276 2.289 ⚠️ +0.01
/ avg req/sec 1098.27 1092.2 -6.07
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.549 1.534 -0.01
/error-in-render avg req/sec 1613.75 1629.98 ⚠️ +16.23
Client Bundles (main, webpack, commons) Overall decrease ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..4dd5.js gzip 10.5 kB 10.5 kB -80 B
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 56.9 kB 56.9 kB -80 B
Client Bundles (main, webpack, commons) Modern Overall decrease ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.module.js gzip 5.6 kB 5.6 kB -1 B
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 6.84 kB N/A
Overall change 52.4 kB 52.3 kB -87 B
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.05 kB
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 8.34 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB 1.52 kB
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 5.49 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_buildManifest.js gzip 270 B 270 B
_buildManife..dule.js gzip 274 B 274 B
Overall change 544 B 544 B
Rendered Page Sizes Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
index.html gzip 953 B 954 B ⚠️ +1 B
link.html gzip 960 B 960 B
withRouter.html gzip 947 B 947 B
Overall change 2.86 kB 2.86 kB ⚠️ +1 B

Diffs

Diff for de003c3a9d30..ce095b7e0.js
@@ -121,30 +121,13 @@
       /***/
     },
 
-    /***/ "4JlD": /***/ function(module, exports, __webpack_require__) {
+    /***/ HG3D: /***/ function(module, exports, __webpack_require__) {
       "use strict";
-      // Copyright Joyent, Inc. and other Node contributors.
-      //
-      // Permission is hereby granted, free of charge, to any person obtaining a
-      // copy of this software and associated documentation files (the
-      // "Software"), to deal in the Software without restriction, including
-      // without limitation the rights to use, copy, modify, merge, publish,
-      // distribute, sublicense, and/or sell copies of the Software, and to permit
-      // persons to whom the Software is furnished to do so, subject to the
-      // following conditions:
-      //
-      // The above copyright notice and this permission notice shall be included
-      // in all copies or substantial portions of the Software.
-      //
-      // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-      // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-      // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-      // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-      // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-      // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-      // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-      var stringifyPrimitive = function(v) {
+
+      exports.__esModule = true;
+      exports.encode = exports.stringify = exports.decode = exports.parse = void 0;
+
+      function stringifyPrimitive(v) {
         switch (typeof v) {
           case "string":
             return v;
@@ -158,26 +141,28 @@
           default:
             return "";
         }
-      };
+      }
 
-      module.exports = function(obj, sep, eq, name) {
+      var stringify = function stringify(obj, sep, eq, name) {
         sep = sep || "&";
         eq = eq || "=";
-        if (obj === null) {
-          obj = undefined;
-        }
 
-        if (typeof obj === "object") {
-          return map(objectKeys(obj), function(k) {
-            var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
-            if (isArray(obj[k])) {
-              return map(obj[k], function(v) {
-                return ks + encodeURIComponent(stringifyPrimitive(v));
-              }).join(sep);
-            } else {
-              return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
-            }
-          }).join(sep);
+        if (obj && typeof obj === "object") {
+          return Object.keys(obj)
+            .map(function(k) {
+              var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+
+              if (Array.isArray(obj[k])) {
+                return obj[k]
+                  .map(function(v) {
+                    return ks + encodeURIComponent(stringifyPrimitive(v));
+                  })
+                  .join(sep);
+              } else {
+                return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+              }
+            })
+            .join(sep);
         }
 
         if (!name) return "";
@@ -188,30 +173,72 @@
         );
       };
 
-      var isArray =
-        Array.isArray ||
-        function(xs) {
-          return Object.prototype.toString.call(xs) === "[object Array]";
-        };
+      exports.encode = exports.stringify = stringify;
 
-      function map(xs, f) {
-        if (xs.map) return xs.map(f);
-        var res = [];
-        for (var i = 0; i < xs.length; i++) {
-          res.push(f(xs[i], i));
-        }
-        return res;
+      function hasOwnProperty(obj, prop) {
+        return Object.prototype.hasOwnProperty.call(obj, prop);
       }
 
-      var objectKeys =
-        Object.keys ||
-        function(obj) {
-          var res = [];
-          for (var key in obj) {
-            if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
+      var parse = function parse(qs, sep, eq, options) {
+        // use URLSearchParams if no legacy options provided
+        if (!sep && !eq && !options) {
+          return Object.fromEntries(new URLSearchParams(qs));
+        }
+
+        sep = sep || "&";
+        eq = eq || "=";
+        var obj = {};
+
+        if (typeof qs !== "string" || qs.length === 0) {
+          return obj;
+        }
+
+        var regexp = /\+/g;
+        var qsParts = qs.split(sep);
+        var maxKeys = 1000;
+
+        if (options && typeof options.maxKeys === "number") {
+          maxKeys = options.maxKeys;
+        }
+
+        var len = qsParts.length; // maxKeys <= 0 means that we should not limit keys count
+
+        if (maxKeys > 0 && len > maxKeys) {
+          len = maxKeys;
+        }
+
+        for (var i = 0; i < len; ++i) {
+          var x = qsParts[i].replace(regexp, "%20"),
+            idx = x.indexOf(eq),
+            kstr,
+            vstr,
+            k,
+            v;
+
+          if (idx >= 0) {
+            kstr = x.substr(0, idx);
+            vstr = x.substr(idx + 1);
+          } else {
+            kstr = x;
+            vstr = "";
           }
-          return res;
-        };
+
+          k = decodeURIComponent(kstr);
+          v = decodeURIComponent(vstr);
+
+          if (!hasOwnProperty(obj, k)) {
+            obj[k] = v;
+          } else if (Array.isArray(obj[k])) {
+            obj[k].push(v);
+          } else {
+            obj[k] = [obj[k], v];
+          }
+        }
+
+        return obj;
+      };
+
+      exports.decode = exports.parse = parse;
 
       /***/
     },
@@ -252,7 +279,7 @@
     /***/ QmWs: /***/ function(module, exports, __webpack_require__) {
       var e,
         t =
-          (e = __webpack_require__("s4NR")) &&
+          (e = __webpack_require__("HG3D")) &&
           "object" == typeof e &&
           "default" in e
             ? e.default
@@ -1910,99 +1937,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       /***/
     },
 
-    /***/ kd2E: /***/ function(module, exports, __webpack_require__) {
-      "use strict";
-      // Copyright Joyent, Inc. and other Node contributors.
-      //
-      // Permission is hereby granted, free of charge, to any person obtaining a
-      // copy of this software and associated documentation files (the
-      // "Software"), to deal in the Software without restriction, including
-      // without limitation the rights to use, copy, modify, merge, publish,
-      // distribute, sublicense, and/or sell copies of the Software, and to permit
-      // persons to whom the Software is furnished to do so, subject to the
-      // following conditions:
-      //
-      // The above copyright notice and this permission notice shall be included
-      // in all copies or substantial portions of the Software.
-      //
-      // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-      // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-      // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-      // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-      // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-      // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-      // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-      // If obj.hasOwnProperty has been overridden, then calling
-      // obj.hasOwnProperty(prop) will break.
-      // See: https://github.com/joyent/node/issues/1707
-      function hasOwnProperty(obj, prop) {
-        return Object.prototype.hasOwnProperty.call(obj, prop);
-      }
-
-      module.exports = function(qs, sep, eq, options) {
-        sep = sep || "&";
-        eq = eq || "=";
-        var obj = {};
-
-        if (typeof qs !== "string" || qs.length === 0) {
-          return obj;
-        }
-
-        var regexp = /\+/g;
-        qs = qs.split(sep);
-
-        var maxKeys = 1000;
-        if (options && typeof options.maxKeys === "number") {
-          maxKeys = options.maxKeys;
-        }
-
-        var len = qs.length;
-        // maxKeys <= 0 means that we should not limit keys count
-        if (maxKeys > 0 && len > maxKeys) {
-          len = maxKeys;
-        }
-
-        for (var i = 0; i < len; ++i) {
-          var x = qs[i].replace(regexp, "%20"),
-            idx = x.indexOf(eq),
-            kstr,
-            vstr,
-            k,
-            v;
-
-          if (idx >= 0) {
-            kstr = x.substr(0, idx);
-            vstr = x.substr(idx + 1);
-          } else {
-            kstr = x;
-            vstr = "";
-          }
-
-          k = decodeURIComponent(kstr);
-          v = decodeURIComponent(vstr);
-
-          if (!hasOwnProperty(obj, k)) {
-            obj[k] = v;
-          } else if (isArray(obj[k])) {
-            obj[k].push(v);
-          } else {
-            obj[k] = [obj[k], v];
-          }
-        }
-
-        return obj;
-      };
-
-      var isArray =
-        Array.isArray ||
-        function(xs) {
-          return Object.prototype.toString.call(xs) === "[object Array]";
-        };
-
-      /***/
-    },
-
     /***/ ls82: /***/ function(module, exports, __webpack_require__) {
       /**
        * Copyright (c) 2014-present, Facebook, Inc.
@@ -3110,15 +3044,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       /***/
     },
 
-    /***/ s4NR: /***/ function(module, exports, __webpack_require__) {
-      "use strict";
-
-      exports.decode = exports.parse = __webpack_require__("kd2E");
-      exports.encode = exports.stringify = __webpack_require__("4JlD");
-
-      /***/
-    },
-
     /***/ sXyB: /***/ function(module, exports, __webpack_require__) {
       var setPrototypeOf = __webpack_require__("SksO");
Diff for de003c3a9d30..84.module.js
@@ -121,30 +121,13 @@
       /***/
     },
 
-    /***/ "4JlD": /***/ function(module, exports, __webpack_require__) {
+    /***/ HG3D: /***/ function(module, exports, __webpack_require__) {
       "use strict";
-      // Copyright Joyent, Inc. and other Node contributors.
-      //
-      // Permission is hereby granted, free of charge, to any person obtaining a
-      // copy of this software and associated documentation files (the
-      // "Software"), to deal in the Software without restriction, including
-      // without limitation the rights to use, copy, modify, merge, publish,
-      // distribute, sublicense, and/or sell copies of the Software, and to permit
-      // persons to whom the Software is furnished to do so, subject to the
-      // following conditions:
-      //
-      // The above copyright notice and this permission notice shall be included
-      // in all copies or substantial portions of the Software.
-      //
-      // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-      // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-      // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-      // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-      // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-      // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-      // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-      var stringifyPrimitive = function(v) {
+
+      exports.__esModule = true;
+      exports.encode = exports.stringify = exports.decode = exports.parse = void 0;
+
+      function stringifyPrimitive(v) {
         switch (typeof v) {
           case "string":
             return v;
@@ -158,26 +141,28 @@
           default:
             return "";
         }
-      };
+      }
 
-      module.exports = function(obj, sep, eq, name) {
+      var stringify = (obj, sep, eq, name) => {
         sep = sep || "&";
         eq = eq || "=";
-        if (obj === null) {
-          obj = undefined;
-        }
 
-        if (typeof obj === "object") {
-          return map(objectKeys(obj), function(k) {
-            var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
-            if (isArray(obj[k])) {
-              return map(obj[k], function(v) {
-                return ks + encodeURIComponent(stringifyPrimitive(v));
-              }).join(sep);
-            } else {
-              return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
-            }
-          }).join(sep);
+        if (obj && typeof obj === "object") {
+          return Object.keys(obj)
+            .map(function(k) {
+              var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+
+              if (Array.isArray(obj[k])) {
+                return obj[k]
+                  .map(function(v) {
+                    return ks + encodeURIComponent(stringifyPrimitive(v));
+                  })
+                  .join(sep);
+              } else {
+                return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+              }
+            })
+            .join(sep);
         }
 
         if (!name) return "";
@@ -188,30 +173,72 @@
         );
       };
 
-      var isArray =
-        Array.isArray ||
-        function(xs) {
-          return Object.prototype.toString.call(xs) === "[object Array]";
-        };
+      exports.encode = exports.stringify = stringify;
 
-      function map(xs, f) {
-        if (xs.map) return xs.map(f);
-        var res = [];
-        for (var i = 0; i < xs.length; i++) {
-          res.push(f(xs[i], i));
-        }
-        return res;
+      function hasOwnProperty(obj, prop) {
+        return Object.prototype.hasOwnProperty.call(obj, prop);
       }
 
-      var objectKeys =
-        Object.keys ||
-        function(obj) {
-          var res = [];
-          for (var key in obj) {
-            if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
+      var parse = (qs, sep, eq, options) => {
+        // use URLSearchParams if no legacy options provided
+        if (!sep && !eq && !options) {
+          return Object.fromEntries(new URLSearchParams(qs));
+        }
+
+        sep = sep || "&";
+        eq = eq || "=";
+        var obj = {};
+
+        if (typeof qs !== "string" || qs.length === 0) {
+          return obj;
+        }
+
+        var regexp = /\+/g;
+        var qsParts = qs.split(sep);
+        var maxKeys = 1000;
+
+        if (options && typeof options.maxKeys === "number") {
+          maxKeys = options.maxKeys;
+        }
+
+        var len = qsParts.length; // maxKeys <= 0 means that we should not limit keys count
+
+        if (maxKeys > 0 && len > maxKeys) {
+          len = maxKeys;
+        }
+
+        for (var i = 0; i < len; ++i) {
+          var x = qsParts[i].replace(regexp, "%20"),
+            idx = x.indexOf(eq),
+            kstr,
+            vstr,
+            k,
+            v;
+
+          if (idx >= 0) {
+            kstr = x.substr(0, idx);
+            vstr = x.substr(idx + 1);
+          } else {
+            kstr = x;
+            vstr = "";
           }
-          return res;
-        };
+
+          k = decodeURIComponent(kstr);
+          v = decodeURIComponent(vstr);
+
+          if (!hasOwnProperty(obj, k)) {
+            obj[k] = v;
+          } else if (Array.isArray(obj[k])) {
+            obj[k].push(v);
+          } else {
+            obj[k] = [obj[k], v];
+          }
+        }
+
+        return obj;
+      };
+
+      exports.decode = exports.parse = parse;
 
       /***/
     },
@@ -229,7 +256,7 @@
     /***/ QmWs: /***/ function(module, exports, __webpack_require__) {
       var e,
         t =
-          (e = __webpack_require__("s4NR")) &&
+          (e = __webpack_require__("HG3D")) &&
           "object" == typeof e &&
           "default" in e
             ? e.default
@@ -1558,99 +1585,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       /***/
     },
 
-    /***/ kd2E: /***/ function(module, exports, __webpack_require__) {
-      "use strict";
-      // Copyright Joyent, Inc. and other Node contributors.
-      //
-      // Permission is hereby granted, free of charge, to any person obtaining a
-      // copy of this software and associated documentation files (the
-      // "Software"), to deal in the Software without restriction, including
-      // without limitation the rights to use, copy, modify, merge, publish,
-      // distribute, sublicense, and/or sell copies of the Software, and to permit
-      // persons to whom the Software is furnished to do so, subject to the
-      // following conditions:
-      //
-      // The above copyright notice and this permission notice shall be included
-      // in all copies or substantial portions of the Software.
-      //
-      // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-      // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-      // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-      // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-      // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-      // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-      // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-      // If obj.hasOwnProperty has been overridden, then calling
-      // obj.hasOwnProperty(prop) will break.
-      // See: https://github.com/joyent/node/issues/1707
-      function hasOwnProperty(obj, prop) {
-        return Object.prototype.hasOwnProperty.call(obj, prop);
-      }
-
-      module.exports = function(qs, sep, eq, options) {
-        sep = sep || "&";
-        eq = eq || "=";
-        var obj = {};
-
-        if (typeof qs !== "string" || qs.length === 0) {
-          return obj;
-        }
-
-        var regexp = /\+/g;
-        qs = qs.split(sep);
-
-        var maxKeys = 1000;
-        if (options && typeof options.maxKeys === "number") {
-          maxKeys = options.maxKeys;
-        }
-
-        var len = qs.length;
-        // maxKeys <= 0 means that we should not limit keys count
-        if (maxKeys > 0 && len > maxKeys) {
-          len = maxKeys;
-        }
-
-        for (var i = 0; i < len; ++i) {
-          var x = qs[i].replace(regexp, "%20"),
-            idx = x.indexOf(eq),
-            kstr,
-            vstr,
-            k,
-            v;
-
-          if (idx >= 0) {
-            kstr = x.substr(0, idx);
-            vstr = x.substr(idx + 1);
-          } else {
-            kstr = x;
-            vstr = "";
-          }
-
-          k = decodeURIComponent(kstr);
-          v = decodeURIComponent(vstr);
-
-          if (!hasOwnProperty(obj, k)) {
-            obj[k] = v;
-          } else if (isArray(obj[k])) {
-            obj[k].push(v);
-          } else {
-            obj[k] = [obj[k], v];
-          }
-        }
-
-        return obj;
-      };
-
-      var isArray =
-        Array.isArray ||
-        function(xs) {
-          return Object.prototype.toString.call(xs) === "[object Array]";
-        };
-
-      /***/
-    },
-
     /***/ nOHt: /***/ function(module, exports, __webpack_require__) {
       "use strict";
 
@@ -1855,15 +1789,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       if (false) {
       }
 
-      /***/
-    },
-
-    /***/ s4NR: /***/ function(module, exports, __webpack_require__) {
-      "use strict";
-
-      exports.decode = exports.parse = __webpack_require__("kd2E");
-      exports.encode = exports.stringify = __webpack_require__("4JlD");
-
       /***/
     }
   }
Diff for main-HASH.js
@@ -257,7 +257,7 @@
 
       var _router = __webpack_require__("nOHt");
 
-      var _querystring = __webpack_require__("s4NR");
+      var _querystring = __webpack_require__("HG3D");
 
       var _react = _interopRequireDefault(__webpack_require__("q1tI"));
Diff for main-HASH.module.js
@@ -175,7 +175,7 @@
 
       var _router = __webpack_require__("nOHt");
 
-      var _querystring = __webpack_require__("s4NR");
+      var _querystring = __webpack_require__("HG3D");
 
       var _react = _interopRequireDefault(__webpack_require__("q1tI"));
Diff for index.html
@@ -6,7 +6,7 @@
     <meta name="next-head-count" content="2" />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      href="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2429968ba738ade6edda.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -81,13 +81,13 @@
       src="/_next/static/runtime/polyfills-eaf5488e20ec921d713f.js"
     ></script>
     <script
-      src="/_next/static/runtime/main-d371df75a64e2540b042.js"
+      src="/_next/static/runtime/main-70f45d9dae81ed5a0134.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      src="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.c055dea44cbce095b7e0.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.da7b64cf9083be220dde.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2429968ba738ade6edda.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -6,7 +6,7 @@
     <meta name="next-head-count" content="2" />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      href="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2429968ba738ade6edda.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -86,13 +86,13 @@
       src="/_next/static/runtime/polyfills-eaf5488e20ec921d713f.js"
     ></script>
     <script
-      src="/_next/static/runtime/main-d371df75a64e2540b042.js"
+      src="/_next/static/runtime/main-70f45d9dae81ed5a0134.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      src="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -122,13 +122,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.c055dea44cbce095b7e0.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.da7b64cf9083be220dde.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2429968ba738ade6edda.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -6,7 +6,7 @@
     <meta name="next-head-count" content="2" />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      href="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2429968ba738ade6edda.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -81,13 +81,13 @@
       src="/_next/static/runtime/polyfills-eaf5488e20ec921d713f.js"
     ></script>
     <script
-      src="/_next/static/runtime/main-d371df75a64e2540b042.js"
+      src="/_next/static/runtime/main-70f45d9dae81ed5a0134.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      src="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.c055dea44cbce095b7e0.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.da7b64cf9083be220dde.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.2429968ba738ade6edda.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Decrease detected ✓)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
buildDuration 14s 14.2s ⚠️ +155ms
nodeModulesSize 67 MB 67 MB ⚠️ +48.9 kB
Client Bundles (main, webpack, commons) Overall decrease ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..4dd5.js gzip 10.5 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
de003c3a9d30..6f34.js gzip N/A 10.5 kB N/A
Overall change 56.9 kB 56.9 kB -80 B
Client Bundles (main, webpack, commons) Modern Overall decrease ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.module.js gzip 5.6 kB 5.6 kB -1 B
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 6.84 kB N/A
Overall change 52.4 kB 52.3 kB -87 B
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.05 kB
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 8.34 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB 1.52 kB
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 5.49 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_buildManifest.js gzip 270 B 270 B
_buildManife..dule.js gzip 274 B 274 B
Overall change 544 B 544 B
Serverless bundles
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_error.js 875 kB 875 kB
404.html 4.17 kB 4.17 kB
hooks.html 3.79 kB 3.79 kB
index.js 875 kB 875 kB
link.js 914 kB 914 kB
routerDirect.js 906 kB 906 kB
withRouter.js 906 kB 906 kB
Overall change 4.48 MB 4.48 MB

@ijjk
Copy link
Member Author

ijjk commented Jun 18, 2020

Failing test suites

test/integration/preload-viewport/test/index.test.js

  • Prefetching Links in viewport > should prefetch data files when mismatched
Expand output

● Prefetching Links in viewport › should prefetch data files when mismatched

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `Prefetching Links in viewport should prefetch data files when mismatched 1`

- Snapshot  - 2
+ Received  + 2

  Array [
+   "/_next/data/test-build/ssg/catch-all/bar.json",
    "/_next/data/test-build/ssg/catch-all/foo.json",
-   "/_next/data/test-build/ssg/catch-all/foo/bar.json",
    "/_next/data/test-build/ssg/catch-all/one.json",
-   "/_next/data/test-build/ssg/catch-all/one/two.json",
+   "/_next/data/test-build/ssg/catch-all/two.json",
    "/_next/data/test-build/ssg/dynamic-nested/foo/bar.json",
    "/_next/data/test-build/ssg/dynamic-nested/one/two.json",
    "/_next/data/test-build/ssg/dynamic/one.json",
    "/_next/data/test-build/ssg/dynamic/two.json",
  ]

  308 |     hrefs.sort()
  309 | 
> 310 |     expect(hrefs.map((href) => parse(href).pathname)).toMatchInlineSnapshot(`
      |                                                       ^
  311 |       Array [
  312 |         "/_next/data/test-build/ssg/catch-all/foo.json",
  313 |         "/_next/data/test-build/ssg/catch-all/foo/bar.json",

  at Object.<anonymous> (integration/preload-viewport/test/index.test.js:310:55)
      at runMicrotasks (<anonymous>)

@ijjk
Copy link
Member Author

ijjk commented Jun 18, 2020

Stats from current PR

Default Server Mode (Decrease detected ✓)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
buildDuration 12.5s 12.3s -221ms
nodeModulesSize 67 MB 67 MB ⚠️ +49 kB
Page Load Tests Overall decrease ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
/ failed reqs 0 0
/ total time (seconds) 2.2 2.259 ⚠️ +0.06
/ avg req/sec 1136.17 1106.74 -29.43
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.48 1.464 -0.02
/error-in-render avg req/sec 1689.45 1708.22 ⚠️ +18.77
Client Bundles (main, webpack, commons) Overall decrease ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..4dd5.js gzip 10.5 kB 10.5 kB -42 B
framework.HASH.js gzip 39.1 kB 39.1 kB
Overall change 56.9 kB 56.9 kB -42 B
Client Bundles (main, webpack, commons) Modern Overall decrease ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.module.js gzip 5.6 kB 5.6 kB -1 B
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 6.87 kB N/A
Overall change 52.4 kB 52.4 kB -54 B
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.05 kB
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 8.34 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB 1.52 kB
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 5.49 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_buildManifest.js gzip 270 B 270 B
_buildManife..dule.js gzip 274 B 274 B
Overall change 544 B 544 B
Rendered Page Sizes Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
index.html gzip 953 B 954 B ⚠️ +1 B
link.html gzip 960 B 961 B ⚠️ +1 B
withRouter.html gzip 947 B 947 B
Overall change 2.86 kB 2.86 kB ⚠️ +2 B

Diffs

Diff for de003c3a9d30..ce095b7e0.js
@@ -121,30 +121,13 @@
       /***/
     },
 
-    /***/ "4JlD": /***/ function(module, exports, __webpack_require__) {
+    /***/ HG3D: /***/ function(module, exports, __webpack_require__) {
       "use strict";
-      // Copyright Joyent, Inc. and other Node contributors.
-      //
-      // Permission is hereby granted, free of charge, to any person obtaining a
-      // copy of this software and associated documentation files (the
-      // "Software"), to deal in the Software without restriction, including
-      // without limitation the rights to use, copy, modify, merge, publish,
-      // distribute, sublicense, and/or sell copies of the Software, and to permit
-      // persons to whom the Software is furnished to do so, subject to the
-      // following conditions:
-      //
-      // The above copyright notice and this permission notice shall be included
-      // in all copies or substantial portions of the Software.
-      //
-      // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-      // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-      // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-      // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-      // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-      // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-      // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-      var stringifyPrimitive = function(v) {
+
+      exports.__esModule = true;
+      exports.encode = exports.stringify = exports.decode = exports.parse = void 0;
+
+      function stringifyPrimitive(v) {
         switch (typeof v) {
           case "string":
             return v;
@@ -158,26 +141,28 @@
           default:
             return "";
         }
-      };
+      }
 
-      module.exports = function(obj, sep, eq, name) {
+      var stringify = function stringify(obj, sep, eq, name) {
         sep = sep || "&";
         eq = eq || "=";
-        if (obj === null) {
-          obj = undefined;
-        }
 
-        if (typeof obj === "object") {
-          return map(objectKeys(obj), function(k) {
-            var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
-            if (isArray(obj[k])) {
-              return map(obj[k], function(v) {
-                return ks + encodeURIComponent(stringifyPrimitive(v));
-              }).join(sep);
-            } else {
-              return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
-            }
-          }).join(sep);
+        if (obj && typeof obj === "object") {
+          return Object.keys(obj)
+            .map(function(k) {
+              var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+
+              if (Array.isArray(obj[k])) {
+                return obj[k]
+                  .map(function(v) {
+                    return ks + encodeURIComponent(stringifyPrimitive(v));
+                  })
+                  .join(sep);
+              } else {
+                return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+              }
+            })
+            .join(sep);
         }
 
         if (!name) return "";
@@ -188,30 +173,81 @@
         );
       };
 
-      var isArray =
-        Array.isArray ||
-        function(xs) {
-          return Object.prototype.toString.call(xs) === "[object Array]";
-        };
+      exports.encode = exports.stringify = stringify;
 
-      function map(xs, f) {
-        if (xs.map) return xs.map(f);
-        var res = [];
-        for (var i = 0; i < xs.length; i++) {
-          res.push(f(xs[i], i));
-        }
-        return res;
+      function hasOwnProperty(obj, prop) {
+        return Object.prototype.hasOwnProperty.call(obj, prop);
       }
 
-      var objectKeys =
-        Object.keys ||
-        function(obj) {
-          var res = [];
-          for (var key in obj) {
-            if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
+      var parse = function parse(qs, sep, eq, options) {
+        // use URLSearchParams if no legacy options provided
+        if (!sep && !eq && !options) {
+          var parsed = new URLSearchParams(qs);
+          return Array.from(parsed.keys()).reduce(function(prev, key) {
+            prev[key] = parsed.getAll(key);
+
+            if (prev[key].length === 1) {
+              prev[key] = prev[key].pop();
+            }
+
+            return prev;
+          }, {});
+        }
+
+        sep = sep || "&";
+        eq = eq || "=";
+        var obj = {};
+
+        if (typeof qs !== "string" || qs.length === 0) {
+          return obj;
+        }
+
+        var regexp = /\+/g;
+        var qsParts = qs.split(sep);
+        var maxKeys = 1000;
+
+        if (options && typeof options.maxKeys === "number") {
+          maxKeys = options.maxKeys;
+        }
+
+        var len = qsParts.length; // maxKeys <= 0 means that we should not limit keys count
+
+        if (maxKeys > 0 && len > maxKeys) {
+          len = maxKeys;
+        }
+
+        for (var i = 0; i < len; ++i) {
+          var x = qsParts[i].replace(regexp, "%20"),
+            idx = x.indexOf(eq),
+            kstr,
+            vstr,
+            k,
+            v;
+
+          if (idx >= 0) {
+            kstr = x.substr(0, idx);
+            vstr = x.substr(idx + 1);
+          } else {
+            kstr = x;
+            vstr = "";
           }
-          return res;
-        };
+
+          k = decodeURIComponent(kstr);
+          v = decodeURIComponent(vstr);
+
+          if (!hasOwnProperty(obj, k)) {
+            obj[k] = v;
+          } else if (Array.isArray(obj[k])) {
+            obj[k].push(v);
+          } else {
+            obj[k] = [obj[k], v];
+          }
+        }
+
+        return obj;
+      };
+
+      exports.decode = exports.parse = parse;
 
       /***/
     },
@@ -252,7 +288,7 @@
     /***/ QmWs: /***/ function(module, exports, __webpack_require__) {
       var e,
         t =
-          (e = __webpack_require__("s4NR")) &&
+          (e = __webpack_require__("HG3D")) &&
           "object" == typeof e &&
           "default" in e
             ? e.default
@@ -1910,99 +1946,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       /***/
     },
 
-    /***/ kd2E: /***/ function(module, exports, __webpack_require__) {
-      "use strict";
-      // Copyright Joyent, Inc. and other Node contributors.
-      //
-      // Permission is hereby granted, free of charge, to any person obtaining a
-      // copy of this software and associated documentation files (the
-      // "Software"), to deal in the Software without restriction, including
-      // without limitation the rights to use, copy, modify, merge, publish,
-      // distribute, sublicense, and/or sell copies of the Software, and to permit
-      // persons to whom the Software is furnished to do so, subject to the
-      // following conditions:
-      //
-      // The above copyright notice and this permission notice shall be included
-      // in all copies or substantial portions of the Software.
-      //
-      // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-      // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-      // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-      // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-      // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-      // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-      // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-      // If obj.hasOwnProperty has been overridden, then calling
-      // obj.hasOwnProperty(prop) will break.
-      // See: https://github.com/joyent/node/issues/1707
-      function hasOwnProperty(obj, prop) {
-        return Object.prototype.hasOwnProperty.call(obj, prop);
-      }
-
-      module.exports = function(qs, sep, eq, options) {
-        sep = sep || "&";
-        eq = eq || "=";
-        var obj = {};
-
-        if (typeof qs !== "string" || qs.length === 0) {
-          return obj;
-        }
-
-        var regexp = /\+/g;
-        qs = qs.split(sep);
-
-        var maxKeys = 1000;
-        if (options && typeof options.maxKeys === "number") {
-          maxKeys = options.maxKeys;
-        }
-
-        var len = qs.length;
-        // maxKeys <= 0 means that we should not limit keys count
-        if (maxKeys > 0 && len > maxKeys) {
-          len = maxKeys;
-        }
-
-        for (var i = 0; i < len; ++i) {
-          var x = qs[i].replace(regexp, "%20"),
-            idx = x.indexOf(eq),
-            kstr,
-            vstr,
-            k,
-            v;
-
-          if (idx >= 0) {
-            kstr = x.substr(0, idx);
-            vstr = x.substr(idx + 1);
-          } else {
-            kstr = x;
-            vstr = "";
-          }
-
-          k = decodeURIComponent(kstr);
-          v = decodeURIComponent(vstr);
-
-          if (!hasOwnProperty(obj, k)) {
-            obj[k] = v;
-          } else if (isArray(obj[k])) {
-            obj[k].push(v);
-          } else {
-            obj[k] = [obj[k], v];
-          }
-        }
-
-        return obj;
-      };
-
-      var isArray =
-        Array.isArray ||
-        function(xs) {
-          return Object.prototype.toString.call(xs) === "[object Array]";
-        };
-
-      /***/
-    },
-
     /***/ ls82: /***/ function(module, exports, __webpack_require__) {
       /**
        * Copyright (c) 2014-present, Facebook, Inc.
@@ -3110,15 +3053,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       /***/
     },
 
-    /***/ s4NR: /***/ function(module, exports, __webpack_require__) {
-      "use strict";
-
-      exports.decode = exports.parse = __webpack_require__("kd2E");
-      exports.encode = exports.stringify = __webpack_require__("4JlD");
-
-      /***/
-    },
-
     /***/ sXyB: /***/ function(module, exports, __webpack_require__) {
       var setPrototypeOf = __webpack_require__("SksO");
Diff for de003c3a9d30..84.module.js
@@ -121,30 +121,13 @@
       /***/
     },
 
-    /***/ "4JlD": /***/ function(module, exports, __webpack_require__) {
+    /***/ HG3D: /***/ function(module, exports, __webpack_require__) {
       "use strict";
-      // Copyright Joyent, Inc. and other Node contributors.
-      //
-      // Permission is hereby granted, free of charge, to any person obtaining a
-      // copy of this software and associated documentation files (the
-      // "Software"), to deal in the Software without restriction, including
-      // without limitation the rights to use, copy, modify, merge, publish,
-      // distribute, sublicense, and/or sell copies of the Software, and to permit
-      // persons to whom the Software is furnished to do so, subject to the
-      // following conditions:
-      //
-      // The above copyright notice and this permission notice shall be included
-      // in all copies or substantial portions of the Software.
-      //
-      // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-      // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-      // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-      // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-      // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-      // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-      // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-      var stringifyPrimitive = function(v) {
+
+      exports.__esModule = true;
+      exports.encode = exports.stringify = exports.decode = exports.parse = void 0;
+
+      function stringifyPrimitive(v) {
         switch (typeof v) {
           case "string":
             return v;
@@ -158,26 +141,28 @@
           default:
             return "";
         }
-      };
+      }
 
-      module.exports = function(obj, sep, eq, name) {
+      var stringify = (obj, sep, eq, name) => {
         sep = sep || "&";
         eq = eq || "=";
-        if (obj === null) {
-          obj = undefined;
-        }
 
-        if (typeof obj === "object") {
-          return map(objectKeys(obj), function(k) {
-            var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
-            if (isArray(obj[k])) {
-              return map(obj[k], function(v) {
-                return ks + encodeURIComponent(stringifyPrimitive(v));
-              }).join(sep);
-            } else {
-              return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
-            }
-          }).join(sep);
+        if (obj && typeof obj === "object") {
+          return Object.keys(obj)
+            .map(function(k) {
+              var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+
+              if (Array.isArray(obj[k])) {
+                return obj[k]
+                  .map(function(v) {
+                    return ks + encodeURIComponent(stringifyPrimitive(v));
+                  })
+                  .join(sep);
+              } else {
+                return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+              }
+            })
+            .join(sep);
         }
 
         if (!name) return "";
@@ -188,30 +173,81 @@
         );
       };
 
-      var isArray =
-        Array.isArray ||
-        function(xs) {
-          return Object.prototype.toString.call(xs) === "[object Array]";
-        };
+      exports.encode = exports.stringify = stringify;
 
-      function map(xs, f) {
-        if (xs.map) return xs.map(f);
-        var res = [];
-        for (var i = 0; i < xs.length; i++) {
-          res.push(f(xs[i], i));
-        }
-        return res;
+      function hasOwnProperty(obj, prop) {
+        return Object.prototype.hasOwnProperty.call(obj, prop);
       }
 
-      var objectKeys =
-        Object.keys ||
-        function(obj) {
-          var res = [];
-          for (var key in obj) {
-            if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
+      var parse = (qs, sep, eq, options) => {
+        // use URLSearchParams if no legacy options provided
+        if (!sep && !eq && !options) {
+          var parsed = new URLSearchParams(qs);
+          return Array.from(parsed.keys()).reduce((prev, key) => {
+            prev[key] = parsed.getAll(key);
+
+            if (prev[key].length === 1) {
+              prev[key] = prev[key].pop();
+            }
+
+            return prev;
+          }, {});
+        }
+
+        sep = sep || "&";
+        eq = eq || "=";
+        var obj = {};
+
+        if (typeof qs !== "string" || qs.length === 0) {
+          return obj;
+        }
+
+        var regexp = /\+/g;
+        var qsParts = qs.split(sep);
+        var maxKeys = 1000;
+
+        if (options && typeof options.maxKeys === "number") {
+          maxKeys = options.maxKeys;
+        }
+
+        var len = qsParts.length; // maxKeys <= 0 means that we should not limit keys count
+
+        if (maxKeys > 0 && len > maxKeys) {
+          len = maxKeys;
+        }
+
+        for (var i = 0; i < len; ++i) {
+          var x = qsParts[i].replace(regexp, "%20"),
+            idx = x.indexOf(eq),
+            kstr,
+            vstr,
+            k,
+            v;
+
+          if (idx >= 0) {
+            kstr = x.substr(0, idx);
+            vstr = x.substr(idx + 1);
+          } else {
+            kstr = x;
+            vstr = "";
+          }
+
+          k = decodeURIComponent(kstr);
+          v = decodeURIComponent(vstr);
+
+          if (!hasOwnProperty(obj, k)) {
+            obj[k] = v;
+          } else if (Array.isArray(obj[k])) {
+            obj[k].push(v);
+          } else {
+            obj[k] = [obj[k], v];
           }
-          return res;
-        };
+        }
+
+        return obj;
+      };
+
+      exports.decode = exports.parse = parse;
 
       /***/
     },
@@ -229,7 +265,7 @@
     /***/ QmWs: /***/ function(module, exports, __webpack_require__) {
       var e,
         t =
-          (e = __webpack_require__("s4NR")) &&
+          (e = __webpack_require__("HG3D")) &&
           "object" == typeof e &&
           "default" in e
             ? e.default
@@ -1558,99 +1594,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       /***/
     },
 
-    /***/ kd2E: /***/ function(module, exports, __webpack_require__) {
-      "use strict";
-      // Copyright Joyent, Inc. and other Node contributors.
-      //
-      // Permission is hereby granted, free of charge, to any person obtaining a
-      // copy of this software and associated documentation files (the
-      // "Software"), to deal in the Software without restriction, including
-      // without limitation the rights to use, copy, modify, merge, publish,
-      // distribute, sublicense, and/or sell copies of the Software, and to permit
-      // persons to whom the Software is furnished to do so, subject to the
-      // following conditions:
-      //
-      // The above copyright notice and this permission notice shall be included
-      // in all copies or substantial portions of the Software.
-      //
-      // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-      // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-      // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-      // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-      // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-      // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-      // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-      // If obj.hasOwnProperty has been overridden, then calling
-      // obj.hasOwnProperty(prop) will break.
-      // See: https://github.com/joyent/node/issues/1707
-      function hasOwnProperty(obj, prop) {
-        return Object.prototype.hasOwnProperty.call(obj, prop);
-      }
-
-      module.exports = function(qs, sep, eq, options) {
-        sep = sep || "&";
-        eq = eq || "=";
-        var obj = {};
-
-        if (typeof qs !== "string" || qs.length === 0) {
-          return obj;
-        }
-
-        var regexp = /\+/g;
-        qs = qs.split(sep);
-
-        var maxKeys = 1000;
-        if (options && typeof options.maxKeys === "number") {
-          maxKeys = options.maxKeys;
-        }
-
-        var len = qs.length;
-        // maxKeys <= 0 means that we should not limit keys count
-        if (maxKeys > 0 && len > maxKeys) {
-          len = maxKeys;
-        }
-
-        for (var i = 0; i < len; ++i) {
-          var x = qs[i].replace(regexp, "%20"),
-            idx = x.indexOf(eq),
-            kstr,
-            vstr,
-            k,
-            v;
-
-          if (idx >= 0) {
-            kstr = x.substr(0, idx);
-            vstr = x.substr(idx + 1);
-          } else {
-            kstr = x;
-            vstr = "";
-          }
-
-          k = decodeURIComponent(kstr);
-          v = decodeURIComponent(vstr);
-
-          if (!hasOwnProperty(obj, k)) {
-            obj[k] = v;
-          } else if (isArray(obj[k])) {
-            obj[k].push(v);
-          } else {
-            obj[k] = [obj[k], v];
-          }
-        }
-
-        return obj;
-      };
-
-      var isArray =
-        Array.isArray ||
-        function(xs) {
-          return Object.prototype.toString.call(xs) === "[object Array]";
-        };
-
-      /***/
-    },
-
     /***/ nOHt: /***/ function(module, exports, __webpack_require__) {
       "use strict";
 
@@ -1855,15 +1798,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       if (false) {
       }
 
-      /***/
-    },
-
-    /***/ s4NR: /***/ function(module, exports, __webpack_require__) {
-      "use strict";
-
-      exports.decode = exports.parse = __webpack_require__("kd2E");
-      exports.encode = exports.stringify = __webpack_require__("4JlD");
-
       /***/
     }
   }
Diff for main-HASH.js
@@ -257,7 +257,7 @@
 
       var _router = __webpack_require__("nOHt");
 
-      var _querystring = __webpack_require__("s4NR");
+      var _querystring = __webpack_require__("HG3D");
 
       var _react = _interopRequireDefault(__webpack_require__("q1tI"));
Diff for main-HASH.module.js
@@ -175,7 +175,7 @@
 
       var _router = __webpack_require__("nOHt");
 
-      var _querystring = __webpack_require__("s4NR");
+      var _querystring = __webpack_require__("HG3D");
 
       var _react = _interopRequireDefault(__webpack_require__("q1tI"));
Diff for index.html
@@ -6,7 +6,7 @@
     <meta name="next-head-count" content="2" />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      href="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b86219e908329b76ecaf.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -81,13 +81,13 @@
       src="/_next/static/runtime/polyfills-eaf5488e20ec921d713f.js"
     ></script>
     <script
-      src="/_next/static/runtime/main-d371df75a64e2540b042.js"
+      src="/_next/static/runtime/main-70f45d9dae81ed5a0134.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      src="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.c055dea44cbce095b7e0.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.a92c54a959ff0cdbb7ca.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b86219e908329b76ecaf.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -6,7 +6,7 @@
     <meta name="next-head-count" content="2" />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      href="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b86219e908329b76ecaf.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -86,13 +86,13 @@
       src="/_next/static/runtime/polyfills-eaf5488e20ec921d713f.js"
     ></script>
     <script
-      src="/_next/static/runtime/main-d371df75a64e2540b042.js"
+      src="/_next/static/runtime/main-70f45d9dae81ed5a0134.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      src="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -122,13 +122,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.c055dea44cbce095b7e0.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.a92c54a959ff0cdbb7ca.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b86219e908329b76ecaf.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -6,7 +6,7 @@
     <meta name="next-head-count" content="2" />
     <link
       rel="preload"
-      href="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      href="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b86219e908329b76ecaf.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -81,13 +81,13 @@
       src="/_next/static/runtime/polyfills-eaf5488e20ec921d713f.js"
     ></script>
     <script
-      src="/_next/static/runtime/main-d371df75a64e2540b042.js"
+      src="/_next/static/runtime/main-70f45d9dae81ed5a0134.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/runtime/main-59c45a8be830c5f95780.module.js"
+      src="/_next/static/runtime/main-b03757c88a9376a8b33e.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -117,13 +117,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.c055dea44cbce095b7e0.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.a92c54a959ff0cdbb7ca.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.deb50154f80a4044eb84.module.js"
+      src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b86219e908329b76ecaf.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Decrease detected ✓)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
buildDuration 13.2s 17.1s ⚠️ +3.9s
nodeModulesSize 67 MB 67 MB ⚠️ +49 kB
Client Bundles (main, webpack, commons) Overall decrease ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.js gzip 6.51 kB 6.51 kB
webpack-HASH.js gzip 746 B 746 B
de003c3a9d30..4dd5.js gzip 10.5 kB N/A N/A
framework.HASH.js gzip 39.1 kB 39.1 kB
de003c3a9d30..5680.js gzip N/A 10.5 kB N/A
Overall change 56.9 kB 56.9 kB -42 B
Client Bundles (main, webpack, commons) Modern Overall decrease ✓
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
main-HASH.module.js gzip 5.6 kB 5.6 kB -1 B
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..dule.js gzip 6.92 kB N/A N/A
framework.HA..dule.js gzip 39.1 kB 39.1 kB
de003c3a9d30..dule.js gzip N/A 6.87 kB N/A
Overall change 52.4 kB 52.4 kB -54 B
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
polyfills-HASH.js gzip 26.3 kB 26.3 kB
Overall change 26.3 kB 26.3 kB
Client Pages
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
routerDirect.js gzip 279 B 279 B
withRouter.js gzip 278 B 278 B
_error.js gzip 3.37 kB 3.37 kB
index.js gzip 222 B 222 B
link.js gzip 2.05 kB 2.05 kB
hooks.js gzip 881 B 881 B
_app.js gzip 1.26 kB 1.26 kB
Overall change 8.34 kB 8.34 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
index.module.js gzip 223 B 223 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.m..dule.js gzip 278 B 278 B
hooks.module.js gzip 383 B 383 B
_error.module.js gzip 2.21 kB 2.21 kB
link.module.js gzip 1.52 kB 1.52 kB
_app.module.js gzip 604 B 604 B
Overall change 5.49 kB 5.49 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_buildManifest.js gzip 270 B 270 B
_buildManife..dule.js gzip 274 B 274 B
Overall change 544 B 544 B
Serverless bundles
vercel/next.js canary ijjk/next.js fix/unencoded-query Change
_error.js 875 kB 875 kB
404.html 4.17 kB 4.17 kB
hooks.html 3.79 kB 3.79 kB
index.js 875 kB 875 kB
link.js 914 kB 914 kB
routerDirect.js 906 kB 906 kB
withRouter.js 906 kB 906 kB
Overall change 4.48 MB 4.48 MB

@lifeiscontent
Copy link
Contributor

lifeiscontent commented Jul 9, 2020

@Timer @ijjk if you want, you can take a look at isomorphic-querystring it's pretty small and I built it to work with next.js

@Timer Timer removed their assignment Nov 13, 2020
@ijjk
Copy link
Member Author

ijjk commented Mar 2, 2021

Closing as this has been fixed upstream

@ijjk ijjk closed this Mar 2, 2021
@ijjk ijjk deleted the fix/unencoded-query branch March 2, 2021 22:22
@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.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

% in url parameter causes "Uncaught URIError: URI malformed"
5 participants